Index: src/sas/qtgui/MainWindow/DataExplorer.py
===================================================================
--- src/sas/qtgui/MainWindow/DataExplorer.py	(revision b0c5e8c49a3e4e82f4f885ba7ad4d73fb8d6c59f)
+++ src/sas/qtgui/MainWindow/DataExplorer.py	(revision ee18d3342afd576de16503265ff92e34821fca74)
@@ -352,5 +352,5 @@
 
         # Notify the GuiManager about the send request
-        self._perspective().setData(data_item=selected_items)
+        self._perspective().setData(data_item=selected_items, is_batch=self.chkBatch.isChecked())
 
     def freezeTheory(self, event):
Index: src/sas/qtgui/Perspectives/Fitting/FitThread.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FitThread.py	(revision 7adc2a84d2456b9691bc21cec9f25ad5a71b0aa5)
+++ src/sas/qtgui/Perspectives/Fitting/FitThread.py	(revision ee18d3342afd576de16503265ff92e34821fca74)
@@ -70,9 +70,10 @@
             list_fit_function = ['fit']*fitter_size
             list_q = [None]*fitter_size
+
             inputs = zip(list_map_get_attr, self.fitter, list_fit_function,
                          list_q, list_q, list_handler, list_curr_thread,
                          list_reset_flag)
             result = map(map_apply, inputs)
-            results = (result[0], time.time()-self.starttime)
+            results = (result, time.time()-self.starttime)
             if self.handler:
                 self.completefn(results)
Index: src/sas/qtgui/Perspectives/Fitting/FittingLogic.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingLogic.py	(revision dc5ef150e8b37e01a3b7e253eb5b66d3b82de99c)
+++ src/sas/qtgui/Perspectives/Fitting/FittingLogic.py	(revision ee18d3342afd576de16503265ff92e34821fca74)
@@ -178,13 +178,19 @@
     def computeDataRange(self):
         """
+        Wrapper for calculating the data range based on local dataset
+        """
+        return self.computeRangeFromData(self.data)
+
+    def computeRangeFromData(self, data):
+        """
         Compute the minimum and the maximum range of the data
         return the npts contains in data
         """
         qmin, qmax, npts = None, None, None
-        if isinstance(self.data, Data1D):
+        if isinstance(data, Data1D):
             try:
-                qmin = min(self.data.x)
-                qmax = max(self.data.x)
-                npts = len(self.data.x)
+                qmin = min(data.x)
+                qmax = max(data.x)
+                npts = len(data.x)
             except (ValueError, TypeError):
                 msg = "Unable to find min/max/length of \n data named %s" % \
@@ -195,6 +201,6 @@
             qmin = 0
             try:
-                x = max(np.fabs(self.data.xmin), np.fabs(self.data.xmax))
-                y = max(np.fabs(self.data.ymin), np.fabs(self.data.ymax))
+                x = max(np.fabs(data.xmin), np.fabs(data.xmax))
+                y = max(np.fabs(data.ymin), np.fabs(data.ymax))
             except (ValueError, TypeError):
                 msg = "Unable to find min/max of \n data named %s" % \
@@ -202,4 +208,4 @@
                 raise ValueError, msg
             qmax = np.sqrt(x * x + y * y)
-            npts = len(self.data.data)
+            npts = len(data.data)
         return qmin, qmax, npts
Index: src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py	(revision b0c5e8c49a3e4e82f4f885ba7ad4d73fb8d6c59f)
+++ src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py	(revision ee18d3342afd576de16503265ff92e34821fca74)
@@ -97,9 +97,10 @@
             event.ignore()
 
-    def addFit(self, data):
+    def addFit(self, data, is_batch=False):
         """
         Add a new tab for passed data
         """
         tab	= FittingWidget(parent=self.parent, data=data, tab_id=self.maxIndex+1)
+        tab.is_batch_fitting = is_batch
         # Add this tab to the object library so it can be retrieved by scripting/jupyter
         ObjectLibrary.addObject(self.tabName(), tab)
@@ -133,5 +134,5 @@
         return True
 
