Index: src/sas/qtgui/Perspectives/Fitting/ConsoleUpdate.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/ConsoleUpdate.py	(revision 7adc2a84d2456b9691bc21cec9f25ad5a71b0aa5)
+++ src/sas/qtgui/Perspectives/Fitting/ConsoleUpdate.py	(revision 7adc2a84d2456b9691bc21cec9f25ad5a71b0aa5)
@@ -0,0 +1,166 @@
+import time
+import logging
+from sas.sascalc.fit import FitHandler
+
+class ConsoleUpdate(FitHandler):
+    """
+    Print progress to the console.
+    """
+    isbetter = False
+    """Record whether results improved since last update"""
+    progress_delta = 60
+    """Number of seconds between progress updates"""
+    improvement_delta = 5
+    """Number of seconds between improvement updates"""
+    def __init__(self, parent, manager=None,
+                 quiet=False, progress_delta=60, improvement_delta=5):
+        """
+        If quiet is true, only print out final summary, not progress and
+        improvements.
+
+        :attr parent: the object that handle the messages
+
+        """
+        self.parent = parent
+        self.manager = manager
+        self.progress_time = time.time()
+        self.progress_percent = 0
+        self.improvement_time = self.progress_time
+        self.isbetter = False
+        self.quiet = quiet
+        self.progress_delta = progress_delta
+        self.improvement_delta = improvement_delta
+        self.elapsed_time = time.time()
+        self.update_duration = time.time()
+        self.fit_duration = 0
+
+
+    def progress(self, k, n):
+        """
+        Report on progress.
+        """
+        if self.quiet: return
+
+        t = time.time()
+        p = int((100 * k) // n)
+
+        # Show improvements if there are any
+        dt = t - self.improvement_time
+        if self.isbetter and dt > self.improvement_delta:
+            #self.result.print_summary()
+            self.update_fit()
+            self.isbetter = False
+            self.improvement_time = t
+
+        # Update percent complete
+        dp = p - self.progress_percent
+        if dp < 1: return
+        dt = t - self.progress_time
+        if dt > self.progress_delta:
+            if 1 <= dp <= 2:
+                self.progress_percent = p
+                self.progress_time = t
+                self.update_fit()
+            elif 2 < dp <= 5:
+                if p // 5 != self.progress_percent // 5:
+                    self.progress_percent = p
+                    self.progress_time = t
+            else:
+                if p // 10 != self.progress_percent // 10:
+                    self.progress_percent = p
+                    self.progress_time = t
+                    self.update_fit()
+
+    def improvement(self):
+        """
+        Called when a result is observed which is better than previous
+        results from the fit.
+        """
+        self.isbetter = True
+
+    def print_result(self):
+        """
+        Print result object
+        """
+        msg = " \n %s \n" % str(self.result)
+        logging.info(msg)
+
+    def error(self, msg):
+        """
+        Model had an error; print traceback
+        """
+        if self.isbetter:
+            self.update_fit()
+
+        message = str(msg) + " \n %s \n" % self.result.__str__()
+        logging.error(message)
+
+    def stop(self, msg):
+        """
+        Post event msg and stop
+        """
+        if self.isbetter:
+            self.update_fit()
+
+        message = str(msg) + " \n %s \n" % self.result.__str__()
+        logging.info(message)
+
+    def finalize(self):
+        """
+        """
+        if self.isbetter:
+            self.update_fit()
+
+    def abort(self):
+        """
+        """
+        if self.isbetter:
+            self.update_fit()
+
+
+    def update_fit(self, last=False):
+        """
+        """
+        t1 = time.time()
+        self.elapsed_time = t1 - self.update_duration
+        self.update_duration = t1
+        self.fit_duration += self.elapsed_time
+        str_time = time.strftime("%Y-%m-%d %H:%M:%S ", time.localtime(t1))
+        UPDATE_INTERVAL = 5.0
+        u_flag = False
+        if self.fit_duration >= UPDATE_INTERVAL:
+            self.fit_duration = 0
+            u_flag = True
+        msg = str_time
+        if u_flag or last:
+            if self.result is not None:
+                data_name, model_name = None, None
+                d_flag = (hasattr(self.result, "data") and \
+                    self.result.data is not None and \
+                    hasattr(self.result.data, "sas_data") and
+                    self.result.data.sas_data is not None)
+                m_flag = (hasattr(self.result, "model") and \
+                          self.result.model is not None)
+                if d_flag:
+                    data_name = self.result.data.sas_data.name
+                if m_flag:
+                    model_name = str(self.result.model.name)
+                if m_flag and d_flag:
+                    msg += "Data : %s \n" % (str(data_name))#,
+                                                     #str(model_name))
+                msg += str(self.result)
+                msg += "\n"
+            else:
+                msg += "No result available\n"
+
+            logging.info(msg)
+
+    def set_result(self, result):
+        """
+        """
+        self.result = result
+
+    def get_result(self):
+        """
+        """
+        return self.result
Index: src/sas/qtgui/Perspectives/Fitting/FitThread.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FitThread.py	(revision dc5ef150e8b37e01a3b7e253eb5b66d3b82de99c)
+++ src/sas/qtgui/Perspectives/Fitting/FitThread.py	(revision 7adc2a84d2456b9691bc21cec9f25ad5a71b0aa5)
@@ -74,13 +74,9 @@
                          list_reset_flag)
             result = map(map_apply, inputs)
