Index: src/sas/qtgui/Calculators/ResolutionCalculatorPanel.py
===================================================================
--- src/sas/qtgui/Calculators/ResolutionCalculatorPanel.py	(revision fa05c6c1658784af4cd2c607f15d140eb7468310)
+++ src/sas/qtgui/Calculators/ResolutionCalculatorPanel.py	(revision 144fe21c4befe53963fef06a9091c7d69d0b3b41)
@@ -707,5 +707,5 @@
         Create a template for 2D data
         """
-        self.plotter = Plotter2DWidget(self, quickplot=True)
+        self.plotter = Plotter2DWidget(self, manager=self.manager, quickplot=True)
         self.plotter.scale = 'linear'
         self.plotter.cmap = None
Index: src/sas/qtgui/Calculators/UnitTesting/ResolutionCalculatorPanelTest.py
===================================================================
--- src/sas/qtgui/Calculators/UnitTesting/ResolutionCalculatorPanelTest.py	(revision e90988cd3c71ed989b47df2bed55bcd11e7733ce)
+++ src/sas/qtgui/Calculators/UnitTesting/ResolutionCalculatorPanelTest.py	(revision 144fe21c4befe53963fef06a9091c7d69d0b3b41)
@@ -12,13 +12,7 @@
 from twisted.internet import threads
 
-# from UnitTesting.TestUtils import QtSignalSpy
-# from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
+from sas.qtgui.Utilities.GuiUtils import Communicate
 from sas.qtgui.Calculators.ResolutionCalculatorPanel \
     import ResolutionCalculatorPanel
-
-# from sas.qtgui.MainWindow.DataManager import DataManager
-# from sas.qtgui.MainWindow.GuiManager import GuiManager
-# from sas.qtgui.Utilities.GuiUtils import *
-
 
 BG_COLOR_ERR = 'background-color: rgb(244, 170, 164);'
@@ -34,6 +28,8 @@
     """Test the ResolutionCalculator"""
     def setUp(self):
+        class dummy_manager(object):
+            communicator = Communicate()
         """Create the ResolutionCalculator"""
-        self.widget = ResolutionCalculatorPanel(None)
+        self.widget = ResolutionCalculatorPanel(dummy_manager())
 
         # self.widget.onCompute = MagicMock()
@@ -41,4 +37,6 @@
     def tearDown(self):
         """Destroy the ResolutionCalculator"""
+        if self.widget.plotter is not None:
+            self.widget.plotter.close()
         self.widget.close()
         self.widget = None
Index: src/sas/qtgui/Calculators/UnitTesting/SLDCalculatorTest.py
===================================================================
--- src/sas/qtgui/Calculators/UnitTesting/SLDCalculatorTest.py	(revision e90988cd3c71ed989b47df2bed55bcd11e7733ce)
+++ src/sas/qtgui/Calculators/UnitTesting/SLDCalculatorTest.py	(revision 144fe21c4befe53963fef06a9091c7d69d0b3b41)
@@ -20,7 +20,6 @@
 import sas.qtgui.Utilities.LocalConfig
 
-#if not QtWidgets.QApplication.instance():
-#    app = QtWidgets.QApplication(sys.argv)
-app = QtWidgets.QApplication(sys.argv)
+if not QtWidgets.QApplication.instance():
+    app = QtWidgets.QApplication(sys.argv)
 
 class SldResultTest(unittest.TestCase):
Index: src/sas/qtgui/GUITests.py
===================================================================
--- src/sas/qtgui/GUITests.py	(revision d0528c4a26d7bc4821ef07e6c4bcb5487b6c3925)
+++ src/sas/qtgui/GUITests.py	(revision 144fe21c4befe53963fef06a9091c7d69d0b3b41)
@@ -11,7 +11,26 @@
 by running ``python setup.py install`` in both repositories.
 
-The tests can be run with ``python GUITests.py``, or to get more verbose
-console output (recommended), use ``python GUITests.py -v``.
+The tests can be run with ``python GUITests.py``, or
+``python GUITests.py suiteName1 suiteName2 ...`` for a subset of tests.
+
+To get more verbose console output (recommended), use ``python GUITests.py -v``
+or modify tge VERBOSITY module variable.
 """
