Index: src/sas/qtgui/DataExplorer.py
===================================================================
--- src/sas/qtgui/DataExplorer.py	(revision 5032ea687fa17c1323c1124c0a7aa9d80184bf0b)
+++ src/sas/qtgui/DataExplorer.py	(revision a281ab82d64e991847f9a04a674fa65868cade0b)
@@ -16,4 +16,7 @@
 # UI
 from UI.TabbedFileLoadUI import DataLoadWidget
+
+# This is how to get data1/2D from the model item
+# data = [selected_items[0].child(0).data().toPyObject()]
 
 class DataExplorerWindow(DataLoadWidget):
@@ -150,6 +153,7 @@
             retval = msgbox.exec_()
             return
-        # Dig up data from model
-        data = [selected_items[0].child(0).data().toPyObject()]
+
+        # Dig up the item
+        data = selected_items
 
         # TODO
@@ -157,5 +161,5 @@
 
         # Notify the GuiManager about the send request
-        self._perspective.setData(data_list=data)
+        self._perspective.setData(data_item=data)
 
 
@@ -272,5 +276,5 @@
             message = "Loading Data Complete! "
         message += log_msg
-        return (output, message)
+        return output, message
 
     def getWlist(self):
@@ -375,13 +379,17 @@
 
 
-    def loadComplete(self, output, message=""):
+    def loadComplete(self, output):
         """
         Post message to status bar and update the data manager
         """
         self.model.reset()
+        assert(type(output), tuple)
+
+        output_data = output[0]
+        message = output[1]
         # Notify the manager of the new data available
         self.communicate.statusBarUpdateSignal.emit(message)
-        self.communicate.fileDataReceivedSignal.emit(output)
-        self.manager.add_data(data_list=output)
+        self.communicate.fileDataReceivedSignal.emit(output_data)
+        self.manager.add_data(data_list=output_data)
 
     def updateModel(self, data, p_file):
@@ -429,10 +437,18 @@
     def updateModelFromPerspective(self, model_item):
         """
-        """
-        # Overwrite the index with what we got from the perspective
+        Receive an update model item from a perspective
+        Make sure it is valid and if so, replace it in the model
+        """
+        # Assert the correct type
         if type(model_item) != QtGui.QStandardItem:
             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)
+
         # Reset the view
         self.model.reset()
Index: src/sas/qtgui/GuiUtils.py
===================================================================
--- src/sas/qtgui/GuiUtils.py	(revision 5032ea687fa17c1323c1124c0a7aa9d80184bf0b)
+++ src/sas/qtgui/GuiUtils.py	(revision a281ab82d64e991847f9a04a674fa65868cade0b)
@@ -205,3 +205,31 @@
 
     # New data in current perspective
-    updateModelFromPerspectiveSignal = QtCore.pyqtSignal(Data1D)
+    updateModelFromPerspectiveSignal = QtCore.pyqtSignal(QtGui.QStandardItem)
+
+def updateModelItem(item, update_data, name=""):
+    """
+    Updates QStandardItem with a checkboxed row named 'name'
+    and containing QVariant 'update_data'
+    """
+    assert type(item) == QtGui.QStandardItem
+    assert type(update_data) == QtCore.QVariant
+
+    checkbox_item = QtGui.QStandardItem(True)
+    checkbox_item.setCheckable(True)
+    checkbox_item.setCheckState(QtCore.Qt.Checked)
+    checkbox_item.setText(name)
+
+    # Add "Info" item
+    info_item = QtGui.QStandardItem("Info")
+
+    # Add the actual Data1D/Data2D object
+    object_item = QtGui.QStandardItem()
+    object_item.setData(update_data)
+
+    checkbox_item.setChild(0, object_item)
+
+    # Set info_item as the only child
+    checkbox_item.setChild(1, info_item)
+
+    # Append the new row to the main item
+    item.appendRow(checkbox_item)
Index: src/sas/qtgui/Perspectives/Invariant/InvariantPerspective.py
===================================================================
--- src/sas/qtgui/Perspectives/Invariant/InvariantPerspective.py	(revision 5032ea687fa17c1323c1124c0a7aa9d80184bf0b)
+++ src/sas/qtgui/Perspectives/Invariant/InvariantPerspective.py	(revision a281ab82d64e991847f9a04a674fa65868cade0b)
@@ -12,4 +12,5 @@
 from sas.sasgui.guiframe.dataFitting import Data1D
 from sas.qtgui.GuiUtils import Communicate
+from sas.qtgui.GuiUtils import updateModelItem
 
 # local
@@ -35,5 +36,4 @@
         self._model.appendRow(item)
 
-# class InvariantWindow(InvariantUI):
 class InvariantWindow(tabbedInvariantUI):
     # The controller which is responsible for managing signal slots connections
@@ -53,4 +53,5 @@
         self._manager = manager
         self._reactor = self._manager.reactor()
+        self._model_item = QtGui.QStandardItem()
 
         self._helpView = QtWebKit.QWebView()
@@ -119,5 +120,5 @@
         self._high_power_value  = float(self.model.item(WIDGETS.W_HIGHQ_POWER_VALUE).text())
 
-    def calculate(self):
+    def calculateInvariant(self):
         """
         Use twisted to thread the calculations away.
