Index: src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision f84d793343c420fd47b44c3b601e90f9e82ea451)
+++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision 66d43707875dcce0f7f6ea2e13982c1815570f09)
@@ -247,4 +247,8 @@
         # copy of current kernel model
         self.kernel_module_copy = None
+
+        # dictionaries of current params
+        self.poly_params = {}
+        self.magnet_params = {}
 
         # Page id for fitting
@@ -1186,14 +1190,10 @@
             # Update the sasmodel
             # PD[ratio] -> width, npts -> npts, nsigs -> nsigmas
-            self.kernel_module.setParam(parameter_name + '.' + delegate.columnDict()[model_column], value)
+            #self.kernel_module.setParam(parameter_name + '.' + delegate.columnDict()[model_column], value)
+            key = parameter_name + '.' + delegate.columnDict()[model_column]
+            self.poly_params[key] = value
 
             # Update plot
             self.updateData()
-
-        # update in param model
-        if model_column in [delegate.poly_pd, delegate.poly_error, delegate.poly_min, delegate.poly_max]:
-            row = self.getRowFromName(parameter_name)
-            param_item = self._model_model.item(row)
-            param_item.child(0).child(0, model_column).setText(item.text())
 
     def onMagnetModelChange(self, item):
@@ -1224,15 +1224,21 @@
             # Unparsable field
             return
-
-        property_index = self._magnet_model.headerData(1, model_column)-1 # Value, min, max, etc.
-
-        # Update the parameter value - note: this supports +/-inf as well
-        self.kernel_module.params[parameter_name] = value
-
-        # min/max to be changed in self.kernel_module.details[parameter_name] = ['Ang', 0.0, inf]
-        self.kernel_module.details[parameter_name][property_index] = value
-
-        # Force the chart update when actual parameters changed
-        if model_column == 1:
+        delegate = self.lstMagnetic.itemDelegate()
+
+        if model_column > 1:
+            if model_column == delegate.mag_min:
+                pos = 1
+            elif model_column == delegate.mag_max:
+                pos = 2
+            elif model_column == delegate.mag_unit:
+                pos = 0
+            else:
+                raise AttributeError("Wrong column in magnetism table.")
+            # min/max to be changed in self.kernel_module.details[parameter_name] = ['Ang', 0.0, inf]
+            self.kernel_module.details[parameter_name][pos] = value
+        else:
+            self.magnet_params[parameter_name] = value
+            #self.kernel_module.setParam(parameter_name) = value
+            # Force the chart update when actual parameters changed
             self.recalculatePlotData()
 
@@ -1495,7 +1501,9 @@
         # Data going in
         data = self.logic.data
-        model = self.kernel_module
+        model = copy.deepcopy(self.kernel_module)
         qmin = self.q_range_min
         qmax = self.q_range_max
+        # add polydisperse/magnet parameters if asked
+        self.updateKernelModelWithExtraParams(model)
 
         params_to_fit = self.main_params_to_fit
@@ -1974,6 +1982,8 @@
 
         # Add polydispersity to the model
+        self.poly_params = {}
         self.setPolyModel()
         # Add magnetic parameters to the model
+        self.magnet_params = {}
         self.setMagneticModel()
 
@@ -2237,4 +2247,21 @@
         return self.completed1D if isinstance(self.data, Data1D) else self.completed2D
 
+    def updateKernelModelWithExtraParams(self, model=None):
+        """
+        Updates kernel model 'model' with extra parameters from
+        the polydisp and magnetism tab, if the tabs are enabled
+        """
+        if model is None: return
+        if not hasattr(model, 'setParam'): return
+
+        # add polydisperse parameters if asked
+        if self.chkPolydispersity.isChecked():
+            for key, value in self.poly_params.items():
+                model.setParam(key, value)
+        # add magnetic params if asked
+        if self.chkMagnetism.isChecked():
+            for key, value in self.magnet_params.items():
+                model.setParam(key, value)
+
     def calculateQGridForModelExt(self, data=None, model=None, completefn=None, use_threads=True):
         """
@@ -2244,5 +2271,7 @@
             data = self.data
         if model is None:
-            model = self.kernel_module
+            model = copy.deepcopy(self.kernel_module)
+            self.updateKernelModelWithExtraParams(model)
+
         if completefn is None:
             completefn = self.methodCompleteForData()
@@ -2338,6 +2367,13 @@
         """
         fitted_data = self.logic.new2DPlot(return_data)
-        self.calculateResiduals(fitted_data)
+        residuals = self.calculateResiduals(fitted_data)
         self.model_data = fitted_data
+        new_plots = [fitted_data]
+        if residuals is not None:
+            new_plots.append(residuals)
+
+        # Update/generate plots
+        for plot in new_plots:
+            self.communicate.plotUpdateSignal.emit([plot])
 
     def calculateResiduals(self, fitted_data):
@@ -2470,4 +2506,9 @@
         _, min, max = self.kernel_module.details[param_name]
 
+        # Update local param dict
+        self.poly_params[param_name + '.width'] = width
+        self.poly_params[param_name + '.npts'] = npts
+        self.poly_params[param_name + '.nsigmas'] = nsigs
+
         # Construct a row with polydisp. related variable.
         # This will get added to the polydisp. model
@@ -2643,4 +2684,6 @@
                         str(param.limits[1]),
                         param.units]
+
+        self.magnet_params[param.name] = param.default
 
         FittingUtilities.addCheckedListToModel(model, checked_list)
Index: src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py	(revision 605d944a69488f22ea74b9d65f595b664f5aae54)
+++ src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py	(revision 66d43707875dcce0f7f6ea2e13982c1815570f09)
@@ -445,21 +445,24 @@
         self.assertEqual(self.widget.kernel_module.details['radius_bell'][1], 1.0)
 
+        #self.widget.show()
+        #QtWidgets.QApplication.exec_()
+
         # Change the number of points
-        self.assertEqual(self.widget.kernel_module.getParam('radius_bell.npts'), 35)
+        self.assertEqual(self.widget.poly_params['radius_bell.npts'], 35)
         self.widget._poly_model.item(0,4).setText("22")
-        self.assertEqual(self.widget.kernel_module.getParam('radius_bell.npts'), 22)
+        self.assertEqual(self.widget.poly_params['radius_bell.npts'], 22)
         # try something stupid
         self.widget._poly_model.item(0,4).setText("butt")
         # see that this didn't annoy the control at all
-        self.assertEqual(self.widget.kernel_module.getParam('radius_bell.npts'), 22)
+        self.assertEqual(self.widget.poly_params['radius_bell.npts'], 22)
 
         # Change the number of sigmas
-        self.assertEqual(self.widget.kernel_module.getParam('radius_bell.nsigmas'), 3)
+        self.assertEqual(self.widget.poly_params['radius_bell.nsigmas'], 3)
         self.widget._poly_model.item(0,5).setText("222")
-        self.assertEqual(self.widget.kernel_module.getParam('radius_bell.nsigmas'), 222)
+        self.assertEqual(self.widget.poly_params['radius_bell.nsigmas'], 222)
         # try something stupid again
         self.widget._poly_model.item(0,4).setText("beer")
         # no efect
-        self.assertEqual(self.widget.kernel_module.getParam('radius_bell.nsigmas'), 222)
+        self.assertEqual(self.widget.poly_params['radius_bell.nsigmas'], 222)
 
     def testOnPolyComboIndexChange(self):
@@ -482,16 +485,16 @@
         self.widget.onPolyComboIndexChange('rectangle', 0)
         # check values
-        self.assertEqual(self.widget.kernel_module.getParam('radius_bell.npts'), 35)
-        self.assertAlmostEqual(self.widget.kernel_module.getParam('radius_bell.nsigmas'), 1.73205, 5)
+        self.assertEqual(self.widget.poly_params['radius_bell.npts'], 35)
+        self.assertAlmostEqual(self.widget.poly_params['radius_bell.nsigmas'], 1.73205, 5)
         # Change the index
         self.widget.onPolyComboIndexChange('lognormal', 0)
         # check values
-        self.assertEqual(self.widget.kernel_module.getParam('radius_bell.npts'), 80)
-        self.assertEqual(self.widget.kernel_module.getParam('radius_bell.nsigmas'), 8)
+        self.assertEqual(self.widget.poly_params['radius_bell.npts'], 80)
+        self.assertEqual(self.widget.poly_params['radius_bell.nsigmas'], 8)
         # Change the index
         self.widget.onPolyComboIndexChange('schulz', 0)
         # check values
-        self.assertEqual(self.widget.kernel_module.getParam('radius_bell.npts'), 80)
-        self.assertEqual(self.widget.kernel_module.getParam('radius_bell.nsigmas'), 8)
+        self.assertEqual(self.widget.poly_params['radius_bell.npts'], 80)
+        self.assertEqual(self.widget.poly_params['radius_bell.nsigmas'], 8)
 
         # mock up file load
