Index: build_tools/conda_qt5_min_centos.yml
===================================================================
--- build_tools/conda_qt5_min_centos.yml	(revision 65e76eda5cfd6db8b0331acecd5304233c5a29da)
+++ build_tools/conda_qt5_min_centos.yml	(revision 624c8747fca611b33d471213c34057b490068d2b)
@@ -3,5 +3,5 @@
   - conda-forge
 dependencies:
- - matplotlib=2
+ - matplotlib=2.1.0
  - scipy
  - hdf5
Index: build_tools/conda_qt5_win.yml
===================================================================
--- build_tools/conda_qt5_win.yml	(revision 65e76eda5cfd6db8b0331acecd5304233c5a29da)
+++ build_tools/conda_qt5_win.yml	(revision 624c8747fca611b33d471213c34057b490068d2b)
@@ -4,5 +4,5 @@
 dependencies:
  - python=3
- - matplotlib==2
+ - matplotlib==2.1.0
  - scipy
  - hdf5
Index: src/sas/qtgui/MainWindow/GuiManager.py
===================================================================
--- src/sas/qtgui/MainWindow/GuiManager.py	(revision 20f4857d1e571c0d896afeff05f4b893b398ddc1)
+++ src/sas/qtgui/MainWindow/GuiManager.py	(revision 20f4857d1e571c0d896afeff05f4b893b398ddc1)
@@ -138,4 +138,9 @@
         self.categoryManagerWidget = CategoryManager(self._parent, manager=self)
         self.grid_window = None
+        self.grid_window = BatchOutputPanel(parent=self)
+        self.grid_subwindow = self._workspace.workspace.addSubWindow(self.grid_window)
+        self.grid_subwindow.setVisible(False)
+        self.grid_window.windowClosedSignal.connect(lambda: self.grid_subwindow.setVisible(False))
+
         self._workspace.toolBar.setVisible(LocalConfig.TOOLBAR_SHOW)
         self._workspace.actionHide_Toolbar.setText("Show Toolbar")
@@ -616,16 +621,7 @@
         Display/redisplay the batch fit viewer
         """
-        if self.grid_window is None:
-            self.grid_window = BatchOutputPanel(parent=self, output_data=output_data)
-            subwindow = self._workspace.workspace.addSubWindow(self.grid_window)
-
-            #self.grid_window = BatchOutputPanel(parent=self, output_data=output_data)
-            self.grid_window.show()
-            return
+        self.grid_subwindow.setVisible(True)
         if output_data:
             self.grid_window.addFitResults(output_data)
-        self.grid_window.show()
-        if self.grid_window.windowState() == Qt.WindowMinimized:
-            self.grid_window.setWindowState(Qt.WindowActive)
 
     def actionHide_Toolbar(self):
Index: src/sas/qtgui/MainWindow/UnitTesting/GuiManagerTest.py
===================================================================
--- src/sas/qtgui/MainWindow/UnitTesting/GuiManagerTest.py	(revision 768387e00d5e9ad853fe870ebde7c8104e403412)
+++ src/sas/qtgui/MainWindow/UnitTesting/GuiManagerTest.py	(revision fa762f46743038f10bda371a9f40277f95ce3be8)
@@ -61,5 +61,5 @@
         self.assertIsInstance(self.manager.ackWidget, Acknowledgements)
         self.assertIsInstance(self.manager.aboutWidget, AboutBox)
-        self.assertIsInstance(self.manager.welcomePanel, WelcomePanel)
+        #self.assertIsInstance(self.manager.welcomePanel, WelcomePanel)
 
     def skip_testLogging(self):
Index: src/sas/qtgui/MainWindow/UnitTesting/MainWindowTest.py
===================================================================
--- src/sas/qtgui/MainWindow/UnitTesting/MainWindowTest.py	(revision 8353d908545a5d1d1ac66b2e075d0ec49b5a7cc2)
+++ src/sas/qtgui/MainWindow/UnitTesting/MainWindowTest.py	(revision fa762f46743038f10bda371a9f40277f95ce3be8)
@@ -47,5 +47,5 @@
         tmp_main.showMaximized()
         # See that only one subwindow is up
-        self.assertEqual(len(tmp_main.workspace.subWindowList()), 1)
+        self.assertEqual(len(tmp_main.workspace.subWindowList()), 2)
         # and that the subwindow is the fitting perspective
         self.assertIsInstance(tmp_main.workspace.subWindowList()[0].widget(),
Index: src/sas/qtgui/Perspectives/Fitting/FittingLogic.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingLogic.py	(revision a54bbf2b2021cfeddeb40171e2fdf6a0e00ad921)
+++ src/sas/qtgui/Perspectives/Fitting/FittingLogic.py	(revision a54bbf2b2021cfeddeb40171e2fdf6a0e00ad921)
@@ -223,4 +223,15 @@
         return plots
 
+    def getScalarIntermediateResults(self, return_data):
+        """
+        Returns a dict of scalar-only intermediate results from the return data.
+        """
+        res = {}
+        for name, int_res in return_data["intermediate_results"].items():
+            if isinstance(int_res, np.ndarray):
+                continue
+            res[name] = int_res
+        return res
+
     def computeDataRange(self):
         """
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 6d87082a912190fc76efe5a85bc597faf2f758c1)
@@ -321,5 +321,5 @@
         self.magneticAnglesWidget = QtWidgets.QWidget()
         labl = QtWidgets.QLabel(self.magneticAnglesWidget)