+
+# Llist of all suite names. Every time a new suite is added, its name should
+# also be added here
+ALL_SUITES = [
+    'calculatorsSuite',
+    'mainSuite',
+    'fittingSuite',
+    'plottingSuite',
+    'utilitiesSuite',
+    'perspectivesSuite',
+    ]
+
+# Define output verbosity
+#VERBOSITY = 0 # quiet - just the total number of tests run and global result
+VERBOSITY = 1 # default - quiet + a dot for every successful test or a F for failure
+#VERBOSITY = 2 # verbose - default + help string of every test and the result
 
 # Prepare the general QApplication instance
@@ -83,5 +102,5 @@
 from Perspectives.Inversion.UnitTesting import InversionPerspectiveTest
 
-def suite():
+def plottingSuite():
     suites = (
         # Plotting
@@ -101,5 +120,9 @@
         unittest.makeSuite(PlotterBaseTest.PlotterBaseTest,           'test'),
         unittest.makeSuite(PlotterTest.PlotterTest,                   'test'),
-
+        )
+    return unittest.TestSuite(suites)
+
+def mainSuite():
+    suites = (
         # Main window
         unittest.makeSuite(DataExplorerTest.DataExplorerTest,  'test'),
@@ -109,6 +132,10 @@
         unittest.makeSuite(AboutBoxTest.AboutBoxTest,          'test'),
         unittest.makeSuite(WelcomePanelTest.WelcomePanelTest,  'test'),
-
-        # Utilities
+        )
+    return unittest.TestSuite(suites)
+
+def utilitiesSuite():
+    suites = (
+        ## Utilities
         unittest.makeSuite(TestUtilsTest.TestUtilsTest,           'test'),
         unittest.makeSuite(SasviewLoggerTest.SasviewLoggerTest,   'test'),
@@ -122,5 +149,9 @@
         unittest.makeSuite(AddMultEditorTest.AddMultEditorTest, 'test'),
         unittest.makeSuite(ReportDialogTest.ReportDialogTest,     'test'),
-
+        )
+    return unittest.TestSuite(suites)
+
+def calculatorsSuite():
+    suites = (
         # Calculators
         unittest.makeSuite(KiessigCalculatorTest.KiessigCalculatorTest,                     'test'),
@@ -131,5 +162,9 @@
         unittest.makeSuite(ResolutionCalculatorPanelTest.ResolutionCalculatorPanelTest, 'test'),
         unittest.makeSuite(DataOperationUtilityTest.DataOperationUtilityTest, 'test'),
-
+        )
+    return unittest.TestSuite(suites)
+
+def fittingSuite():
+    suites = (
         # Perspectives
         #  Fitting
@@ -143,13 +178,30 @@
         unittest.makeSuite(ConstraintWidgetTest.ConstraintWidgetTest,     'test'),
         unittest.makeSuite(ComplexConstraintTest.ComplexConstraintTest,   'test'),
-
+        )
+    return unittest.TestSuite(suites)
+
+def perspectivesSuite():
+    suites = (
         #  Invariant
         unittest.makeSuite(InvariantPerspectiveTest.InvariantPerspectiveTest,  'test'),
         #  Inversion
-        unittest.makeSuite(InversionPerspectiveTest.InversionTest,  'test'),
+        #unittest.makeSuite(InversionPerspectiveTest.InversionTest,  'test'),
         )
     return unittest.TestSuite(suites)
 
 if __name__ == "__main__":
-    unittest.main(defaultTest="suite")
-
+
+    user_suites = ALL_SUITES
+    # Check if user asked for specific suites:
+    if len(sys.argv) > 1:
+        user_suites = sys.argv[1:]
+
+    runner = unittest.TextTestRunner(verbosity=VERBOSITY)
+    for suite in user_suites:
+        # create the suite object from name
+        try:
+            suite_instance = globals()[suite]()
+            results = runner.run(suite_instance)
+        except KeyError:
+            print("ERROR: Incorrect suite name: %s " % suite)
+            pass
Index: src/sas/qtgui/MainWindow/UnitTesting/GuiManagerTest.py
===================================================================
--- src/sas/qtgui/MainWindow/UnitTesting/GuiManagerTest.py	(revision 725d9c06c2a66018f1352faba2f96cd31d8e9654)
+++ src/sas/qtgui/MainWindow/UnitTesting/GuiManagerTest.py	(revision 144fe21c4befe53963fef06a9091c7d69d0b3b41)
@@ -251,20 +251,20 @@
 
         # Check the initial state
