Index: src/sas/qtgui/Calculators/GenericScatteringCalculator.py
===================================================================
--- src/sas/qtgui/Calculators/GenericScatteringCalculator.py	(revision 133812c7ffae92cd47338d64c4d757261f78a6a6)
+++ src/sas/qtgui/Calculators/GenericScatteringCalculator.py	(revision 8c85ac11162b75e37f3ec97b8e0ed394aee24b70)
@@ -661,11 +661,6 @@
             data.xaxis('\\rm{Q_{x}}', '\AA^{-1}')
             data.yaxis('\\rm{Intensity}', 'cm^{-1}')
-            plot1D = Plotter(self, quickplot=True)
-            plot1D.plot(data)
-            plot1D.show()
+
             self.graph_num += 1
-            # TODO
-            print('TRANSFER OF DATA TO MAIN PANEL TO BE IMPLEMENTED')
-            return plot1D
         else:
             numpy.nan_to_num(self.data_to_plot)
@@ -679,12 +674,12 @@
             data.title = "GenSAS {}  #{} 2D".format(self.file_name,
                                                     int(self.graph_num))
-            plot2D = Plotter2D(self, quickplot=True)
-            plot2D.plot(data)
-            plot2D.show()
+            zeros = numpy.ones(data.data.size, dtype=bool)
+            data.mask = zeros
+
             self.graph_num += 1
             # TODO
-            print('TRANSFER OF DATA TO MAIN PANEL TO BE IMPLEMENTED')
-            return plot2D
-
+        new_item = GuiUtils.createModelItemWithPlot(data, name=data.title)
+        self.communicator.updateModelFromPerspectiveSignal.emit(new_item)
+        self.communicator.forcePlotDisplaySignal.emit([new_item, data])
 
 class Plotter3DWidget(PlotterBase):
Index: src/sas/qtgui/MainWindow/DroppableDataLoadWidget.py
===================================================================
--- src/sas/qtgui/MainWindow/DroppableDataLoadWidget.py	(revision 53c771ed573b1c8716ecc969b54a1d617a4cb931)
+++ src/sas/qtgui/MainWindow/DroppableDataLoadWidget.py	(revision ba400d18ca45875bb7d2b7f16856f0d291d2187f)
@@ -1,3 +1,4 @@
 # global
+import os
 from PyQt5 import QtCore
 from PyQt5 import QtGui
@@ -58,5 +59,12 @@
             filenames=[]
             for url in event.mimeData().urls():
-                filenames.append(url.toLocalFile())
+                files = url.toLocalFile()
+                if os.path.isdir(files):
+                # get content of dir into a list
+                    content = [os.path.join(os.path.abspath(files), filename)
+                                for filename in os.listdir(files)]
+                    filenames += content
+                else:
+                    filenames.append(files)
             self.communicator.fileReadSignal.emit(filenames)
             event.accept()
Index: src/sas/qtgui/Perspectives/Fitting/ConstraintWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/ConstraintWidget.py	(revision 442a9aeac8130de799211340d5f6d75377f565ad)
+++ src/sas/qtgui/Perspectives/Fitting/ConstraintWidget.py	(revision 442a9aeac8130de799211340d5f6d75377f565ad)
@@ -1,3 +1,4 @@
 import logging
+import copy
 
 from twisted.internet import threads
@@ -407,5 +408,8 @@
 
         # Show the grid panel
-        self.parent.communicate.sendDataToGridSignal.emit(result[0])
+        page_name = "ConstSimulPage"
+        results = copy.deepcopy(result[0])
+        results.append(page_name)
+        self.parent.communicate.sendDataToGridSignal.emit(results)
 
         msg = "Fitting completed successfully in: %s s.\n" % GuiUtils.formatNumber(elapsed)
Index: src/sas/qtgui/Perspectives/Fitting/FittingUtilities.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingUtilities.py	(revision 65759c72f9454c8e8193f4579bdcadc7455a17a6)
+++ src/sas/qtgui/Perspectives/Fitting/FittingUtilities.py	(revision 7f41584d0dc268495a1353d78e988659536a3c96)
@@ -368,4 +368,10 @@
             cbox = createFixedChoiceComboBox(par, row)
 
+            # Apply combobox if required
+            if None not in (view, cbox):
+                # set the min/max cell to be empty
+                item3.setText("")
+                item4.setText("")
+
             # Always add to the model
             if row_num is None:
@@ -375,6 +381,5 @@
                 row_num += 1
 
-            # Apply combobox if required
-            if None not in (view, cbox):
+            if cbox is not None:
                 view.setIndexWidget(item2.index(), cbox)
 
