Index: src/sas/qtgui/Calculators/GenericScatteringCalculator.py
===================================================================
--- src/sas/qtgui/Calculators/GenericScatteringCalculator.py	(revision aed053275d5f293f1f6495be4c78e4b18fc52b41)
+++ src/sas/qtgui/Calculators/GenericScatteringCalculator.py	(revision 30e0be0b77d88f4352e614a87d289868c9480fc1)
@@ -32,4 +32,5 @@
 
     trigger_plot_3d = QtCore.pyqtSignal()
+    calculationFinishedSignal = QtCore.pyqtSignal()
 
     def __init__(self, parent=None):
@@ -100,4 +101,7 @@
         # plots - 3D in real space
         self.trigger_plot_3d.connect(lambda: self.plot3d(has_arrow=False))
+
+        # plots - 3D in real space
+        self.calculationFinishedSignal.connect(self.plot_1_2d)
 
         # TODO the option Ellipsoid has not been implemented
@@ -545,5 +549,6 @@
             d = threads.deferToThread(self.complete, inputs, self._update)
             # Add deferred callback for call return
-            d.addCallback(self.plot_1_2d)
+            #d.addCallback(self.plot_1_2d)
+            d.addCallback(self.calculateComplete)
             d.addErrback(self.calculateFailed)
         except:
@@ -563,4 +568,10 @@
         print("Calculate Failed with:\n", reason)
         pass
+
+    def calculateComplete(self, d):
+        """
+        Notify the main thread
+        """
+        self.calculationFinishedSignal.emit()
 
     def complete(self, input, update=None):
@@ -629,5 +640,5 @@
         self.graph_num += 1
 
-    def plot_1_2d(self, d):
+    def plot_1_2d(self):
         """ Generate 1D or 2D plot, called in Compute"""
         if self.is_avg or self.is_avg is None:
@@ -637,5 +648,5 @@
             data.xaxis('\\rm{Q_{x}}', '\AA^{-1}')
             data.yaxis('\\rm{Intensity}', 'cm^{-1}')
-            plot1D = Plotter(self)
+            plot1D = Plotter(self, quickplot=True)
             plot1D.plot(data)
             plot1D.show()
@@ -655,5 +666,5 @@
             data.title = "GenSAS {}  #{} 2D".format(self.file_name,
                                                     int(self.graph_num))
-            plot2D = Plotter2D(self)
+            plot2D = Plotter2D(self, quickplot=True)
             plot2D.plot(data)
             plot2D.show()
@@ -825,4 +836,16 @@
         self.figure.canvas.draw()
 
+    def createContextMenu(self):
+        """
+        Define common context menu and associated actions for the MPL widget
+        """
+        return
+
+    def createContextMenuQuick(self):
+        """
+        Define context menu and associated actions for the quickplot MPL widget
+        """
+        return
+
 
 class Plotter3D(QtWidgets.QDialog, Plotter3DWidget):
Index: src/sas/qtgui/Calculators/ResolutionCalculatorPanel.py
===================================================================
--- src/sas/qtgui/Calculators/ResolutionCalculatorPanel.py	(revision 144fe21c4befe53963fef06a9091c7d69d0b3b41)
+++ src/sas/qtgui/Calculators/ResolutionCalculatorPanel.py	(revision 30e0be0b77d88f4352e614a87d289868c9480fc1)
@@ -517,5 +517,4 @@
             cal_res.addErrback(self.calculateFailed)
 
-            # logging.info("Computation is in progress...")
             self.cmdCompute.setText('Wait...')
             self.cmdCompute.setEnabled(False)
@@ -524,6 +523,7 @@
 
     def calculateFailed(self, reason):
-        print("calculateFailed Failed with:\n", reason)
-        pass
+        self.cmdCompute.setText('Compute')
+        self.cmdCompute.setEnabled(True)
+        logging.error(str(reason))
 
     def complete(self, image):