-        pixmap = QtGui.QPixmap(GuiUtils.IMAGES_DIRECTORY_LOCATION + '/M_angles_pic.bmp')
+        pixmap = QtGui.QPixmap(GuiUtils.IMAGES_DIRECTORY_LOCATION + '/M_angles_pic.png')
         labl.setPixmap(pixmap)
         self.magneticAnglesWidget.setFixedSize(pixmap.width(), pixmap.height())
@@ -2297,4 +2297,8 @@
         # TODO: multishell params in self.kernel_module.details[??] = value
 
+        # handle display of effective radius parameter according to radius_effective_mode; pass ER into model if
+        # necessary
+        self.processEffectiveRadius()
+
         # Force the chart update when actual parameters changed
         if model_column == 1:
@@ -2303,4 +2307,64 @@
         # Update state stack
         self.updateUndo()
+
+    def processEffectiveRadius(self):
+        """
+        Checks the value of radius_effective_mode, if existent, and processes radius_effective as necessary.
+        * mode == 0: This means 'unconstrained'; ensure use can specify ER.
+        * mode > 0: This means it is constrained to a P(Q)-computed value in sasmodels; prevent user from editing ER.
+
+        Note: If ER has been computed, it is passed back to SasView as an intermediate result. That value must be
+        displayed for the user; that is not dealt with here, but in complete1D.
+        """
+        ER_row = self.getRowFromName("radius_effective")
+        if ER_row is None:
+            return
+
+        ER_mode_row = self.getRowFromName("radius_effective_mode")
+        if ER_mode_row is None:
+            return
+
+        try:
+            ER_mode = int(self._model_model.item(ER_mode_row, 1).text())
+        except ValueError:
+            logging.error("radius_effective_mode was set to an invalid value.")
+            return
+
+        if ER_mode == 0:
+            # ensure the ER value can be modified by user
+            self.setParamEditableByRow(ER_row, True)
+        elif ER_mode > 0:
+            # ensure the ER value cannot be modified by user
+            self.setParamEditableByRow(ER_row, False)
+        else:
+            logging.error("radius_effective_mode was set to an invalid value.")
+
+    def setParamEditableByRow(self, row, editable=True):
+        """
+        Sets whether the user can edit a parameter in the table. If they cannot, the parameter name's font is changed,
+        the value itself cannot be edited if clicked on, and the parameter may not be fitted.
+        """
+        item_name = self._model_model.item(row, 0)
+        item_value = self._model_model.item(row, 1)
+
+        item_value.setEditable(editable)
+
+        if editable:
+            # reset font
+            item_name.setFont(QtGui.QFont())
+            # reset colour
+            item_name.setForeground(QtGui.QBrush())
+            # make checkable
+            item_name.setCheckable(True)
+        else:
+            # change font
+            font = QtGui.QFont()
+            font.setItalic(True)
+            item_name.setFont(font)
+            # change colour
+            item_name.setForeground(QtGui.QBrush(QtGui.QColor(50, 50, 50)))
+            # make not checkable (and uncheck)
+            item_name.setCheckState(QtCore.Qt.Unchecked)
+            item_name.setCheckable(False)
 
     def isCheckable(self, row):
