Index: src/sas/qtgui/MainWindow/UI/AcknowledgementsUI.ui
===================================================================
--- src/sas/qtgui/MainWindow/UI/AcknowledgementsUI.ui	(revision 7385feca615397eadd3b37b3f8e3304cf9f8b678)
+++ src/sas/qtgui/MainWindow/UI/AcknowledgementsUI.ui	(revision ecc5d043d6933e0e4e9f6695fd4729a511e4addf)
@@ -10,6 +10,6 @@
     <x>0</x>
     <y>0</y>
-    <width>508</width>
-    <height>283</height>
+    <width>468</width>
+    <height>316</height>
    </rect>
   </property>
@@ -27,5 +27,5 @@
     <widget class="QLabel" name="label">
      <property name="sizePolicy">
-      <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+      <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
        <horstretch>0</horstretch>
        <verstretch>0</verstretch>
@@ -35,5 +35,5 @@
       <size>
        <width>16777215</width>
-       <height>41</height>
+       <height>50</height>
       </size>
      </property>
@@ -46,13 +46,19 @@
     <widget class="QTextBrowser" name="textBrowser">
      <property name="sizePolicy">
-      <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
+      <sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
        <horstretch>0</horstretch>
        <verstretch>0</verstretch>
       </sizepolicy>
      </property>
+     <property name="minimumSize">
+      <size>
+       <width>0</width>
+       <height>85</height>
+      </size>
+     </property>
      <property name="maximumSize">
       <size>
        <width>16777215</width>
-       <height>61</height>
+       <height>85</height>
       </size>
      </property>
@@ -61,6 +67,6 @@
 &lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
 p, li { white-space: pre-wrap; }
-&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;This work benefited from the use of the SasView application, originally developed under NSF Award DMR-0520547. SasView also contains code developed with funding from the EU Horizon 2020 programme under the SINE2020 project Grant No 654000.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8.25pt;&quot;&gt;This work benefited from the use of the SasView application, originally developed under NSF Award DMR-0520547. SasView also contains code developed with funding from the EU Horizon 2020 programme under the SINE2020 project Grant No 654000.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
      </property>
     </widget>
@@ -103,6 +109,6 @@
 &lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
 p, li { white-space: pre-wrap; }
-&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;M. Doucet et al. SasView Version 4.2, Zenodo, 10.5281/zenodo.1412041&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8.25pt;&quot;&gt;M. Doucet et al. SasView Version 4.2, Zenodo, 10.5281/zenodo.1412041&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
      </property>
     </widget>
@@ -111,5 +117,5 @@
     <widget class="QLabel" name="label_3">
      <property name="sizePolicy">
-      <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+      <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
        <horstretch>0</horstretch>
        <verstretch>0</verstretch>
@@ -119,5 +125,5 @@
       <size>
        <width>16777215</width>
-       <height>38</height>
+       <height>50</height>
       </size>
      </property>
Index: src/sas/qtgui/Perspectives/Fitting/ComplexConstraint.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/ComplexConstraint.py	(revision 305114c33963ce5b43f94d3b16fc71e316f72e3a)
+++ src/sas/qtgui/Perspectives/Fitting/ComplexConstraint.py	(revision ecc5d043d6933e0e4e9f6695fd4729a511e4addf)
@@ -15,4 +15,6 @@
 from sas.qtgui.Perspectives.Fitting import FittingUtilities
 import sas.qtgui.Utilities.GuiUtils as GuiUtils
+from sas.qtgui.Perspectives.Fitting.Constraint import Constraint
+
 ALLOWED_OPERATORS = ['=','<','>','>=','<=']
 
@@ -21,4 +23,5 @@
 
 class ComplexConstraint(QtWidgets.QDialog, Ui_ComplexConstraintUI):
+    constraintReadySignal = QtCore.pyqtSignal(tuple)
     def __init__(self, parent=None, tabs=None):
         super(ComplexConstraint, self).__init__()
@@ -32,4 +35,5 @@
         self.tab_names = None
         self.operator = '='
+        self._constraint = Constraint()
 
         self.warning = self.lblWarning.text()
