Index: src/sas/qtgui/Perspectives/Fitting/ComplexConstraint.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/ComplexConstraint.py	(revision c5a2722f197a9627bc7cc20bc4bba9ff4e13b82a)
+++ src/sas/qtgui/Perspectives/Fitting/ComplexConstraint.py	(revision ba01ad131050e05053ee2ab2bf5c139e9617c9d9)
@@ -152,6 +152,5 @@
         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:]
+        model_str = self.txtName2.text()
 
         # 0. Has to contain the model name
@@ -159,5 +158,5 @@
             return False
 
-        # Remove model name from constraint text
+        # Remove model name from constraint
         constraint_text = constraint_text.replace(model_str+".",'')
 
Index: src/sas/qtgui/Perspectives/Fitting/ConstraintWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/ConstraintWidget.py	(revision c5a2722f197a9627bc7cc20bc4bba9ff4e13b82a)
+++ src/sas/qtgui/Perspectives/Fitting/ConstraintWidget.py	(revision ba01ad131050e05053ee2ab2bf5c139e9617c9d9)
@@ -25,4 +25,8 @@
         # Remember previous content of modified cell
         self.current_cell = ""
+
+        # Tabs used in simultaneous fitting
+        # tab_name : True/False
+        self.tabs_for_fitting = {}
 
         # Set up the widgets
@@ -75,10 +79,11 @@
 
         # QTableWidgets
-        self.tblTabList.cellChanged.connect(self.onMonikerEdit)
+        self.tblTabList.cellChanged.connect(self.onTabCellEdit)
         self.tblTabList.cellDoubleClicked.connect(self.onTabCellEntered)
         self.tblConstraints.cellChanged.connect(self.onConstraintChange)
 
         # External signals
-        self.parent.tabsModifiedSignal.connect(self.initializeFitList)
+        #self.parent.tabsModifiedSignal.connect(self.initializeFitList)
+        self.parent.tabsModifiedSignal.connect(self.onModifiedTabs)
 
     def updateSignalsFromTab(self, tab=None):
@@ -95,31 +100,40 @@
         single fit/batch fit
         """
+        source = self.sender().objectName()
+        self.currentType = "BatchPage" if source == "btnBatch" else "FitPage"
+        self.initializeFitList()
+
+    def onSpecialCaseChange(self, index):
+        """
+        Respond to the combobox change for special case constraint sets
+        """
         pass
 
-    def onSpecialCaseChange(self, index):
-        """
-        Respond to the combobox change for special case constraint sets
+    def onFit(self):
+        """
+        Perform the constrained/simultaneous fit
         """
         pass
 
-    def onFit(self):
-        """
-        Perform the constrained/simultaneous fit
+    def onHelp(self):
+        """
+        Display the help page
         """
         pass
 
-    def onHelp(self):
-        """
-        Display the help page
-        """
-        pass
-
-    def onMonikerEdit(self, row, column):
-        """
-        Modify the model moniker
-        """
+    def onTabCellEdit(self, row, column):
+        """
+        Respond to check/uncheck and to modify the model moniker actions
+        """
+        item = self.tblTabList.item(row, column)
+        if column == 0:
+            # Update the tabs for fitting list
+            tab_name = item.text()
+            self.tabs_for_fitting[tab_name] = (item.checkState() == QtCore.Qt.Checked)
+            # Enable fitting only when there are models to fit
+            self.cmdFit.setEnabled(any(self.tabs_for_fitting.values()))
+
         if column not in self.editable_tab_columns:
             return
-        item = self.tblTabList.item(row, column)
         new_moniker = item.data(0)
 
@@ -131,32 +145,34 @@
             item.setBackground(QtCore.Qt.red)
             self.cmdFit.setEnabled(False)
-        else:
-            self.tblTabList.blockSignals(True)
-            item.setBackground(QtCore.Qt.white)
-            self.tblTabList.blockSignals(False)
-            self.cmdFit.setEnabled(True)
-            if not self.current_cell:
-                return
-            # Remember the value
-            if self.current_cell not in self.available_tabs:
-                return
-            temp_tab = self.available_tabs[self.current_cell]
-            # Remove the key from the dictionaries
-            self.available_tabs.pop(self.current_cell, None)
-            # Change the model name
-            model = temp_tab.kernel_module
-            model.name = new_moniker
-            # Replace constraint name
-            temp_tab.replaceConstraintName(self.current_cell, new_moniker)
-            # Reinitialize the display
-            self.initializeFitList()
-        pass
+            return
+        self.tblTabList.blockSignals(True)
+        item.setBackground(QtCore.Qt.white)
+        self.tblTabList.blockSignals(False)
+        self.cmdFit.setEnabled(True)
+        if not self.current_cell:
+            return
+        # Remember the value
+        if self.current_cell not in self.available_tabs:
+            return
+        temp_tab = self.available_tabs[self.current_cell]
+        # Remove the key from the dictionaries
+        self.available_tabs.pop(self.current_cell, None)
+        # Change the model name
+        model = temp_tab.kernel_module
+        model.name = new_moniker
+        # Replace constraint name
+        temp_tab.replaceConstraintName(self.current_cell, new_moniker)
+        # Reinitialize the display
+        self.initializeFitList()
 
     def onConstraintChange(self, row, column):
         """
         Modify the constraint in-place.
-        Tricky.
-        """
-        pass
+        """
+        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)
 
     def onTabCellEntered(self, row, column):
