diff --git a/qt/scientific_interfaces/General/IReflSearcher.h b/qt/scientific_interfaces/General/IReflSearcher.h
index 71c7f9aac77ebfe9ec56224c321a7624c4b72c72..27437062bd56a58bc2b3c70b0c6f6ec26ec64b9c 100644
--- a/qt/scientific_interfaces/General/IReflSearcher.h
+++ b/qt/scientific_interfaces/General/IReflSearcher.h
@@ -3,7 +3,7 @@
 
 #include <string>
 
-#include "MantidQtCustomInterfaces/IReflPresenter.h"
+//#include "MantidQtCustomInterfaces/IReflPresenter.h"
 #include "MantidAPI/ITableWorkspace_fwd.h"
 
 namespace MantidQt {
diff --git a/qt/scientific_interfaces/ISISReflectometry/IReflBatchPresenter.h b/qt/scientific_interfaces/ISISReflectometry/IReflBatchPresenter.h
index 1bbe88bdcc16152e60b6fd23cc85f86025b77d40..32cbe77e86fb9a88a5e923eae54897cfdb11053e 100644
--- a/qt/scientific_interfaces/ISISReflectometry/IReflBatchPresenter.h
+++ b/qt/scientific_interfaces/ISISReflectometry/IReflBatchPresenter.h
@@ -76,6 +76,8 @@ public:
   /// Data processing check for a specific group
   virtual bool isProcessing(int group) const = 0;
 
+  virtual bool requestClose() const = 0;
+
   virtual void settingsChanged(int group) = 0;
 };
 }
diff --git a/qt/scientific_interfaces/ISISReflectometry/IReflBatchView.h b/qt/scientific_interfaces/ISISReflectometry/IReflBatchView.h
index 3981b850113c93436d771ea23cc99e9f943e73eb..af68a20ca04ac8b81149d278c4a3b9701361e74b 100644
--- a/qt/scientific_interfaces/ISISReflectometry/IReflBatchView.h
+++ b/qt/scientific_interfaces/ISISReflectometry/IReflBatchView.h
@@ -2,6 +2,10 @@
 #define MANTID_ISISREFLECTOMETRY_IREFLBATCHVIEW_H
 
 #include <string>
