Index: src/sas/qtgui/Calculators/SldPanel.py
===================================================================
--- src/sas/qtgui/Calculators/SldPanel.py	(revision 5c0e717a674c1d38556449d3d2473408bfae3319)
+++ src/sas/qtgui/Calculators/SldPanel.py	(revision aed053275d5f293f1f6495be4c78e4b18fc52b41)
@@ -6,5 +6,5 @@
 
 from periodictable import formula as Formula
-from periodictable.xsf import xray_energy, xray_sld
+from periodictable.xsf import xray_energy, xray_sld_from_atoms
 from periodictable.nsf import neutron_scattering
 
@@ -21,10 +21,11 @@
     'MOLECULAR_FORMULA',
     'MASS_DENSITY',
-    'NEUTRON_WAVELENGTH',
+    'WAVELENGTH',
     'NEUTRON_SLD_REAL',
     'NEUTRON_SLD_IMAG',
-    'XRAY_WAVELENGTH',
-    'XRAY_SLD_REAL',
-    'XRAY_SLD_IMAG',
+    'CU_KA_SLD_REAL',
+    'CU_KA_SLD_IMAG',
+    'MO_KA_SLD_REAL',
+    'MO_KA_SLD_IMAG',
     'NEUTRON_INC_XS',
     'NEUTRON_ABS_XS',
@@ -33,49 +34,64 @@
 
 class SldResult(object):
-    def __init__(self, molecular_formula, mass_density,
-        neutron_wavelength, neutron_sld_real, neutron_sld_imag,
-        xray_wavelength, xray_sld_real, xray_sld_imag,
+    def __init__(self, molecular_formula, mass_density, wavelength,
+        neutron_sld_real, neutron_sld_imag,
+        cu_ka_sld_real, cu_ka_sld_imag,
+        mo_ka_sld_real, mo_ka_sld_imag,
         neutron_inc_xs, neutron_abs_xs, neutron_length):
 
         self.molecular_formula = molecular_formula
         self.mass_density = mass_density
-        self.neutron_wavelength = neutron_wavelength
+        self.wavelength = wavelength
         self.neutron_sld_real = neutron_sld_real
         self.neutron_sld_imag = neutron_sld_imag
-        self.xray_wavelength = xray_wavelength
-        self.xray_sld_real = xray_sld_real
-        self.xray_sld_imag = xray_sld_imag
+        self.cu_ka_sld_real = cu_ka_sld_real
+        self.cu_ka_sld_imag = cu_ka_sld_imag
+        self.mo_ka_sld_real = mo_ka_sld_real
+        self.mo_ka_sld_imag = mo_ka_sld_imag
         self.neutron_inc_xs = neutron_inc_xs
         self.neutron_abs_xs = neutron_abs_xs
         self.neutron_length = neutron_length
 
-def sldAlgorithm(molecular_formula, mass_density, neutron_wavelength, xray_wavelength):
-
-    xray_sld_real, xray_sld_imag = xray_sld(
-            compound=molecular_formula,
+def sldAlgorithm(molecular_formula, mass_density, wavelength):
+
+    sld_formula = Formula(molecular_formula, density=mass_density)
+
+    def calculate_sld(formula):
+        if len(formula.atoms) != 1:
+            raise NotImplementedError()
+        energy = xray_energy(list(formula.atoms.keys())[0].K_alpha)
+        return xray_sld_from_atoms(
+            sld_formula.atoms,
             density=mass_density,
-            wavelength=xray_wavelength)
-
-    (neutron_sld_real, neutron_sld_imag, _), (_, neutron_abs_xs, neutron_inc_xs), neutron_length = \
+            energy=energy)
+
+    cu_real, cu_imag = calculate_sld(Formula("Cu"))
+    mo_real, mo_imag = calculate_sld(Formula("Mo"))
+
+    (sld_real, sld_imag, _), (_, neutron_abs_xs, neutron_inc_xs), neutron_length = \
         neutron_scattering(
             compound=molecular_formula,
             density=mass_density,
-            wavelength=neutron_wavelength)
+            wavelength=wavelength)
 
     SCALE = 1e-6
 
     # neutron sld
-    scaled_neutron_sld_real = SCALE * neutron_sld_real
-    scaled_neutron_sld_imag = SCALE * abs(neutron_sld_imag)
-
-    # xray sld
-    scaled_xray_sld_real = SCALE * xray_sld_real
-    scaled_xray_sld_imag = SCALE * abs(xray_sld_imag)
-
+    neutron_sld_real = SCALE * sld_real
+    neutron_sld_imag = SCALE * abs(sld_imag)
+
+    # Cu sld
+    cu_ka_sld_real = SCALE * cu_real
+    cu_ka_sld_imag = SCALE * abs(cu_imag)
+
+    # Mo sld
+    mo_ka_sld_real = SCALE * mo_real
+    mo_ka_sld_imag = SCALE * abs(mo_imag)
 
     return SldResult(
-        molecular_formula, mass_density,
-        neutron_wavelength, scaled_neutron_sld_real, scaled_neutron_sld_imag,
-        xray_wavelength, scaled_xray_sld_real, scaled_xray_sld_imag,
+        molecular_formula, mass_density, wavelength,
+        neutron_sld_real, neutron_sld_imag,
+        cu_ka_sld_real, cu_ka_sld_imag,
+        mo_ka_sld_real, mo_ka_sld_imag,
         neutron_inc_xs, neutron_abs_xs, neutron_length)
 
@@ -96,6 +112,8 @@
             MODEL.NEUTRON_SLD_REAL: self.ui.editNeutronSldReal,
             MODEL.NEUTRON_SLD_IMAG: self.ui.editNeutronSldImag,
-            MODEL.XRAY_SLD_REAL: self.ui.editXraySldReal,
-            MODEL.XRAY_SLD_IMAG: self.ui.editXraySldImag,
+            MODEL.CU_KA_SLD_REAL: self.ui.editCuKaSldReal,
+            MODEL.CU_KA_SLD_IMAG: self.ui.editCuKaSldImag,
+            MODEL.MO_KA_SLD_REAL: self.ui.editMoKaSldReal,
+            MODEL.MO_KA_SLD_IMAG: self.ui.editMoKaSldImag,
             MODEL.NEUTRON_INC_XS: self.ui.editNeutronIncXs,
             MODEL.NEUTRON_ABS_XS: self.ui.editNeutronAbsXs,
@@ -113,21 +131,15 @@
         rx = QtCore.QRegExp("[+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?")
         self.ui.editMassDensity.setValidator(QtGui.QRegExpValidator(rx, self.ui.editMassDensity))
-        self.ui.editNeutronWavelength.setValidator(QtGui.QRegExpValidator(rx, self.ui.editNeutronWavelength))
-        self.ui.editXrayWavelength.setValidator(QtGui.QRegExpValidator(rx, self.ui.editXrayWavelength))
+        self.ui.editWavelength.setValidator(QtGui.QRegExpValidator(rx, self.ui.editWavelength))
 
         # signals
-        self.ui.helpButton.clicked.connect(self.displayHelp)
-        self.ui.closeButton.clicked.connect(self.closePanel)
-        self.ui.recalculateButton.clicked.connect(self.calculateSLD)
-
-    def calculateSLD(self):
-        self.recalculateSLD()
+        self.ui.buttonBox.button(QtWidgets.QDialogButtonBox.Reset).clicked.connect(self.modelReset)
+        self.ui.buttonBox.button(QtWidgets.QDialogButtonBox.Help).clicked.connect(self.displayHelp)
 
     def setupModel(self):
         self.model = QtGui.QStandardItemModel(self)
-        self.model.setItem(MODEL.MOLECULAR_FORMULA , QtGui.QStandardItem())
-        self.model.setItem(MODEL.MASS_DENSITY      , QtGui.QStandardItem())
-        self.model.setItem(MODEL.NEUTRON_WAVELENGTH, QtGui.QStandardItem())
-        self.model.setItem(MODEL.XRAY_WAVELENGTH   , QtGui.QStandardItem())
+        self.model.setItem(MODEL.MOLECULAR_FORMULA, QtGui.QStandardItem())
+        self.model.setItem(MODEL.MASS_DENSITY     , QtGui.QStandardItem())
+        self.model.setItem(MODEL.WAVELENGTH       , QtGui.QStandardItem())
 
         for key in list(self._getOutputs().keys()):
@@ -135,9 +147,4 @@
 
         self.model.dataChanged.connect(self.dataChanged)
-
-        self.ui.editMassDensity.textEdited.connect(self.recalculateSLD)
-        self.ui.editMolecularFormula.textEdited.connect(self.recalculateSLD)
-        self.ui.editNeutronWavelength.textEdited.connect(self.recalculateSLD)
-        self.ui.editXrayWavelength.textEdited.connect(self.recalculateSLD)
 
         self.modelReset()
@@ -147,8 +154,7 @@
         self.mapper.setModel(self.model)
         self.mapper.setOrientation(QtCore.Qt.Vertical)
-        self.mapper.addMapping(self.ui.editMolecularFormula , MODEL.MOLECULAR_FORMULA)
-        self.mapper.addMapping(self.ui.editMassDensity      , MODEL.MASS_DENSITY)
-        self.mapper.addMapping(self.ui.editNeutronWavelength, MODEL.NEUTRON_WAVELENGTH)
-        self.mapper.addMapping(self.ui.editXrayWavelength   , MODEL.XRAY_WAVELENGTH)
+        self.mapper.addMapping(self.ui.editMolecularFormula, MODEL.MOLECULAR_FORMULA)
+        self.mapper.addMapping(self.ui.editMassDensity     , MODEL.MASS_DENSITY)
+        self.mapper.addMapping(self.ui.editWavelength      , MODEL.WAVELENGTH)
 
         for key, edit in self._getOutputs().items():
@@ -160,50 +166,46 @@
         update = False
         for index in range(top.row(), bottom.row() + 1):
-            if (index == MODEL.MOLECULAR_FORMULA) or (index == MODEL.MASS_DENSITY) or (index == MODEL.NEUTRON_WAVELENGTH) or (index == MODEL.XRAY_WAVELENGTH):
+            if (index == MODEL.MOLECULAR_FORMULA) or (index == MODEL.MASS_DENSITY) or (index == MODEL.WAVELENGTH):
                 update = True
 
