Index: src/sans/fit/BumpsFitting.py
===================================================================
--- src/sans/fit/BumpsFitting.py	(revision 50445434de810f6e2fe3e599b5e6d1ce511e4c7d)
+++ src/sans/fit/BumpsFitting.py	(revision 35086c376da47d05700c3626c9cd3805b38871a2)
@@ -2,4 +2,6 @@
 BumpsFitting module runs the bumps optimizer.
 """
+from datetime import timedelta, datetime
+
 import numpy
 
@@ -13,8 +15,40 @@
 from .expression import compile_constraints
 
+class Progress(object):
+    def __init__(self, history, max_step, pars, dof):
+        remaining_time = int(history.time[0]*(float(max_step)/history.step[0]-1))
+        # Depending on the time remaining, either display the expected
+        # time of completion, or the amount of time remaining.  Use precision
+        # appropriate for the duration.
+        if remaining_time >= 1800:
+            completion_time = datetime.now() + timedelta(seconds=remaining_time)
+            if remaining_time >= 36000:
+                time = completion_time.strftime('%Y-%m-%d %H:%M')
+            else:
+                time = completion_time.strftime('%H:%M')
+        else:
+            if remaining_time >= 3600:
+                time = '%dh %dm'%(remaining_time//3600, (remaining_time%3600)//60)
+            elif remaining_time >= 60:
+                time = '%dm %ds'%(remaining_time//60, remaining_time%60)
+            else:
+                time = '%ds'%remaining_time
+        chisq = "%.3g"%(2*history.value[0]/dof)
+        step = "%d of %d"%(history.step[0], max_step)
+        header = "=== Steps: %s  chisq: %s  ETA: %s\n"%(step, chisq, time)
+        parameters = ["%15s: %-10.3g%s"%(k,v,("\n" if i%3==2 else " | "))
+                      for i,(k,v) in enumerate(zip(pars,history.point[0]))]
+        self.msg = "".join([header]+parameters)
+
+    def __str__(self):
+        return self.msg
+
+
 class BumpsMonitor(object):
-    def __init__(self, handler, max_step=0):
+    def __init__(self, handler, max_step, pars, dof):
         self.handler = handler
         self.max_step = max_step
+        self.pars = pars
+        self.dof = dof
 
     def config_history(self, history):
@@ -23,4 +57,5 @@
     def __call__(self, history):
         if self.handler is None: return
+        self.handler.set_result(Progress(history, self.max_step, self.pars, self.dof))
         self.handler.progress(history.step[0], self.max_step)
         if len(history.step)>1 and history.step[1] > history.step[0]:
@@ -252,6 +287,7 @@
     options = fitopts.options.copy()
     max_step = fitopts.options.get('steps', 0) + fitopts.options.get('burn', 0)
+    pars = [p.name for p in problem._parameters]
     options['monitors'] = [
-        BumpsMonitor(handler, max_step),
+        BumpsMonitor(handler, max_step, pars, problem.dof),
         ConvergenceMonitor(),
         ]
Index: src/sans/perspectives/fitting/console.py
===================================================================
--- src/sans/perspectives/fitting/console.py	(revision 644ca73017baa0189f6424c93e070248941b265a)
+++ src/sans/perspectives/fitting/console.py	(revision 35086c376da47d05700c3626c9cd3805b38871a2)
@@ -128,5 +128,5 @@
             
         
-    def update_fit(self, msg="", last=False):
+    def update_fit(self, last=False):
         """
         """
@@ -135,5 +135,5 @@
         self.update_duration = t1
         self.fit_duration += self.elapsed_time
-        str_time = time.strftime("%a, %d %b %Y %H:%M:%S ", time.localtime(t1))
+        str_time = time.strftime("%Y-%m-%d %H:%M:%S ", time.localtime(t1))
         UPDATE_INTERVAL = 5.0
         u_flag = False
@@ -141,8 +141,5 @@
             self.fit_duration = 0
             u_flag = True
-        if not last:
-            msg += "Fit Updates ... %s \n" % str_time    
-        else:
-            msg += "Final updates ........."
+        msg = str_time
         if u_flag or last:
             if self.result is not None:
@@ -163,7 +160,4 @@
                 msg +=  str(self.result)
                 msg += "\n"
-                if not last:
-                    msg += "About %s s elapsed......... \n" % \
-                                            str (UPDATE_INTERVAL)
             else:
                 msg += "No result available\n"
