Index: src/sas/qtgui/Perspectives/Inversion/DMaxExplorerWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Inversion/DMaxExplorerWidget.py	(revision 6da860acc5670055935e7bdc8678d3827d1a057f)
+++ src/sas/qtgui/Perspectives/Inversion/DMaxExplorerWidget.py	(revision 72ecbdf22c121ae7a0f43b886ce56a9b503fed04)
@@ -153,14 +153,14 @@
         if plotter == "ÏÂ²/dof":
             ys = chi2
-            y_label = "\chi^2/dof"
+            y_label = "\\chi^2/dof"
             y_unit = "a.u."
         elif plotter == "I(Q=0)":
             ys = iq0
             y_label = "I(q=0)"
-            y_unit = "\AA^{-1}"
+            y_unit = "\\AA^{-1}"
         elif plotter == "Rg":
             ys = rg
             y_label = "R_g"
-            y_unit = "\AA"
+            y_unit = "\\AA"
         elif plotter == "Oscillation parameter":
             ys = osc
@@ -170,5 +170,5 @@
             ys = bck
             y_label = "Bckg"
-            y_unit = "\AA^{-1}"
+            y_unit = "\\AA^{-1}"
         elif plotter == "Positive Fraction":
             ys = pos
@@ -177,5 +177,5 @@
         else:
             ys = pos_err
-            y_label = "P^{+}_{1\sigma}"
+            y_label = "P^{+}_{1\\sigma}"
             y_unit = "a.u."
 
Index: src/sas/qtgui/Perspectives/Inversion/InversionPerspective.py
===================================================================
--- src/sas/qtgui/Perspectives/Inversion/InversionPerspective.py	(revision 6da860acc5670055935e7bdc8678d3827d1a057f)
+++ src/sas/qtgui/Perspectives/Inversion/InversionPerspective.py	(revision 72ecbdf22c121ae7a0f43b886ce56a9b503fed04)
@@ -79,4 +79,5 @@
         self.estimationThread = None
         self.estimationThreadNT = None
+        self.isCalculating = False
 
         # Mapping for all data items
@@ -167,4 +168,5 @@
         self.calculateAllButton.clicked.connect(self.startThreadAll)
         self.calculateThisButton.clicked.connect(self.startThread)
+        self.stopButton.clicked.connect(self.stopCalculation)
         self.removeButton.clicked.connect(self.removeData)
         self.helpButton.clicked.connect(self.help)