-        # calculation
+        # calcualtion
         if update:
-            self.recalculateSLD()
-
-    def recalculateSLD(self):
-        formula = self.ui.editMolecularFormula.text()
-        density = self.ui.editMassDensity.text()
-        neutronWavelength = self.ui.editNeutronWavelength.text()
-        xrayWavelength = self.ui.editXrayWavelength.text()
-
-        if len(formula) > 0 and len(density) > 0 and len(neutronWavelength) > 0 and len(xrayWavelength) > 0:
-            try:
-                results = sldAlgorithm(str(formula), float(density), float(neutronWavelength), float(xrayWavelength))
-
-                def format(value):
-                    return ("%-5.3g" % value).strip()
-
-                self.model.item(MODEL.NEUTRON_SLD_REAL).setText(format(results.neutron_sld_real))
-                self.model.item(MODEL.NEUTRON_SLD_IMAG).setText(format(results.neutron_sld_imag))
-
-                self.model.item(MODEL.XRAY_SLD_REAL).setText(format(results.xray_sld_real))
-                self.model.item(MODEL.XRAY_SLD_IMAG).setText(format(results.xray_sld_imag))
-
-                self.model.item(MODEL.NEUTRON_INC_XS).setText(format(results.neutron_inc_xs))
-                self.model.item(MODEL.NEUTRON_ABS_XS).setText(format(results.neutron_abs_xs))
-                self.model.item(MODEL.NEUTRON_LENGTH).setText(format(results.neutron_length))
-
-                return
-
-            except Exception as e:
-                pass
-
-        for key in list(self._getOutputs().keys()):
-            self.model.item(key).setText("")
+            formula = self.model.item(MODEL.MOLECULAR_FORMULA).text()
+            density = self.model.item(MODEL.MASS_DENSITY).text()
+            wavelength = self.model.item(MODEL.WAVELENGTH).text()
+            if len(formula) > 0 and len(density) > 0 and len(wavelength) > 0:
+                try:
+                    results = sldAlgorithm(str(formula), float(density), float(wavelength))
+
+                    def format(value):
+                        return ("%-5.3g" % value).strip()
+
+                    self.model.item(MODEL.NEUTRON_SLD_REAL).setText(format(results.neutron_sld_real))
+                    self.model.item(MODEL.NEUTRON_SLD_IMAG).setText(format(results.neutron_sld_imag))
+
+                    self.model.item(MODEL.CU_KA_SLD_REAL).setText(format(results.cu_ka_sld_real))
+                    self.model.item(MODEL.CU_KA_SLD_IMAG).setText(format(results.cu_ka_sld_imag))
+
+                    self.model.item(MODEL.MO_KA_SLD_REAL).setText(format(results.mo_ka_sld_real))
+                    self.model.item(MODEL.MO_KA_SLD_IMAG).setText(format(results.mo_ka_sld_imag))
+
+                    self.model.item(MODEL.NEUTRON_INC_XS).setText(format(results.neutron_inc_xs))
+                    self.model.item(MODEL.NEUTRON_ABS_XS).setText(format(results.neutron_abs_xs))
+                    self.model.item(MODEL.NEUTRON_LENGTH).setText(format(results.neutron_length))
+
+                    return
+            
+                except Exception as e:
+                    pass
+
+            for key in list(self._getOutputs().keys()):
+                self.model.item(key).setText("")
 
     def modelReset(self):
         #self.model.beginResetModel()
         try:
-            self.model.item(MODEL.MOLECULAR_FORMULA ).setText("H2O")
-            self.model.item(MODEL.MASS_DENSITY      ).setText("1.0")
-            self.model.item(MODEL.NEUTRON_WAVELENGTH).setText("6.0")
-            self.model.item(MODEL.XRAY_WAVELENGTH   ).setText("1.0")
-            self.recalculateSLD()
+            self.model.item(MODEL.MOLECULAR_FORMULA).setText("H2O")
+            self.model.item(MODEL.MASS_DENSITY     ).setText("1")
+            self.model.item(MODEL.WAVELENGTH       ).setText("6")
         finally:
             pass
@@ -215,8 +217,2 @@
 
 
-    def closePanel(self):
-        """
-        close the window containing this panel
-        """
-        self.close()
-
Index: src/sas/qtgui/Calculators/UI/SldPanel.ui
===================================================================
--- src/sas/qtgui/Calculators/UI/SldPanel.ui	(revision 5c0e717a674c1d38556449d3d2473408bfae3319)
+++ src/sas/qtgui/Calculators/UI/SldPanel.ui	(revision cd2cc7458970e179039a783e9409f48c4c1fca0d)
@@ -7,6 +7,6 @@
     <x>0</x>
     <y>0</y>
-    <width>490</width>
-    <height>490</height>
+    <width>447</width>
+    <height>403</height>
    </rect>
   </property>
@@ -25,66 +25,4 @@
   </property>
   <layout class="QGridLayout" name="gridLayout_2">
-   <item row="3" column="0">
-    <spacer name="verticalSpacer">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>40</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="4" column="0">
-    <widget class="QWidget" name="widget" native="true">
-     <property name="minimumSize">
-      <size>
-       <width>466</width>
-       <height>32</height>
-      </size>
-     </property>
-     <widget class="QPushButton" name="recalculateButton">
-      <property name="geometry">
-       <rect>
-        <x>0</x>
-        <y>0</y>
-        <width>114</width>
-        <height>32</height>
-       </rect>
-      </property>
-      <property name="text">
-       <string>Recalculate</string>
-      </property>
-     </widget>
-     <widget class="QPushButton" name="helpButton">
-      <property name="geometry">
-       <rect>
-        <x>176</x>
-        <y>0</y>
-        <width>114</width>
-        <height>32</height>
-       </rect>
-      </property>
-      <property name="text">
-       <string>Help</string>
-      </property>
-     </widget>
-     <widget class="QPushButton" name="closeButton">
-      <property name="geometry">
-       <rect>
-        <x>352</x>
-        <y>0</y>
-        <width>114</width>
-        <height>32</height>
-       </rect>
-      </property>
-      <property name="text">
-       <string>Close</string>
-      </property>
-     </widget>
-    </widget>
-   </item>
    <item row="0" column="0">
     <widget class="QGroupBox" name="groupBoxInput">
@@ -120,4 +58,14 @@
        <widget class="QLineEdit" name="editMassDensity"/>
       </item>
+      <item row="2" column="1">
+       <widget class="QLineEdit" name="editWavelength">
+        <property name="styleSheet">
+         <string notr="true"/>
+        </property>
+        <property name="readOnly">
+         <bool>false</bool>
+        </property>
+       </widget>
+      </item>
       <item row="2" column="2">
        <widget class="QLabel" name="label_12">
@@ -138,33 +86,5 @@
        <widget class="QLabel" name="label_11">
         <property name="text">
-         <string>Neutron Wavelength</string>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="1">
-       <widget class="QLineEdit" name="editNeutronWavelength">
-        <property name="styleSheet">
-         <string notr="true"/>
-        </property>
-        <property name="readOnly">
-         <bool>false</bool>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="1">
-       <widget class="QLineEdit" name="editXrayWavelength"/>
-      </item>
-      <item row="3" column="0">
-       <widget class="QLabel" name="label_13">
-        <property name="text">
-         <string>X-Ray Wavelength</string>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="2">
-       <widget class="QLabel" name="label">
-        <property name="text">
-         <string>Ã
-</string>
+         <string>Wavelength</string>
         </property>
        </widget>
@@ -179,42 +99,15 @@
      </property>
      <layout class="QGridLayout" name="gridLayoutOutput">
+      <item row="0" column="0">
+       <widget class="QLabel" name="label_17">
+        <property name="text">
+         <string>Neutron SLD</string>
+        </property>
+       </widget>
+      </item>
       <item row="0" column="1">
        <widget class="QLineEdit" name="editNeutronSldReal">
-        <property name="enabled">
-         <bool>false</bool>
-        </property>
-        <property name="readOnly">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="0">
-       <widget class="QLabel" name="label_17">
-        <property name="text">
-         <string>Neutron SLD</string>
-        </property>
-       </widget>
-      </item>
-      <item row="5" column="0">
-       <widget class="QLabel" name="label_3">
-        <property name="text">
-         <string>Neutron 1/e length</string>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="1">
-       <widget class="QLineEdit" name="editNeutronIncXs">
-        <property name="enabled">
-         <bool>false</bool>
-        </property>
-        <property name="readOnly">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="0">
-       <widget class="QLabel" name="label_21">
-        <property name="text">
-         <string>Neutron Inc. Xs</string>
+        <property name="readOnly">
+         <bool>true</bool>
         </property>
        </widget>
@@ -227,4 +120,36 @@
        </widget>
       </item>
+      <item row="0" column="3">
+       <widget class="QLineEdit" name="editNeutronSldImag">
+        <property name="readOnly">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="4">
+       <widget class="QLabel" name="label_5">
+        <property name="text">
+         <string>1/Ã
+Â²</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="0">
+       <widget class="QLabel" name="label_19">
+        <property name="text">
+         <string>Cu Ka SLD</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="1">
+       <widget class="QLineEdit" name="editCuKaSldReal">
+        <property name="styleSheet">
+         <string notr="true"/>
+        </property>
+        <property name="readOnly">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
       <item row="1" column="2">
        <widget class="QLabel" name="label_20">
@@ -234,59 +159,8 @@
        </widget>
       </item>
-      <item row="0" column="3">
-       <widget class="QLineEdit" name="editNeutronSldImag">
-        <property name="enabled">
-         <bool>false</bool>
-        </property>
-        <property name="readOnly">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item row="5" column="2" colspan="2">
-       <widget class="QLabel" name="label_4">
-        <property name="text">
-         <string>cm</string>
-        </property>
-       </widget>
-      </item>
-      <item row="5" column="1">
-       <widget class="QLineEdit" name="editNeutronLength">
-        <property name="enabled">
-         <bool>false</bool>
-        </property>
-        <property name="readOnly">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item row="4" column="2" colspan="2">
-       <widget class="QLabel" name="label_24">
-        <property name="text">
-         <string>1/cm</string>
-        </property>
-       </widget>
-      </item>
-      <item row="4" column="1">
-       <widget class="QLineEdit" name="editNeutronAbsXs">
-        <property name="enabled">
-         <bool>false</bool>
-        </property>
-        <property name="readOnly">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item row="4" column="0">
-       <widget class="QLabel" name="label_23">
-        <property name="text">
-         <string>Neutron Abs. Xs</string>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="2" colspan="2">
-       <widget class="QLabel" name="label_22">
-        <property name="text">
-         <string>1/cm</string>
+      <item row="1" column="3">
+       <widget class="QLineEdit" name="editCuKaSldImag">
+        <property name="readOnly">
+         <bool>true</bool>
         </property>
        </widget>