@@ -168,4 +184,23 @@
             return
         self.current_cell = self.tblTabList.item(row, column).data(0)
+
+    def onModifiedTabs(self):
+        """
+        Respond to tabs being deleted by deleting involved constraints
+
+        This should probably be done in FittingWidget as it is the owner of
+        all the fitting data, but I want to keep the FW oblivious about
+        dependence on other FW tabs, so enforcing the constraint deletion here.
+        """
+        # Get the list of all constraints from querying the table
+        #constraints = getConstraintsForModel()
+
+        # Get the current list of tabs
+        #tabs = ObjectLibrary.listObjects()
+
+        # Check if any of the constraint dependencies got deleted
+        # Check the list of constraints
+        self.initializeFitList()
+        pass
 
     def isTabImportable(self, tab):
@@ -339,5 +374,6 @@
         Update a single line of the table widget with tab info
         """
-        model = ObjectLibrary.getObject(tab).kernel_module
+        fit_page = ObjectLibrary.getObject(tab)
+        model = fit_page.kernel_module
         if model is None:
             return
@@ -345,17 +381,20 @@
         model_name = model.id
         moniker = model.name
-        model_data = ObjectLibrary.getObject(tab).data
+        model_data = fit_page.data
         model_filename = model_data.filename
-        self.available_tabs[moniker] = ObjectLibrary.getObject(tab)
+        self.available_tabs[moniker] = fit_page
 
         # Update the model table widget
-        #item = QtWidgets.QTableWidgetItem(tab_name)
-        #item.setCheckState(QtCore.Qt.Checked)
-        #item.setFlags( QtCore.Qt.ItemIsSelectable |  QtCore.Qt.ItemIsEnabled )
         pos = self.tblTabList.rowCount()
         self.tblTabList.insertRow(pos)
         item = self.uneditableItem(tab_name)
         item.setFlags(item.flags() ^ QtCore.Qt.ItemIsUserCheckable)
-        item.setCheckState(QtCore.Qt.Checked)
+        if tab_name in self.tabs_for_fitting:
+            state = QtCore.Qt.Checked if self.tabs_for_fitting[tab_name] else QtCore.Qt.Unchecked
+            item.setCheckState(state)
+        else:
+            item.setCheckState(QtCore.Qt.Checked)
+            self.tabs_for_fitting[tab_name] = True
+
         self.tblTabList.setItem(pos, 0, item)
         self.tblTabList.setItem(pos, 1, self.uneditableItem(model_name))
@@ -369,19 +408,21 @@
 
         # Check if any constraints present in tab
-        constraints = ObjectLibrary.getObject(tab).getConstraintsForModel()
+        constraint_names = fit_page.getConstraintsForModel()
+        constraints = fit_page.getConstraintObjectsForModel()
         if not constraints: 
             return
         self.tblConstraints.setEnabled(True)
-        for constraint in constraints:
+        for constraint, constraint_name in zip(constraints, constraint_names):
             # Create the text for widget item
-            label = moniker + ":"+ constraint[0] + " = " + constraint[1]
+            label = moniker + ":"+ constraint_name[0] + " = " + constraint_name[1]
+            pos = self.tblConstraints.rowCount()
+            self.available_constraints[pos] = constraint
 
             # Show the text in the constraint table
-            item = QtWidgets.QTableWidgetItem(label)
+            item = self.uneditableItem(label)
+            item.setFlags(item.flags() ^ QtCore.Qt.ItemIsUserCheckable)
             item.setCheckState(QtCore.Qt.Checked)
-            pos = self.tblConstraints.rowCount()
             self.tblConstraints.insertRow(pos)
             self.tblConstraints.setItem(pos, 0, item)
-            self.available_constraints[pos] = constraints
 
     def initializeFitList(self):
@@ -461,5 +502,5 @@
 
         constraint.func = constraint_text
-        # constraint.param = param1
+        constraint.param = param1
         # Find the right tab
         constrained_tab = self.getObjectByName(model1)
Index: src/sas/qtgui/Perspectives/Fitting/Constraints.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/Constraints.py	(revision eae226b35388c002e867fa4776c854350a870842)
+++ src/sas/qtgui/Perspectives/Fitting/Constraints.py	(revision ba01ad131050e05053ee2ab2bf5c139e9617c9d9)
@@ -7,5 +7,5 @@
         self._param = param
         self._func = func
-        self.active = False
+        self.active = True
         self._min = min
         self._max = max
@@ -53,17 +53,2 @@
     def delete(self, constraint=None):
         pass
-
-
-class ConstrainedParameters(object):
-    """
-    Representation of two constrained parameters
-    """
-    def __init__(self, parent=None):
-        pass
-
-    def add(self, constraint=None):
-        pass
-
-    def delete(self, constraint=None):
-        pass
-
Index: src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision c5a2722f197a9627bc7cc20bc4bba9ff4e13b82a)
+++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision ba01ad131050e05053ee2ab2bf5c139e9617c9d9)
@@ -783,4 +783,14 @@
         return params
 
+    def getConstraintObjectsForModel(self):
+        """
+        Returns Constraint objects present on the whole model
+        """
+        param_number = self._model_model.rowCount()
+        constraints = [self._model_model.item(s, 1).child(0).data()
+                       for s in range(param_number) if self.rowHasConstraint(s)]
+
+        return constraints
+
     def showModelDescription(self):
         """