-    def setData(self, data_item=None):
+    def setData(self, data_item=None, is_batch=False):
         """
         Assign new dataset to the fitting instance
@@ -149,5 +150,7 @@
             raise AttributeError, msg
 
-        for data in data_item:
+        items = [data_item] if is_batch else data_item
+
+        for data in items:
             # Find the first unassigned tab.
             # If none, open a new tab.
@@ -157,5 +160,5 @@
                 self.tabs[available_tabs.index(True)].data = data
             else:
-                self.addFit(data)
+                self.addFit(data, is_batch=is_batch)
 
     def onFittingOptionsChange(self, fit_engine):
Index: src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision 7adc2a84d2456b9691bc21cec9f25ad5a71b0aa5)
+++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision ee18d3342afd576de16503265ff92e34821fca74)
@@ -48,5 +48,5 @@
 DEFAULT_POLYDISP_FUNCTION = 'gaussian'
 
-USING_TWISTED = True
+USING_TWISTED = False
 
 class FittingWidget(QtGui.QWidget, Ui_FittingWidgetUI):
@@ -65,5 +65,5 @@
 
         # Main Data[12]D holder
-        self.logic = FittingLogic(data=data)
+        self.logic = FittingLogic()
 
         # Globals
@@ -117,10 +117,18 @@
     def data(self, value):
         """ data setter """
-        assert isinstance(value, QtGui.QStandardItem)
+        if isinstance(value, list):
+            self.is_batch_fitting = True
+        else:
+            value = [value]
+
+        assert isinstance(value[0], QtGui.QStandardItem)
         # _index contains the QIndex with data
-        self._index = value
+        self._index = value[0]
+
+        # Keep reference to all datasets for batch
+        self.all_data = value
 
         # Update logics with data items
-        self.logic.data = GuiUtils.dataFromItem(value)
+        self.logic.data = GuiUtils.dataFromItem(value[0])
 
         # Overwrite data type descriptor
@@ -140,4 +148,6 @@
         # Data[12]D passed and set
         self.data_is_loaded = False
+        # Batch/single fitting
+        self.is_batch_fitting = False
         # Current SasModel in view
         self.kernel_module = None
@@ -294,4 +304,11 @@
         self.chk2DView.setVisible(False)
         self.chkMagnetism.setEnabled(self.is2D)
+        # Combo box or label for file name"
+        if self.is_batch_fitting:
+            self.lblFilename.setVisible(False)
+            for dataitem in self.all_data:
+                filename = GuiUtils.dataFromItem(dataitem).filename
+                self.cbFileNames.addItem(filename)
+            self.cbFileNames.setVisible(True)
         # Similarly on other tabs
         self.options_widget.setEnablementOnDataLoad()
@@ -344,4 +361,5 @@
         Set initial control enablement
         """
+        self.cbFileNames.setVisible(False)
         self.cmdFit.setEnabled(False)
         self.cmdPlot.setEnabled(False)
@@ -370,4 +388,5 @@
         self.cbCategory.currentIndexChanged.connect(self.onSelectCategory)
         self.cbModel.currentIndexChanged.connect(self.onSelectModel)
+        self.cbFileNames.currentIndexChanged.connect(self.onSelectBatchFilename)
         # Checkboxes
         self.chk2DView.toggled.connect(self.toggle2D)
@@ -423,4 +442,12 @@
 
         self.respondToModelStructure(model=model, structure_factor=None)
+
+    def onSelectBatchFilename(self, data_index):
+        """
+        Update the logic based on the selected file in batch fitting
+        """
+        self._index = self.all_data[data_index]
+        self.logic.data = GuiUtils.dataFromItem(self.all_data[data_index])
+        self.updateQRange()
 
     def onSelectStructureFactor(self):
@@ -613,5 +640,4 @@
         Perform fitting on the current data
         """
-        fitter = Fit()
 
         # Data going in
@@ -650,21 +676,28 @@
 
         # Parameterize the fitter
-        fitter.set_model(model, fit_id, params_to_fit, data=data,
-                         constraints=constraints)
-
-        fitter.set_data(data=data, id=fit_id, smearer=smearer, qmin=qmin,
-                        qmax=qmax)
-        fitter.select_problem_for_fit(id=fit_id, value=1)
-
-        fitter.fitter_id = page_id
+        fitters = []
+        for fit_index in self.all_data:
+            fitter = Fit()
+            data = GuiUtils.dataFromItem(fit_index)
+            fitter.set_model(model, fit_id, params_to_fit, data=data,
+                             constraints=constraints)
+            qmin, qmax, _ = self.logic.computeRangeFromData(data)
+            fitter.set_data(data=data, id=fit_id, smearer=smearer, qmin=qmin,
+                            qmax=qmax)
+            fitter.select_problem_for_fit(id=fit_id, value=1)
+            fitter.fitter_id = page_id
+            fit_id += 1
+            fitters.append(fitter)
 
         # Create the fitting thread, based on the fitter
+        completefn = self.batchFitComplete if self.is_batch_fitting else self.fitComplete
+
         calc_fit = FitThread(handler=handler,
-                             fn=[fitter],
-                             batch_inputs=batch_inputs,
-                             batch_outputs=batch_outputs,
-                             page_id=list_page_id,
-                             updatefn=updater,
-                             completefn=self.fitComplete)
+                                fn=fitters,
+                                batch_inputs=batch_inputs,
+                                batch_outputs=batch_outputs,
+                                page_id=list_page_id,
+                                updatefn=updater,
+                                completefn=completefn)
 
         if USING_TWISTED:
@@ -696,8 +729,7 @@
         pass
 
-    def fitComplete(self, result):
-        """
-        Receive and display fitting results
-        "result" is a tuple of actual result list and the fit time in seconds
+    def batchFitComplete(self, result):
+        """
+        Receive and display batch fitting results
         """
         #re-enable the Fit button