@@ -300,13 +174,34 @@
        </widget>
       </item>
-      <item row="1" column="0">
-       <widget class="QLabel" name="label_19">
-        <property name="text">
-         <string>X-Ray SLD</string>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="4">
-       <widget class="QLabel" name="label_5">
+      <item row="2" column="0">
+       <widget class="QLabel" name="label">
+        <property name="text">
+         <string>Mo Ka SLD</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="1">
+       <widget class="QLineEdit" name="editMoKaSldReal">
+        <property name="readOnly">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="2">
+       <widget class="QLabel" name="label_2">
+        <property name="text">
+         <string>-i</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="3">
+       <widget class="QLineEdit" name="editMoKaSldImag">
+        <property name="readOnly">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="4">
+       <widget class="QLabel" name="label_7">
         <property name="text">
          <string>1/Ã
@@ -315,5 +210,5 @@
        </widget>
       </item>
-      <item row="2" column="0" colspan="5">
+      <item row="3" column="0" colspan="5">
        <widget class="QFrame" name="frame">
         <property name="minimumSize">
@@ -337,25 +232,94 @@
        </widget>
       </item>
-      <item row="1" column="1">
-       <widget class="QLineEdit" name="editXraySldReal">
-        <property name="enabled">
-         <bool>false</bool>
-        </property>
-        <property name="readOnly">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="3">
-       <widget class="QLineEdit" name="editXraySldImag">
-        <property name="enabled">
-         <bool>false</bool>
-        </property>
-        <property name="readOnly">
-         <bool>true</bool>
+      <item row="4" column="0">
+       <widget class="QLabel" name="label_21">
+        <property name="text">
+         <string>Neutron Inc. Xs</string>
+        </property>
+       </widget>
+      </item>
+      <item row="4" column="1">
+       <widget class="QLineEdit" name="editNeutronIncXs">
+        <property name="readOnly">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="4" column="2" colspan="2">
+       <widget class="QLabel" name="label_22">
+        <property name="text">
+         <string>1/cm</string>
+        </property>
+       </widget>
+      </item>
+      <item row="5" column="0">
+       <widget class="QLabel" name="label_23">
+        <property name="text">
+         <string>Neutron Abs. Xs</string>
+        </property>
+       </widget>
+      </item>
+      <item row="5" column="1">
+       <widget class="QLineEdit" name="editNeutronAbsXs">
+        <property name="readOnly">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="5" column="2" colspan="2">
+       <widget class="QLabel" name="label_24">
+        <property name="text">
+         <string>1/cm</string>
+        </property>
+       </widget>
+      </item>
+      <item row="6" column="0">
+       <widget class="QLabel" name="label_3">
+        <property name="text">
+         <string>Neutron 1/e length</string>
+        </property>
+       </widget>
+      </item>
+      <item row="6" column="1">
+       <widget class="QLineEdit" name="editNeutronLength">
+        <property name="readOnly">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="6" column="2" colspan="2">
+       <widget class="QLabel" name="label_4">
+        <property name="text">
+         <string>cm</string>
         </property>
        </widget>
       </item>
      </layout>
+    </widget>
+   </item>
+   <item row="2" column="0">
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>40</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item row="3" column="0">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Close|QDialogButtonBox::Help|QDialogButtonBox::Reset</set>
+     </property>
+     <property name="centerButtons">
+      <bool>true</bool>
+     </property>
     </widget>
    </item>
@@ -365,12 +329,50 @@
   <tabstop>editMolecularFormula</tabstop>
   <tabstop>editMassDensity</tabstop>
-  <tabstop>editNeutronWavelength</tabstop>
+  <tabstop>editWavelength</tabstop>
   <tabstop>editNeutronSldReal</tabstop>
   <tabstop>editNeutronSldImag</tabstop>
+  <tabstop>editCuKaSldReal</tabstop>
+  <tabstop>editCuKaSldImag</tabstop>
+  <tabstop>editMoKaSldReal</tabstop>
+  <tabstop>editMoKaSldImag</tabstop>
   <tabstop>editNeutronIncXs</tabstop>
   <tabstop>editNeutronAbsXs</tabstop>
   <tabstop>editNeutronLength</tabstop>
+  <tabstop>buttonBox</tabstop>
  </tabstops>
  <resources/>
- <connections/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>SldPanel</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>SldPanel</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
 </ui>
Index: src/sas/qtgui/MainWindow/DataExplorer.py
===================================================================
--- src/sas/qtgui/MainWindow/DataExplorer.py	(revision fd7ef366aae1676b62ef944659ae3d38556a61fb)
+++ src/sas/qtgui/MainWindow/DataExplorer.py	(revision 9463ca22fbd7a5dfabfd6ec8adf7690e1460bef6)
@@ -4,4 +4,5 @@
 import time
 import logging
+import re
 
 from PyQt5 import QtCore
@@ -36,4 +37,12 @@
     # The controller which is responsible for managing signal slots connections
     # for the gui and providing an interface to the data model.
+
+    # This matches the ID of a plot created using FittingLogic._create1DPlot, e.g.
+    # "5 [P(Q)] modelname"
+    # or
+    # "4 modelname".
+    # Useful for determining whether the plot in question is for an intermediate result, such as P(Q) or S(Q) in the
+    # case of a product model; the identifier for this is held in square brackets, as in the example above.
+    theory_plot_ID_pattern = re.compile(r"^([0-9]+)\s+(\[(.*)\]\s+)?(.*)$")
 
     def __init__(self, parent=None, guimanager=None, manager=None):
@@ -385,47 +394,4 @@
         # Notify the GuiManager about the send request
         self._perspective().setData(data_item=selected_items, is_batch=self.chkBatch.isChecked())
-
-    def freezeCheckedData(self):
-        """
-        Convert checked results (fitted model, residuals) into separate dataset.
-        """
-        outer_index = -1
-        theories_copied = 0
-        orig_model_size = self.model.rowCount()
-        while outer_index < orig_model_size:
-            outer_index += 1
-            outer_item = self.model.item(outer_index)
-            if not outer_item:
-                continue
-            if not outer_item.isCheckable():
-                continue
-            # Look for checked inner items
-            inner_index = -1
-            while inner_index < outer_item.rowCount():
-               inner_item = outer_item.child(inner_index)
-               inner_index += 1
-               if not inner_item:
-                   continue
-               if not inner_item.isCheckable():
-                   continue
-               if inner_item.checkState() != QtCore.Qt.Checked:
-                   continue
-               self.model.beginResetModel()
-               theories_copied += 1
-               new_item = self.cloneTheory(inner_item)
-               self.model.appendRow(new_item)
-               self.model.endResetModel()
-
-        freeze_msg = ""
-        if theories_copied == 0:
-            return
-        elif theories_copied == 1:
-            freeze_msg = "1 theory copied to a separate data set"
-        elif theories_copied > 1:
-            freeze_msg = "%i theories copied to separate data sets" % theories_copied
-        else:
-            freeze_msg = "Unexpected number of theories copied: %i" % theories_copied
-            raise AttributeError(freeze_msg)
-        self.communicator.statusBarUpdateSignal.emit(freeze_msg)
 
     def freezeTheory(self, event):
@@ -572,5 +538,5 @@
             else:
                 # Don't plot intermediate results, e.g. P(Q), S(Q)
-                match = GuiUtils.theory_plot_ID_pattern.match(plot_id)
+                match = self.theory_plot_ID_pattern.match(plot_id)
                 # 2nd match group contains the identifier for the intermediate result, if present (e.g. "[P(Q)]")
                 if match and match.groups()[1] != None:
@@ -578,6 +544,5 @@
                 # 'sophisticated' test to generate standalone plot for residuals
                 if 'esiduals' in plot.title:
-                    plot.yscale='linear'
-                    self.plotData([(item, plot)])
+                    self.plotData([(item, plot)], transform=False)
                 else:
                     new_plots.append((item, plot))
@@ -860,27 +825,4 @@
         return wlist
 
