diff --git a/qt/scientific_interfaces/ISISReflectometry/CMakeLists.txt b/qt/scientific_interfaces/ISISReflectometry/CMakeLists.txt
index f07c9cc6b8b4e32a0d6d167f5d9c14f01ac1dbd9..546e36b280d499bb7c37fca916f8f6d6d3411eee 100644
--- a/qt/scientific_interfaces/ISISReflectometry/CMakeLists.txt
+++ b/qt/scientific_interfaces/ISISReflectometry/CMakeLists.txt
@@ -18,6 +18,7 @@ set ( SRC_FILES
     QtReflEventTabView.cpp
     QtReflEventView.cpp
     QtReflMainWindowView.cpp
+    QtReflBatchView.cpp
     QtReflRunsTabView.cpp
     QtReflSaveTabView.cpp
     QtReflSettingsTabView.cpp
@@ -32,6 +33,7 @@ set ( SRC_FILES
     ReflFromStdStringMap.cpp
     ReflGenericDataProcessorPresenterFactory.cpp
     ReflMainWindowPresenter.cpp
+    ReflBatchPresenter.cpp
     ReflNexusMeasurementItemSource.cpp
     ReflRunsTabPresenter.cpp
     ReflSaveTabPresenter.cpp
@@ -58,7 +60,9 @@ set ( INC_FILES
     IReflEventTabPresenter.h
     IReflEventView.h
     IReflMainWindowPresenter.h
+    IReflBatchPresenter.h
     IReflMainWindowView.h
+    IReflBatchView.h
     IReflRunsTabPresenter.h
     IReflRunsTabView.h
     IReflSaveTabPresenter.h
@@ -72,6 +76,7 @@ set ( INC_FILES
     QtReflEventTabView.h
     QtReflEventView.h
     QtReflMainWindowView.h
+    QtReflBatchView.h
     QtReflRunsTabView.h
     QtReflSaveTabView.h
     QtReflSettingsTabView.h
@@ -88,6 +93,7 @@ set ( INC_FILES
     ReflFromStdStringMap.h
     ReflGenericDataProcessorPresenterFactory.h
     ReflMainWindowPresenter.h
+    ReflBatchPresenter.h
     ReflMeasurementItemSource.h
     ReflNexusMeasurementItemSource.h
     ReflRunsTabPresenter.h
@@ -112,6 +118,7 @@ set ( MOC_FILES
     QtReflSettingsTabView.h
     QtReflSettingsView.h
     QtReflMainWindowView.h
+    QtReflBatchView.h
     Views/BatchView.h
 )
 
@@ -119,6 +126,7 @@ set ( UI_FILES
    ReflEventTabWidget.ui
    ReflEventWidget.ui
    ReflMainWindowWidget.ui
+   ReflBatchWidget.ui
    ReflRunsTabWidget.ui
    ReflSaveTabWidget.ui
    ReflSettingsTabWidget.ui
diff --git a/qt/scientific_interfaces/ISISReflectometry/IReflBatchPresenter.h b/qt/scientific_interfaces/ISISReflectometry/IReflBatchPresenter.h
index f592b39bb75c3b29d7f51f283cdb8ad1b16ec6f5..1bbe88bdcc16152e60b6fd23cc85f86025b77d40 100644
--- a/qt/scientific_interfaces/ISISReflectometry/IReflBatchPresenter.h
+++ b/qt/scientific_interfaces/ISISReflectometry/IReflBatchPresenter.h
@@ -1,5 +1,5 @@
-#ifndef MANTID_ISISREFLECTOMETRY_IREFLMAINWINDOWPRESENTER_H
-#define MANTID_ISISREFLECTOMETRY_IREFLMAINWINDOWPRESENTER_H
+#ifndef MANTID_ISISREFLECTOMETRY_IREFLBATCHPRESENTER_H
+#define MANTID_ISISREFLECTOMETRY_IREFLBATCHPRESENTER_H
 
 #include "MantidQtWidgets/Common/DataProcessorUI/OptionsQMap.h"
 #include "MantidQtWidgets/Common/DataProcessorUI/TreeData.h"
@@ -40,9 +40,7 @@ class IReflBatchPresenter {
 public:
   /// Destructor
   virtual ~IReflBatchPresenter(){};
-  enum class Flag { HelpPressed };
 
-  virtual void notify(Flag flag) = 0;
   virtual void notifyReductionPaused(int group) = 0;
   virtual void notifyReductionResumed(int group) = 0;
 
@@ -71,13 +69,6 @@ public:
   virtual std::string getTimeSlicingValues(int group) const = 0;
   /// Time-slicing type
   virtual std::string getTimeSlicingType(int group) const = 0;
-  virtual void giveUserCritical(const std::string &prompt,
-                                const std::string &title) = 0;
-  /// Dialog to print information
-  virtual void giveUserInfo(const std::string &prompt,
-                            const std::string &title) = 0;
-  /// Run a python algorithm
-  virtual std::string runPythonAlgorithm(const std::string &pythonCode) = 0;
   /// Set the instrument name
   virtual void setInstrumentName(const std::string &instName) const = 0;
   /// Data processing check for all groups
@@ -89,4 +80,4 @@ public:
 };
 }
 }
-#endif /* MANTID_ISISREFLECTOMETRY_IREFLMAINWINDOWPRESENTER_H */
+#endif /* MANTID_ISISREFLECTOMETRY_IREFLBATCHPRESENTER_H */
diff --git a/qt/scientific_interfaces/ISISReflectometry/IReflEventTabPresenter.h b/qt/scientific_interfaces/ISISReflectometry/IReflEventTabPresenter.h
index 613a6fc9d1bea4023190eb67b3aa18c66e40ba5e..db1d61157a8796f33b810476f480c90cc0ef74a4 100644
--- a/qt/scientific_interfaces/ISISReflectometry/IReflEventTabPresenter.h
+++ b/qt/scientific_interfaces/ISISReflectometry/IReflEventTabPresenter.h
@@ -2,6 +2,7 @@
 #define MANTID_ISISREFLECTOMETRY_IREFLEVENTTABPRESENTER_H
 
 #include <string>
+#include "IReflBatchPresenter.h"
 
 namespace MantidQt {
 namespace CustomInterfaces {
@@ -42,7 +43,7 @@ public:
   /// Time-slicing type
   virtual std::string getTimeSlicingType(int group) const = 0;
 
-  virtual void acceptMainPresenter(IReflMainWindowPresenter *mainPresenter) = 0;
+  virtual void acceptMainPresenter(IReflBatchPresenter *mainPresenter) = 0;
   virtual void settingsChanged(int group) = 0;
   virtual void onReductionPaused(int group) = 0;
   virtual void onReductionResumed(int group) = 0;
diff --git a/qt/scientific_interfaces/ISISReflectometry/IReflEventView.h b/qt/scientific_interfaces/ISISReflectometry/IReflEventView.h
index 8eeb886061df79d338f3b17913e8ae0c331de7f1..9af4fbdc8aee48538d4eb17513045fc7a88afb1e 100644
--- a/qt/scientific_interfaces/ISISReflectometry/IReflEventView.h
+++ b/qt/scientific_interfaces/ISISReflectometry/IReflEventView.h
@@ -36,10 +36,9 @@ File change history is stored at: <https://github.com/mantidproject/mantid>.
 Code Documentation is available at: <http://doxygen.mantidproject.org>
 */
 
-class DLLExport IReflEventView {
+class MANTIDQT_ISISREFLECTOMETRY_DLL IReflEventView {
 public:
-  IReflEventView(){};
-  virtual ~IReflEventView(){};
+  virtual ~IReflEventView() = default;
   virtual IReflEventPresenter *getPresenter() const = 0;
 
   virtual std::string getLogValueTimeSlicingValues() const = 0;
diff --git a/qt/scientific_interfaces/ISISReflectometry/IReflMainWindowPresenter.h b/qt/scientific_interfaces/ISISReflectometry/IReflMainWindowPresenter.h
index d41aa2d49f513e28fee5b23a4d3c2a8bd1369f7e..685f0edf4eba08d4d36798b6fb9988b7e9906749 100644
--- a/qt/scientific_interfaces/ISISReflectometry/IReflMainWindowPresenter.h
+++ b/qt/scientific_interfaces/ISISReflectometry/IReflMainWindowPresenter.h
@@ -40,52 +40,13 @@ class IReflMainWindowPresenter {
 public:
   /// Destructor
   virtual ~IReflMainWindowPresenter(){};
+
   enum class Flag { HelpPressed };
 
   virtual void notify(Flag flag) = 0;
-  virtual void notifyReductionPaused(int group) = 0;
-  virtual void notifyReductionResumed(int group) = 0;
-
-  virtual void completedRowReductionSuccessfully(
-      MantidWidgets::DataProcessor::GroupData const &group,
-      std::string const &workspaceName) = 0;
-
-  virtual void completedGroupReductionSuccessfully(
-      MantidWidgets::DataProcessor::GroupData const &group,
-      std::string const &workspaceName) = 0;
-
-  /// Transmission runs for a specific run angle
-  virtual MantidWidgets::DataProcessor::OptionsQMap
-  getOptionsForAngle(int group, const double angle) const = 0;
-  /// Whether there are per-angle transmission runs specified
-  virtual bool hasPerAngleOptions(int group) const = 0;
-  /// Pre-processing
-  virtual MantidWidgets::DataProcessor::OptionsQMap
-  getTransmissionOptions(int group) const = 0;
-  /// Processing
-  virtual MantidWidgets::DataProcessor::OptionsQMap
-  getReductionOptions(int group) const = 0;
-  /// Post-processing
-  virtual std::string getStitchOptions(int group) const = 0;
-  /// Time-slicing values
-  virtual std::string getTimeSlicingValues(int group) const = 0;
-  /// Time-slicing type
-  virtual std::string getTimeSlicingType(int group) const = 0;
-  virtual void giveUserCritical(const std::string &prompt,
-                                const std::string &title) = 0;
-  /// Dialog to print information
-  virtual void giveUserInfo(const std::string &prompt,
-                            const std::string &title) = 0;
-  /// Run a python algorithm
   virtual std::string runPythonAlgorithm(const std::string &pythonCode) = 0;
-  /// Set the instrument name
-  virtual void setInstrumentName(const std::string &instName) const = 0;
-  /// Data processing check for all groups
+//  virtual void setInstrumentName(const std::string &instName) const = 0;
   virtual bool isProcessing() const = 0;
-  /// Data processing check for a specific group
-  virtual bool isProcessing(int group) const = 0;
-
-  virtual void settingsChanged(int group) = 0;
 };
 }
 }
diff --git a/qt/scientific_interfaces/ISISReflectometry/IReflRunsTabPresenter.h b/qt/scientific_interfaces/ISISReflectometry/IReflRunsTabPresenter.h
index e477e8c5febd2b01f6c0885721de1d9298775bff..2561e627a7a5e23a33194693ed06ae51d31735a8 100644
--- a/qt/scientific_interfaces/ISISReflectometry/IReflRunsTabPresenter.h
+++ b/qt/scientific_interfaces/ISISReflectometry/IReflRunsTabPresenter.h
@@ -2,12 +2,11 @@
 #define MANTID_ISISREFLECTOMETRY_IREFLRUNSTABPRESENTER_H
 
 #include "MantidQtWidgets/Common/DataProcessorUI/OptionsMap.h"
+#include "IReflBatchPresenter.h"
 
 namespace MantidQt {
 namespace CustomInterfaces {
 
-class IReflMainWindowPresenter;
-
 /** @class IReflRunsTabPresenter
 
 IReflRunsTabPresenter is an interface which defines the functions any
@@ -38,7 +37,7 @@ class IReflRunsTabPresenter {
 public:
   virtual ~IReflRunsTabPresenter(){};
   /// Accept a main presenter
-  virtual void acceptMainPresenter(IReflMainWindowPresenter *mainPresenter) = 0;
+  virtual void acceptMainPresenter(IReflBatchPresenter *mainPresenter) = 0;
   virtual void settingsChanged(int group) = 0;
 
   enum Flag {
diff --git a/qt/scientific_interfaces/ISISReflectometry/IReflRunsTabView.h b/qt/scientific_interfaces/ISISReflectometry/IReflRunsTabView.h
index 2433872b99f441e3d4aaf5c8c2c56f6b7f8dbdd3..e0acaeb903a98d1f7e8ce0f537b8f95a74b8a5bd 100644
--- a/qt/scientific_interfaces/ISISReflectometry/IReflRunsTabView.h
+++ b/qt/scientific_interfaces/ISISReflectometry/IReflRunsTabView.h
@@ -5,6 +5,7 @@
 #include <string>
 #include <boost/shared_ptr.hpp>
 #include "Views/IBatchView.h"
+#include "DllConfig.h"
 
 namespace MantidQt {
 
@@ -50,10 +51,9 @@ File change history is stored at: <https://github.com/mantidproject/mantid>.
 Code Documentation is available at: <http://doxygen.mantidproject.org>
 */
 
-class DLLExport IReflRunsTabView {
+class MANTIDQT_ISISREFLECTOMETRY_DLL IReflRunsTabView {
 public:
-  IReflRunsTabView(){};
-  virtual ~IReflRunsTabView(){};
+  virtual ~IReflRunsTabView() = default;
 
   virtual void subscribe(IReflRunsTabPresenter *presenter) = 0;
   virtual std::vector<IBatchView *> const &tableViews() const = 0;
@@ -91,6 +91,10 @@ public:
   // Timer methods
   virtual void startTimer(const int millisecs) = 0;
   virtual void stopTimer() = 0;
+  virtual void loginFailed(std::string const &fullError) = 0;
+
+  virtual void noActiveICatSessions() = 0;
+  virtual void missingRunsToTransfer() = 0;
 
   // Start an ICAT search
   virtual void startIcatSearch() = 0;
diff --git a/qt/scientific_interfaces/ISISReflectometry/IReflSaveTabPresenter.h b/qt/scientific_interfaces/ISISReflectometry/IReflSaveTabPresenter.h
index 6f23c0aba24f940210d56c782c00329a9244a3cb..d31fd8e732170e1bc938d5de040c89f00feec333 100644
--- a/qt/scientific_interfaces/ISISReflectometry/IReflSaveTabPresenter.h
+++ b/qt/scientific_interfaces/ISISReflectometry/IReflSaveTabPresenter.h
@@ -1,12 +1,11 @@
 #ifndef MANTID_ISISREFLECTOMETRY_IREFLSAVETABPRESENTER_H
 #define MANTID_ISISREFLECTOMETRY_IREFLSAVETABPRESENTER_H
 #include "MantidQtWidgets/Common/DataProcessorUI/TreeData.h"
+#include "IReflBatchPresenter.h"
 
 namespace MantidQt {
 namespace CustomInterfaces {
 
-class IReflMainWindowPresenter;
-
 /** @class IReflSaveTabPresenter
 
 IReflSaveTabPresenter is an interface which defines the functions that need
@@ -37,7 +36,7 @@ class IReflSaveTabPresenter {
 public:
   virtual ~IReflSaveTabPresenter(){};
   /// Accept a main presenter
-  virtual void acceptMainPresenter(IReflMainWindowPresenter *mainPresenter) = 0;
+  virtual void acceptMainPresenter(IReflBatchPresenter *mainPresenter) = 0;
 
   enum Flag {
     populateWorkspaceListFlag,
diff --git a/qt/scientific_interfaces/ISISReflectometry/IReflSaveTabView.h b/qt/scientific_interfaces/ISISReflectometry/IReflSaveTabView.h
index 3435d6a1694d051fe8912357f4535019c333e447..eddcce789c943c5e4ed8da25ec617ad66712a8ff 100644
--- a/qt/scientific_interfaces/ISISReflectometry/IReflSaveTabView.h
+++ b/qt/scientific_interfaces/ISISReflectometry/IReflSaveTabView.h
@@ -70,10 +70,13 @@ public:
 
   virtual void enableFileFormatAndLocationControls() = 0;
   virtual void disableFileFormatAndLocationControls() = 0;
-  virtual void giveUserCritical(const std::string &prompt,
-                                const std::string &title) = 0;
-  virtual void giveUserInfo(const std::string &prompt,
-                            const std::string &title) = 0;
+
+  virtual void invalidRegex() = 0;
+  virtual void errorInvalidSaveDirectory() = 0;
+  virtual void warnInvalidSaveDirectory() = 0;
+  virtual void noWorkspacesSelected() = 0;
+  virtual void cannotSaveWorkspaces() = 0;
+  virtual void cannotSaveWorkspaces(std::string const& fullError) = 0;
 };
 }
 }
diff --git a/qt/scientific_interfaces/ISISReflectometry/IReflSettingsPresenter.h b/qt/scientific_interfaces/ISISReflectometry/IReflSettingsPresenter.h
index 532634c7e7e4ef9e06521b10f6c4405848b88d29..6710f9ad9befbec4ef52bf90f149a980b8b4a80e 100644
--- a/qt/scientific_interfaces/ISISReflectometry/IReflSettingsPresenter.h
+++ b/qt/scientific_interfaces/ISISReflectometry/IReflSettingsPresenter.h
@@ -2,6 +2,7 @@
 #define MANTID_ISISREFLECTOMETRY_IREFLSETTINGSPRESENTER_H
 
 #include "IReflSettingsTabPresenter.h"
+#include "IReflBatchPresenter.h"
 #include "MantidQtWidgets/Common/DataProcessorUI/OptionsQMap.h"
 #include "MantidAPI/Algorithm.h"
 
@@ -10,7 +11,6 @@
 namespace MantidQt {
 namespace CustomInterfaces {
 
-class IReflMainWindowPresenter;
 
 /** @class IReflSettingsPresenter
 
@@ -40,7 +40,7 @@ Code Documentation is available at: <http://doxygen.mantidproject.org>
 */
 class IReflSettingsPresenter {
 public:
-  virtual ~IReflSettingsPresenter(){};
+  virtual ~IReflSettingsPresenter() = default;
   /// Transmission runs for a particular angle
   virtual MantidWidgets::DataProcessor::OptionsQMap
   getOptionsForAngle(const double angle) const = 0;
diff --git a/qt/scientific_interfaces/ISISReflectometry/IReflSettingsTabPresenter.h b/qt/scientific_interfaces/ISISReflectometry/IReflSettingsTabPresenter.h
index b2a1cab610592b64d5508f16f755a28f6c2112c0..e7750cb633c513b7506b4587ab3eca15fffa48db 100644
--- a/qt/scientific_interfaces/ISISReflectometry/IReflSettingsTabPresenter.h
+++ b/qt/scientific_interfaces/ISISReflectometry/IReflSettingsTabPresenter.h
@@ -1,6 +1,7 @@
 #ifndef MANTID_ISISREFLECTOMETRY_IREFLSETTINGSTABPRESENTER_H
 #define MANTID_ISISREFLECTOMETRY_IREFLSETTINGSTABPRESENTER_H
 
+#include "IReflBatchPresenter.h"
 #include "MantidQtWidgets/Common/DataProcessorUI/OptionsQMap.h"
 
 #include <string>
@@ -8,7 +9,6 @@
 namespace MantidQt {
 namespace CustomInterfaces {
 
-class IReflMainWindowPresenter;
 
 /** @class IReflSettingsTabPresenter
 
@@ -54,7 +54,7 @@ public:
   virtual std::string getStitchOptions(int group) const = 0;
   /// Set current instrument name
   virtual void setInstrumentName(const std::string &instName) = 0;
-  virtual void acceptMainPresenter(IReflMainWindowPresenter *mainPresenter) = 0;
+  virtual void acceptMainPresenter(IReflBatchPresenter *mainPresenter) = 0;
   virtual void settingsChanged(int group) = 0;
   virtual void onReductionPaused(int group) = 0;
   virtual void onReductionResumed(int group) = 0;
diff --git a/qt/scientific_interfaces/ISISReflectometry/QtReflBatchView.cpp b/qt/scientific_interfaces/ISISReflectometry/QtReflBatchView.cpp
index 49fe7d0b82e31dba73eda75dc825dc06c81bd899..9f293ed154d788ade42d223d7b2a1e116f9349e7 100644
--- a/qt/scientific_interfaces/ISISReflectometry/QtReflBatchView.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/QtReflBatchView.cpp
@@ -1,10 +1,10 @@
-#include "QtReflMainWindowView.h"
+#include "QtReflBatchView.h"
 #include "QtReflEventTabView.h"
 #include "QtReflRunsTabView.h"
 #include "QtReflSaveTabView.h"
 #include "QtReflSettingsTabView.h"
 #include "ReflSaveTabPresenter.h"
-#include "ReflMainWindowPresenter.h"
+#include "ReflBatchPresenter.h"
 #include "ReflAsciiSaver.h"
 #include "MantidKernel/make_unique.h"
 #include "Presenters/BatchPresenter.h"
@@ -18,18 +18,14 @@ namespace CustomInterfaces {
 //----------------------------------------------------------------------------------------------
 /** Constructor
 */
-QtReflMainWindowView::QtReflMainWindowView(QWidget *parent)
-    : UserSubWindow(parent) {}
-
-//----------------------------------------------------------------------------------------------
-/** Destructor
-*/
-QtReflMainWindowView::~QtReflMainWindowView() {}
+QtReflBatchView::QtReflBatchView(QWidget *parent) : QWidget(parent) {
+  initLayout();
+}
 
 /**
 Initialise the Interface
 */
-void QtReflMainWindowView::initLayout() {
+void QtReflBatchView::initLayout() {
   m_ui.setupUi(this);
 
   // Create the tabs
@@ -39,15 +35,11 @@ void QtReflMainWindowView::initLayout() {
   auto savePresenter = createSaveTab();
 
   // Create the presenter
-  m_presenter = Mantid::Kernel::make_unique<ReflMainWindowPresenter>(
+  m_presenter = Mantid::Kernel::make_unique<ReflBatchPresenter>(
       this, std::move(runsPresenter), eventPresenter, settingsPresenter,
       std::move(savePresenter));
 }
 
-void QtReflMainWindowView::helpPressed() {
-  m_presenter->notify(IReflMainWindowPresenter::Flag::HelpPressed);
-}
-
 int indexOfElseFirst(std::string const &instrument,
                      std::vector<std::string> const &instruments) {
   auto it = std::find(instruments.cbegin(), instruments.cend(), instrument);
@@ -66,13 +58,13 @@ int defaultInstrumentFromConfig(std::vector<std::string> const &instruments) {
 /** Creates the 'Runs' tab and returns a pointer to its presenter
 * @return :: A pointer to the presenter managing the 'Runs' tab
 */
-std::unique_ptr<IReflRunsTabPresenter> QtReflMainWindowView::createRunsTab() {
+std::unique_ptr<IReflRunsTabPresenter> QtReflBatchView::createRunsTab() {
   auto instruments = std::vector<std::string>(
       {{"INTER", "SURF", "CRISP", "POLREF", "OFFSPEC"}});
   auto defaultInstrumentIndex = defaultInstrumentFromConfig(instruments);
 
   auto *runsTab = new QtReflRunsTabView(this, BatchViewFactory(instruments));
-  m_ui.mainTab->addTab(runsTab, QString("Runs"));
+  m_ui.batchTabs->addTab(runsTab, QString("Runs"));
   connect(runsTab, SIGNAL(runAsPythonScript(const QString &, bool)), this,
           SIGNAL(runAsPythonScript(const QString &, bool)));
 
@@ -88,10 +80,10 @@ std::unique_ptr<IReflRunsTabPresenter> QtReflMainWindowView::createRunsTab() {
 /** Creates the 'Event Handling' tab and returns a pointer to its presenter
 * @return :: A pointer to the presenter managing the 'Event Handling' tab
 */
-IReflEventTabPresenter *QtReflMainWindowView::createEventTab() {
+IReflEventTabPresenter *QtReflBatchView::createEventTab() {
 
   QtReflEventTabView *eventTab = new QtReflEventTabView(this);
-  m_ui.mainTab->addTab(eventTab, QString("Event Handling"));
+  m_ui.batchTabs->addTab(eventTab, QString("Event Handling"));
 
   return eventTab->getPresenter();
 }
@@ -99,10 +91,10 @@ IReflEventTabPresenter *QtReflMainWindowView::createEventTab() {
 /** Creates the 'Settings' tab and returns a pointer to its presenter
 * @return :: A pointer to the presenter managing the 'Settings' tab
 */
-IReflSettingsTabPresenter *QtReflMainWindowView::createSettingsTab() {
+IReflSettingsTabPresenter *QtReflBatchView::createSettingsTab() {
 
   QtReflSettingsTabView *settingsTab = new QtReflSettingsTabView(this);
-  m_ui.mainTab->addTab(settingsTab, QString("Settings"));
+  m_ui.batchTabs->addTab(settingsTab, QString("Settings"));
 
   return settingsTab->getPresenter();
 }
@@ -110,9 +102,9 @@ IReflSettingsTabPresenter *QtReflMainWindowView::createSettingsTab() {
 /** Creates the 'Save ASCII' tab and returns a pointer to its presenter
 * @return :: A pointer to the presenter managing the 'Save ASCII' tab
 */
-std::unique_ptr<IReflSaveTabPresenter> QtReflMainWindowView::createSaveTab() {
+std::unique_ptr<IReflSaveTabPresenter> QtReflBatchView::createSaveTab() {
   auto saveTabView = Mantid::Kernel::make_unique<QtReflSaveTabView>(this);
-  m_ui.mainTab->addTab(saveTabView.get(), QString("Save ASCII"));
+  m_ui.batchTabs->addTab(saveTabView.get(), QString("Save ASCII"));
 
   auto saver = Mantid::Kernel::make_unique<ReflAsciiSaver>();
   return Mantid::Kernel::make_unique<ReflSaveTabPresenter>(
diff --git a/qt/scientific_interfaces/ISISReflectometry/QtReflBatchView.h b/qt/scientific_interfaces/ISISReflectometry/QtReflBatchView.h
index dc6c3d5f46945697b662cb2c6e48de155ff75525..a4549e30d9b0664fa571bf7791362f67ad0c51e0 100644
--- a/qt/scientific_interfaces/ISISReflectometry/QtReflBatchView.h
+++ b/qt/scientific_interfaces/ISISReflectometry/QtReflBatchView.h
@@ -1,9 +1,10 @@
 #ifndef MANTID_ISISREFLECTOMETRY_QTREFLBATCHVIEW_H
 #define MANTID_ISISREFLECTOMETRY_QTREFLBATCHVIEW_H
 
-#include "MantidQtWidgets/Common/UserSubWindow.h"
-#include "IReflMainWindowView.h"
-#include "ui_ReflMainWindowWidget.h"
+#include "IReflBatchView.h"
+#include "IReflBatchPresenter.h"
+#include "ui_ReflBatchWidget.h"
+#include <memory>
 
 #include <QCloseEvent>
 
@@ -11,7 +12,6 @@ namespace MantidQt {
 namespace CustomInterfaces {
 
 class IReflEventTabPresenter;
-class IReflMainWindowPresenter;
 class IReflRunsTabPresenter;
 class IReflSettingsTabPresenter;
 class IReflSaveTabPresenter;
@@ -38,21 +38,19 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 File change history is stored at: <https://github.com/mantidproject/mantid>.
 Code Documentation is available at: <http://doxygen.mantidproject.org>
 */
-class QtReflBatchView : public IReflBatchView {
+class QtReflBatchView : public QWidget, public IReflBatchView {
   Q_OBJECT
 public:
   /// Constructor
   explicit QtReflBatchView(QWidget *parent = nullptr);
-  /// Destructor
-  ~QtReflBatchView() override;
 
-  QtReflRunsTabView& runsTab() const;
-  QtReflEventTabView& eventTab() const;
-  QtReflSaveTabView& saveTab() const;
-  QtReflSettingsTabView& settingsTab() const;
+//  QtReflRunsTabView& runsTab() const;
+//  QtReflEventTabView& eventTab() const;
+//  QtReflSaveTabView& saveTab() const;
+//  QtReflSettingsTabView& settingsTab() const;
 private:
   /// Initializes the interface
-  void initLayout() override;
+  void initLayout();
   /// Creates the 'Runs' tab
   std::unique_ptr<IReflRunsTabPresenter> createRunsTab();
   /// Creates the 'Event Handling' tab
@@ -63,7 +61,7 @@ private:
   std::unique_ptr<IReflSaveTabPresenter> createSaveTab();
 
   /// Interface definition with widgets for the main interface window
-  Ui::ReflBatchView m_ui;
+  Ui::ReflBatchWidget m_ui;
   /// The presenter handling this view
   std::unique_ptr<IReflBatchPresenter> m_presenter;
 };
diff --git a/qt/scientific_interfaces/ISISReflectometry/QtReflMainWindowView.cpp b/qt/scientific_interfaces/ISISReflectometry/QtReflMainWindowView.cpp
index 94be8272da79b868e69c0391a917e4abc045499c..89c8945d26436c79bf88ceeafca1490720ba592c 100644
--- a/qt/scientific_interfaces/ISISReflectometry/QtReflMainWindowView.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/QtReflMainWindowView.cpp
@@ -17,17 +17,9 @@ namespace CustomInterfaces {
 
 DECLARE_SUBWINDOW(QtReflMainWindowView)
 
-//----------------------------------------------------------------------------------------------
-/** Constructor
-*/
 QtReflMainWindowView::QtReflMainWindowView(QWidget *parent)
     : UserSubWindow(parent) {}
 
-//----------------------------------------------------------------------------------------------
-/** Destructor
-*/
-QtReflMainWindowView::~QtReflMainWindowView() {}
-
 /**
 Initialise the Interface
 */
@@ -36,110 +28,13 @@ void QtReflMainWindowView::initLayout() {
   connect(m_ui.helpButton, SIGNAL(clicked()), this, SLOT(helpPressed()));
 
   // Create the presenter
-  m_presenter = Mantid::Kernel::make_unique<ReflMainWindowPresenter>(
-      this, std::move(runsPresenter), eventPresenter, settingsPresenter,
-      std::move(savePresenter));
+  m_presenter = Mantid::Kernel::make_unique<ReflMainWindowPresenter>(this);
 }
 
 void QtReflMainWindowView::helpPressed() {
   m_presenter->notify(IReflMainWindowPresenter::Flag::HelpPressed);
 }
 
-int indexOfElseFirst(std::string const &instrument,
-                     std::vector<std::string> const &instruments) {
-  auto it = std::find(instruments.cbegin(), instruments.cend(), instrument);
-  if (it != instruments.cend())
-    return static_cast<int>(std::distance(instruments.cbegin(), it));
-  else
-    return 0;
-}
-
-int defaultInstrumentFromConfig(std::vector<std::string> const &instruments) {
-  return indexOfElseFirst(
-      Mantid::Kernel::ConfigService::Instance().getString("default.instrument"),
-      instruments);
-}
-
-/** Creates the 'Runs' tab and returns a pointer to its presenter
-* @return :: A pointer to the presenter managing the 'Runs' tab
-*/
-std::unique_ptr<IReflRunsTabPresenter> QtReflMainWindowView::createRunsTab() {
-  auto instruments = std::vector<std::string>(
-      {{"INTER", "SURF", "CRISP", "POLREF", "OFFSPEC"}});
-  auto defaultInstrumentIndex = defaultInstrumentFromConfig(instruments);
-
-  auto *runsTab = new QtReflRunsTabView(this, BatchViewFactory(instruments));
-  m_ui.mainTab->addTab(runsTab, QString("Runs"));
-  connect(runsTab, SIGNAL(runAsPythonScript(const QString &, bool)), this,
-          SIGNAL(runAsPythonScript(const QString &, bool)));
-
-  auto workspaceNamesFactory = WorkspaceNamesFactory(Slicing());
-  auto runsTabPresenter = Mantid::Kernel::make_unique<ReflRunsTabPresenter>(
-      runsTab, runsTab,
-      BatchPresenterFactory(instruments, 0.01, workspaceNamesFactory),
-      workspaceNamesFactory, 0.01, instruments, defaultInstrumentIndex);
-
-  return std::move(runsTabPresenter);
-}
-
-/** Creates the 'Event Handling' tab and returns a pointer to its presenter
-* @return :: A pointer to the presenter managing the 'Event Handling' tab
-*/
-IReflEventTabPresenter *QtReflMainWindowView::createEventTab() {
-
-  QtReflEventTabView *eventTab = new QtReflEventTabView(this);
-  m_ui.mainTab->addTab(eventTab, QString("Event Handling"));
-
-  return eventTab->getPresenter();
-}
-
-/** Creates the 'Settings' tab and returns a pointer to its presenter
-* @return :: A pointer to the presenter managing the 'Settings' tab
-*/
-IReflSettingsTabPresenter *QtReflMainWindowView::createSettingsTab() {
-
-  QtReflSettingsTabView *settingsTab = new QtReflSettingsTabView(this);
-  m_ui.mainTab->addTab(settingsTab, QString("Settings"));
-
-  return settingsTab->getPresenter();
-}
-
-/** Creates the 'Save ASCII' tab and returns a pointer to its presenter
-* @return :: A pointer to the presenter managing the 'Save ASCII' tab
-*/
-std::unique_ptr<IReflSaveTabPresenter> QtReflMainWindowView::createSaveTab() {
-  auto saveTabView = Mantid::Kernel::make_unique<QtReflSaveTabView>(this);
-  m_ui.mainTab->addTab(saveTabView.get(), QString("Save ASCII"));
-
-  auto saver = Mantid::Kernel::make_unique<ReflAsciiSaver>();
-  return Mantid::Kernel::make_unique<ReflSaveTabPresenter>(
-      std::move(saver), std::move(saveTabView));
-}
-
-/**
-Show an critical error dialog
-@param prompt : The prompt to appear on the dialog
-@param title : The text for the title bar of the dialog
-*/
-void QtReflMainWindowView::giveUserCritical(const std::string &prompt,
-                                            const std::string &title) {
-  QMessageBox::critical(this, QString::fromStdString(title),
-                        QString::fromStdString(prompt), QMessageBox::Ok,
-                        QMessageBox::Ok);
-}
-
-/**
-Show an information dialog
-@param prompt : The prompt to appear on the dialog
-@param title : The text for the title bar of the dialog
-*/
-void QtReflMainWindowView::giveUserInfo(const std::string &prompt,
-                                        const std::string &title) {
-  QMessageBox::information(this, QString::fromStdString(title),
-                           QString::fromStdString(prompt), QMessageBox::Ok,
-                           QMessageBox::Ok);
-}
-
 /**
 Runs python code
 * @param pythonCode : [input] The code to run
@@ -157,7 +52,6 @@ Handles attempt to close main window
 * @param event : [input] The close event
 */
 void QtReflMainWindowView::closeEvent(QCloseEvent *event) {
-
   // Close only if reduction has been paused
   if (!m_presenter->isProcessing()) {
     event->accept();
diff --git a/qt/scientific_interfaces/ISISReflectometry/QtReflMainWindowView.h b/qt/scientific_interfaces/ISISReflectometry/QtReflMainWindowView.h
index 777ecfd169ca35b8912f0d40a343c2ba2694c597..eff6f17b08fb787909a9e7a5060aa174036817b6 100644
--- a/qt/scientific_interfaces/ISISReflectometry/QtReflMainWindowView.h
+++ b/qt/scientific_interfaces/ISISReflectometry/QtReflMainWindowView.h
@@ -48,8 +48,6 @@ class QtReflMainWindowView : public MantidQt::API::UserSubWindow,
 public:
   /// Constructor
   explicit QtReflMainWindowView(QWidget *parent = nullptr);
-  /// Destructor
-  ~QtReflMainWindowView() override;
   /// Name of the interface
   static std::string name() { return "ISIS Reflectometry"; }
   /// This interface's categories.
diff --git a/qt/scientific_interfaces/ISISReflectometry/QtReflRunsTabView.cpp b/qt/scientific_interfaces/ISISReflectometry/QtReflRunsTabView.cpp
index 347174b107ef84b2bfe0147d76f5654ed3f328cb..370aa6c9bcef337f2286874932927e5c78642d8d 100644
--- a/qt/scientific_interfaces/ISISReflectometry/QtReflRunsTabView.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/QtReflRunsTabView.cpp
@@ -13,6 +13,7 @@
 #include "MantidQtWidgets/Common/HintingLineEditFactory.h"
 #include "MantidQtWidgets/Common/SlitCalculator.h"
 #include "Views/BatchView.h"
+#include <QMessageBox>
 
 namespace MantidQt {
 namespace CustomInterfaces {
@@ -32,6 +33,10 @@ QtReflRunsTabView::QtReflRunsTabView(QWidget *parent,
   UNUSED_ARG(parent);
   initLayout();
 }
+void QtReflRunsTabView::loginFailed(std::string const &fullError) {
+  QMessageBox::critical(this, QString::fromStdString(fullError),
+                        "Login Failed!");
+}
 
 void QtReflRunsTabView::subscribe(IReflRunsTabPresenter *presenter) {
   m_presenter = presenter;
@@ -96,6 +101,17 @@ void QtReflRunsTabView::initLayout() {
   //        SLOT(instrumentChanged(int)));
 }
 
+void QtReflRunsTabView::noActiveICatSessions() {
+  QMessageBox::information(
+      this, "Login Failed",
+      "Error Logging in: Please press 'Search' to try again.");
+}
+
+void QtReflRunsTabView::missingRunsToTransfer() {
+  QMessageBox::critical(this, "No runs selected",
+                        "Error: Please select at least one run to transfer.");
+}
+
 /**
 * Add a command (action) to a menu
 * @param menu : [input] The menu where actions will be added
diff --git a/qt/scientific_interfaces/ISISReflectometry/QtReflRunsTabView.h b/qt/scientific_interfaces/ISISReflectometry/QtReflRunsTabView.h
index 3e254afffc06d2811eec2a8e7790de53e6426040..5d7168213e4c1953a629389322841d368cc29bc6 100644
--- a/qt/scientific_interfaces/ISISReflectometry/QtReflRunsTabView.h
+++ b/qt/scientific_interfaces/ISISReflectometry/QtReflRunsTabView.h
@@ -94,6 +94,7 @@ public:
   void setProgressRange(int min, int max) override;
   void setProgress(int progress) override;
   void clearProgress() override;
+  void loginFailed(std::string const& fullError) override;
 
   // Accessor methods
   std::set<int> getSelectedSearchRows() const override;
@@ -113,6 +114,9 @@ public:
   // Start an ICAT search
   void startIcatSearch() override;
 
+   void noActiveICatSessions() override;
+   void missingRunsToTransfer() override;
+
 private:
   /// initialise the interface
   void initLayout();
diff --git a/qt/scientific_interfaces/ISISReflectometry/QtReflSaveTabView.cpp b/qt/scientific_interfaces/ISISReflectometry/QtReflSaveTabView.cpp
index 7cb6ab7fa7672b1f4940226dfd8bee684dafd502..ab771643d1183b4cb52937dbad8b77a773b8466d 100644
--- a/qt/scientific_interfaces/ISISReflectometry/QtReflSaveTabView.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/QtReflSaveTabView.cpp
@@ -247,28 +247,44 @@ void QtReflSaveTabView::suggestSaveDir() const {
   m_presenter->notify(IReflSaveTabPresenter::suggestSaveDirFlag);
 }
 
-/**
-Show an critical error dialog
-@param prompt : The prompt to appear on the dialog
-@param title : The text for the title bar of the dialog
-*/
-void QtReflSaveTabView::giveUserCritical(const std::string &prompt,
-                                         const std::string &title) {
+void QtReflSaveTabView::error(const std::string &title,
+                              const std::string &prompt) {
   QMessageBox::critical(this, QString::fromStdString(title),
-                        QString::fromStdString(prompt), QMessageBox::Ok,
-                        QMessageBox::Ok);
+                        QString::fromStdString(prompt));
 }
 
-/**
-Show an information dialog
-@param prompt : The prompt to appear on the dialog
-@param title : The text for the title bar of the dialog
-*/
-void QtReflSaveTabView::giveUserInfo(const std::string &prompt,
-                                     const std::string &title) {
-  QMessageBox::information(this, QString::fromStdString(title),
-                           QString::fromStdString(prompt), QMessageBox::Ok,
-                           QMessageBox::Ok);
+void QtReflSaveTabView::warning(const std::string &title,
+                                const std::string &prompt) {
+  QMessageBox::critical(this, QString::fromStdString(title),
+                        QString::fromStdString(prompt));
+}
+
+void QtReflSaveTabView::invalidRegex() {
+  error("Invalid Regex", "Error, invalid regular expression.");
+}
+
+void QtReflSaveTabView::errorInvalidSaveDirectory() {
+  error("Invalid directory", "The save path specified doesn't exist or is "
+                             "not writable.");
+}
+
+void QtReflSaveTabView::warnInvalidSaveDirectory() {
+  warning("Invalid directory",
+          "You just changed the save path to a directory which "
+          "doesn't exist or is not writable.");
+}
+
+void QtReflSaveTabView::noWorkspacesSelected() {
+  error("No workspaces selected.",
+        "You must select the workspaces in order to save.");
+}
+
+void QtReflSaveTabView::cannotSaveWorkspaces() {
+  error("Error", "Unknown error while saving workspaces");
+}
+
+void QtReflSaveTabView::cannotSaveWorkspaces(std::string const &fullError) {
+  error("Error", fullError);
 }
 } // namespace CustomInterfaces
 } // namespace Mantid
diff --git a/qt/scientific_interfaces/ISISReflectometry/QtReflSaveTabView.h b/qt/scientific_interfaces/ISISReflectometry/QtReflSaveTabView.h
index 353f893f0e72863277b544aa7fda51716501e243..187c4c54bf4ee8bb77a7b396bd192fba8b1cff3c 100644
--- a/qt/scientific_interfaces/ISISReflectometry/QtReflSaveTabView.h
+++ b/qt/scientific_interfaces/ISISReflectometry/QtReflSaveTabView.h
@@ -89,10 +89,15 @@ public:
   void enableFileFormatAndLocationControls() override;
   void disableFileFormatAndLocationControls() override;
 
-  void giveUserCritical(const std::string &prompt,
-                        const std::string &title) override;
-  void giveUserInfo(const std::string &prompt,
-                    const std::string &title) override;
+  void error(const std::string &title, const std::string &prompt);
+  void warning(const std::string &title, const std::string &prompt);
+
+  void invalidRegex() override;
+  void errorInvalidSaveDirectory() override;
+  void warnInvalidSaveDirectory() override;
+  void noWorkspacesSelected() override;
+  void cannotSaveWorkspaces() override;
+  void cannotSaveWorkspaces(std::string const &fullError) override;
 
 public slots:
   /// Populate the 'List of workspaces' widget
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflBatchPresenter.cpp b/qt/scientific_interfaces/ISISReflectometry/ReflBatchPresenter.cpp
index 02d2a1779dab690fc7fb13769cab2e28e4518835..550eac8f57e5863aff13ef566dd7f08582fa2481 100644
--- a/qt/scientific_interfaces/ISISReflectometry/ReflBatchPresenter.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflBatchPresenter.cpp
@@ -65,12 +65,6 @@ void ReflBatchPresenter::notifyReductionResumed(int group) {
   m_eventPresenter->onReductionResumed(group);
 }
 
-
-void ReflBatchPresenter::showHelp() {
-  MantidQt::API::HelpWindow::showCustomInterface(nullptr,
-                                                 QString("ISIS Reflectometry"));
-}
-
 void ReflBatchPresenter::settingsChanged(int group) {
   m_runsPresenter->settingsChanged(group);
 }
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflBatchWidget.ui b/qt/scientific_interfaces/ISISReflectometry/ReflBatchWidget.ui
index 0972c11640992b0ece213eaaf91688be0fbc712e..40ac045a64112cea119ab0bb3022eb1b60f5e1ae 100644
--- a/qt/scientific_interfaces/ISISReflectometry/ReflBatchWidget.ui
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflBatchWidget.ui
@@ -1,50 +1,20 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
  <class>ReflBatchWidget</class>
- <widget class="QMainWindow" name="ReflBatchWidget">
+ <widget class="QWidget" name="ReflBatchWidget">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>975</width>
-    <height>515</height>
+    <width>157</width>
+    <height>56</height>
    </rect>
   </property>
-  <property name="windowTitle">
-   <string>ISIS Reflectometry</string>
-  </property>
-  <widget class="QWidget" name="centralwidget">
-   <layout class="QVBoxLayout" name="verticalLayout">
-    <item>
-     <widget class="QTabWidget" name="mainTab"/>
-    </item>
-    <item>
-     <widget class="QPushButton" name="helpButton">
-      <property name="sizePolicy">
-       <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
-        <horstretch>0</horstretch>
-        <verstretch>0</verstretch>
-       </sizepolicy>
-      </property>
-      <property name="minimumSize">
-       <size>
-        <width>30</width>
-        <height>30</height>
-       </size>
-      </property>
-      <property name="maximumSize">
-       <size>
-        <width>30</width>
-        <height>30</height>
-       </size>
-      </property>
-      <property name="text">
-       <string>?</string>
-      </property>
-     </widget>
-    </item>
-   </layout>
-  </widget>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QTabWidget" name="batchTabs"/>
+   </item>
+  </layout>
  </widget>
  <resources/>
  <connections/>
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflEventTabPresenter.cpp b/qt/scientific_interfaces/ISISReflectometry/ReflEventTabPresenter.cpp
index 2a6ad5acb0ebd0447fc2837b7fe8148d914e40a6..012f298b422f2cf2e49464d794bdfc5d81bbf4f5 100644
--- a/qt/scientific_interfaces/ISISReflectometry/ReflEventTabPresenter.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflEventTabPresenter.cpp
@@ -1,5 +1,5 @@
 #include "ReflEventTabPresenter.h"
-#include "IReflMainWindowPresenter.h"
+#include "IReflBatchPresenter.h"
 #include "ReflEventPresenter.h"
 
 namespace MantidQt {
@@ -27,7 +27,7 @@ void ReflEventTabPresenter::passSelfToChildren(
 ReflEventTabPresenter::~ReflEventTabPresenter() {}
 
 void ReflEventTabPresenter::acceptMainPresenter(
-    IReflMainWindowPresenter *mainPresenter) {
+    IReflBatchPresenter *mainPresenter) {
   m_mainPresenter = mainPresenter;
 }
 
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflEventTabPresenter.h b/qt/scientific_interfaces/ISISReflectometry/ReflEventTabPresenter.h
index c989db051bbc09e90f2bb911858dabab14dc0257..8a633360407c3ecbbcda7aee633be008a78a6212 100644
--- a/qt/scientific_interfaces/ISISReflectometry/ReflEventTabPresenter.h
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflEventTabPresenter.h
@@ -3,13 +3,13 @@
 
 #include "DllConfig.h"
 #include "IReflEventTabPresenter.h"
+#include "IReflBatchPresenter.h"
 #include <vector>
 
 namespace MantidQt {
 namespace CustomInterfaces {
 
 // Forward decs
-class IReflMainWindowPresenter;
 class IReflEventPresenter;
 
 /** @class ReflEventTabPresenter
@@ -51,7 +51,7 @@ public:
   /// Return time-slicing type
   std::string getTimeSlicingType(int group) const override;
 
-  void acceptMainPresenter(IReflMainWindowPresenter *mainPresenter) override;
+  void acceptMainPresenter(IReflBatchPresenter *mainPresenter) override;
   void settingsChanged(int group) override;
   void onReductionResumed(int group) override;
   void onReductionPaused(int group) override;
@@ -60,7 +60,7 @@ public:
 private:
   /// The presenters for each group as a vector
   std::vector<IReflEventPresenter *> m_eventPresenters;
-  IReflMainWindowPresenter *m_mainPresenter;
+  IReflBatchPresenter *m_mainPresenter;
 };
 }
 }
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflMainWindowPresenter.cpp b/qt/scientific_interfaces/ISISReflectometry/ReflMainWindowPresenter.cpp
index bfc48763444c41a9bb71da11506ca4b0a59efbcb..7354477c39c07a59e3492e38032e4e180089764d 100644
--- a/qt/scientific_interfaces/ISISReflectometry/ReflMainWindowPresenter.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflMainWindowPresenter.cpp
@@ -36,6 +36,11 @@ void ReflMainWindowPresenter::notify(IReflMainWindowPresenter::Flag flag) {
   // a flag we aren't handling.
 }
 
+bool ReflMainWindowPresenter::isProcessing() const {
+  // TODO Implement this once you have ownership of child presenters.
+  return false;
+}
+
 void ReflMainWindowPresenter::showHelp() {
   MantidQt::API::HelpWindow::showCustomInterface(nullptr,
                                                  QString("ISIS Reflectometry"));
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflMainWindowPresenter.h b/qt/scientific_interfaces/ISISReflectometry/ReflMainWindowPresenter.h
index 7a494f3d5de9c2595944244d471c814d89c1be59..f73ee1b4dd7e0d298a4543c35e677b0d7ad29b28 100644
--- a/qt/scientific_interfaces/ISISReflectometry/ReflMainWindowPresenter.h
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflMainWindowPresenter.h
@@ -44,12 +44,14 @@ class MANTIDQT_ISISREFLECTOMETRY_DLL ReflMainWindowPresenter
     : public IReflMainWindowPresenter {
 public:
   /// Constructor
-  ReflMainWindowPresenter(IReflMainWindowView *view)
+  ReflMainWindowPresenter(IReflMainWindowView *view);
   /// Run a python algorithm
   std::string runPythonAlgorithm(const std::string &pythonCode) override;
+  bool isProcessing() const override;
 private:
+  void showHelp();
   IReflMainWindowView* m_view;
-  void notify(IReflMainWIndowPresenter::Flag flag) override;
+  void notify(IReflMainWindowPresenter::Flag flag) override;
 };
 }
 }
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflMainWindowWidget.ui b/qt/scientific_interfaces/ISISReflectometry/ReflMainWindowWidget.ui
index 27ccd181ebddbeb6d706b0865976ff7cda4e3337..1348f6760b2077ec6c42c1b13afbc62ac3d4517b 100644
--- a/qt/scientific_interfaces/ISISReflectometry/ReflMainWindowWidget.ui
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflMainWindowWidget.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>RelMainWindowWidget</class>
- <widget class="QMainWindow" name="RelMainWindowWidget">
+ <class>ReflMainWindowWidget</class>
+ <widget class="QMainWindow" name="ReflMainWindowWidget">
   <property name="geometry">
    <rect>
     <x>0</x>
@@ -16,7 +16,11 @@
   <widget class="QWidget" name="centralwidget">
    <layout class="QVBoxLayout" name="verticalLayout">
     <item>
-     <widget class="QTabWidget" name="mainTab"/>
+     <widget class="QTabWidget" name="mainTab">
+      <property name="tabPosition">
+       <enum>QTabWidget::West</enum>
+      </property>
+     </widget>
     </item>
     <item>
      <widget class="QPushButton" name="helpButton">
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflRunsTabPresenter.cpp b/qt/scientific_interfaces/ISISReflectometry/ReflRunsTabPresenter.cpp
index 5c6f2e1710a8030405791e7dd7a18d44a798e91b..47322e7e6a005ffeded88a3ce4beb07c73df2c5b 100644
--- a/qt/scientific_interfaces/ISISReflectometry/ReflRunsTabPresenter.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflRunsTabPresenter.cpp
@@ -86,7 +86,7 @@ ReflRunsTabPresenter::ReflRunsTabPresenter(
 * @param mainPresenter :: [input] A main presenter
 */
 void ReflRunsTabPresenter::acceptMainPresenter(
-    IReflMainWindowPresenter *mainPresenter) {
+    IReflBatchPresenter *mainPresenter) {
   m_mainPresenter = mainPresenter;
   // Register this presenter as the workspace receiver
   // When doing so, the inner presenters will notify this
@@ -194,15 +194,14 @@ bool ReflRunsTabPresenter::search() {
   // If we're not logged into a catalog, prompt the user to do so
   if (CatalogManager::Instance().getActiveSessions().empty()) {
     try {
-      std::stringstream pythonSrc;
-      pythonSrc << "try:\n";
-      pythonSrc << "  algm = CatalogLoginDialog()\n";
-      pythonSrc << "except:\n";
-      pythonSrc << "  pass\n";
-      m_mainPresenter->runPythonAlgorithm(pythonSrc.str());
+      //std::stringstream pythonSrc;
+      //pythonSrc << "try:\n";
+      //pythonSrc << "  algm = CatalogLoginDialog()\n";
+      //pythonSrc << "except:\n";
+      //pythonSrc << "  pass\n";
+      //m_mainPresenter->runPythonAlgorithm(pythonSrc.str());
     } catch (std::runtime_error &e) {
-      m_mainPresenter->giveUserCritical(
-          "Error Logging in:\n" + std::string(e.what()), "login failed");
+      m_view->loginFailed(e.what());
       return false;
     }
   }
@@ -214,9 +213,7 @@ bool ReflRunsTabPresenter::search() {
         CatalogManager::Instance().getActiveSessions().front()->getSessionId();
   } else {
     // there are no active sessions, we return here to avoid an exception
-    m_mainPresenter->giveUserInfo(
-        "Error Logging in: Please press 'Search' to try again.",
-        "Login Failed");
+    m_view->noActiveICatSessions();
     return false;
   }
   auto algSearch = AlgorithmManager::Instance().create("CatalogGetDataFiles");
@@ -399,9 +396,7 @@ bool ReflRunsTabPresenter::validateRowsToTransfer(
     const std::set<int> &rowsToTransfer) {
   // Check that we have something to transfer
   if (rowsToTransfer.size() == 0) {
-    m_mainPresenter->giveUserCritical(
-        "Error: Please select at least one run to transfer.",
-        "No runs selected");
+    m_view->missingRunsToTransfer();
     return false;
   }
   return true;
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflRunsTabPresenter.h b/qt/scientific_interfaces/ISISReflectometry/ReflRunsTabPresenter.h
index ffe06f31cad519ad6d0108625b8ee5e0ef0bbeed..5205fb2b99cd02ff88ee2123fbc75eda90a0337e 100644
--- a/qt/scientific_interfaces/ISISReflectometry/ReflRunsTabPresenter.h
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflRunsTabPresenter.h
@@ -3,6 +3,7 @@
 
 #include "DllConfig.h"
 #include "IReflRunsTabPresenter.h"
+#include "IReflBatchPresenter.h"
 #include "Presenters/BatchPresenter.h"
 #include "MantidAPI/IAlgorithm.h"
 #include "MantidQtWidgets/Common/DataProcessorUI/DataProcessorMainPresenter.h"
@@ -27,7 +28,6 @@ class DataProcessorPresenter;
 namespace CustomInterfaces {
 
 // Forward decs
-class IReflMainWindowPresenter;
 class IReflRunsTabView;
 class IReflSearcher;
 class ReflSearchModel;
@@ -82,7 +82,7 @@ public:
                        boost::shared_ptr<IReflSearcher> searcher =
                            boost::shared_ptr<IReflSearcher>());
 
-  void acceptMainPresenter(IReflMainWindowPresenter *mainPresenter) override;
+  void acceptMainPresenter(IReflBatchPresenter *mainPresenter) override;
   void notify(IReflRunsTabPresenter::Flag flag) override;
   void notifyADSChanged(const QSet<QString> &workspaceList, int group) override;
   /// Handle data reduction paused/resumed
@@ -112,6 +112,7 @@ public:
       MantidWidgets::DataProcessor::GroupData const &group,
       std::string const &workspaceNames) override;
 
+
 protected:
   /// Information about the autoreduction process
   ReflAutoreduction m_autoreduction;
@@ -131,7 +132,7 @@ private:
   /// The data processor presenters stored in a vector
   std::vector<std::unique_ptr<BatchPresenter>> m_tablePresenters;
   /// The main presenter
-  IReflMainWindowPresenter *m_mainPresenter;
+  IReflBatchPresenter *m_mainPresenter;
   /// The search implementation
   boost::shared_ptr<IReflSearcher> m_searcher;
   /// The current search string used for autoreduction
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflSaveTabPresenter.cpp b/qt/scientific_interfaces/ISISReflectometry/ReflSaveTabPresenter.cpp
index 5cf538bcbd6f7ba9b6c1617988674e4934e13941..929764a56a5f3aad63eb38334f147eeafea37773 100644
--- a/qt/scientific_interfaces/ISISReflectometry/ReflSaveTabPresenter.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflSaveTabPresenter.cpp
@@ -39,7 +39,7 @@ ReflSaveTabPresenter::~ReflSaveTabPresenter() {}
 * @param mainPresenter :: [input] The main presenter
 */
 void ReflSaveTabPresenter::acceptMainPresenter(
-    IReflMainWindowPresenter *mainPresenter) {
+    IReflBatchPresenter *mainPresenter) {
   m_mainPresenter = mainPresenter;
 }
 
@@ -155,8 +155,7 @@ void ReflSaveTabPresenter::filterWorkspaceNames() {
           wsNames.begin(), wsNames.end(), validNames.begin(),
           [rgx](std::string s) { return boost::regex_search(s, rgx); });
     } catch (boost::regex_error &) {
-      m_mainPresenter->giveUserCritical("Error, invalid regular expression\n",
-                                        "Invalid regex");
+      m_view->invalidRegex();
     }
   } else {
     // Otherwise simply add names where the filter string is found in
@@ -192,26 +191,12 @@ bool ReflSaveTabPresenter::isValidSaveDirectory(std::string const &directory) {
   return m_saver->isValidSaveDirectory(directory);
 }
 
-void ReflSaveTabPresenter::error(std::string const &message,
-                                 std::string const &title) {
-  m_view->giveUserCritical(message, title);
-}
-
-void ReflSaveTabPresenter::warn(std::string const &message,
-                                std::string const &title) {
-  m_view->giveUserInfo(message, title);
-}
-
 void ReflSaveTabPresenter::warnInvalidSaveDirectory() {
-  warn("You just changed the save path to a directory which "
-       "doesn't exist or is not writable.",
-       "Invalid directory");
+  m_view->warnInvalidSaveDirectory();
 }
 
 void ReflSaveTabPresenter::errorInvalidSaveDirectory() {
-  error("The save path specified doesn't exist or is "
-        "not writable.",
-        "Invalid directory");
+  m_view->errorInvalidSaveDirectory();
 }
 
 NamedFormat ReflSaveTabPresenter::formatFromIndex(int formatIndex) const {
@@ -261,15 +246,14 @@ void ReflSaveTabPresenter::saveSelectedWorkspaces() {
   // Check that at least one workspace has been selected for saving
   auto workspaceNames = m_view->getSelectedWorkspaces();
   if (workspaceNames.empty()) {
-    error("No workspaces selected", "No workspaces selected. "
-                                    "You must select the workspaces to save.");
+    m_view->noWorkspacesSelected();
   } else {
     try {
       saveWorkspaces(workspaceNames);
     } catch (std::exception &e) {
-      error(e.what(), "Error");
+      m_view->cannotSaveWorkspaces(e.what());
     } catch (...) {
-      error("Unknown error while saving workspaces", "Error");
+      m_view->cannotSaveWorkspaces();
     }
   }
 }
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflSaveTabPresenter.h b/qt/scientific_interfaces/ISISReflectometry/ReflSaveTabPresenter.h
index 6e9f00ecc053e5dda9c0bda4cbe867250f42efb3..d18a0ba0e329ae4288bfd38f06cd16891e466fed 100644
--- a/qt/scientific_interfaces/ISISReflectometry/ReflSaveTabPresenter.h
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflSaveTabPresenter.h
@@ -52,7 +52,7 @@ public:
   /// Destructor
   ~ReflSaveTabPresenter() override;
   /// Accept a main presenter
-  void acceptMainPresenter(IReflMainWindowPresenter *mainPresenter) override;
+  void acceptMainPresenter(IReflBatchPresenter *mainPresenter) override;
   void notify(IReflSaveTabPresenter::Flag flag) override;
   void completedGroupReductionSuccessfully(
       MantidWidgets::DataProcessor::GroupData const &group,
@@ -96,7 +96,7 @@ private:
   std::unique_ptr<IReflSaveTabView> m_view;
   std::unique_ptr<IReflAsciiSaver> m_saver;
   /// The main presenter
-  IReflMainWindowPresenter *m_mainPresenter;
+  IReflBatchPresenter *m_mainPresenter;
   bool m_shouldAutosave;
 };
 }
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflSettingsTabPresenter.cpp b/qt/scientific_interfaces/ISISReflectometry/ReflSettingsTabPresenter.cpp
index 3bb1fa5bdd6be3004ec5e56bd286e5aaf7995c44..153c0d0a7fb071a633974fd373eb08743a39a9ef 100644
--- a/qt/scientific_interfaces/ISISReflectometry/ReflSettingsTabPresenter.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflSettingsTabPresenter.cpp
@@ -1,5 +1,4 @@
 #include "ReflSettingsTabPresenter.h"
-#include "IReflMainWindowPresenter.h"
 #include "ReflSettingsPresenter.h"
 #include "MantidQtWidgets/Common/AlgorithmHintStrategy.h"
 #include "MantidAPI/AlgorithmManager.h"
@@ -30,7 +29,7 @@ void ReflSettingsTabPresenter::passSelfToChildren(
 }
 
 void ReflSettingsTabPresenter::acceptMainPresenter(
-    IReflMainWindowPresenter *mainPresenter) {
+    IReflBatchPresenter *mainPresenter) {
   m_mainPresenter = mainPresenter;
 }
 
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflSettingsTabPresenter.h b/qt/scientific_interfaces/ISISReflectometry/ReflSettingsTabPresenter.h
index a92c5f0e877a5f5205a4b0318fccf993434abbe4..c44bc8b248d849b44f72bcbaf0556c01de6e52a5 100644
--- a/qt/scientific_interfaces/ISISReflectometry/ReflSettingsTabPresenter.h
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflSettingsTabPresenter.h
@@ -3,13 +3,13 @@
 
 #include "DllConfig.h"
 #include "IReflSettingsTabPresenter.h"
+#include "IReflBatchPresenter.h"
 #include <vector>
 
 namespace MantidQt {
 namespace CustomInterfaces {
 
 // Forward decs
-class IReflMainWindowPresenter;
 class IReflSettingsPresenter;
 
 /** @class ReflSettingsTabPresenter
@@ -47,7 +47,7 @@ public:
   ~ReflSettingsTabPresenter() override;
   /// Set the instrument name
   void setInstrumentName(const std::string &instName) override;
-  void acceptMainPresenter(IReflMainWindowPresenter *mainPresenter) override;
+  void acceptMainPresenter(IReflBatchPresenter *mainPresenter) override;
   void settingsChanged(int group) override;
   void onReductionPaused(int group) override;
   void onReductionResumed(int group) override;
@@ -71,7 +71,7 @@ public:
 private:
   /// The presenters for each group as a vector
   std::vector<IReflSettingsPresenter *> m_settingsPresenters;
-  IReflMainWindowPresenter *m_mainPresenter;
+  IReflBatchPresenter *m_mainPresenter;
 };
 }
 }