Index: src/sas/qtgui/MainWindow/DataExplorer.py
===================================================================
--- src/sas/qtgui/MainWindow/DataExplorer.py	(revision 4396300670e51d335d13cd0115cabe33dd705a25)
+++ src/sas/qtgui/MainWindow/DataExplorer.py	(revision 17e2d502f3eee0b33fe32c43efbfb449831ddf14)
@@ -373,4 +373,6 @@
 
         all_data = {}
+        all_data['is_batch'] = str(self.chkBatch.isChecked())
+
         for key, value in data.items():
             all_data[key] = value
@@ -414,12 +416,57 @@
 
         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:
+            if key=='is_batch':
+                self.chkBatch.setChecked(True if value=='True' else False)
+                continue
+            # send newly created items to the perspective
+            self.updatePerspectiveWithProperties(key, value)
+
+        # See if there are any batch pages defined and create them, if so
+        self.updateWithBatchPages(all_data)
+
+    def updateWithBatchPages(self, all_data):
+        """
+        Checks all properties and see if there are any batch pages defined.
+        If so, pull out relevant indices and recreate the batch page(s)
+        """
+        batch_page_counter = 0
+        # {counter:[[item1, item2,...], {properties}]}
+        batch_page_dict = {}
+        batch_pages = []
+        for key, value in all_data.items():
+            if 'fit_params' not in value:
+                continue
+            params = value['fit_params']
+            for page in params:
+                if page['is_batch_fitting'][0] != 'True':
+                    continue
+                batch_ids = page['data_id']
+                batch_pages.append(batch_ids)
+        # Now we have all batchpages in batch_pages.
+        # remove duplicates
+        #for page in batch_pages:
+        #    if page in 
+
+    def updatePerspectiveWithProperties(self, key, value):
+        """
+        """
+        data_dict = {key:value['fit_data']}
+        # Create new model items in the data explorer
+        items = self.updateModelFromData(data_dict)
+
+        if 'fit_params' in value:
+            params = value['fit_params']
+            # Make the perspective read the rest of the read data
+            if not isinstance(params, list):
+                params = [params]
+            for page in params:
+                # Check if this set of parameters is for a batch page
+                # if so, skip the update
+                if page['is_batch_fitting'][0] == 'True':
+                    continue
+                # Send current model item to the perspective
                 self.sendItemToPerspective(items[0])
-                # Make the perspective read the rest of the read data
-                self._perspective().updateFromParameters(value['fit_params'])
-
+                # Assign parameters to the most recent (current) page.
+                self._perspective().updateFromParameters(page)
         pass # debugger
 
@@ -430,15 +477,7 @@
         with open(filename, 'r') as infile:
             all_data = GuiUtils.readDataFromFile(infile)
-            # simulate full project structure
-            all_data_dict = {1:all_data['fit_data']}
-            items = self.updateModelFromData(all_data_dict)
-            # TODO: allow other perspectives
-            # send newly created item to its perspective
-            if len(items) > 0:
-                self.sendItemToPerspective(items[0])
-            # Make the perspective read the rest of the read data
-            self._perspective().updateFromParameters(all_data['fit_params'])
-
-            pass
+
+            # send newly created items to the perspective
+            self.updatePerspectiveWithProperties(1, all_data)
 
     def updateModelFromData(self, data):
@@ -449,5 +488,4 @@
         # model items for top level datasets
         items = []
-        #self.model.beginResetModel()
         for key, value in data.items():
             # key - cardinal number of dataset
@@ -455,4 +493,7 @@
             # add the main index
             if not value: continue
+            #if key=='is_batch':
+            #    self.chkBatch.setChecked(True if value=='True' else False)
+            #    continue
             new_data = value[0]
             from sas.sascalc.dataloader.data_info import Data1D as old_data1d
Index: src/sas/qtgui/MainWindow/GuiManager.py
===================================================================
--- src/sas/qtgui/MainWindow/GuiManager.py	(revision 0c8330329431af321b3152be7c6603fba3dc80ad)
+++ src/sas/qtgui/MainWindow/GuiManager.py	(revision 17e2d502f3eee0b33fe32c43efbfb449831ddf14)
@@ -579,4 +579,7 @@
 
         for id, data in all_data.items():
+            if id=='is_batch':
+                analysis['is_batch'] = data
+                continue
             data_content = {"fit_data":data}
             if id in params.keys():
Index: src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py	(revision a3c59503022182d68f4de9ae4a2c61fa28ddade7)
+++ src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py	(revision 17e2d502f3eee0b33fe32c43efbfb449831ddf14)
@@ -120,6 +120,17 @@
             tab_data = self.getSerializedFitpage(tab)
             if tab.tab_id is None: continue
+            if 'data_id' not in tab_data: continue
             id = tab_data['data_id'][0]
-            params[id] = tab_data
+            if isinstance(id, list):
+                for i in id:
+                    if i in params:
+                        params[i].append(tab_data)
+                    else:
+                        params[i] = [tab_data]
+            else:
+                if id in params:
+                    params[id].append(tab_data)
+                else:
+                    params[id] = [tab_data]
         return params
 
Index: src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision 48df831ee6be1939f8412e7ae7c2aa2d439d3a0f)
+++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision 17e2d502f3eee0b33fe32c43efbfb449831ddf14)
@@ -3512,8 +3512,19 @@
 
         param_list.append(['is_data', str(self.data_is_loaded)])
-        if self.data_is_loaded:
-            param_list.append(['data_id', str(self.logic.data.id)])
-            param_list.append(['data_name', str(self.logic.data.filename)])
-
+        data_ids = []
+        filenames = []
+        if self.is_batch_fitting:
+            for item in self.all_data:
+                # need item->data->data_id
+                data = GuiUtils.dataFromItem(item)
+                data_ids.append(data.id)
+                filenames.append(data.filename)
+        else:
+            if self.data_is_loaded:
+                data_ids = [str(self.logic.data.id)]
+                filenames = [str(self.logic.data.filename)]
+        param_list.append(['is_batch_fitting', str(self.is_batch_fitting)])
+        param_list.append(['data_name', filenames])
+        param_list.append(['data_id', data_ids])
         # option tab
         param_list.append(['q_range_min', str(self.q_range_min)])
Index: src/sas/qtgui/Utilities/GuiUtils.py
===================================================================
--- src/sas/qtgui/Utilities/GuiUtils.py	(revision 4396300670e51d335d13cd0115cabe33dd705a25)
+++ src/sas/qtgui/Utilities/GuiUtils.py	(revision 17e2d502f3eee0b33fe32c43efbfb449831ddf14)
@@ -1198,4 +1198,6 @@
 def readDataFromFile(fp):
     '''
+    Reads in Data1D/Data2 datasets from the file.
+    Datasets are stored in the JSON format.
     '''
     supported = [