-    def setItemsCheckability(self, model, dimension=None, checked=False):
-        """
-        For a given model, check or uncheck all items of given dimension
-        """
-        mode = QtCore.Qt.Checked if checked else QtCore.Qt.Unchecked
-
-        assert isinstance(checked, bool)
-
-        types = (None, Data1D, Data2D)
-        assert dimension in types
-
-        for index in range(model.rowCount()):
-            item = model.item(index)
-            if dimension is not None and not isinstance(GuiUtils.dataFromItem(item), dimension):
-                continue
-            if item.isCheckable() and item.checkState() != mode:
-                item.setCheckState(mode)
-            # look for all children
-            for inner_index in range(item.rowCount()):
-                child = item.child(inner_index)
-                if child.isCheckable() and child.checkState() != mode:
-                    child.setCheckState(mode)
-
     def selectData(self, index):
         """
@@ -893,25 +835,72 @@
         # Respond appropriately
         if index == 0:
-            self.setItemsCheckability(self.model, checked=True)
-
+            # Select All
+            for index in range(self.model.rowCount()):
+                item = self.model.item(index)
+                if item.isCheckable() and item.checkState() == QtCore.Qt.Unchecked:
+                    item.setCheckState(QtCore.Qt.Checked)
         elif index == 1:
             # De-select All
-            self.setItemsCheckability(self.model, checked=False)
+            for index in range(self.model.rowCount()):
+                item = self.model.item(index)
+                if item.isCheckable() and item.checkState() == QtCore.Qt.Checked:
+                    item.setCheckState(QtCore.Qt.Unchecked)
 
         elif index == 2:
             # Select All 1-D
-            self.setItemsCheckability(self.model, dimension=Data1D, checked=True)
+            for index in range(self.model.rowCount()):
+                item = self.model.item(index)
+                item.setCheckState(QtCore.Qt.Unchecked)
+
+                try:
+                    is1D = isinstance(GuiUtils.dataFromItem(item), Data1D)
+                except AttributeError:
+                    msg = "Bad structure of the data model."
+                    raise RuntimeError(msg)
+
+                if is1D:
+                    item.setCheckState(QtCore.Qt.Checked)
 
         elif index == 3:
             # Unselect All 1-D
-            self.setItemsCheckability(self.model, dimension=Data1D, checked=False)
+            for index in range(self.model.rowCount()):
+                item = self.model.item(index)
+
+                try:
+                    is1D = isinstance(GuiUtils.dataFromItem(item), Data1D)
+                except AttributeError:
+                    msg = "Bad structure of the data model."
+                    raise RuntimeError(msg)
+
+                if item.isCheckable() and item.checkState() == QtCore.Qt.Checked and is1D:
+                    item.setCheckState(QtCore.Qt.Unchecked)
 
         elif index == 4:
             # Select All 2-D
-            self.setItemsCheckability(self.model, dimension=Data2D, checked=True)
+            for index in range(self.model.rowCount()):
+                item = self.model.item(index)
+                item.setCheckState(QtCore.Qt.Unchecked)
+                try:
+                    is2D = isinstance(GuiUtils.dataFromItem(item), Data2D)
+                except AttributeError:
+                    msg = "Bad structure of the data model."
+                    raise RuntimeError(msg)
+
+                if is2D:
+                    item.setCheckState(QtCore.Qt.Checked)
 
         elif index == 5:
             # Unselect All 2-D
-            self.setItemsCheckability(self.model, dimension=Data2D, checked=False)
+            for index in range(self.model.rowCount()):
+                item = self.model.item(index)
+
+                try:
+                    is2D = isinstance(GuiUtils.dataFromItem(item), Data2D)
+                except AttributeError:
+                    msg = "Bad structure of the data model."
+                    raise RuntimeError(msg)
+
+                if item.isCheckable() and item.checkState() == QtCore.Qt.Checked and is2D:
+                    item.setCheckState(QtCore.Qt.Unchecked)
 
         else:
@@ -1281,22 +1270,2 @@
         self.theory_model.appendRow(model_item)
 
-    def deleteIntermediateTheoryPlotsByModelID(self, model_id):
-        """Given a model's ID, deletes all items in the theory item model which reference the same ID. Useful in the
-        case of intermediate results disappearing when changing calculations (in which case you don't want them to be
-        retained in the list)."""
-        items_to_delete = []
-        for r in range(self.theory_model.rowCount()):
-            item = self.theory_model.item(r, 0)
-            data = item.child(0).data()
-            if not hasattr(data, "id"):
-                return
-            match = GuiUtils.theory_plot_ID_pattern.match(data.id)
-            if match:
-                item_model_id = match.groups()[-1]
-                if item_model_id == model_id:
-                    # Only delete those identified as an intermediate plot
-                    if match.groups()[2] not in (None, ""):
-                        items_to_delete.append(item)
-
-        for item in items_to_delete:
-            self.theory_model.removeRow(item.row())
Index: src/sas/qtgui/MainWindow/GuiManager.py
===================================================================
--- src/sas/qtgui/MainWindow/GuiManager.py	(revision 0eff6153f4208fa47673e1006f3be34f6a55724a)
+++ src/sas/qtgui/MainWindow/GuiManager.py	(revision 0eff6153f4208fa47673e1006f3be34f6a55724a)
@@ -395,5 +395,4 @@
         self.communicate.perspectiveChangedSignal.connect(self.perspectiveChanged)
         self.communicate.updateTheoryFromPerspectiveSignal.connect(self.updateTheoryFromPerspective)
-        self.communicate.deleteIntermediateTheoryPlotsSignal.connect(self.deleteIntermediateTheoryPlotsByModelID)
         self.communicate.plotRequestedSignal.connect(self.showPlot)
         self.communicate.plotFromFilenameSignal.connect(self.showPlotFromFilename)
@@ -439,5 +438,4 @@
         self._workspace.actionImage_Viewer.triggered.connect(self.actionImage_Viewer)
         self._workspace.actionOrientation_Viewer.triggered.connect(self.actionOrientation_Viewer)
-        self._workspace.actionFreeze_Theory.triggered.connect(self.actionFreeze_Theory)
         # Fitting
         self._workspace.actionNew_Fit_Page.triggered.connect(self.actionNew_Fit_Page)
@@ -686,10 +684,4 @@
         self._workspace.addDockWidget(Qt.RightDockWidgetArea, self.ipDockWidget)
 
-    def actionFreeze_Theory(self):
-        """
-        Convert a child index with data into a separate top level dataset
-        """
-        self.filesWidget.freezeCheckedData()
-
     def actionOrientation_Viewer(self):
         """
@@ -887,11 +879,4 @@
         """
         self.filesWidget.updateTheoryFromPerspective(index)
-
-    def deleteIntermediateTheoryPlotsByModelID(self, model_id):
-        """
-        Catch the signal to delete items in the Theory item model which correspond to a model ID.
-        Send the request to the DataExplorer for updating the theory model.
-        """
-        self.filesWidget.deleteIntermediateTheoryPlotsByModelID(model_id)
 
     def updateModelFromDataOperationPanel(self, new_item, new_datalist_item):
Index: src/sas/qtgui/MainWindow/UI/DataExplorerUI.ui
===================================================================
--- src/sas/qtgui/MainWindow/UI/DataExplorerUI.ui	(revision f4a6f2c6bed139ce9fb4392087c90deeb747659c)
+++ src/sas/qtgui/MainWindow/UI/DataExplorerUI.ui	(revision d1fa2b8c9923877104df9e2260cf10b981a461d4)
@@ -44,5 +44,5 @@
            <property name="sizePolicy">
             <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
-             <horstretch>0</horstretch>
+             <horstretch>5</horstretch>
              <verstretch>5</verstretch>
             </sizepolicy>
@@ -50,6 +50,6 @@
            <property name="minimumSize">
             <size>
-             <width>120</width>
-             <height>40</height>
+             <width>154</width>
+             <height>50</height>
             </size>
            </property>
@@ -64,5 +64,5 @@
            </property>
            <property name="styleSheet">
-            <string notr="true">font: 11pt &quot;MS Shell Dlg 2&quot;;</string>
+            <string notr="true">font: 13pt &quot;MS Shell Dlg 2&quot;;</string>
            </property>
            <property name="text">
@@ -75,6 +75,6 @@
            <property name="iconSize">
             <size>
-             <width>32</width>
-             <height>32</height>
+             <width>48</width>
+             <height>48</height>
             </size>
            </property>
@@ -183,5 +183,5 @@
            <property name="sizePolicy">
             <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
-             <horstretch>0</horstretch>
+             <horstretch>5</horstretch>
              <verstretch>5</verstretch>
             </sizepolicy>
@@ -189,6 +189,6 @@
            <property name="minimumSize">
             <size>
-             <width>145</width>
-             <height>40</height>
+             <width>170</width>
+             <height>50</height>
             </size>
            </property>
@@ -201,9 +201,5 @@
            <property name="font">
             <font>
-             <family>MS Shell Dlg 2</family>
-             <pointsize>11</pointsize>
-             <weight>50</weight>
-             <italic>false</italic>
-             <bold>false</bold>
+             <pointsize>13</pointsize>
             </font>
            </property>
@@ -212,5 +208,5 @@
            </property>
            <property name="styleSheet">
-            <string notr="true">font: 11pt &quot;MS Shell Dlg 2&quot;;</string>
+            <string notr="true">font: 13pt &quot;MS Shell Dlg 2&quot;;</string>
            </property>
            <property name="text">
@@ -223,6 +219,6 @@
            <property name="iconSize">
             <size>
-             <width>32</width>
-             <height>32</height>
+             <width>48</width>
+             <height>48</height>
             </size>
            </property>
@@ -239,5 +235,5 @@
            <property name="font">
             <font>
-             <pointsize>11</pointsize>
+             <pointsize>12</pointsize>
             </font>
            </property>
Index: src/sas/qtgui/MainWindow/UI/MainWindowUI.ui
===================================================================
--- src/sas/qtgui/MainWindow/UI/MainWindowUI.ui	(revision 6b5029659d0f8848859513403a8ef38c0481f7db)
+++ src/sas/qtgui/MainWindow/UI/MainWindowUI.ui	(revision aa1db44bef6b137ed4ef0e1b1e13a6c94ba6a928)
@@ -64,6 +64,4 @@
     <addaction name="actionReport"/>
     <addaction name="actionReset"/>
-    <addaction name="separator"/>
-    <addaction name="actionFreeze_Theory"/>
    </widget>
    <widget class="QMenu" name="menuView">
@@ -537,9 +535,4 @@
    </property>
   </action>
-  <action name="actionFreeze_Theory">
-   <property name="text">
-    <string>Freeze Theory</string>
-   </property>
-  </action>
  </widget>
  <resources/>
Index: src/sas/qtgui/MainWindow/UnitTesting/DataExplorerTest.py
===================================================================
--- src/sas/qtgui/MainWindow/UnitTesting/DataExplorerTest.py	(revision a24eacf3b3a9ca51fe5e34059e28454573779b5f)
+++ src/sas/qtgui/MainWindow/UnitTesting/DataExplorerTest.py	(revision 573c38349522bd3c640c76f26fd0bbed6d9c9139)
@@ -71,5 +71,5 @@
         self.assertEqual(self.form.cmdFreeze.text(), "Freeze Theory")
         self.assertEqual(self.form.cmdSendTo.text(), "Send data to")
-        self.assertEqual(self.form.cmdSendTo.iconSize(), QSize(32, 32))
+        self.assertEqual(self.form.cmdSendTo.iconSize(), QSize(48, 48))
         self.assertIsInstance(self.form.cmdSendTo.icon(), QIcon)
         self.assertEqual(self.form.chkBatch.text(), "Batch mode")
@@ -352,5 +352,5 @@
         # Test the current selection
         self.assertTrue(item1D.checkState() == Qt.Checked)
-        self.assertTrue(item2D.checkState() == Qt.Checked)
+        self.assertTrue(item2D.checkState() == Qt.Unchecked)        
 
         # unselect 1d data
@@ -359,5 +359,5 @@
         # Test the current selection
         self.assertTrue(item1D.checkState() == Qt.Unchecked)
-        self.assertTrue(item2D.checkState() == Qt.Checked)
+        self.assertTrue(item2D.checkState() == Qt.Unchecked)        
 
         # select 2d data
Index: src/sas/qtgui/Perspectives/Fitting/FittingUtilities.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingUtilities.py	(revision b764ae5882f084a8b74c7cf664276c13fb07c29e)
+++ src/sas/qtgui/Perspectives/Fitting/FittingUtilities.py	(revision ff3b293197970c44a7188c9d3c2fd7fa7a83536e)
@@ -430,6 +430,6 @@
 
     theory_name = str(current_data.name.split()[0])
-    res_name = reference_data.filename if reference_data.filename else reference_data.name
-    residuals.name = "Residuals for " + str(theory_name) + "[" + res_name + "]"
+    residuals.name = "Residuals for " + str(theory_name) + "[" + \
+                    str(reference_data.filename) + "]"
     residuals.title = residuals.name
     residuals.ytransform = 'y'
@@ -457,14 +457,8 @@
     """
     weight = None
