Index: src/sas/sasgui/guiframe/data_processor.py
===================================================================
--- src/sas/sasgui/guiframe/data_processor.py	(revision d85c194ea2f78cb2b9b3de9c969e1b8ebea6b6d2)
+++ src/sas/sasgui/guiframe/data_processor.py	(revision fce0139c1a0044b502cd736ab4de587f5297141d)
@@ -10,5 +10,7 @@
 The organization of the classes goes as:
 
-.. image::  ../../user/guiframe/BatchGridClassLayout.png
+#Path to this is:           /sasview/src/sas/sasgui/guiframe/data_processor.py
+#Path to image is:          /sasview/src/sas/sasgui/guiframe/media/BatchGridClassLayout.png
+.. image::  ./guiframe/media/BatchGridClassLayout.png
    :align:   center
 
Index: src/sas/sasgui/guiframe/dummyapp.py
===================================================================
--- src/sas/sasgui/guiframe/dummyapp.py	(revision d85c194ea2f78cb2b9b3de9c969e1b8ebea6b6d2)
+++ src/sas/sasgui/guiframe/dummyapp.py	(revision b080ba832c690bc7605edb1b413eaca7c8330cc6)
@@ -7,5 +7,5 @@
 from sas.sasgui.guiframe.plugin_base import PluginBase
 
-class DummyView(gui_manager.ViewApp):
+class DummyView(gui_manager.SasViewApp):
     """
     """
Index: src/sas/sasgui/guiframe/gui_manager.py
===================================================================
--- src/sas/sasgui/guiframe/gui_manager.py	(revision 0d534de9f869910429443e7898a0b7ab65db05a7)
+++ src/sas/sasgui/guiframe/gui_manager.py	(revision b080ba832c690bc7605edb1b413eaca7c8330cc6)
@@ -3480,4 +3480,4 @@
 
 if __name__ == "__main__":
-    app = ViewApp(0)
+    app = SasViewApp(0)
     app.MainLoop()
Index: src/sas/sasgui/perspectives/fitting/batchfitpage.py
===================================================================
--- src/sas/sasgui/perspectives/fitting/batchfitpage.py	(revision d85c194ea2f78cb2b9b3de9c969e1b8ebea6b6d2)
+++ src/sas/sasgui/perspectives/fitting/batchfitpage.py	(revision fc18690cd84cc4dd6e33a9d344f47b08cef71290)
@@ -15,5 +15,5 @@
 
 from sas.sasgui.perspectives.fitting.basepage import PageInfoEvent
-from sas.models.qsmearing import smear_selection
+from sas.sascalc.data_util.qsmearing import smear_selection
 from sas.sasgui.perspectives.fitting.fitpage import FitPage
 from sas.sasgui.perspectives.fitting.fitpage import check_data_validity
Index: src/sas/sasgui/perspectives/fitting/fit_thread.py
===================================================================
--- src/sas/sasgui/perspectives/fitting/fit_thread.py	(revision d85c194ea2f78cb2b9b3de9c969e1b8ebea6b6d2)
+++ src/sas/sasgui/perspectives/fitting/fit_thread.py	(revision aac161f1844b41bce09c87d7b6c7a3fc1f1f8712)
@@ -96,4 +96,6 @@
             #some mssg and reset progress bar.
 
+            # Shouldn't this be re-raising? ConsoleUpdate doesn't act on it.
+            # raise KeyboardInterrupt
             if self.handler is not None:
                 self.handler.stop(msg=msg)
Index: src/sas/sasgui/perspectives/fitting/fitpage.py
===================================================================
--- src/sas/sasgui/perspectives/fitting/fitpage.py	(revision 7d265a865a8c1cafe9ff03df4daf316b140a51e8)
+++ src/sas/sasgui/perspectives/fitting/fitpage.py	(revision fc18690cd84cc4dd6e33a9d344f47b08cef71290)
@@ -26,5 +26,5 @@
 from sas.sasgui.perspectives.fitting.basepage import BasicPage as BasicPage
 from sas.sasgui.perspectives.fitting.basepage import PageInfoEvent as PageInfoEvent
-from sas.models.qsmearing import smear_selection
+from sas.sascalc.data_util.qsmearing import smear_selection
 from .basepage import ModelTextCtrl
 
Index: src/sas/sasgui/perspectives/fitting/fitproblem.py
===================================================================
--- src/sas/sasgui/perspectives/fitting/fitproblem.py	(revision d85c194ea2f78cb2b9b3de9c969e1b8ebea6b6d2)
+++ src/sas/sasgui/perspectives/fitting/fitproblem.py	(revision fc18690cd84cc4dd6e33a9d344f47b08cef71290)
@@ -14,5 +14,5 @@
 ################################################################################
 import copy
-from sas.models.qsmearing import smear_selection
+from sas.sascalc.data_util.qsmearing import smear_selection
 
 class FitProblemComponent(object):
Index: src/sas/sasgui/perspectives/fitting/fitting.py
===================================================================
--- src/sas/sasgui/perspectives/fitting/fitting.py	(revision d85c194ea2f78cb2b9b3de9c969e1b8ebea6b6d2)
+++ src/sas/sasgui/perspectives/fitting/fitting.py	(revision aac161f1844b41bce09c87d7b6c7a3fc1f1f8712)
@@ -1483,4 +1483,10 @@
         try:
             index = 0
+            # Update potential simfit page(s)
+            if self.sim_page is not None:
+                self.sim_page._on_fit_complete()
+            if self.batch_page:
+                self.batch_page._on_fit_complete()
+            # Update all fit pages
             for uid in page_id:
                 res = result[index]