@@ -53,5 +57,5 @@
         Signals from various elements
         """
-        self.cmdOK.clicked.connect(self.accept)
+        self.cmdOK.clicked.connect(self.onApply)
         self.cmdHelp.clicked.connect(self.onHelp)
         self.cmdRevert.clicked.connect(self.onRevert)
@@ -69,11 +73,33 @@
         self.txtName2.setText(self.tab_names[1])
 
-        # Show only parameters not already constrained
+        self.setupParamWidgets()
+
+        # Add menu to the Apply button
+        all_menu   = QtWidgets.QMenu()
+        self.actionAddAll = QtWidgets.QAction(self)
+        self.actionAddAll.setObjectName("actionAddAll")
+        self.actionAddAll.setText(QtCore.QCoreApplication.translate("self", "Add all"))
+        ttip = "Add constraints between all identically named parameters in both fitpages"
+        self.actionAddAll.setToolTip(ttip)
+        #self.actionAddAll.setStatusTip(ttip)
+        self.actionAddAll.triggered.connect(self.onSetAll)
+        all_menu.addAction(self.actionAddAll)
+        # https://bugreports.qt.io/browse/QTBUG-13663
+        all_menu.setToolTipsVisible(True)
+        self.cmdOK.setMenu(all_menu)
+
+    def setupParamWidgets(self):
+        """
+        Fill out comboboxes and set labels with non-constrained parameters
+        """
         self.cbParam1.clear()
-        items = [param for i,param in enumerate(self.params[0]) if not self.tabs[0].rowHasConstraint(i)]
-        self.cbParam1.addItems(items)
+        items1 = [param for param in self.params[0] if not self.tabs[0].paramHasConstraint(param)]
+        self.cbParam1.addItems(items1)
+
+        # M2 doesn't have to be non-constrained
         self.cbParam2.clear()
-        items = [param for i,param in enumerate(self.params[1]) if not self.tabs[1].rowHasConstraint(i)]
-        self.cbParam2.addItems(items)
+        #items2 = [param for param in self.params[1] if not self.tabs[1].paramHasConstraint(param)]
+        items2 = [param for param in self.params[1]]
+        self.cbParam2.addItems(items2)
 
         self.txtParam.setText(self.tab_names[0] + ":" + self.cbParam1.currentText())
@@ -84,4 +110,15 @@
 
         self.txtConstraint.setText(self.tab_names[1]+"."+self.cbParam2.currentText())
+
+        # disable Apply if no parameters available
+        if len(items1)==0:
+            self.cmdOK.setEnabled(False)
+            txt = "No parameters in model "+self.tab_names[0] +\
+                " are available for constraining."
+            self.lblWarning.setText(txt)
+        else:
+            self.cmdOK.setEnabled(True)
+            txt = ""
+            self.lblWarning.setText(txt)
 
     def setupTooltip(self):
@@ -144,4 +181,6 @@
 
         # Original indices
+        index2 = index2 if index2 >= 0 else 0
+        index1 = index1 if index1 >= 0 else 0
         self.cbParam1.setCurrentIndex(index2)
         self.cbParam2.setCurrentIndex(index1)
@@ -205,7 +244,60 @@
     def constraint(self):
         """
-        Return the generated constraint as tuple (model1, param1, operator, constraint)
-        """
-        return (self.txtName1.text(), self.cbParam1.currentText(), self.cbOperator.currentText(), self.txtConstraint.text())
+        Return the generated constraint
+        """
+        param = self.cbParam1.currentText()
+        value = self.cbParam2.currentText()
+        func = self.txtConstraint.text()
+        value_ex = self.txtName2.text() + "." + self.cbParam2.currentText()
+        model1 = self.txtName1.text()
+        operator = self.cbOperator.currentText()
+
+        con = Constraint(self,
+                         param=param,
+                         value=value,
+                         func=func,
+                         value_ex=value_ex,
+                         operator=operator)
+
+        return (model1, con)
+
+    def onApply(self):
+        """
+        Respond to Add constraint action.
+        Send a signal that the constraint is ready to be applied
+        """
+        cons_tuple = self.constraint()
+        self.constraintReadySignal.emit(cons_tuple)
+        # reload the comboboxes
+        self.setupParamWidgets()
+
+    def onSetAll(self):
+        """
+        Set constraints on all identically named parameters between two fitpages
+        """
+        # loop over parameters in constrained model
+        items1 = [param for param in self.params[0] if not self.tabs[0].paramHasConstraint(param)]
+        #items2 = [param for param in self.params[1] if not self.tabs[1].paramHasConstraint(i)]
+        items2 = self.params[1]
+        for item in items1:
+            if item not in items2: continue
+            param = item
+            value = item
+            func = self.txtName2.text() + "." + param
+            value_ex = self.txtName1.text() + "." + param
+            model1 = self.txtName1.text()
+            operator = self.cbOperator.currentText()
+
+            con = Constraint(self,
+                             param=param,
+                             value=value,
+                             func=func,
+                             value_ex=value_ex,
+                             operator=operator)
+
+            self.constraintReadySignal.emit((model1, con))
+
+        # reload the comboboxes
+        self.setupParamWidgets()
 
     def onHelp(self):
