Index: src/sas/qtgui/MainWindow/DataExplorer.py
===================================================================
--- src/sas/qtgui/MainWindow/DataExplorer.py	(revision 2b8286c458db137a837452758351f50f63f322d7)
+++ src/sas/qtgui/MainWindow/DataExplorer.py	(revision a54bbf2b2021cfeddeb40171e2fdf6a0e00ad921)
@@ -574,5 +574,5 @@
         new_plots = []
         for item, plot in plots.items():
-            if self.updatePlot(plot) and filename != plot.name:
+            if self.updatePlot(plot) or filename not in plot.name:
                 continue
             # Don't plot intermediate results, e.g. P(Q), S(Q)
@@ -583,6 +583,6 @@
             # 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:
+                # Residuals get their own plot
+                if plot.plot_role == Data1D.ROLE_RESIDUAL:
                     plot.yscale='linear'
                     self.plotData([(item, plot)])
@@ -686,5 +686,5 @@
 
         # Update the active chart list
-        #self.active_plots[new_plot.data.id] = new_plot
+        self.active_plots[new_plot.data.name] = new_plot
 
     def appendPlot(self):
@@ -729,8 +729,11 @@
         data_id = data.name
         if data_id in ids_keys:
-            self.active_plots[data_id].replacePlot(data_id, data)
+            # We have data, let's replace data that needs replacing
+            if data.plot_role != Data1D.ROLE_DATA:
+                self.active_plots[data_id].replacePlot(data_id, data)
             return True
         elif data_id in ids_vals:
-            list(self.active_plots.values())[ids_vals.index(data_id)].replacePlot(data_id, data)
+            if data.plot_role != Data1D.ROLE_DATA:
+                list(self.active_plots.values())[ids_vals.index(data_id)].replacePlot(data_id, data)
             return True
         return False
Index: src/sas/qtgui/MainWindow/DataManager.py
===================================================================
--- src/sas/qtgui/MainWindow/DataManager.py	(revision 4e255d1e4be187b7380836fb95aaec4b4f362283)
+++ src/sas/qtgui/MainWindow/DataManager.py	(revision a54bbf2b2021cfeddeb40171e2fdf6a0e00ad921)
@@ -118,4 +118,6 @@
         new_plot.path = path
         new_plot.list_group_id = []
+        # Assign the plot role to data
+        new_plot.plot_role = Data1D.ROLE_DATA
         ##post data to plot
         # plot data
Index: src/sas/qtgui/Perspectives/Fitting/FittingLogic.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingLogic.py	(revision 61f0c75f21788f08492f16b51fa253507d1e8423)
+++ src/sas/qtgui/Perspectives/Fitting/FittingLogic.py	(revision a54bbf2b2021cfeddeb40171e2fdf6a0e00ad921)
@@ -154,4 +154,7 @@
         new_plot.xaxis(_xaxis, _xunit)
         new_plot.yaxis(_yaxis, _yunit)
+
+        if component is not None:
+            new_plot.plot_role = Data1D.ROLE_DELETABLE #deletable
 
         return new_plot
Index: src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision f3cc97915e137dcf9c01fc80640494c50a238cd6)
+++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision a54bbf2b2021cfeddeb40171e2fdf6a0e00ad921)
@@ -2481,4 +2481,5 @@
         residuals_plot = FittingUtilities.plotResiduals(self.data, weighted_data)
         residuals_plot.id = "Residual " + residuals_plot.id
+        residuals_plot.plot_role = Data1D.ROLE_RESIDUAL
         self.createNewIndex(residuals_plot)
         return residuals_plot
Index: src/sas/qtgui/Plotting/PlotterData.py
===================================================================
--- src/sas/qtgui/Plotting/PlotterData.py	(revision cee5c78929349ae10afc88cb8b95e0c907f1826a)
+++ src/sas/qtgui/Plotting/PlotterData.py	(revision a54bbf2b2021cfeddeb40171e2fdf6a0e00ad921)
@@ -17,4 +17,8 @@
     """
     """
+    ROLE_DATA=0
+    ROLE_DEFAULT=1
+    ROLE_DELETABLE=2
+    ROLE_RESIDUAL=3
     def __init__(self, x=None, y=None, dx=None, dy=None):
         """
@@ -35,4 +39,10 @@
         self.title = ""
         self.scale = None
+        # plot_role:
+        # 0: data - no reload on param change
+        # 1: normal lifecycle (fit)
+        # 2: deletable on model change (Q(I), S(I)...)
+        # 3: separate chart on Show Plot (residuals)
+        self.plot_role = Data1D.ROLE_DEFAULT
         
     def copy_from_datainfo(self, data1d):
@@ -184,4 +194,6 @@
         self.title = ""
         self.scale = None
+        # Always default
+        self.plot_role = Data1D.ROLE_DEFAULT
         
     def copy_from_datainfo(self, data2d):
Index: src/sas/qtgui/Utilities/GuiUtils.py
===================================================================
--- src/sas/qtgui/Utilities/GuiUtils.py	(revision 5d28d6b6b7dadfef592bf957488f1c9eddb3a274)
+++ src/sas/qtgui/Utilities/GuiUtils.py	(revision a54bbf2b2021cfeddeb40171e2fdf6a0e00ad921)
@@ -322,4 +322,5 @@
     assert isinstance(item, QtGui.QStandardItem)
 
+    # lists of plots names/ids for all deletable plots on item
     names = [p.name for p in new_plots if p.name is not None]
     ids = [p.id for p in new_plots if p.id is not None]
@@ -329,8 +330,12 @@
     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.id not in ids) and (plot_data.name not in names):
-                items_to_delete.append(plot_item)
+        if not plot_item.isCheckable():
+            continue
+        plot_data = plot_item.child(0).data()
+        if (plot_data.id is not None) and \
+            (plot_data.id not in ids) and \
+            (plot_data.name not in names) and \
+            (plot_data.plot_role == Data1D.ROLE_DELETABLE):
+            items_to_delete.append(plot_item)
 
     for plot_item in items_to_delete:
