Index: src/sas/qtgui/Perspectives/Fitting/ComplexConstraint.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/ComplexConstraint.py	(revision 2d466e4b832e803d9f9cf7561ec93be0e476045a)
+++ src/sas/qtgui/Perspectives/Fitting/ComplexConstraint.py	(revision c5a2722f197a9627bc7cc20bc4bba9ff4e13b82a)
@@ -15,4 +15,5 @@
 # Local UI
 from sas.qtgui.Perspectives.Fitting.UI.ComplexConstraintUI import Ui_ComplexConstraintUI
+from sas.qtgui.Perspectives.Fitting.Constraints import Constraint
 
 class ComplexConstraint(QtWidgets.QDialog, Ui_ComplexConstraintUI):
@@ -52,5 +53,5 @@
         self.cmdHelp.clicked.connect(self.onHelp)
         self.cmdRevert.clicked.connect(self.onRevert)
-        #self.txtConstraint.editingFinished.connect(self.validateFormula)
+        self.txtConstraint.editingFinished.connect(self.validateFormula)
 
         self.cbParam1.currentIndexChanged.connect(self.onParamIndexChange)
@@ -95,5 +96,5 @@
             self.txtParam.setText(self.tab_names[0] + ":" + self.cbParam1.currentText())
         else:
-            self.txtConstraint.setText(self.cbParam2.currentText())
+            self.txtConstraint.setText(self.tab_names[1] + "." + self.cbParam2.currentText())
         pass
 
@@ -148,6 +149,16 @@
             return False
 
-        param_str = str(self.params[1])
+        # M1.scale  --> model_str='M1', constraint_text='scale'
+        param_str = self.cbParam2.currentText()
         constraint_text = constraint_text.strip()
+        model_str = constraint_text[:constraint_text.index('.')]
+        #constraint_text = constraint_text[constraint_text.index('.')+1:]
+
+        # 0. Has to contain the model name
+        if model_str != self.txtName2.text():
+            return False
+
+        # Remove model name from constraint text
+        constraint_text = constraint_text.replace(model_str+".",'')
 
         # 1. just the parameter
@@ -161,16 +172,5 @@
         parameter_string_end = parameter_string_start + len(param_str)
 
-        # 3. parameter name should be a separate word, but can have "()[]*+-/ " around
-        valid_neighbours = "()[]*+-/ "
-        has_only_parameter = False
-        start_loc = parameter_string_start -1
-        end_loc = parameter_string_end
-        if not any([constraint_text[start_loc] == char for char in valid_neighbours]):
-            return False
-        if end_loc < len(constraint_text):
-            if not any([constraint_text[end_loc] == char for char in valid_neighbours]):
-                return False
-
-        # 4. replace parameter name with "1" and try to evaluate the expression
+        # 3. replace parameter name with "1" and try to evaluate the expression
         try:
             expression_to_evaluate = constraint_text.replace(param_str, "1.0")
@@ -185,4 +185,10 @@
         return True
 
+    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())
+
     def onHelp(self):
         """
Index: src/sas/qtgui/Perspectives/Fitting/ConstraintWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/ConstraintWidget.py	(revision 2d466e4b832e803d9f9cf7561ec93be0e476045a)
+++ src/sas/qtgui/Perspectives/Fitting/ConstraintWidget.py	(revision c5a2722f197a9627bc7cc20bc4bba9ff4e13b82a)
@@ -10,4 +10,5 @@
 from sas.qtgui.Perspectives.Fitting.FittingWidget import FittingWidget
 from sas.qtgui.Perspectives.Fitting.ComplexConstraint import ComplexConstraint
+from sas.qtgui.Perspectives.Fitting.Constraints import Constraint
 
 class ConstraintWidget(QtWidgets.QWidget, Ui_ConstraintWidgetUI):
@@ -431,4 +432,16 @@
         return True
 
+    def getObjectByName(self, name):
+        for object_name in ObjectLibrary.listObjects():
+            object = ObjectLibrary.getObject(object_name)
+            if isinstance(object, FittingWidget):
+                try:
+                    if object.kernel_module.name == name:
+                        return object
+                except AttributeError:
+                    # Disregard atribute errors - empty fit widgets
+                    continue
+        return None
+
     def showMultiConstraint(self):
         """
@@ -444,5 +457,18 @@
             return
 
-        #constraint = Constraint()
-        #c_text = cc_widget.txtConstraint.text()
-        pass
+        constraint = Constraint()
+        model1, param1, operator, constraint_text = cc_widget.constraint()
+
+        constraint.func = constraint_text
+        # 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)
+        pass
Index: src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision 2d466e4b832e803d9f9cf7561ec93be0e476045a)
+++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision c5a2722f197a9627bc7cc20bc4bba9ff4e13b82a)
@@ -601,8 +601,4 @@
         Return list of all parameters for the current model
         """
-        #params = []
-        #for row in range(self._model_model.rowCount()):
-        #    params.append(self._model_model.item(row).text())
-        #return params
         return [self._model_model.item(row).text() for row in range(self._model_model.rowCount())]
 
@@ -625,4 +621,24 @@
             self._model_model.item(row, column).setEditable(fields_enabled)
         self._model_model.blockSignals(False)
+
+    def addConstraintToRow(self, constraint=None, row=0):
+        """
+        Adds the constraint object to requested row
+        """
+        # Create a new item and add the Constraint object as a child
+        assert(isinstance(constraint, Constraint))
+        assert(0<=row<=self._model_model.rowCount())
+
+        item = QtGui.QStandardItem()
+        item.setData(constraint)
+        self._model_model.item(row, 1).setChild(0, item)
+        # Set min/max to the value constrained
+        self.constraintAddedSignal.emit([row])
+        # Show visual hints for the constraint
+        font = QtGui.QFont()
+        font.setItalic(True)
+        brush = QtGui.QBrush(QtGui.QColor('blue'))
+        self.modifyViewOnRow(row, font=font, brush=brush)
+        self.communicate.statusBarUpdateSignal.emit('Constraint added')
 
     def addSimpleConstraint(self):
@@ -759,7 +775,9 @@
             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)
+                    #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.rowHasConstraint(s)]
         return params
