Index: src/sas/qtgui/Perspectives/Fitting/ConstraintWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/ConstraintWidget.py	(revision a90c9c517cd3dc80bd31d2952fa50c9b89997fbb)
+++ src/sas/qtgui/Perspectives/Fitting/ConstraintWidget.py	(revision 235d76620f0b9791dd02165c3108348c58cba76e)
@@ -294,4 +294,10 @@
         self.parent.fittingStoppedSignal.emit(self.getTabsForFit())
 
+        # Assure the fitting succeeded
+        if result is None or not result:
+            msg = "Fitting failed. Please ensure correctness of chosen constraints."
+            self.parent.communicate.statusBarUpdateSignal.emit(msg)
+            return
+
         # get the elapsed time
         elapsed = result[1]
@@ -553,5 +559,5 @@
 
         # Check if any constraints present in tab
-        constraint_names = fit_page.getConstraintsForModel()
+        constraint_names = fit_page.getComplexConstraintsForModel()
         constraints = fit_page.getConstraintObjectsForModel()
         if not constraints: 
Index: src/sas/qtgui/Perspectives/Fitting/FitThread.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FitThread.py	(revision b3e8629bf18b74f4214d6552e620fcbc4e73a28c)
+++ src/sas/qtgui/Perspectives/Fitting/FitThread.py	(revision 235d76620f0b9791dd02165c3108348c58cba76e)
@@ -95,5 +95,8 @@
             # print "ERROR IN FIT THREAD: ", traceback.format_exc()
             if self.handler is not None:
-                self.handler.error(msg=traceback.format_exc())
+                self.handler.error(msg=str(ex))
+                self.completefn(None)
+            else:
+                return(None)
 
 
Index: src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision 14ec91c506393c404c69a71e75131fb3d62e4230)
+++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision 235d76620f0b9791dd02165c3108348c58cba76e)
@@ -24,5 +24,5 @@
 import sas.qtgui.Utilities.GuiUtils as GuiUtils
 import sas.qtgui.Utilities.LocalConfig as LocalConfig
-
+from sas.qtgui.Utilities.GridPanel import  BatchOutputPanel
 from sas.qtgui.Utilities.CategoryInstaller import CategoryInstaller
 from sas.qtgui.Plotting.PlotterData import Data1D
@@ -657,15 +657,20 @@
             param = self._model_model.item(row, 0).text()
             value = self._model_model.item(row, 1).text()
-            min = self._model_model.item(row, min_col).text()
-            max = self._model_model.item(row, max_col).text()
+            min_t = self._model_model.item(row, min_col).text()
+            max_t = self._model_model.item(row, max_col).text()
             # Create a Constraint object
-            constraint = Constraint(param=param, value=value, min=min, max=max, func=value)
+            constraint = Constraint(param=param, value=value, min=min_t, max=max_t)
             # Create a new item and add the Constraint object as a child
             item = QtGui.QStandardItem()
             item.setData(constraint)
             self._model_model.item(row, 1).setChild(0, item)
+            # Assumed correctness from the validator
+            value = float(value)
+            # BUMPS calculates log(max-min) without any checks, so let's assign minor range
+            min_v = value - (value/10000.0)
+            max_v = value + (value/10000.0)
             # Set min/max to the value constrained
-            self._model_model.item(row, min_col).setText(value)
-            self._model_model.item(row, max_col).setText(value)
+            self._model_model.item(row, min_col).setText(str(min_v))
+            self._model_model.item(row, max_col).setText(str(max_v))
             self.constraintAddedSignal.emit([row])
             # Show visual hints for the constraint
@@ -735,5 +740,5 @@
         if item.hasChildren():
             c = item.child(0).data()
-            if isinstance(c, Constraint) and c.func:
+            if isinstance(c, Constraint):
                 return True
         return False
@@ -742,4 +747,15 @@
         """
         Finds out if row of the main model has an active constraint child
+        """
+        item = self._model_model.item(row,1)
+        if item.hasChildren():
+            c = item.child(0).data()
+            if isinstance(c, Constraint) and c.active:
+                return True
+        return False
+
+    def rowHasActiveComplexConstraint(self, row):
+        """
+        Finds out if row of the main model has an active, nontrivial constraint child
         """
         item = self._model_model.item(row,1)
@@ -786,15 +802,21 @@
         model_name = self.kernel_module.name
         param_number = self._model_model.rowCount()
-        def preamble(s):
-            func = self._model_model.item(s, 1).child(0).data().func
-            value = self._model_model.item(s, 1).child(0).data().value
-            if func == value:
-                return ""
-
-            return model_name + "."
         params = [(self._model_model.item(s, 0).text(),
-                    #preamble(s) +self._model_model.item(s, 1).child(0).data().func)
                     self._model_model.item(s, 1).child(0).data().func)
                     for s in range(param_number) if self.rowHasActiveConstraint(s)]
+        return params
+
+    def getComplexConstraintsForModel(self):
+        """
+        Return a list of tuples. Each tuple contains constraints mapped as
+        ('constrained parameter', 'function to constrain')
+        e.g. [('sld','5*sld_solvent')].
+        Only for constraints with defined VALUE
+        """
+        model_name = self.kernel_module.name
+        param_number = self._model_model.rowCount()
+        params = [(self._model_model.item(s, 0).text(),
+                    self._model_model.item(s, 1).child(0).data().func)
+                    for s in range(param_number) if self.rowHasActiveComplexConstraint(s)]
         return params
 
@@ -1147,7 +1169,7 @@
         self.setFittingStopped()
 
-        print ("BATCH FITTING FINISHED")
-        # Add the Qt version of wx.aui.AuiNotebook and populate it
-        pass
+        # Show the grid panel
+        grid_window = BatchOutputPanel(parent=self, output_data=result[0])
+        grid_window.show()
 
     def fitComplete(self, result):
@@ -1222,5 +1244,5 @@
         smearing, accuracy, smearing_min, smearing_max = self.smearing_widget.state()
 
-        constraints = self.getConstraintsForModel()
+        constraints = self.getComplexConstraintsForModel()
         smearer = None
         handler = None
Index: src/sas/qtgui/Utilities/LocalConfig.py
===================================================================
--- src/sas/qtgui/Utilities/LocalConfig.py	(revision 14ec91c506393c404c69a71e75131fb3d62e4230)
+++ src/sas/qtgui/Utilities/LocalConfig.py	(revision 235d76620f0b9791dd02165c3108348c58cba76e)
@@ -133,5 +133,5 @@
 
 # Default threading model
-USING_TWISTED = True
+USING_TWISTED = False
 
 # Time out for updating sasview