@@ -705,7 +737,20 @@
         self.cmdFit.setEnabled(True)
 
+        print ("BATCH FITTING FINISHED")
+        # Add the Qt version of wx.aui.AuiNotebook and populate it
+        pass
+
+    def fitComplete(self, result):
+        """
+        Receive and display fitting results
+        "result" is a tuple of actual result list and the fit time in seconds
+        """
+        #re-enable the Fit button
+        self.cmdFit.setText("Fit")
+        self.cmdFit.setEnabled(True)
+
         assert result is not None
 
-        res_list = result[0]
+        res_list = result[0][0]
         res = res_list[0]
         if res.fitness is None or \
Index: src/sas/qtgui/Perspectives/Fitting/UI/FittingWidgetUI.ui
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/UI/FittingWidgetUI.ui	(revision aca8418780d8a7ff9981eb5d811e94ba6de51ac6)
+++ src/sas/qtgui/Perspectives/Fitting/UI/FittingWidgetUI.ui	(revision ee18d3342afd576de16503265ff92e34821fca74)
@@ -20,103 +20,48 @@
    <string>FittingWidget</string>
   </property>
-  <layout class="QGridLayout" name="gridLayout_15">
-   <item row="0" column="0">
-    <widget class="QLabel" name="label">
-     <property name="text">
-      <string>File name:</string>
-     </property>
-    </widget>
-   </item>
-   <item row="0" column="1">
-    <widget class="QLabel" name="lblFilename">
-     <property name="text">
-      <string>None</string>
-     </property>
-    </widget>
-   </item>
-   <item row="0" column="2" colspan="4">
-    <spacer name="horizontalSpacer_4">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>459</width>
-       <height>20</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="2" column="3">
-    <widget class="QPushButton" name="cmdPlot">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="minimumSize">
-      <size>
-       <width>75</width>
-       <height>23</height>
-      </size>
-     </property>
-     <property name="text">
-      <string>Show Plot</string>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="4">
-    <widget class="QPushButton" name="cmdFit">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="minimumSize">
-      <size>
-       <width>75</width>
-       <height>23</height>
-      </size>
-     </property>
-     <property name="text">
-      <string>Fit</string>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="5">
-    <widget class="QPushButton" name="cmdHelp">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="minimumSize">
-      <size>
-       <width>75</width>
-       <height>23</height>
-      </size>
-     </property>
-     <property name="text">
-      <string>Help</string>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="0" colspan="3">
-    <spacer name="horizontalSpacer">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>273</width>
-       <height>20</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="1" column="0" colspan="6">
+  <layout class="QGridLayout" name="gridLayout_4">
+   <item row="0" column="0" colspan="4">
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QLabel" name="label">
+       <property name="text">
+        <string>File name:</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <layout class="QGridLayout" name="gridLayout_3">
+       <item row="0" column="0">
+        <widget class="QComboBox" name="cbFileNames">
+         <property name="sizeAdjustPolicy">
+          <enum>QComboBox::AdjustToContents</enum>
+         </property>
+        </widget>
+       </item>
+       <item row="0" column="1">
+        <widget class="QLabel" name="lblFilename">
+         <property name="text">
+          <string>None</string>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer_4">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>459</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+    </layout>
+   </item>
+   <item row="1" column="0" colspan="4">
     <widget class="QTabWidget" name="tabFitting">
      <property name="currentIndex">
@@ -457,4 +402,74 @@
     </widget>
    </item>
+   <item row="2" column="0">
+    <spacer name="horizontalSpacer">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>273</width>
+       <height>20</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item row="2" column="1">
+    <widget class="QPushButton" name="cmdPlot">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="minimumSize">
+      <size>
+       <width>75</width>
+       <height>23</height>
+      </size>
+     </property>
+     <property name="text">
+      <string>Show Plot</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="2">
+    <widget class="QPushButton" name="cmdFit">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="minimumSize">
+      <size>
+       <width>75</width>
+       <height>23</height>
+      </size>
+     </property>
+     <property name="text">
+      <string>Fit</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="3">
+    <widget class="QPushButton" name="cmdHelp">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="minimumSize">
+      <size>
+       <width>75</width>
+       <height>23</height>
+      </size>
+     </property>
+     <property name="text">
+      <string>Help</string>
+     </property>
+    </widget>
+   </item>
   </layout>
  </widget>
Index: src/sas/qtgui/Perspectives/Invariant/InvariantPerspective.py
===================================================================
--- src/sas/qtgui/Perspectives/Invariant/InvariantPerspective.py	(revision b0c5e8c49a3e4e82f4f885ba7ad4d73fb8d6c59f)
+++ src/sas/qtgui/Perspectives/Invariant/InvariantPerspective.py	(revision ee18d3342afd576de16503265ff92e34821fca74)
@@ -539,5 +539,5 @@
         self.mapper.toFirst()
 
-    def setData(self, data_item):
+    def setData(self, data_item, is_batch=False):
         """
         Obtain a QStandardItem object and dissect it to get Data1D/2D