Index: src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision 442a9aeac8130de799211340d5f6d75377f565ad)
+++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision 7f41584d0dc268495a1353d78e988659536a3c96)
@@ -1595,5 +1595,8 @@
 
         # Show the grid panel
-        self.communicate.sendDataToGridSignal.emit(result[0])
+        page_name = "BatchPage" + str(self.tab_id)
+        results = copy.deepcopy(result[0])
+        results.append(page_name)
+        self.communicate.sendDataToGridSignal.emit(results)
 
         elapsed = result[1]
@@ -2656,5 +2659,5 @@
 
         # Disable buttons/table
-        self.disableInteractiveElements()
+        self.disableInteractiveElementsOnCalculate()
         # Awful API to a backend method.
         calc_thread = self.methodCalculateForData()(data=data,
@@ -3191,7 +3194,11 @@
         # cell 3: min value
         item3 = QtGui.QStandardItem()
+        # set the cell to be non-editable
+        item3.setFlags(item3.flags() ^ QtCore.Qt.ItemIsEditable)
 
         # cell 4: max value
         item4 = QtGui.QStandardItem()
+        # set the cell to be non-editable
+        item4.setFlags(item4.flags() ^ QtCore.Qt.ItemIsEditable)
 
         # cell 4: SLD button
@@ -3233,4 +3240,9 @@
             # no info about limits
             pass
+        except OverflowError:
+            # Try to limit shell_par, if possible
+            if float(shell_par.limits[1])==np.inf:
+                shell_max = 9
+            logging.warning("Limiting shell count to 9.")
         except Exception as ex:
             logging.error("Badly defined multiplicity: "+ str(ex))
@@ -3374,4 +3386,15 @@
         self.cmdFit.setStyleSheet('QPushButton {color: red;}')
         self.cmdFit.setText('Stop fit')
+        self.setInteractiveElements(False)
+
+    def disableInteractiveElementsOnCalculate(self):
+        """
+        Set buttion caption on fitting/calculate start
+        Disable the param table(s)
+        """
+        # Notify the user that fitting is being run
+        # Allow for stopping the job
+        self.cmdFit.setStyleSheet('QPushButton {color: red;}')
+        self.cmdFit.setText('Running...')
         self.setInteractiveElements(False)
 
Index: src/sas/qtgui/Perspectives/Fitting/ViewDelegate.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/ViewDelegate.py	(revision 722b7d678b0f7efacad11e34c2bf633853825838)
+++ src/sas/qtgui/Perspectives/Fitting/ViewDelegate.py	(revision 7f41584d0dc268495a1353d78e988659536a3c96)
@@ -95,4 +95,8 @@
             # Set some columns uneditable
             return None
+        if index.column() in (self.param_min, self.param_max):
+            # Check if the edit role is set
+            if not (index.flags() & QtCore.Qt.ItemIsEditable):
+                return None
 
         return super(ModelViewDelegate, self).createEditor(widget, option, index)
Index: src/sas/qtgui/Perspectives/Fitting/media/fitting_help.rst
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/media/fitting_help.rst	(revision 00a40bdfc7443de82903f8fb585d8e29646b0312)
+++ src/sas/qtgui/Perspectives/Fitting/media/fitting_help.rst	(revision 3b0b17e6d4494646ccbe0f6e09b6b1bbae6bcf80)
@@ -125,5 +125,5 @@
 
 For a complete list of all the library models available in SasView, see
-the `Model Documentation <../../../index.html>`_ .
+the `Model Documentation <models/index.html>`_ .
 
 It is also possible to add your own models.
Index: src/sas/qtgui/Plotting/Plotter.py
===================================================================
--- src/sas/qtgui/Plotting/Plotter.py	(revision 3b95b3bf18e0282898b94748d7c29f60e7fb5b20)
+++ src/sas/qtgui/Plotting/Plotter.py	(revision c30822c0aae9df34850be4d187a035d8cc15954e)
@@ -600,4 +600,9 @@
         except:
             self.position = None
+
+        x_str = GuiUtils.formatNumber(self.x_click)
+        y_str = GuiUtils.formatNumber(self.y_click)
+        coord_str = "x: {}, y: {}".format(x_str, y_str)
+        self.manager.communicator.statusBarUpdateSignal.emit(coord_str)
 
     def onMplMouseUp(self, event):
Index: src/sas/qtgui/Plotting/Plotter2D.py
===================================================================
--- src/sas/qtgui/Plotting/Plotter2D.py	(revision 133812c7ffae92cd47338d64c4d757261f78a6a6)
+++ src/sas/qtgui/Plotting/Plotter2D.py	(revision c30822c0aae9df34850be4d187a035d8cc15954e)
@@ -107,4 +107,6 @@
                       zmax=zmax_2D_temp, show_colorbar=show_colorbar,
                       update=update)