+#include "IReflRunsTabView.h"
+#include "IReflSettingsTabView.h"
+#include "IReflEventTabView.h"
+#include "IReflSaveTabView.h"
 
 namespace MantidQt {
 namespace CustomInterfaces {
@@ -36,6 +40,10 @@ Code Documentation is available at: <http://doxygen.mantidproject.org>
 */
 class IReflBatchView {
 public:
+  virtual IReflRunsTabView* runs() const = 0;
+  virtual IReflEventTabView* eventHandling() const = 0;
+  virtual IReflSettingsTabView* settings() const = 0;
+  virtual IReflSaveTabView* save() const = 0;
   virtual ~IReflBatchView() = default;
 };
 }
diff --git a/qt/scientific_interfaces/ISISReflectometry/IReflEventTabPresenter.h b/qt/scientific_interfaces/ISISReflectometry/IReflEventTabPresenter.h
index db1d61157a8796f33b810476f480c90cc0ef74a4..fac8801fa3081505be4d844374639eb8f348a28d 100644
--- a/qt/scientific_interfaces/ISISReflectometry/IReflEventTabPresenter.h
+++ b/qt/scientific_interfaces/ISISReflectometry/IReflEventTabPresenter.h
@@ -7,8 +7,6 @@
 namespace MantidQt {
 namespace CustomInterfaces {
 
-class IReflMainWindowPresenter;
-
 /** @class IReflEventTabPresenter
 
 IReflEventTabPresenter is an interface which defines the functions that need
@@ -37,7 +35,7 @@ Code Documentation is available at: <http://doxygen.mantidproject.org>
 */
 class IReflEventTabPresenter {
 public:
-  virtual ~IReflEventTabPresenter(){};
+  virtual ~IReflEventTabPresenter() = default;
   /// Time-slicing values
   virtual std::string getTimeSlicingValues(int group) const = 0;
   /// Time-slicing type
diff --git a/qt/scientific_interfaces/ISISReflectometry/IReflEventTabView.h b/qt/scientific_interfaces/ISISReflectometry/IReflEventTabView.h
new file mode 100644
index 0000000000000000000000000000000000000000..8fa82a3f4b14d2d3f59c08a9b6f0f0f57e094feb
--- /dev/null
+++ b/qt/scientific_interfaces/ISISReflectometry/IReflEventTabView.h
@@ -0,0 +1,42 @@
+#ifndef MANTID_ISISREFLECTOMETRY_IREFLEVENTTABVIEW_H
+#define MANTID_ISISREFLECTOMETRY_IREFLEVENTTABVIEW_H
+
+#include "DllConfig.h"
+
+namespace MantidQt {
+namespace CustomInterfaces {
+
+/** @class IReflEventTabView
+
+IReflSettingsView is the base view class for the Reflectometry settings. It
+contains no QT specific functionality as that should be handled by a subclass.
+
+Copyright &copy; 2011-16 ISIS Rutherford Appleton Laboratory, NScD Oak Ridge
+National Laboratory & European Spallation Source
+
+This file is part of Mantid.
+
+Mantid is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3 of the License, or
+(at your option) any later version.
+
+Mantid is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+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 DLLExport IReflEventTabView {
+public:
+  virtual ~IReflEventTabView() = default;
+};
+}
+}
+#endif /* MANTID_ISISREFLECTOMETRY_IREFLSETTINGSVIEW_H */
diff --git a/qt/scientific_interfaces/ISISReflectometry/IReflMainWindowPresenter.h b/qt/scientific_interfaces/ISISReflectometry/IReflMainWindowPresenter.h
index 685f0edf4eba08d4d36798b6fb9988b7e9906749..c168638811e96370436035159e765615064de3d4 100644
--- a/qt/scientific_interfaces/ISISReflectometry/IReflMainWindowPresenter.h
+++ b/qt/scientific_interfaces/ISISReflectometry/IReflMainWindowPresenter.h
@@ -3,7 +3,7 @@
 
 #include "MantidQtWidgets/Common/DataProcessorUI/OptionsQMap.h"
 #include "MantidQtWidgets/Common/DataProcessorUI/TreeData.h"
-
+#include "IReflMainWindowView.h"
 #include <string>
 
 namespace MantidQt {
@@ -36,17 +36,12 @@ 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 IReflMainWindowPresenter {
+class IReflMainWindowPresenter : public ReflMainWindowSubscriber {
 public:
-  /// Destructor
-  virtual ~IReflMainWindowPresenter(){};
-
-  enum class Flag { HelpPressed };
-
-  virtual void notify(Flag flag) = 0;
   virtual std::string runPythonAlgorithm(const std::string &pythonCode) = 0;
 //  virtual void setInstrumentName(const std::string &instName) const = 0;
   virtual bool isProcessing() const = 0;
+  virtual ~IReflMainWindowPresenter() = default;
 };
 }
 }
diff --git a/qt/scientific_interfaces/ISISReflectometry/IReflMainWindowView.h b/qt/scientific_interfaces/ISISReflectometry/IReflMainWindowView.h
index 176a7d8d7055b5508b3f9b96cca3ae09c220f1d4..c2b83dbd9fd3591e4938a1734ed2d55262966c6b 100644
--- a/qt/scientific_interfaces/ISISReflectometry/IReflMainWindowView.h
+++ b/qt/scientific_interfaces/ISISReflectometry/IReflMainWindowView.h
@@ -2,6 +2,8 @@
 #define MANTID_ISISREFLECTOMETRY_IREFLMAINWINDOWVIEW_H
 
 #include <string>
+#include <vector>
+#include "IReflBatchView.h"
 
 namespace MantidQt {
 namespace CustomInterfaces {
@@ -34,8 +36,20 @@ 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 ReflMainWindowSubscriber {
+public:
+  virtual void notifyHelpPressed() = 0;
+  virtual void notifyNewBatchRequested() = 0;
+  virtual void notifyCloseBatchRequested(int batchIndex) = 0;
+  virtual ~ReflMainWindowSubscriber() = default;
+};
+
 class IReflMainWindowView {
 public:
+  virtual void subscribe(ReflMainWindowSubscriber *notifyee) = 0;
+  virtual IReflBatchView *newBatch() = 0;
+  virtual void removeBatch(int index) = 0;
+  virtual std::vector<IReflBatchView *> batches() const = 0;
   virtual std::string runPythonAlgorithm(const std::string &pythonCode) = 0;
   virtual ~IReflMainWindowView() = default;
 };
diff --git a/qt/scientific_interfaces/ISISReflectometry/IReflRunsTabView.h b/qt/scientific_interfaces/ISISReflectometry/IReflRunsTabView.h
index e0acaeb903a98d1f7e8ce0f537b8f95a74b8a5bd..b97cab7f30a5b5648759401f0275fc4892e8d004 100644
--- a/qt/scientific_interfaces/ISISReflectometry/IReflRunsTabView.h
+++ b/qt/scientific_interfaces/ISISReflectometry/IReflRunsTabView.h
@@ -6,6 +6,7 @@
 #include <boost/shared_ptr.hpp>
 #include "Views/IBatchView.h"
 #include "DllConfig.h"
+#include "MantidQtWidgets/Common/ProgressableView.h"
 
 namespace MantidQt {
 
@@ -51,7 +52,7 @@ File change history is stored at: <https://github.com/mantidproject/mantid>.
 Code Documentation is available at: <http://doxygen.mantidproject.org>
 */
 
-class MANTIDQT_ISISREFLECTOMETRY_DLL IReflRunsTabView {
+class MANTIDQT_ISISREFLECTOMETRY_DLL IReflRunsTabView : public MantidQt::MantidWidgets::ProgressableView {
 public:
   virtual ~IReflRunsTabView() = default;
 
diff --git a/qt/scientific_interfaces/ISISReflectometry/IReflSaveTabView.h b/qt/scientific_interfaces/ISISReflectometry/IReflSaveTabView.h
index eddcce789c943c5e4ed8da25ec617ad66712a8ff..ae02ed1eb4c9e908cd7c0989db9dd8a36925d9a5 100644
--- a/qt/scientific_interfaces/ISISReflectometry/IReflSaveTabView.h
+++ b/qt/scientific_interfaces/ISISReflectometry/IReflSaveTabView.h
@@ -4,11 +4,11 @@
 #include "DllConfig.h"
 #include <string>
 #include <vector>
+#include "IReflSaveTabPresenter.h"
 
 namespace MantidQt {
 namespace CustomInterfaces {
 
-class IReflSaveTabPresenter;
 
 /** @class IReflSaveTabView
 
@@ -40,10 +40,7 @@ Code Documentation is available at: <http://doxygen.mantidproject.org>
 
 class MANTIDQT_ISISREFLECTOMETRY_DLL IReflSaveTabView {
 public:
-  /// Constructor
-  IReflSaveTabView(){};
-  /// Destructor
-  virtual ~IReflSaveTabView(){};
+  virtual ~IReflSaveTabView() = default;
   virtual void subscribe(IReflSaveTabPresenter *presenter) = 0;
 
   virtual std::string getSavePath() const = 0;
diff --git a/qt/scientific_interfaces/ISISReflectometry/IReflSettingsTabView.h b/qt/scientific_interfaces/ISISReflectometry/IReflSettingsTabView.h
new file mode 100644
index 0000000000000000000000000000000000000000..ba68ae0a985380f443b191b8e2ae9919532a88f3
--- /dev/null
+++ b/qt/scientific_interfaces/ISISReflectometry/IReflSettingsTabView.h
@@ -0,0 +1,44 @@
+#ifndef MANTID_ISISREFLECTOMETRY_IREFLSETTINGSTABVIEW_H
+#define MANTID_ISISREFLECTOMETRY_IREFLSETTINGSTABVIEW_H
+
+#include "DllConfig.h"
+#include "IReflSettingsTabPresenter.h"
+
+namespace MantidQt {
+namespace CustomInterfaces {
+
+/** @class IReflEventTabView
+
+IReflSettingsView is the base view class for the Reflectometry settings. It
+contains no QT specific functionality as that should be handled by a subclass.
+
+Copyright &copy; 2011-16 ISIS Rutherford Appleton Laboratory, NScD Oak Ridge
+National Laboratory & European Spallation Source
+
+This file is part of Mantid.
+
+Mantid is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3 of the License, or
+(at your option) any later version.
+
+Mantid is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+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 MANTIDQT_ISISREFLECTOMETRY_DLL IReflSettingsTabView {
+public:
+  virtual void subscribe(IReflSettingsTabPresenter* notifyee) = 0;
+  virtual ~IReflSettingsTabView() = default;
+};
+}
+}
+#endif /* MANTID_ISISREFLECTOMETRY_IREFLSETTINGSVIEW_H */
diff --git a/qt/scientific_interfaces/ISISReflectometry/IndexOf.h b/qt/scientific_interfaces/ISISReflectometry/IndexOf.h
index 1f7c35f5e5ffc7634cc96852363d4345460ce6e6..0ade32a499a985580d5d019bfbe6c196cc58cd4c 100644
--- a/qt/scientific_interfaces/ISISReflectometry/IndexOf.h
+++ b/qt/scientific_interfaces/ISISReflectometry/IndexOf.h
@@ -15,6 +15,7 @@ boost::optional<int> indexOf(Container const &container, Predicate pred) {
   else
     return boost::none;
 }
+
 }
 }
 #endif // MANTID_ISISREFLECTOMETRY_INDEXOF_H
diff --git a/qt/scientific_interfaces/ISISReflectometry/QtReflBatchView.cpp b/qt/scientific_interfaces/ISISReflectometry/QtReflBatchView.cpp
index 9f293ed154d788ade42d223d7b2a1e116f9349e7..d47be50003f761caa5ddeb782d9d34935c26bda2 100644
--- a/qt/scientific_interfaces/ISISReflectometry/QtReflBatchView.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/QtReflBatchView.cpp
@@ -15,101 +15,55 @@
 namespace MantidQt {
 namespace CustomInterfaces {
 
-//----------------------------------------------------------------------------------------------
-/** Constructor
-*/
 QtReflBatchView::QtReflBatchView(QWidget *parent) : QWidget(parent) {
   initLayout();
 }
 
-/**
-Initialise the Interface
-*/
 void QtReflBatchView::initLayout() {
   m_ui.setupUi(this);
 
-  // Create the tabs
-  auto runsPresenter = createRunsTab();
-  auto eventPresenter = createEventTab();
-  auto settingsPresenter = createSettingsTab();
-  auto savePresenter = createSaveTab();
+  m_runs = createRunsTab();
+  m_ui.batchTabs->addTab(m_runs.get(), "Runs");
 
-  // Create the presenter
-  m_presenter = Mantid::Kernel::make_unique<ReflBatchPresenter>(
-      this, std::move(runsPresenter), eventPresenter, settingsPresenter,
-      std::move(savePresenter));
-}
+  m_eventHandling = createEventTab();
+  m_ui.batchTabs->addTab(m_eventHandling.get(), "Event Handling");
 
-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;
-}
+  m_settings = createSettingsTab();
+  m_ui.batchTabs->addTab(m_settings.get(), "Settings");
 
-int defaultInstrumentFromConfig(std::vector<std::string> const &instruments) {
-  return indexOfElseFirst(
-      Mantid::Kernel::ConfigService::Instance().getString("default.instrument"),
-      instruments);
+  m_save = createSaveTab();
+  m_ui.batchTabs->addTab(m_settings.get(), "Save ASCII");
 }
 
-/** 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> QtReflBatchView::createRunsTab() {
-  auto instruments = std::vector<std::string>(
-      {{"INTER", "SURF", "CRISP", "POLREF", "OFFSPEC"}});
-  auto defaultInstrumentIndex = defaultInstrumentFromConfig(instruments);
+IReflRunsTabView *QtReflBatchView::runs() const { return m_runs.get(); }
 
-  auto *runsTab = new QtReflRunsTabView(this, BatchViewFactory(instruments));
-  m_ui.batchTabs->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);
+IReflEventTabView *QtReflBatchView::eventHandling() const {
+  return m_eventHandling.get();
 }
 
-/** Creates the 'Event Handling' tab and returns a pointer to its presenter
-* @return :: A pointer to the presenter managing the 'Event Handling' tab
-*/
-IReflEventTabPresenter *QtReflBatchView::createEventTab() {
-
-  QtReflEventTabView *eventTab = new QtReflEventTabView(this);
-  m_ui.batchTabs->addTab(eventTab, QString("Event Handling"));
-
-  return eventTab->getPresenter();
+IReflSettingsTabView *QtReflBatchView::settings() const {
+  return m_settings.get();
 }
 
-/** Creates the 'Settings' tab and returns a pointer to its presenter
-* @return :: A pointer to the presenter managing the 'Settings' tab
-*/
-IReflSettingsTabPresenter *QtReflBatchView::createSettingsTab() {
-
-  QtReflSettingsTabView *settingsTab = new QtReflSettingsTabView(this);
-  m_ui.batchTabs->addTab(settingsTab, QString("Settings"));
+IReflSaveTabView *QtReflBatchView::save() const { return m_save.get(); }
 
-  return settingsTab->getPresenter();
+std::unique_ptr<QtReflRunsTabView> QtReflBatchView::createRunsTab() {
+  auto instruments = std::vector<std::string>(
+      {{"INTER", "SURF", "CRISP", "POLREF", "OFFSPEC"}});
+  return Mantid::Kernel::make_unique<QtReflRunsTabView>(
+      this, BatchViewFactory(instruments));
 }
 
-/** 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> QtReflBatchView::createSaveTab() {
-  auto saveTabView = Mantid::Kernel::make_unique<QtReflSaveTabView>(this);
-  m_ui.batchTabs->addTab(saveTabView.get(), QString("Save ASCII"));
+std::unique_ptr<QtReflEventTabView> QtReflBatchView::createEventTab() {
+  return Mantid::Kernel::make_unique<QtReflEventTabView>(this);
+}
 
-  auto saver = Mantid::Kernel::make_unique<ReflAsciiSaver>();
-  return Mantid::Kernel::make_unique<ReflSaveTabPresenter>(
-      std::move(saver), std::move(saveTabView));
+std::unique_ptr<QtReflSettingsTabView> QtReflBatchView::createSettingsTab() {
+  return Mantid::Kernel::make_unique<QtReflSettingsTabView>(this);
 }
 
+std::unique_ptr<QtReflSaveTabView> QtReflBatchView::createSaveTab() {
+  return Mantid::Kernel::make_unique<QtReflSaveTabView>(this);
+}
 }
 }
diff --git a/qt/scientific_interfaces/ISISReflectometry/QtReflBatchView.h b/qt/scientific_interfaces/ISISReflectometry/QtReflBatchView.h
index a4549e30d9b0664fa571bf7791362f67ad0c51e0..7ed9951b1315ef41836644bf06bebee0ca794f41 100644
--- a/qt/scientific_interfaces/ISISReflectometry/QtReflBatchView.h
+++ b/qt/scientific_interfaces/ISISReflectometry/QtReflBatchView.h
@@ -5,17 +5,16 @@
 #include "IReflBatchPresenter.h"
 #include "ui_ReflBatchWidget.h"
 #include <memory>
+#include "QtReflSaveTabView.h"
+#include "QtReflEventTabView.h"
+#include "QtReflSettingsTabView.h"
+#include "QtReflRunsTabView.h"
 
 #include <QCloseEvent>
 
 namespace MantidQt {
 namespace CustomInterfaces {
 
-class IReflEventTabPresenter;
-class IReflRunsTabPresenter;
-class IReflSettingsTabPresenter;
-class IReflSaveTabPresenter;
-
 /**
 Copyright &copy; 2016 ISIS Rutherford Appleton Laboratory, NScD Oak Ridge
 National Laboratory & European Spallation Source
@@ -41,29 +40,27 @@ Code Documentation is available at: <http://doxygen.mantidproject.org>
 class QtReflBatchView : public QWidget, public IReflBatchView {
   Q_OBJECT
 public:
-  /// Constructor
   explicit QtReflBatchView(QWidget *parent = nullptr);
+  void subscribe(IReflBatchPresenter *notifyee);
+
+  IReflRunsTabView *runs() const override;
+  IReflEventTabView *eventHandling() const override;
+  IReflSettingsTabView *settings() const override;
+  IReflSaveTabView *save() const override;
 
-//  QtReflRunsTabView& runsTab() const;
-//  QtReflEventTabView& eventTab() const;
-//  QtReflSaveTabView& saveTab() const;
-//  QtReflSettingsTabView& settingsTab() const;
 private:
-  /// Initializes the interface
   void initLayout();
-  /// Creates the 'Runs' tab
-  std::unique_ptr<IReflRunsTabPresenter> createRunsTab();
-  /// Creates the 'Event Handling' tab
-  IReflEventTabPresenter *createEventTab();
-  /// Creates the 'Settings' tab
-  IReflSettingsTabPresenter *createSettingsTab();
-  /// Creates the 'Save ASCII' tab
-  std::unique_ptr<IReflSaveTabPresenter> createSaveTab();
+  std::unique_ptr<QtReflRunsTabView> createRunsTab();
+  std::unique_ptr<QtReflEventTabView> createEventTab();
+  std::unique_ptr<QtReflSettingsTabView> createSettingsTab();
+  std::unique_ptr<QtReflSaveTabView> createSaveTab();
 
-  /// Interface definition with widgets for the main interface window
   Ui::ReflBatchWidget m_ui;
-  /// The presenter handling this view
-  std::unique_ptr<IReflBatchPresenter> m_presenter;
+  IReflBatchPresenter *m_notifyee;
+  std::unique_ptr<QtReflRunsTabView> m_runs;
+  std::unique_ptr<QtReflEventTabView> m_eventHandling;
+  std::unique_ptr<QtReflSettingsTabView> m_settings;
+  std::unique_ptr<QtReflSaveTabView> m_save;
 };
 }
 }
diff --git a/qt/scientific_interfaces/ISISReflectometry/QtReflEventTabView.cpp b/qt/scientific_interfaces/ISISReflectometry/QtReflEventTabView.cpp
index 03419711922604964c882101ddbcc79a08b2299c..307f7dfcd1563c05b4f6a143e4a0454cbd28d6db 100644
--- a/qt/scientific_interfaces/ISISReflectometry/QtReflEventTabView.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/QtReflEventTabView.cpp
@@ -10,15 +10,13 @@ namespace CustomInterfaces {
 * @param parent :: [input] The parent of this widget
 */
 QtReflEventTabView::QtReflEventTabView(QWidget *parent) {
-
   UNUSED_ARG(parent);
   initLayout();
 }
 
-//----------------------------------------------------------------------------------------------
-/** Destructor
-*/
-QtReflEventTabView::~QtReflEventTabView() {}
+void QtReflEventTabView::subscribe(IReflEventTabPresenter* notifyee) {
+  m_notifyee = notifyee;
+}
 
 /**
 Initialise the interface
@@ -35,16 +33,6 @@ void QtReflEventTabView::initLayout() {
   std::vector<IReflEventPresenter *> presenters;
   presenters.push_back(event_1->getPresenter());
   presenters.push_back(event_2->getPresenter());
-
-  m_presenter.reset(new ReflEventTabPresenter(presenters));
-}
-
-/** Returns the presenter managing this view
-* @return :: A pointer to the presenter
-*/
-IReflEventTabPresenter *QtReflEventTabView::getPresenter() const {
-
-  return m_presenter.get();
 }
 
 } // namespace CustomInterfaces
diff --git a/qt/scientific_interfaces/ISISReflectometry/QtReflEventTabView.h b/qt/scientific_interfaces/ISISReflectometry/QtReflEventTabView.h
index 6a9be8251e0a569baddccc53477d7160cb2346b6..8292aa2efe751b9f954dd4a4caaedf22d2267b7d 100644
--- a/qt/scientific_interfaces/ISISReflectometry/QtReflEventTabView.h
+++ b/qt/scientific_interfaces/ISISReflectometry/QtReflEventTabView.h
@@ -3,14 +3,13 @@
 
 #include "DllConfig.h"
 #include "ui_ReflEventTabWidget.h"
+#include "IReflEventTabView.h"
+#include "IReflEventTabPresenter.h"
 #include <memory>
 
 namespace MantidQt {
 namespace CustomInterfaces {
 
-// Forward decs
-class IReflEventTabPresenter;
-
 /** QtReflEventTabView : Provides an interface for the "Event" tab in the
 Reflectometry interface.
 
@@ -35,24 +34,16 @@ 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 MANTIDQT_ISISREFLECTOMETRY_DLL QtReflEventTabView : public QWidget {
+class MANTIDQT_ISISREFLECTOMETRY_DLL QtReflEventTabView : public QWidget, public IReflEventTabView {
   Q_OBJECT
 public:
-  /// Constructor
   QtReflEventTabView(QWidget *parent = nullptr);
-  /// Destructor
-  ~QtReflEventTabView() override;
-  /// Returns the presenter managing this view
-  IReflEventTabPresenter *getPresenter() const;
+  void subscribe(IReflEventTabPresenter* notifyee);
 
 private:
-  /// Initialise the interface
   void initLayout();
-
-  /// The widget
   Ui::ReflEventTabWidget m_ui;
-  /// The presenter
-  std::unique_ptr<IReflEventTabPresenter> m_presenter;
+  IReflEventTabPresenter* m_notifyee;
 };
 
 } // namespace Mantid
diff --git a/qt/scientific_interfaces/ISISReflectometry/QtReflMainWindowView.cpp b/qt/scientific_interfaces/ISISReflectometry/QtReflMainWindowView.cpp
index 89c8945d26436c79bf88ceeafca1490720ba592c..4cc721461a3c93128870670e6c997773eb2fde0b 100644
--- a/qt/scientific_interfaces/ISISReflectometry/QtReflMainWindowView.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/QtReflMainWindowView.cpp
@@ -1,16 +1,10 @@
 #include "QtReflMainWindowView.h"
-#include "QtReflEventTabView.h"
-#include "QtReflRunsTabView.h"
-#include "QtReflSaveTabView.h"
-#include "QtReflSettingsTabView.h"
-#include "ReflSaveTabPresenter.h"
-#include "ReflMainWindowPresenter.h"
-#include "ReflAsciiSaver.h"
 #include "MantidKernel/make_unique.h"
-#include "Presenters/BatchPresenter.h"
-#include "ReflRunsTabPresenter.h"
+#include "QtReflBatchView.h"
+#include "Reduction/Slicing.h"
 
 #include <QMessageBox>
+#include <QToolButton>
 
 namespace MantidQt {
 namespace CustomInterfaces {
@@ -20,21 +14,73 @@ DECLARE_SUBWINDOW(QtReflMainWindowView)
 QtReflMainWindowView::QtReflMainWindowView(QWidget *parent)
     : UserSubWindow(parent) {}
 
+IReflBatchView *QtReflMainWindowView::newBatch() {
+  auto index = m_ui.mainTabs->count();
+  auto *newTab = new QtReflBatchView(this);
+  m_ui.mainTabs->addTab(newTab, QString("Batch ") + QString::number(index));
+  m_batchViews.emplace_back(newTab);
+  return newTab;
+}
+
+void QtReflMainWindowView::removeBatch(int batchIndex) {
+  m_batchViews.erase(m_batchViews.begin() + batchIndex);
+  m_ui.mainTabs->removeTab(batchIndex);
+}
+
+std::vector<IReflBatchView *> QtReflMainWindowView::batches() const {
+  return m_batchViews;
+}
+
 /**
 Initialise the Interface
 */
 void QtReflMainWindowView::initLayout() {
   m_ui.setupUi(this);
   connect(m_ui.helpButton, SIGNAL(clicked()), this, SLOT(helpPressed()));
+  connect(m_ui.mainTabs, SIGNAL(tabCloseRequested(int)), this,
+          SLOT(onTabCloseRequested(int)));
+
+  auto instruments = std::vector<std::string>(
+      {{"INTER", "SURF", "CRISP", "POLREF", "OFFSPEC"}});
+
+  auto defaultSlicing = Slicing();
+  auto thetaTolerance = 0.01;
+  auto makeWorkspaceNames = WorkspaceNamesFactory(defaultSlicing);
+  auto makeBatchPresenter =
+      BatchPresenterFactory(instruments, thetaTolerance, makeWorkspaceNames);
+  auto defaultInstrumentIndex = 0; // TODO: Look this up properly;
+  auto searcher = boost::shared_ptr<IReflSearcher>();
+
+  auto makeRunsPresenter = RunsPresenterFactory(
+      std::move(makeBatchPresenter), std::move(makeWorkspaceNames),
+      thetaTolerance, instruments, defaultInstrumentIndex, searcher);
+
+  auto makeEventPresenter = EventPresenterFactory();
+  auto makeSettingsPresenter = SettingsPresenterFactory();
+  auto makeSaveSettingsPresenter = SavePresenterFactory();
+
+  auto makeReflBatchPresenter = ReflBatchPresenterFactory(
+      std::move(makeRunsPresenter), std::move(makeEventPresenter),
+      std::move(makeSettingsPresenter), std::move(makeSaveSettingsPresenter));
 
   // Create the presenter
-  m_presenter = Mantid::Kernel::make_unique<ReflMainWindowPresenter>(this);
+  m_presenter =
+      ReflMainWindowPresenter(this, std::move(makeReflBatchPresenter));
+
+  m_presenter.get().notifyNewBatchRequested();
+  m_presenter.get().notifyNewBatchRequested();
 }
 
-void QtReflMainWindowView::helpPressed() {
-  m_presenter->notify(IReflMainWindowPresenter::Flag::HelpPressed);
+void QtReflMainWindowView::onTabCloseRequested(int tabIndex) {
+  m_ui.mainTabs->removeTab(tabIndex);
 }
 
+void QtReflMainWindowView::subscribe(ReflMainWindowSubscriber *notifyee) {
+  m_notifyee = notifyee;
+}
+
+void QtReflMainWindowView::helpPressed() { m_notifyee->notifyHelpPressed(); }
+
 /**
 Runs python code
 * @param pythonCode : [input] The code to run
@@ -53,7 +99,7 @@ Handles attempt to close main window
 */
 void QtReflMainWindowView::closeEvent(QCloseEvent *event) {
   // Close only if reduction has been paused
-  if (!m_presenter->isProcessing()) {
+  if (!m_presenter.get().isProcessing()) {
     event->accept();
   } else {
     event->ignore();
diff --git a/qt/scientific_interfaces/ISISReflectometry/QtReflMainWindowView.h b/qt/scientific_interfaces/ISISReflectometry/QtReflMainWindowView.h
index eff6f17b08fb787909a9e7a5060aa174036817b6..9e7a9045628fb50a4767755013b1d4fd25ab2317 100644
--- a/qt/scientific_interfaces/ISISReflectometry/QtReflMainWindowView.h
+++ b/qt/scientific_interfaces/ISISReflectometry/QtReflMainWindowView.h
@@ -4,18 +4,14 @@
 #include "MantidQtWidgets/Common/UserSubWindow.h"
 #include "IReflMainWindowView.h"
 #include "ui_ReflMainWindowWidget.h"
+#include "IReflMainWindowPresenter.h"
+#include "ReflMainWindowPresenter.h"
 
 #include <QCloseEvent>
 
 namespace MantidQt {
 namespace CustomInterfaces {
 
-class IReflEventTabPresenter;
-class IReflMainWindowPresenter;
-class IReflRunsTabPresenter;
-class IReflSettingsTabPresenter;
-class IReflSaveTabPresenter;
-
 /** @class ReflMainWindowView
 
 ReflMainWindowView is the concrete main window view implementing the
@@ -46,19 +42,23 @@ class QtReflMainWindowView : public MantidQt::API::UserSubWindow,
                              public IReflMainWindowView {
   Q_OBJECT
 public:
-  /// Constructor
   explicit QtReflMainWindowView(QWidget *parent = nullptr);
-  /// Name of the interface
+  void subscribe(ReflMainWindowSubscriber* notifyee) override;
+
   static std::string name() { return "ISIS Reflectometry"; }
-  /// This interface's categories.
   static QString categoryInfo() { return "Reflectometry"; }
-  /// Run a python algorithm
   std::string runPythonAlgorithm(const std::string &pythonCode) override;
-  /// Close window handler
+
+  virtual std::vector<IReflBatchView*> batches() const override;
+
   void closeEvent(QCloseEvent *event) override;
 
+  IReflBatchView* newBatch() override;
+  void removeBatch(int batchIndex) override;
+
 public slots:
   void helpPressed();
+  void onTabCloseRequested(int tabIndex);
 
 private:
   /// Initializes the interface
@@ -66,7 +66,9 @@ private:
   /// Interface definition with widgets for the main interface window
   Ui::ReflMainWindowWidget m_ui;
   /// The presenter handling this view
-  std::unique_ptr<IReflMainWindowPresenter> m_presenter;
+  ReflMainWindowSubscriber* m_notifyee;
+  boost::optional<ReflMainWindowPresenter> m_presenter;
+  std::vector<IReflBatchView*> m_batchViews;
 };
 }
 }
diff --git a/qt/scientific_interfaces/ISISReflectometry/QtReflRunsTabView.h b/qt/scientific_interfaces/ISISReflectometry/QtReflRunsTabView.h
index 5d7168213e4c1953a629389322841d368cc29bc6..788300fd81bb4a847093e31276af5dc11541020d 100644
--- a/qt/scientific_interfaces/ISISReflectometry/QtReflRunsTabView.h
+++ b/qt/scientific_interfaces/ISISReflectometry/QtReflRunsTabView.h
@@ -5,7 +5,6 @@
 #include "MantidQtWidgets/Common/MantidWidget.h"
 #include "DllConfig.h"
 #include "IReflRunsTabView.h"
-#include "MantidQtWidgets/Common/ProgressableView.h"
 #include "MantidQtWidgets/Common/DataProcessorUI/QtCommandAdapter.h"
 #include "Presenters/BatchPresenter.h"
 #include "Views/BatchView.h"
@@ -62,8 +61,7 @@ Code Documentation is available at: <http://doxygen.mantidproject.org>
 */
 class MANTIDQT_ISISREFLECTOMETRY_DLL QtReflRunsTabView
     : public MantidQt::API::MantidWidget,
-      public IReflRunsTabView,
-      public MantidQt::MantidWidgets::ProgressableView {
+      public IReflRunsTabView {
   Q_OBJECT
 public:
   QtReflRunsTabView(QWidget *parent, BatchViewFactory makeView);
diff --git a/qt/scientific_interfaces/ISISReflectometry/QtReflSettingsTabView.cpp b/qt/scientific_interfaces/ISISReflectometry/QtReflSettingsTabView.cpp
index 7c2557638106c8655b9a8b917624b0c3b353c961..51ab8516acb5f8d2cb745d9f6c5b120d683fc494 100644
--- a/qt/scientific_interfaces/ISISReflectometry/QtReflSettingsTabView.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/QtReflSettingsTabView.cpp
@@ -5,7 +5,6 @@
 namespace MantidQt {
 namespace CustomInterfaces {
 
-//----------------------------------------------------------------------------------------------
 /** Constructor
 * @param parent :: [input] The parent of this widget
 */
@@ -15,10 +14,9 @@ QtReflSettingsTabView::QtReflSettingsTabView(QWidget *parent) {
   initLayout();
 }
 
-//----------------------------------------------------------------------------------------------
-/** Destructor
-*/
-QtReflSettingsTabView::~QtReflSettingsTabView() {}
+void QtReflSettingsTabView::subscribe(IReflSettingsTabPresenter* notifyee) {
+  m_notifyee = notifyee;
+}
 
 /**
 Initialise the interface
@@ -31,20 +29,6 @@ void QtReflSettingsTabView::initLayout() {
 
   QtReflSettingsView *settings_2 = new QtReflSettingsView(1, this);
   m_ui.toolbox->addItem(settings_2, "Group 2");
-
-  std::vector<IReflSettingsPresenter *> presenters;
-  presenters.push_back(settings_1->getPresenter());
-  presenters.push_back(settings_2->getPresenter());
-
-  m_presenter.reset(new ReflSettingsTabPresenter(presenters));
-}
-
-/** Returns the presenter managing this view
-* @return :: A pointer to the presenter
-*/
-IReflSettingsTabPresenter *QtReflSettingsTabView::getPresenter() const {
-
-  return m_presenter.get();
 }
 
 } // namespace CustomInterfaces
diff --git a/qt/scientific_interfaces/ISISReflectometry/QtReflSettingsTabView.h b/qt/scientific_interfaces/ISISReflectometry/QtReflSettingsTabView.h
index f640a25698adafd3c914642d31fa48129c15be1e..8cdfe6b2a77afaed097450987b0288b8f1cf9950 100644
--- a/qt/scientific_interfaces/ISISReflectometry/QtReflSettingsTabView.h
+++ b/qt/scientific_interfaces/ISISReflectometry/QtReflSettingsTabView.h
@@ -3,13 +3,13 @@
 
 #include "DllConfig.h"
 #include "ui_ReflSettingsTabWidget.h"
+#include "IReflSettingsTabView.h"
+#include "IReflSettingsTabPresenter.h"
 #include <memory>
 
 namespace MantidQt {
 namespace CustomInterfaces {
 
-// Forward decs
-class IReflSettingsTabPresenter;
 
 /** QtReflSettingsTabView : Provides an interface for the "Settings" tab in the
 ISIS Reflectometry interface.
@@ -35,24 +35,17 @@ 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 MANTIDQT_ISISREFLECTOMETRY_DLL QtReflSettingsTabView : public QWidget {
+class MANTIDQT_ISISREFLECTOMETRY_DLL QtReflSettingsTabView : public QWidget, public IReflSettingsTabView {
   Q_OBJECT
 public:
-  /// Constructor
   QtReflSettingsTabView(QWidget *parent = nullptr);
-  /// Destructor
-  ~QtReflSettingsTabView() override;
-  /// Returns the presenter managing this view
-  IReflSettingsTabPresenter *getPresenter() const;
-
 private:
   /// Initialise the interface
   void initLayout();
+  void subscribe(IReflSettingsTabPresenter* notifyee) override;
 
-  /// The widget
   Ui::ReflSettingsTabWidget m_ui;
-  /// The presenter
-  std::unique_ptr<IReflSettingsTabPresenter> m_presenter;
+  IReflSettingsTabPresenter* m_notifyee;
 };
 
 } // namespace Mantid
diff --git a/qt/scientific_interfaces/ISISReflectometry/Reduction/WorkspaceNamesFactory.h b/qt/scientific_interfaces/ISISReflectometry/Reduction/WorkspaceNamesFactory.h
index 5858999b5b822dceb7a4d4d9a3ce8d25c8140070..b3918e4995b320972800066b6d72bf78d6b9de3e 100644
--- a/qt/scientific_interfaces/ISISReflectometry/Reduction/WorkspaceNamesFactory.h
+++ b/qt/scientific_interfaces/ISISReflectometry/Reduction/WorkspaceNamesFactory.h
@@ -43,7 +43,7 @@ public:
 
 class MANTIDQT_ISISREFLECTOMETRY_DLL WorkspaceNamesFactory {
 public:
-  WorkspaceNamesFactory(Slicing const &slicing) : m_slicing(slicing) {}
+  WorkspaceNamesFactory(Slicing slicing) : m_slicing(slicing) {}
 
   template <typename WorkspaceNames>
   WorkspaceNames
@@ -61,7 +61,7 @@ public:
   }
 
 private:
-  Slicing const &m_slicing;
+  Slicing m_slicing;
 };
 }
 }
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflBatchPresenter.cpp b/qt/scientific_interfaces/ISISReflectometry/ReflBatchPresenter.cpp
index 550eac8f57e5863aff13ef566dd7f08582fa2481..f59b71b7bec655b977c9eee3fb3012c3c61af853 100644
--- a/qt/scientific_interfaces/ISISReflectometry/ReflBatchPresenter.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflBatchPresenter.cpp
@@ -20,13 +20,13 @@ namespace CustomInterfaces {
 * @param savePresenter :: [input] A pointer to the 'Save ASCII' tab presenter
 */
 ReflBatchPresenter::ReflBatchPresenter(
-    IReflBatchView *view,
-    std::unique_ptr<IReflRunsTabPresenter> runsPresenter,
-    IReflEventTabPresenter *eventPresenter,
-    IReflSettingsTabPresenter *settingsPresenter,
+    IReflBatchView *view, std::unique_ptr<IReflRunsTabPresenter> runsPresenter,
+    std::unique_ptr<IReflEventTabPresenter> eventPresenter,
+    std::unique_ptr<IReflSettingsTabPresenter> settingsPresenter,
     std::unique_ptr<IReflSaveTabPresenter> savePresenter)
     : m_view(view), m_runsPresenter(std::move(runsPresenter)),
-      m_eventPresenter(eventPresenter), m_settingsPresenter(settingsPresenter),
+      m_eventPresenter(std::move(eventPresenter)),
+      m_settingsPresenter(std::move(settingsPresenter)),
       m_savePresenter(std::move(savePresenter)) {
 
   // Tell the tab presenters that this is going to be the main presenter
@@ -39,9 +39,7 @@ ReflBatchPresenter::ReflBatchPresenter(
   m_runsPresenter->notify(IReflRunsTabPresenter::InstrumentChangedFlag);
 }
 
-/** Destructor
-*/
-ReflBatchPresenter::~ReflBatchPresenter() {}
+bool ReflBatchPresenter::requestClose() const { return true; }
 
 void ReflBatchPresenter::completedGroupReductionSuccessfully(
     GroupData const &group, std::string const &workspaceName) {
@@ -76,9 +74,6 @@ void ReflBatchPresenter::settingsChanged(int group) {
 * @return :: Global options for 'CreateTransmissionWorkspaceAuto'
 */
 OptionsQMap ReflBatchPresenter::getTransmissionOptions(int group) const {
-
-  checkSettingsPtrValid(m_settingsPresenter);
-
   return m_settingsPresenter->getTransmissionOptions(group);
 }
 
@@ -89,10 +84,6 @@ OptionsQMap ReflBatchPresenter::getTransmissionOptions(int group) const {
 * @return :: Global processing options
 */
 OptionsQMap ReflBatchPresenter::getReductionOptions(int group) const {
-
-  checkSettingsPtrValid(m_settingsPresenter);
-
-  // Request global processing options to 'Settings' presenter
   return m_settingsPresenter->getReductionOptions(group);
 }
 
@@ -103,10 +94,6 @@ OptionsQMap ReflBatchPresenter::getReductionOptions(int group) const {
 * @return :: Global post-processing options
 */
 std::string ReflBatchPresenter::getStitchOptions(int group) const {
-
-  checkSettingsPtrValid(m_settingsPresenter);
-
-  // Request global post-processing options to 'Settings' presenter
   return m_settingsPresenter->getStitchOptions(group);
 }
 
@@ -117,9 +104,6 @@ std::string ReflBatchPresenter::getStitchOptions(int group) const {
 * @return :: Time-slicing values
 */
 std::string ReflBatchPresenter::getTimeSlicingValues(int group) const {
-
-  checkEventPtrValid(m_eventPresenter);
-
   // Request global time-slicing values to 'Event Handling' presenter
   return m_eventPresenter->getTimeSlicingValues(group);
 }
@@ -131,9 +115,6 @@ std::string ReflBatchPresenter::getTimeSlicingValues(int group) const {
 * @return :: Time-slicing type
 */
 std::string ReflBatchPresenter::getTimeSlicingType(int group) const {
-
-  checkEventPtrValid(m_eventPresenter);
-
   // Request time-slicing type to 'Event Handling' presenter
   return m_eventPresenter->getTimeSlicingType(group);
 }
@@ -146,12 +127,8 @@ std::string ReflBatchPresenter::getTimeSlicingType(int group) const {
 * @param angle :: the run angle to look up transmission runs for
 * @return :: Values passed for 'Transmission run(s)'
 */
-OptionsQMap
-ReflBatchPresenter::getOptionsForAngle(int group,
-                                            const double angle) const {
-
-  checkSettingsPtrValid(m_settingsPresenter);
-
+OptionsQMap ReflBatchPresenter::getOptionsForAngle(int group,
+                                                   const double angle) const {
   return m_settingsPresenter->getOptionsForAngle(group, angle);
 }
 
@@ -159,7 +136,6 @@ ReflBatchPresenter::getOptionsForAngle(int group,
  * @return :: true if there are per-angle transmission runs
  * */
 bool ReflBatchPresenter::hasPerAngleOptions(int group) const {
-  checkSettingsPtrValid(m_settingsPresenter);
   return m_settingsPresenter->hasPerAngleOptions(group);
 }
 
@@ -167,9 +143,7 @@ bool ReflBatchPresenter::hasPerAngleOptions(int group) const {
 Tells the setting tab presenter what to set its current instrument name to
 * @param instName : The name of the instrument to be set
 */
-void ReflBatchPresenter::setInstrumentName(
-    const std::string &instName) const {
-
+void ReflBatchPresenter::setInstrumentName(const std::string &instName) const {
   m_settingsPresenter->setInstrumentName(instName);
 }
 
@@ -189,23 +163,5 @@ for a specific group
 bool ReflBatchPresenter::isProcessing(int group) const {
   return m_runsPresenter->isProcessing(group);
 }
-
-/** Checks for Settings Tab null pointer
-* @param pointer :: The pointer
-*/
-void ReflBatchPresenter::checkSettingsPtrValid(
-    IReflSettingsTabPresenter *pointer) const {
-  if (pointer == nullptr)
-    throw std::invalid_argument("Could not read settings");
-}
-
-/** Checks for Event Handling Tab null pointer
-* @param pointer :: The pointer
-*/
-void ReflBatchPresenter::checkEventPtrValid(
-    IReflEventTabPresenter *pointer) const {
-  if (pointer == nullptr)
-    throw std::invalid_argument("Could not read event handling");
-}
 }
 }
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflBatchPresenter.h b/qt/scientific_interfaces/ISISReflectometry/ReflBatchPresenter.h
index af87274ff8e7ace95041ce96f9eb45c5baf9ae05..ce130033872a23a84fb2d172d955939f24785082 100644
--- a/qt/scientific_interfaces/ISISReflectometry/ReflBatchPresenter.h
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflBatchPresenter.h
@@ -46,11 +46,9 @@ public:
   /// Constructor
   ReflBatchPresenter(IReflBatchView *view,
                      std::unique_ptr<IReflRunsTabPresenter> runsPresenter,
-                     IReflEventTabPresenter *eventPresenter,
-                     IReflSettingsTabPresenter *settingsPresenter,
+                     std::unique_ptr<IReflEventTabPresenter> eventPresenter,
+                     std::unique_ptr<IReflSettingsTabPresenter> settingsPresenter,
                      std::unique_ptr<IReflSaveTabPresenter> savePresenter);
-  /// Destructor
-  ~ReflBatchPresenter() override;
 
   /// Returns values passed for 'Transmission run(s)'
   MantidWidgets::DataProcessor::OptionsQMap
@@ -79,6 +77,7 @@ public:
   void settingsChanged(int group) override;
   void notifyReductionPaused(int group) override;
   void notifyReductionResumed(int group) override;
+  bool requestClose() const override;
 
   void completedGroupReductionSuccessfully(
       MantidWidgets::DataProcessor::GroupData const &group,
@@ -88,10 +87,6 @@ public:
       std::string const &workspaceName) override;
 
 private:
-  /// Check for Settings Tab null pointer
-  void checkSettingsPtrValid(IReflSettingsTabPresenter *pointer) const;
-  /// Check for Event Handling Tab null pointer
-  void checkEventPtrValid(IReflEventTabPresenter *pointer) const;
   /// Pauses reduction in the Runs Tab
   void pauseReduction() const;
   /// Resumes reduction in the Runs Tab
@@ -101,9 +96,9 @@ private:
   /// The presenter of tab 'Runs'
   std::unique_ptr<IReflRunsTabPresenter> m_runsPresenter;
   /// The presenter of tab 'Event Handling'
-  IReflEventTabPresenter *m_eventPresenter;
+  std::unique_ptr<IReflEventTabPresenter> m_eventPresenter;
   /// The presenter of tab 'Settings'
-  IReflSettingsTabPresenter *m_settingsPresenter;
+  std::unique_ptr<IReflSettingsTabPresenter> m_settingsPresenter;
   /// The presenter of tab 'Save ASCII'
   std::unique_ptr<IReflSaveTabPresenter> m_savePresenter;
 };
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflBatchPresenterFactory.h b/qt/scientific_interfaces/ISISReflectometry/ReflBatchPresenterFactory.h
new file mode 100644
index 0000000000000000000000000000000000000000..ef47c3f437f35fa386ec3cfbf9bb516564921bb5
--- /dev/null
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflBatchPresenterFactory.h
@@ -0,0 +1,45 @@
+#ifndef MANTID_ISISREFLECTOMETRY_REFLBATCHPRESENTERFACTORY_H
+#define MANTID_ISISREFLECTOMETRY_REFLBATCHPRESENTERFACTORY_H
+#include "DllConfig.h"
+#include "IReflBatchView.h"
+#include "IReflBatchPresenter.h"
+#include "ReflRunsPresenterFactory.h"
+#include "ReflSavePresenterFactory.h"
+#include "ReflSettingsPresenterFactory.h"
+#include "ReflEventPresenterFactory.h"
+#include "ReflBatchPresenter.h"
+#include <memory>
+
+namespace MantidQt {
+namespace CustomInterfaces {
+class ReflBatchPresenterFactory {
+public:
+  ReflBatchPresenterFactory(
+      RunsPresenterFactory runsPresenterFactory,
+      EventPresenterFactory eventPresenterFactory,
+      SettingsPresenterFactory settingsPresenterFactory,
+      SavePresenterFactory savePresenterFactory)
+    : m_runsPresenterFactory(std::move(runsPresenterFactory)),
+      m_eventPresenterFactory(std::move(eventPresenterFactory)),
+      m_settingsPresenterFactory(std::move(settingsPresenterFactory)),
+      m_savePresenterFactory(std::move(savePresenterFactory)) {}
+
+  std::unique_ptr<IReflBatchPresenter> make(IReflBatchView *view) {
+    auto runsPresenter = m_runsPresenterFactory.make(view->runs());
+    auto eventPresenter = m_eventPresenterFactory.make(view->eventHandling());
+    auto settingsPresenter = m_settingsPresenterFactory.make(view->settings());
+    auto savePresenter = m_savePresenterFactory.make(view->save());
+
+    return std::make_unique<ReflBatchPresenter>(
+        view, std::move(runsPresenter), std::move(eventPresenter),
+        std::move(settingsPresenter), std::move(savePresenter));
+  }
+private:
+  RunsPresenterFactory m_runsPresenterFactory;
+  EventPresenterFactory m_eventPresenterFactory;
+  SettingsPresenterFactory m_settingsPresenterFactory;
+  SavePresenterFactory m_savePresenterFactory;
+};
+}
+}
+#endif // MANTID_ISISREFLECTOMETRY_REFLBATCHPRESENTERFACTORY_H
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflEventPresenterFactory.h b/qt/scientific_interfaces/ISISReflectometry/ReflEventPresenterFactory.h
new file mode 100644
index 0000000000000000000000000000000000000000..70558fd8dcf796e7087edb95330b985fe51dafaf
--- /dev/null
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflEventPresenterFactory.h
@@ -0,0 +1,21 @@
+#ifndef MANTID_ISISREFLECTOMETRY_REFLEVENTPRESENTERFACTORY_H
+#define MANTID_ISISREFLECTOMETRY_REFLEVENTPRESENTERFACTORY_H
+#include "DllConfig.h"
+#include "IReflEventTabView.h"
+#include "IReflEventTabPresenter.h"
+#include "ReflEventTabPresenter.h"
+#include "Presenters/BatchPresenterFactory.h"
+#include <memory>
+
+namespace MantidQt {
+namespace CustomInterfaces {
+
+class EventPresenterFactory {
+public:
+  std::unique_ptr<IReflEventTabPresenter> make(IReflEventTabView *view) {
+    return std::make_unique<ReflEventTabPresenter>(view);
+  }
+};
+}
+}
+#endif // MANTID_ISISREFLECTOMETRY_REFLEVENTPRESENTERFACTORY_H
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflEventTabPresenter.cpp b/qt/scientific_interfaces/ISISReflectometry/ReflEventTabPresenter.cpp
index 012f298b422f2cf2e49464d794bdfc5d81bbf4f5..382d640b992b5dda665dadc19e1d5deefd83a842 100644
--- a/qt/scientific_interfaces/ISISReflectometry/ReflEventTabPresenter.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflEventTabPresenter.cpp
@@ -9,23 +9,11 @@ namespace CustomInterfaces {
 *
 * @param presenters :: The presenters of each group as a vector
 */
-ReflEventTabPresenter::ReflEventTabPresenter(
-    std::vector<IReflEventPresenter *> presenters)
-    : m_eventPresenters(presenters) {
-  passSelfToChildren(presenters);
+ReflEventTabPresenter::ReflEventTabPresenter(IReflEventTabView *view)
+    : m_view(view) {
+      // TODO: subscribe.
 }
 
-void ReflEventTabPresenter::passSelfToChildren(
-    std::vector<IReflEventPresenter *> const &children) {
-  for (auto *presenter : children)
-    presenter->acceptTabPresenter(this);
-}
-
-/** Destructor
-*
-*/
-ReflEventTabPresenter::~ReflEventTabPresenter() {}
-
 void ReflEventTabPresenter::acceptMainPresenter(
     IReflBatchPresenter *mainPresenter) {
   m_mainPresenter = mainPresenter;
@@ -37,7 +25,7 @@ void ReflEventTabPresenter::acceptMainPresenter(
 * @return :: Time-slicing values for 'ReflectometryReductionOneAuto'
 */
 std::string ReflEventTabPresenter::getTimeSlicingValues(int group) const {
-  return m_eventPresenters.at(group)->getTimeSlicingValues();
+//  return m_eventPresenters.at(group)->getTimeSlicingValues();
 }
 
 /** Returns time-slicing type for 'ReflectometryReductionOneAuto'
@@ -46,19 +34,19 @@ std::string ReflEventTabPresenter::getTimeSlicingValues(int group) const {
 * @return :: Time-slicing type for 'ReflectometryReductionOneAuto'
 */
 std::string ReflEventTabPresenter::getTimeSlicingType(int group) const {
-  return m_eventPresenters.at(group)->getTimeSlicingType();
+ // return m_eventPresenters.at(group)->getTimeSlicingType();
 }
 
 void ReflEventTabPresenter::onReductionPaused(int group) {
-  m_eventPresenters[group]->onReductionPaused();
+//  m_eventPresenters[group]->onReductionPaused();
 }
 
 void ReflEventTabPresenter::onReductionResumed(int group) {
-  m_eventPresenters[group]->onReductionResumed();
+//  m_eventPresenters[group]->onReductionResumed();
 }
 
 void ReflEventTabPresenter::settingsChanged(int group) {
-  m_mainPresenter->settingsChanged(group);
+ // m_mainPresenter->settingsChanged(group);
 }
 }
 }
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflEventTabPresenter.h b/qt/scientific_interfaces/ISISReflectometry/ReflEventTabPresenter.h
index 8a633360407c3ecbbcda7aee633be008a78a6212..f6742469f6465e8706d5eb5dc6e8cadc7aa7f281 100644
--- a/qt/scientific_interfaces/ISISReflectometry/ReflEventTabPresenter.h
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflEventTabPresenter.h
@@ -4,6 +4,7 @@
 #include "DllConfig.h"
 #include "IReflEventTabPresenter.h"
 #include "IReflBatchPresenter.h"
+#include "IReflEventTabView.h"
 #include <vector>
 
 namespace MantidQt {
@@ -41,10 +42,7 @@ Code Documentation is available at: <http://doxygen.mantidproject.org>
 class MANTIDQT_ISISREFLECTOMETRY_DLL ReflEventTabPresenter
     : public IReflEventTabPresenter {
 public:
-  /// Constructor
-  ReflEventTabPresenter(std::vector<IReflEventPresenter *> presenters);
-  /// Destructor
-  ~ReflEventTabPresenter() override;
+  ReflEventTabPresenter(IReflEventTabView* view);
 
   /// Returns time-slicing values
   std::string getTimeSlicingValues(int group) const override;
@@ -55,11 +53,9 @@ public:
   void settingsChanged(int group) override;
   void onReductionResumed(int group) override;
   void onReductionPaused(int group) override;
-  void passSelfToChildren(std::vector<IReflEventPresenter *> const &children);
 
 private:
-  /// The presenters for each group as a vector
-  std::vector<IReflEventPresenter *> m_eventPresenters;
+  IReflEventTabView* m_view;
   IReflBatchPresenter *m_mainPresenter;
 };
 }
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflMainWindowPresenter.cpp b/qt/scientific_interfaces/ISISReflectometry/ReflMainWindowPresenter.cpp
index 7354477c39c07a59e3492e38032e4e180089764d..a0a85473411ae30be436fe5a50dc53f1fe9a37f6 100644
--- a/qt/scientific_interfaces/ISISReflectometry/ReflMainWindowPresenter.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflMainWindowPresenter.cpp
@@ -19,22 +19,30 @@ namespace CustomInterfaces {
 * @param settingsPresenter :: [input] A pointer to the 'Settings' tab presenter
 * @param savePresenter :: [input] A pointer to the 'Save ASCII' tab presenter
 */
-ReflMainWindowPresenter::ReflMainWindowPresenter(IReflMainWindowView *view)
-    : m_view(view) {
+ReflMainWindowPresenter::ReflMainWindowPresenter(
+    IReflMainWindowView *view, ReflBatchPresenterFactory batchPresenterFactory)
+    : m_view(view), m_batchPresenterFactory(std::move(batchPresenterFactory)) {
+  view->subscribe(this);
+  for (auto *batchView : m_view->batches())
+    m_batchPresenters.emplace_back(m_batchPresenterFactory.make(batchView));
+}
+
+void ReflMainWindowPresenter::notifyNewBatchRequested() {
+  auto *newBatchView = m_view->newBatch();
+  m_batchPresenters.emplace_back(m_batchPresenterFactory.make(newBatchView));
+}
+
+void ReflMainWindowPresenter::notifyCloseBatchRequested(int batchIndex) {
+  if (m_batchPresenters[batchIndex]->requestClose()) {
+    m_batchPresenters.erase(m_batchPresenters.begin() + batchIndex);
+    m_view->removeBatch(batchIndex);
+  }
 }
 
 /**
 Used by the view to tell the presenter something has changed
 */
-void ReflMainWindowPresenter::notify(IReflMainWindowPresenter::Flag flag) {
-  switch (flag) {
-  case Flag::HelpPressed:
-    showHelp();
-    break;
-  }
-  // Not having a 'default' case is deliberate. gcc issues a warning if there's
-  // a flag we aren't handling.
-}
+void ReflMainWindowPresenter::notifyHelpPressed() { showHelp(); }
 
 bool ReflMainWindowPresenter::isProcessing() const {
   // TODO Implement this once you have ownership of child presenters.
@@ -53,9 +61,7 @@ Tells the view to show the user the dialog for an algorithm
 */
 std::string
 ReflMainWindowPresenter::runPythonAlgorithm(const std::string &pythonCode) {
-
   return m_view->runPythonAlgorithm(pythonCode);
 }
-
 }
 }
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflMainWindowPresenter.h b/qt/scientific_interfaces/ISISReflectometry/ReflMainWindowPresenter.h
index f73ee1b4dd7e0d298a4543c35e677b0d7ad29b28..502a0215c6d341ed31f8a4c9d738fa3fd24a353f 100644
--- a/qt/scientific_interfaces/ISISReflectometry/ReflMainWindowPresenter.h
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflMainWindowPresenter.h
@@ -3,6 +3,7 @@
 
 #include "DllConfig.h"
 #include "IReflMainWindowPresenter.h"
+#include "ReflBatchPresenterFactory.h"
 #include <memory>
 
 namespace MantidQt {
@@ -44,14 +45,19 @@ class MANTIDQT_ISISREFLECTOMETRY_DLL ReflMainWindowPresenter
     : public IReflMainWindowPresenter {
 public:
   /// Constructor
-  ReflMainWindowPresenter(IReflMainWindowView *view);
+  ReflMainWindowPresenter(IReflMainWindowView *view,
+                          ReflBatchPresenterFactory batchPresenterFactory);
   /// Run a python algorithm
   std::string runPythonAlgorithm(const std::string &pythonCode) override;
   bool isProcessing() const override;
+  void notifyHelpPressed() override;
+  void notifyNewBatchRequested() override;
+  void notifyCloseBatchRequested(int batchIndex) override;
 private:
   void showHelp();
   IReflMainWindowView* m_view;
-  void notify(IReflMainWindowPresenter::Flag flag) override;
+  ReflBatchPresenterFactory m_batchPresenterFactory;
+  std::vector<std::unique_ptr<IReflBatchPresenter>> m_batchPresenters;
 };
 }
 }
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflMainWindowWidget.ui b/qt/scientific_interfaces/ISISReflectometry/ReflMainWindowWidget.ui
index 1348f6760b2077ec6c42c1b13afbc62ac3d4517b..3115272b2dfd45e91cea90fa78d99d567da13fa5 100644
--- a/qt/scientific_interfaces/ISISReflectometry/ReflMainWindowWidget.ui
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflMainWindowWidget.ui
@@ -13,13 +13,22 @@
   <property name="windowTitle">
    <string>ISIS Reflectometry</string>
   </property>
+  <property name="layoutDirection">
+   <enum>Qt::LeftToRight</enum>
+  </property>
   <widget class="QWidget" name="centralwidget">
    <layout class="QVBoxLayout" name="verticalLayout">
     <item>
-     <widget class="QTabWidget" name="mainTab">
+     <widget class="QTabWidget" name="mainTabs">
+      <property name="layoutDirection">
+       <enum>Qt::LeftToRight</enum>
+      </property>
       <property name="tabPosition">
        <enum>QTabWidget::West</enum>
       </property>
+      <property name="tabsClosable">
+       <bool>true</bool>
+      </property>
      </widget>
     </item>
     <item>
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflRunsPresenterFactory.h b/qt/scientific_interfaces/ISISReflectometry/ReflRunsPresenterFactory.h
new file mode 100644
index 0000000000000000000000000000000000000000..f2badf6f53bbe93a9d6f8e1907f66ecd26f76ed7
--- /dev/null
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflRunsPresenterFactory.h
@@ -0,0 +1,48 @@
+#ifndef MANTID_ISISREFLECTOMETRY_REFLRUNSPRESENTERFACTORY_H
+#define MANTID_ISISREFLECTOMETRY_REFLRUNSPRESENTERFACTORY_H
+#include "DllConfig.h"
+#include "IReflEventView.h"
+#include "IReflEventTabPresenter.h"
+#include "IReflRunsTabPresenter.h"
+#include "IReflRunsTabView.h"
+#include "ReflRunsTabPresenter.h"
+#include "MantidQtWidgets/Common/ProgressableView.h"
+#include "Presenters/BatchPresenterFactory.h"
+#include "../General/IReflSearcher.h"
+#include <memory>
+
+namespace MantidQt {
+namespace CustomInterfaces {
+
+class RunsPresenterFactory {
+public:
+  RunsPresenterFactory(BatchPresenterFactory batchPresenterFactory,
+                       WorkspaceNamesFactory workspaceNamesFactory,
+                       double thetaTolerance,
+                       std::vector<std::string> instruments,
+                       int defaultInstrumentIndex,
+                       boost::shared_ptr<IReflSearcher> searcher)
+      : m_batchPresenterFactory(std::move(batchPresenterFactory)),
+        m_workspaceNamesFactory(std::move(workspaceNamesFactory)),
+        m_thetaTolerance(std::move(thetaTolerance)),
+        m_instruments(std::move(instruments)),
+        m_defaultInstrumentIndex(std::move(defaultInstrumentIndex)),
+        m_searcher(std::move(searcher)) {}
+
+  std::unique_ptr<IReflRunsTabPresenter> make(IReflRunsTabView *view) {
+    return std::make_unique<ReflRunsTabPresenter>(
+        view, view, m_batchPresenterFactory, m_workspaceNamesFactory,
+        m_thetaTolerance, m_instruments, m_defaultInstrumentIndex, m_searcher);
+  }
+
+private:
+  BatchPresenterFactory m_batchPresenterFactory;
+  WorkspaceNamesFactory m_workspaceNamesFactory;
+  double m_thetaTolerance;
+  std::vector<std::string> m_instruments;
+  int m_defaultInstrumentIndex;
+  boost::shared_ptr<IReflSearcher> m_searcher;
+};
+}
+}
+#endif // MANTID_ISISREFLECTOMETRY_REFLRUNSPRESENTERFACTORY_H
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflSavePresenterFactory.h b/qt/scientific_interfaces/ISISReflectometry/ReflSavePresenterFactory.h
new file mode 100644
index 0000000000000000000000000000000000000000..03521a4cfda46f84a4b80f9d3c6868d12a1adaa2
--- /dev/null
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflSavePresenterFactory.h
@@ -0,0 +1,22 @@
+#ifndef MANTID_ISISREFLECTOMETRY_REFLSAVEPRESENTERFACTORY_H
+#define MANTID_ISISREFLECTOMETRY_REFLSAVEPRESENTERFACTORY_H
+#include "DllConfig.h"
+#include "IReflSaveTabView.h"
+#include "IReflSaveTabPresenter.h"
+#include "ReflSaveTabPresenter.h"
+#include "ReflAsciiSaver.h"
+#include <memory>
+
+namespace MantidQt {
+namespace CustomInterfaces {
+
+class SavePresenterFactory {
+public:
+  std::unique_ptr<IReflSaveTabPresenter> make(IReflSaveTabView *view) {
+    return Mantid::Kernel::make_unique<ReflSaveTabPresenter>(
+        view, Mantid::Kernel::make_unique<ReflAsciiSaver>());
+  }
+};
+}
+}
+#endif // MANTID_ISISREFLECTOMETRY_REFLSETTINGSPRESENTERFACTORY_H
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflSaveTabPresenter.cpp b/qt/scientific_interfaces/ISISReflectometry/ReflSaveTabPresenter.cpp
index 929764a56a5f3aad63eb38334f147eeafea37773..2aac8a636c6701ef8577afbd86c0d5a9ac4f417a 100644
--- a/qt/scientific_interfaces/ISISReflectometry/ReflSaveTabPresenter.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflSaveTabPresenter.cpp
@@ -23,18 +23,13 @@ using namespace Mantid::API;
 * @param view :: The view we are handling
 */
 ReflSaveTabPresenter::ReflSaveTabPresenter(
-    std::unique_ptr<IReflAsciiSaver> saver,
-    std::unique_ptr<IReflSaveTabView> view)
-    : m_view(std::move(view)), m_saver(std::move(saver)), m_mainPresenter(),
+    IReflSaveTabView *view, std::unique_ptr<IReflAsciiSaver> saver)
+    : m_view(view), m_saver(std::move(saver)), m_mainPresenter(),
       m_shouldAutosave(false) {
 
   m_view->subscribe(this);
 }
 
-/** Destructor
-*/
-ReflSaveTabPresenter::~ReflSaveTabPresenter() {}
-
 /** Accept a main presenter
 * @param mainPresenter :: [input] The main presenter
 */
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflSaveTabPresenter.h b/qt/scientific_interfaces/ISISReflectometry/ReflSaveTabPresenter.h
index d18a0ba0e329ae4288bfd38f06cd16891e466fed..b359a3823c9c8fef412f60a992f00f2d66bea7af 100644
--- a/qt/scientific_interfaces/ISISReflectometry/ReflSaveTabPresenter.h
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflSaveTabPresenter.h
@@ -3,6 +3,7 @@
 
 #include "DllConfig.h"
 #include "IReflSaveTabPresenter.h"
+#include "IReflSaveTabView.h"
 #include <vector>
 #include <string>
 #include <memory>
@@ -13,10 +14,6 @@
 namespace MantidQt {
 namespace CustomInterfaces {
 
-// Forward decs
-class IReflMainWindowPresenter;
-class IReflSaveTabView;
-
 /** @class ReflSaveTabPresenter
 
 ReflSaveTabPresenter is a presenter class for the tab 'Save ASCII' in the
@@ -46,11 +43,8 @@ Code Documentation is available at: <http://doxygen.mantidproject.org>
 class MANTIDQT_ISISREFLECTOMETRY_DLL ReflSaveTabPresenter
     : public IReflSaveTabPresenter {
 public:
-  /// Constructor
-  ReflSaveTabPresenter(std::unique_ptr<IReflAsciiSaver> saver,
-                       std::unique_ptr<IReflSaveTabView> view);
-  /// Destructor
-  ~ReflSaveTabPresenter() override;
+  ReflSaveTabPresenter(IReflSaveTabView* view,
+                       std::unique_ptr<IReflAsciiSaver> saver);
   /// Accept a main presenter
   void acceptMainPresenter(IReflBatchPresenter *mainPresenter) override;
   void notify(IReflSaveTabPresenter::Flag flag) override;
@@ -93,7 +87,7 @@ private:
   bool shouldAutosave() const;
 
   /// The view
-  std::unique_ptr<IReflSaveTabView> m_view;
+  IReflSaveTabView* m_view;
   std::unique_ptr<IReflAsciiSaver> m_saver;
   /// The main presenter
   IReflBatchPresenter *m_mainPresenter;
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflSettingsPresenterFactory.h b/qt/scientific_interfaces/ISISReflectometry/ReflSettingsPresenterFactory.h
new file mode 100644
index 0000000000000000000000000000000000000000..549f2399bba94f02296ee51637f4d7c6c04c6a42
--- /dev/null
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflSettingsPresenterFactory.h
@@ -0,0 +1,20 @@
+#ifndef MANTID_ISISREFLECTOMETRY_REFLSETTINGSPRESENTERFACTORY_H
+#define MANTID_ISISREFLECTOMETRY_REFLSETTINGSPRESENTERFACTORY_H
+#include "DllConfig.h"
+#include "IReflSettingsTabView.h"
+#include "IReflSettingsTabPresenter.h"
+#include "ReflSettingsTabPresenter.h"
+#include <memory>
+
+namespace MantidQt {
+namespace CustomInterfaces {
+
+class SettingsPresenterFactory {
+public:
+  std::unique_ptr<IReflSettingsTabPresenter> make(IReflSettingsTabView *view) {
+    return std::make_unique<ReflSettingsTabPresenter>(view);
+  }
+};
+}
+}
+#endif // MANTID_ISISREFLECTOMETRY_REFLSETTINGSPRESENTERFACTORY_H
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflSettingsTabPresenter.cpp b/qt/scientific_interfaces/ISISReflectometry/ReflSettingsTabPresenter.cpp
index 153c0d0a7fb071a633974fd373eb08743a39a9ef..c94c377eb639c6b1ed150260117da1ebbb5056cc 100644
--- a/qt/scientific_interfaces/ISISReflectometry/ReflSettingsTabPresenter.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflSettingsTabPresenter.cpp
@@ -16,16 +16,9 @@ namespace CustomInterfaces {
 *
 * @param presenters :: The presenters of each group as a vector
 */
-ReflSettingsTabPresenter::ReflSettingsTabPresenter(
-    std::vector<IReflSettingsPresenter *> presenters)
-    : m_settingsPresenters(presenters) {
-  passSelfToChildren(presenters);
-}
-
-void ReflSettingsTabPresenter::passSelfToChildren(
-    std::vector<IReflSettingsPresenter *> const &children) {
-  for (auto *presenter : children)
-    presenter->acceptTabPresenter(this);
+ReflSettingsTabPresenter::ReflSettingsTabPresenter(IReflSettingsTabView *view)
+    : m_view(view) {
+  // TODO view->subscribe(this);
 }
 
 void ReflSettingsTabPresenter::acceptMainPresenter(
@@ -37,25 +30,22 @@ void ReflSettingsTabPresenter::settingsChanged(int group) {
   m_mainPresenter->settingsChanged(group);
 }
 
-/// Destructor
-ReflSettingsTabPresenter::~ReflSettingsTabPresenter() {}
-
 /** Sets the current instrument name and changes accessibility status of
 * the polarisation corrections option in the view accordingly
 *
 * @param instName :: [input] The name of the instrument to set to
 */
 void ReflSettingsTabPresenter::setInstrumentName(const std::string &instName) {
-  for (auto presenter : m_settingsPresenters)
-    presenter->setInstrumentName(instName);
+  //  for (auto presenter : m_settingsPresenters)
+  //    presenter->setInstrumentName(instName);
 }
 
 void ReflSettingsTabPresenter::onReductionResumed(int group) {
-  m_settingsPresenters[group]->onReductionResumed();
+  //  m_settingsPresenters[group]->onReductionResumed();
 }
 
 void ReflSettingsTabPresenter::onReductionPaused(int group) {
-  m_settingsPresenters[group]->onReductionPaused();
+  // m_settingsPresenters[group]->onReductionPaused();
 }
 
 /** Returns values passed for 'Transmission run(s)'
@@ -67,15 +57,16 @@ void ReflSettingsTabPresenter::onReductionPaused(int group) {
 OptionsQMap
 ReflSettingsTabPresenter::getOptionsForAngle(int group,
                                              const double angle) const {
-
-  return m_settingsPresenters.at(group)->getOptionsForAngle(angle);
+  //  return m_settingsPresenters.at(group)->getOptionsForAngle(angle);
+  return {};
 }
 
 /** Check whether per-angle transmission runs are specified
  * @return :: true if per-angle transmission runs are specified
  */
 bool ReflSettingsTabPresenter::hasPerAngleOptions(int group) const {
-  return m_settingsPresenters.at(group)->hasPerAngleOptions();
+  // return m_settingsPresenters.at(group)->hasPerAngleOptions();
+  return {};
 }
 
 /** Returns global options for 'CreateTransmissionWorkspaceAuto'
@@ -84,8 +75,8 @@ bool ReflSettingsTabPresenter::hasPerAngleOptions(int group) const {
 * @return :: Global options for 'CreateTransmissionWorkspaceAuto'
 */
 OptionsQMap ReflSettingsTabPresenter::getTransmissionOptions(int group) const {
-
-  return m_settingsPresenters.at(group)->getTransmissionOptions();
+  //  return m_settingsPresenters.at(group)->getTransmissionOptions();
+  return {};
 }
 
 /** Returns global options for 'ReflectometryReductionOneAuto'
@@ -94,8 +85,8 @@ OptionsQMap ReflSettingsTabPresenter::getTransmissionOptions(int group) const {
 * @return :: Global options for 'ReflectometryReductionOneAuto'
 */
 OptionsQMap ReflSettingsTabPresenter::getReductionOptions(int group) const {
-
-  return m_settingsPresenters.at(group)->getReductionOptions();
+  // return m_settingsPresenters.at(group)->getReductionOptions();
+  return {};
 }
 
 /** Returns global options for 'Stitch1DMany'
@@ -104,8 +95,8 @@ OptionsQMap ReflSettingsTabPresenter::getReductionOptions(int group) const {
 * @return :: Global options for 'Stitch1DMany'
 */
 std::string ReflSettingsTabPresenter::getStitchOptions(int group) const {
-
-  return m_settingsPresenters.at(group)->getStitchOptions();
+  //  return m_settingsPresenters.at(group)->getStitchOptions();
+  return {};
 }
 }
 }
diff --git a/qt/scientific_interfaces/ISISReflectometry/ReflSettingsTabPresenter.h b/qt/scientific_interfaces/ISISReflectometry/ReflSettingsTabPresenter.h
index c44bc8b248d849b44f72bcbaf0556c01de6e52a5..4225d98cbb4c3b9e0728b14332a82690ff80b3c5 100644
--- a/qt/scientific_interfaces/ISISReflectometry/ReflSettingsTabPresenter.h
+++ b/qt/scientific_interfaces/ISISReflectometry/ReflSettingsTabPresenter.h
@@ -3,6 +3,7 @@
 
 #include "DllConfig.h"
 #include "IReflSettingsTabPresenter.h"
+#include "IReflSettingsTabView.h"
 #include "IReflBatchPresenter.h"
 #include <vector>
 
@@ -42,18 +43,13 @@ class MANTIDQT_ISISREFLECTOMETRY_DLL ReflSettingsTabPresenter
     : public IReflSettingsTabPresenter {
 public:
   /// Constructor
-  ReflSettingsTabPresenter(std::vector<IReflSettingsPresenter *> presenters);
-  /// Destructor
-  ~ReflSettingsTabPresenter() override;
+  ReflSettingsTabPresenter(IReflSettingsTabView* view);
   /// Set the instrument name
   void setInstrumentName(const std::string &instName) override;
   void acceptMainPresenter(IReflBatchPresenter *mainPresenter) override;
   void settingsChanged(int group) override;
   void onReductionPaused(int group) override;
   void onReductionResumed(int group) override;
-  void
-  passSelfToChildren(std::vector<IReflSettingsPresenter *> const &children);
-
   /// Returns values passed for 'Transmission run(s)'
   MantidWidgets::DataProcessor::OptionsQMap
   getOptionsForAngle(int group, const double angle) const override;
@@ -70,7 +66,7 @@ public:
 
 private:
   /// The presenters for each group as a vector
-  std::vector<IReflSettingsPresenter *> m_settingsPresenters;
+  IReflSettingsTabView* m_view;
   IReflBatchPresenter *m_mainPresenter;
 };
 }
diff --git a/qt/scientific_interfaces/ISISReflectometry/Views/BatchView.cpp b/qt/scientific_interfaces/ISISReflectometry/Views/BatchView.cpp
index c00c8081894b94d0504d56607240d88331cf90f9..1fa4d4bf2f504579a91a185fc9a7cfc9fcb23248 100644
--- a/qt/scientific_interfaces/ISISReflectometry/Views/BatchView.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/Views/BatchView.cpp
@@ -1,4 +1,5 @@
 #include "BatchView.h"
+#include "../IndexOf.h"
 #include "MantidKernel/make_unique.h"
 #include "MantidKernel/ConfigService.h"
 #include "MantidQtWidgets/Common/AlgorithmHintStrategy.h"
@@ -174,11 +175,9 @@ BatchView *BatchViewFactory::operator()() const {
 }
 
 int BatchViewFactory::indexOfElseFirst(std::string const &instrument) const {
-  auto it = std::find(m_instruments.cbegin(), m_instruments.cend(), instrument);
-  if (it != m_instruments.cend())
-    return static_cast<int>(std::distance(m_instruments.cbegin(), it));
-  else
-    return 0;
+  return indexOf(m_instruments, [&instrument](std::string const &inst) {
+    return instrument == inst;
+  }).get_value_or(0);
 }
 
 int BatchViewFactory::defaultInstrumentFromConfig() const {