-    if data is None:
-        return []
     if is2d:
-        if not hasattr(data, 'err_data'):
-            return []
         dy_data = data.err_data
         data = data.data
     else:
-        if not hasattr(data, 'dy'):
-            return []
         dy_data = data.dy
         data = data.y
Index: src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision 0eff6153f4208fa47673e1006f3be34f6a55724a)
+++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision 0eff6153f4208fa47673e1006f3be34f6a55724a)
@@ -60,4 +60,5 @@
 
 logger = logging.getLogger(__name__)
+
 
 class ToolTippedItemModel(QtGui.QStandardItemModel):
@@ -224,8 +225,5 @@
         self.models = {}
         # Parameters to fit
-        self.main_params_to_fit = []
-        self.poly_params_to_fit = []
-        self.magnet_params_to_fit = []
-
+        self.parameters_to_fit = None
         # Fit options
         self.q_range_min = 0.005
@@ -265,7 +263,4 @@
         self.has_magnet_error_column = False
 
-        # If the widget generated theory item, save it
-        self.theory_item = None
-
         # signal communicator
         self.communicate = self.parent.communicate
@@ -390,8 +385,5 @@
         # Tag along functionality
         self.label.setText("Data loaded from: ")
-        if self.logic.data.filename:
-            self.lblFilename.setText(self.logic.data.filename)
-        else:
-            self.lblFilename.setText(self.logic.data.name)
+        self.lblFilename.setText(self.logic.data.filename)
         self.updateQRange()
         # Switch off Data2D control
@@ -525,4 +517,5 @@
 
         # Signals from separate tabs asking for replot
+        self.options_widget.plot_signal.connect(self.onOptionsUpdate)
         self.options_widget.plot_signal.connect(self.onOptionsUpdate)
 
@@ -955,20 +948,16 @@
         model = self.cbModel.currentText()
 
-        # Assure the control is active
-        if not self.cbModel.isEnabled():
-            return
-        # Empty combobox forced to be read
+        # empty combobox forced to be read
         if not model:
             return
+        # Reset structure factor
+        self.cbStructureFactor.setCurrentIndex(0)
 
         # Reset parameters to fit
-        self.resetParametersToFit()
+        self.parameters_to_fit = None
         self.has_error_column = False
         self.has_poly_error_column = False
 
-        structure = None
-        if self.cbStructureFactor.isEnabled():
-            structure = str(self.cbStructureFactor.currentText())
-        self.respondToModelStructure(model=model, structure_factor=structure)
+        self.respondToModelStructure(model=model, structure_factor=None)
 
     def onSelectBatchFilename(self, data_index):
@@ -990,17 +979,9 @@
 
         # Reset parameters to fit
-        self.resetParametersToFit()
+        self.parameters_to_fit = None
         self.has_error_column = False
         self.has_poly_error_column = False
 
         self.respondToModelStructure(model=model, structure_factor=structure)
-
-    def resetParametersToFit(self):
-        """
-        Clears the list of parameters to be fitted
-        """
-        self.main_params_to_fit = []
-        self.poly_params_to_fit = []
-        self.magnet_params_to_fit = []
 
     def onCustomModelChange(self):
@@ -1113,7 +1094,4 @@
             self.disableModelCombo()
             self.enableStructureCombo()
-            # set the index to 0
-            self.cbStructureFactor.setCurrentIndex(0)
-            self.model_parameters = None
             self._model_model.clear()
             return
@@ -1140,6 +1118,6 @@
         model_row = item.row()
         name_index = self._poly_model.index(model_row, 0)
-        parameter_name = str(name_index.data()) # "distribution of sld" etc.
-        if "istribution of" in parameter_name:
+        parameter_name = str(name_index.data()).lower() # "distribution of sld" etc.
+        if "distribution of" in parameter_name:
             # just the last word
             parameter_name = parameter_name.rsplit()[-1]
@@ -1153,9 +1131,9 @@
             parameter_name = parameter_name + '.width'
             if value == QtCore.Qt.Checked:
-                self.poly_params_to_fit.append(parameter_name)
+                self.parameters_to_fit.append(parameter_name)
             else:
-                if parameter_name in self.poly_params_to_fit:
-                    self.poly_params_to_fit.remove(parameter_name)
-            self.cmdFit.setEnabled(self.haveParamsToFit())
+                if parameter_name in self.parameters_to_fit:
+                    self.parameters_to_fit.remove(parameter_name)
+            self.cmdFit.setEnabled(self.parameters_to_fit != [] and self.logic.data_is_loaded)
 
         elif model_column in [delegate.poly_min, delegate.poly_max]:
@@ -1209,9 +1187,9 @@
             value = item.checkState()
             if value == QtCore.Qt.Checked:
-                self.magnet_params_to_fit.append(parameter_name)
+                self.parameters_to_fit.append(parameter_name)
             else:
-                if parameter_name in self.magnet_params_to_fit:
-                    self.magnet_params_to_fit.remove(parameter_name)
-            self.cmdFit.setEnabled(self.haveParamsToFit())
+                if parameter_name in self.parameters_to_fit:
+                    self.parameters_to_fit.remove(parameter_name)
+            self.cmdFit.setEnabled(self.parameters_to_fit != [] and self.logic.data_is_loaded)
             # Update state stack
             self.updateUndo()
@@ -1498,12 +1476,12 @@
         qmin = self.q_range_min
         qmax = self.q_range_max
-
-        params_to_fit = self.main_params_to_fit
-        if self.chkPolydispersity.isChecked():
-            params_to_fit += self.poly_params_to_fit
-        if self.chkMagnetism.isChecked():
-            params_to_fit += self.magnet_params_to_fit
+        params_to_fit = self.parameters_to_fit
         if not params_to_fit:
             raise ValueError('Fitting requires at least one parameter to optimize.')
+
+        # Potential smearing added
+        # Remember that smearing_min/max can be None ->
+        # deal with it until Python gets discriminated unions
+        self.addWeightingToData(data)
 
         # Get the constraints.
@@ -1523,13 +1501,13 @@
             data = GuiUtils.dataFromItem(fit_index)
             # Potential weights added directly to data
-            weighted_data = self.addWeightingToData(data)
+            self.addWeightingToData(data)
             try:
-                fitter_single.set_model(model, fit_id, params_to_fit, data=weighted_data,
+                fitter_single.set_model(model, fit_id, params_to_fit, data=data,
                              constraints=constraints)
             except ValueError as ex:
                 raise ValueError("Setting model parameters failed with: %s" % ex)
 
-            qmin, qmax, _ = self.logic.computeRangeFromData(weighted_data)
-            fitter_single.set_data(data=weighted_data, id=fit_id, smearer=smearer, qmin=qmin,
+            qmin, qmax, _ = self.logic.computeRangeFromData(data)
+            fitter_single.set_data(data=data, id=fit_id, smearer=smearer, qmin=qmin,
                             qmax=qmax)
             fitter_single.select_problem_for_fit(id=fit_id, value=1)
@@ -1922,13 +1900,11 @@
         Adds weighting contribution to fitting data
         """
-        new_data = copy.deepcopy(data)
         # Send original data for weighting
         weight = FittingUtilities.getWeight(data=data, is2d=self.is2D, flag=self.weighting)
         if self.is2D:
-            new_data.err_data = weight
+            data.err_data = weight
         else:
-            new_data.dy = weight
-
-        return new_data
+            data.dy = weight
+        pass
 
     def updateQRange(self):
@@ -1964,7 +1940,4 @@
             # Allow the SF combobox visibility for the given sasmodel
             self.enableStructureFactorControl(structure_factor)
-            if self.cbStructureFactor.isEnabled():
-                structure_factor = self.cbStructureFactor.currentText()
-                self.fromStructureFactorToQModel(structure_factor)
 
         # Then, add multishells
@@ -2001,5 +1974,4 @@
         """
         name = model_name
-        kernel_module = None
         if self.cbCategory.currentText() == CATEGORY_CUSTOM:
             # custom kernel load requires full path
@@ -2007,16 +1979,9 @@
         try:
             kernel_module = generate.load_kernel_module(name)
-        except ModuleNotFoundError as ex:
-            pass
-
-        if kernel_module is None:
-            # mismatch between "name" attribute and actual filename.
-            curr_model = self.models[model_name]
-            name, _ = os.path.splitext(os.path.basename(curr_model.filename))
-            try:
-                kernel_module = generate.load_kernel_module(name)
-            except ModuleNotFoundError as ex:
-                logging.error("Can't find the model "+ str(ex))
-                return
+        except ModuleNotFoundError:
+            # maybe it's a recategorised custom model?
+            name = os.path.join(ModelUtilities.find_plugins_dir(), model_name+".py")
+            # If this rises, it's a valid problem.
+            kernel_module = generate.load_kernel_module(name)
 
         if hasattr(kernel_module, 'parameters'):
@@ -2061,6 +2026,4 @@
         Setting model parameters into QStandardItemModel based on selected _structure factor_
         """
-        if structure_factor is None or structure_factor=="None":
-            return
         structure_module = generate.load_kernel_module(structure_factor)
         structure_parameters = modelinfo.make_parameter_table(getattr(structure_module, 'parameters', []))
@@ -2082,13 +2045,4 @@
         self._last_model_row = self._model_model.rowCount()
 
-    def haveParamsToFit(self):
-        """
-        Finds out if there are any parameters ready to be fitted
-        """
-        return (self.main_params_to_fit!=[]
-                or self.poly_params_to_fit!=[]
-                or self.magnet_params_to_fit != []) and \
-                self.logic.data_is_loaded
-
     def onMainParamsChange(self, item):
         """
@@ -2099,5 +2053,5 @@
         if model_column == 0:
             self.checkboxSelected(item)
-            self.cmdFit.setEnabled(self.haveParamsToFit())
+            self.cmdFit.setEnabled(self.parameters_to_fit != [] and self.logic.data_is_loaded)
             # Update state stack
             self.updateUndo()
@@ -2158,8 +2112,16 @@
         # Convert to proper indices and set requested enablement
         self.setParameterSelection(status)
+        #[self._model_model.item(row, 0).setCheckState(status) for row in self.selectedParameters()]
         self._model_model.blockSignals(False)
 
         # update the list of parameters to fit
-        self.main_params_to_fit = self.checkedListFromModel(self._model_model)
+        main_params = self.checkedListFromModel(self._model_model)
+        poly_params = self.checkedListFromModel(self._poly_model)
+        magnet_params = self.checkedListFromModel(self._magnet_model)
+
+        # Retrieve poly params names
+        poly_params = [param.rsplit()[-1] + '.width' for param in poly_params]
+
+        self.parameters_to_fit = main_params + poly_params + magnet_params
 
     def checkedListFromModel(self, model):
@@ -2213,6 +2175,6 @@
         name = self.nameFromData(fitted_data)
         # Notify the GUI manager so it can create the theory model in DataExplorer
-        self.theory_item = GuiUtils.createModelItemWithPlot(fitted_data, name=name)
-        self.communicate.updateTheoryFromPerspectiveSignal.emit(self.theory_item)
+        new_item = GuiUtils.createModelItemWithPlot(fitted_data, name=name)
+        self.communicate.updateTheoryFromPerspectiveSignal.emit(new_item)
 
     def nameFromData(self, fitted_data):
@@ -2248,6 +2210,4 @@
             completefn = self.methodCompleteForData()
         smearer = self.smearing_widget.smearer()
-        weight = FittingUtilities.getWeight(data=data, is2d=self.is2D, flag=self.weighting)
-
         # Awful API to a backend method.
         calc_thread = self.methodCalculateForData()(data=data,
@@ -2258,5 +2218,5 @@
                                                smearer=smearer,
                                                state=None,
-                                               weight=weight,
+                                               weight=None,
                                                fid=None,
                                                toggle_mode_on=False,
@@ -2306,13 +2266,6 @@
         residuals = self.calculateResiduals(fitted_data)
         self.model_data = fitted_data
-        new_plots = [fitted_data]
-        if residuals is not None:
-            new_plots.append(residuals)
-
-        if self.data_is_loaded:
-            GuiUtils.deleteRedundantPlots(self.all_data[self.data_index], new_plots)
-        else:
-            # delete theory items for the model, in order to get rid of any redundant items, e.g. beta(Q), S_eff(Q)
-            self.communicate.deleteIntermediateTheoryPlotsSignal.emit(self.kernel_module.id)
+
+        new_plots = [fitted_data, residuals]
 
         # Create plots for intermediate product data
@@ -2329,7 +2282,13 @@
             new_plots.append(sq_data)
 
-        # Update/generate plots
+        if self.data_is_loaded:
+            GuiUtils.deleteRedundantPlots(self.all_data[self.data_index], new_plots)
+
         for plot in new_plots:
-            self.communicate.plotUpdateSignal.emit([plot])
+            if hasattr(plot, "id") and "esidual" in plot.id:
+                # TODO: fix updates to residuals plot
+                pass
+            elif plot is not None:
+                self.communicate.plotUpdateSignal.emit([plot])
 
     def complete2D(self, return_data):
@@ -2349,18 +2308,20 @@
 
         # Modify fitted_data with weighting
-        weighted_data = self.addWeightingToData(fitted_data)
-
-        self.createNewIndex(weighted_data)
+        self.addWeightingToData(fitted_data)
+
+        self.createNewIndex(fitted_data)
         # Calculate difference between return_data and logic.data
-        self.chi2 = FittingUtilities.calculateChi2(weighted_data, self.logic.data)
+        self.chi2 = FittingUtilities.calculateChi2(fitted_data, self.logic.data)
         # Update the control
         chi2_repr = "---" if self.chi2 is None else GuiUtils.formatNumber(self.chi2, high=True)
         self.lblChi2Value.setText(chi2_repr)
 
+        # self.communicate.plotUpdateSignal.emit([fitted_data])
+
         # Plot residuals if actual data
         if not self.data_is_loaded:
             return
 
-        residuals_plot = FittingUtilities.plotResiduals(self.data, weighted_data)
+        residuals_plot = FittingUtilities.plotResiduals(self.data, fitted_data)
         residuals_plot.id = "Residual " + residuals_plot.id
         self.createNewIndex(residuals_plot)
@@ -2431,11 +2392,6 @@
         self._poly_model.clear()
 
-        parameters = self.model_parameters.form_volume_parameters
-        if self.is2D:
-            parameters += self.model_parameters.orientation_parameters
-
         [self.setPolyModelParameters(i, param) for i, param in \
-            enumerate(parameters) if param.polydisperse]
-
+            enumerate(self.model_parameters.form_volume_parameters) if param.polydisperse]
         FittingUtilities.addPolyHeadersToModel(self._poly_model)
 
@@ -2795,7 +2751,5 @@
 
         fp.chi2 = self.chi2
-        fp.main_params_to_fit = self.main_params_to_fit
-        fp.poly_params_to_fit = self.poly_params_to_fit
-        fp.magnet_params_to_fit = self.magnet_params_to_fit
+        fp.parameters_to_fit = self.parameters_to_fit
         fp.kernel_module = self.kernel_module
 
@@ -2857,6 +2811,4 @@
         if self.all_data:
             index = self.all_data[self.data_index]
-        else:
-            index = self.theory_item
         report_logic = ReportPageLogic(self,
                                        kernel_module=self.kernel_module,
Index: src/sas/qtgui/Perspectives/Fitting/ModelThread.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/ModelThread.py	(revision 2df558ebcc19b99ebc1900efaa872a981b31a67d)
+++ src/sas/qtgui/Perspectives/Fitting/ModelThread.py	(revision 3ae917937db3898ec8e94fe0aa83d82bec4edd19)
@@ -117,19 +117,19 @@
                     self.source)
         else:
-            self.completefn((output,
-                           self.data,
-                           self.page_id,
-                           self.model,
-                           self.state,
-                           self.toggle_mode_on,
-                           elapsed,
-                           index_model,
-                           self.fid,
-                           self.qmin,
-                           self.qmax,
-                           self.weight,
+            self.complete(image=output,
+                           data=self.data,
+                           page_id=self.page_id,
+                           model=self.model,
+                           state=self.state,
+                           toggle_mode_on=self.toggle_mode_on,
+                           elapsed=elapsed,
+                           index=index_model,
+                           fid=self.fid,
+                           qmin=self.qmin,
+                           qmax=self.qmax,
+                           weight=self.weight,
                            #qstep=self.qstep,
-                           self.update_chisqr,
-                           self.source))
+                           update_chisqr=self.update_chisqr,
+                           source=self.source)
 
 
@@ -250,16 +250,19 @@
                     pq_values, sq_values)
         else:
-            self.completefn((self.data.x[index], output[index],
-                        self.page_id,
-                        self.state,
-                        self.weight,
-                        self.fid,
-                        self.toggle_mode_on,
-                        elapsed, index, self.model,
-                        self.data,
-                        self.update_chisqr,
-                        self.source,
-                        unsmeared_output, unsmeared_data, unsmeared_error,
-                        pq_values, sq_values))
+            self.complete(x=self.data.x[index], y=output[index],
+                          page_id=self.page_id,
+                          state=self.state,
+                          weight=self.weight,
+                          fid=self.fid,
+                          toggle_mode_on=self.toggle_mode_on,
+                          elapsed=elapsed, index=index, model=self.model,
+                          data=self.data,
+                          update_chisqr=self.update_chisqr,
+                          source=self.source,
+                          unsmeared_model=unsmeared_output,
+                          unsmeared_data=unsmeared_data,
+                          unsmeared_error=unsmeared_error,
+                          pq_model=pq_values,
+                          sq_model=sq_values)
 
     def results(self):
Index: src/sas/qtgui/Perspectives/Fitting/OptionsWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/OptionsWidget.py	(revision b764ae5882f084a8b74c7cf664276c13fb07c29e)
+++ src/sas/qtgui/Perspectives/Fitting/OptionsWidget.py	(revision e20870bce5dcfe5fc479f9b0858c50abf55ae0d0)
@@ -79,17 +79,12 @@
         self.weightingGroup.buttonClicked.connect(self.onWeightingChoice)
 
-        self.qmin = QMIN_DEFAULT
-        self.qmax = QMAX_DEFAULT
-        self.npts = NPTS_DEFAULT
-        if self.logic.data_is_loaded:
-            self.qmin, self.qmax, self.npts = self.logic.computeDataRange()
         self.initModel()
         self.initMapper()
         self.model.blockSignals(True)
-        self.updateQRange(self.qmin, self.qmax, self.npts)
-        self.txtMaxRange.setText(str(self.qmax))
-        self.txtMinRange.setText(str(self.qmin))
-        self.txtNpts.setText(str(self.npts))
-        self.txtNptsFit.setText(str(self.npts))
+        self.updateQRange(QMIN_DEFAULT, QMAX_DEFAULT, NPTS_DEFAULT)
+        self.txtMaxRange.setText(str(QMAX_DEFAULT))
+        self.txtMinRange.setText(str(QMIN_DEFAULT))
+        self.txtNpts.setText(str(NPTS_DEFAULT))
+        self.txtNptsFit.setText(str(NPTS_DEFAULT))
         self.model.blockSignals(False)
 
@@ -132,6 +127,6 @@
         Callback for running the mask editor
         """
-        if isinstance(self.logic.data, Data2D):
-            self.parent.communicate.maskEditorSignal.emit(self.logic.data)
+        self.parent.communicate.maskEditorSignal.emit(self.logic.data)
+        pass
 
     def onRangeReset(self):
@@ -139,5 +134,5 @@
         Callback for resetting qmin/qmax
         """
-        self.updateQRange(self.qmin, self.qmax, self.npts)
+        self.updateQRange(QMIN_DEFAULT, QMAX_DEFAULT, NPTS_DEFAULT)
 
     def onWeightingChoice(self, button):
@@ -162,7 +157,6 @@
         Enable/disable various UI elements based on data loaded
         """
-        is2Ddata = isinstance(self.logic.data, Data2D)
         self.boxWeighting.setEnabled(True)
-        self.cmdMaskEdit.setEnabled(is2Ddata)
+        self.cmdMaskEdit.setEnabled(True)
         # Switch off txtNpts related controls
         self.txtNpts.setEnabled(False)
@@ -184,5 +178,4 @@
         self.model.item(MODEL.index('MAX_RANGE')).setText(str(q_range_max))
         self.model.item(MODEL.index('NPTS')).setText(str(npts))
-        self.qmin, self.qmax, self.npts = q_range_min, q_range_max, npts
 
     def state(self):
Index: src/sas/qtgui/Perspectives/Fitting/UI/FittingWidgetUI.ui
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/UI/FittingWidgetUI.ui	(revision d686ff11685e4293f75028cfb6bf4258869133ab)
+++ src/sas/qtgui/Perspectives/Fitting/UI/FittingWidgetUI.ui	(revision c1cfa80d11202dcbcbebc2b74a9c5a2904e3325a)
@@ -7,6 +7,6 @@
     <x>0</x>
     <y>0</y>
-    <width>566</width>
-    <height>646</height>
+    <width>680</width>
+    <height>605</height>
    </rect>
   </property>
@@ -19,6 +19,6 @@
   <property name="minimumSize">
    <size>
-    <width>445</width>
-    <height>540</height>
+    <width>434</width>
+    <height>466</height>
    </size>
   </property>
Index: src/sas/qtgui/Perspectives/Fitting/UI/OptionsWidgetUI.ui
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/UI/OptionsWidgetUI.ui	(revision 79bd26891bdd9931709cf7ba69842f6d8cadc62f)
+++ src/sas/qtgui/Perspectives/Fitting/UI/OptionsWidgetUI.ui	(revision c1e380e47ece53d12ace33cda4662184d4376c2d)
@@ -8,5 +8,5 @@
     <y>0</y>
     <width>522</width>
-    <height>455</height>
+    <height>667</height>
    </rect>
   </property>
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 3f5b9013ca7090ff10c215fd31728adf9a153748)
@@ -18,8 +18,6 @@
 from sas.qtgui.Perspectives.Fitting.FittingWidget import *
 from sas.qtgui.Perspectives.Fitting.Constraint import Constraint
-import sas.qtgui.Utilities.LocalConfig
+
 from sas.qtgui.UnitTesting.TestUtils import QtSignalSpy
-from sas.qtgui.Perspectives.Fitting.ModelThread import Calc1D
-from sas.qtgui.Perspectives.Fitting.ModelThread import Calc2D
 
 from sas.qtgui.Plotting.PlotterData import Data1D
@@ -262,6 +260,6 @@
         self.widget.cbModel.setCurrentIndex(0)
 
-        # Observe factor doesn't reset to None
-        self.assertEqual(self.widget.cbStructureFactor.currentText(), 'squarewell')
+        # Observe factor reset to None
+        self.assertEqual(self.widget.cbStructureFactor.currentText(), STRUCTURE_DEFAULT)
 
         # Switch category to structure factor
@@ -321,25 +319,14 @@
         Check that the fitting 1D data object is ready
         """
-
-        if LocalConfig.USING_TWISTED:
-            # Mock the thread creation
-            threads.deferToThread = MagicMock()
-            # Model for theory
-            self.widget.SASModelToQModel("cylinder")
-            # Call the tested method
-            self.widget.calculateQGridForModel()
-            time.sleep(1)
-            # Test the mock
-            self.assertTrue(threads.deferToThread.called)
-            self.assertEqual(threads.deferToThread.call_args_list[0][0][0].__name__, "compute")
-        else:
-            Calc2D.queue = MagicMock()
-            # Model for theory
-            self.widget.SASModelToQModel("cylinder")
-            # Call the tested method
-            self.widget.calculateQGridForModel()
-            time.sleep(1)
-            # Test the mock
-            self.assertTrue(Calc2D.queue.called)
+        # Mock the thread creation
+        threads.deferToThread = MagicMock()
+        # Model for theory
+        self.widget.SASModelToQModel("cylinder")
+        # Call the tested method
+        self.widget.calculateQGridForModel()
+        time.sleep(1)
+        # Test the mock
+        self.assertTrue(threads.deferToThread.called)
+        self.assertEqual(threads.deferToThread.call_args_list[0][0][0].__name__, "compute")
 
     def testCalculateResiduals(self):
@@ -430,13 +417,17 @@
         index = self.widget._poly_model.index(0,0)
 
+        #self.widget.show()
+        #QtWidgets.QApplication(sys.argv).exec_()
+
+
         # Set the checbox
         self.widget._poly_model.item(0,0).setCheckState(2)
         # Assure the parameter is added
-        self.assertEqual(self.widget.poly_params_to_fit, ['radius_bell.width'])
+        self.assertEqual(self.widget.parameters_to_fit, ['radius_bell.width'])
 
         # Add another parameter
         self.widget._poly_model.item(2,0).setCheckState(2)
         # Assure the parameters are added
-        self.assertEqual(self.widget.poly_params_to_fit, ['radius_bell.width', 'length.width'])
+        self.assertEqual(self.widget.parameters_to_fit, ['radius_bell.width', 'length.width'])
 
         # Change the min/max values
@@ -647,10 +638,12 @@
         self.assertEqual(self.widget.cmdPlot.text(), 'Show Plot')
 
+        self.widget.show()
+
         # Set data
         test_data = Data1D(x=[1,2], y=[1,2])
-        item = QtGui.QStandardItem()
-        updateModelItem(item, test_data, "test")
+
         # Force same data into logic
-        self.widget.data = item
+        self.widget.logic.data = test_data
+        self.widget.data_is_loaded = True
 
         # Change the category index so we have a model available
@@ -690,5 +683,5 @@
 
         # Test no fitting params
-        self.widget.main_params_to_fit = []
+        self.widget.parameters_to_fit = []
 
         logging.error = MagicMock()
@@ -698,5 +691,4 @@
         self.widget.close()
 
-    def testOnEmptyFit2(self):
         test_data = Data2D(image=[1.0, 2.0, 3.0],
                            err_image=[0.01, 0.02, 0.03],
@@ -709,5 +701,4 @@
         item = QtGui.QStandardItem()
         updateModelItem(item, test_data, "test")
-
         # Force same data into logic
         self.widget.data = item
@@ -718,5 +709,5 @@
 
         # Test no fitting params
-        self.widget.main_params_to_fit = []
+        self.widget.parameters_to_fit = []
 
         logging.error = MagicMock()
@@ -727,5 +718,6 @@
         self.widget.close()
 
-    def notestOnFit1D(self):
+
+    def testOnFit1D(self):
         """
         Test the threaded fitting call
@@ -743,5 +735,5 @@
 
         # Assing fitting params
-        self.widget.main_params_to_fit = ['scale']
+        self.widget.parameters_to_fit = ['scale']
 
         # Spying on status update signal
@@ -756,7 +748,6 @@
 
             # the fit button changed caption and got disabled
-            # could fail if machine fast enough to finish
-            #self.assertEqual(self.widget.cmdFit.text(), 'Stop fit')
-            #self.assertFalse(self.widget.cmdFit.isEnabled())
+            self.assertEqual(self.widget.cmdFit.text(), 'Stop fit')
+            self.assertFalse(self.widget.cmdFit.isEnabled())
 
             # Signal pushed up
@@ -765,5 +756,5 @@
         self.widget.close()
 
-    def notestOnFit2D(self):
+    def testOnFit2D(self):
         """
         Test the threaded fitting call
@@ -788,5 +779,5 @@
 
         # Assing fitting params
-        self.widget.main_params_to_fit = ['scale']
+        self.widget.parameters_to_fit = ['scale']
 
         # Spying on status update signal
@@ -801,6 +792,6 @@
 
             # the fit button changed caption and got disabled
-            #self.assertEqual(self.widget.cmdFit.text(), 'Stop fit')
-            #self.assertFalse(self.widget.cmdFit.isEnabled())
+            self.assertEqual(self.widget.cmdFit.text(), 'Stop fit')
+            self.assertFalse(self.widget.cmdFit.isEnabled())
 
             # Signal pushed up
@@ -860,14 +851,11 @@
         # Set data
         test_data = Data1D(x=[1,2], y=[1,2])
-        item = QtGui.QStandardItem()
-        updateModelItem(item, test_data, "test")
+
         # Force same data into logic
-        self.widget.data = item
-
-        # Force same data into logic
+        self.widget.logic.data = test_data
+        self.widget.data_is_loaded = True
         category_index = self.widget.cbCategory.findText('Sphere')
-
-        self.widget.cbCategory.setCurrentIndex(category_index)
-        self.widget.main_params_to_fit = ['scale']
+        self.widget.cbCategory.setCurrentIndex(category_index)
+        self.widget.parameters_to_fit = ['scale']
         # Invoke the tested method
         fp = self.widget.currentState()
@@ -917,5 +905,5 @@
 
         # Test no fitting params
-        self.widget.main_params_to_fit = ['scale']
+        self.widget.parameters_to_fit = ['scale']
 
         # Invoke the tested method
@@ -949,11 +937,11 @@
         # Set data
         test_data = Data1D(x=[1,2], y=[1,2])
-        item = QtGui.QStandardItem()
-        updateModelItem(item, test_data, "test")
+
         # Force same data into logic
-        self.widget.data = item
+        self.widget.logic.data = test_data
+        self.widget.data_is_loaded = True
         category_index = self.widget.cbCategory.findText("Sphere")
         self.widget.cbCategory.setCurrentIndex(category_index)
-        self.widget.main_params_to_fit = ['scale']
+        self.widget.parameters_to_fit = ['scale']
 
         # Invoke the tested method
@@ -966,5 +954,5 @@
         self.assertEqual(fp.current_category, "Sphere")
         self.assertEqual(fp.current_model, "adsorbed_layer")
-        self.assertListEqual(fp.main_params_to_fit, ['scale'])
+        self.assertListEqual(fp.parameters_to_fit, ['scale'])
 
     def testPushFitPage(self):
@@ -974,8 +962,8 @@
         # Set data
         test_data = Data1D(x=[1,2], y=[1,2])
-        item = QtGui.QStandardItem()
-        updateModelItem(item, test_data, "test")
+
         # Force same data into logic
-        self.widget.data = item
+        self.widget.logic.data = test_data
+        self.widget.data_is_loaded = True
         category_index = self.widget.cbCategory.findText("Sphere")
 
@@ -986,5 +974,5 @@
         self.widget.undo_supported = True
         self.widget.cbCategory.setCurrentIndex(category_index)
-        self.widget.main_params_to_fit = ['scale']
+        self.widget.parameters_to_fit = ['scale']
 
         # Check that the stack is updated
Index: src/sas/qtgui/Plotting/PlotProperties.py
===================================================================
--- src/sas/qtgui/Plotting/PlotProperties.py	(revision facf4cace332ddd3c8e57bfc24256769753e21a5)
+++ src/sas/qtgui/Plotting/PlotProperties.py	(revision 53c771ed573b1c8716ecc969b54a1d617a4cb931)
@@ -24,5 +24,5 @@
         self._color = color if color else 0
         self._legend = legend
-        self._markersize = marker_size if marker_size else 3
+        self._markersize = marker_size if marker_size else 5
         self.custom_color = False if isinstance(self._color, int) else True
 
Index: src/sas/qtgui/Plotting/Plottables.py
===================================================================
--- src/sas/qtgui/Plotting/Plottables.py	(revision facf4cace332ddd3c8e57bfc24256769753e21a5)
+++ src/sas/qtgui/Plotting/Plottables.py	(revision cee5c78929349ae10afc88cb8b95e0c907f1826a)
@@ -438,5 +438,5 @@
     interactive = True
     custom_color = None
-    markersize = 3  # default marker size is 'size 3'
+    markersize = 5  # default marker size is 'size 5'
 
     def __init__(self):
@@ -1046,5 +1046,5 @@
         self.symbol = 0
         self.custom_color = None
-        self.markersize = 3
+        self.markersize = 5
         self.id = None
         self.zorder = 1
Index: src/sas/qtgui/Plotting/Plotter.py
===================================================================
--- src/sas/qtgui/Plotting/Plotter.py	(revision b764ae5882f084a8b74c7cf664276c13fb07c29e)
+++ src/sas/qtgui/Plotting/Plotter.py	(revision 0231f93301d69abe67a6d37cf55d97a44f2ce16a)
@@ -6,5 +6,4 @@
 import copy
 import matplotlib as mpl
-import numpy as np
 from matplotlib.font_manager import FontProperties
 from sas.qtgui.Plotting.PlotterData import Data1D
@@ -131,12 +130,4 @@
         markersize = self._data.markersize
 
-        # Include scaling (log vs. linear)
-        ax.set_xscale(self.xscale, nonposx='clip')
-        ax.set_yscale(self.yscale, nonposy='clip')
-
-        # define the ranges
-        self.setRange = SetGraphRange(parent=self,
-            x_range=self.ax.get_xlim(), y_range=self.ax.get_ylim())
-
         # Draw non-standard markers
         l_width = markersize * 0.4
@@ -160,12 +151,6 @@
                         linestyle='', label=self._title, picker=True)
             else:
-                dy = self._data.view.dy
-                # Convert tuple (lo,hi) to array [(x-lo),(hi-x)]
-                if dy is not None and type(dy) == type(()):
-                    dy = np.vstack((y - dy[0], dy[1] - y)).transpose()
-
                 line = ax.errorbar(x, y,
-                            yerr=dy,
-                            xerr=None,
+                            yerr=self._data.view.dy, xerr=None,
                             capsize=2, linestyle='',
                             barsabove=False,
@@ -176,6 +161,9 @@
                             xlolims=False, xuplims=False,
                             label=self._title,
-                            zorder=1,
                             picker=True)
+
+        # Now we know what the potential new color is, let's save it
+        if isinstance(line, mpl.lines.Line2D):
+            self.data.custom_color = line.get_color()
 
         # Update the list of data sets (plots) in chart
@@ -195,10 +183,14 @@
             ax.set_xlabel(self.x_label)
 
+        # Include scaling (log vs. linear)
+        ax.set_xscale(self.xscale)
+        ax.set_yscale(self.yscale)
+
+        # define the ranges
+        self.setRange = SetGraphRange(parent=self,
+            x_range=self.ax.get_xlim(), y_range=self.ax.get_ylim())
+
         # refresh canvas
         self.canvas.draw_idle()
-        # This is an important processEvent.
-        # This allows charts to be properly updated in order
-        # of plots being applied.
-        QtWidgets.QApplication.processEvents()
 
     def createContextMenu(self):
Index: src/sas/qtgui/Utilities/AddMultEditor.py
===================================================================
--- src/sas/qtgui/Utilities/AddMultEditor.py	(revision 287d356e6f93d4bcb4b2b387b00b09e089df9885)
+++ src/sas/qtgui/Utilities/AddMultEditor.py	(revision aed053275d5f293f1f6495be4c78e4b18fc52b41)
@@ -15,6 +15,4 @@
 import re
 import logging
-import traceback
-
 import sas.qtgui.Utilities.GuiUtils as GuiUtils
 from sasmodels.sasview_model import load_standard_models
@@ -204,19 +202,5 @@
                                      self.cbOperator.currentText())
 