+
+        self.updateCircularAverage()
 
     def calculateDepth(self):
@@ -240,7 +242,7 @@
         self.slicer_widget.show()
 
-    def onCircularAverage(self):
-        """
-        Perform circular averaging on Data2D
+    def circularAverage(self):
+        """
+        Calculate the circular average and create the Data object for it
         """
         # Find the best number of bins
@@ -281,9 +283,49 @@
         new_plot.id = "Circ avg " + self.data.name
         new_plot.is_data = True
+
+        return new_plot
+
+    def onCircularAverage(self):
+        """
+        Perform circular averaging on Data2D
+        """
+        new_plot = self.circularAverage()
+
         item = self._item
         if self._item.parent() is not None:
             item = self._item.parent()
+
         GuiUtils.updateModelItemWithPlot(item, new_plot, new_plot.id)
 
+        self.manager.communicator.plotUpdateSignal.emit([new_plot])
+        self.manager.communicator.forcePlotDisplaySignal.emit([item, new_plot])
+
+    def updateCircularAverage(self):
+        """
+        Update circular averaging plot on Data2D change
+        """
+        if not hasattr(self,'_item'): return
+        item = self._item
+        if self._item.parent() is not None:
+            item = self._item.parent()
+
+        # Get all plots for current item
+        plots = GuiUtils.plotsFromModel("", item)
+        if plots is None: return
+        ca_caption = '2daverage'+self.data.name
+        # See if current item plots contain 2D average plot
+        has_plot = False
+        for plot in plots:
+            if plot.group_id is None: continue
+            if ca_caption in plot.group_id: has_plot=True
+        # return prematurely if no circular average plot found
+        if not has_plot: return
+
+        # Create a new plot
+        new_plot = self.circularAverage()
+
+        # Overwrite existing plot
+        GuiUtils.updateModelItemWithPlot(item, new_plot, new_plot.id)
+        # Show the new plot, if already visible
         self.manager.communicator.plotUpdateSignal.emit([new_plot])
 
@@ -536,4 +578,25 @@
         self.plot(data=new_plot)
 
+    def onMplMouseDown(self, event):
+        """
+        Display x/y/intensity on click
+        """
+        # Check that the LEFT button was pressed
+        if event.button != 1:
+            return
+
+        if event.inaxes is None:
+            return
+        x_click = 0.0
+        y_click = 0.0
+        try:
+            x_click = float(event.xdata)  # / size_x
+            y_click = float(event.ydata)  # / size_y
+        except:
+            self.position = None
+        x_str = GuiUtils.formatNumber(x_click)
+        y_str = GuiUtils.formatNumber(y_click)
+        coord_str = "x: {}, y: {}".format(x_str, y_str)
+        self.manager.communicator.statusBarUpdateSignal.emit(coord_str)
 
 class Plotter2D(QtWidgets.QDialog, Plotter2DWidget):
Index: src/sas/qtgui/Utilities/GridPanel.py
===================================================================
--- src/sas/qtgui/Utilities/GridPanel.py	(revision 75906a171c9e6fa6e60f78a7576df422c13e9ac1)
+++ src/sas/qtgui/Utilities/GridPanel.py	(revision c4c4957ebd11f260ac04d2a240bc1ea0c3c97931)
@@ -126,5 +126,5 @@
         return
 
-    def addTabPage(self):
+    def addTabPage(self, name=None):
         """
         Add new tab page with QTableWidget
@@ -141,5 +141,8 @@
         # However, some models have LONG names, which doesn't look well on the tab bar.
         self.tab_number += 1
-        tab_name = "Tab " + str(self.tab_number)
+        if name is not None:
+            tab_name = name
+        else:
+            tab_name = "Tab " + str(self.tab_number)
         # each table needs separate slots.
         tab_widget.customContextMenuRequested.connect(self.showContextMenu)
@@ -153,6 +156,15 @@
         Create a new tab with batch fitting results
         """
+        # pull out page name from results
+        page_name = None
+        if len(results)>=2:
+            if isinstance(results[-1], str):
+                page_name = results[-1]
+                _ = results.pop(-1)
+
         if self.has_data:
-            self.addTabPage()
+            self.addTabPage(name=page_name)
+        else:
+            self.tabWidget.setTabText(0, page_name)
         # Update the new widget
         # Fill in the table from input data in the last/newest page
