Index: src/sas/qtgui/MainWindow/DataExplorer.py
===================================================================
--- src/sas/qtgui/MainWindow/DataExplorer.py	(revision 0cd98a1bff2f5cc0a67f68ad681ae7a3c8379c75)
+++ src/sas/qtgui/MainWindow/DataExplorer.py	(revision 2b8286c458db137a837452758351f50f63f322d7)
@@ -98,4 +98,5 @@
         self.communicator.maskEditorSignal.connect(self.showEditDataMask)
         self.communicator.extMaskEditorSignal.connect(self.extShowEditDataMask)
+        self.communicator.changeDataExplorerTabSignal.connect(self.changeTabs)
 
         self.cbgraph.editTextChanged.connect(self.enableGraphCombo)
@@ -139,4 +140,13 @@
         else:
             self.current_view = self.freezeView
+
+    def changeTabs(self, tab=0):
+        """
+        Switch tabs of the data explorer
+        0: data tab
+        1: theory tab
+        """
+        assert(tab in [0,1])
+        self.setCurrentIndex(tab)
 
     def displayHelp(self):
@@ -553,5 +563,5 @@
         return item
 
-    def displayFile(self, filename=None, is_data=True):
+    def displayFile(self, filename=None, is_data=True, id=None):
         """
         Forces display of charts for the given filename
@@ -560,13 +570,17 @@
         # Now query the model item for available plots
         plots = GuiUtils.plotsFromFilename(filename, model)
-
+        # Each fitpage contains the name based on fit widget number
+        fitpage_name = "" if id is None else "M"+str(id)
         new_plots = []
         for item, plot in plots.items():
-            if not self.updatePlot(plot):
-                # Don't plot intermediate results, e.g. P(Q), S(Q)
-                match = GuiUtils.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:
-                    continue
+            if self.updatePlot(plot) and filename != plot.name:
+                continue
+            # Don't plot intermediate results, e.g. P(Q), S(Q)
+            match = GuiUtils.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:
+                continue
+            # Don't include plots from different fitpages, but always include the original data
+            if fitpage_name in plot.name or filename == plot.name:
                 # 'sophisticated' test to generate standalone plot for residuals
                 if 'esiduals' in plot.title:
@@ -579,5 +593,5 @@
             self.plotData(new_plots)
 
-    def displayData(self, data_list):
+    def displayData(self, data_list, id=None):
         """
         Forces display of charts for the given data set
@@ -588,5 +602,5 @@
         # the data explorer indices.
         filename = plot_to_show.filename
-        self.displayFile(filename=filename, is_data=plot_to_show.is_data)
+        self.displayFile(filename=filename, is_data=plot_to_show.is_data, id=id)
 
     def addDataPlot2D(self, plot_set, item):
Index: src/sas/qtgui/MainWindow/GuiManager.py
===================================================================
--- src/sas/qtgui/MainWindow/GuiManager.py	(revision 339e22b9f5c08262b1d5b0b551ce467bcf83178c)
+++ src/sas/qtgui/MainWindow/GuiManager.py	(revision 5b144c6da3772c7f3a243d7540d60d506f7f931e)
@@ -921,10 +921,10 @@
             self.filesWidget.displayFile(filename=filename, is_data=True)
 
-    def showPlot(self, plot):
+    def showPlot(self, plot, id):
         """
         Pass the show plot request to the data explorer
         """
         if hasattr(self, "filesWidget"):
-            self.filesWidget.displayData(plot)
+            self.filesWidget.displayData(plot, id)
 
     def uncheckAllMenuItems(self, menuObject):
Index: src/sas/qtgui/Perspectives/Fitting/FittingLogic.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingLogic.py	(revision dcabba7be660ff2e140942eb331ca846d1f2a399)
+++ src/sas/qtgui/Perspectives/Fitting/FittingLogic.py	(revision 61f0c75f21788f08492f16b51fa253507d1e8423)
@@ -213,4 +213,6 @@
         plots = []
         for name, result in return_data['intermediate_results'].items():
+            if not isinstance(result, np.ndarray):
+                continue
             plots.append(self._create1DPlot(tab_id, return_data['x'], result,
                          return_data['model'], return_data['data'],
Index: src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision d4ba5659c28772e9c307ab44a02664ec480d11a5)
+++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision bb477f548ae5ba590f954cce573627bdb5c105f3)
@@ -569,5 +569,5 @@
             menu.exec_(self.lstParams.viewport().mapToGlobal(position))
         except AttributeError as ex:
-            logging.error("Error generating context menu: %s" % ex)
+            logger.error("Error generating context menu: %s" % ex)
         return
 
@@ -1456,5 +1456,5 @@
             self.communicate.statusBarUpdateSignal.emit(msg)
             msg += results.mesg
-            logging.error(msg)
+            logger.error(msg)
             return
 
@@ -1499,5 +1499,5 @@
         if self.calc_fit._interrupting:
             msg = "Fitting cancelled by user after: %s s." % GuiUtils.formatNumber(elapsed)
-            logging.warning("\n"+msg+"\n")
+            logger.warning("\n"+msg+"\n")
         else:
             msg = "Fitting completed successfully in: %s s." % GuiUtils.formatNumber(elapsed)
@@ -1841,5 +1841,5 @@
         data_to_show = self.data if self.data_is_loaded else self.model_data
         if data_to_show is not None:
-            self.communicate.plotRequestedSignal.emit([data_to_show])
+            self.communicate.plotRequestedSignal.emit([data_to_show], self.tab_id)
 
     def onOptionsUpdate(self):
@@ -2052,5 +2052,5 @@
                 kernel_module = generate.load_kernel_module(name)
             except ModuleNotFoundError as ex:
-                logging.error("Can't find the model "+ str(ex))
+                logger.error("Can't find the model "+ str(ex))
                 return
 
@@ -2287,4 +2287,6 @@
             fitted_data.symbol = "Line"
             self.createTheoryIndex(fitted_data)
+            # Switch to the theory tab for user's glee
+            self.communicate.changeDataExplorerTabSignal.emit(1)
 
     def updateModelIndex(self, fitted_data):
@@ -2422,5 +2424,7 @@
 
         if self.data_is_loaded:
+            # delete any plots associated with the data that were not updated (e.g. to remove beta(Q), S_eff(Q))
             GuiUtils.deleteRedundantPlots(self.all_data[self.data_index], new_plots)
+            pass
         else:
             # delete theory items for the model, in order to get rid of any redundant items, e.g. beta(Q), S_eff(Q)
