Index: src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision d6e3866160051b03e5bdb581acf0fd2227b090b4)
+++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision ded5e77dee7514710580502d488f33dd8b6acc19)
@@ -191,4 +191,8 @@
         self.is_batch_fitting = False
         self.is_chain_fitting = False
+        # Is the fit job running?
+        self.fit_started=False
+        # The current fit thread
+        self.calc_fit = None
         # Current SasModel in view
         self.kernel_module = None
@@ -1200,4 +1204,8 @@
         Perform fitting on the current data
         """
+        if self.fit_started:
+            self.stopFit()
+            return
+
         # initialize fitter constants
         fit_id = 0
@@ -1226,5 +1234,5 @@
         completefn = self.batchFittingCompleted if self.is_batch_fitting else self.fittingCompleted
 
-        calc_fit = FitThread(handler=handler,
+        self.calc_fit = FitThread(handler=handler,
                             fn=fitters,
                             batch_inputs=batch_inputs,
@@ -1237,16 +1245,31 @@
         if LocalConfig.USING_TWISTED:
             # start the trhrhread with twisted
-            calc_thread = threads.deferToThread(calc_fit.compute)
+            calc_thread = threads.deferToThread(self.calc_fit.compute)
             calc_thread.addCallback(completefn)
             calc_thread.addErrback(self.fitFailed)
         else:
             # Use the old python threads + Queue
-            calc_fit.queue()
-            calc_fit.ready(2.5)
+            self.calc_fit.queue()
+            self.calc_fit.ready(2.5)
 
         self.communicate.statusBarUpdateSignal.emit('Fitting started...')
+        self.fit_started = True
         # Disable some elements
         self.setFittingStarted()
 
+    def stopFit(self):
+        """
+        Attempt to stop the fitting thread
+        """
+        if self.calc_fit is None or not self.calc_fit.isrunning():
+            return
+        self.calc_fit.stop()
+        #self.fit_started=False
+        #re-enable the Fit button
+        self.setFittingStopped()
+
+        msg = "Fitting cancelled."
+        self.communicate.statusBarUpdateSignal.emit(msg)
+
     def updateFit(self):
         """
@@ -1258,6 +1281,7 @@
         """
         """
-        print("FIT FAILED: ", reason)
-        pass
+        self.setFittingStopped()
+        msg = "Fitting failed with: "+ str(reason)
+        self.communicate.statusBarUpdateSignal.emit(msg)
 
     def batchFittingCompleted(self, result):
@@ -1309,5 +1333,9 @@
 
         elapsed = result[1]
-        msg = "Fitting completed successfully in: %s s.\n" % GuiUtils.formatNumber(elapsed)
+        if self.calc_fit._interrupting:
+            msg = "Fitting cancelled by user after: %s s." % GuiUtils.formatNumber(elapsed)
+            logging.warning("\n"+msg+"\n")
+        else:
+            msg = "Fitting completed successfully in: %s s." % GuiUtils.formatNumber(elapsed)
         self.communicate.statusBarUpdateSignal.emit(msg)
 
@@ -2386,17 +2414,19 @@
     def setFittingStarted(self):
         """
-        Set item enablement on fitting start
-        """
-        #disable the Fit button
-        self.cmdFit.setText('Running...')
-        self.cmdFit.setEnabled(False)
+        Set buttion caption on fitting start
+        """
+        # Notify the user that fitting is being run
+        # Allow for stopping the job
+        self.cmdFit.setStyleSheet('QPushButton {color: red;}')
+        self.cmdFit.setText('Stop fit')
 
     def setFittingStopped(self):
         """
-        Set item enablement on fitting stop
-        """
-        #enable the Fit button
+        Set button caption on fitting stop
+        """
+        # Notify the user that fitting is available
+        self.cmdFit.setStyleSheet('QPushButton {color: black;}')
         self.cmdFit.setText("Fit")
-        self.cmdFit.setEnabled(True)
+        self.fit_started = False
 
     def readFitPage(self, fp):