Index: src/sas/qtgui/Perspectives/Fitting/Constraint.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/Constraint.py	(revision baeac95a855b6fc0dabd8f734a6796a896125f45)
+++ src/sas/qtgui/Perspectives/Fitting/Constraint.py	(revision ecc5d043d6933e0e4e9f6695fd4729a511e4addf)
@@ -5,5 +5,7 @@
     hence made into a class.
     """
-    def __init__(self, parent=None, param=None, value=0.0, min=None, max=None, func=None, value_ex=None):
+    def __init__(self, parent=None, param=None, value=0.0,
+                 min=None, max=None, func=None, value_ex=None,
+                 operator="="):
         self._value = value
         self._param = param
@@ -13,4 +15,5 @@
         self._min = min
         self._max = max
+        self._operator = operator
 
     @property
@@ -69,2 +72,11 @@
         self._max = val
 
+    @property
+    def operator(self):
+        # operator to use for constraint
+        return self._operator
+
+    @operator.setter
+    def operator(self, val):
+        self._operator = val
+
Index: src/sas/qtgui/Perspectives/Fitting/ConstraintWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/ConstraintWidget.py	(revision e5ae812f0eed528ccbbb352ea37a563795d26902)
+++ src/sas/qtgui/Perspectives/Fitting/ConstraintWidget.py	(revision ecc5d043d6933e0e4e9f6695fd4729a511e4addf)
@@ -22,5 +22,5 @@
     Constraints Dialog to select the desired parameter/model constraints.
     """
-
+    fitCompleteSignal = QtCore.pyqtSignal(tuple)
     def __init__(self, parent=None):
         super(ConstraintWidget, self).__init__()
@@ -93,4 +93,5 @@
         self.cmdFit.clicked.connect(self.onFit)
         self.cmdHelp.clicked.connect(self.onHelp)
+        self.cmdAdd.clicked.connect(self.showMultiConstraint)
         self.chkChain.toggled.connect(self.onChainFit)
 
@@ -100,4 +101,7 @@
         self.tblConstraints.cellChanged.connect(self.onConstraintChange)
 
+        # Internal signals
+        self.fitCompleteSignal.connect(self.fitComplete)
+
         # External signals
         self.parent.tabsModifiedSignal.connect(self.initializeFitList)
@@ -156,7 +160,4 @@
         fitter = Fit()
         fitter.fitter_id = self.page_id
-
-        # Notify the parent about fitting started
-        self.parent.fittingStartedSignal.emit(tabs_to_fit)
 
         # prepare fitting problems for each tab
@@ -177,5 +178,5 @@
         except ValueError:
             # No parameters selected in one of the tabs
