Index: src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision 87dfca4108319b9f2e8294ec16eebae1042a3693)
+++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision 9a7c81c9d7824d6d653a3572a51e2647fcbced2c)
@@ -400,5 +400,5 @@
         self.onSelectModel()
         # Smearing tab
-        self.smearing_widget.updateSmearing(self.data)
+        self.smearing_widget.updateData(self.data)
 
     def acceptsData(self):
@@ -472,5 +472,5 @@
         self.lblChi2Value.setText("---")
         # Smearing tab
-        self.smearing_widget.updateSmearing(self.data)
+        self.smearing_widget.updateData(self.data)
         # Line edits in the option tab
         self.updateQRange()
@@ -515,4 +515,5 @@
         self.communicate.customModelDirectoryChanged.connect(self.onCustomModelChange)
         self.communicate.saveAnalysisSignal.connect(self.savePageState)
+        self.smearing_widget.smearingChangedSignal.connect(self.onSmearingOptionsUpdate)
         #self.communicate.saveReportSignal.connect(self.saveReport)
 
@@ -1441,11 +1442,8 @@
             raise ValueError('Fitting requires at least one parameter to optimize.')
 
-        # Potential weights added directly to data
-        self.addWeightingToData(data)
-
         # Potential smearing added
         # Remember that smearing_min/max can be None ->
         # deal with it until Python gets discriminated unions
-        smearing, accuracy, smearing_min, smearing_max = self.smearing_widget.state()
+        self.addWeightingToData(data)
 
         # Get the constraints.
@@ -1455,5 +1453,5 @@
             constraints = self.getConstraintsForFitting()
 
-        smearer = None
+        smearer = self.smearing_widget.smearer()
         handler = None
         batch_inputs = {}
@@ -1464,4 +1462,6 @@
             fitter_single = Fit() if fitter is None else fitter
             data = GuiUtils.dataFromItem(fit_index)
+            # Potential weights added directly to data
+            self.addWeightingToData(data)
             try:
                 fitter_single.set_model(model, fit_id, params_to_fit, data=data,
@@ -1703,4 +1703,10 @@
         self.showPlot()
 
+    def onSmearingOptionsUpdate(self):
+        """
+        React to changes in the smearing widget
+        """
+        self.calculateQGridForModel()
+
     def recalculatePlotData(self):
         """
@@ -1834,7 +1840,9 @@
         # Send original data for weighting
         weight = FittingUtilities.getWeight(data=data, is2d=self.is2D, flag=self.weighting)
-        update_module = data.err_data if self.is2D else data.dy
-        # Overwrite relevant values in data
-        update_module = weight
+        if self.is2D:
+            data.err_data = weight
+        else:
+            data.dy = weight
+        pass
 
     def updateQRange(self):
@@ -1889,4 +1897,6 @@
         # Change the model name to a monicker
         self.kernel_module.name = self.modelName()
+        # Update the smearing tab
+        self.smearing_widget.updateKernelModel(kernel_model=self.kernel_module)
 
         # (Re)-create headers
@@ -2106,5 +2116,5 @@
         if completefn is None:
             completefn = self.methodCompleteForData()
-
+        smearer = self.smearing_widget.smearer()
         # Awful API to a backend method.
         calc_thread = self.methodCalculateForData()(data=data,
@@ -2113,5 +2123,5 @@
                                                qmin=self.q_range_min,
                                                qmax=self.q_range_max,
-                                               smearer=None,
+                                               smearer=smearer,
                                                state=None,
                                                weight=None,
Index: src/sas/qtgui/Perspectives/Fitting/OptionsWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/OptionsWidget.py	(revision 87dfca4108319b9f2e8294ec16eebae1042a3693)
+++ src/sas/qtgui/Perspectives/Fitting/OptionsWidget.py	(revision 9a7c81c9d7824d6d653a3572a51e2647fcbced2c)
@@ -141,5 +141,5 @@
         button_id = button.group().checkedId()
         self.weighting = abs(button_id + 2)
-        #self.fitPage.weighting = button_id
+        self.plot_signal.emit()
 
     def onModelChange(self, top, bottom):
Index: src/sas/qtgui/Perspectives/Fitting/SmearingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/SmearingWidget.py	(revision d6b8a1dfaf6521ae4a9054d5195def2810d6d8bc)
+++ src/sas/qtgui/Perspectives/Fitting/SmearingWidget.py	(revision 9a7c81c9d7824d6d653a3572a51e2647fcbced2c)
@@ -2,8 +2,11 @@
 Widget/logic for smearing data.
 """
+import copy
+import numpy as np
 from PyQt5 import QtCore
 from PyQt5 import QtGui
 from PyQt5 import QtWidgets
 
+from sas.sascalc.fit.qsmearing import smear_selection
 from sas.qtgui.Plotting.PlotterData import Data1D
 from sas.qtgui.Plotting.PlotterData import Data2D
@@ -36,6 +39,14 @@
     'PINHOLE_MAX',
     'ACCURACY']