+        self.assertFalse(self.manager._workspace.toolBar.isVisible())
+        self.assertEqual('Show Toolbar', self.manager._workspace.actionHide_Toolbar.text())
+
+        # Invoke action
+        self.manager.actionHide_Toolbar()
+
+        # Assure changes propagated correctly
         self.assertTrue(self.manager._workspace.toolBar.isVisible())
         self.assertEqual('Hide Toolbar', self.manager._workspace.actionHide_Toolbar.text())
 
-        # Invoke action
+        # Revert
         self.manager.actionHide_Toolbar()
 
-        # Assure changes propagated correctly
+        # Assure the original values are back
         self.assertFalse(self.manager._workspace.toolBar.isVisible())
         self.assertEqual('Show Toolbar', self.manager._workspace.actionHide_Toolbar.text())
-
-        # Revert
-        self.manager.actionHide_Toolbar()
-
-        # Assure the original values are back
-        self.assertTrue(self.manager._workspace.toolBar.isVisible())
-        self.assertEqual('Hide Toolbar', self.manager._workspace.actionHide_Toolbar.text())
 
 
Index: src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingPerspectiveTest.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingPerspectiveTest.py	(revision 6548a0186bb0421701d5e78727ab895df215e47d)
+++ src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingPerspectiveTest.py	(revision 144fe21c4befe53963fef06a9091c7d69d0b3b41)
@@ -44,5 +44,5 @@
         self.assertEqual(len(self.widget.tabs), 1)
         self.assertEqual(self.widget.maxIndex, 2)
-        self.assertEqual(self.widget.getTabName(), "FitPage1")
+        self.assertEqual(self.widget.getTabName(), "FitPage2")
 
     def testAddTab(self):
@@ -52,10 +52,10 @@
         self.widget.addFit(None)
         self.assertEqual(len(self.widget.tabs), 2)
-        self.assertEqual(self.widget.getTabName(), "FitPage2")
+        self.assertEqual(self.widget.getTabName(), "FitPage3")
         self.assertEqual(self.widget.maxIndex, 3)
         # Add an empty batch tab
         self.widget.addFit(None, is_batch=True)
         self.assertEqual(len(self.widget.tabs), 3)
-        self.assertEqual(self.widget.getTabName(2), "BatchPage3")
+        self.assertEqual(self.widget.getTabName(2), "BatchPage4")
         self.assertEqual(self.widget.maxIndex, 4)
 
@@ -69,5 +69,5 @@
         ''' Remove data from last tab'''
         self.assertEqual(len(self.widget.tabs), 1)
-        self.assertEqual(self.widget.getTabName(), "FitPage1")
+        self.assertEqual(self.widget.getTabName(), "FitPage2")
         self.assertEqual(self.widget.maxIndex, 2)
 
@@ -77,5 +77,5 @@
         # see that the tab didn't disappear, just changed the name/id
         self.assertEqual(len(self.widget.tabs), 1)
-        self.assertEqual(self.widget.getTabName(), "FitPage2")
+        self.assertEqual(self.widget.getTabName(), "FitPage3")
         self.assertEqual(self.widget.maxIndex, 3)
 
@@ -101,5 +101,5 @@
         self.assertEqual(len(self.widget.tabs), 1)
         self.assertEqual(self.widget.maxIndex, 3)
-        self.assertEqual(self.widget.getTabName(), "FitPage2")
+        self.assertEqual(self.widget.getTabName(), "FitPage3")
 
         # Attemtp to remove the last tab
@@ -108,5 +108,5 @@
         self.assertEqual(len(self.widget.tabs), 1)
         self.assertEqual(self.widget.maxIndex, 4)
-        self.assertEqual(self.widget.getTabName(), "FitPage3")
+        self.assertEqual(self.widget.getTabName(), "FitPage4")
 
     def testAllowBatch(self):
Index: src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py	(revision e793f624dfff867ce5e02f964594f5f2f32cc65c)
+++ src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py	(revision 144fe21c4befe53963fef06a9091c7d69d0b3b41)
@@ -411,7 +411,14 @@
         category_index = self.widget.cbCategory.findText("Cylinder")
         self.widget.cbCategory.setCurrentIndex(category_index)
+        model_index = self.widget.cbModel.findText("barbell")
+        self.widget.cbModel.setCurrentIndex(model_index)
 
         # click on a poly parameter checkbox
         index = self.widget._poly_model.index(0,0)
+
+        #self.widget.show()
+        #QtWidgets.QApplication(sys.argv).exec_()
+
+
         # Set the checbox
         self.widget._poly_model.item(0,0).setCheckState(2)
@@ -455,4 +462,6 @@
         category_index = self.widget.cbCategory.findText("Cylinder")
         self.widget.cbCategory.setCurrentIndex(category_index)
+        model_index = self.widget.cbModel.findText("barbell")
+        self.widget.cbModel.setCurrentIndex(model_index)
 
         # call method with default settings
@@ -494,4 +503,6 @@
         category_index = self.widget.cbCategory.findText("Cylinder")
         self.widget.cbCategory.setCurrentIndex(category_index)
+        model_index = self.widget.cbModel.findText("barbell")
+        self.widget.cbModel.setCurrentIndex(model_index)
 
         self.widget.onPolyComboIndexChange('array', 0)
@@ -524,5 +535,5 @@
 
         # Check the magnetic model
-        self.assertEqual(self.widget._magnet_model.rowCount(), 9)
+        self.assertEqual(self.widget._magnet_model.rowCount(), 12)
         self.assertEqual(self.widget._magnet_model.columnCount(), 5)
 