@@ -151,5 +152,6 @@
         """
         """
-        self._plotter.show()
+        if self._low_extrapolate or self._high_extrapolate:
+            self._plotter.show()
         self.model = model
         self.mapper.toFirst()
@@ -160,6 +162,6 @@
         self.pushButton.setStyleSheet(self.style)
 
-        # Send the new data to DE for keeping in the model
-        self.communicate.updateModelFromPerspectiveSignal.emit(self._data)
+        # Send the modified model item to DE for keeping in the model
+        self.communicate.updateModelFromPerspectiveSignal.emit(self._model_item)
 
 
@@ -255,8 +257,12 @@
 
             # Plot the chart
+            title = "Low-Q extrapolation"
             self._plotter.data(extrapolated_data)
-            self._plotter.title("Low-Q extrapolation")
+            self._plotter.title(title)
             self._plotter.plot()
 
+            # Add the plot to the model item
+            variant_item = QtCore.QVariant(self._plotter)
+            updateModelItem(self._model_item, variant_item, title)
 
         if self._high_extrapolate:
@@ -271,7 +277,12 @@
             # find how to add this plot to the existing plot for low_extrapolate
             # Plot the chart
+            title = "High-Q extrapolation"
             self._plotter.data(high_out_data)
-            self._plotter.title("High-Q extrapolation")
+            self._plotter.title(title)
             self._plotter.plot()
+
+            # Add the plot to the model item
+            variant_item = QtCore.QVariant(self._plotter)
+            updateModelItem(self._model_item, variant_item, title)
 
 
@@ -326,5 +337,5 @@
 
     def setupSlots(self):
-        self.pushButton.clicked.connect(self.calculate)
+        self.pushButton.clicked.connect(self.calculateInvariant)
         self.pushButton_2.clicked.connect(self.status)
         self.pushButton_3.clicked.connect(self.help)
@@ -489,7 +500,29 @@
         self.mapper.toFirst()
 
-    def setData(self, data_list=None):
+    def setData(self, data_item):
+        """
+        Obtain a QStandardItem object and dissect it to get Data1D/2D
+        Pass it over to the calculator
+        """
+        if not isinstance(data_item, list):
+            msg = "Incorrect type passed to the Invariant Perspective"
+            raise AttributeError, msg
+
+        if not isinstance(data_item[0], QtGui.QStandardItem):
+            msg = "Incorrect type passed to the Invariant Perspective"
+            raise AttributeError, msg
+
+        self._model_item = data_item[0]
+
+        # Extract data on 1st child - this is the Data1D/2D component
+        data = self._model_item.child(0).data().toPyObject()
+
+        self.calculate(data_list=[data])
+        
+    def calculate(self, data_list=None):
         """
         receive a list of data and compute invariant
+
+        TODO: pass warnings/messages to log
         """
         msg = ""
@@ -520,6 +553,8 @@
                     #wx.PostEvent(self.parent, StatusEvent(status=msg, info='error'))
                     return
-                msg += "Invariant panel does not allow multiple data!\n"
-                msg += "Please select one.\n"
+
+                # TODO: add msgbox for data choice
+                #msg += "Invariant panel does not allow multiple data!\n"
+                #msg += "Please select one.\n"
                 #if len(data_list) > 1:
                     #from invariant_widgets import DataDialog
@@ -545,5 +580,5 @@
                     self._data = data
                     self._path = "unique path"
-                    self.calculate()
+                    self.calculateInvariant()
                 except:
                     msg = "Invariant Set_data: " + str(sys.exc_value)
Index: src/sas/qtgui/UnitTesting/DataExplorerTest.py
===================================================================
--- src/sas/qtgui/UnitTesting/DataExplorerTest.py	(revision 5032ea687fa17c1323c1124c0a7aa9d80184bf0b)
+++ src/sas/qtgui/UnitTesting/DataExplorerTest.py	(revision a281ab82d64e991847f9a04a674fa65868cade0b)
@@ -1,6 +1,4 @@
 import sys
 import unittest