-        try:
-            success = GuiUtils.checkModel(self.plugin_filename)
-        except Exception as ex:
-            # broad exception from sasmodels
-            msg = "Error building model: "+ str(ex)
-            logging.error(msg)
-            #print three last lines of the stack trace
-            # this will point out the exact line failing
-            last_lines = traceback.format_exc().split('\n')[-4:]
-            traceback_to_show = '\n'.join(last_lines)
-            logging.error(traceback_to_show)
-
-            # Set the status bar message
-            self.parent.communicate.statusBarUpdateSignal.emit("Model check failed")
-            return
+        success = GuiUtils.checkModel(self.plugin_filename)
 
         if not success:
Index: src/sas/qtgui/Utilities/GuiUtils.py
===================================================================
--- src/sas/qtgui/Utilities/GuiUtils.py	(revision 0eff6153f4208fa47673e1006f3be34f6a55724a)
+++ src/sas/qtgui/Utilities/GuiUtils.py	(revision 0eff6153f4208fa47673e1006f3be34f6a55724a)
@@ -35,12 +35,4 @@
         HELP_DIRECTORY_LOCATION = "docs/sphinx-docs/build/html"
 IMAGES_DIRECTORY_LOCATION = HELP_DIRECTORY_LOCATION + "/_images"
-
-# This matches the ID of a plot created using FittingLogic._create1DPlot, e.g.
-# "5 [P(Q)] modelname"
-# or
-# "4 modelname".
-# Useful for determining whether the plot in question is for an intermediate result, such as P(Q) or S(Q) in the
-# case of a product model; the identifier for this is held in square brackets, as in the example above.
-theory_plot_ID_pattern = re.compile(r"^([0-9]+)\s+(\[(.*)\]\s+)?(.*)$")
 
 def get_app_dir():
