Index: src/sas/qtgui/DataExplorer.py
===================================================================
--- src/sas/qtgui/DataExplorer.py	(revision 1af348e374c1979b8fa98dcf40e27d60c8e4e9c0)
+++ src/sas/qtgui/DataExplorer.py	(revision 630155bd6fe781772e87d6b5b374bff847bca873)
@@ -30,5 +30,5 @@
     # for the gui and providing an interface to the data model.
 
-    def __init__(self, parent=None, guimanager=None):
+    def __init__(self, parent=None, guimanager=None, manager=None):
         super(DataExplorerWindow, self).__init__(parent, guimanager)
 
@@ -43,5 +43,5 @@
         self.parent = guimanager
         self.loader = Loader()
-        self.manager = DataManager()
+        self.manager = manager if manager is not None else DataManager()
         self.txt_widget = QtGui.QTextEdit(None)
         # self.txt_widget = GuiUtils.DisplayWindow()
@@ -164,4 +164,58 @@
 
         self.loadFromURL(path_str)
+
+    def loadProject(self):
+        """
+        Called when the "Open Project" menu item chosen.
+        """
+        kwargs = {
+            'parent'    : self,
+            'caption'   : 'Open Project',
+            'filter'    : 'Project (*.json);;All files (*.*)',
+            'options'   : QtGui.QFileDialog.DontUseNativeDialog
+        }
+        filename = str(QtGui.QFileDialog.getOpenFileName(**kwargs))
+        if filename:
+            load_thread = threads.deferToThread(self.readProject, filename)
+            load_thread.addCallback(self.readProjectComplete)
+
+    def readProject(self, filename):
+        self.communicator.statusBarUpdateSignal.emit("Loading Project... %s" % os.path.basename(filename))
+        try:
+            manager = DataManager()
+            with open(filename, 'r') as infile:
+                manager.load_from_readable(infile)
+
+            self.communicator.statusBarUpdateSignal.emit("Loaded Project: %s" % os.path.basename(filename))
+            return manager
+
+        except:
+            self.communicator.statusBarUpdateSignal.emit("Failed: %s" % os.path.basename(filename))
+            raise
+
+    def readProjectComplete(self, manager):
+        self.model.clear()
+
+        self.manager.assign(manager)
+        for id, item in self.manager.get_all_data().iteritems():
+            self.updateModel(item.data, item.path)
+
+        self.model.reset()
+
+    def saveProject(self):
+        """
+        Called when the "Save Project" menu item chosen.
+        """
+        kwargs = {
+            'parent'    : self,
+            'caption'   : 'Save Project',
+            'filter'    : 'Project (*.json)',
+            'options'   : QtGui.QFileDialog.DontUseNativeDialog
+        }
+        filename = str(QtGui.QFileDialog.getSaveFileName(**kwargs))
+        if filename:
+            self.communicator.statusBarUpdateSignal.emit("Saving Project... %s\n" % os.path.basename(filename))
+            with open(filename, 'w') as outfile:
+                self.manager.save_to_writable(outfile)
 
     def deleteFile(self, event):
Index: src/sas/qtgui/GuiManager.py
===================================================================
--- src/sas/qtgui/GuiManager.py	(revision f51ed677cd8461e82d4cf08d0c78ef678c8f9433)
+++ src/sas/qtgui/GuiManager.py	(revision 630155bd6fe781772e87d6b5b374bff847bca873)
@@ -111,5 +111,5 @@
         """
         # Add FileDialog widget as docked
-        self.filesWidget = DataExplorerWindow(self._parent, self)
+        self.filesWidget = DataExplorerWindow(self._parent, self, manager=self._data_manager)
 
         self.dockedFilesWidget = QtGui.QDockWidget("Data Explorer", self._workspace)
@@ -391,7 +391,7 @@
     def actionOpen_Project(self):
         """
-        """
-        print("actionOpen_Project TRIGGERED")
-        pass
+        Menu Open Project
+        """
+        self.filesWidget.loadProject()
 
     def actionOpen_Analysis(self):
@@ -403,7 +403,7 @@
     def actionSave(self):
         """
-        """
-        print("actionSave TRIGGERED")
-        pass
+        Menu Save Project
+        """
+        self.filesWidget.saveProject()
 
     def actionSave_Analysis(self):
