Index: src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py	(revision d2007a805f2f66a26d1df36c9ff287c51563446f)
+++ src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py	(revision a3c59503022182d68f4de9ae4a2c61fa28ddade7)
@@ -112,4 +112,48 @@
     def onLatexCopy(self):
         self.currentTab.onCopyToClipboard("Latex")
+
+    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
+        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 = {}
+        for line in fitpage_state:
+            #content = line.split(',')
+            if len(line) > 1:
+                line_dict[line[0]] = line[1:]
+        return line_dict
+
+    def currentTabDataId(self):
+        """
+        Returns the data ID of the current tab
+        """
+        tab_id = None
+        if self.currentTab.data:
+            tab_id = self.currentTab.data.id
+        return tab_id
+
+    def updateFromParameters(self, parameters):
+        """
+        Pass the update parameters to the current fit page
+        """
+        self.currentTab.createPageForParameters(parameters)
 
     def closeEvent(self, event):
@@ -258,4 +302,10 @@
         return True
 
+    def isSerializable(self):
+        """
+        Tell the caller that this perspective writes its state
+        """
+        return True
+
     def setData(self, data_item=None, is_batch=False):
         """
@@ -337,4 +387,13 @@
         pass
 
+    def getCurrentStateAsXml(self):
+        """
+        Returns an XML version of the current state
+        """
+        state = {}
+        for tab in self.tabs:
+            pass
+        return state
+
     @property
     def currentTab(self):
Index: src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision 0c8330329431af321b3152be7c6603fba3dc80ad)
+++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision 0c8330329431af321b3152be7c6603fba3dc80ad)
@@ -52,4 +52,5 @@
 TAB_POLY = 3
 CATEGORY_DEFAULT = "Choose category..."
+MODEL_DEFAULT = "Choose model..."
 CATEGORY_STRUCTURE = "Structure Factor"
 CATEGORY_CUSTOM = "Plugin Models"
@@ -574,6 +575,4 @@
         # Signals from other widgets
         self.communicate.customModelDirectoryChanged.connect(self.onCustomModelChange)
-        self.communicate.saveAnalysisSignal.connect(self.savePageState)
-        #self.communicate.loadAnalysisSignal.connect(self.loadPageState)
         self.smearing_widget.smearingChangedSignal.connect(self.onSmearingOptionsUpdate)
 
@@ -1029,4 +1028,14 @@
         model = self.cbModel.currentText()
 
+        if model == MODEL_DEFAULT:
+            # if the previous category was not the default, keep it.
+            # Otherwise, just return
+            if self._previous_model_index != 0:
+                # We need to block signals, or else state changes on perceived unchanged conditions
+                self.cbModel.blockSignals(True)
+                self.cbModel.setCurrentIndex(self._previous_model_index)
+                self.cbModel.blockSignals(False)
+            return
+
         # Assure the control is active
         if not self.cbModel.isEnabled():
@@ -1035,4 +1044,9 @@
         if not model:
             return
+
+        self.chkMagnetism.setEnabled(self.canHaveMagnetism())
+        self.chkMagnetism.setEnabled(self.canHaveMagnetism())
+        self.tabFitting.setTabEnabled(TAB_MAGNETISM, self.chkMagnetism.isChecked() and self.canHaveMagnetism())
+        self._previous_model_index = self.cbModel.currentIndex()
 
         # Reset parameters to fit
@@ -1213,5 +1227,6 @@
             self._model_model.clear()
             return
-
+        # Wipe out the parameter model
+        self._model_model.clear()
         # Safely clear and enable the model combo
         self.cbModel.blockSignals(True)
@@ -1225,5 +1240,8 @@
         model_list = self.master_category_dict[category]
         # Populate the models combobox
+        self.cbModel.blockSignals(True)
+        self.cbModel.addItem(MODEL_DEFAULT)
         self.cbModel.addItems(sorted([model for (model, _) in model_list]))
+        self.cbModel.blockSignals(False)
 
     def onPolyModelChange(self, top, bottom):
@@ -3410,39 +3428,4 @@
         return report_logic.reportList()
 
-    def savePageState(self):
-        """
-        Create and serialize local PageState
-        """
-        filepath = self.saveAsAnalysisFile()
-        if filepath is None or filepath == "":
-            return
-
-        fitpage_state = self.getFitPage()
-        fitpage_state += self.getFitModel()
-
-        with open(filepath, 'w') as statefile:
-            for line in fitpage_state:
-                statefile.write(str(line))
-
-        self.communicate.statusBarUpdateSignal.emit('Analysis saved.')
-
-    def saveAsAnalysisFile(self):
-        """
-        Show the save as... dialog and return the chosen filepath
-        """
-        default_name = "FitPage"+str(self.tab_id)+".fitv"
-
-        wildcard = "fitv files (*.fitv)"
-        kwargs = {
-            'caption'   : 'Save As',
-            'directory' : default_name,
-            'filter'    : wildcard,
-            'parent'    : None,
-        }
-        # Query user for filename.
-        filename_tuple = QtWidgets.QFileDialog.getSaveFileName(**kwargs)
-        filename = filename_tuple[0]
-        return filename
-
     def loadPageStateCallback(self,state=None, datainfo=None, format=None):
         """
