Index: src/sas/qtgui/DataExplorer.py
===================================================================
--- src/sas/qtgui/DataExplorer.py	(revision a281ab82d64e991847f9a04a674fa65868cade0b)
+++ src/sas/qtgui/DataExplorer.py	(revision 1042dbac0d9a9f513386ed723f3d110463dce201)
@@ -11,4 +11,5 @@
 # SAS
 from GuiUtils import *
+from Plotter import Plotter
 from sas.sascalc.dataloader.loader import Loader
 from sas.sasgui.guiframe.data_manager import DataManager
@@ -41,4 +42,5 @@
         self.cmdDelete.clicked.connect(self.deleteFile)
         self.cmdSendTo.clicked.connect(self.sendData)
+        self.cmdNew.clicked.connect(self.newPlot)
 
         # Connect the comboboxes
@@ -54,4 +56,7 @@
         # The Data viewer is QTreeView showing the proxy model
         self.treeView.setModel(self.proxy)
+
+        # Debug view on the model
+        self.listView.setModel(self.model)
 
 
@@ -163,4 +168,18 @@
         self._perspective.setData(data_item=data)
 
+    def newPlot(self):
+        """
+        Create a new matplotlib chart from selected data
+        """
+
+        plots = plotsFromCheckedItems(self.model)
+
+        # Call show on requested plots
+        new_plot = Plotter()
+        for plot_set in plots:
+            new_plot.data(plot_set)
+            new_plot.plot()
+
+        new_plot.show()
 
     def chooseFiles(self):
@@ -415,5 +434,5 @@
 
         # Add "Info" item
-        info_item = QtGui.QStandardItem("Info")
+        # info_item = QtGui.QStandardItem("Info")
 
         # Add the actual Data1D/Data2D object
@@ -424,5 +443,6 @@
 
         # Add rows for display in the view
-        self.addExtraRows(info_item, data)
+        # self.addExtraRows(info_item, data)
+        info_item = infoFromData(data)
 
         # Set info_item as the only child
@@ -444,46 +464,12 @@
             msg = "Wrong data type returned from calculations."
             raise AttributeError, msg
-        # Assert other properties
-
-        # Remove the original item        
-
-        # Add the current item
-        # self.model.insertRow(model_item)
+
+        # TODO: Assert other properties
 
         # Reset the view
         self.model.reset()
+
         # Pass acting as a debugger anchor
         pass
-
-    def addExtraRows(self, info_item, data):
-        """
-        Extract relevant data to include in the Info ModelItem
-        """
-        title_item   = QtGui.QStandardItem("Title: "      + data.title)
-        run_item     = QtGui.QStandardItem("Run: "        + str(data.run))
-        type_item    = QtGui.QStandardItem("Type: "       + str(data.__class__.__name__))
-        path_item    = QtGui.QStandardItem("Path: "       + data.path)
-        instr_item   = QtGui.QStandardItem("Instrument: " + data.instrument)
-        process_item = QtGui.QStandardItem("Process")
-        if isinstance(data.process, list) and data.process:
-            for process in data.process:
-                process_date = process.date
-                process_date_item = QtGui.QStandardItem("Date: " + process_date)
-                process_item.appendRow(process_date_item)
-
-                process_descr = process.description
-                process_descr_item = QtGui.QStandardItem("Description: " + process_descr)
-                process_item.appendRow(process_descr_item)
-
-                process_name = process.name
-                process_name_item = QtGui.QStandardItem("Name: " + process_name)
-                process_item.appendRow(process_name_item)
-
-        info_item.appendRow(title_item)
-        info_item.appendRow(run_item)
-        info_item.appendRow(type_item)
-        info_item.appendRow(path_item)
-        info_item.appendRow(instr_item)
-        info_item.appendRow(process_item)
        
 
Index: src/sas/qtgui/GuiManager.py
===================================================================
--- src/sas/qtgui/GuiManager.py	(revision 5032ea687fa17c1323c1124c0a7aa9d80184bf0b)
+++ src/sas/qtgui/GuiManager.py	(revision 1042dbac0d9a9f513386ed723f3d110463dce201)
@@ -3,6 +3,10 @@
 from PyQt4 import QtCore
 from PyQt4 import QtGui
+from PyQt4 import QtWebKit
+
+from twisted.internet import reactor
 
 # General SAS imports
+from sas.sasgui.guiframe.data_manager import DataManager
 import LocalConfig
 from GuiUtils import *
@@ -31,5 +35,6 @@
 
         # Create the data manager
-        #self._data_manager = DataManager()
+        # TODO: pull out all required methods from DataManager and reimplement
+        self._data_manager = DataManager()
 
         # Create action triggers
@@ -55,4 +60,8 @@
         self.welcomePanel = WelcomePanel()
         self._workspace.workspace.addWindow(self.welcomePanel)
