diff --git a/docs/source/release/v3.12.0/lowq.rst b/docs/source/release/v3.12.0/lowq.rst
index 4587c189f577177cd8754a7a4dfc8d385ab051b5..78fa26b62b48069fb0f1d57d1872d9946b83e98a 100644
--- a/docs/source/release/v3.12.0/lowq.rst
+++ b/docs/source/release/v3.12.0/lowq.rst
@@ -22,6 +22,7 @@ Small Angle Scattering
 - BeamCentreFinder has been implemented to work with the new backend in the python script window.
 - Added functionality to specify q values between which merged data is used and outside of which pure HAB and LAB are used.
 - Have added the functionality to show diagnostic transmission workspaces to new GUI.
+- Have added functionality to continually plot latest results to new GUI.
 - Fixed a bug where specifying fit range was not working for merged reductions. Previously the user specified range was being ignored.
 - Fixed a bug in the old GUI where loading files on UNIX systems would not work unless the file name was in uppercase letters.
 - Added find beam centre tab to SANS GUI V2.
diff --git a/scripts/Interface/ui/sans_isis/sans_data_processor_gui.py b/scripts/Interface/ui/sans_isis/sans_data_processor_gui.py
index ec626b3e6e10c4c2ab9bd4961f355467e3fed141..4f48817ebba763047641a3fc567f7cb7fb039cd2 100644
--- a/scripts/Interface/ui/sans_isis/sans_data_processor_gui.py
+++ b/scripts/Interface/ui/sans_isis/sans_data_processor_gui.py
@@ -617,6 +617,14 @@ class SANSDataProcessorGui(QtGui.QMainWindow, ui_sans_data_processor_window.Ui_S
     def use_optimizations(self, value):
         self.use_optimizations_checkbox.setChecked(value)
 
+    @property
+    def plot_results(self):
+        return self.plot_results_checkbox.isChecked()
+
+    @plot_results.setter
+    def plot_results(self, value):
+        self.plot_results_checkbox.setChecked(value)
+
     @property
     def output_mode(self):
         if self.output_mode_memory_radio_button.isChecked():
diff --git a/scripts/Interface/ui/sans_isis/sans_data_processor_window.ui b/scripts/Interface/ui/sans_isis/sans_data_processor_window.ui
index 8b74ba89a0576aabb24acb514472515303c9587a..e881ee86907d2a1ba0d09f427f0a82a1a07dfa4e 100644
--- a/scripts/Interface/ui/sans_isis/sans_data_processor_window.ui
+++ b/scripts/Interface/ui/sans_isis/sans_data_processor_window.ui
@@ -302,32 +302,39 @@ QGroupBox::title {
                    </item>
                    <item>
                     <layout class="QGridLayout" name="gridLayout">
-                     <item row="0" column="0">
-                      <widget class="QCheckBox" name="save_zero_error_free">
+                     <item row="1" column="0">
+                      <widget class="QCheckBox" name="use_optimizations_checkbox">
                        <property name="toolTip">
-                        <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When enabled it will replace all entries with zero-valued errors with errors of magnitude 1e6. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+                        <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When optimizations are turned on then data is being stored in RAM and reused. The optimizations affect the raw data files and can reductions. Most of the time you will want these optimizations enabled. Disable the optimizations if you run a very long batch reduction where there might be the danger  that your RAM will max out.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
                        </property>
                        <property name="text">
-                        <string>zero error free</string>
+                        <string>Use Optimizations</string>
                        </property>
                        <property name="checked">
                         <bool>true</bool>
                        </property>
                       </widget>
                      </item>
-                     <item row="1" column="0">
-                      <widget class="QCheckBox" name="use_optimizations_checkbox">
+                     <item row="0" column="0">
+                      <widget class="QCheckBox" name="save_zero_error_free">
                        <property name="toolTip">
-                        <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When optimizations are turned on then data is being stored in RAM and reused. The optimizations affect the raw data files and can reductions. Most of the time you will want these optimizations enabled. Disable the optimizations if you run a very long batch reduction where there might be the danger  that your RAM will max out.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+                        <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When enabled it will replace all entries with zero-valued errors with errors of magnitude 1e6. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
                        </property>
                        <property name="text">
-                        <string>Use Optimizations</string>
+                        <string>zero error free</string>
                        </property>
                        <property name="checked">
                         <bool>true</bool>
                        </property>
                       </widget>
                      </item>
+                     <item row="2" column="0">
+                      <widget class="QCheckBox" name="plot_results_checkbox">
+                       <property name="text">
+                        <string>Plot Results</string>
+                       </property>
+                      </widget>
+                     </item>
                     </layout>
                    </item>
                   </layout>
diff --git a/scripts/SANS/sans/algorithm_detail/batch_execution.py b/scripts/SANS/sans/algorithm_detail/batch_execution.py
index c2534c9404ff17344c460811ab79874d18737686..606c14b5127c12012bd17f36ce69ce2785a0b9f6 100644
--- a/scripts/SANS/sans/algorithm_detail/batch_execution.py
+++ b/scripts/SANS/sans/algorithm_detail/batch_execution.py
@@ -1,7 +1,6 @@
 from __future__ import (absolute_import, division, print_function)
 from copy import deepcopy
 from mantid.api import AnalysisDataService
-
 from sans.common.general_functions import (create_managed_non_child_algorithm, create_unmanaged_algorithm,
                                            get_output_name, get_base_name_from_multi_period_name)
 from sans.common.enums import (SANSDataType, SaveType, OutputMode, ISISReductionMode)
@@ -12,12 +11,18 @@ from sans.common.constants import (TRANS_SUFFIX, SANS_SUFFIX, ALL_PERIODS,
                                    REDUCED_CAN_AND_PARTIAL_CAN_FOR_OPTIMIZATION)
 from sans.common.file_information import (get_extension_for_file_type, SANSFileInformationFactory)
 from sans.state.data import StateData
+try:
+    import mantidplot
+except (Exception, Warning):
+    mantidplot = None
+    # this should happen when this is called from outside Mantidplot and only then,
+    # the result is that attempting to plot will raise an exception
 
 
 # ----------------------------------------------------------------------------------------------------------------------
 # Functions for the execution of a single batch iteration
 # ----------------------------------------------------------------------------------------------------------------------
-def single_reduction_for_batch(state, use_optimizations, output_mode):
+def single_reduction_for_batch(state, use_optimizations, output_mode, plot_results, output_graph):
     """
     Runs a single reduction.
 
@@ -58,6 +63,7 @@ def single_reduction_for_batch(state, use_optimizations, output_mode):
     single_reduction_options = {"UseOptimizations": use_optimizations}
     reduction_alg = create_managed_non_child_algorithm(single_reduction_name, **single_reduction_options)
     reduction_alg.setChild(False)
+
     # Perform the data reduction
     for reduction_package in reduction_packages:
         # -----------------------------------
@@ -88,7 +94,8 @@ def single_reduction_for_batch(state, use_optimizations, output_mode):
                                                                                "OutputWorkspaceHABCanCount")
         reduction_package.reduced_hab_can_norm = get_workspace_from_algorithm(reduction_alg,
                                                                               "OutputWorkspaceHABCanNorm")
-
+        if plot_results and mantidplot:
+            plot_workspace(reduction_package, output_graph)
         # -----------------------------------
         # The workspaces are already on the ADS, but should potentially be grouped
         # -----------------------------------
@@ -120,6 +127,27 @@ def single_reduction_for_batch(state, use_optimizations, output_mode):
         delete_optimization_workspaces(reduction_packages)
 
 
+# ----------------------------------------------------------------------------------------------------------------------
+# Function for plotting
+# ----------------------------------------------------------------------------------------------------------------------
+def plot_workspace(reduction_package, output_graph):
+    if reduction_package.reduction_mode == ISISReductionMode.All:
+        graph_handle = mantidplot.plotSpectrum([reduction_package.reduced_hab, reduction_package.reduced_lab], 0,
+                                               window=mantidplot.graph(output_graph), clearWindow=True)
+        graph_handle.activeLayer().logLogAxes()
+    elif reduction_package.reduction_mode == ISISReductionMode.HAB:
+        graph_handle = mantidplot.plotSpectrum(reduction_package.reduced_hab, 0, window=mantidplot.graph(output_graph), clearWindow=True)
+        graph_handle.activeLayer().logLogAxes()
+    elif reduction_package.reduction_mode == ISISReductionMode.LAB:
+        graph_handle = mantidplot.plotSpectrum(reduction_package.reduced_lab, 0, window=mantidplot.graph(output_graph), clearWindow=True)
+        graph_handle.activeLayer().logLogAxes()
+    elif reduction_package.reduction_mode == ISISReductionMode.Merged:
+        graph_handle = mantidplot.plotSpectrum([reduction_package.reduced_merged,
+                                                reduction_package.reduced_hab, reduction_package.reduced_lab], 0,
+                                               window=mantidplot.graph(output_graph), clearWindow=True)
+        graph_handle.activeLayer().logLogAxes()
+
+
 # ----------------------------------------------------------------------------------------------------------------------
 # Functions for Data Loading
 # ----------------------------------------------------------------------------------------------------------------------
diff --git a/scripts/SANS/sans/gui_logic/presenter/run_tab_presenter.py b/scripts/SANS/sans/gui_logic/presenter/run_tab_presenter.py
index b0614fd93dac312b70ecc4c6fb34bfa344e09e39..d65e62ea46a6954c44665277b2766aa19b907816 100644
--- a/scripts/SANS/sans/gui_logic/presenter/run_tab_presenter.py
+++ b/scripts/SANS/sans/gui_logic/presenter/run_tab_presenter.py
@@ -39,6 +39,13 @@ from sans.common.constants import ALL_PERIODS
 from sans.gui_logic.models.beam_centre_model import BeamCentreModel
 from ui.sans_isis.work_handler import WorkHandler
 
+try:
+    import mantidplot
+except (Exception, Warning):
+    mantidplot = None
+    # this should happen when this is called from outside Mantidplot and only then,
+    # the result is that attempting to plot will raise an exception
+
 
 class RunTabPresenter(object):
     class ConcreteRunTabListener(SANSDataProcessorGui.RunTabListener):
@@ -73,7 +80,8 @@ class RunTabPresenter(object):
 
         # Logger
         self.sans_logger = Logger("SANS")
-
+        # Name of grpah to output to
+        self.output_graph = 'SANS-Latest'
         # Presenter needs to have a handle on the view since it delegates it
         self._view = None
         self.set_view(view)
@@ -276,6 +284,12 @@ class RunTabPresenter(object):
 
             # 3. Add dummy row index to Options column
             self._set_indices()
+
+            # 4. Create the graph if continuous output is specified
+            if mantidplot:
+                if self._view.plot_results and not mantidplot.graph(self.output_graph):
+                    mantidplot.newGraph(self.output_graph)
+
         except Exception as e:
             self._view.halt_process_flag()
             self.sans_logger.error("Process halted due to: {}".format(str(e)))
@@ -393,6 +407,15 @@ class RunTabPresenter(object):
         global_options += ","
         global_options += output_mode_selection
 
+        # Check if results should be plotted
+        plot_results_selection = "PlotResults=1" if self._view.plot_results else "PlotResults=0"
+        global_options += ","
+        global_options += plot_results_selection
+
+        # Get the name of the graph to output to
+        output_graph_selection = "OutputGraph={}".format(self.output_graph)
+        global_options += ","
+        global_options += output_graph_selection
         return global_options
 
     # ------------------------------------------------------------------------------------------------------------------
diff --git a/scripts/SANS/sans/gui_logic/sans_data_processor_gui_algorithm.py b/scripts/SANS/sans/gui_logic/sans_data_processor_gui_algorithm.py
index 41620dadfbc3af2da4778615b1986e17c58cc3c7..5156bc4930473beceb019461399a2ae8f62e3b90 100644
--- a/scripts/SANS/sans/gui_logic/sans_data_processor_gui_algorithm.py
+++ b/scripts/SANS/sans/gui_logic/sans_data_processor_gui_algorithm.py
@@ -146,6 +146,13 @@ def create_properties():
                                        default=False,
                                        prefix='',
                                        property_type=bool),
+                  algorithm_list_entry(column_name="",
+                                       algorithm_property="PlotResults",
+                                       description='If results should be plotted.',
+                                       show_value=False,
+                                       default=False,
+                                       prefix='',
+                                       property_type=bool),
                   algorithm_list_entry(column_name="OutputName",
                                        algorithm_property="OutputName",
                                        description='An optional custom output workspace name.',
@@ -174,7 +181,14 @@ def create_properties():
                                        show_value=False,
                                        default=OutputMode.to_string(OutputMode.PublishToADS),
                                        prefix='',
-                                       property_type=bool)
+                                       property_type=bool),
+                  algorithm_list_entry(column_name="",
+                                       algorithm_property="OutputGraph",
+                                       description='The name of the graph to output to.',
+                                       show_value=False,
+                                       default='',
+                                       prefix='',
+                                       property_type=str)
                   ]
     return properties
 
@@ -247,12 +261,14 @@ class SANSGuiDataProcessorAlgorithm(DataProcessorAlgorithm):
         # 2. Get the state for the index from the PropertyManagerDataService
         property_manager_service = PropertyManagerService()
         state = property_manager_service.get_single_state_from_pmds(index_to_retrieve=index)
-
         # 3. Get some global settings
         use_optimizations = self.getProperty("UseOptimizations").value
         output_mode_as_string = self.getProperty("OutputMode").value
         output_mode = OutputMode.from_string(output_mode_as_string)
+        plot_results = self.getProperty('PlotResults').value
+        output_graph = self.getProperty('OutputGraph').value
 
         # 3. Run the sans_batch script
         sans_batch = SANSBatchReduction()
-        sans_batch(states=state, use_optimizations=use_optimizations, output_mode=output_mode)
+        sans_batch(states=state, use_optimizations=use_optimizations, output_mode=output_mode, plot_results=plot_results
+                   , output_graph=output_graph)
diff --git a/scripts/SANS/sans/sans_batch.py b/scripts/SANS/sans/sans_batch.py
index 4b93cb1db3a847f1d99d53be02d5edd08b614712..2e1bb9760efe338c91cfbedbc2f43ffdb7af528f 100644
--- a/scripts/SANS/sans/sans_batch.py
+++ b/scripts/SANS/sans/sans_batch.py
@@ -11,7 +11,7 @@ class SANSBatchReduction(object):
     def __init__(self):
         super(SANSBatchReduction, self).__init__()
 
-    def __call__(self, states, use_optimizations=True, output_mode=OutputMode.PublishToADS):
+    def __call__(self, states, use_optimizations=True, output_mode=OutputMode.PublishToADS, plot_results = False, output_graph=''):
         """
         This is the start of any reduction.
 
@@ -22,17 +22,17 @@ class SANSBatchReduction(object):
                             2. SaveToFile
                             3. Both
         """
-        self.validate_inputs(states, use_optimizations, output_mode)
+        self.validate_inputs(states, use_optimizations, output_mode, plot_results, output_graph)
 
-        self._execute(states, use_optimizations, output_mode)
+        self._execute(states, use_optimizations, output_mode, plot_results, output_graph)
 
     @staticmethod
-    def _execute(states, use_optimizations, output_mode):
+    def _execute(states, use_optimizations, output_mode, plot_results, output_graph):
         # Iterate over each state, load the data and perform the reduction
         for state in states:
-            single_reduction_for_batch(state, use_optimizations, output_mode)
+            single_reduction_for_batch(state, use_optimizations, output_mode, plot_results, output_graph)
 
-    def validate_inputs(self, states, use_optimizations, output_mode):
+    def validate_inputs(self, states, use_optimizations, output_mode, plot_results, output_graph):
         # We are strict about the types here.
         # 1. states has to be a list of sans state objects
         # 2. use_optimizations has to be bool
@@ -49,6 +49,14 @@ class SANSBatchReduction(object):
             raise RuntimeError("The optimization has to be a boolean. The provided type is"
                                " {0}".format(type(use_optimizations)))
 
+        if not isinstance(plot_results, bool):
+            raise RuntimeError("The plot_result has to be a boolean. The provided type is"
+                               " {0}".format(type(plot_results)))
+
+        if plot_results and not output_graph:
+            raise RuntimeError("The output_graph must be set if plot_results is true. The provided value is"
+                               " {0}".format(output_graph))
+
         if output_mode is not OutputMode.PublishToADS and output_mode is not OutputMode.SaveToFile and\
                         output_mode is not OutputMode.Both:  # noqa
             raise RuntimeError("The output mode has to be an enum of type OutputMode. The provided type is"
diff --git a/scripts/SANS/sans/test_helper/mock_objects.py b/scripts/SANS/sans/test_helper/mock_objects.py
index 6e9299480c4f1e4da2a6529f37320bd6515dec5c..921d64400c86336b11b6da7c49eafad5907d7159 100644
--- a/scripts/SANS/sans/test_helper/mock_objects.py
+++ b/scripts/SANS/sans/test_helper/mock_objects.py
@@ -181,6 +181,9 @@ def create_mock_view(user_file_path, batch_file_path=None, row_user_file_path =
     _q_1d_step_type = mock.PropertyMock(return_value=RangeStepType.Lin)
     type(view)._q_1d_step_type = _q_1d_step_type
 
+    _output_mode = mock.PropertyMock(return_value=OutputMode.PublishToADS)
+    type(view).output_mode = _output_mode
+
     return view, settings_diagnostic_tab, masking_table
 
 
diff --git a/scripts/test/SANS/gui_logic/main_presenter_test.py b/scripts/test/SANS/gui_logic/main_presenter_test.py
index 06f6fa8701a47d022495285ca92b99fd0b8c08f5..660ce01c61b30ebda59471d164f33759d08831b4 100644
--- a/scripts/test/SANS/gui_logic/main_presenter_test.py
+++ b/scripts/test/SANS/gui_logic/main_presenter_test.py
@@ -21,7 +21,7 @@ class MainPresenterTest(unittest.TestCase):
         presenter = MainPresenter(SANSFacility.ISIS)
         self.assertTrue(presenter.get_number_of_white_list_items() == 0)
         white_list = presenter.get_white_list()
-        self.assertTrue(presenter.get_number_of_white_list_items() == 17)
+        self.assertTrue(presenter.get_number_of_white_list_items() == 19)
         self.assertTrue(white_list[0].algorithm_property == "SampleScatter")
         self.assertTrue(white_list[1].algorithm_property == "SampleScatterPeriod")
         self.assertTrue(white_list[2].algorithm_property == "SampleTransmission")
@@ -35,18 +35,20 @@ class MainPresenterTest(unittest.TestCase):
         self.assertTrue(white_list[10].algorithm_property == "CanDirect")
         self.assertTrue(white_list[11].algorithm_property == "CanDirectPeriod")
         self.assertTrue(white_list[12].algorithm_property == "UseOptimizations")
-        self.assertTrue(white_list[13].algorithm_property == "OutputName")
-        self.assertTrue(white_list[14].algorithm_property == "UserFile")
-        self.assertTrue(white_list[15].algorithm_property == "RowIndex")
-        self.assertTrue(white_list[16].algorithm_property == "OutputMode")
+        self.assertTrue(white_list[13].algorithm_property == "PlotResults")
+        self.assertTrue(white_list[14].algorithm_property == "OutputName")
+        self.assertTrue(white_list[15].algorithm_property == "UserFile")
+        self.assertTrue(white_list[16].algorithm_property == "RowIndex")
+        self.assertTrue(white_list[17].algorithm_property == "OutputMode")
+        self.assertTrue(white_list[18].algorithm_property == "OutputGraph")
 
     def test_that_black_list_is_correct(self):
         presenter = MainPresenter(SANSFacility.ISIS)
         expected = "InputWorkspace,OutputWorkspace,SampleScatter,SampleScatterPeriod,SampleTransmission," \
                    "SampleTransmissionPeriod,SampleDirect,SampleDirectPeriod,CanScatter,CanScatterPeriod," \
                    "CanTransmission,CanTransmissionPeriod,CanDirect,CanDirectPeriod," \
-                   "UseOptimizations,OutputName,UserFile,RowIndex,OutputMode,"
-        self.assertTrue(expected == presenter.get_black_list())
+                   "UseOptimizations,PlotResults,OutputName,UserFile,RowIndex,OutputMode,OutputGraph,"
+        self.assertEqual(expected, presenter.get_black_list())
 
     def test_that_gets_pre_processing_options_are_valid_and_other_options_are_empty(self):
         # Arrange
@@ -64,8 +66,8 @@ class MainPresenterTest(unittest.TestCase):
         pre_processing_options = presenter.getProcessingOptions()
 
         # Assert
-        expected = "UseOptimizations=1,OutputMode=PublishToADS"
-        self.assertTrue(expected == pre_processing_options)
+        expected = 'UseOptimizations=1,OutputMode=PublishToADS,PlotResults=1,OutputGraph=SANS-Latest'
+        self.assertEqual(expected, pre_processing_options)
         self.assertFalse(presenter.getPreprocessingOptionsAsString())
         self.assertFalse(presenter.getPostprocessingOptions())
 
diff --git a/scripts/test/SANS/gui_logic/run_tab_presenter_test.py b/scripts/test/SANS/gui_logic/run_tab_presenter_test.py
index 4966b8bd53f442b042a40695515c73593b7e890b..fc1ea744da45d884385e60d39a8798b41c267462 100644
--- a/scripts/test/SANS/gui_logic/run_tab_presenter_test.py
+++ b/scripts/test/SANS/gui_logic/run_tab_presenter_test.py
@@ -372,6 +372,14 @@ class RunTabPresenterTest(unittest.TestCase):
         # clean up
         self._remove_files(user_file_path=user_file_path, batch_file_path=batch_file_path)
 
+    def test_that_get_processing_options_returns_correct_value(self):
+        batch_file_path, user_file_path, presenter, _ = self._get_files_and_mock_presenter(BATCH_FILE_TEST_CONTENT_1)
+        expected_result = 'UseOptimizations=1,OutputMode=PublishToADS,PlotResults=1,OutputGraph=SANS-Latest'
+
+        result = presenter.get_processing_options()
+
+        self.assertEqual(expected_result, result)
+
     @staticmethod
     def _clear_property_manager_data_service():
         for element in PropertyManagerDataService.getObjectNames():