Index: src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision eae226b35388c002e867fa4776c854350a870842)
+++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision d3c0b9586dd15f08a6d08159dc5c41bfae457c3b)
@@ -462,7 +462,25 @@
         self.options_widget.plot_signal.connect(self.onOptionsUpdate)
 
+    def modelName(self):
+        """
+        Returns model name, by default M<tab#>, e.g. M1, M2
+        """
+        return "M%i" % self.tab_id
+
+    def nameForFittedData(self, name):
+        """
+        Generate name for the current fit
+        """
+        if self.is2D:
+            name += "2d"
+        name = "%s [%s]" % (self.modelName(), name)
+        return name
+
     def showModelContextMenu(self, position):
-
-        #rows = len([s.row() for s in self.lstParams.selectionModel().selectedRows()])
+        """
+        Show context specific menu in the parameter table.
+        When clicked on parameter(s): fitting/constraints options
+        When clicked on white space: model description
+        """
         rows = [s.row() for s in self.lstParams.selectionModel().selectedRows()]
         menu = self.showModelDescription() if not rows else self.modelContextMenu(rows)
@@ -475,5 +493,5 @@
     def modelContextMenu(self, rows):
         """
-        Create context menu for the given model
+        Create context menu for the parameter selection
         """
         menu = QtWidgets.QMenu()
@@ -482,4 +500,5 @@
         param_string = "parameter " if num_rows==1 else "parameters "
         to_string = "to its current value" if num_rows==1 else "to their current values"
+        has_constraints = any([self.rowHasConstraint(i) for i in rows])
 
         self.actionSelect = QtWidgets.QAction(self)
@@ -511,10 +530,12 @@
         menu.addSeparator()
 
-        if self.rowHasConstraint(rows[0]):
+        if has_constraints:
             menu.addAction(self.actionRemoveConstraint)
+            #if num_rows == 1:
+            #    menu.addAction(self.actionEditConstraint)
         else:
             menu.addAction(self.actionConstrain)
-        if num_rows == 2:
-            menu.addAction(self.actionMutualMultiConstrain)
+            if num_rows == 2:
+                menu.addAction(self.actionMutualMultiConstrain)
 
         # Define the callbacks
@@ -549,9 +570,10 @@
         item = QtGui.QStandardItem()
         item.setData(constraint)
+
         # Which row is the constrained parameter in?
-
         row = self.rowFromName(constraint.param)
         self._model_model.item(row, 1).setChild(0, item)
         #self.constraintAddedSignal.emit([row])
+
         # Show visual hints for the constraint
         font = QtGui.QFont()
@@ -560,10 +582,10 @@
         self.modifyViewOnRow(row, font=font, brush=brush)
 
-        # Pass the constraint to the parser
+        # Notify the user
         self.communicate.statusBarUpdateSignal.emit('Constraints added')
 
     def rowFromName(self, name):
         """
-        given parameter name get the row number in self._model_model
+        Given parameter name get the row number in self._model_model
         """
         for row in range(self._model_model.rowCount()):
@@ -596,9 +618,11 @@
         Adds a constraint on a single parameter.
         """
+        min_col = self.lstParams.itemDelegate().param_min
+        max_col = self.lstParams.itemDelegate().param_max
         for row in self.selectedParameters():
             param = self._model_model.item(row, 0).text()
             value = self._model_model.item(row, 1).text()
-            min = self._model_model.item(row, 2).text()
-            max = self._model_model.item(row, 3).text()
+            min = self._model_model.item(row, min_col).text()
+            max = self._model_model.item(row, max_col).text()
             # Create a Constraint object
             constraint = Constraint(param=param, value=value, min=min, max=max)
@@ -608,6 +632,6 @@
             self._model_model.item(row, 1).setChild(0, item)
             # Set min/max to the value constrained
-            self._model_model.item(row,2).setText(value)
-            self._model_model.item(row,3).setText(value)
+            self._model_model.item(row, min_col).setText(value)
+            self._model_model.item(row, max_col).setText(value)
             #self.constraintAddedSignal.emit([row])
             # Show visual hints for the constraint
@@ -623,13 +647,21 @@
         Delete constraints from selected parameters.
         """
+        min_col = self.lstParams.itemDelegate().param_min
+        max_col = self.lstParams.itemDelegate().param_max
         for row in self.selectedParameters():
             # Get the Constraint object from of the model item
             item = self._model_model.item(row, 1)
+            if not item.hasChildren():
+                continue
             constraint = item.child(0).data()
+            if constraint is None:
+                continue
+            if not isinstance(constraint, Constraint):
+                continue
             # Retrieve old values and put them on the model
             if constraint.min is not None:
-                self._model_model.item(row, 2).setText(constraint.min)
+                self._model_model.item(row, min_col).setText(constraint.min)
             if constraint.max is not None:
-                self._model_model.item(row, 3).setText(constraint.max)
+                self._model_model.item(row, max_col).setText(constraint.max)
             # Remove constraint item
             item.removeRow(0)
@@ -639,4 +671,15 @@
         pass
 
+    def getConstraintForRow(self, row):
+        """
+        For the given row, return its constraint, if any
+        """
+        try:
+            item = self._model_model.item(row, 1)
+            return item.child(0).data()
+        except AttributeError:
+            # return none when no constraints
+            return None
+
     def rowHasConstraint(self, row):
         """
@@ -648,5 +691,5 @@
     def selectParameters(self):
         """
-        Selected parameters are chosen for fitting
+        Selected parameter is chosen for fitting
         """
         status = QtCore.Qt.Checked
@@ -662,5 +705,6 @@
     def selectedParameters(self):
         """ Returns list of selected (highlighted) parameters """
-        return [s.row() for s in self.lstParams.selectionModel().selectedRows() if self.isCheckable(s.row())]
+        return [s.row() for s in self.lstParams.selectionModel().selectedRows()
+                if self.isCheckable(s.row())]
 
     def setParameterSelection(self, status=QtCore.Qt.Unchecked):
@@ -671,5 +715,19 @@
         for row in self.selectedParameters():
             self._model_model.item(row, 0).setCheckState(status)
-        pass
+        pass # debugger hook
+
+    def getConstraintsForModel(self):
+        """
+        Return a list of tuples. Each tuple contains constraints mapped as
+        ('constrained parameter', 'function to constrain')
+        e.g. [('sld','5*sld_solvent')]
+        """
+        model_name = self.modelName()
+        self.kernel_module.name = model_name
+        param_number = self._model_model.rowCount()
+        params = [(self._model_model.item(s, 0).text(),
+                    model_name+"."+self._model_model.item(s, 1).child(0).data().func)
+                    for s in range(param_number) if self.rowHasConstraint(s)]
+        return params
 
     def showModelDescription(self):
@@ -936,5 +994,5 @@
         # These should be updating somehow?
         fit_id = 0
-        constraints = []
+        constraints = self.getConstraintsForModel()
         smearer = None
         page_id = [210]
@@ -1607,13 +1665,4 @@
                 if isChecked(row_index)]
 
-    def nameForFittedData(self, name):
-        """
-        Generate name for the current fit
-        """
-        if self.is2D:
-            name += "2d"
-        name = "M%i [%s]" % (self.tab_id, name)
-        return name
-
     def createNewIndex(self, fitted_data):
         """
Index: src/sas/qtgui/Perspectives/Fitting/MultiConstraint.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/MultiConstraint.py	(revision eae226b35388c002e867fa4776c854350a870842)
+++ src/sas/qtgui/Perspectives/Fitting/MultiConstraint.py	(revision d3c0b9586dd15f08a6d08159dc5c41bfae457c3b)
@@ -29,4 +29,5 @@
 
         self.cmdOK.clicked.connect(self.accept)
+        self.cmdHelp.clicked.connect(self.onHelp)
         self.cmdRevert.clicked.connect(self.revert)
         self.txtConstraint.editingFinished.connect(self.validateFormula)
@@ -122,4 +123,17 @@
         return True
 
+    def onHelp(self):
+        """
+        Display related help section
+        """
+        try:
+            location = GuiUtils.HELP_DIRECTORY_LOCATION + \
+            "/user/sasgui/perspectives/fitting/fitting_help.html#simultaneous-fits-with-constraints"
+
+            self.manager._helpView.load(QtCore.QUrl(location))
+            self.manager._helpView.show()
+        except AttributeError:
+            # No manager defined - testing and standalone runs
+            pass
 
 
Index: src/sas/qtgui/Perspectives/Fitting/UI/MultiConstraintUI.ui
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/UI/MultiConstraintUI.ui	(revision eae226b35388c002e867fa4776c854350a870842)
+++ src/sas/qtgui/Perspectives/Fitting/UI/MultiConstraintUI.ui	(revision d3c0b9586dd15f08a6d08159dc5c41bfae457c3b)
@@ -4,5 +4,5 @@
  <widget class="QDialog" name="MultiConstraintUI">
   <property name="windowModality">
-   <enum>Qt::WindowModal</enum>
+   <enum>Qt::ApplicationModal</enum>
   </property>
   <property name="geometry">
@@ -150,4 +150,18 @@
        <property name="text">
         <string>OK</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="cmdCancel">
+       <property name="text">
+        <string>Cancel</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="cmdHelp">
+       <property name="text">
+        <string>Help</string>
        </property>
       </widget>
@@ -175,4 +189,20 @@
    </hints>
   </connection>
+  <connection>
+   <sender>cmdCancel</sender>
+   <signal>clicked()</signal>
+   <receiver>MultiConstraintUI</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>187</x>
+     <y>121</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>184</x>
+     <y>71</y>
+    </hint>
+   </hints>
+  </connection>
  </connections>
 </ui>