@@ -301,9 +303,12 @@
         """
         self.calculateAllButton.setEnabled(len(self._dataList) > 1
-                                           and not self.isBatch)
+                                           and not self.isBatch
+                                           and not self.isCalculating)
         self.calculateThisButton.setEnabled(self.logic.data_is_loaded
-                                            and not self.isBatch)
+                                            and not self.isBatch
+                                            and not self.isCalculating)
         self.removeButton.setEnabled(self.logic.data_is_loaded)
         self.explorerButton.setEnabled(self.logic.data_is_loaded)
+        self.stopButton.setVisible(self.isCalculating)
         self.regConstantSuggestionButton.setEnabled(
             self.logic.data_is_loaded and
@@ -413,4 +418,19 @@
             self.batchResultsWindow.setupTable(self.batchResults)
         self.batchResultsWindow.show()
+
+    def stopCalculation(self):
+        """ Stop all threads, return to the base state and update GUI """
+        if self.calcThread:
+            self.calcThread.stop()
+        if self.estimationThread:
+            self.estimationThread.stop()
+        if self.estimationThreadNT:
+            self.estimationThreadNT.stop()
+        # Show any batch calculations that successfully completed
+        if self.isBatch and self.batchResultsWindow is not None:
+            self.showBatchOutput()
+        self.isBatch = False
+        self.isCalculating = False
+        self.updateGuiValues()
 
     ######################################################################
@@ -571,4 +591,5 @@
 
     def startThreadAll(self):
+        self.isCalculating = True
         self.isBatch = True
         self.batchComplete = []
@@ -592,4 +613,5 @@
         else:
             # If no data sets left, end batch calculation
+            self.isCalculating = False
             self.batchComplete = []
             self.calculateAllButton.setText("Calculate All")
@@ -604,8 +626,8 @@
 
         # Set data before running the calculations
+        self.isCalculating = True
+        self.enableButtons()
         self.updateCalculator()
         # Disable calculation buttons to prevent thread interference
-        self.calculateAllButton.setEnabled(False)
-        self.calculateThisButton.setEnabled(False)
 
         # If a thread is already started, stop it
@@ -744,8 +766,10 @@
         # Udpate internals and GUI
         self.updateDataList(self._data)
-        self.updateGuiValues()
         if self.isBatch:
             self.batchComplete.append(self.dataList.currentIndex())
             self.startNextBatchItem()
+        else:
+            self.isCalculating = False
+        self.updateGuiValues()
 
     def _threadError(self, error):
Index: src/sas/qtgui/Perspectives/Inversion/UI/TabbedInversionUI.ui
===================================================================
--- src/sas/qtgui/Perspectives/Inversion/UI/TabbedInversionUI.ui	(revision 8f83719fd67e6a72acdcd666e7bf1e2326b52cd0)
+++ src/sas/qtgui/Perspectives/Inversion/UI/TabbedInversionUI.ui	(revision 72ecbdf22c121ae7a0f43b886ce56a9b503fed04)
@@ -317,5 +317,5 @@
            <widget class="QLabel" name="label_22">
             <property name="text">
-             <string>      </string>
+             <string/>
             </property>
            </widget>
@@ -754,4 +754,11 @@
      </item>
      <item>
+      <widget class="QPushButton" name="stopButton">
+       <property name="text">
+        <string>Stop P(r)</string>
+       </property>
+      </widget>
+     </item>
+     <item>
       <spacer name="horizontalSpacer">
        <property name="orientation">
Index: src/sas/qtgui/Perspectives/Inversion/UnitTesting/InversionPerspectiveTest.py
===================================================================
--- src/sas/qtgui/Perspectives/Inversion/UnitTesting/InversionPerspectiveTest.py	(revision 6bd0d81fefd8473ca1aa28b72832f7323a5b8183)
+++ src/sas/qtgui/Perspectives/Inversion/UnitTesting/InversionPerspectiveTest.py	(revision 72ecbdf22c121ae7a0f43b886ce56a9b503fed04)
@@ -58,4 +58,5 @@
         self.assertEqual(self.widget.windowTitle(), "P(r) Inversion Perspective")
         self.assertFalse(self.widget.isClosable())
+        self.assertFalse(self.widget.isCalculating)
         # mapper
         self.assertIsInstance(self.widget.mapper, QtWidgets.QDataWidgetMapper)
@@ -76,4 +77,6 @@
         self.assertFalse(self.widget.calculateThisButton.isEnabled())
         self.assertFalse(self.widget.removeButton.isEnabled())
+        self.assertTrue(self.widget.stopButton.isEnabled())
+        self.assertFalse(self.widget.stopButton.isVisible())
         self.assertFalse(self.widget.regConstantSuggestionButton.isEnabled())
         self.assertFalse(self.widget.noOfTermsSuggestionButton.isEnabled())
@@ -154,14 +157,22 @@
         self.twoDataSetState()
         self.widget.calculateAllButton.click()
+        self.assertTrue(self.widget.isCalculating)
+        self.assertTrue(self.widget.isBatch)
+        self.assertTrue(self.widget.stopButton.isVisible())
+        self.assertTrue(self.widget.stopButton.isEnabled())
         self.assertIsNotNone(self.widget.batchResultsWindow)
         self.assertTrue(self.widget.batchResultsWindow.cmdHelp.isEnabled())
         self.assertEqual(self.widget.batchResultsWindow.tblParams.columnCount(), 9)
         self.assertEqual(self.widget.batchResultsWindow.tblParams.rowCount(), 2)
-        if self.widget.isBatch:
-            self.widget.isBatch = False
+        # Test stop button
+        self.widget.stopButton.click()
+        self.assertTrue(self.widget.batchResultsWindow.isVisible())
+        self.assertFalse(self.widget.stopButton.isVisible())
+        self.assertTrue(self.widget.stopButton.isEnabled())
+        self.assertFalse(self.widget.isBatch)
+        self.assertFalse(self.widget.isCalculating)
         self.widget.batchResultsWindow.close()
         self.assertIsNone(self.widget.batchResultsWindow)
         # Last test
-        self.widget.removeData()
         self.removeAllData()
         self.baseBatchState()
@@ -218,5 +229,5 @@
             self.widget.noOfTermsInput.setText("")
             n = self.widget.getNFunc()
-            self.assertEqual(cm.output, ['ERROR:root:Incorrect number of terms specified: '])
+            self.assertEqual(cm.output, ['ERROR:sas.qtgui.Perspectives.Inversion.InversionPerspective:Incorrect number of terms specified: '])
         self.assertEqual(self.widget.getNFunc(), 10)
         # string
@@ -224,5 +235,5 @@
             self.widget.noOfTermsInput.setText("Nordvest Pizza")
             n = self.widget.getNFunc()
-            self.assertEqual(cm.output, ['ERROR:root:Incorrect number of terms specified: Nordvest Pizza'])
+            self.assertEqual(cm.output, ['ERROR:sas.qtgui.Perspectives.Inversion.InversionPerspective:Incorrect number of terms specified: Nordvest Pizza'])
         self.assertEqual(self.widget.getNFunc(), 10)
         self.removeAllData()
