Index: src/sas/qtgui/MainWindow/DataExplorer.py
===================================================================
--- src/sas/qtgui/MainWindow/DataExplorer.py	(revision 6b5029659d0f8848859513403a8ef38c0481f7db)
+++ src/sas/qtgui/MainWindow/DataExplorer.py	(revision fd7ef366aae1676b62ef944659ae3d38556a61fb)
@@ -4,5 +4,4 @@
 import time
 import logging
-import re
 
 from PyQt5 import QtCore
@@ -37,12 +36,4 @@
     # 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):
@@ -581,5 +572,5 @@
             else:
                 # Don't plot intermediate results, e.g. P(Q), S(Q)
-                match = self.theory_plot_ID_pattern.match(plot_id)
+                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:
@@ -1290,2 +1281,22 @@
         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 6b5029659d0f8848859513403a8ef38c0481f7db)
+++ src/sas/qtgui/MainWindow/GuiManager.py	(revision fd7ef366aae1676b62ef944659ae3d38556a61fb)
@@ -395,4 +395,5 @@
         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)
@@ -886,4 +887,11 @@
         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/Perspectives/Fitting/FittingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision 444c221ca8fc7793d71d52846678ae951c5e30cf)
+++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision fd7ef366aae1676b62ef944659ae3d38556a61fb)
@@ -2303,4 +2303,10 @@
             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)
+
         # Create plots for intermediate product data
         pq_data, sq_data = self.logic.new1DProductPlots(return_data, self.tab_id)
@@ -2315,7 +2321,4 @@
             # self.communicate.plotUpdateSignal.emit([sq_data])
             new_plots.append(sq_data)
-
-        if self.data_is_loaded:
-            GuiUtils.deleteRedundantPlots(self.all_data[self.data_index], new_plots)
 
         # Update/generate plots
Index: src/sas/qtgui/Utilities/GuiUtils.py
===================================================================
--- src/sas/qtgui/Utilities/GuiUtils.py	(revision 9463ca22fbd7a5dfabfd6ec8adf7690e1460bef6)
+++ src/sas/qtgui/Utilities/GuiUtils.py	(revision fd7ef366aae1676b62ef944659ae3d38556a61fb)
@@ -35,4 +35,12 @@
         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():
@@ -211,4 +219,7 @@
     # 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