+ACCURACY_DICT={'Low': 'low',
+               'Medium': 'med',
+               'High': 'high',
+               'Extra high': 'xhigh'}
+
+DEFAULT_PINHOLE_UP=0.0
+DEFAULT_PINHOLE_DOWN=0.0
 
 class SmearingWidget(QtWidgets.QWidget, Ui_SmearingWidgetUI):
+    smearingChangedSignal = QtCore.pyqtSignal()
     def __init__(self, parent=None):
         super(SmearingWidget, self).__init__()
@@ -43,12 +54,12 @@
         self.setupUi(self)
 
-        # Have we loaded data yet? If so, what kind
-        self.have_data = None
         # Local model for holding data
         self.model = None
         # Mapper for model update
         self.mapper = None
-
-        self.parent = parent
+        # Data from the widget
+        self.data = None
+        self.current_smearer = None
+
         # Let only floats in the line edits
         self.txtSmearDown.setValidator(GuiUtils.DoubleValidator())
@@ -58,4 +69,6 @@
         self.cbSmearing.currentIndexChanged.connect(self.onIndexChange)
         self.cbSmearing.setCurrentIndex(0)
+        self.txtSmearUp.setText(str(DEFAULT_PINHOLE_UP))
+        self.txtSmearDown.setText(str(DEFAULT_PINHOLE_DOWN))
 
         self.initModel()
@@ -83,27 +96,33 @@
         self.mapper.addMapping(self.txtSmearUp,   MODEL.index('PINHOLE_MIN'))
         self.mapper.addMapping(self.txtSmearDown, MODEL.index('PINHOLE_MAX'))
-        self.mapper.addMapping(self.cbSmearing,   MODEL.index('SMEARING'))
         self.mapper.addMapping(self.cbAccuracy,   MODEL.index('ACCURACY'))
 
-        # FIXME DOESNT WORK WITH QT5
-        #self.mapper.toFirst()
-
-    def updateSmearing(self, data=None):
-        """
-        Update control elements based on data passed
+        self.mapper.toFirst()
+
+    def updateData(self, data=None):
+        """
+        Update control elements based on data and model passed
         """
         self.cbSmearing.clear()
         self.cbSmearing.addItem("None")
-        self.cbAccuracy.setVisible(False)
-
+        self.gAccuracy.setVisible(False)
+        self.data = data
         if data is None:
             self.setElementsVisibility(False)
         elif isinstance(data, Data1D):
             self.cbSmearing.addItems(SMEARING_1D)
-            self.have_data = Data1D
         else:
             self.cbSmearing.addItems(SMEARING_2D)
-            self.have_data = Data2D
         self.cbSmearing.setCurrentIndex(0)
+
+    def updateKernelModel(self, kernel_model=None):
+        """
+        Update the model
+        """
+        self.kernel_model = kernel_model
+
+    def smearer(self):
+        """ Returns the current smearer """
+        return self.current_smearer
 
     def onIndexChange(self, index):
@@ -113,19 +132,22 @@
         if index == 0:
             self.setElementsVisibility(False)
-            return
+            self.current_smearer = None
         elif index == 1:
             self.setElementsVisibility(True)
             self.setPinholeLabels()
+            self.onPinholeSmear()
         elif index == 2:
             self.setElementsVisibility(True)
             self.setSlitLabels()
-
-    def onModelChange(self, top, bottom):
-        """
-        Respond to model change by updating
-        """
-        #print "MODEL CHANGED for property: %s. The value is now: %s" % \
-        #    (MODEL[top.row()], str(self.model.item(top.row()).text()))
-        pass
+            self.onSlitSmear()
+        self.smearingChangedSignal.emit()
+
+    def onModelChange(self):
+        """
+        Respond to model change by notifying any listeners
+        """
+        # Recalculate the smearing
+        index = self.cbSmearing.currentIndex()
+        self.onIndexChange(index)
 
     def setElementsVisibility(self, visible):
@@ -137,6 +159,6 @@
         self.txtSmearDown.setVisible(visible)
         self.txtSmearUp.setVisible(visible)
-        self.label_14.setVisible(visible)
-        self.label_15.setVisible(visible)
+        self.lblUnitUp.setVisible(visible)
+        self.lblUnitDown.setVisible(visible)
         self.setAccuracyVisibility()
 
@@ -145,8 +167,8 @@
         Accuracy combobox visibility
         """
-        if self.have_data == Data2D and self.cbSmearing.currentIndex() == 1:
-            self.cbAccuracy.setVisible(True)
-        else:
-            self.cbAccuracy.setVisible(False)
+        if isinstance(self.data, Data2D) and self.cbSmearing.currentIndex() == 1:
+            self.gAccuracy.setVisible(True)
+        else:
+            self.gAccuracy.setVisible(False)
 
     def setPinholeLabels(self):
@@ -154,6 +176,14 @@
         Use pinhole labels
         """
-        self.lblSmearUp.setText('<html><head/><body><p>dQ<span style=" vertical-align:sub;">low</span></p></body></html>')
-        self.lblSmearDown.setText('<html><head/><body><p>dQ<span style=" vertical-align:sub;">high</span></p></body></html>')
+        self.txtSmearDown.setVisible(False)
+        self.lblSmearDown.setText('')
+        self.lblUnitDown.setText('')
+        if isinstance(self.data, Data2D):
+            self.lblUnitUp.setText('<html><head/><body><p>Ã
+<span style=" vertical-align:super;">-1</span></p></body></html>')
+            self.lblSmearUp.setText('<html><head/><body><p>&lt;dQ<span style=" vertical-align:sub;">low</span>&gt;</p></body></html>')
+        else:
+            self.lblSmearUp.setText('<html><head/><body><p>dQ<span style=" vertical-align:sub;">%</span></p></body></html>')
+            self.lblUnitUp.setText('%')
 
     def setSlitLabels(self):
@@ -163,4 +193,8 @@
         self.lblSmearUp.setText('Slit height')
         self.lblSmearDown.setText('Slit width')
+        self.lblUnitUp.setText('<html><head/><body><p>Ã
+<span style=" vertical-align:super;">-1</span></p></body></html>')
+        self.lblUnitDown.setText('<html><head/><body><p>Ã
+<span style=" vertical-align:super;">-1</span></p></body></html>')
 
     def state(self):
@@ -168,6 +202,5 @@
         Returns current state of controls
         """
-        # or model-held values
-        smearing = str(self.model.item(MODEL.index('SMEARING')).text())
+        smearing = self.cbSmearing.currentText()
         accuracy = ""
         d_down = None