@@ -3563,4 +3546,7 @@
         """
         param_list = []
+        if self.kernel_module is None:
+            return param_list
+
         param_list.append(['model_name', str(self.cbModel.currentText())])
 
@@ -3667,5 +3653,4 @@
         cb_text = cb.text()
 
-        context = {}
         lines = cb_text.split(':')
         if lines[0] != 'sasview_parameter_values':
@@ -3679,8 +3664,29 @@
                 line_dict[content[0]] = content[1:]
 
+        self.updatePageWithParameters(line_dict)
+
+    def createPageForParameters(self, line_dict):
+        """
+        Sets up page with requested model/str factor
+        and fills it up with sent parameters
+        """
+        if 'fitpage_category' in line_dict:
+            self.cbCategory.setCurrentIndex(self.cbCategory.findText(line_dict['fitpage_category'][0]))
+        if 'fitpage_model' in line_dict:
+            self.cbModel.setCurrentIndex(self.cbModel.findText(line_dict['fitpage_model'][0]))
+        if 'fitpage_structure' in line_dict:
+            self.cbStructureFactor.setCurrentIndex(self.cbStructureFactor.findText(line_dict['fitpage_structure'][0]))
+
+        # Now that the page is ready for parameters, fill it up
+        self.updatePageWithParameters(line_dict)
+
+    def updatePageWithParameters(self, line_dict):
+        """
+        Update FitPage with parameters in line_dict
+        """
+        if 'model_name' not in line_dict.keys():
+            return
         model = line_dict['model_name'][0]
-
-        if 'model_name' not in line_dict.keys():
-            return False
+        context = {}
 
         if 'multiplicity' in line_dict.keys():
Index: src/sas/qtgui/Perspectives/Fitting/UnitTesting/ComplexConstraintTest.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/UnitTesting/ComplexConstraintTest.py	(revision 725d9c06c2a66018f1352faba2f96cd31d8e9654)
+++ src/sas/qtgui/Perspectives/Fitting/UnitTesting/ComplexConstraintTest.py	(revision 2eeda9335609875dbf439fe36d6823b0f9067e67)
@@ -34,6 +34,11 @@
         category_index = self.tab1.cbCategory.findText("Shape Independent")
         self.tab1.cbCategory.setCurrentIndex(category_index)
+        model_index = self.tab1.cbModel.findText("be_polyelectrolyte")
+        self.tab1.cbModel.setCurrentIndex(model_index)
+
         category_index = self.tab2.cbCategory.findText("Cylinder")
         self.tab2.cbCategory.setCurrentIndex(category_index)
+        model_index = self.tab2.cbModel.findText("barbell")
+        self.tab2.cbModel.setCurrentIndex(model_index)
 
         tabs = [self.tab1, self.tab2]
Index: src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py	(revision ec4a14367fbe5c81c560b98221b989122cfc2d44)
+++ src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py	(revision ec4a14367fbe5c81c560b98221b989122cfc2d44)
@@ -175,7 +175,9 @@
         category_index = self.widget.cbCategory.findText("Shape Independent")
         self.widget.cbCategory.setCurrentIndex(category_index)
+        model_index = self.widget.cbModel.findText("be_polyelectrolyte")
+        self.widget.cbModel.setCurrentIndex(model_index)
 
         # test the model combo content
-        self.assertEqual(self.widget.cbModel.count(), 28)
+        self.assertEqual(self.widget.cbModel.count(), 30)
 
         # Try to change back to default
@@ -201,4 +203,6 @@
         category_index = self.widget.cbCategory.findText("Shape Independent")
         self.widget.cbCategory.setCurrentIndex(category_index)
+        model_index = self.widget.cbModel.findText("be_polyelectrolyte")
+        self.widget.cbModel.setCurrentIndex(model_index)
 
         # check the enablement of controls
@@ -215,5 +219,9 @@
         # 
         # Now change the model
+<<<<<<< HEAD
+        self.widget.cbModel.setCurrentIndex(4)
+=======
         self.widget.cbModel.setCurrentIndex(2)
+>>>>>>> ESS_GUI
         self.assertEqual(self.widget.cbModel.currentText(),'dab')
 
@@ -226,5 +234,5 @@
         self.widget.data_is_loaded = True
         # Reset the sasmodel index
-        self.widget.cbModel.setCurrentIndex(1)
+        self.widget.cbModel.setCurrentIndex(2)
         self.assertEqual(self.widget.cbModel.currentText(),'broad_peak')
 
@@ -377,4 +385,7 @@
         category_index = self.widget.cbCategory.findText("Shape Independent")
         self.widget.cbCategory.setCurrentIndex(category_index)
+        model_index = self.widget.cbModel.findText("be_polyelectrolyte")
+        self.widget.cbModel.setCurrentIndex(model_index)
+
         # Check the poly model
         self.assertEqual(self.widget._poly_model.rowCount(), 0)
@@ -383,4 +394,5 @@
         # Change the category index so we have a model available
         self.widget.cbCategory.setCurrentIndex(2)
+        self.widget.cbModel.setCurrentIndex(1)
 
         # Check the poly model
@@ -556,4 +568,6 @@
         category_index = self.widget.cbCategory.findText("Sphere")
         self.widget.cbCategory.setCurrentIndex(category_index)
+        model_index = self.widget.cbModel.findText("adsorbed_layer")
+        self.widget.cbModel.setCurrentIndex(model_index)
 
         # Check the magnetic model
@@ -634,4 +648,6 @@
         category_index = self.widget.cbCategory.findText("Sphere")
         self.widget.cbCategory.setCurrentIndex(category_index)
+        model_index = self.widget.cbModel.findText("adsorbed_layer")
+        self.widget.cbModel.setCurrentIndex(model_index)
 
         # Check the enablement/text
@@ -973,4 +989,6 @@
         category_index = self.widget.cbCategory.findText("Sphere")
         self.widget.cbCategory.setCurrentIndex(category_index)
+        model_index = self.widget.cbModel.findText("adsorbed_layer")
+        self.widget.cbModel.setCurrentIndex(model_index)
         self.widget.main_params_to_fit = ['scale']
 
@@ -986,5 +1004,5 @@
         self.assertListEqual(fp.main_params_to_fit, ['scale'])
 
-    def testPushFitPage(self):
+    def notestPushFitPage(self):
         """
         Push current state of fitpage onto stack
@@ -997,4 +1015,6 @@
         self.widget.data = item
         category_index = self.widget.cbCategory.findText("Sphere")
+        model_index = self.widget.cbModel.findText("adsorbed_layer")
+        self.widget.cbModel.setCurrentIndex(model_index)
 
         # Asses the initial state of stack