-
-            self.complete(result=result,
-                          batch_inputs=self.batch_inputs,
-                          batch_outputs=self.batch_outputs,
-                          page_id=self.page_id,
-                          pars=self.pars,
-                          elapsed=time.time() - self.starttime)
-
-            return result[0], time.time()-self.starttime
+            results = (result[0], time.time()-self.starttime)
+            if self.handler:
+                self.completefn(results)
+            else:
+                return (results)
 
         except KeyboardInterrupt, msg:
@@ -96,4 +92,5 @@
                 self.handler.stop(msg=msg)
         except Exception as ex:
+            # print "ERROR IN FIT THREAD: ", traceback.format_exc()
             if self.handler is not None:
                 self.handler.error(msg=traceback.format_exc())
Index: src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision 0d138146627d7bf2167711ba8d54c57a39c48f87)
+++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision 7adc2a84d2456b9691bc21cec9f25ad5a71b0aa5)
@@ -27,4 +27,6 @@
 from sas.qtgui.Perspectives.Fitting.UI.FittingWidgetUI import Ui_FittingWidgetUI
 from sas.qtgui.Perspectives.Fitting.FitThread import FitThread
+from sas.qtgui.Perspectives.Fitting.ConsoleUpdate import ConsoleUpdate
+
 from sas.qtgui.Perspectives.Fitting.ModelThread import Calc1D
 from sas.qtgui.Perspectives.Fitting.ModelThread import Calc2D
@@ -45,4 +47,6 @@
 
 DEFAULT_POLYDISP_FUNCTION = 'gaussian'
+
+USING_TWISTED = True
 
 class FittingWidget(QtGui.QWidget, Ui_FittingWidgetUI):
@@ -636,4 +640,12 @@
         list_page_id = [page_id]
         #---------------------------------
+        if USING_TWISTED:
+            handler = None
+            updater = None
+        else:
+            handler = ConsoleUpdate(parent=self.parent,
+                                    manager=self,
+                                    improvement_delta=0.1)
+            updater = handler.update_fit
 
         # Parameterize the fitter
@@ -653,14 +665,20 @@
                              batch_outputs=batch_outputs,
                              page_id=list_page_id,
-                             updatefn=self.updateFit,
-                             completefn=None)
-
-        # start the trhrhread
-        calc_thread = threads.deferToThread(calc_fit.compute)
-        calc_thread.addCallback(self.fitComplete)
-        calc_thread.addErrback(self.fitFailed)
+                             updatefn=updater,
+                             completefn=self.fitComplete)
+
+        if USING_TWISTED:
+            # start the trhrhread with twisted
+            calc_thread = threads.deferToThread(calc_fit.compute)
+            calc_thread.addCallback(self.fitComplete)
+            calc_thread.addErrback(self.fitFailed)
+        else:
+            # Use the old python threads + Queue
+            calc_fit.queue()
+            calc_fit.ready(2.5)
+
 
         #disable the Fit button
-        self.cmdFit.setText('Calculating...')
+        self.cmdFit.setText('Running...')
         self.communicate.statusBarUpdateSignal.emit('Fitting started...')
         self.cmdFit.setEnabled(False)
Index: src/sas/qtgui/Perspectives/__init__.py
===================================================================
--- src/sas/qtgui/Perspectives/__init__.py	(revision 83d6249504661920123f31d028c17441433bf318)
+++ src/sas/qtgui/Perspectives/__init__.py	(revision 7adc2a84d2456b9691bc21cec9f25ad5a71b0aa5)