-#from twisted.trial import unittest
-#from twisted.internet import reactor, defer, interfaces, threads, protocol, error
 
 from PyQt4.QtGui import *
@@ -27,5 +25,5 @@
             def allowBatch(self):
                 return False
-            def setData(self, data_list=None):
+            def setData(self, data_item=None):
                 return None
             def title(self):
@@ -271,5 +269,7 @@
         """
 
+        message="Loading Data Complete"
         data_dict = {"a1":Data1D()}
+        output_data = (data_dict, message)
 
         self.form.manager.add_data = MagicMock()
@@ -280,5 +280,5 @@
 
         # Read in the file
-        self.form.loadComplete(data_dict, message="Loading Data Complete")
+        self.form.loadComplete(output_data)
 
         # "Loading data complete" no longer sent in LoadFile but in callback
Index: src/sas/qtgui/UnitTesting/GuiUtilsTest.py
===================================================================
--- src/sas/qtgui/UnitTesting/GuiUtilsTest.py	(revision f721030e66e61dc6279aa8e024da03b25f8e0d42)
+++ src/sas/qtgui/UnitTesting/GuiUtilsTest.py	(revision a281ab82d64e991847f9a04a674fa65868cade0b)
@@ -0,0 +1,80 @@
+import sys
+import unittest
+
+# Tested module
+from GuiUtils import *
+
+class GuiUtilsTest(unittest.TestCase):
+    '''Test the GUI Utilities methods'''
+    def setUp(self):
+        '''Empty'''
+        pass
+
+    def tearDown(self):
+        '''empty'''
+        pass
+
+    def testDefaults(self):
+        """
+        Test all the global constants defined in the file.
+        """
+        # Should probably test the constants in the file,
+        # but this will done after trimming down GuiUtils
+        # and retaining only necessary variables.
+        pass
+
+    def testGetAppDir(self):
+        """
+        """
+        pass
+
+    def testGetUserDirectory(self):
+        """
+        Simple test of user directory getter
+        """
+        home_dir = os.path.expanduser("~")
+        self.assertIn(home_dir, get_user_directory())
+
+    def testCommunicate(self):
+        """
+        Test the container class with signal definitions
+        """
+        com = Communicate()
+
+        # All defined signals
+        list_of_signals = [
+            'fileReadSignal',
+            'fileDataReceivedSignal',
+            'statusBarUpdateSignal',
+            'updatePerspectiveWithDataSignal',
+            'updateModelFromPerspectiveSignal'
+        ]
+
+        # Assure all signals are defined.
+        for signal in list_of_signals:
+            self.assertIn(signal, dir(com))
+
+
+    def testUpdateModelItem(self):
+        """
+        Test the QModelItem update method
+        """
+        test_item = QtGui.QStandardItem()
+        test_list = ['aa','11']
+        update_data = QtCore.QVariant(test_list)
+        name = "Black Sabbath"
+
+        # update the item
+        updateModelItem(test_item, update_data, name)
+        
+        # Make sure test_item got all data added
+        self.assertEqual(test_item.child(0).text(), name)
+        self.assertTrue(test_item.child(0).isCheckable())
+        list_from_item = test_item.child(0).child(0).data().toPyObject()
+        self.assertIsInstance(list_from_item, list)
+        self.assertEqual(str(list_from_item[0]), test_list[0])
+        self.assertEqual(str(list_from_item[1]), test_list[1])
+
+if __name__ == "__main__":
+    unittest.main()
+
Index: src/sas/qtgui/run_tests.sh
===================================================================
--- src/sas/qtgui/run_tests.sh	(revision 5032ea687fa17c1323c1124c0a7aa9d80184bf0b)
+++ src/sas/qtgui/run_tests.sh	(revision a281ab82d64e991847f9a04a674fa65868cade0b)
@@ -1,6 +1,7 @@
-# python -m UnitTesting.TestUtilsTest
-# python -m UnitTesting.WelcomePanelTest
+python -m UnitTesting.TestUtilsTest
+python -m UnitTesting.WelcomePanelTest
 python -m UnitTesting.DataExplorerTest
-# python -m UnitTesting.GuiManagerTest
-# python -m UnitTesting.MainWindowTest
+python -m UnitTesting.GuiManagerTest
+python -m UnitTesting.MainWindowTest
+python -m UnitTesting.GuiUtilsTest
 