@@ -2535,4 +2599,7 @@
             self.communicate.plotUpdateSignal.emit([plot])
 
+        # Update radius_effective if relevant
+        self.updateEffectiveRadius(return_data)
+
     def complete2D(self, return_data):
         """
@@ -2561,4 +2628,36 @@
         for plot in new_plots:
             self.communicate.plotUpdateSignal.emit([plot])
+
+    def updateEffectiveRadius(self, return_data):
+        """
+        Given return data from sasmodels, update the effective radius parameter in the GUI table with the new
+        calculated value as returned by sasmodels (if the value was returned).
+        """
+        ER_mode_row = self.getRowFromName("radius_effective_mode")
+        if ER_mode_row is None:
+            return
+        try:
+            ER_mode = int(self._model_model.item(ER_mode_row, 1).text())
+        except ValueError:
+            logging.error("radius_effective_mode was set to an invalid value.")
+            return
+        if ER_mode < 1:
+            # does not need updating if it is not being computed
+            return
+
+        ER_row = self.getRowFromName("radius_effective")
+        if ER_row is None:
+            return
+
+        scalar_results = self.logic.getScalarIntermediateResults(return_data)
+        ER_value = scalar_results.get("effective_radius") # note name of key
+        if ER_value is None:
+            return
+        # ensure the model does not recompute when updating the value
+        self._model_model.blockSignals(True)
+        self._model_model.item(ER_row, 1).setText(str(ER_value))
+        self._model_model.blockSignals(False)
+        # ensure the view is updated immediately
+        self._model_model.layoutChanged.emit()
 
     def calculateResiduals(self, fitted_data):
Index: src/sas/qtgui/Plotting/Plotter.py
===================================================================
--- src/sas/qtgui/Plotting/Plotter.py	(revision 1f34e00b9cd808e7a9f82db15cfb71ece4ab6c49)
+++ src/sas/qtgui/Plotting/Plotter.py	(revision 34f13a832b15b4d2deedbaeb28fde1e1537ff5d1)
@@ -75,5 +75,6 @@
         if isinstance(data, Data1D):
             self.data = data
-        if not self._data or data is None:
+
+        if not self._data:
             return
 
Index: src/sas/qtgui/Plotting/Plotter2D.py
===================================================================
--- src/sas/qtgui/Plotting/Plotter2D.py	(revision 1f34e00b9cd808e7a9f82db15cfb71ece4ab6c49)
+++ src/sas/qtgui/Plotting/Plotter2D.py	(revision 34f13a832b15b4d2deedbaeb28fde1e1537ff5d1)
@@ -95,5 +95,5 @@
             self.data = data
 
-        if not self._data or data is None:
+        if not self._data:
             return
 
Index: src/sas/qtgui/Plotting/PlotterBase.py
===================================================================
--- src/sas/qtgui/Plotting/PlotterBase.py	(revision 863ebcab37bf4f8468505e773c391c8514262b9e)
+++ src/sas/qtgui/Plotting/PlotterBase.py	(revision 34f13a832b15b4d2deedbaeb28fde1e1537ff5d1)
@@ -114,5 +114,6 @@
         if not quickplot:
             # Add the toolbar
-            self.toolbar.show()
+            # self.toolbar.show()
+            self.toolbar.hide() # hide for the time being
             # Notify PlotHelper about the new plot
             self.upatePlotHelper()
@@ -220,6 +221,6 @@
         self.actionPrintImage = self.contextMenu.addAction("Print Image")
         self.actionCopyToClipboard = self.contextMenu.addAction("Copy to Clipboard")
-        self.contextMenu.addSeparator()
-        self.actionToggleMenu = self.contextMenu.addAction("Toggle Navigation Menu")
+        #self.contextMenu.addSeparator()
+        #self.actionToggleMenu = self.contextMenu.addAction("Toggle Navigation Menu")
         self.contextMenu.addSeparator()
 
@@ -229,5 +230,5 @@
         self.actionPrintImage.triggered.connect(self.onImagePrint)
         self.actionCopyToClipboard.triggered.connect(self.onClipboardCopy)
-        self.actionToggleMenu.triggered.connect(self.onToggleMenu)
+        #self.actionToggleMenu.triggered.connect(self.onToggleMenu)
 
     def createContextMenu(self):
@@ -381,8 +382,11 @@
         Toggle navigation menu visibility in the chart
         """