@@ -2511,5 +2515,5 @@
         """
         # TODO: remimplement thread cancellation
-        logging.error("".join(traceback.format_exception(etype, value, tb)))
+        logger.error("".join(traceback.format_exception(etype, value, tb)))
 
     def setTableProperties(self, table):
@@ -2693,5 +2697,5 @@
 
         if not datafile:
-            logging.info("No weight data chosen.")
+            logger.info("No weight data chosen.")
             raise IOError
 
@@ -2809,7 +2813,17 @@
         self._n_shells_row = shell_row - 1
 
-        # Set the index to the state-kept value
-        func.setCurrentIndex(self.current_shell_displayed
-                             if self.current_shell_displayed < func.count() else 0)
+        # Get the default number of shells for the model
+        kernel_pars = self.kernel_module._model_info.parameters.kernel_parameters
+        shell_par = None
+        for par in kernel_pars:
+            if par.name == param_name:
+                shell_par = par
+                break
+        if not shell_par:
+            logger.error("Could not find %s in kernel parameters.", param_name)
+        default_shell_count = shell_par.default
+
+        # Add default number of shells to the model
+        func.setCurrentIndex(default_shell_count)
 
     def modifyShellsInList(self, index):
@@ -3125,10 +3139,17 @@
             param_value = str(self._model_model.item(row, 1).text())
             param_error = None
+            param_min = None
+            param_max = None
             column_offset = 0
             if self.has_error_column:
                 param_error = str(self._model_model.item(row, 2).text())
                 column_offset = 1
-            param_min = str(self._model_model.item(row, 2+column_offset).text())
-            param_max = str(self._model_model.item(row, 3+column_offset).text())
+
+            try:
+                param_min = str(self._model_model.item(row, 2+column_offset).text())
+                param_max = str(self._model_model.item(row, 3+column_offset).text())
+            except:
+                pass
+
             param_list.append([param_name, param_checked, param_value, param_error, param_min, param_max])
 
@@ -3220,8 +3241,11 @@
 
                 # limits
-                limit_lo = item[3]
-                context[name].append(limit_lo)
-                limit_hi = item[4]
-                context[name].append(limit_hi)
+                try:
+                    limit_lo = item[3]
+                    context[name].append(limit_lo)
+                    limit_hi = item[4]
+                    context[name].append(limit_hi)
+                except:
+                    pass
 
                 # Polydisp
@@ -3282,9 +3306,14 @@
                 ioffset = 1
             # min/max
-            param_repr = GuiUtils.formatNumber(param_dict[param_name][2+ioffset], high=True)
-            self._model_model.item(row, 2+ioffset).setText(param_repr)
-            param_repr = GuiUtils.formatNumber(param_dict[param_name][3+ioffset], high=True)
-            self._model_model.item(row, 3+ioffset).setText(param_repr)
+            try:
+                param_repr = GuiUtils.formatNumber(param_dict[param_name][2+ioffset], high=True)
+                self._model_model.item(row, 2+ioffset).setText(param_repr)
+                param_repr = GuiUtils.formatNumber(param_dict[param_name][3+ioffset], high=True)
+                self._model_model.item(row, 3+ioffset).setText(param_repr)
+            except:
+                pass
+
             self.setFocus()
+
 
 
Index: src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py	(revision 3fbd77b038f1503431a47e6e7b3a7ad275c0655c)
+++ src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py	(revision f712bf3025cf12e62b69938499d344d81714ebce)
@@ -613,10 +613,11 @@
 
         # Check that the number of rows increased
+        # (note that n == 1 by default in core_multi_shell so this increases index by 2)
         more_rows = self.widget._model_model.rowCount() - last_row
-        self.assertEqual(more_rows, 6) # 6 new rows: 2 params per index
-
-        # Back to 0
+        self.assertEqual(more_rows, 4) # 4 new rows: 2 params per index
+
+        # Set to 0
         self.widget.lstParams.indexWidget(func_index).setCurrentIndex(0)
-        self.assertEqual(self.widget._model_model.rowCount(), last_row)
+        self.assertEqual(self.widget._model_model.rowCount(), last_row - 2) # 2 fewer rows than default
 
     def testPlotTheory(self):
Index: src/sas/qtgui/Perspectives/Inversion/InversionPerspective.py
===================================================================
--- src/sas/qtgui/Perspectives/Inversion/InversionPerspective.py	(revision 4d959c85fedadc355256aadb2328506acdd78bd5)
+++ src/sas/qtgui/Perspectives/Inversion/InversionPerspective.py	(revision 4d959c85fedadc355256aadb2328506acdd78bd5)
@@ -562,9 +562,9 @@
             title = self.prPlot.name
             GuiUtils.updateModelItemWithPlot(self._data, self.prPlot, title)
-            self.communicate.plotRequestedSignal.emit([self.prPlot])
+            self.communicate.plotRequestedSignal.emit([self.prPlot], None)
         if self.dataPlot is not None:
             title = self.dataPlot.name
             GuiUtils.updateModelItemWithPlot(self._data, self.dataPlot, title)
-            self.communicate.plotRequestedSignal.emit([self.dataPlot])
+            self.communicate.plotRequestedSignal.emit([self.dataPlot], None)
         self.enableButtons()
 
Index: src/sas/qtgui/Plotting/Plotter.py
===================================================================
--- src/sas/qtgui/Plotting/Plotter.py	(revision 0cd98a1bff2f5cc0a67f68ad681ae7a3c8379c75)
+++ src/sas/qtgui/Plotting/Plotter.py	(revision 5b144c6da3772c7f3a243d7540d60d506f7f931e)
@@ -561,5 +561,5 @@
 
         #Remove another Fit, if exists
-        self.removePlot("fit")
+        self.removePlot("Fit")
 
         self.fit_result.reset_view()
Index: src/sas/qtgui/Plotting/UnitTesting/PlotterTest.py
===================================================================
--- src/sas/qtgui/Plotting/UnitTesting/PlotterTest.py	(revision b8080e1affadb04559f0597dfddc5506d2044e9d)
+++ src/sas/qtgui/Plotting/UnitTesting/PlotterTest.py	(revision 5b144c6da3772c7f3a243d7540d60d506f7f931e)
@@ -57,10 +57,10 @@
         self.plotter.data = self.data
         self.plotter.show()
-        FigureCanvas.draw_idle = MagicMock()
+        FigureCanvas.draw = MagicMock()
 
         self.plotter.plot(hide_error=False)
 
         self.assertEqual(self.plotter.ax.get_xscale(), 'log')
-        self.assertTrue(FigureCanvas.draw_idle.called)
+        self.assertTrue(FigureCanvas.draw.called)
 
         self.plotter.figure.clf()
@@ -70,10 +70,10 @@
         self.plotter.data = self.data
         self.plotter.show()
-        FigureCanvas.draw_idle = MagicMock()
+        FigureCanvas.draw = MagicMock()
 
         self.plotter.plot(hide_error=True)
 
         self.assertEqual(self.plotter.ax.get_yscale(), 'log')
-        self.assertTrue(FigureCanvas.draw_idle.called)
+        self.assertTrue(FigureCanvas.draw.called)
         self.plotter.figure.clf()
 
@@ -91,5 +91,5 @@
         self.plotter.data = data
         self.plotter.show()
-        FigureCanvas.draw_idle = MagicMock()
+        FigureCanvas.draw = MagicMock()
 
         self.plotter.plot(hide_error=True)
@@ -97,5 +97,5 @@
         self.assertEqual(self.plotter.ax.get_xscale(), 'linear')
         self.assertEqual(self.plotter.ax.get_yscale(), 'linear')
-        self.assertTrue(FigureCanvas.draw_idle.called)
+        self.assertTrue(FigureCanvas.draw.called)
 
     def testCreateContextMenuQuick(self):
@@ -262,5 +262,5 @@
         # Just this one plot
         self.assertEqual(len(list(self.plotter.plot_dict.keys())), 1)
-        self.plotter.onLinearFit(1)
+        self.plotter.onLinearFit('Test name')
 
         # Check that exec_ got called
@@ -289,5 +289,5 @@
 
         # Delete one set
-        self.plotter.onRemovePlot(2)
+        self.plotter.onRemovePlot('Test name 2')
         # Assure we have two sets
         self.assertEqual(len(list(self.plotter.plot_dict.keys())), 1)
@@ -296,5 +296,5 @@
 
         # Delete the remaining set
-        self.plotter.onRemovePlot(1)
+        self.plotter.onRemovePlot('Test name')
         # Assure we have no plots
         self.assertEqual(len(list(self.plotter.plot_dict.keys())), 0)
@@ -331,5 +331,5 @@
         self.assertEqual(yl, "$YAXIS(cake)$")
         # The hide_error flag should also remain
-        self.assertTrue(self.plotter.plot_dict[2].hide_error)
+        self.assertTrue(self.plotter.plot_dict['Test name 2'].hide_error)
         self.plotter.figure.clf()
 
@@ -355,5 +355,5 @@
 
         # Reverse the toggle
-        self.plotter.onToggleHideError(2)
+        self.plotter.onToggleHideError('Test name 2')
         # See that the labels didn't change
         xl = self.plotter.ax.xaxis.label.get_text()
@@ -362,5 +362,5 @@
         self.assertEqual(yl, "$YAXIS(cake)$")
         # The hide_error flag should toggle
-        self.assertEqual(self.plotter.plot_dict[2].hide_error, not error_status)
+        self.assertEqual(self.plotter.plot_dict['Test name 2'].hide_error, not error_status)
         self.plotter.figure.clf()
 
@@ -417,5 +417,5 @@
         self.assertEqual(yl, "$YAXIS(cake)$")
         # The hide_error flag should be as set
-        self.assertEqual(self.plotter.plot_dict[2].hide_error, error_status)
+        self.assertEqual(self.plotter.plot_dict['Test name 2'].hide_error, error_status)
         self.plotter.figure.clf()
 
Index: src/sas/qtgui/Utilities/GuiUtils.py
===================================================================
--- src/sas/qtgui/Utilities/GuiUtils.py	(revision 339e22b9f5c08262b1d5b0b551ce467bcf83178c)
+++ src/sas/qtgui/Utilities/GuiUtils.py	(revision 5d28d6b6b7dadfef592bf957488f1c9eddb3a274)
@@ -225,5 +225,5 @@
     # New plot requested from the GUI manager
     # Old "NewPlotEvent"
-    plotRequestedSignal = QtCore.pyqtSignal(list)
+    plotRequestedSignal = QtCore.pyqtSignal(list, int)
 
     # Plot from file names
@@ -277,4 +277,7 @@
     # Notify about new categories/models from category manager
     updateModelCategoriesSignal = QtCore.pyqtSignal()
+
+    # Tell the data explorer to switch tabs
+    changeDataExplorerTabSignal = QtCore.pyqtSignal(int)
 
 def updateModelItemWithPlot(item, update_data, name=""):
@@ -288,17 +291,19 @@
     for index in range(item.rowCount()):
         plot_item = item.child(index)
-        if plot_item.isCheckable():
-            plot_data = plot_item.child(0).data()
-            if plot_data.id is not None and \
-                   (plot_data.name == update_data.name or plot_data.id == update_data.id):
+        if not plot_item.isCheckable():
+            continue
+        plot_data = plot_item.child(0).data()
+        if plot_data.id is not None and \
+                plot_data.name == update_data.name:
+                #(plot_data.name == update_data.name or plot_data.id == update_data.id):
             # if plot_data.id is not None and plot_data.id == update_data.id:
-                # replace data section in item
-                plot_item.child(0).setData(update_data)
-                plot_item.setText(name)
-                # Plot title if any
-                if plot_item.child(1).hasChildren():
-                    plot_item.child(1).child(0).setText("Title: %s"%name)
-                # Force redisplay
-                return
+            # replace data section in item
+            plot_item.child(0).setData(update_data)
+            plot_item.setText(name)
+            # Plot title if any
+            if plot_item.child(1).hasChildren():
+                plot_item.child(1).child(0).setText("Title: %s"%name)
+            # Force redisplay
+            return
 
     # Create the new item
