Index: src/sas/qtgui/MainWindow/DataExplorer.py
===================================================================
--- src/sas/qtgui/MainWindow/DataExplorer.py	(revision 2b8286c458db137a837452758351f50f63f322d7)
+++ src/sas/qtgui/MainWindow/DataExplorer.py	(revision 8e674ccf5c2f4e357295344dc59f2796cd7de805)
@@ -95,5 +95,5 @@
         self.communicator.activeGraphsSignal.connect(self.updateGraphCount)
         self.communicator.activeGraphName.connect(self.updatePlotName)
-        self.communicator.plotUpdateSignal.connect(self.updatePlot)
+        self.communicator.plotUpdateSignal.connect(self.displayData)
         self.communicator.maskEditorSignal.connect(self.showEditDataMask)
         self.communicator.extMaskEditorSignal.connect(self.extShowEditDataMask)
@@ -572,24 +572,34 @@
         # Each fitpage contains the name based on fit widget number
         fitpage_name = "" if id is None else "M"+str(id)
-        new_plots = []
+        # groups plots which move into an own window
+        new_plots = dict(int = [], res = [], pd = [])
         for item, plot in plots.items():
-            if self.updatePlot(plot) and filename != plot.name:
+            if (self.updatePlot(plot) and filename != plot.name) or plot.hidden:
                 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)]")
+            # 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
+            # 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
+                # this should be done by some kind of grouping by lists
+                # which helps to indicate which go into a single plot window
                 if 'esiduals' in plot.title:
-                    plot.yscale='linear'
-                    self.plotData([(item, plot)])
+                    plot.yscale = 'linear'
+                    new_plots['res'].append((item, plot))
+                elif 'olydispersity' in plot.title:
+                    plot.yscale = 'linear'
+                    new_plots['pd'].append((item, plot))
                 else:
-                    new_plots.append((item, plot))
-
-        if new_plots:
-            self.plotData(new_plots)
+                    new_plots['int'].append((item, plot))
+
+        # create entirely new plots for those which could not be updated
+        for plots in new_plots.values():
+            if len(plots):
+                self.plotData(plots)
 
     def displayData(self, data_list, id=None):
@@ -597,10 +607,11 @@
         Forces display of charts for the given data set
         """
-        plot_to_show = data_list[0]
-        # passed plot is used ONLY to figure out its title,
-        # so all the charts related by it can be pulled from 
-        # the data explorer indices.
-        filename = plot_to_show.filename
-        self.displayFile(filename=filename, is_data=plot_to_show.is_data, id=id)
+        for plot_to_show in data_list:
+            # may there be duplicates? list(OrderedDict.fromkeys(data_list))
+            # passed plot is used ONLY to figure out its title,
+            # so all the charts related by it can be pulled from
+            # the data explorer indices.
+            filename = plot_to_show.filename
+            self.displayFile(filename=filename, is_data=plot_to_show.is_data, id=id)
 
     def addDataPlot2D(self, plot_set, item):
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 f3cc97915e137dcf9c01fc80640494c50a238cd6)
@@ -1088,4 +1088,11 @@
             return True
 
+    def updateDataVisibility(self, updateOnly):
+        self.dataUpdateOnly = updateOnly
+        for dataitem in self.all_data:
+            data = GuiUtils.dataFromItem(dataitem)
+            data.hidden = self.dataUpdateOnly
+            self.updateModelIndex(data)
+
     def updateData(self):
         """
@@ -1093,4 +1100,5 @@
         """
         # Update the chart
+        self.updateDataVisibility(True)
         if self.data_is_loaded:
             self.cmdPlot.setText("Show Plot")
@@ -1815,9 +1823,9 @@
         self.cmdPlot.setText("Show Plot")
         # Force data recalculation so existing charts are updated
-        self.showPlot()
+#        self.showPlot()
         # This is an important processEvent.
         # This allows charts to be properly updated in order
         # of plots being applied.
-        QtWidgets.QApplication.processEvents()
+#        QtWidgets.QApplication.processEvents()
         self.recalculatePlotData()
 
@@ -2272,4 +2280,7 @@
         Create a model or theory index with passed Data1D/Data2D
         """
+        # set some flag which decides if new plots should be created or
+        # just existing ones updated, selectively hiding indiv. plot will also work
+        fitted_data.hidden = getattr(self, 'dataUpdateOnly', True)
         if self.data_is_loaded:
             if not fitted_data.name:
@@ -2442,4 +2453,6 @@
         for plot in new_plots:
             self.communicate.plotUpdateSignal.emit([plot])
+        # enable plots to be shown next time if updateData() wasn't called
+        self.updateDataVisibility(False)
 
     def complete2D(self, return_data):