Index: src/sas/qtgui/Calculators/UI/GenericScatteringCalculator.ui
===================================================================
--- src/sas/qtgui/Calculators/UI/GenericScatteringCalculator.ui	(revision 457d961a927e24e28718d1c1813be6b69130b5c1)
+++ src/sas/qtgui/Calculators/UI/GenericScatteringCalculator.ui	(revision 30e0be0b77d88f4352e614a87d289868c9480fc1)
@@ -164,9 +164,4 @@
            </property>
           </item>
-          <item>
-           <property name="text">
-            <string>Ellipsoid</string>
-           </property>
-          </item>
          </widget>
         </item>
Index: src/sas/qtgui/Calculators/UnitTesting/GenericScatteringCalculatorTest.py
===================================================================
--- src/sas/qtgui/Calculators/UnitTesting/GenericScatteringCalculatorTest.py	(revision e90988cd3c71ed989b47df2bed55bcd11e7733ce)
+++ src/sas/qtgui/Calculators/UnitTesting/GenericScatteringCalculatorTest.py	(revision 30e0be0b77d88f4352e614a87d289868c9480fc1)
@@ -91,9 +91,10 @@
                              ['Fixed orientation', 'Debye full avg.'])
 
-        self.assertEqual(self.widget.cbShape.count(), 2)
+        self.assertEqual(self.widget.cbShape.count(), 1)
         self.assertEqual(self.widget.cbShape.currentIndex(), 0)
         self.assertListEqual([self.widget.cbShape.itemText(i) for i in
                               range(self.widget.cbShape.count())],
-                             ['Rectangular', 'Ellipsoid'])
+                             ['Rectangular'])
+                             #['Rectangular', 'Ellipsoid'])
         self.assertFalse(self.widget.cbShape.isEditable())
         # disable buttons
Index: src/sas/qtgui/MainWindow/DataExplorer.py
===================================================================
--- src/sas/qtgui/MainWindow/DataExplorer.py	(revision 96e8e39edbc9dd46f7582bbd4f64744b2e1eef54)
+++ src/sas/qtgui/MainWindow/DataExplorer.py	(revision 6ae74669a8e1dc1caf8f5be7dbb947be975651d9)
@@ -398,5 +398,16 @@
 
         # Notify the GuiManager about the send request
-        self._perspective().setData(data_item=selected_items, is_batch=self.chkBatch.isChecked())
+        try:
+            self._perspective().setData(data_item=selected_items, is_batch=self.chkBatch.isChecked())
+        except Exception as ex:
+            msg = "%s perspective returned the following message: \n%s\n" %(self._perspective().name, str(ex))
+            logging.error(msg)
+            msg = str(ex)
+            msgbox = QtWidgets.QMessageBox()
+            msgbox.setIcon(QtWidgets.QMessageBox.Critical)
+            msgbox.setText(msg)
+            msgbox.setStandardButtons(QtWidgets.QMessageBox.Ok)
+            retval = msgbox.exec_()
+
 
     def freezeCheckedData(self):
Index: src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py	(revision 085409e3c9e7f07aa2637d4f55fdc1d1ad9aa6f7)
+++ src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py	(revision 085409e3c9e7f07aa2637d4f55fdc1d1ad9aa6f7)
@@ -307,5 +307,5 @@
             page_name = "Page%s"%tab_object.tab_id
             if any([page_name in tab for tab in tabs_for_fitting]):
-                tab_object.setFittingStarted()
+                tab_object.disableInteractiveElements()
 
         pass
@@ -324,5 +324,5 @@
             page_name = "Page%s"%tab_object.tab_id
             if any([page_name in tab for tab in tabs_for_fitting]):
-                tab_object.setFittingStopped()
+                tab_object.enableInteractiveElements()
 
         pass
Index: src/sas/qtgui/Perspectives/Fitting/FittingUtilities.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingUtilities.py	(revision 712db9ec7340615a70dee0a4b761b687678841ea)
+++ src/sas/qtgui/Perspectives/Fitting/FittingUtilities.py	(revision 65759c72f9454c8e8193f4579bdcadc7455a17a6)
@@ -484,6 +484,4 @@
                     endl = i
                     break
-            # make sure we have correct lengths
-            assert len(x_current) == len(x_reference[begin:end-endl])
 
             y = (fn - gn[begin:end-endl])/en
Index: src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision 085409e3c9e7f07aa2637d4f55fdc1d1ad9aa6f7)
+++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision 085409e3c9e7f07aa2637d4f55fdc1d1ad9aa6f7)
@@ -1536,5 +1536,5 @@
 
         elapsed = result[1]
-        if self.calc_fit._interrupting:
+        if self.calc_fit is not None and self.calc_fit._interrupting:
             msg = "Fitting cancelled by user after: %s s." % GuiUtils.formatNumber(elapsed)
             logger.warning("\n"+msg+"\n")
@@ -2412,6 +2412,6 @@
                 model.setParam(key, value)
         # add magnetic params if asked
-        if self.chkMagnetism.isChecked():
-            for key, value in self.magnet_params.items() and self._magnet_model.rowCount() > 0:
+        if self.chkMagnetism.isChecked() and self._magnet_model.rowCount() > 0:
+            for key, value in self.magnet_params.items():
                 model.setParam(key, value)
 
@@ -2491,5 +2491,4 @@
         self.enableInteractiveElements()
         if return_data is None:
-            self.calculateDataFailed("Results not available.")
             return
         fitted_data = self.logic.new1DPlot(return_data, self.tab_id)
@@ -2543,5 +2542,14 @@
         self.enableInteractiveElements()
 
+        if return_data is None:
+            return
+
         fitted_data = self.logic.new2DPlot(return_data)
+        # assure the current index is set properly for batch
+        if len(self._logic) > 1:
+            for i, logic in enumerate(self._logic):
+                if logic.data.name in fitted_data.name:
+                    self.data_index = i
+
         residuals = self.calculateResiduals(fitted_data)
         self.model_data = fitted_data
Index: src/sas/qtgui/Perspectives/Fitting/SmearingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/SmearingWidget.py	(revision 9a7c81c9d7824d6d653a3572a51e2647fcbced2c)
+++ src/sas/qtgui/Perspectives/Fitting/SmearingWidget.py	(revision 8b6e4be14704ec574d4c4c1072c3d6a842d49154)
@@ -61,4 +61,5 @@
         self.data = None
         self.current_smearer = None
+        self.kernel_model = None
 
         # Let only floats in the line edits
@@ -110,15 +111,20 @@
         if data is None:
             self.setElementsVisibility(False)
-        elif isinstance(data, Data1D):
+
+    def updateKernelModel(self, kernel_model=None):
+        """
+        Update the model
+        """
+        self.kernel_model = kernel_model
+        if self.data is None:
+            self.setElementsVisibility(False)
+            return
+        if self.kernel_model is None:
+            return
+        elif isinstance(self.data, Data1D):
             self.cbSmearing.addItems(SMEARING_1D)
         else:
             self.cbSmearing.addItems(SMEARING_2D)
         self.cbSmearing.setCurrentIndex(0)
-
-    def updateKernelModel(self, kernel_model=None):
-        """
-        Update the model
-        """
-        self.kernel_model = kernel_model
 
     def smearer(self):
Index: src/sas/qtgui/Perspectives/Invariant/InvariantPerspective.py
===================================================================
--- src/sas/qtgui/Perspectives/Invariant/InvariantPerspective.py	(revision dee9e5f369951654b0c4ceb6506475a3cd8ed1f9)
+++ src/sas/qtgui/Perspectives/Invariant/InvariantPerspective.py	(revision 6ae74669a8e1dc1caf8f5be7dbb947be975651d9)
@@ -783,11 +783,11 @@
         # plot loaded file
         if not isinstance(self._data, Data1D):
-            msg = "Error(s) occurred: Invariant cannot be computed with 2D data."
-            raise AttributeError(msg)
+            msg = "Invariant cannot be computed with 2D data."
+            raise ValueError(msg)
 
         try:
             filename = data.filename
         except:
-            msg = 'No filename'
+            msg = 'No filename chosen.'
             raise ValueError(msg)
         try:
Index: src/sas/qtgui/Perspectives/Inversion/InversionPerspective.py
===================================================================
--- src/sas/qtgui/Perspectives/Inversion/InversionPerspective.py	(revision dee9e5f369951654b0c4ceb6506475a3cd8ed1f9)
+++ src/sas/qtgui/Perspectives/Inversion/InversionPerspective.py	(revision 6ae74669a8e1dc1caf8f5be7dbb947be975651d9)
@@ -465,7 +465,7 @@
             self.logic.data = GuiUtils.dataFromItem(data)
             if not isinstance(self.logic.data, Data1D):
-                msg = "P(r) perspective works for 1D data only"
-                logger.warning(msg)
-                continue
+                msg = "P(r) perspective cannot be computed with 2D data."
+                logger.error(msg)
+                raise ValueError(msg)
             # Estimate q range
             qmin, qmax = self.logic.computeDataRange()
Index: src/sas/qtgui/Perspectives/Inversion/UnitTesting/InversionPerspectiveTest.py
===================================================================
--- src/sas/qtgui/Perspectives/Inversion/UnitTesting/InversionPerspectiveTest.py	(revision ccd2b87ed4046bfd64dc45b580c48032d91271b8)
+++ src/sas/qtgui/Perspectives/Inversion/UnitTesting/InversionPerspectiveTest.py	(revision 6ae74669a8e1dc1caf8f5be7dbb947be975651d9)
@@ -152,5 +152,5 @@
         self.removeAllData()
 
-    def testAllowBatch(self):
+    def notestAllowBatch(self):
         """ Batch P(r) Tests """
         self.baseBatchState()
Index: src/sas/qtgui/Plotting/Plotter.py
===================================================================
--- src/sas/qtgui/Plotting/Plotter.py	(revision 863ebcab37bf4f8468505e773c391c8514262b9e)
+++ src/sas/qtgui/Plotting/Plotter.py	(revision 1f34e00b9cd808e7a9f82db15cfb71ece4ab6c49)
@@ -75,5 +75,6 @@
         if isinstance(data, Data1D):
             self.data = data
-        assert(self._data)
+        if not self._data or data is None:
+            return
 
         is_fit = (self.data.id=="fit")
Index: src/sas/qtgui/Plotting/Plotter2D.py
===================================================================
--- src/sas/qtgui/Plotting/Plotter2D.py	(revision 676a430a9a0bf3029ea90449fd25d07996ab74e7)
+++ src/sas/qtgui/Plotting/Plotter2D.py	(revision 1f34e00b9cd808e7a9f82db15cfb71ece4ab6c49)
@@ -95,5 +95,6 @@
             self.data = data
 
-        assert self._data
+        if not self._data or data is None:
+            return
 
         # Toggle the scale
Index: src/sas/sascalc/calculator/resolution_calculator.py
===================================================================
--- src/sas/sascalc/calculator/resolution_calculator.py	(revision b8080e1affadb04559f0597dfddc5506d2044e9d)
+++ src/sas/sascalc/calculator/resolution_calculator.py	(revision 30e0be0b77d88f4352e614a87d289868c9480fc1)
@@ -1008,5 +1008,5 @@
             detector_offset = self.sample2detector_distance[1]
         except:
-            logger.error(sys.exc_value)
+            logger.error(str(sys.exc_info()[1]))
 
         # detector size in [no of pix_x,no of pix_y]
Index: src/sas/sascalc/corfunc/corfunc_calculator.py
===================================================================
--- src/sas/sascalc/corfunc/corfunc_calculator.py	(revision a26f67f1457e7e39b79d4c3800c03bcaa208dff7)
+++ src/sas/sascalc/corfunc/corfunc_calculator.py	(revision 6ae74669a8e1dc1caf8f5be7dbb947be975651d9)
@@ -88,5 +88,5 @@
         # Only process data of the class Data1D
         if not issubclass(data.__class__, Data1D):
-            raise ValueError("Data must be of the type DataLoader.Data1D")
+            raise ValueError("Correlation function cannot be computed with 2D Data.")
 
         # Prepare the data
