Index: src/sas/qtgui/Perspectives/Fitting/ConstraintWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/ConstraintWidget.py	(revision 116dd4c1f555326683a1e22876683ebde4458258)
+++ src/sas/qtgui/Perspectives/Fitting/ConstraintWidget.py	(revision c6343a556733c6d21b013c057bf4616360630466)
@@ -93,5 +93,4 @@
 
         # External signals
-        #self.parent.tabsModifiedSignal.connect(self.initializeFitList)
         self.parent.tabsModifiedSignal.connect(self.onModifiedTabs)
 
@@ -135,8 +134,23 @@
         fitter_id = 0
         sim_fitter=[sim_fitter]
-        for tab in tabs_to_fit:
-            tab_object = ObjectLibrary.getObject(tab)
-            sim_fitter, fitter_id = tab_object.prepareFitters(fitter=sim_fitter[0], fit_id=fitter_id)
-            page_ids.append([tab_object.page_id])
+        # Prepare the fitter object
+        try:
+            for tab in tabs_to_fit:
+                tab_object = ObjectLibrary.getObject(tab)
+                if tab_object is None:
+                    # No such tab!
+                    return
+                sim_fitter, fitter_id = tab_object.prepareFitters(fitter=sim_fitter[0], fit_id=fitter_id)
+                page_ids.append([tab_object.page_id])
+        except ValueError as ex:
+            # No parameters selected in one of the tabs
+            no_params_msg = "Fitting can not be performed.\n" +\
+                            "Not all tabs chosen for fitting have parameters selected for fitting."
+            reply = QtWidgets.QMessageBox.question(self,
+                                               'Warning',
+                                               no_params_msg,
+                                               QtWidgets.QMessageBox.Ok)
+
+            return
 
         # Create the fitting thread, based on the fitter
@@ -182,7 +196,13 @@
     def onHelp(self):
         """
-        Display the help page
-        """
-        pass
+        Show the "Fitting" section of help
+        """
+        tree_location = "/user/sasgui/perspectives/fitting/"
+
+        helpfile = "fitting_help.html#simultaneous-fit-mode"
+        help_location = tree_location + helpfile
+
+        # OMG, really? Crawling up the object hierarchy...
+        self.parent.parent.showHelp(help_location)
 
     def onTabCellEdit(self, row, column):
@@ -276,5 +296,22 @@
         Respond to the successful fit complete signal
         """
-        pass
+        # get the elapsed time
+        elapsed = result[1]
+
+        # result list
+        results = result[0][0]
+
+        # Find out all tabs to fit
+        tabs_to_fit = [tab for tab in self.tabs_for_fitting if self.tabs_for_fitting[tab]]
+
+        # update all involved tabs
+        for i, tab in enumerate(tabs_to_fit):
+            tab_object = ObjectLibrary.getObject(tab)
+            if tab_object is None:
+                # No such tab. removed while job was running
+                return
+            # Make sure result and target objects are the same (same model moniker)
+            if tab_object.kernel_module.name == results[i].model.name:
+                tab_object.fitComplete(([[results[i]]], elapsed))
 
     def onBatchFitComplete(self, result):
Index: src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision 116dd4c1f555326683a1e22876683ebde4458258)
+++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision c6343a556733c6d21b013c057bf4616360630466)
@@ -1086,5 +1086,10 @@
 
         # Prepare the fitter object
-        fitters, _ = self.prepareFitters()
+        try:
+            fitters, _ = self.prepareFitters()
+        except ValueError as ex:
+            # This should not happen! GUI explicitly forbids this situation
+            self.communicate.statusBarUpdateSignal.emit('Fitting attempt without parameters.')
+            return
 
         # Create the fitting thread, based on the fitter
@@ -1200,4 +1205,6 @@
         qmax = self.q_range_max
         params_to_fit = self.parameters_to_fit
+        if (not params_to_fit):
+            raise ValueError('Fitting requires at least one parameter to optimize.')
 
         # Potential weights added directly to data
