Index: src/sas/qtgui/MainWindow/DataExplorer.py
===================================================================
--- src/sas/qtgui/MainWindow/DataExplorer.py	(revision 515c23dfb58987d8db53d729636b6df99b427fc8)
+++ src/sas/qtgui/MainWindow/DataExplorer.py	(revision d9150d8b0b9b0d85ee6266b1b50adf1e6dc8aee9)
@@ -56,5 +56,8 @@
         self.mutex = QtCore.QMutex()
 
-        # Active plots
+        # Plot widgets {name:widget}, required to keep track of plots shown as MDI subwindows
+        self.plot_widgets = {}
+
+        # Active plots {id:Plotter1D/2D}, required to keep track of currently displayed plots
         self.active_plots = {}
 
@@ -554,4 +557,5 @@
                 if not 'new_plot' in locals():
                     new_plot = Plotter(self)
+                    new_plot.item = item
                 new_plot.plot(plot_set)
                 # active_plots may contain multiple charts
@@ -592,9 +596,12 @@
 
         # Add the plot to the workspace
-        self.parent.workspace().addSubWindow(new_plot)
+        plot_widget = self.parent.workspace().addSubWindow(new_plot)
 
         # Show the plot
         new_plot.show()
         new_plot.canvas.draw()
+
+        # Update the plot widgets dict
+        self.plot_widgets[title]=plot_widget
 
         # Update the active chart list
@@ -1026,13 +1033,13 @@
             return
 
-        proxy = self.current_view.model()
-        model = proxy.sourceModel()
-
-        deleted_items = []
-        deleted_names = []
-
         # Every time a row is removed, the indices change, so we'll just remove
         # rows and keep calling selectedIndexes until it returns an empty list.
         indices = self.current_view.selectedIndexes()
+
+        proxy = self.current_view.model()
+        model = proxy.sourceModel()
+
+        deleted_items = []
+        deleted_names = []
 
         while len(indices) > 0:
@@ -1046,4 +1053,7 @@
                 deleted_names.append(item_to_delete.text())
                 deleted_items.append(item_to_delete)
+
+                # Delete corresponding open plots
+                self.closePlotsForItem(item_to_delete)
 
                 if item_to_delete.parent():
@@ -1060,4 +1070,43 @@
         # update stored_data
         self.manager.update_stored_data(deleted_names)
+
+    def closePlotsForItem(self, item):
+        """
+        Given standard item, close all its currently displayed plots
+        """
+        # item - HashableStandardItems of active plots
+
+        # {} -> 'Graph1' : HashableStandardItem()
+        current_plot_items = {}
+        for plot_name in PlotHelper.currentPlots():
+            current_plot_items[plot_name] = PlotHelper.plotById(plot_name).item
+
+        # item and its hashable children
+        items_being_deleted = []
+        if item.rowCount() > 0:
+            items_being_deleted = [item.child(n) for n in range(item.rowCount())
+                                   if isinstance(item.child(n), GuiUtils.HashableStandardItem)]
+        items_being_deleted.append(item)
+        # Add the parent in case a child is selected
+        if isinstance(item.parent(), GuiUtils.HashableStandardItem):
+            items_being_deleted.append(item.parent())
+
+        # Compare plot items and items to delete
+        plots_to_close = set(current_plot_items.values()) & set(items_being_deleted)
+
+        for plot_item in plots_to_close:
+            for plot_name in current_plot_items.keys():
+                if plot_item == current_plot_items[plot_name]:
+                    plotter = PlotHelper.plotById(plot_name)
+                    # try to delete the plot
+                    try:
+                        plotter.close()
+                        #self.parent.workspace().removeSubWindow(plotter)
+                        self.plot_widgets[plot_name].close()
+                        self.plot_widgets.pop(plot_name, None)
+                    except AttributeError as ex:
+                        logging.error("Closing of %s failed:\n %s" % (plot_name, str(ex)))
+
+        pass # debugger anchor
 
     def onAnalysisUpdate(self, new_perspective=""):
@@ -1174,8 +1223,2 @@
         self.theory_model.appendRow(model_item)
 
-
-if __name__ == "__main__":
-    app = QtWidgets.QApplication([])
-    dlg = DataExplorerWindow()
-    dlg.show()
-    sys.exit(app.exec_())
Index: src/sas/qtgui/MainWindow/UnitTesting/DataExplorerTest.py
===================================================================
--- src/sas/qtgui/MainWindow/UnitTesting/DataExplorerTest.py	(revision 80468f6c91cf372023748231c493da2c7009a763)
+++ src/sas/qtgui/MainWindow/UnitTesting/DataExplorerTest.py	(revision d9150d8b0b9b0d85ee6266b1b50adf1e6dc8aee9)
@@ -67,5 +67,5 @@
         # Buttons - data tab
         self.assertEqual(self.form.cmdLoad.text(), "Load data")
-        self.assertEqual(self.form.cmdDeleteData.text(), "Delete")
+        self.assertEqual(self.form.cmdDeleteData.text(), "Delete Data")
         self.assertEqual(self.form.cmdDeleteTheory.text(), "Delete")
         self.assertEqual(self.form.cmdFreeze.text(), "Freeze Theory")
@@ -819,5 +819,5 @@
         pass
 
-    def notestDeleteItem(self):
+    def testDeleteItem(self):
         """
         Delete selected item from data explorer
@@ -876,4 +876,48 @@
         self.assertEqual(self.form.model.rowCount(), 3)
 
+    def testClosePlotsForItem(self):
+        """
+        Delete selected item from data explorer should also delete corresponding plots
+        """
+        # Mock the confirmation dialog with return=No
+        QMessageBox.question = MagicMock(return_value=QMessageBox.No)
+
+        loader = Loader()
+        manager = DataManager()
+        PlotHelper.clear()
+        self.form.enableGraphCombo(None)
+
+        # Make sure the controls are disabled
+        self.assertFalse(self.form.cbgraph.isEnabled())
+        self.assertFalse(self.form.cmdAppend.isEnabled())
+
+        # Populate the model
+        filename = ["cyl_400_20.txt"]
+        self.form.readData(filename)
+
+        # Mask plotting
+        self.form.parent.workspace = MagicMock()
+
+        # Call the plotting method
+        self.form.newPlot()
+
+        time.sleep(1)
+        QApplication.processEvents()
+
+        # The plot was registered
+        self.assertEqual(len(PlotHelper.currentPlots()), 1)
+        self.assertEqual(len(self.form.plot_widgets), 1)
+        self.assertEqual(list(self.form.plot_widgets.keys()), ['Graph3'])
+
+        # data index
+        model_item = self.form.model.item(0,0)
+
+        # Call the method
+        self.form.closePlotsForItem(model_item)
+
+        # See that no plot remained
+        self.assertEqual(len(PlotHelper.currentPlots()), 0)
+        self.assertEqual(len(self.form.plot_widgets), 0)
+
 
 if __name__ == "__main__":
Index: src/sas/qtgui/Plotting/Masks/SectorMask.py
===================================================================
--- src/sas/qtgui/Plotting/Masks/SectorMask.py	(revision 05fa13271525615ce96b90e70d12c65c080b99dd)
+++ src/sas/qtgui/Plotting/Masks/SectorMask.py	(revision d9150d8b0b9b0d85ee6266b1b50adf1e6dc8aee9)
@@ -4,7 +4,7 @@
 import numpy as np
 
-from qtgui.Plotting.Slicers.BaseInteractor import BaseInteractor
-from qtgui.Plotting.Slicers.SectorSlicer import SideInteractor
-from qtgui.Plotting.Slicers.SectorSlicer import LineInteractor
+from sas.qtgui.Plotting.Slicers.BaseInteractor import BaseInteractor
+from sas.qtgui.Plotting.Slicers.SectorSlicer import SideInteractor
+from sas.qtgui.Plotting.Slicers.SectorSlicer import LineInteractor
 
 class SectorMask(BaseInteractor):
Index: src/sas/qtgui/Plotting/Plotter2D.py
===================================================================
--- src/sas/qtgui/Plotting/Plotter2D.py	(revision e20870bce5dcfe5fc479f9b0858c50abf55ae0d0)
+++ src/sas/qtgui/Plotting/Plotter2D.py	(revision d9150d8b0b9b0d85ee6266b1b50adf1e6dc8aee9)
@@ -85,14 +85,4 @@
         self.yLabel = "%s(%s)"%(data._yaxis, data._yunit)
         self.title(title=data.title)
-
-    @property
-    def item(self):
-        ''' getter for this plot's QStandardItem '''
-        return self._item
-
-    @item.setter
-    def item(self, item=None):
-        ''' setter for this plot's QStandardItem '''
-        self._item = item
 
     def plot(self, data=None, marker=None, show_colorbar=True):
Index: src/sas/qtgui/Plotting/PlotterBase.py
===================================================================
--- src/sas/qtgui/Plotting/PlotterBase.py	(revision e30646abc936a200f2d25890d022d4899b656f59)
+++ src/sas/qtgui/Plotting/PlotterBase.py	(revision d9150d8b0b9b0d85ee6266b1b50adf1e6dc8aee9)
@@ -133,4 +133,14 @@
 
     @property
+    def item(self):
+        ''' getter for this plot's QStandardItem '''
+        return self._item
+
+    @item.setter
+    def item(self, item=None):
+        ''' setter for this plot's QStandardItem '''
+        self._item = item
+
+    @property
     def xLabel(self, xlabel=""):
         """ x-label setter """
