Index: build_tools/jenkins_ubuntu_build.sh
===================================================================
--- build_tools/jenkins_ubuntu_build.sh	(revision bc8750ebdd9d974bbc325851e15916272a68e893)
+++ build_tools/jenkins_ubuntu_build.sh	(revision ccf44deabb228d512ba59886bf80ce5de365e1a5)
@@ -17,7 +17,6 @@
 cd sasview
 cd build_tools
-conda env create --force -f conda_qt5_ubuntu.yml
+conda env create --force -f conda_qt5_min_ubuntu.yml
 conda env list
-
 
 # Activate new env
@@ -54,5 +53,5 @@
 cd sasview
 cd installers
-pyinstaller sasview_qt5_centos.spec
+pyinstaller sasview_qt5_min_centos.spec
 
 cd $WORKSPACE 
Index: src/sas/qtgui/MainWindow/DataExplorer.py
===================================================================
--- src/sas/qtgui/MainWindow/DataExplorer.py	(revision b4d05bdc03c6c40fee47932a9a2d20921b1bbe4e)
+++ src/sas/qtgui/MainWindow/DataExplorer.py	(revision b4d05bdc03c6c40fee47932a9a2d20921b1bbe4e)
@@ -80,4 +80,5 @@
         self.cmdNew_2.clicked.connect(self.newPlot)
         self.cmdAppend.clicked.connect(self.appendPlot)
+        self.cmdAppend_2.clicked.connect(self.appendPlot)
         self.cmdHelp.clicked.connect(self.displayHelp)
         self.cmdHelp_2.clicked.connect(self.displayHelp)
@@ -414,12 +415,7 @@
                 self.model.beginResetModel()
                 theories_copied += 1
-                new_item = self.recursivelyCloneItem(outer_item)
-                # Append a "unique" descriptor to the name
-                time_bit = str(time.time())[7:-1].replace('.', '')
-                new_name = new_item.text() + '_@' + time_bit
-                new_item.setText(new_name)
+                new_item = self.cloneTheory(outer_item)
                 self.model.appendRow(new_item)
                 self.model.endResetModel()
-            #self.model.reset()
 
         freeze_msg = ""
@@ -436,4 +432,29 @@
         # Actively switch tabs
         self.setCurrentIndex(1)
+
+    def cloneTheory(self, item_from):
+        """
+        Manually clone theory items into a new HashableItem
+        """
+        new_item = GuiUtils.HashableStandardItem()
+        new_item.setCheckable(True)
+        new_item.setCheckState(QtCore.Qt.Checked)
+        info_item = QtGui.QStandardItem("Info")
+        data_item = QtGui.QStandardItem()
+        data_item.setData(item_from.child(0).data())
+        new_item.setText(item_from.text())
+        new_item.setChild(0, data_item)
+        new_item.setChild(1, info_item)
+        # Append a "unique" descriptor to the name
+        time_bit = str(time.time())[7:-1].replace('.', '')
+        new_name = new_item.text() + '_@' + time_bit
+        new_item.setText(new_name)
+        # Change the underlying data so it is no longer a theory
+        try:
+            new_item.child(0).data().is_data = True
+        except AttributeError:
+            #no data here, pass
+            pass
+        return new_item
 
     def recursivelyCloneItem(self, item):
@@ -626,6 +647,9 @@
         Add data set(s) to the existing matplotlib chart
         """
-        # new plot data
-        new_plots = GuiUtils.plotsFromCheckedItems(self.model)
+        # new plot data; check which tab is currently active
+        if self.current_view == self.treeView:
+            new_plots = GuiUtils.plotsFromCheckedItems(self.model)
+        else:
+            new_plots = GuiUtils.plotsFromCheckedItems(self.theory_model)
 
         # old plot data
Index: src/sas/qtgui/MainWindow/DataManager.py
===================================================================
--- src/sas/qtgui/MainWindow/DataManager.py	(revision 0261bc13615593f5eb2e08941252c044b8bb2e3b)
+++ src/sas/qtgui/MainWindow/DataManager.py	(revision 4e255d1e4be187b7380836fb95aaec4b4f362283)
@@ -24,5 +24,5 @@
 import json
 import time
-from io import StringIO
+from io import BytesIO
 import numpy as np
 
@@ -368,5 +368,5 @@
             # ndarray
             if isinstance(o, np.ndarray):
-                buffer = StringIO()
+                buffer = BytesIO()
                 np.save(buffer, o)
                 buffer.seek(0)
@@ -435,5 +435,5 @@
             # ndarray
             if cls == np.ndarray:
-                buffer = StringIO()
+                buffer = BytesIO()
                 buffer.write(data['data'].encode('latin-1'))
                 buffer.seek(0)
Index: src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py	(revision 02e7d3aad335a364998214e705a994e2df39e173)
+++ src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py	(revision 10fee3755828e8d3a7f1176fc9df275946d33e1d)
@@ -115,5 +115,5 @@
         Add a new tab for passed data
         """
-        tab	= FittingWidget(parent=self.parent, data=data, tab_id=self.maxIndex+1)
+        tab	= FittingWidget(parent=self.parent, data=data, tab_id=self.maxIndex)
         tab.is_batch_fitting = is_batch
 
Index: src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision b4d05bdc03c6c40fee47932a9a2d20921b1bbe4e)
+++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision b4d05bdc03c6c40fee47932a9a2d20921b1bbe4e)
@@ -2778,5 +2778,5 @@
         state_reader = Reader(self.loadPageStateCallback)
         filepath = self.saveAsAnalysisFile()
-        if filepath is None:
+        if filepath is None or filepath == "":
             return
         state_reader.write(filename=filepath, fitstate=state)
@@ -2830,5 +2830,5 @@
         state.formfactorcombobox = self.cbModel.currentText()
         if self.cbStructureFactor.isEnabled():
-            state.structureCombobox = self.cbStructureFactor.currentText()
+            state.structurecombobox = self.cbStructureFactor.currentText()
         state.tcChi = self.chi2
 
@@ -2862,6 +2862,6 @@
         p = self.model_parameters
         # save checkbutton state and txtcrtl values
-        state.parameters = FittingUtilities.getStandardParam()
-        state.orientation_params_disp = FittingUtilities.getOrientationParam()
+        state.parameters = FittingUtilities.getStandardParam(self._model_model)
+        state.orientation_params_disp = FittingUtilities.getOrientationParam(self.kernel_module)
 
         #self._copy_parameters_state(self.orientation_params_disp, self.state.orientation_params_disp)
Index: src/sas/qtgui/Plotting/Plotter.py
===================================================================
--- src/sas/qtgui/Plotting/Plotter.py	(revision 42787fbf42855bf762f6bc0304e0654ec5288547)
+++ src/sas/qtgui/Plotting/Plotter.py	(revision 685e0e3447e0a2b4fe6f20479d5eac41f86c67f8)
@@ -75,22 +75,23 @@
         is_fit = (self.data.id=="fit")
 
-        # make sure we have some function to operate on
-        if self.data.xtransform is None:
-            self.data.xtransform = 'log10(x)'
-        if self.data.ytransform is None:
-            self.data.ytransform = 'log10(y)'
-
-        # Transform data if required.
-        if self.data.xtransform is not None or self.data.ytransform is not None:
-            _, _, xscale, yscale = GuiUtils.xyTransform(self.data, self.data.xtransform, self.data.ytransform)
-            if xscale != 'log':
-                self.xscale = xscale
-            if yscale != 'log':
-                self.yscale = yscale
-
-            # Redefine the Scale properties dialog
-            self.properties = ScaleProperties(self,
-                                    init_scale_x=self.data.xtransform,
-                                    init_scale_y=self.data.ytransform)
+        if not is_fit:
+            # make sure we have some function to operate on
+            if self.data.xtransform is None:
+                self.data.xtransform = 'log10(x)'
+            if self.data.ytransform is None:
+                self.data.ytransform = 'log10(y)'
+
+            # Transform data if required.
+            if self.data.xtransform is not None or self.data.ytransform is not None:
+                _, _, xscale, yscale = GuiUtils.xyTransform(self.data, self.data.xtransform, self.data.ytransform)
+                if xscale != 'log':
+                    self.xscale = xscale
+                if yscale != 'log':
+                    self.yscale = yscale
+
+                # Redefine the Scale properties dialog
+                self.properties = ScaleProperties(self,
+                                        init_scale_x=self.data.xtransform,
+                                        init_scale_y=self.data.ytransform)
 
         # Shortcuts
Index: src/sas/qtgui/Utilities/GuiUtils.py
===================================================================
--- src/sas/qtgui/Utilities/GuiUtils.py	(revision 3d18691df01d447d24aab707b6772ce6ab95e36c)
+++ src/sas/qtgui/Utilities/GuiUtils.py	(revision 685e0e3447e0a2b4fe6f20479d5eac41f86c67f8)
@@ -427,5 +427,5 @@
     for index in range(model_item.rowCount()):
         item = model_item.item(index)
-        if str(item.text()) == filename:
+        if filename in str(item.text()):
             # TODO: assure item type is correct (either data1/2D or Plotter)
             plot_data[item] = item.child(0).data()