-            no_params_msg = "Fitting can not be performed.\n" +\
+            no_params_msg = "Fitting cannot be performed.\n" +\
                             "Not all tabs chosen for fitting have parameters selected for fitting."
             QtWidgets.QMessageBox.warning(self,
@@ -200,4 +201,7 @@
         batch_inputs = {}
         batch_outputs = {}
+
+        # Notify the parent about fitting started
+        self.parent.fittingStartedSignal.emit(tabs_to_fit)
 
         # new fit thread object
@@ -292,8 +296,17 @@
         """
         item = self.tblConstraints.item(row, column)
-        if column == 0:
-            # Update the tabs for fitting list
-            constraint = self.available_constraints[row]
-            constraint.active = (item.checkState() == QtCore.Qt.Checked)
+        if column != 0: return
+        # Update the tabs for fitting list
+        constraint = self.available_constraints[row]
+        constraint.active = (item.checkState() == QtCore.Qt.Checked)
+        # Update the constraint formula
+        constraint = self.available_constraints[row]
+        function = item.text()
+        # remove anything left of '=' to get the constraint
+        function = function[function.index('=')+1:]
+        # No check on function here - trust the user (R)
+        if function != constraint.func:
+            #from sas.sascalc.fit.expression import compile_constraints
+            constraint.func = function
 
     def onTabCellEntered(self, row, column):
@@ -307,4 +320,10 @@
 
     def onFitComplete(self, result):
+        """
+        Send the fit complete signal to main thread
+        """
+        self.fitCompleteSignal.emit(result)
+
+    def fitComplete(self, result):
         """
         Respond to the successful fit complete signal
@@ -383,5 +402,5 @@
         msg = "Fitting failed: %s s.\n" % reason
         self.parent.communicate.statusBarUpdateSignal.emit(msg)
- 
+
     def isTabImportable(self, tab):
         """
@@ -596,4 +615,5 @@
             # Show the text in the constraint table
             item = self.uneditableItem(label)
+            item = QtWidgets.QTableWidgetItem(label)
             item.setFlags(item.flags() ^ QtCore.Qt.ItemIsUserCheckable)
             item.setCheckState(QtCore.Qt.Checked)
@@ -664,4 +684,20 @@
         return None
 
+    def onAcceptConstraint(self, con_tuple):
+        """
+        Receive constraint tuple from the ComplexConstraint dialog and adds contraint
+        """
+        #"M1, M2, M3" etc
+        model_name, constraint = con_tuple
+        constrained_tab = self.getObjectByName(model_name)
+        if constrained_tab is None:
+            return
+
+        # Find the constrained parameter row
+        constrained_row = constrained_tab.getRowFromName(constraint.param)
+
+        # Update the tab
+        constrained_tab.addConstraintToRow(constraint, constrained_row)
+
     def showMultiConstraint(self):
         """
@@ -669,29 +705,20 @@
         """
         selected_rows = self.selectedParameters(self.tblTabList)
-        assert(len(selected_rows)==2)
+        if len(selected_rows)!=2:
+            msg = "Please select two fit pages from the Source Choice table."
+            msgbox = QtWidgets.QMessageBox(self.parent)
+            msgbox.setIcon(QtWidgets.QMessageBox.Warning)
+            msgbox.setText(msg)
+            msgbox.setWindowTitle("2 fit page constraints")
+            retval = msgbox.exec_()
+            return
 
         tab_list = [ObjectLibrary.getObject(self.tblTabList.item(s, 0).data(0)) for s in selected_rows]
         # Create and display the widget for param1 and param2
         cc_widget = ComplexConstraint(self, tabs=tab_list)
+        cc_widget.constraintReadySignal.connect(self.onAcceptConstraint)
+
         if cc_widget.exec_() != QtWidgets.QDialog.Accepted:
             return
-
-        constraint = Constraint()
-        model1, param1, operator, constraint_text = cc_widget.constraint()
-
-        constraint.func = constraint_text
-        # param1 is the parameter we're constraining
-        constraint.param = param1
-
-        # Find the right tab
-        constrained_tab = self.getObjectByName(model1)
-        if constrained_tab is None:
-            return
-
-        # Find the constrained parameter row
-        constrained_row = constrained_tab.getRowFromName(param1)
-
-        # Update the tab
-        constrained_tab.addConstraintToRow(constraint, constrained_row)
 
     def getFitPage(self):
Index: src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision baeac95a855b6fc0dabd8f734a6796a896125f45)
+++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision ecc5d043d6933e0e4e9f6695fd4729a511e4addf)
@@ -903,4 +903,31 @@
         except AttributeError:
             return None
+
+    def allParamNames(self):
+        """
+        Returns a list of all parameter names defined on the current model
+        """
+        all_params = self.kernel_module._model_info.parameters.kernel_parameters
+        all_param_names = [param.name for param in all_params]
+        # Assure scale and background are always included
+        if 'scale' not in all_param_names:
+            all_param_names.append('scale')
+        if 'background' not in all_param_names:
+            all_param_names.append('background')
+        return all_param_names
+
+    def paramHasConstraint(self, param=None):
+        """
+        Finds out if the given parameter in the main model has a constraint child
+        """
+        if param is None: return False
+        if param not in self.allParamNames(): return False
+
+        for row in range(self._model_model.rowCount()):
+            if self._model_model.item(row,0).text() != param: continue
+            return self.rowHasConstraint(row)
+
+        # nothing found
+        return False
 
     def rowHasConstraint(self, row):
Index: src/sas/qtgui/Perspectives/Fitting/UI/ComplexConstraintUI.ui
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/UI/ComplexConstraintUI.ui	(revision 17381739dbc25805ef89bbec1e92e0915e6429a5)
+++ src/sas/qtgui/Perspectives/Fitting/UI/ComplexConstraintUI.ui	(revision ecc5d043d6933e0e4e9f6695fd4729a511e4addf)
@@ -7,6 +7,6 @@
     <x>0</x>
     <y>0</y>
-    <width>367</width>
-    <height>199</height>
+    <width>478</width>
+    <height>257</height>
    </rect>
   </property>
@@ -69,4 +69,7 @@
            </sizepolicy>
           </property>
+          <property name="sizeAdjustPolicy">
+           <enum>QComboBox::AdjustToContents</enum>
+          </property>
           <item>
            <property name="text">
@@ -100,4 +103,7 @@
            </sizepolicy>
           </property>
+          <property name="sizeAdjustPolicy">
+           <enum>QComboBox::AdjustToContents</enum>
+          </property>
           <item>
            <property name="text">
@@ -161,5 +167,5 @@
        <property name="sizeHint" stdset="0">
         <size>
-         <width>40</width>
+         <width>88</width>
          <height>20</height>
         </size>
@@ -168,17 +174,38 @@
      </item>
      <item>
-      <widget class="QPushButton" name="cmdOK">
+      <widget class="QToolButton" name="cmdOK">
+       <property name="minimumSize">
+        <size>
+         <width>93</width>
+         <height>28</height>
+        </size>
+       </property>
+       <property name="toolTip">
+        <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Add the constraint as defined by the above expression.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+       </property>
        <property name="text">
-        <string>OK</string>
-       </property>
-       <property name="default">
+        <string>Add</string>
+       </property>
+       <property name="popupMode">
+        <enum>QToolButton::MenuButtonPopup</enum>
+       </property>
+       <property name="toolButtonStyle">
+        <enum>Qt::ToolButtonTextOnly</enum>
+       </property>
+       <property name="autoRaise">
         <bool>false</bool>
        </property>
+       <property name="arrowType">
+        <enum>Qt::DownArrow</enum>
+       </property>
       </widget>
      </item>
      <item>
       <widget class="QPushButton" name="cmdCancel">
+       <property name="toolTip">
+        <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Close the window.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+       </property>
        <property name="text">
-        <string>Cancel</string>
+        <string>Close</string>
        </property>
       </widget>
@@ -197,20 +224,4 @@
  <resources/>
  <connections>
-  <connection>
-   <sender>cmdOK</sender>
-   <signal>clicked()</signal>
-   <receiver>ComplexConstraintUI</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>149</x>
-     <y>144</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>179</x>
-     <y>82</y>
-    </hint>
-   </hints>
-  </connection>
   <connection>
    <sender>cmdCancel</sender>
Index: src/sas/qtgui/Perspectives/Fitting/UI/ConstraintWidgetUI.ui
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/UI/ConstraintWidgetUI.ui	(revision 91ad45cad8ea43830c431bc44f72efb1026fb729)
+++ src/sas/qtgui/Perspectives/Fitting/UI/ConstraintWidgetUI.ui	(revision ecc5d043d6933e0e4e9f6695fd4729a511e4addf)
@@ -7,6 +7,6 @@
     <x>0</x>
     <y>0</y>
-    <width>428</width>
-    <height>457</height>
+    <width>597</width>
+    <height>607</height>
    </rect>
   </property>
@@ -14,5 +14,5 @@
    <string>Constrained and Simultaneous Fit</string>
   </property>
-  <layout class="QGridLayout" name="gridLayout">
+  <layout class="QGridLayout" name="gridLayout_2">
    <item row="0" column="0">
     <widget class="QGroupBox" name="groupBox">
@@ -89,21 +89,48 @@
       <string>Constraints</string>
      </property>
-     <layout class="QGridLayout" name="gridLayout_2">
+     <layout class="QGridLayout" name="gridLayout">
       <item row="0" column="0">
-       <layout class="QHBoxLayout" name="horizontalLayout">
-        <item>
-         <widget class="QLabel" name="label">
-          <property name="text">
-           <string>Special cases</string>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QComboBox" name="cbCases">
+       <layout class="QHBoxLayout" name="horizontalLayout_4">
+        <item>
+         <layout class="QHBoxLayout" name="horizontalLayout">
           <item>
-           <property name="text">
-            <string>None</string>
-           </property>
+           <widget class="QLabel" name="label">
+            <property name="text">
+             <string>Special cases</string>
+            </property>
+           </widget>
           </item>
+          <item>
+           <widget class="QComboBox" name="cbCases">
+            <item>
+             <property name="text">
+              <string>None</string>
+             </property>
+            </item>
+           </widget>
+          </item>
+         </layout>
+        </item>
+        <item>
+         <spacer name="horizontalSpacer_3">
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>40</width>
+            <height>20</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+        <item>
+         <widget class="QPushButton" name="cmdAdd">
+          <property name="toolTip">
+           <string>Define constraints between two fit pages.</string>
+          </property>
+          <property name="text">
+           <string>Add constraints</string>
+          </property>
          </widget>
         </item>
@@ -160,4 +187,7 @@
         </size>
        </property>
+       <property name="toolTip">
+        <string>Perform simultaneous fitting of selected fit pages.</string>
+       </property>
        <property name="text">
         <string>Fit</string>
@@ -179,4 +209,7 @@
         </size>
        </property>
+       <property name="toolTip">
+        <string>Display help on constrained and simultaneous fitting.</string>
+       </property>
        <property name="text">
         <string>Help</string>
Index: src/sas/qtgui/Perspectives/Fitting/UI/MultiConstraintUI.ui
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/UI/MultiConstraintUI.ui	(revision 17381739dbc25805ef89bbec1e92e0915e6429a5)
+++ src/sas/qtgui/Perspectives/Fitting/UI/MultiConstraintUI.ui	(revision ecc5d043d6933e0e4e9f6695fd4729a511e4addf)
@@ -10,6 +10,6 @@
     <x>0</x>
     <y>0</y>
-    <width>369</width>
-    <height>201</height>
+    <width>435</width>
+    <height>233</height>
    </rect>
   </property>
@@ -184,4 +184,20 @@
  <connections>
   <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>
+  <connection>
    <sender>cmdOK</sender>
    <signal>clicked()</signal>
@@ -199,20 +215,4 @@
    </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>
Index: src/sas/qtgui/Perspectives/Fitting/UnitTesting/ComplexConstraintTest.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/UnitTesting/ComplexConstraintTest.py	(revision 2eeda9335609875dbf439fe36d6823b0f9067e67)
+++ src/sas/qtgui/Perspectives/Fitting/UnitTesting/ComplexConstraintTest.py	(revision ecc5d043d6933e0e4e9f6695fd4729a511e4addf)
@@ -132,10 +132,15 @@
         """
         # default data
-        self.assertEqual(self.widget.constraint(), ('M1', 'scale', '=', 'M1.scale'))
+        c = self.widget.constraint()
+        self.assertEqual(c[0], 'M1')
+        self.assertEqual(c[1].func, 'M1.scale')
 
         # Change parameter and operand
         self.widget.cbOperator.setCurrentIndex(3)
-        self.widget.cbParam1.setCurrentIndex(3)
-        self.assertEqual(self.widget.constraint(), ('M1', 'bjerrum_length', '>=', 'M1.scale'))
+        self.widget.cbParam2.setCurrentIndex(3)
+        c = self.widget.constraint()
+        self.assertEqual(c[0], 'M1')
+        self.assertEqual(c[1].func, 'M1.sld_solvent')
+        self.assertEqual(c[1].operator, '>=')
 
     def testOnHelp(self):