+
+        # Current help file
+        self._helpView = QtWebKit.QWebView()
+        self._helpLocation = "html/index.html"
 
         #==========================================================
@@ -107,8 +116,9 @@
         self._workspace.statusbar.showMessage(text)
 
-    #def createGuiData(self, item, p_file):
-    #    """
-    #    """
-    #    return self._data_manager.create_gui_data(item, p_file)
+    def createGuiData(self, item, p_file=None):
+        """
+        Access the Data1D -> plottable Data1D conversion
+        """
+        return self._data_manager.create_gui_data(item, p_file)
 
     def addData(self, data_list):
@@ -255,11 +265,22 @@
         """
         print("actionSave_Analysis TRIGGERED")
+       
         pass
 
     def actionQuit(self):
         """
-        """
-        print("actionQuit TRIGGERED")
-        pass
+        Close the reactor, exit the application.
+        """
+        # display messagebox
+        quit_msg = "Are you sure you want to exit the application?"
+        reply = QtGui.QMessageBox.question(self._parent, 'Warning', quit_msg,
+                QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
+
+        if reply == QtGui.QMessageBox.No:
+            return
+
+        # exit if yes
+        reactor.callFromThread(reactor.stop)
+        sys.exit()
 
     #============ EDIT =================
@@ -489,6 +510,6 @@
         """
         """
-        print("actionDocumentation TRIGGERED")
-        pass
+        self._helpView.load(QtCore.QUrl(self._helpLocation))
+        self._helpView.show()
 
     def actionTutorial(self):
Index: src/sas/qtgui/GuiUtils.py
===================================================================
--- src/sas/qtgui/GuiUtils.py	(revision a281ab82d64e991847f9a04a674fa65868cade0b)
+++ src/sas/qtgui/GuiUtils.py	(revision 1042dbac0d9a9f513386ed723f3d110463dce201)
@@ -26,4 +26,5 @@
 #from sas.sasgui.guiframe.events import NewPlotEvent
 from sas.sasgui.guiframe.dataFitting import Data1D
+from sas.sasgui.guiframe.dataFitting import Data2D
 
 
@@ -209,6 +210,6 @@
 def updateModelItem(item, update_data, name=""):
     """
-    Updates QStandardItem with a checkboxed row named 'name'
-    and containing QVariant 'update_data'
+    Adds a checkboxed row named "name" to QStandardItem
+    Adds QVariant 'update_data' to that row.
     """
     assert type(item) == QtGui.QStandardItem
@@ -221,5 +222,11 @@
 
     # Add "Info" item
-    info_item = QtGui.QStandardItem("Info")
+    py_update_data = update_data.toPyObject()
+    if type(py_update_data) == (Data1D or Data2D):
+        # If Data1/2D added - extract Info from it
+        info_item = infoFromData(py_update_data)
+    else:
+        # otherwise just add a naked item
+        info_item = QtGui.QStandardItem("Info")        
 
     # Add the actual Data1D/Data2D object
@@ -227,9 +234,78 @@
     object_item.setData(update_data)
 
+    # Set the data object as the first child
     checkbox_item.setChild(0, object_item)
 
-    # Set info_item as the only child
+    # Set info_item as the second child
     checkbox_item.setChild(1, info_item)
 
     # Append the new row to the main item
     item.appendRow(checkbox_item)
+
+def plotsFromCheckedItems(model_item):
+    """
+    Returns the list of plots for items in the model which are checked
+    """
+    assert type(model_item) == QtGui.QStandardItemModel
+
+    checkbox_item = QtGui.QStandardItem(True)
+    plot_data = []
+
+    # Iterate over model looking for items with checkboxes
+    for index in range(model_item.rowCount()):
+        item = model_item.item(index)
+        if item.isCheckable() and item.checkState() == QtCore.Qt.Checked:
+            # TODO: assure item type is correct (either data1/2D or Plotter)
+            plot_data.append(item.child(0).data().toPyObject())
+        # Going 1 level deeper only
+        for index_2 in range(item.rowCount()):
+            item_2 = item.child(index_2)
+            if item_2 and item_2.isCheckable() and item_2.checkState() == QtCore.Qt.Checked:
+                # TODO: assure item type is correct (either data1/2D or Plotter)
+                plot_data.append(item_2.child(0).data().toPyObject())
+  
+    return plot_data
+
+def infoFromData(data):
+    """
+    Given Data1D/Data2D object, extract relevant Info elements
+    and add them to a model item
+    """
+    assert type(data) in [Data1D, Data2D]
+
+    info_item = QtGui.QStandardItem("Info")
+
+    title_item   = QtGui.QStandardItem("Title: "      + data.title)
+    info_item.appendRow(title_item)
+    run_item     = QtGui.QStandardItem("Run: "        + str(data.run))
+    info_item.appendRow(run_item)
+    type_item    = QtGui.QStandardItem("Type: "       + str(data.__class__.__name__))
+    info_item.appendRow(type_item)
+
+    if data.path:
+        path_item    = QtGui.QStandardItem("Path: "       + data.path)
+        info_item.appendRow(path_item)
+
+    if data.instrument:
+        instr_item   = QtGui.QStandardItem("Instrument: " + data.instrument)
+        info_item.appendRow(instr_item)
+
+    process_item = QtGui.QStandardItem("Process")
+    if isinstance(data.process, list) and data.process:
+        for process in data.process:
+            process_date = process.date
+            process_date_item = QtGui.QStandardItem("Date: " + process_date)
+            process_item.appendRow(process_date_item)
+
+            process_descr = process.description
+            process_descr_item = QtGui.QStandardItem("Description: " + process_descr)
+            process_item.appendRow(process_descr_item)
+
+            process_name = process.name
+            process_name_item = QtGui.QStandardItem("Name: " + process_name)
+            process_item.appendRow(process_name_item)
+
+    info_item.appendRow(process_item)
+
+    return info_item
+
Index: src/sas/qtgui/Perspectives/Invariant/InvariantPerspective.py
===================================================================
--- src/sas/qtgui/Perspectives/Invariant/InvariantPerspective.py	(revision a281ab82d64e991847f9a04a674fa65868cade0b)
+++ src/sas/qtgui/Perspectives/Invariant/InvariantPerspective.py	(revision 1042dbac0d9a9f513386ed723f3d110463dce201)
@@ -7,10 +7,11 @@
 
 from twisted.internet import threads
+from twisted.internet import reactor
 
 # sas-global
 from sas.sascalc.invariant import invariant
 from sas.sasgui.guiframe.dataFitting import Data1D
-from sas.qtgui.GuiUtils import Communicate
-from sas.qtgui.GuiUtils import updateModelItem
+# from sas.qtgui.GuiUtils import *
+from GuiUtils import *
 
 # local
@@ -262,7 +263,13 @@
             self._plotter.plot()
 
+            # Convert the data into plottable
+            extrapolated_data = self._manager.createGuiData(extrapolated_data)
+
             # Add the plot to the model item
-            variant_item = QtCore.QVariant(self._plotter)
-            updateModelItem(self._model_item, variant_item, title)
+            # variant_item = QtCore.QVariant(self._plotter)
+            variant_item = QtCore.QVariant(extrapolated_data)
+
+            # This needs to run in the main thread
+            reactor.callFromThread(updateModelItem, self._model_item, variant_item, title)
 
         if self._high_extrapolate:
@@ -275,4 +282,7 @@
             high_out_data = inv.get_extra_data_high(q_end=qmax_plot, npts=500)
 
+            # Convert the data into plottable
+            high_out_data = self._manager.createGuiData(high_out_data)
+
             # find how to add this plot to the existing plot for low_extrapolate
             # Plot the chart
@@ -283,7 +293,8 @@
 
             # Add the plot to the model item
-            variant_item = QtCore.QVariant(self._plotter)
-            updateModelItem(self._model_item, variant_item, title)
-
+            # variant_item = QtCore.QVariant(self._plotter)
+            variant_item = QtCore.QVariant(high_out_data)
+            # This needs to run in the main thread
+            reactor.callFromThread(updateModelItem, self._model_item, variant_item, title)
 
         item = QtGui.QStandardItem(str(float('%.5g'% volume_fraction)))
Index: src/sas/qtgui/Plotter.py
===================================================================
--- src/sas/qtgui/Plotter.py	(revision f721030e66e61dc6279aa8e024da03b25f8e0d42)
+++ src/sas/qtgui/Plotter.py	(revision 1042dbac0d9a9f513386ed723f3d110463dce201)
@@ -79,9 +79,5 @@
         """
         # create an axis
-        #ax = self.figure.add_subplot(self._current_plot)
         ax = self._ax
-
-        # discards the old graph
-        # ax.hold(False)
 
         # plot data with legend
Index: src/sas/qtgui/UnitTesting/DataExplorerTest.py
===================================================================
--- src/sas/qtgui/UnitTesting/DataExplorerTest.py	(revision a281ab82d64e991847f9a04a674fa65868cade0b)
+++ src/sas/qtgui/UnitTesting/DataExplorerTest.py	(revision 1042dbac0d9a9f513386ed723f3d110463dce201)
@@ -9,8 +9,12 @@
 # Local
 from sas.sasgui.guiframe.dataFitting import Data1D
+from sas.sascalc.dataloader.loader import Loader
+from sas.sasgui.guiframe.data_manager import DataManager
+
 from DataExplorer import DataExplorerWindow
 from GuiManager import GuiManager
 from GuiUtils import *
 from UnitTesting.TestUtils import QtSignalSpy
+from Plotter import Plotter
 
 app = QApplication(sys.argv)
@@ -297,4 +301,28 @@
         self.assertTrue(self.form.manager.add_data.called)
 
+    def testNewPlot(self):
+        """
+        Creating new plots from Data1D/2D
+        """
+        loader = Loader()
+        manager = DataManager()
+
+        # get Data1D
+        p_file="cyl_400_20.txt"
+        output_object = loader.load(p_file)
+        new_data = [manager.create_gui_data(output_object, p_file)]
+
+        # Mask the plot show call
+        Plotter.show = MagicMock()
+
+        # Mask retrieval of the data
+        self.form.plotsFromCheckedItems = MagicMock(return_value=new_data)
+
+        # Call the plotting method
+        self.form.newPlot()
+
+        # The plot was displayed
+        self.assertTrue(Plotter.show.called)
+
 
 if __name__ == "__main__":
Index: src/sas/qtgui/UnitTesting/GuiUtilsTest.py
===================================================================
--- src/sas/qtgui/UnitTesting/GuiUtilsTest.py	(revision a281ab82d64e991847f9a04a674fa65868cade0b)
+++ src/sas/qtgui/UnitTesting/GuiUtilsTest.py	(revision 1042dbac0d9a9f513386ed723f3d110463dce201)
@@ -1,4 +1,11 @@
 import sys
 import unittest
+
+from PyQt4 import QtCore
+from PyQt4 import QtGui
+
+# SV imports
+from sas.sascalc.dataloader.loader import Loader
+from sas.sasgui.guiframe.data_manager import DataManager
 
 # Tested module
@@ -12,5 +19,5 @@
 
     def tearDown(self):
-        '''empty'''
+        '''Empty'''
         pass
 
@@ -76,4 +83,82 @@
         self.assertEqual(str(list_from_item[1]), test_list[1])
 
+
+    def testPlotsFromCheckedItems(self):
+        """
+        Test addition of a plottable to the model
+        """
+
+        # Mockup data
+        test_list0 = "FRIDAY"
+        test_list1 = "SATURDAY"
+        test_list2 = "MONDAY"
+
+        # Main item ("file")
+        checkbox_model = QtGui.QStandardItemModel()
+        checkbox_item = QtGui.QStandardItem(True)
+        checkbox_item.setCheckable(True)
+        checkbox_item.setCheckState(QtCore.Qt.Checked)
+        test_item0 = QtGui.QStandardItem()
+        test_item0.setData(QtCore.QVariant(test_list0))
+
+        # Checked item 1
+        test_item1 = QtGui.QStandardItem(True)
+        test_item1.setCheckable(True)
+        test_item1.setCheckState(QtCore.Qt.Checked)
+        object_item = QtGui.QStandardItem()
+        object_item.setData(QtCore.QVariant(test_list1))
+        test_item1.setChild(0, object_item)
+
+        checkbox_item.setChild(0, test_item0)
+        checkbox_item.appendRow(test_item1)
+
+        # Unchecked item 2
+        test_item2 = QtGui.QStandardItem(True)
+        test_item2.setCheckable(True)
+        test_item2.setCheckState(QtCore.Qt.Unchecked)
+        object_item = QtGui.QStandardItem()
+        object_item.setData(QtCore.QVariant(test_list2))
+        test_item2.setChild(0, object_item)
+        checkbox_item.appendRow(test_item2)
+
+        checkbox_model.appendRow(checkbox_item)
+
+        # Pull out the "plottable" documents
+        plot_list = plotsFromCheckedItems(checkbox_model)
+
+        # Make sure only the checked data is present
+        # FRIDAY IN
+        self.assertIn(test_list0, plot_list)
+        # SATURDAY IN
+        self.assertIn(test_list1, plot_list)
+        # MONDAY NOT IN
+        self.assertNotIn(test_list2, plot_list)
+
+    def testInfoFromData(self):
+        """
+        Test Info element extraction from a plottable object
+        """
+        loader = Loader()
+        manager = DataManager()
+
+        # get Data1D
+        p_file="cyl_400_20.txt"
+        output_object = loader.load(p_file)
+        new_data = manager.create_gui_data(output_object, p_file)
+
+        # Extract Info elements into a model item
+        item = infoFromData(new_data)
+
+        # Test the item and its children
+        self.assertIsInstance(item, QtGui.QStandardItem)
+        self.assertEqual(item.rowCount(), 5)
+        self.assertEqual(item.text(), "Info")
+        self.assertIn(p_file,   item.child(0).text())
+        self.assertIn("Run",    item.child(1).text())
+        self.assertIn("Data1D", item.child(2).text())
+        self.assertIn(p_file,   item.child(3).text())
+        self.assertIn("Process",item.child(4).text())
+
+
 if __name__ == "__main__":
     unittest.main()
