Index: src/sas/qtgui/MainWindow/DataExplorer.py
===================================================================
--- src/sas/qtgui/MainWindow/DataExplorer.py	(revision 2eeda9335609875dbf439fe36d6823b0f9067e67)
+++ src/sas/qtgui/MainWindow/DataExplorer.py	(revision a3c59503022182d68f4de9ae4a2c61fa28ddade7)
@@ -268,6 +268,5 @@
         self.communicator.statusBarUpdateSignal.emit("Saving Project... %s\n" % os.path.basename(filename))
 
-        with open(filename, 'w') as outfile:
-            self.saveDataToFile(outfile)
+        return filename
 
     def saveAsAnalysisFile(self, tab_id=1):
@@ -318,7 +317,9 @@
             is_checked = item.checkState()
             properties['checked'] = is_checked
-            other_datas = GuiUtils.plotsFromFilename(filename, model)
+            other_datas = []
+            # no need to save other_datas - things will be refit on read
+            #other_datas = GuiUtils.plotsFromFilename(filename, model)
             # skip the main plot
-            other_datas = list(other_datas.values())[1:]
+            #other_datas = list(other_datas.values())[1:]
             all_data[data.id] = [data, properties, other_datas]
         return all_data
@@ -375,5 +376,13 @@
         with open(filename, 'r') as infile:
             all_data = GuiUtils.readDataFromFile(infile)
-            items = self.updateModelFromData(all_data)
+
+        for key, value in all_data.items():
+            data_dict = {key:value['fit_data']}
+            items = self.updateModelFromData(data_dict)
+            # send newly created item to its perspective
+            if 'fit_params' in value:
+                self.sendItemToPerspective(items[0])
+                # Make the perspective read the rest of the read data
+                self._perspective().updateFromParameters(value['fit_params'])
 
         pass # debugger
Index: src/sas/qtgui/MainWindow/GuiManager.py
===================================================================
--- src/sas/qtgui/MainWindow/GuiManager.py	(revision 2eeda9335609875dbf439fe36d6823b0f9067e67)
+++ src/sas/qtgui/MainWindow/GuiManager.py	(revision a3c59503022182d68f4de9ae4a2c61fa28ddade7)
@@ -554,5 +554,27 @@
         Menu Save Project
         """
-        self.filesWidget.saveProject()
+        filename = self.filesWidget.saveProject()
+
+        # datasets
+        all_data = self.filesWidget.getAllData()
+
+        # fit tabs
+        params = self.perspective().serializeAllFitpage()
+
+        # project dictionary structure:
+        # analysis[data.id] = [{"fit_data":[data, checkbox, child data],
+        #                       "fit_params":[fitpage_state]}
+        # "fit_params" not present if dataset not sent to fitting
+        analysis = {}
+
+        for id, data in all_data.items():
+            data_content = {"fit_data":data}
+            if id in params.keys():
+                # this dataset is represented also by the fit tab. Add to it.
+                data_content["fit_params"] = params[id]
+            analysis[id] = data_content
+
+        with open(filename, 'w') as outfile:
+            GuiUtils.saveData(outfile, analysis)
 
     def actionSave_Analysis(self):
@@ -564,5 +586,5 @@
             return
         # get fit page serialization
-        params = per.getSerializedFitpage()
+        params = per.serializeCurrentFitpage()
         data_id = per.currentTabDataId()
         tab_id = per.currentTab.tab_id
Index: src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py	(revision 2eeda9335609875dbf439fe36d6823b0f9067e67)
+++ src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py	(revision a3c59503022182d68f4de9ae4a2c61fa28ddade7)
@@ -113,8 +113,25 @@
         self.currentTab.onCopyToClipboard("Latex")
 
-    def getSerializedFitpage(self):
+    def serializeAllFitpage(self):
+        # serialize all active fitpages and return
+        # a dictionary: {data_id: fitpage_state}
+        params = {}
+        for i, tab in enumerate(self.tabs):
+            tab_data = self.getSerializedFitpage(tab)
+            if tab.tab_id is None: continue
+            id = tab_data['data_id'][0]
+            params[id] = tab_data
+        return params
+
+    def serializeCurrentFitpage(self):
         # serialize current(active) fitpage
-        fitpage_state = self.currentTab.getFitPage()
-        fitpage_state += self.currentTab.getFitModel()
+        return self.getSerializedFitpage(self.currentTab)
+
+    def getSerializedFitpage(self, tab):
+        """
+        get serialize requested fit tab
+        """
+        fitpage_state = tab.getFitPage()
+        fitpage_state += tab.getFitModel()
         # put the text into dictionary
         line_dict = {}