@@ -219,7 +211,4 @@
     # New theory data in current perspective
     updateTheoryFromPerspectiveSignal = QtCore.pyqtSignal(QtGui.QStandardItem)
-
-    # Request to delete plots (in the theory view) related to a given model ID
-    deleteIntermediateTheoryPlotsSignal = QtCore.pyqtSignal(str)
 
     # New plot requested from the GUI manager
Index: src/sas/qtgui/Utilities/LocalConfig.py
===================================================================
--- src/sas/qtgui/Utilities/LocalConfig.py	(revision b764ae5882f084a8b74c7cf664276c13fb07c29e)
+++ src/sas/qtgui/Utilities/LocalConfig.py	(revision e4335ae394f216c131b40e0ebbd740e37d9c6aa7)
@@ -134,5 +134,5 @@
 
 # Default threading model
-USING_TWISTED = False
+USING_TWISTED = True
 
 # Time out for updating sasview
Index: src/sas/qtgui/Utilities/ReportDialog.py
===================================================================
--- src/sas/qtgui/Utilities/ReportDialog.py	(revision cb90b65b5c3464b4b73f28e8c3863bbbfdd3f599)
+++ src/sas/qtgui/Utilities/ReportDialog.py	(revision ce3094991e7a414ed7da26362b7675885b4e6832)
@@ -73,10 +73,8 @@
         # Use a sensible filename default
         default_name = os.path.join(location, 'fit_report.pdf')
-
         kwargs = {
             'parent'   : self,
             'caption'  : 'Save Report',
-            # don't use 'directory' in order to remember the previous user choice
-            #'directory': default_name,
+            'directory': default_name,
             'filter'   : 'PDF file (*.pdf);;HTML file (*.html);;Text file (*.txt)',
             'options'  : QtWidgets.QFileDialog.DontUseNativeDialog}
@@ -101,7 +99,5 @@
 
         # Create files with charts
-        pictures = []
-        if self.data_images is not None:
-            pictures = self.getPictures(basename)
+        pictures = self.getPictures(basename)
 
         # self.data_html contains all images at the end of the report, in base64 form;
Index: src/sas/qtgui/Utilities/UnitTesting/ReportDialogTest.py
===================================================================
--- src/sas/qtgui/Utilities/UnitTesting/ReportDialogTest.py	(revision cb90b65b5c3464b4b73f28e8c3863bbbfdd3f599)
+++ src/sas/qtgui/Utilities/UnitTesting/ReportDialogTest.py	(revision 144fe21c4befe53963fef06a9091c7d69d0b3b41)
@@ -158,4 +158,4 @@
 
         self.assertTrue(logging.error.called)
-        #logging.error.assert_called_with("Error creating pdf")
+        logging.error.assert_called_with("Error creating pdf: Failed")
 