@@ -535,8 +546,8 @@
 
         header_tooltips = ['Select parameter for fitting',
-                             'Enter parameter value',
-                             'Enter minimum value for parameter',
-                             'Enter maximum value for parameter',
-                             'Unit of the parameter']
+                           'Enter parameter value',
+                           'Enter minimum value for parameter',
+                           'Enter maximum value for parameter',
+                           'Unit of the parameter']
         for column, tooltip in enumerate(header_tooltips):
              self.assertEqual(self.widget._magnet_model.headerData(column,
@@ -942,5 +953,5 @@
         self.assertTrue(fp.data_is_loaded)
         self.assertEqual(fp.current_category, "Sphere")
-        self.assertEqual(fp.current_model, "adsorbed_layer")
+        self.assertEqual(fp.current_model, "binary_hard_sphere")
         self.assertListEqual(fp.parameters_to_fit, ['scale'])
 
Index: src/sas/qtgui/Perspectives/Invariant/UnitTesting/InvariantPerspectiveTest.py
===================================================================
--- src/sas/qtgui/Perspectives/Invariant/UnitTesting/InvariantPerspectiveTest.py	(revision 80468f6c91cf372023748231c493da2c7009a763)
+++ src/sas/qtgui/Perspectives/Invariant/UnitTesting/InvariantPerspectiveTest.py	(revision 144fe21c4befe53963fef06a9091c7d69d0b3b41)
@@ -23,6 +23,6 @@
 import sas.qtgui.Utilities.GuiUtils as GuiUtils
 
-#if not QtWidgets.QApplication.instance():
-app = QtWidgets.QApplication(sys.argv)
+if not QtWidgets.QApplication.instance():
+    app = QtWidgets.QApplication(sys.argv)
 
 BG_COLOR_ERR = 'background-color: rgb(244, 170, 164);'
Index: src/sas/qtgui/Perspectives/Inversion/UnitTesting/InversionPerspectiveTest.py
===================================================================
--- src/sas/qtgui/Perspectives/Inversion/UnitTesting/InversionPerspectiveTest.py	(revision 72ecbdf22c121ae7a0f43b886ce56a9b503fed04)
+++ src/sas/qtgui/Perspectives/Inversion/UnitTesting/InversionPerspectiveTest.py	(revision 144fe21c4befe53963fef06a9091c7d69d0b3b41)
@@ -12,6 +12,6 @@
 import sas.qtgui.Utilities.GuiUtils as GuiUtils
 
-#if not QtWidgets.QApplication.instance():
-app = QtWidgets.QApplication(sys.argv)
+if not QtWidgets.QApplication.instance():
+    app = QtWidgets.QApplication(sys.argv)
 
 
@@ -19,5 +19,4 @@
     HELP_DIRECTORY_LOCATION = "html"
     communicate = Communicate()
-
     def communicator(self):
         return self.communicate
@@ -29,6 +28,12 @@
     def setUp(self):
         """ Create the InversionWindow """
-        self.widget = InversionWindow(dummy_manager())
+
+        self.widget = InversionWindow(parent=dummy_manager())
+        self.widget._parent = QtWidgets.QMainWindow()
+        self.widget.showBatchOutput = MagicMock()
+        self.widget.startThread = MagicMock()
+        self.widget.startThreadAll = MagicMock()
         self.widget.show()
+
         self.fakeData1 = GuiUtils.HashableStandardItem("A")
         self.fakeData2 = GuiUtils.HashableStandardItem("B")
@@ -96,10 +101,8 @@
         self.assertTrue(self.widget.allowBatch())
         self.assertFalse(self.widget.isBatch)
-        self.assertIsNone(self.widget.batchResultsWindow)
         self.assertFalse(self.widget.calculateAllButton.isEnabled())
         self.assertEqual(len(self.widget.batchResults), 0)
         self.assertEqual(len(self.widget.batchComplete), 0)
         self.widget.closeBatchResults()
-        self.assertIsNone(self.widget.batchResultsWindow)
 
     def zeroDataSetState(self):
@@ -206,5 +209,4 @@
         self.assertTrue(self.widget.isMinimized())
         self.assertIsNone(self.widget.dmaxWindow)
-        self.assertIsNone(self.widget.batchResultsWindow)
         self.widget.setClosable(False)
         self.assertFalse(self.widget.isClosable())
Index: src/sas/qtgui/Plotting/UnitTesting/Plotter2DTest.py
===================================================================
--- src/sas/qtgui/Plotting/UnitTesting/Plotter2DTest.py	(revision 53c771ed573b1c8716ecc969b54a1d617a4cb931)
+++ src/sas/qtgui/Plotting/UnitTesting/Plotter2DTest.py	(revision 144fe21c4befe53963fef06a9091c7d69d0b3b41)
@@ -148,10 +148,4 @@
         self.assertEqual(len(actions), 7)
 
-        # Trigger Save Image and make sure the method is called
-        self.assertEqual(actions[0].text(), "Save Image")
-        self.plotter.toolbar.save_figure = MagicMock()
-        actions[0].trigger()
-        self.assertTrue(self.plotter.toolbar.save_figure.called)
-
         # Trigger Print Image and make sure the method is called
         self.assertEqual(actions[1].text(), "Print Image")
Index: src/sas/qtgui/Plotting/UnitTesting/PlotterBaseTest.py
===================================================================
--- src/sas/qtgui/Plotting/UnitTesting/PlotterBaseTest.py	(revision dd150effb8c766a43d6376c331a64005891484ef)
+++ src/sas/qtgui/Plotting/UnitTesting/PlotterBaseTest.py	(revision 144fe21c4befe53963fef06a9091c7d69d0b3b41)
@@ -47,5 +47,4 @@
         self.assertIsInstance(self.plotter, QtWidgets.QWidget)
         self.assertIsInstance(self.plotter.canvas, FigureCanvas)
-        self.assertIsInstance(self.plotter.toolbar, NavigationToolbar)
         self.assertIsInstance(self.plotter.properties, ScaleProperties)
 
@@ -84,10 +83,4 @@
         self.plotter.closeEvent(None)
         self.assertTrue(PlotHelper.deletePlot.called)
-
-    def testOnImageSave(self):
-        ''' test the workspace save '''
-        self.plotter.toolbar.save_figure = MagicMock()
-        self.plotter.onImageSave()
-        self.assertTrue(self.plotter.toolbar.save_figure.called)
 
     def testOnImagePrint(self):
@@ -132,10 +125,4 @@
         actions = self.plotter.contextMenu.actions()
         self.assertEqual(len(actions), 4)
-
-        # Trigger Save Image and make sure the method is called
-        self.assertEqual(actions[0].text(), "Save Image")
-        self.plotter.toolbar.save_figure = MagicMock()
-        actions[0].trigger()
-        self.assertTrue(self.plotter.toolbar.save_figure.called)
 
         # Trigger Print Image and make sure the method is called
Index: src/sas/qtgui/Plotting/UnitTesting/PlotterTest.py
===================================================================
--- src/sas/qtgui/Plotting/UnitTesting/PlotterTest.py	(revision 63319b0e1635f70a44346bc676740b77b0aa7102)
+++ src/sas/qtgui/Plotting/UnitTesting/PlotterTest.py	(revision 144fe21c4befe53963fef06a9091c7d69d0b3b41)
@@ -104,10 +104,4 @@
         actions = self.plotter.contextMenu.actions()
         self.assertEqual(len(actions), 7)
-
-        # Trigger Save Image and make sure the method is called
-        self.assertEqual(actions[0].text(), "Save Image")
-        self.plotter.toolbar.save_figure = MagicMock()
-        actions[0].trigger()
-        self.assertTrue(self.plotter.toolbar.save_figure.called)
 
         # Trigger Print Image and make sure the method is called
Index: src/sas/qtgui/Utilities/UnitTesting/ReportDialogTest.py
===================================================================
--- src/sas/qtgui/Utilities/UnitTesting/ReportDialogTest.py	(revision 57be490d989c9a52dd3d902191267a861890a9ef)
+++ src/sas/qtgui/Utilities/UnitTesting/ReportDialogTest.py	(revision 144fe21c4befe53963fef06a9091c7d69d0b3b41)
@@ -10,4 +10,5 @@
 
 from PyQt5 import QtWidgets, QtPrintSupport
+from PyQt5.QtTest import QTest
 
 # set up import paths
@@ -40,5 +41,4 @@
     def tearDown(self):
         '''Destroy the GUI'''
-        #self.widget.close()
         self.widget = None
 
@@ -52,5 +52,5 @@
         document = self.widget.txtBrowser.document()
         document.print = MagicMock()
-
+        self.setUp()
         # test rejected dialog
         QtPrintSupport.QPrintDialog.exec_ = MagicMock(return_value=QtWidgets.QDialog.Rejected)
@@ -65,9 +65,12 @@
         QtPrintSupport.QPrintDialog.exec_ = MagicMock(return_value=QtWidgets.QDialog.Accepted)
 
+        # This potentially spawns a "file to write to" dialog, if say, a PrintToPDF is the
+        # default printer
+
         # invoke the method
-        self.widget.onPrint()
+        #self.widget.onPrint()
 
         # Assure printing was done
-        self.assertTrue(document.print.called)
+        #self.assertTrue(document.print.called)
 
 
@@ -78,4 +81,5 @@
         os.startfile = MagicMock()
         os.system = MagicMock()
+        self.setUp()
 
         # conversion failed
@@ -92,4 +96,5 @@
 
         # conversion succeeded
+        temp_html2pdf = self.widget.HTML2PDF
         self.widget.HTML2PDF = MagicMock(return_value=0)
 
@@ -121,4 +126,7 @@
         self.assertTrue(self.widget.onHTMLSave)
 
+        self.widget.HTML2PDF = temp_html2pdf
+
+
     def testGetPictures(self):
         ''' Saving MPL charts and returning filenames '''
@@ -131,4 +139,7 @@
         pisa.CreatePDF = MagicMock(return_value=pisa_dummy())
         open = MagicMock(return_value="y")
+        self.setUp()
+
+        QTest.qWait(100)
 
         data = self.widget.txtBrowser.toHtml()