-        if self.toolbar.isVisible():
-            self.toolbar.hide()
-        else:
-            self.toolbar.show()
+        self.toolbar.hide()
+        # Current toolbar menu is too buggy.
+        # Comment out until we support 3.x, then recheck.
+        #if self.toolbar.isVisible():
+        #    self.toolbar.hide()
+        #else:
+        #    self.toolbar.show()
 
     def offset_graph(self):
Index: src/sas/qtgui/Plotting/UnitTesting/Plotter2DTest.py
===================================================================
--- src/sas/qtgui/Plotting/UnitTesting/Plotter2DTest.py	(revision 863ebcab37bf4f8468505e773c391c8514262b9e)
+++ src/sas/qtgui/Plotting/UnitTesting/Plotter2DTest.py	(revision 34f13a832b15b4d2deedbaeb28fde1e1537ff5d1)
@@ -146,5 +146,5 @@
         self.plotter.createContextMenuQuick()
         actions = self.plotter.contextMenu.actions()
-        self.assertEqual(len(actions), 9)
+        self.assertEqual(len(actions), 7)
 
         # Trigger Print Image and make sure the method is called
@@ -158,13 +158,13 @@
 
         # Trigger Toggle Grid and make sure the method is called
-        self.assertEqual(actions[6].text(), "Toggle Grid On/Off")
+        self.assertEqual(actions[4].text(), "Toggle Grid On/Off")
         self.plotter.ax.grid = MagicMock()
+        actions[4].trigger()
+        self.assertTrue(self.plotter.ax.grid.called)
+
+        # Trigger Change Scale and make sure the method is called
+        self.assertEqual(actions[6].text(), "Toggle Linear/Log Scale")
+        FigureCanvas.draw_idle = MagicMock()
         actions[6].trigger()
-        self.assertTrue(self.plotter.ax.grid.called)
-
-        # Trigger Change Scale and make sure the method is called
-        self.assertEqual(actions[8].text(), "Toggle Linear/Log Scale")
-        FigureCanvas.draw_idle = MagicMock()
-        actions[8].trigger()
         self.assertTrue(FigureCanvas.draw_idle.called)
 
Index: src/sas/qtgui/Plotting/UnitTesting/PlotterBaseTest.py
===================================================================
--- src/sas/qtgui/Plotting/UnitTesting/PlotterBaseTest.py	(revision 863ebcab37bf4f8468505e773c391c8514262b9e)
+++ src/sas/qtgui/Plotting/UnitTesting/PlotterBaseTest.py	(revision 34f13a832b15b4d2deedbaeb28fde1e1537ff5d1)
@@ -124,5 +124,5 @@
 
         actions = self.plotter.contextMenu.actions()
-        self.assertEqual(len(actions), 6)
+        self.assertEqual(len(actions), 4)
 
         # Trigger Print Image and make sure the method is called
@@ -147,14 +147,14 @@
         self.assertTrue(self.clipboard_called)
 
-        # Trigger toggle navigation bar and make sure the method is called
-        self.assertEqual(actions[4].text(), "Toggle Navigation Menu")
-        isShown = self.plotter.toolbar.isVisible()
-        self.assertTrue(isShow)
-        actions[4].trigger()
-        isShown = self.plotter.toolbar.isVisible()
-        self.assertFalse(isShow)
-        actions[4].trigger()
-        isShown = self.plotter.toolbar.isVisible()
-        self.assertTrue(isShow)
+        ## Trigger toggle navigation bar and make sure the method is called
+        #self.assertEqual(actions[4].text(), "Toggle Navigation Menu")
+        #isShown = self.plotter.toolbar.isVisible()
+        #self.assertTrue(isShow)
+        #actions[4].trigger()
+        #isShown = self.plotter.toolbar.isVisible()
+        #self.assertFalse(isShow)
+        #actions[4].trigger()
+        #isShown = self.plotter.toolbar.isVisible()
+        #self.assertTrue(isShow)
 
 
Index: src/sas/qtgui/Plotting/UnitTesting/PlotterTest.py
===================================================================
--- src/sas/qtgui/Plotting/UnitTesting/PlotterTest.py	(revision 863ebcab37bf4f8468505e773c391c8514262b9e)
+++ src/sas/qtgui/Plotting/UnitTesting/PlotterTest.py	(revision 34f13a832b15b4d2deedbaeb28fde1e1537ff5d1)
@@ -103,5 +103,5 @@
         self.plotter.createContextMenuQuick()
         actions = self.plotter.contextMenu.actions()
-        self.assertEqual(len(actions), 9)
+        self.assertEqual(len(actions), 7)
 
         # Trigger Print Image and make sure the method is called
@@ -115,13 +115,13 @@
 
         # Trigger Toggle Grid and make sure the method is called
-        self.assertEqual(actions[6].text(), "Toggle Grid On/Off")
+        self.assertEqual(actions[4].text(), "Toggle Grid On/Off")
         self.plotter.ax.grid = MagicMock()
+        actions[4].trigger()
+        self.assertTrue(self.plotter.ax.grid.called)
+
+        # Trigger Change Scale and make sure the method is called
+        self.assertEqual(actions[6].text(), "Change Scale")
+        self.plotter.properties.exec_ = MagicMock(return_value=QtWidgets.QDialog.Rejected)
         actions[6].trigger()
-        self.assertTrue(self.plotter.ax.grid.called)
-
-        # Trigger Change Scale and make sure the method is called
-        self.assertEqual(actions[8].text(), "Change Scale")
-        self.plotter.properties.exec_ = MagicMock(return_value=QtWidgets.QDialog.Rejected)
-        actions[8].trigger()
         self.assertTrue(self.plotter.properties.exec_.called)
 
Index: src/sas/qtgui/Utilities/GridPanel.py
===================================================================
--- src/sas/qtgui/Utilities/GridPanel.py	(revision 78797451892ebed8a860e0b32b65cc0193028445)
+++ src/sas/qtgui/Utilities/GridPanel.py	(revision fa762f46743038f10bda371a9f40277f95ce3be8)
@@ -18,4 +18,5 @@
     ERROR_COLUMN_CAPTION = " (Err)"
     IS_WIN = (sys.platform == 'win32')
+    windowClosedSignal = QtCore.pyqtSignal()
     def __init__(self, parent = None, output_data=None):
 
@@ -54,5 +55,4 @@
         # Fill in the table from input data
         self.setupTable(widget=self.tblParams, data=output_data)
-        #TODO: This is not what was inteded to be.
         if output_data is not None:
             # Set a table tooltip describing the model
@@ -64,6 +64,6 @@
         Overwrite QDialog close method to allow for custom widget close
         """
-        # Maybe we should just minimize
-        self.setWindowState(QtCore.Qt.WindowMinimized)
+        # notify the parent so it hides this window
+        self.windowClosedSignal.emit()
         event.ignore()
 
@@ -153,5 +153,6 @@
         Create a new tab with batch fitting results
         """
-        self.addTabPage()
+        if self.has_data:
+            self.addTabPage()
         # Update the new widget
         # Fill in the table from input data in the last/newest page
Index: src/sas/qtgui/Utilities/GuiUtils.py
===================================================================
--- src/sas/qtgui/Utilities/GuiUtils.py	(revision 20f4857d1e571c0d896afeff05f4b893b398ddc1)
+++ src/sas/qtgui/Utilities/GuiUtils.py	(revision 20f4857d1e571c0d896afeff05f4b893b398ddc1)
@@ -29,5 +29,4 @@
 from sas.qtgui.Utilities import CustomDir
 
-## TODO: CHANGE FOR SHIPPED PATH IN RELEASE
 if os.path.splitext(sys.argv[0])[1].lower() != ".py":
         HELP_DIRECTORY_LOCATION = "doc"
Index: src/sas/qtgui/Utilities/LocalConfig.py
===================================================================
--- src/sas/qtgui/Utilities/LocalConfig.py	(revision b764ae5882f084a8b74c7cf664276c13fb07c29e)
+++ src/sas/qtgui/Utilities/LocalConfig.py	(revision 6d87082a912190fc76efe5a85bc597faf2f758c1)
@@ -73,5 +73,5 @@
 _nsf_logo = os.path.join(icon_path, "nsf_logo.png")
 _danse_logo = os.path.join(icon_path, "danse_logo.png")
-_inst_logo = os.path.join(icon_path, "utlogo.gif")
+_inst_logo = os.path.join(icon_path, "utlogo.png")
 _nist_url = "http://www.nist.gov/"
 _umd_url = "http://www.umd.edu/"