@@ -191,6 +224,6 @@
         """
         # Update the model -> controls update automatically
-        if smearing is not None:
-            self.model.item(MODEL.index('SMEARING')).setText(smearing)
+        #if smearing is not None:
+            #self.model.item(MODEL.index('SMEARING')).setText(smearing)
         if accuracy is not None:
             self.model.item(MODEL.index('ACCURACY')).setText(accuracy)
@@ -200,2 +233,69 @@
             self.model.item(MODEL.index('PINHOLE_MAX')).setText(d_up)
 
+    def onPinholeSmear(self):
+        """
+        Create a custom pinhole smear object that will change the way residuals
+        are compute when fitting
+        """
+        _, accuracy, d_percent, _ = self.state()
+        if d_percent is None or d_percent == 0.0:
+            self.current_smearer=None
+            return
+        percent = d_percent/100.0
+        # copy data
+        data = copy.deepcopy(self.data)
+        if isinstance(self.data, Data2D):
+            len_data = len(data.data)
+            data.dqx_data = np.zeros(len_data)
+            data.dqy_data = np.zeros(len_data)
+            data.dqx_data[data.dqx_data == 0] = percent * data.qx_data
+            data.dqy_data[data.dqy_data == 0] = percent * data.qy_data
+        else:
+            len_data = len(data.x)
+            data.dx = np.zeros(len_data)
+            data.dx = percent * data.x
+            data.dxl = None
+            data.dxw = None
+
+        self.current_smearer = smear_selection(data, self.kernel_model)
+        # need to set accuracy for 2D
+        if isinstance(self.data, Data2D):
+            backend_accuracy = ACCURACY_DICT.get(accuracy)
+            if backend_accuracy:
+                self.current_smearer.set_accuracy(accuracy=backend_accuracy)
+
+    def onSlitSmear(self):
+        """
+        Create a custom slit smear object that will change the way residuals
+        are compute when fitting
+        """
+        _, accuracy, d_height, d_width = self.state()
+        # Check changes in slit width
+        if d_width is None:
+            d_width = 0.0
+        if d_height is None:
+            d_height = 0.0
+
+        if isinstance(self.data, Data2D):
+            return
+        # make sure once more if it is smearer
+        data = copy.deepcopy(self.data)
+        data_len = len(data.x)
+        data.dx = None
+        data.dxl = None
+        data.dxw = None
+
+        try:
+            self.dxl = d_height
+            data.dxl = self.dxl * np.ones(data_len)
+        except:
+            self.dxl = None
+            data.dxl = np.zeros(data_len)
+        try:
+            self.dxw = d_width
+            data.dxw = self.dxw * np.ones(data_len)
+        except:
+            self.dxw = None
+            data.dxw = np.zeros(data_len)
+
+        self.current_smearer = smear_selection(data, self.kernel_model)
Index: src/sas/qtgui/Perspectives/Fitting/UI/SmearingWidgetUI.ui
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/UI/SmearingWidgetUI.ui	(revision e1e3e09a03e38fca76bc8ef51c8bfcc5d6441d3c)
+++ src/sas/qtgui/Perspectives/Fitting/UI/SmearingWidgetUI.ui	(revision 9a7c81c9d7824d6d653a3572a51e2647fcbced2c)
@@ -7,6 +7,6 @@
     <x>0</x>
     <y>0</y>
-    <width>542</width>
-    <height>270</height>
+    <width>702</width>
+    <height>242</height>
    </rect>
   </property>
@@ -14,9 +14,9 @@
    <string>Form</string>
   </property>
-  <layout class="QGridLayout" name="gridLayout_2">
+  <layout class="QGridLayout" name="gridLayout_4">
    <item row="0" column="0">
     <widget class="QGroupBox" name="groupBox_4">
      <property name="sizePolicy">
-      <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+      <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
        <horstretch>0</horstretch>
        <verstretch>0</verstretch>
@@ -26,114 +26,140 @@
       <string>Instrumental Smearing</string>
      </property>
-     <layout class="QGridLayout" name="gridLayout">
+     <layout class="QGridLayout" name="gridLayout_3">
       <item row="0" column="0">
-       <widget class="QComboBox" name="cbSmearing">
-        <property name="currentIndex">
-         <number>0</number>
-        </property>
-        <property name="sizeAdjustPolicy">
-         <enum>QComboBox::AdjustToContents</enum>
-        </property>
-        <item>
-         <property name="text">
-          <string>None</string>
-         </property>
-        </item>
-        <item>
-         <property name="text">
-          <string>Use dQ Data</string>
-         </property>
-        </item>
-        <item>
-         <property name="text">
-          <string>Custom Pinhole Smear</string>
-         </property>
-        </item>
-        <item>
-         <property name="text">
-          <string>Custom Slit Smear</string>
-         </property>
-        </item>
-       </widget>
-      </item>
-      <item row="0" column="1">
-       <layout class="QGridLayout" name="gridLayout_11">
+       <layout class="QGridLayout" name="gridLayout_2">
         <item row="0" column="0">
-         <widget class="QLabel" name="lblSmearUp">
-          <property name="text">
-           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;dQ&lt;span style=&quot; vertical-align:sub;&quot;&gt;low&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+         <widget class="QComboBox" name="cbSmearing">
+          <property name="currentIndex">
+           <number>0</number>
           </property>
+          <property name="sizeAdjustPolicy">
+           <enum>QComboBox::AdjustToContents</enum>
+          </property>
+          <item>
+           <property name="text">
+            <string>None</string>
+           </property>
+          </item>
+          <item>
+           <property name="text">
+            <string>Use dQ Data</string>
+           </property>
+          </item>
+          <item>
+           <property name="text">
+            <string>Custom Pinhole Smear</string>
+           </property>
+          </item>
+          <item>
+           <property name="text">
+            <string>Custom Slit Smear</string>
+           </property>
+          </item>
          </widget>
         </item>
-        <item row="0" column="1">
-         <widget class="QLineEdit" name="txtSmearUp"/>
+        <item row="0" column="1" rowspan="2">
+         <layout class="QGridLayout" name="gridLayout_11">
+          <item row="0" column="0">
+           <widget class="QLabel" name="lblSmearUp">
+            <property name="text">
+             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;dQ&lt;span style=&quot; vertical-align:sub;&quot;&gt;low&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="1">
+           <widget class="QLineEdit" name="txtSmearUp"/>
+          </item>
+          <item row="0" column="2">
+           <widget class="QLabel" name="lblUnitUp">
+            <property name="text">
+             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Ã
+&lt;span style=&quot; vertical-align:super;&quot;&gt;-1&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="0">
+           <widget class="QLabel" name="lblSmearDown">
+            <property name="text">
+             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;dQ&lt;span style=&quot; vertical-align:sub;&quot;&gt;high&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="1">
+           <widget class="QLineEdit" name="txtSmearDown"/>
+          </item>
+          <item row="1" column="2">
+           <widget class="QLabel" name="lblUnitDown">
+            <property name="text">
+             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Ã
+&lt;span style=&quot; vertical-align:super;&quot;&gt;-1&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
         </item>
-        <item row="0" column="2">
-         <widget class="QLabel" name="label_14">
-          <property name="text">
-           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Ã
-&lt;span style=&quot; vertical-align:super;&quot;&gt;-1&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+        <item row="0" column="2" rowspan="2">
+         <widget class="QGroupBox" name="gAccuracy">
+          <property name="title">
+           <string>Accuracy</string>
           </property>
+          <layout class="QGridLayout" name="gridLayout">
+           <item row="0" column="0">
+            <widget class="QComboBox" name="cbAccuracy">
+             <item>
+              <property name="text">
+               <string>Low</string>
+              </property>
+             </item>
+             <item>
+              <property name="text">
+               <string>Medium</string>
+              </property>
+             </item>
+             <item>
+              <property name="text">
+               <string>High</string>
+              </property>
+             </item>
+             <item>
+              <property name="text">
+               <string>Extra high</string>
+              </property>
+             </item>
+            </widget>
+           </item>
+          </layout>
          </widget>
         </item>
         <item row="1" column="0">
-         <widget class="QLabel" name="lblSmearDown">
-          <property name="text">
-           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;dQ&lt;span style=&quot; vertical-align:sub;&quot;&gt;high&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+         <spacer name="verticalSpacer_2">
+          <property name="orientation">
+           <enum>Qt::Vertical</enum>
           </property>
-         </widget>
-        </item>
-        <item row="1" column="1">
-         <widget class="QLineEdit" name="txtSmearDown"/>
-        </item>
-        <item row="1" column="2">
-         <widget class="QLabel" name="label_15">
-          <property name="text">
-           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Ã
-&lt;span style=&quot; vertical-align:super;&quot;&gt;-1&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>20</width>
+            <height>18</height>
+           </size>
           </property>
-         </widget>
+         </spacer>
         </item>
        </layout>
       </item>
-      <item row="0" column="2">
-       <widget class="QComboBox" name="cbAccuracy">
-        <item>
-         <property name="text">
-          <string>Low</string>
-         </property>
-        </item>
-        <item>
-         <property name="text">
-          <string>Medium</string>
-         </property>
-        </item>
-        <item>
-         <property name="text">
-          <string>High</string>
-         </property>
-        </item>
-        <item>
-         <property name="text">
-          <string>Extra high</string>
-         </property>
-        </item>
-       </widget>
-      </item>
-      <item row="0" column="3">
-       <spacer name="horizontalSpacer_2">
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
-        </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>71</width>
-          <height>20</height>
-         </size>
-        </property>
-       </spacer>
-      </item>
      </layout>
     </widget>
+   </item>
+   <item row="0" column="1">
+    <spacer name="horizontalSpacer_2">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>71</width>
+       <height>20</height>
+      </size>
+     </property>
+    </spacer>
    </item>
    <item row="1" column="0">