Index: src/sas/sasgui/perspectives/fitting/pagestate.py
===================================================================
--- src/sas/sasgui/perspectives/fitting/pagestate.py	(revision d85c194ea2f78cb2b9b3de9c969e1b8ebea6b6d2)
+++ src/sas/sasgui/perspectives/fitting/pagestate.py	(revision c10d9d6c8667422d3db329ac32d0528a6cce3fc6)
@@ -1613,5 +1613,5 @@
 
         if state.data is None:
-            data = sas.dataloader.data_info.Data1D(x=[], y=[])
+            data = sas.sascalc.dataloader.data_info.Data1D(x=[], y=[])
             return None
         elif not state.data.is_data:
@@ -1626,5 +1626,5 @@
 
             if issubclass(state.data.__class__,
-                          sas.dataloader.data_info.Data1D):
+                          sas.sascalc.dataloader.data_info.Data1D):
                 data = state.data
                 doc, sasentry = self._to_xml_doc(data)
Index: src/sas/sasgui/perspectives/fitting/simfitpage.py
===================================================================
--- src/sas/sasgui/perspectives/fitting/simfitpage.py	(revision d85c194ea2f78cb2b9b3de9c969e1b8ebea6b6d2)
+++ src/sas/sasgui/perspectives/fitting/simfitpage.py	(revision aac161f1844b41bce09c87d7b6c7a3fc1f1f8712)
@@ -91,4 +91,6 @@
         ## selected mdoel to fit
         self.model_toFit = []
+        ## Control the fit state
+        self.fit_started = False
         ## number of constraint
         self.nb_constraint = 0
@@ -423,4 +425,9 @@
 
         """
+        if self.fit_started:
+            self._stop_fit()
+            self.fit_started = False
+            return
+
         flag = False
         # check if the current page a simultaneous fit page or a batch page
@@ -439,4 +446,6 @@
                     self.manager.schedule_for_fit(value=1, uid=item[2])
             try:
+                self.fit_started = True
+                wx.CallAfter(self.set_fitbutton)
                 if not self.manager.onFit(uid=self.uid):
                     return
@@ -447,4 +456,32 @@
             msg = "Select at least one model check box to fit "
             wx.PostEvent(self.parent.parent, StatusEvent(status=msg))
+
+    def _on_fit_complete(self):
+        """
+        Set the completion flag and display the updated fit button label.
+        """
+        self.fit_started = False
+        self.set_fitbutton()
+
+    def _stop_fit(self, event=None):
+        """
+        Attempt to stop the fitting thread
+        """
+        if event != None:
+            event.Skip()
+        self.manager.stop_fit(self.uid)
+        self.manager._reset_schedule_problem(value=0)
+        self._on_fit_complete()
+
+    def set_fitbutton(self):
+        """
+        Set fit button label depending on the fit_started
+        """
+        label = "Stop" if self.fit_started else "Fit"
+        color = "red" if self.fit_started else "black"
+
+        self.btFit.SetLabel(label)
+        self.btFit.SetForegroundColour(color)
+        self.btFit.Enable(True)
 
     def _onHelp(self, event):
Index: src/sas/sasgui/perspectives/invariant/invariant.py
===================================================================
--- src/sas/sasgui/perspectives/invariant/invariant.py	(revision d85c194ea2f78cb2b9b3de9c969e1b8ebea6b6d2)
+++ src/sas/sasgui/perspectives/invariant/invariant.py	(revision c10d9d6c8667422d3db329ac32d0528a6cce3fc6)
@@ -237,5 +237,5 @@
         else:
             msg = "invariant.save_file: the data being saved is"
-            msg += " not a sas.dataloader.data_info.Data1D object"
+            msg += " not a sas.sascalc.dataloader.data_info.Data1D object"
             raise RuntimeError, msg
 
Index: src/sas/sasgui/perspectives/invariant/invariant_state.py
===================================================================
--- src/sas/sasgui/perspectives/invariant/invariant_state.py	(revision d85c194ea2f78cb2b9b3de9c969e1b8ebea6b6d2)
+++ src/sas/sasgui/perspectives/invariant/invariant_state.py	(revision c10d9d6c8667422d3db329ac32d0528a6cce3fc6)
@@ -773,6 +773,6 @@
         """
         if datainfo is None:
-            datainfo = sas.dataloader.data_info.Data1D(x=[], y=[])
-        elif not issubclass(datainfo.__class__, sas.dataloader.data_info.Data1D):
+            datainfo = sas.sascalc.dataloader.data_info.Data1D(x=[], y=[])
+        elif not issubclass(datainfo.__class__, sas.sascalc.dataloader.data_info.Data1D):
             msg = "The cansas writer expects a Data1D"
             msg += " instance: %s" % str(datainfo.__class__.__name__)
Index: src/sas/sasgui/perspectives/pr/pr.py
===================================================================
--- src/sas/sasgui/perspectives/pr/pr.py	(revision d85c194ea2f78cb2b9b3de9c969e1b8ebea6b6d2)
+++ src/sas/sasgui/perspectives/pr/pr.py	(revision c10d9d6c8667422d3db329ac32d0528a6cce3fc6)
@@ -896,5 +896,5 @@
         # First, check that the data is of the right type
         if issubclass(self.current_plottable.__class__,
-                      sas.dataloader.data_info.Data1D):
+                      sas.sascalc.dataloader.data_info.Data1D):
             self.state_reader.write(filepath, self.current_plottable, prstate)
         else:
