diff --git a/Framework/Algorithms/inc/MantidAlgorithms/PolarizationCorrectionFredrikze.h b/Framework/Algorithms/inc/MantidAlgorithms/PolarizationCorrectionFredrikze.h
index c3863161326e45270419234230d681e2cbcc4728..dfe01f99b725bc541a3b8dec8cb0c756a86b3092 100644
--- a/Framework/Algorithms/inc/MantidAlgorithms/PolarizationCorrectionFredrikze.h
+++ b/Framework/Algorithms/inc/MantidAlgorithms/PolarizationCorrectionFredrikze.h
@@ -16,7 +16,7 @@ namespace Algorithms {
 /** PolarizationCorrectionFredrikze : Algorithm to perform polarisation
  corrections on
  multi-period group workspaces that implements the Fredrikze (Dutch) method.
- Fredrikze, H, et al. “Calibration of a polarized neutron reflectometer” Physica
+ Fredrikze, H, et al. "Calibration of a polarized neutron reflectometer" Physica
  B 297 (2001)
 
  Copyright © 2014 ISIS Rutherford Appleton Laboratory, NScD Oak Ridge
diff --git a/Framework/Algorithms/inc/MantidAlgorithms/RebinToWorkspace.h b/Framework/Algorithms/inc/MantidAlgorithms/RebinToWorkspace.h
index 4ca034ea697ad363499b4af25422f3abef0135ef..0483c8ba902d6f5832bdd47a9e8ca3589278051a 100644
--- a/Framework/Algorithms/inc/MantidAlgorithms/RebinToWorkspace.h
+++ b/Framework/Algorithms/inc/MantidAlgorithms/RebinToWorkspace.h
@@ -20,9 +20,6 @@ namespace Algorithms {
    <LI>OutputWorkspace - The name of the output workspace</LI>
    </UL>
 
-   @author Martyn Gigg, Tessella Support Services plc
-   @date 19/01/2009
-
    Copyright &copy; 2009 ISIS Rutherford Appleton Laboratory, NScD Oak Ridge
    National Laboratory & European Spallation Source
 
@@ -69,14 +66,20 @@ protected:
       const override;
 
 private:
+  bool m_preserveEvents{true};
+  bool m_isEvents{true};
+
   /// Initialisation code
   void init() override;
   /// Execution code
   void exec() override;
 
-  /// Create the rebin paraeters
-  std::vector<double>
-  createRebinParameters(Mantid::API::MatrixWorkspace_sptr toMatch);
+  bool needToRebin(const API::MatrixWorkspace_sptr &left,
+                   const API::MatrixWorkspace_sptr &rght);
+  void rebin(API::MatrixWorkspace_sptr &toRebin,
+             API::MatrixWorkspace_sptr &toMatch);
+  void histogram(API::MatrixWorkspace_sptr &toRebin,
+                 API::MatrixWorkspace_sptr &toMatch);
 };
 } // namespace Algorithms
 } // namespace Mantid
diff --git a/Framework/Algorithms/src/ConvertToMatrixWorkspace.cpp b/Framework/Algorithms/src/ConvertToMatrixWorkspace.cpp
index 41f179a671d1b75ae08e52209b147841d9c50ce1..6cc1f8b98d04d0a2774b1d30c83c7de1aaeaf8c8 100644
--- a/Framework/Algorithms/src/ConvertToMatrixWorkspace.cpp
+++ b/Framework/Algorithms/src/ConvertToMatrixWorkspace.cpp
@@ -63,10 +63,17 @@ void ConvertToMatrixWorkspace::exec() {
     }
     PARALLEL_CHECK_INTERUPT_REGION
   } else {
-    g_log.information() << "Input workspace does not need converting. Pointing "
-                           "OutputWorkspace property to input.\n";
-    outputWorkspace =
-        boost::const_pointer_cast<MatrixWorkspace>(inputWorkspace);
+    outputWorkspace = getProperty("OutputWorkspace");
+    if (inputWorkspace == outputWorkspace) {
+      g_log.information("InputWorkspace does not need converting. Pointing "
+                        "OutputWorkspace property to input.");
+      outputWorkspace =
+          boost::const_pointer_cast<MatrixWorkspace>(inputWorkspace);
+    } else {
+      g_log.information(
+          "InputWorkspace does not need converting. Cloning InputWorkspace.");
+      outputWorkspace = inputWorkspace->clone();
+    }
   }
 
   setProperty("OutputWorkspace", outputWorkspace);
diff --git a/Framework/Algorithms/src/RebinToWorkspace.cpp b/Framework/Algorithms/src/RebinToWorkspace.cpp
index 6863f8cb7f57188e7bd8283b8ec491d2f4b0097c..3e96604f6bc0eaebbdc9e8adc36f00f14ff4bc70 100644
--- a/Framework/Algorithms/src/RebinToWorkspace.cpp
+++ b/Framework/Algorithms/src/RebinToWorkspace.cpp
@@ -1,11 +1,19 @@
 #include "MantidAlgorithms/RebinToWorkspace.h"
 #include "MantidAPI/HistogramValidator.h"
 #include "MantidAPI/MatrixWorkspace.h"
+#include "MantidDataObjects/EventWorkspace.h"
+#include "MantidDataObjects/Workspace2D.h"
+#include "MantidDataObjects/WorkspaceCreation.h"
+#include "MantidHistogramData/Rebin.h"
 
 namespace Mantid {
 namespace Algorithms {
 
 using namespace API;
+using DataObjects::EventWorkspace;
+using DataObjects::EventWorkspace_const_sptr;
+using HistogramData::CountStandardDeviations;
+using HistogramData::Counts;
 
 // Register the algorithm into the AlgorithmFactory
 DECLARE_ALGORITHM(RebinToWorkspace)
@@ -43,6 +51,31 @@ void RebinToWorkspace::init() {
                   "Workspace2D histogram.");
 }
 
+bool RebinToWorkspace::needToRebin(const MatrixWorkspace_sptr &left,
+                                   const MatrixWorkspace_sptr &rght) {
+  // converting from EventWorkspace to Workspace2D is a rebin
+  if (m_isEvents && (!m_preserveEvents))
+    return true;
+
+  // if pointers match they are the same object
+  if (left == rght)
+    return false;
+
+  // see if there is the same number of histograms
+  const size_t numHist = left->getNumberHistograms();
+  if (numHist != rght->getNumberHistograms())
+    return true;
+
+  // look for first non-equal x-axis between the workspaces
+  for (size_t i = 0; i < numHist; ++i) {
+    if (left->getSpectrum(i).x() != rght->getSpectrum(i).x()) {
+      return true;
+    }
+  }
+  // everything must be the same
+  return false;
+}
+
 /**
  * Execute the algorithm
  */
@@ -50,48 +83,101 @@ void RebinToWorkspace::exec() {
   // The input workspaces ...
   MatrixWorkspace_sptr toRebin = getProperty("WorkspaceToRebin");
   MatrixWorkspace_sptr toMatch = getProperty("WorkspaceToMatch");
-  bool PreserveEvents = getProperty("PreserveEvents");
-
-  // First we need to create the parameter vector from the workspace with which
-  // we are matching
-  std::vector<double> rb_params = createRebinParameters(toMatch);
-
-  IAlgorithm_sptr runRebin = createChildAlgorithm("Rebin");
-  runRebin->setProperty<MatrixWorkspace_sptr>("InputWorkspace", toRebin);
-  runRebin->setPropertyValue("OutputWorkspace", "rebin_out");
-  runRebin->setProperty("params", rb_params);
-  runRebin->setProperty("PreserveEvents", PreserveEvents);
-  runRebin->setProperty("IgnoreBinErrors", true);
-  runRebin->executeAsChildAlg();
-  progress(1);
-  MatrixWorkspace_sptr ws = runRebin->getProperty("OutputWorkspace");
-  setProperty("OutputWorkspace", ws);
+  m_preserveEvents = getProperty("PreserveEvents");
+  m_isEvents = bool(boost::dynamic_pointer_cast<const EventWorkspace>(toRebin));
+
+  if (needToRebin(toRebin, toMatch)) {
+    g_log.information("Rebinning");
+    if (m_isEvents && (!m_preserveEvents)) {
+      this->histogram(toRebin, toMatch);
+    } else {
+      this->rebin(toRebin, toMatch);
+    }
+  } else { // don't need to rebin
+    g_log.information(
+        "WorkspaceToRebin and WorkspaceToMatch already have matched binning");
+
+    MatrixWorkspace_sptr outputWS = getProperty("OutputWorkspace");
+    const bool inPlace = (toRebin == outputWS);
+    if (!inPlace) {
+      outputWS = toRebin->clone();
+    }
+    this->setProperty("OutputWorkspace", outputWS);
+  }
 }
 
-/**
- * Create the vector of rebin parameters
- * @param toMatch :: A shared pointer to the workspace with the desired binning
- * @returns :: A vector to hold the rebin parameters once they have been
- * calculated
- */
-std::vector<double> RebinToWorkspace::createRebinParameters(
-    Mantid::API::MatrixWorkspace_sptr toMatch) {
-  using namespace Mantid::API;
-
-  auto &matchXdata = toMatch->x(0);
-  // params vector should have the form [x_1, delta_1,x_2, ...
-  // ,x_n-1,delta_n-1,x_n), see Rebin.cpp
-  std::vector<double> rb_params;
-  int xsize = static_cast<int>(matchXdata.size());
-  rb_params.reserve(xsize * 2);
-  for (int i = 0; i < xsize; ++i) {
-    // bin bound
-    rb_params.push_back(matchXdata[i]);
-    // Bin width
-    if (i < xsize - 1)
-      rb_params.push_back(matchXdata[i + 1] - matchXdata[i]);
+// this follows closely what Rebin does except each x-axis is different
+void RebinToWorkspace::rebin(MatrixWorkspace_sptr &toRebin,
+                             MatrixWorkspace_sptr &toMatch) {
+  // create the output workspace
+  MatrixWorkspace_sptr outputWS = getProperty("OutputWorkspace");
+  const bool inPlace = (toRebin == outputWS);
+  if (!inPlace) {
+    outputWS = toRebin->clone();
+  }
+  auto outputWSEvents = boost::dynamic_pointer_cast<EventWorkspace>(outputWS);
+
+  const int numHist = static_cast<int>(toRebin->getNumberHistograms());
+  Progress prog(this, 0.5, 1.0, numHist);
+
+  // everything gets the same bin boundaries as the first spectrum
+  const bool matchingX =
+      (toRebin->getNumberHistograms() != toMatch->getNumberHistograms());
+
+  // rebin
+  PARALLEL_FOR_IF(Kernel::threadSafe(*toMatch, *outputWS))
+  for (int i = 0; i < numHist; ++i) {
+    PARALLEL_START_INTERUPT_REGION
+    const auto &edges = matchingX ? toMatch->histogram(0).binEdges()
+                                  : toMatch->histogram(i).binEdges();
+    if (m_isEvents) {
+      outputWSEvents->getSpectrum(i).setHistogram(edges);
+    } else {
+      outputWS->setHistogram(
+          i, HistogramData::rebin(toRebin->histogram(i), edges));
+    }
+    prog.report();
+    PARALLEL_END_INTERUPT_REGION
+  }
+  PARALLEL_CHECK_INTERUPT_REGION
+
+  setProperty("OutputWorkspace", outputWS);
+}
+
+// handles the special case when binning from EventWorkspace to Workspace2D most
+// efficiently by histogramming the events to the correct binning directly
+void RebinToWorkspace::histogram(API::MatrixWorkspace_sptr &toRebin,
+                                 API::MatrixWorkspace_sptr &toMatch) {
+  const auto &inputWS =
+      boost::dynamic_pointer_cast<const EventWorkspace>(toRebin);
+  const int numHist = static_cast<int>(toRebin->getNumberHistograms());
+  // everything gets the same bin boundaries as the first spectrum
+  const bool matchingX =
+      (toRebin->getNumberHistograms() != toMatch->getNumberHistograms());
+
+  auto outputWS = DataObjects::create<API::HistoWorkspace>(*toRebin);
+  Progress prog(this, 0.25, 1.0, numHist);
+
+  // histogram
+  PARALLEL_FOR_IF(Kernel::threadSafe(*toMatch, *outputWS))
+  for (int i = 0; i < numHist; ++i) {
+    PARALLEL_START_INTERUPT_REGION
+    const auto &edges = matchingX ? toMatch->histogram(0).binEdges()
+                                  : toMatch->histogram(i).binEdges();
+
+    // TODO this should be in HistogramData/Rebin
+    const auto &eventlist = inputWS->getSpectrum(i);
+    MantidVec y_data(edges.size() - 1), e_data(edges.size() - 1);
+    eventlist.generateHistogram(edges.rawData(), y_data, e_data);
+
+    outputWS->setHistogram(i, edges, Counts(std::move(y_data)),
+                           CountStandardDeviations(std::move(e_data)));
+    prog.report();
+    PARALLEL_END_INTERUPT_REGION
   }
-  return rb_params;
+  PARALLEL_CHECK_INTERUPT_REGION
+
+  setProperty("OutputWorkspace", std::move(outputWS));
 }
 
 Parallel::ExecutionMode RebinToWorkspace::getParallelExecutionMode(
diff --git a/Framework/HistogramData/inc/MantidHistogramData/FixedLengthVector.h b/Framework/HistogramData/inc/MantidHistogramData/FixedLengthVector.h
index 53cb5f7dc9b564ea7f6104a00a589ad8651e1c46..76c0a60cfe4dc817702e23600dfeb0f23361b8d3 100644
--- a/Framework/HistogramData/inc/MantidHistogramData/FixedLengthVector.h
+++ b/Framework/HistogramData/inc/MantidHistogramData/FixedLengthVector.h
@@ -109,6 +109,10 @@ public:
     return this->rawData() == rhs.rawData();
   }
 
+  bool operator!=(const FixedLengthVector<T> &rhs) const {
+    return !(*this == rhs);
+  }
+
   bool empty() const { return m_data.empty(); }
   size_t size() const { return m_data.size(); }
 
diff --git a/Framework/PythonInterface/plugins/algorithms/AlignAndFocusPowderFromFiles.py b/Framework/PythonInterface/plugins/algorithms/AlignAndFocusPowderFromFiles.py
index b8780a2067ff32aae20acc3a254ed99affc39bac..49d7a709ef704f78ccb21e360d88d750758941a0 100644
--- a/Framework/PythonInterface/plugins/algorithms/AlignAndFocusPowderFromFiles.py
+++ b/Framework/PythonInterface/plugins/algorithms/AlignAndFocusPowderFromFiles.py
@@ -208,12 +208,15 @@ class AlignAndFocusPowderFromFiles(DistributedDataProcessorAlgorithm):
             numSteps = 7 # one more for accumulating the unfocused workspace
         self.log().information('Processing \'{}\' in {:d} chunks'.format(filename, len(chunks)))
         prog_per_chunk_step = self.prog_per_file * 1./(numSteps*float(len(chunks)))
+        unfocusname_chunk = ''
 
         # inner loop is over chunks
         for (j, chunk) in enumerate(chunks):
             prog_start = file_prog_start + float(j) * float(numSteps - 1) * prog_per_chunk_step
             chunkname = '{}_c{:d}'.format(wkspname, j)
-            unfocusname_chunk = '{}_c{:d}'.format(unfocusname, j)
+            if unfocusname != '':  # only create unfocus chunk if needed
+                unfocusname_chunk = '{}_c{:d}'.format(unfocusname, j)
+
             Load(Filename=filename, OutputWorkspace=chunkname,
                  startProgress=prog_start, endProgress=prog_start+prog_per_chunk_step,
                  **chunk)
diff --git a/MantidPlot/CMakeLists.txt b/MantidPlot/CMakeLists.txt
index fe07186cd02361ac368ccf5f5556260b00f4143a..00092f3890bd6f8918d5c1cbca4de1736e97513f 100644
--- a/MantidPlot/CMakeLists.txt
+++ b/MantidPlot/CMakeLists.txt
@@ -905,6 +905,7 @@ set ( MANTIDPLOT_TEST_PY_FILES
     MantidPlotTiledWindowTest.py
     MantidPlotInputArgsCheck.py
     MantidPlotProjectRecovery.py
+    TSVSerialiserTest.py
 )
 
 if ( MAKE_VATES )
diff --git a/MantidPlot/test/TSVSerialiserTest.py b/MantidPlot/test/TSVSerialiserTest.py
new file mode 100644
index 0000000000000000000000000000000000000000..eb101e6aa76d6db2798e8889fb0cf43488bc864b
--- /dev/null
+++ b/MantidPlot/test/TSVSerialiserTest.py
@@ -0,0 +1,68 @@
+import mantidqtpython
+import mantidplottests
+from mantidplottests import *
+
+
+class TSVSerialiserTest(unittest.TestCase):
+
+    def genLines(self):
+        tmp = mantidqtpython.MantidQt.API.TSVSerialiser()
+        tmp.writeLine("test")
+        tmp.storeDouble(1.1)
+        tmp.storeInt(2)
+
+        tmp.writeLine("line2")
+        tmp.storeString("Hello World")
+        tmp.storeBool(True)
+
+        return tmp.outputLines()
+
+    def test_lines(self):
+        lines = self.genLines()
+        load = mantidqtpython.MantidQt.API.TSVSerialiser(lines)
+        self.assertEqual(load.values("test")[0], "test")
+        self.assertEqual(load.values("test")[1], "1.1")
+        self.assertEqual(load.values("test")[2], "2")
+
+    def test_numbers(self):
+        lines = self.genLines()
+        load = mantidqtpython.MantidQt.API.TSVSerialiser(lines)
+        load.selectLine("test")
+        self.assertEqual(load.readDouble(), 1.1)
+        self.assertEqual(load.readInt(), 2)
+
+    def test_stringAndBool(self):
+        lines = self.genLines()
+        load = mantidqtpython.MantidQt.API.TSVSerialiser(lines)
+        load.selectLine("line2")
+        self.assertEqual(load.readString(), "Hello World")
+        self.assertEqual(load.readBool(), True)
+
+    def test_sections(self):
+        lines = self.genLines()
+        tmp = mantidqtpython.MantidQt.API.TSVSerialiser()
+        tmp.writeSection("Section", lines)
+        lines = tmp.outputLines()
+
+        tmp2 = mantidqtpython.MantidQt.API.TSVSerialiser()
+        tmp2.writeSection("Big", lines)
+        lines = tmp2.outputLines()
+
+        # read the sections back
+        load = mantidqtpython.MantidQt.API.TSVSerialiser(lines)
+        secs = load.sections("Big")
+        load = mantidqtpython.MantidQt.API.TSVSerialiser(secs[0])
+
+        secs = load.sections("Section")
+        load = mantidqtpython.MantidQt.API.TSVSerialiser(secs[0])
+
+        load.selectLine("test")
+        self.assertEqual(load.readDouble(), 1.1)
+        self.assertEqual(load.readInt(), 2)
+
+        load.selectLine("line2")
+        self.assertEqual(load.readString(), "Hello World")
+        self.assertEqual(load.readBool(), True)
+
+
+mantidplottests.runTests(TSVSerialiserTest)
diff --git a/buildconfig/CMake/SipQtTargetFunctions.cmake b/buildconfig/CMake/SipQtTargetFunctions.cmake
index 85c049f710054a0027fdd9698a5649090d320509..377131eb5cdb92fe4f55ea7ef6090b6b683501c7 100644
--- a/buildconfig/CMake/SipQtTargetFunctions.cmake
+++ b/buildconfig/CMake/SipQtTargetFunctions.cmake
@@ -54,7 +54,7 @@ function ( mtd_add_sip_module )
   endforeach ()
 
   # Add absolute paths for header dependencies
-  foreach ( _header ${PARSED_HEADER_DEPENDS} )
+  foreach ( _header ${PARSED_HEADER_DEPS} )
     if ( IS_ABSOLUTE ${_header} )
       list ( APPEND _sip_include_deps "${_header}" )
     else ()
diff --git a/dev-docs/source/AlgorithmMPISupport.rst b/dev-docs/source/AlgorithmMPISupport.rst
index 74d750cf64dea9777b7e147ad1aceec2809a8892..56b45185385a2584fa187cd30a507df7ac3f6f3c 100644
--- a/dev-docs/source/AlgorithmMPISupport.rst
+++ b/dev-docs/source/AlgorithmMPISupport.rst
@@ -372,7 +372,7 @@ The consequences are as follows:
   It should not be logged, written as output, or used for branching execution paths since it is meaningless.
   If the total number of spectra in a workspace is required it can be accessed via ``MatrixWorkspace::indexInfo()::globalSize()``.
 - User input providing indices or spectrum numbers in one way or another must be translated into local indices by ``IndexInfo``.
-  The most common cases are a workspace property that also accepts indices, see `IndexProperty <../concepts/IndexProperty.html>`__.
+  The most common cases are a workspace property that also accepts indices, see :ref:`IndexProperty <IndexProperty>`.
 - The distinction between local and global indices must not be exposed to the user.
   In particular, the 'global' prefix should be omitted, i.e., for the user interface we keep referring to 'workspace index', even though it is internally not what used to be the workspace index but rather a global index.
   Indices provided by a user may never be interpreted as local indices, since a local index has no fixed meaning.
diff --git a/dev-docs/source/GettingStartedWithPyCharm.rst b/dev-docs/source/GettingStartedWithPyCharm.rst
index e9103cd4db6f2854a9c92f91f96365e90d4d14e4..6169cefea8ec0bf1891d458682a6502e4b0a96cb 100644
--- a/dev-docs/source/GettingStartedWithPyCharm.rst
+++ b/dev-docs/source/GettingStartedWithPyCharm.rst
@@ -5,7 +5,7 @@ Getting Started with PyCharm
 
 PyCharm can be installed from `here <https://jetbrains.com/pycharm/download/>`_.
 
-This tutorial assumes you are familiar with the process of building Mantid (with separate source and build directories inside a root directory), and that you have built a working version. If you are unclear about this see `here <GettingStarted.html>`__
+This tutorial assumes you are familiar with the process of building Mantid (with separate source and build directories inside a root directory), and that you have built a working version. If you are unclear about this see :ref:`here <GettingStarted>`.
 
 .. contents::
   :local:
diff --git a/dev-docs/source/MVPTutorial/AddButton.rst b/dev-docs/source/MVPTutorial/AddButton.rst
index f4a07fbdce9ad2d2ab49b912447d29462e058e96..02859664429033359b9dac90e9ef940157a6fcdb 100644
--- a/dev-docs/source/MVPTutorial/AddButton.rst
+++ b/dev-docs/source/MVPTutorial/AddButton.rst
@@ -1,3 +1,5 @@
+.. _AddButton:
+
 ===============
 Adding a Button
 ===============
@@ -10,7 +12,7 @@ The View
 The below code creates a QWidget containing a single button. When the
 button is pressed it will print a message to the terminal screen. It
 should be noted that in practice this should be avoided and will be
-discussed in `this section <ReceivingSignalFromView.html>`_.
+discussed in :ref:`this section <ReceivingSignalFromView>`.
 
 First we need to import the relevant packages, this includes PyQt.
 
@@ -36,24 +38,24 @@ Next we create a layout and add a button to it
 
 .. code-block:: python
 
-        grid = QtGui.QGridLayout()
-        self.button = QtGui.QPushButton('Hi', self)
-        self.button.setStyleSheet("background-color:lightgrey")
+    grid = QtGui.QGridLayout()
+    self.button = QtGui.QPushButton('Hi', self)
+    self.button.setStyleSheet("background-color:lightgrey")
 
-        # connect button to signal
-        self.button.clicked.connect(self.btn_click)
-	# add button to layout
-	grid.addWidget(self.button)
-	# set the layout for the view widget
-	self.setLayout(grid)
+    # connect button to signal
+    self.button.clicked.connect(self.btn_click)
+    # add button to layout
+    grid.addWidget(self.button)
+    # set the layout for the view widget
+    self.setLayout(grid)
 
 The above connect statement means that when the button is pressed, the
 function ``btn_click`` is called:
 
 .. code-block:: python
 
-        def btn_click(self):
-            print("Hello world")
+    def btn_click(self):
+        print("Hello world")
 
 The Main
 ########
@@ -88,9 +90,9 @@ all been saved in ``view.py``, the ``main.py`` will contain:
     def qapp():
         if QtGui.QApplication.instance():
             _app = QtGui.QApplication.instance()
-	else:
+        else:
             _app = QtGui.QApplication(sys.argv)
-	return _app
+        return _app
 
     app = qapp()
     window = demo()
diff --git a/dev-docs/source/MVPTutorial/AddComboBox.rst b/dev-docs/source/MVPTutorial/AddComboBox.rst
index c7162460716359aa17f9c2dfe68f7254b97e3fc9..4789f4959444b9e477b03eee8cc48b912fe72d22 100644
--- a/dev-docs/source/MVPTutorial/AddComboBox.rst
+++ b/dev-docs/source/MVPTutorial/AddComboBox.rst
@@ -1,3 +1,5 @@
+.. _AddComboBox:
+
 ==============
 Add a ComboBox
 ==============
diff --git a/dev-docs/source/MVPTutorial/AddLineEdit.rst b/dev-docs/source/MVPTutorial/AddLineEdit.rst
index b2c4cbfb978dbacb16ca1bf1b80c9b17705f9d32..d95e920c911b4c100a69c8c6e720c94235fed504 100644
--- a/dev-docs/source/MVPTutorial/AddLineEdit.rst
+++ b/dev-docs/source/MVPTutorial/AddLineEdit.rst
@@ -18,6 +18,6 @@ edit (useful for tables).
 
 Care should be taken before using a line edit as it can give a user
 too much freedom. If you know that the input is an integer then a
-`spin box <AddSpinBox.html>`_ is better. If there is a finite list of
-possible options then a `combo box <AddComboBox.html>`_ would be a
+:ref:`spin box <AddSpinBox>` is better. If there is a finite list of
+possible options then a :ref:`combo box <AddComboBox>` would be a
 better choice.
diff --git a/dev-docs/source/MVPTutorial/AddSpinBox.rst b/dev-docs/source/MVPTutorial/AddSpinBox.rst
index 86a3abb414f4dc0d0d10f248a4c31e28368465eb..7439e693d5f29eb3810b030e221886aa895cf2fc 100644
--- a/dev-docs/source/MVPTutorial/AddSpinBox.rst
+++ b/dev-docs/source/MVPTutorial/AddSpinBox.rst
@@ -1,3 +1,5 @@
+.. _AddSpinBox:
+
 ==============
 Add a Spin Box
 ==============
diff --git a/dev-docs/source/MVPTutorial/CompleteGUI.rst b/dev-docs/source/MVPTutorial/CompleteGUI.rst
index c3e4ae7d61667851514f40fba3d81be7ff8145da..a9239d0edfbdb2a03cb737533f024eab5406056e 100644
--- a/dev-docs/source/MVPTutorial/CompleteGUI.rst
+++ b/dev-docs/source/MVPTutorial/CompleteGUI.rst
@@ -41,9 +41,9 @@ Main module
         def qapp():
             if QtGui.QApplication.instance():
                 _app = QtGui.QApplication.instance()
-	    else:
-		_app = QtGui.QApplication(sys.argv)
-	    return _app
+            else:
+                _app = QtGui.QApplication(sys.argv)
+            return _app
 
     app = qapp()
     window = demo()
@@ -82,10 +82,10 @@ Master View
 
             self.setLayout(grid)
 
-	def getOptionView(self):
+        def getOptionView(self):
             return self.options_view
 
-	def getPlotView(self):
+        def getPlotView(self):
             return self.plot_view
 
 Master Presenter
@@ -114,13 +114,13 @@ Master Presenter
         # connect statements
         self.view.getOptionView().plotSignal.connect(self.updatePlot)             
        
-	# handle signals 
-	def updatePlot(self):
-	    # only care about the colour if the button is pressed
-	    colour, freq,phi = self.presenter.getPlotInfo()
-	    grid_lines = self.presenter.getGridLines()
+        # handle signals 
+        def updatePlot(self):
+            # only care about the colour if the button is pressed
+            colour, freq,phi = self.presenter.getPlotInfo()
+            grid_lines = self.presenter.getGridLines()
  
-	    self.data_model.genData(freq,phi )
+            self.data_model.genData(freq,phi )
             x_data = self.data_model.getXData()
             y_data = self.data_model.getYData()
  
@@ -140,13 +140,13 @@ Plot Presenter
         def __init__(self, view):
             self.view = view
 
-	def plot(self, x_data, y_data, grid_lines, colour_code):
+        def plot(self, x_data, y_data, grid_lines, colour_code):
             self.view.addData(x_data, y_data, grid_lines, colour_code, "x")
 
 PlotView
 ########
 
-Unchanged from `Matplotlib and MVP <Matplotlib.html>`_.
+Unchanged from :ref:`Matplotlib and MVP <Matplotlib>`.
 
 Presenter
 #########
@@ -160,20 +160,20 @@ Presenter
 
         def __init__(self, view, colours):
             self.view = view
-	    self.view.setColours(colours)
+            self.view.setColours(colours)
        
-	def getPlotInfo(self):
+        def getPlotInfo(self):
             return str(self.view.getColour()), self.view.getFreq(), self.view.getPhase()
 
-	def getGridLines(self):
+        def getGridLines(self):
             return self.view.getGridLines()
 
 View
 ####
 
-Unchanged from `Model Exercise Solution <ModelExerciseSolution.html>`_.
+Unchanged from :ref:`Model Exercise Solution <ModelExerciseSolution>`.
 
 Model
 #####
 
-Unchanged from `Model Exercise Solution <ModelExerciseSolution.html>`_.
+Unchanged from :ref:`Model Exercise Solution <ModelExerciseSolution>`.
diff --git a/dev-docs/source/MVPTutorial/ExtractInfoFromView.rst b/dev-docs/source/MVPTutorial/ExtractInfoFromView.rst
index eed9386f820c81fdfccccef6942af7cc7d52e47c..df1935253571a129b343d176096aba7f2e4becc8 100644
--- a/dev-docs/source/MVPTutorial/ExtractInfoFromView.rst
+++ b/dev-docs/source/MVPTutorial/ExtractInfoFromView.rst
@@ -19,7 +19,7 @@ be used.
 
         doSomethingSignal = QtCore.pyqtSignal()
 
-	def __init__(self, parent=None):
+        def __init__(self, parent=None):
             super(view, self).__init__(parent)
 
             self.button = QtGui.QPushButton('Hi', self)
@@ -45,12 +45,12 @@ be used.
             # set the layout for the view widget
             self.setLayout(grid)
  
-	#send signals
-	def btn_click(self):
+        #send signals
+        def btn_click(self):
             print ("hellow from view")
-	    self.doSomethingSignal.emit()
+            self.doSomethingSignal.emit()
 
-	def getValue(self):
+            def getValue(self):
             return float(self.value.text())
 
 The last function ``getValue`` returns the value of the line
diff --git a/dev-docs/source/MVPTutorial/Layouts.rst b/dev-docs/source/MVPTutorial/Layouts.rst
index 43a1bba04cb2032638c4c7493cfe7e90c15d987e..5ee72e115d3cace477be7116f50d9e599f08040a 100644
--- a/dev-docs/source/MVPTutorial/Layouts.rst
+++ b/dev-docs/source/MVPTutorial/Layouts.rst
@@ -19,15 +19,15 @@ In the View we will replace the ``__init__`` with the following:
     def __init__(self, parent=None):
         super(view, self).__init__(parent)
 
-	self.button = QtGui.QPushButton('Hi', self)
-	self.button.setStyleSheet("background-color:lightgrey")
+        self.button = QtGui.QPushButton('Hi', self)
+        self.button.setStyleSheet("background-color:lightgrey")
 
-	# connect button to signal
-	self.button.clicked.connect(self.btn_click)
+        # connect button to signal
+        self.button.clicked.connect(self.btn_click)
         self.label = QtGui.QLabel()
         self.label.setText("Button")
 
-	# add widgets to layout
+        # add widgets to layout
         self.sub_layout = QtGui.QHBoxLayout()
         self.sub_layout.addWidget(self.label)
         self.sub_layout.addWidget(self.button)
@@ -36,4 +36,4 @@ In the View we will replace the ``__init__`` with the following:
         grid.addLayout(self.sub_layout)
 
         # set the layout for the view widget
-	self.setLayout(grid)
+        self.setLayout(grid)
diff --git a/dev-docs/source/MVPTutorial/Matplotlib.rst b/dev-docs/source/MVPTutorial/Matplotlib.rst
index 22972a4f8a83c403fd2c561d9e9517c48ae32514..8aebb04c8335fb36b260f28fadd87f275a99091f 100644
--- a/dev-docs/source/MVPTutorial/Matplotlib.rst
+++ b/dev-docs/source/MVPTutorial/Matplotlib.rst
@@ -1,3 +1,5 @@
+.. _Matplotlib:
+
 ==================
 Matplotlib and MVP
 ==================
@@ -43,29 +45,29 @@ the plot and creating an empty plot (no data).
         def __init__(self, parent=None):
             super(PlotView, self).__init__(parent)
 
-	    self.figure = plt.figure()
-	    grid = QtGui.QVBoxLayout(self)
-	    self.draw() 
-	    self.canvas = self.getWidget()
-	    grid.addWidget(self.canvas)
-	    self.setLayout(grid) 
+            self.figure = plt.figure()
+            grid = QtGui.QVBoxLayout(self)
+            self.draw() 
+            self.canvas = self.getWidget()
+            grid.addWidget(self.canvas)
+            self.setLayout(grid) 
 
-	def draw(self):
+        def draw(self):
             ax = self.figure.add_subplot(111)
-	    ax.clear()
-	    ax.set_xlim([0.0, 10.5])
-	    ax.set_ylim([-1.05, 1.05])
-	    ax.set_xlabel("time ($s$)")
-	    ax.set_ylabel("$f(t)$")
-	    return ax
-
-	def getWidget(self):
+            ax.clear()
+            ax.set_xlim([0.0, 10.5])
+            ax.set_ylim([-1.05, 1.05])
+            ax.set_xlabel("time ($s$)")
+            ax.set_ylabel("$f(t)$")
+            return ax
+
+        def getWidget(self):
             return FigureCanvas(self.figure)
 
-	def addData(self, xvalues, yvalues, colour, marker):
+        def addData(self, xvalues, yvalues, colour, marker):
             ax = self.draw()
-	    ax.plot(xvalues, yvalues, color=colour, marker=marker, linestyle="--") 
-	    self.canvas.draw()
+            ax.plot(xvalues, yvalues, color=colour, marker=marker, linestyle="--") 
+            self.canvas.draw()
 
 The ``draw`` method creates the plot area without any data. The widget
 is obtained from the ``getWidget`` function. The final method adds
diff --git a/dev-docs/source/MVPTutorial/Mocking.rst b/dev-docs/source/MVPTutorial/Mocking.rst
index 631779fc777d6831a48419696f10ddbfc372666e..30d902219d33b74a43699d1ee9447a13bd17612c 100644
--- a/dev-docs/source/MVPTutorial/Mocking.rst
+++ b/dev-docs/source/MVPTutorial/Mocking.rst
@@ -36,14 +36,14 @@ The test class is then initialised:
 
     class presenterTest(unittest.TestCase):
         def setUp(self):
-	    self.view = mock.create_autospec(view.view)
-
-	    # mock view
-	    self.view.doSomethingSignal = mock.Mock()
-	    self.view.btn_click = mock.Mock()
-	    self.view.getValue = mock.Mock(return_value=3.14)
+            self.view = mock.create_autospec(view.view)
+        
+            # mock view
+            self.view.doSomethingSignal = mock.Mock()
+            self.view.btn_click = mock.Mock()
+            self.view.getValue = mock.Mock(return_value=3.14)
        
-	    self.presenter = presenter.Presenter(self.view)
+            self.presenter = presenter.Presenter(self.view)
 
 ``create_autospec`` mocks the class contained within the brackets. We
 then need to explicitly mock the methods using ``mock.Mock``. In
diff --git a/dev-docs/source/MVPTutorial/MockingExercise.rst b/dev-docs/source/MVPTutorial/MockingExercise.rst
index 1770a54c068c818bde111f9bcd4c8da033d74c87..d8af6726d7a8b7cb0f9250655c22161db255f96d 100644
--- a/dev-docs/source/MVPTutorial/MockingExercise.rst
+++ b/dev-docs/source/MVPTutorial/MockingExercise.rst
@@ -8,4 +8,4 @@ mocked and the return values should be present only when necessary (on
 this occasion the values do not matter). The ``updatePlot`` function
 should be tested to make sure that it calls the correct methods.
 
-See `here <MockingExerciseSolution.html>`_ for the solution. 
+See :ref:`here <MockingExerciseSolution>` for the solution. 
diff --git a/dev-docs/source/MVPTutorial/MockingExerciseSolution.rst b/dev-docs/source/MVPTutorial/MockingExerciseSolution.rst
index 14f8be65e83fc8d13e15fc7b36a982a4ef1222e9..36edb80de469c222f8d44c4792be91a5e0b4c010 100644
--- a/dev-docs/source/MVPTutorial/MockingExerciseSolution.rst
+++ b/dev-docs/source/MVPTutorial/MockingExerciseSolution.rst
@@ -1,3 +1,5 @@
+.. _MockingExerciseSolution:
+
 =========================
 Mocking Exercise Solution
 =========================
@@ -20,25 +22,25 @@ Mocking Exercise Solution
         def setUp(self):
             self.view = mock.create_autospec(view.view)
 
-	    # mock view
-	    self.view.plotSignal = mock.Mock()
-	    self.view.getColour = mock.Mock(return_value="black")
-	    self.view.getGridLines =mock.Mock(return_value=True)
-	    self.view.getFreq =mock.Mock(return_value=3.14)
-	    self.view.getPhase =mock.Mock(return_value=0.56)
-	    self.view.buttonPressed = mock.Mock()
-	    self.view.setTableRow = mock.Mock()
-	    self.view.addWidgetToTable = mock.Mock()
-	    self.view.addITemToTable = mock.Mock()
-
-	    self.presenter = presenter.Presenter(self.view)
+            # mock view
+            self.view.plotSignal = mock.Mock()
+            self.view.getColour = mock.Mock(return_value="black")
+            self.view.getGridLines =mock.Mock(return_value=True)
+            self.view.getFreq =mock.Mock(return_value=3.14)
+            self.view.getPhase =mock.Mock(return_value=0.56)
+            self.view.buttonPressed = mock.Mock()
+            self.view.setTableRow = mock.Mock()
+            self.view.addWidgetToTable = mock.Mock()
+            self.view.addITemToTable = mock.Mock()
+        
+            self.presenter = presenter.Presenter(self.view)
 
         def test_updatePlot(self):
             self.presenter.updatePlot()
-	    assert(self.view.getColour.call_count == 1)
-	    assert(self.view.getGridLines.call_count == 1)
-	    assert(self.view.getFreq.call_count == 1)
-	    assert(self.view.getPhase.call_count == 1)
+            assert(self.view.getColour.call_count == 1)
+            assert(self.view.getGridLines.call_count == 1)
+            assert(self.view.getFreq.call_count == 1)
+            assert(self.view.getPhase.call_count == 1)
 
     if __name__ == "__main__":
         unittest.main()
diff --git a/dev-docs/source/MVPTutorial/Model.rst b/dev-docs/source/MVPTutorial/Model.rst
index ea0df87b65c0d2471587feb8503150b35b961cbf..4585143ff7706ef8f4f3959bc907e1d07bdef2fa 100644
--- a/dev-docs/source/MVPTutorial/Model.rst
+++ b/dev-docs/source/MVPTutorial/Model.rst
@@ -17,15 +17,15 @@ The first model generates the data for the user:
 
         def __init__(self):
             self.x_data = np.linspace(0.0, 10.0, 100)
-	    self.y_data = []
- 
-	def genData(self, freq, phi):
+            self.y_data = []
+
+        def genData(self, freq, phi):
             self.y_data = np.sin(freq * self.x_data + phi)
 
-	def getXData(self):
-	    return self.x_data
+        def getXData(self):
+            return self.x_data
 
-	def getYData(self):
+        def getYData(self):
             return self.y_data
 
 The model methods can be split into three types initialisation, a
diff --git a/dev-docs/source/MVPTutorial/ModelExercise.rst b/dev-docs/source/MVPTutorial/ModelExercise.rst
index c3559b53d9ea1a8c77e8b0452b3bfbb2d25f18b3..bb4a390d637428329683eef4470f05c0e9d4a3f4 100644
--- a/dev-docs/source/MVPTutorial/ModelExercise.rst
+++ b/dev-docs/source/MVPTutorial/ModelExercise.rst
@@ -15,4 +15,4 @@ input values
 3. In the initialisation of the Presenter get the allowed colours from
 the Model and pass them to the View
 
-See `here <ModelExerciseSolution.html>`_ for the solution. 
+See :ref:`here <ModelExerciseSolution>` for the solution. 
diff --git a/dev-docs/source/MVPTutorial/ModelExerciseSolution.rst b/dev-docs/source/MVPTutorial/ModelExerciseSolution.rst
index 835bec9e2d275f6f43ac8f0710cab937f7c0dc8c..b360252a41f99ab5142108717e96c9552e23734e 100644
--- a/dev-docs/source/MVPTutorial/ModelExerciseSolution.rst
+++ b/dev-docs/source/MVPTutorial/ModelExerciseSolution.rst
@@ -1,3 +1,5 @@
+.. _ModelExerciseSolution:
+
 =======================
 Model Exercise Solution
 =======================
diff --git a/dev-docs/source/MVPTutorial/MultipleViews.rst b/dev-docs/source/MVPTutorial/MultipleViews.rst
index 115cf9916ace43097508371df0095f1808c9dee2..001f2b7ed68f09b1157e2251d5bb074cfd71b639 100644
--- a/dev-docs/source/MVPTutorial/MultipleViews.rst
+++ b/dev-docs/source/MVPTutorial/MultipleViews.rst
@@ -1,3 +1,5 @@
+.. _MultipleViews:
+
 ==============
 Multiple Views
 ==============
@@ -72,12 +74,12 @@ The main only needs to import the masterView:
             self.setCentralWidget(my_view)
             self.setWindowTitle("view tutorial")
 
-	def qapp():
+        def qapp():
             if QtGui.QApplication.instance():
                 _app = QtGui.QApplication.instance()
-	    else:
-		_app = QtGui.QApplication(sys.argv)
-	    return _app
+            else:
+                _app = QtGui.QApplication(sys.argv)
+            return _app
 
     app = qapp()
     window = demo()
diff --git a/dev-docs/source/MVPTutorial/PresenterExercise.rst b/dev-docs/source/MVPTutorial/PresenterExercise.rst
index de947f2237034a7af584a484d8a31eda8905d417..657e40b682bc189669b0191d4979dc04ab5ae471 100644
--- a/dev-docs/source/MVPTutorial/PresenterExercise.rst
+++ b/dev-docs/source/MVPTutorial/PresenterExercise.rst
@@ -15,4 +15,4 @@ is pressed the following should be output:
 
 The ``main`` module will also need updating to handle these changes.
 
-See `here <PresenterExerciseSolution.html>`_ for the solution. 
+See :ref:`here <PresenterExerciseSolution>` for the solution. 
diff --git a/dev-docs/source/MVPTutorial/PresenterExerciseSolution.rst b/dev-docs/source/MVPTutorial/PresenterExerciseSolution.rst
index a0cb6caedd2c6f08524f767eb5aa2c322c2aef09..8f8876197f1a0e7a6ce5229f6a24ef83b0241912 100644
--- a/dev-docs/source/MVPTutorial/PresenterExerciseSolution.rst
+++ b/dev-docs/source/MVPTutorial/PresenterExerciseSolution.rst
@@ -1,3 +1,5 @@
+.. _PresenterExerciseSolution:
+
 ===========================
 Presenter Exercise Solution
 ===========================
@@ -16,7 +18,7 @@ View
 
         plotSignal = QtCore.pyqtSignal()
 
-	def __init__(self, parent=None):
+        def __init__(self, parent=None):
             super(view, self).__init__(parent)
 
             grid = QtGui.QVBoxLayout(self)
@@ -52,37 +54,37 @@ View
 
             self.plot.clicked.connect(self.buttonPressed)
 
-	def getColour(self):
+        def getColour(self):
             return self.colours.currentText()
   
-	def getGridLines(self):
+        def getGridLines(self):
             return self.grid_lines.checkState() == QtCore.Qt.Checked
 
-	def getFreq(self):
+        def getFreq(self):
             return float(self.freq.text())
 
-	def getPhase(self):
+        def getPhase(self):
             return float(self.phi.text())
 
-	def buttonPressed(self):
+        def buttonPressed(self):
             self.plotSignal.emit()
 
-	def setTableRow(self, name, row):
+        def setTableRow(self, name, row):
             text = QtGui.QTableWidgetItem(name)
             text.setFlags(QtCore.Qt.ItemIsEnabled)
             col = 0
             self.table.setItem(row, col, text)
 
-     def addWidgetToTable(self, name, widget, row):
+        def addWidgetToTable(self, name, widget, row):
             self.setTableRow(name, row)
             col = 1
             self.table.setCellWidget(row, col, widget)
-
-     def addItemToTable(self, name, widget, row):
+        
+        def addItemToTable(self, name, widget, row):
             self.setTableRow(name, row)
             col = 1
             self.table.setItem(row, col, widget)
-
+    
 Presenter
 #########
 
@@ -93,18 +95,18 @@ Presenter
     class Presenter(object):
 
         # pass the view and model into the presenter
-	def __init__(self, view):
+        def __init__(self, view):
             self.view = view
 
-	    self.view.plotSignal.connect(self.updatePlot)             
+            self.view.plotSignal.connect(self.updatePlot)             
        
-	# handle signals 
-	def updatePlot(self):
+        # handle signals 
+        def updatePlot(self):
             print("The table settings are:")
-	    print("   colour     : " + str(self.view.getColour()))
-	    print("   Grid lines : " + str(self.view.getGridLines()))
-	    print("   Frequency  : " + str(self.view.getFreq()))
-	    print("   Phase      : " + str(self.view.getPhase()))
+            print("   colour     : " + str(self.view.getColour()))
+            print("   Grid lines : " + str(self.view.getGridLines()))
+            print("   Frequency  : " + str(self.view.getFreq()))
+            print("   Phase      : " + str(self.view.getPhase()))
 
 Main module
 ###########
@@ -136,12 +138,12 @@ Main module
             self.setCentralWidget(my_view)
             self.setWindowTitle("view tutorial")
 
-	def qapp():
-            if QtGui.QApplication.instance():
-                _app = QtGui.QApplication.instance()
-	    else:
-		_app = QtGui.QApplication(sys.argv)
-	    return _app
+    def qapp():
+        if QtGui.QApplication.instance():
+            _app = QtGui.QApplication.instance()
+        else:
+            _app = QtGui.QApplication(sys.argv)
+        return _app
 
     app = qapp()
     window = demo()
diff --git a/dev-docs/source/MVPTutorial/ReceivingSignalFromView.rst b/dev-docs/source/MVPTutorial/ReceivingSignalFromView.rst
index 5a6beb71c3f33e6b276219c6ac27c7f922488fa6..c4e701e28d6b40d6142bc423772805fc8f0cb2d3 100644
--- a/dev-docs/source/MVPTutorial/ReceivingSignalFromView.rst
+++ b/dev-docs/source/MVPTutorial/ReceivingSignalFromView.rst
@@ -1,8 +1,10 @@
+.. _ReceivingSignalFromView:
+
 ================================
 Receiving a signal from the view
 ================================
 
-In the `Add Button <AddButton.html>`_ section we had the response to a button press
+In the :ref:`Add Button <AddButton>` section we had the response to a button press
 within the View. In practice this is not a good implementation. If the
 response was more complicated then it would be difficult to maintain
 the View as it would become extremely long. Furthermore creating the
@@ -23,7 +25,7 @@ pressed. First we will start with the View:
 
         doSomethingSignal = QtCore.pyqtSignal()
 
-	def __init__(self, parent=None):
+        def __init__(self, parent=None):
             super(view, self).__init__(parent)
 
             self.button = QtGui.QPushButton('Hi', self)
@@ -44,10 +46,10 @@ pressed. First we will start with the View:
             # set the layout for the view widget
             self.setLayout(grid)
  
-	#send signals
-	def btn_click(self):
+        #send signals
+        def btn_click(self):
             print ("hellow from view")
-	    self.doSomethingSignal.emit()
+            self.doSomethingSignal.emit()
 
 The above code has two new additions. The first is the creation of a
 custom signal on line eight. It is also possible to pass objects with
@@ -67,13 +69,13 @@ custom signal from the View to its own function (``handleButton``).
     class Presenter(object):
 
         # pass the view and model into the presenter
-	def __init__(self, view):
+        def __init__(self, view):
             self.view = view
 
-	    self.view.doSomethingSignal.connect(self.handleButton)             
+            self.view.doSomethingSignal.connect(self.handleButton)             
        
-	# handle signals 
-	def handleButton(self):
+        # handle signals 
+        def handleButton(self):
             print("hello world, from the presenter")
 
 The main is now:
@@ -105,12 +107,12 @@ The main is now:
             self.setCentralWidget(my_view)
             self.setWindowTitle("view tutorial")
 
-	def qapp():
+        def qapp():
             if QtGui.QApplication.instance():
                 _app = QtGui.QApplication.instance()
-	    else:
-		_app = QtGui.QApplication(sys.argv)
-	    return _app
+            else:
+                _app = QtGui.QApplication(sys.argv)
+            return _app
 
 
     app = qapp()
diff --git a/dev-docs/source/MVPTutorial/ViewExercise1.rst b/dev-docs/source/MVPTutorial/ViewExercise1.rst
index d2311e122f03b45fea871d6b5d3eeab735c6de31..4a26bc22c789e6d038a56b0f7f671d668c91d239 100644
--- a/dev-docs/source/MVPTutorial/ViewExercise1.rst
+++ b/dev-docs/source/MVPTutorial/ViewExercise1.rst
@@ -17,7 +17,7 @@ plot. The table should include options for:
 
 The previous sections are not an exhaustive list of possible widgets.
 
-The pages `Matplotlib and MVP <Matplotlib.html>`_ and `MultipleView
-<MultipleViews.html>`_ will be useful for the exercise.
+The pages :ref:`Matplotlib and MVP <Matplotlib>` and :ref:`MultipleView
+<MultipleViews>` will be useful for the exercise.
 
-The solution can be found `here <ViewExercise1Solution.html>`_.
+The solution can be found :ref:`here <ViewExercise1Solution>`.
diff --git a/dev-docs/source/MVPTutorial/ViewExercise1Solution.rst b/dev-docs/source/MVPTutorial/ViewExercise1Solution.rst
index cc17fdfcdf3fe37e224e206f2951e23ae66a822a..c963551162ff1bec73d8bc9e78db38455d4f0c9a 100644
--- a/dev-docs/source/MVPTutorial/ViewExercise1Solution.rst
+++ b/dev-docs/source/MVPTutorial/ViewExercise1Solution.rst
@@ -1,3 +1,5 @@
+.. _ViewExercise1Solution:
+
 ========================
 View Exercise 1 Solution
 ========================
@@ -30,12 +32,12 @@ main.py
             self.setCentralWidget(my_view)
             self.setWindowTitle("view tutorial")
 
-	def qapp():
+        def qapp():
             if QtGui.QApplication.instance():
                 _app = QtGui.QApplication.instance()
-	    else:
-		_app = QtGui.QApplication(sys.argv)
-	    return _app
+            else:
+                _app = QtGui.QApplication(sys.argv)
+            return _app
 
     app = qapp()
     window = demo()
diff --git a/dev-docs/source/Standards/AlgorithmDocumentation.rst b/dev-docs/source/Standards/AlgorithmDocumentation.rst
index dc03d48a52c5f9caaebd04855dcdf63a71e309f0..0ee81e947ed4af8748f32518ac935e15d27184d9 100644
--- a/dev-docs/source/Standards/AlgorithmDocumentation.rst
+++ b/dev-docs/source/Standards/AlgorithmDocumentation.rst
@@ -10,7 +10,7 @@ Algorithm Documentation
 Summary
 =======
 
-This page deals with the specifics of how to document an algorithm. For a more general guide to the Mantid documentation system see `Documentation Guide For Devs <DocumentationGuideForDevs.html>`__.
+This page deals with the specifics of how to document an algorithm. For a more general guide to the Mantid documentation system see :ref:`Documentation Guide For Devs <DocumentationGuideForDevs>`.
 
 How to Document an Algorithm
 ============================
@@ -18,7 +18,7 @@ How to Document an Algorithm
 Algorithm documentation is stored in two places.
 
 * The code (.cpp / .h / .py) files: For strings that are needed in the GUI for tooltips etc.
-* The .rst file: For all other documentation, including the algorithm description and `usage examples <AlgorithmUsageExamples.html>`__.
+* The .rst file: For all other documentation, including the algorithm description and :ref:`usage examples <AlgorithmUsageExamples>`.
 
 The Code Files
 --------------
@@ -69,7 +69,7 @@ For example:
 Workflow algorithms
 ===================
 
-There should be a flow chart for workflow algorithms. See `here <FlowchartCreation.html>`__ on how to make one.
+There should be a flow chart for workflow algorithms. See :ref:`here <FlowchartCreation>` on how to make one.
 
 Algorithm Directives
 ====================
@@ -84,7 +84,7 @@ As the **Description** and **Usage** of an algorithm *cannot* be obtained automa
 
    .. summary::
 
-   .. alias::
+   .. relatedalgorithms::
 
    .. properties::
 
@@ -120,13 +120,16 @@ As the **Description** and **Usage** of an algorithm *cannot* be obtained automa
       return "Rebins data with new X bin boundaries. For EventWorkspaces, you can very quickly rebin in-place by keeping the same output name and PreserveEvents=true.";
    }
 
-``.. alias::``
-   This directive obtains aliases from the required ``alias`` method in the algorithm, for example, the following method is used in Rebin: 
+``.. relatedalgorithms::``
+   This directive obtains a list of related algorithms from the ``seeAlso`` and ``alias`` methods in the algorithm, for example, the following ``seeAlso`` is used in Rebin: 
 
 .. code-block:: c++
 
-   /// Algorithm's aliases
-   const std::string alias() const override { return "rebin"; }
+   /// Algorithm's seeAlso
+   const std::vector<std::string> seeAlso() const override {
+    return {"RebinToWorkspace", "Rebin2D",           "Rebunch",
+            "Regroup",          "RebinByPulseTimes", "RebinByTimeAtSample"};
+   }
 
 ``.. properties::``
    As mentioned above, it is *critical* that you include a description for the properties of your algorithm. This directive obtains all of the algorithm's properties (set inside the algorithm's ``init`` method) and outputs in a table format. 
@@ -147,7 +150,7 @@ It is possible to add additional categories by passing the directive arguments,
 
    .. categories:: Algorithms, Transforms, Rebin, Example
 
-``..sourcelink ::``
+``.. sourcelink::``
    This directive adds links to the algorithms source code.
 
 Description
@@ -175,7 +178,7 @@ where the first part outside the angle brackets defines the link text and the pa
 Usage
 =====
 
-This section *must* be manually entered. The usage is a 'code' example of the algorithm in use. The `testcode` directive must be used to verify the usage code you entered works correctly. See `here <AlgorithmUsageExamples>`__ for more information on how to write usage examples.
+This section *must* be manually entered. The usage is a 'code' example of the algorithm in use. The ``.. testcode::`` directive must be used to verify the usage code you entered works correctly. See :ref:`here <AlgorithmUsageExamples>` for more information on how to write usage examples.
 
 Building the Documentation
 ==========================
diff --git a/dev-docs/source/Standards/AlgorithmUsageExamples.rst b/dev-docs/source/Standards/AlgorithmUsageExamples.rst
index 3c8ee85ebc3789e7b1a5f89e2d8815f158a3a4d0..f0cdc11c59ee57fe55b07abe133f8515691958c2 100644
--- a/dev-docs/source/Standards/AlgorithmUsageExamples.rst
+++ b/dev-docs/source/Standards/AlgorithmUsageExamples.rst
@@ -18,7 +18,7 @@ From a user's point of view, the main purposes of usage examples are:
 * Understanding the algorithm
 * Showing hints/comments etc. that help understand Mantid Python scripting in general
 
-The usage examples are written in `reStructuredText <http://docutils.sourceforge.net/rst.html>`__, which can be converted to HTML and the code in the usage examples can be tested. The image below demonstrates an example of converting reStructuredText to HTML. 
+The usage examples are written in `reStructuredText <http://docutils.sourceforge.net/rst.html>`__, which can be converted to HTML and the code in the usage examples can be tested. 
 
 Guide
 =====
@@ -75,7 +75,7 @@ What is worth keeping in mind is:
 * Use comments.
 * Use Python ``print`` to output results, which, where possible, helps to understand the algorithm.
 
-A Jenkins job tests that the usage examples are not broken, i.e. that they continue to provide a working demonstration against the current build. It is vital to stress that the purpose of usage testing is *not to replace unit testing* (or system testing). The purpose of usage testing (better described as demonstration examples), is to provide some happy-path examples, which, where this is possible, can assist the user understanding of the Python code. This is very different from the purposes of testing in general, see `here <UnitTestGoodPractice.html>`__.
+A Jenkins job tests that the usage examples are not broken, i.e. that they continue to provide a working demonstration against the current build. It is vital to stress that the purpose of usage testing is *not to replace unit testing* (or system testing). The purpose of usage testing (better described as demonstration examples), is to provide some happy-path examples, which, where this is possible, can assist the user understanding of the Python code. This is very different from the purposes of testing in general, see :ref:`here <UnitTestGoodPractice>`.
 
 Additional benefits of usage examples:
 
@@ -181,7 +181,7 @@ For a more simple use of CreateSampleWorkspace see example below (note if no arg
 When needing to load a data file
 --------------------------------
 
-Instructions to add a new data file to the repository are available `here <DataFilesForTesting.html>`__. Files from the repository will be bundled up into a .zip file, and this .zip made available for download from the Mantid download page.
+Instructions to add a new data file to the repository are available :ref:`here <DataFilesForTesting>`. Files from the repository will be bundled up into a .zip file, and this .zip made available for download from the Mantid download page.
 
 If you use files you must add the line
 
@@ -221,4 +221,4 @@ as shown in the example below. This will generate a note to the user explaining
 Running the Tests
 =================
 
-See `here <DocumentationGuideForDevs.html>`__ for how to run and test the usage examples locally.
+See :ref:`here <DocumentationGuideForDevs>` for how to run and test the usage examples locally.
diff --git a/dev-docs/source/Standards/DocumentationGuideForDevs.rst b/dev-docs/source/Standards/DocumentationGuideForDevs.rst
index 81dd7ba2e2264540719ab7110866631a9a65269d..e58444b22679d6159e8ef9bd0942ea0d0d82e361 100644
--- a/dev-docs/source/Standards/DocumentationGuideForDevs.rst
+++ b/dev-docs/source/Standards/DocumentationGuideForDevs.rst
@@ -96,12 +96,12 @@ If you wish to place comments in the reST file that will not be rendered anywher
 Algorithms
 ----------
 
-The algorithm documentation has a slightly more rigid structure and is described in more detail `here <AlgorithmDocumentation.html>`__ and `here <AlgorithmUsageExamples.html>`__.
+The algorithm documentation has a slightly more rigid structure and is described in more detail :ref:`here <AlgorithmDocumentation>` and :ref:`here <AlgorithmUsageExamples>`.
 
 Interfaces
 ----------
 
-For documenting custom interfaces, it is recommended that you consult `this <InterfaceDocumentation.html>`__  page, which explains how to document them, and which directives may be used in more detail. 
+For documenting custom interfaces, it is recommended that you consult :ref:`this <InterfaceDocumentation>`  page, which explains how to document them, and which directives may be used in more detail. 
 
 How to define titles, sections etc.
 -----------------------------------
@@ -251,6 +251,6 @@ For multi-configuration generators such as Visual Studio or XCode you will need
 Building the HTML Development Documentation
 ===========================================
 
-The developer documentation is written as `.rst` files in the mantid source folder under ``dev-docs/``, the html files can be built using the `dev-docs-html` target. This will build all the development documentation into the mantid build folder under ``dev-docs/html/``.
+The developer documentation is written as ``.rst`` files in the mantid source folder under ``dev-docs/``, the html files can be built using the `dev-docs-html` target. This will build all the development documentation into the mantid build folder under ``dev-docs/html/``.
 
-In Visual Studio, this can be found in the "Documentation" folder in the solution explorer for the Mantid solution. Simply right click `dev-docs-html` and select build.
\ No newline at end of file
+In Visual Studio, this can be found in the "Documentation" folder in the solution explorer for the Mantid solution. Simply right click `dev-docs-html` and select build.
diff --git a/dev-docs/source/Standards/InterfaceDocumentation.rst b/dev-docs/source/Standards/InterfaceDocumentation.rst
index 1e49cbb60f01c4148f95f1665f3a1f07918d55f5..eb60abd91477df67125490b83317a9806bccf1f7 100644
--- a/dev-docs/source/Standards/InterfaceDocumentation.rst
+++ b/dev-docs/source/Standards/InterfaceDocumentation.rst
@@ -10,7 +10,7 @@ Interface Documentation
 Summary
 =======
 
-This page deals with the specifics of how to document Custom Interfaces. For a more general guide to the Mantid documentation system see `Documentation Guide For Devs <DocumentationGuideForDevs.html>`__.
+This page deals with the specifics of how to document Custom Interfaces. For a more general guide to the Mantid documentation system see :ref:`Documentation Guide For Devs <DocumentationGuideForDevs>`.
 
 The ``interface`` Directive
 ===========================
diff --git a/dev-docs/source/Testing/ErrorReporter-ProjectRecovery/ProjectRecoveryTesting.rst b/dev-docs/source/Testing/ErrorReporter-ProjectRecovery/ProjectRecoveryTesting.rst
index 46c05d1dea4960fcab9002dee73af4cf2bd92a21..861a85dee8385e5be522e06396a2fe32d19489b7 100644
--- a/dev-docs/source/Testing/ErrorReporter-ProjectRecovery/ProjectRecoveryTesting.rst
+++ b/dev-docs/source/Testing/ErrorReporter-ProjectRecovery/ProjectRecoveryTesting.rst
@@ -12,7 +12,7 @@ Project Recovery test
 *Preparation*
 
 - Before running these tests, set project recovery to run every 2 seconds. The instructions for this
-  are on the `Project Recovery concepts page <http://docs.mantidproject.org/nightly/concepts/ProjectRecovery.html>`_.
+  are on the `Project Recovery concepts page <http://docs.mantidproject.org/nightly/concepts/ProjectRecovery.html>`__.
 - Get the ISIS sample dataset from the `Downloads page <http://download.mantidproject.org/>`_.
 - `TOPAZ_3132_event.nxs` - availabe in ``/Testing/Data/SystemTest/``, get this by building the `SystemTestData` target. It should be in ``ExternalData/Testing/Data/SystemTest/``
 - The files `INTER000*` are in the ISIS sample data
diff --git a/docs/source/release/v3.14.0/diffraction.rst b/docs/source/release/v3.14.0/diffraction.rst
index e9da71190301e10983557675396f750d8f65ce6d..53355eaccb19c1128b46c59464f7df73007c0094 100644
--- a/docs/source/release/v3.14.0/diffraction.rst
+++ b/docs/source/release/v3.14.0/diffraction.rst
@@ -8,16 +8,6 @@ Diffraction Changes
 .. warning:: **Developers:** Sort changes under appropriate heading
     putting new features at the top of the section, followed by
     improvements, followed by bug fixes.
-	
-Powder Diffraction
-------------------
-Improvements
-############
-- Focusing in texture mode for Gem now properly saves
-  .gda files.
-- Focusing on Gem now crops values that would be divided by very small or zero vanadium values
-- Removed save_angles flag for Gem , as it was set by the texture mode
-- Added save_all flag to Gem that is set to true by default, setting it to false disables the saving of .NXS files
 
 
 Improvements
@@ -33,11 +23,6 @@ Improvements
 - Mask workspace option added to :ref:`WANDPowderReduction <algm-WANDPowderReduction>`
 
 
-Bugfixes
-########
-- multiple_scattering flag is now optional for Polaris focus when absorb_correction is true
-
-
 Single Crystal Diffraction
 --------------------------
 
@@ -59,6 +44,20 @@ Bugfixes
 Powder Diffraction
 ------------------
 
+Improvements
+############
+
+- Focusing in texture mode for Gem now properly saves .gda files.
+- Focusing on Gem now crops values that would be divided by very small or zero vanadium values
+- Removed save_angles flag for Gem , as it was set by the texture mode.
+- Added save_all flag to Gem that is set to true by default, setting it to false disables the saving of .NXS files.
+- Changed spline coefficient so that the default for long_mode on and long_mode off can be set separately.
+
+Bugfixes
+########
+
+- multiple_scattering flag is now optional for Polaris focus when absorb_correction is true.
+
 New
 ###
 
diff --git a/docs/source/release/v3.14.0/framework.rst b/docs/source/release/v3.14.0/framework.rst
index c32fd3d32e29c17980200c83e4616b147eb942bb..e1e067ab697c72eb894e8921748ab0e72dc0bdc0 100644
--- a/docs/source/release/v3.14.0/framework.rst
+++ b/docs/source/release/v3.14.0/framework.rst
@@ -49,6 +49,8 @@ Improvements
 - :ref:`SumOverlappingTubes <algm-SumOverlappingTubes>` will produce histogram data, and will not split the counts between bins by default.
 - :ref:`SumSpectra <algm-SumSpectra>` has an additional option, ``MultiplyBySpectra``, which controls whether or not the output spectra are multiplied by the number of bins. This property should be set to ``False`` for summing spectra as PDFgetN does.
 - :ref:`Live Data <algm-StartLiveData>` for events in PreserveEvents mode now produces workspaces that have bin boundaries which encompass the total x-range (TOF) for all events across all spectra.
+- Bugfix in :ref:`ConvertToMatrixWorkspace <algm-ConvertToMatrixWorkspace>` with ``Workspace2D`` as the ``InputWorkspace`` not being cloned to the ``OutputWorkspace``. Added support for ragged workspaces.
+- :ref:`RebinToWorkspace <algm-RebinToWorkspace>` now checks if the ``WorkspaceToRebin`` and ``WorkspaceToMatch`` already have the same binning. Added support for ragged workspaces.
 - :ref:`GroupWorkspaces <algm-GroupWorkspaces>` supports glob patterns for matching workspaces in the ADS.
 
 Bugfixes
diff --git a/docs/source/release/v3.14.0/indirect_inelastic.rst b/docs/source/release/v3.14.0/indirect_inelastic.rst
index 57613f2c006c4988d907eaa5c4da09d297c14c63..38df5afb756980dfd8f7b7e03bc9df9d474fe99f 100644
--- a/docs/source/release/v3.14.0/indirect_inelastic.rst
+++ b/docs/source/release/v3.14.0/indirect_inelastic.rst
@@ -26,6 +26,9 @@ Data Analysis Interface
 Improvements
 ############
 
+- The Run button in the Data Analysis tabs is now above the output options, and is disabled during fitting.
+- The Fit Single Spectrum buttons in the Data Analysis tabs MSDFit, ConvFit, I(Q,t)Fit and F(Q)Fit are now disabled
+  during fitting.
 - When the InelasticDiffSphere, InelasticDiffRotDiscreteCircle, ElasticDiffSphere or ElasticDiffRotDiscreteCircle
   Fit Types are selected in the ConvFit Tab, the Q values are retrieved from the workspaces, preventing a crash 
   when plotting a guess.
@@ -51,6 +54,8 @@ Improvements
   to be selected. Allowed values: ['Linear', 'CSpline'].
 - Added 'MaxScatterPtAttempts' spinbox to Calculate Monte Carlo Absorption. This sets the maximum number of 
   tries to be made to generate a scattering point.
+- In the Calculate Monte Carlo Absorption Tab, all of the options in the Monte Carlo section are now read from
+  an instrument parameter files once a file has been loaded.
 
 
 Data Reduction Interface
@@ -62,5 +67,3 @@ Improvements
 - Added 'Default' detector grouping option in ISISEnergyTransfer for TOSCA, to allow a default grouping 
   using the grouping specified in the Instrument Parameter File.
 - ISISEnergyTransfer now allows overlapping detector grouping.
-
-
diff --git a/qt/python/mantidqt/CMakeLists.txt b/qt/python/mantidqt/CMakeLists.txt
index 6ca91e85bdc9c66d88074b58a1754ab417e5c70b..54590033f2b87e85f963873849ae11e22f593fcb 100644
--- a/qt/python/mantidqt/CMakeLists.txt
+++ b/qt/python/mantidqt/CMakeLists.txt
@@ -1,6 +1,6 @@
 include ( SipQtTargetFunctions )
 
-set ( COMMON_INC_DIR ../../../widgets/common/inc )
+set ( COMMON_INC_DIR ../../widgets/common/inc )
 set ( HEADER_DEPENDS
   ${COMMON_INC_DIR}/MantidQtWidgets/Common/AlgorithmDialog.h
   ${COMMON_INC_DIR}/MantidQtWidgets/Common/Message.h
diff --git a/qt/python/mantidqtpython/CMakeLists.txt b/qt/python/mantidqtpython/CMakeLists.txt
index 1cfd56588f14350df9af899d777a0d77fa822145..06cccaa5883c908c2eb1817f72296325fb0d799f 100644
--- a/qt/python/mantidqtpython/CMakeLists.txt
+++ b/qt/python/mantidqtpython/CMakeLists.txt
@@ -12,6 +12,7 @@ set ( SLICEVIEWER_INC ${WIDGETS_DIR}/sliceviewer/inc )
 set ( REFVIEWER_INC ${WIDGETS_DIR}/refdetectorview/inc )
 set ( HEADER_DEPENDS
   SIPVector.h
+  string.sip
   vector.sip
   ${FACTORY_INC}/MantidQtWidgets/Factory/WidgetFactory.h
 
diff --git a/qt/python/mantidqtpython/mantidqtpython_def.sip b/qt/python/mantidqtpython/mantidqtpython_def.sip
index 4d40c4b68b260ac0ba61e5e8bac9158866abc085..457b5dbd9f9a236fc5828dc2b6f265bcb09b9be1 100644
--- a/qt/python/mantidqtpython/mantidqtpython_def.sip
+++ b/qt/python/mantidqtpython/mantidqtpython_def.sip
@@ -2298,6 +2298,43 @@ namespace MantidQt
 namespace API
 {
 
+class TSVSerialiser
+{
+%TypeHeaderCode
+#include "MantidQtWidgets/Common/TSVSerialiser.h"
+%End
+private:
+TSVSerialiser(const MantidQt::API::TSVSerialiser &);
+
+public:
+TSVSerialiser();
+TSVSerialiser(const std::string &lines);
+
+void clear();
+std::string outputLines() const;
+std::vector<std::string> sections(const std::string &name) const;
+
+MantidQt::API::TSVSerialiser &writeLine(const std::string &name);
+void writeSection(const std::string &name, const std::string &body);
+
+
+bool selectLine(const std::string &name);
+bool selectSection(const std::string &name);
+
+void storeDouble(const double value);
+void storeInt(const int value);
+void storeString(const std::string value);
+void storeBool(const bool value);
+
+double readDouble();
+int readInt();
+std::string readString();
+bool readBool();
+
+std::string lineAsString(const std::string &name) const;
+std::vector<std::string> values(const std::string &name) const;
+};
+
 class WidgetScrollbarDecorator
 {
 %TypeHeaderCode
diff --git a/qt/python/mantidqtpython/string.sip b/qt/python/mantidqtpython/string.sip
index f7c849c8facd1c95a40403be2ba30423472863ce..45d7dd4cbb1fdc968f473e1822b6b25ccc1c8fa0 100644
--- a/qt/python/mantidqtpython/string.sip
+++ b/qt/python/mantidqtpython/string.sip
@@ -1,6 +1,5 @@
-// Acquired from the PyQt mailing list at
+// Adapted from the PyQt mailing list at
 // https://riverbankcomputing.com/pipermail/pyqt/2005-February/009662.html
-// on 9th April 2018.
 
 %MappedType std::string
 {
@@ -9,37 +8,33 @@
 %End
 
 %ConvertFromTypeCode
-     // convert an std::string to a Python (unicode) string
-     PyObject* newstring;
-     newstring = PyUnicode_DecodeUTF8(sipCpp->c_str(), sipCpp->length(), NULL);
-     if(newstring == NULL) {
-         PyErr_Clear();
-         newstring = FROM_CSTRING(sipCpp->c_str());
-     }
-     return newstring;
+#if PY_VERSION_HEX >= 0x03000000
+    return PyUnicode_FromString(sipCpp->c_str());
+#else
+    return PyString_FromString(sipCpp->c_str());
+#endif
 %End
 
 %ConvertToTypeCode
-	// Allow a Python string (or a unicode string) whenever a string is
-	// expected.
-     // If argument is a Unicode string, just decode it to UTF-8
-     // If argument is a Python string, assume it's UTF-8
-	if (sipIsErr == NULL)
-		return (STR_CHECK(sipPy) || PyUnicode_Check(sipPy));
-	if (sipPy == Py_None) {
-		*sipCppPtr = new std::string;
-		return 1;
-	}
-	if (PyUnicode_Check(sipPy))	{
-         PyObject* s = PyUnicode_AsEncodedString(sipPy, "UTF-8", "");
-         *sipCppPtr = new std::string(TO_CSTRING(s));
-         Py_DECREF(s);
-         return 1;
-	}
-	if (STR_CHECK(sipPy)) {
-         *sipCppPtr = new std::string(TO_CSTRING(sipPy));
-     	return 1;
-	}
+   // Allow a Python string (or a unicode string) whenever a string is
+   // expected.
+   if (sipIsErr == NULL)
+    return (SIPBytes_Check(sipPy) || PyUnicode_Check(sipPy));
+   if (sipPy == Py_None) {
+     *sipCppPtr = new std::string;
+     return 1;
+   }
+   if (PyUnicode_Check(sipPy)) {
+    // encode with UTF-8 to bytes object
+    PyObject* s = PyUnicode_AsUTF8String(sipPy);
+    *sipCppPtr = new std::string(SIPBytes_AS_STRING(s));
+    Py_DECREF(s);
+    return 1;
+   }
+   if (SIPBytes_Check(sipPy)) {
+    *sipCppPtr = new std::string(SIPBytes_AS_STRING(sipPy));
+    return 1;
+   }
   return 0;
 %End
 };
diff --git a/qt/scientific_interfaces/Indirect/AbsorptionCorrections.cpp b/qt/scientific_interfaces/Indirect/AbsorptionCorrections.cpp
index c44e7455197402af2851ea08af31bde8362cfa71..6f17759fe115e5179caff899739da59e97b6219f 100644
--- a/qt/scientific_interfaces/Indirect/AbsorptionCorrections.cpp
+++ b/qt/scientific_interfaces/Indirect/AbsorptionCorrections.cpp
@@ -10,6 +10,7 @@
 #include <QRegExpValidator>
 
 using namespace Mantid::API;
+using namespace Mantid::Geometry;
 
 namespace {
 Mantid::Kernel::Logger g_log("AbsorptionCorrections");
@@ -71,6 +72,8 @@ AbsorptionCorrections::AbsorptionCorrections(QWidget *parent)
   // Change of input
   connect(m_uiForm.dsSampleInput, SIGNAL(dataReady(const QString &)), this,
           SLOT(getBeamDefaults(const QString &)));
+  connect(m_uiForm.dsSampleInput, SIGNAL(dataReady(const QString &)), this,
+          SLOT(getMonteCarloDefaults(const QString &)));
 
   // Handle algorithm completion
   connect(m_batchAlgoRunner, SIGNAL(batchComplete(bool)), this,
@@ -401,6 +404,65 @@ void AbsorptionCorrections::getBeamDefaults(const QString &dataName) {
   }
 }
 
+void AbsorptionCorrections::getMonteCarloDefaults(const QString &dataName) {
+  auto sampleWs = AnalysisDataService::Instance().retrieveWS<MatrixWorkspace>(
+      dataName.toStdString());
+
+  if (sampleWs) {
+    auto instrument = sampleWs->getInstrument();
+    setWavelengthsValue(instrument, "Workflow.absorption-wavelengths");
+    setEventsValue(instrument, "Workflow.absorption-events");
+    setInterpolationValue(instrument, "Workflow.absorption-interpolation");
+    setMaxAttemptsValue(instrument, "Workflow.absorption-attempts");
+  } else
+    displayInvalidWorkspaceTypeError(dataName.toStdString(), g_log);
+}
+
+void AbsorptionCorrections::setWavelengthsValue(
+    Instrument_const_sptr instrument,
+    const std::string &wavelengthsParamName) const {
+  if (instrument->hasParameter(wavelengthsParamName)) {
+    const auto wavelengths = QString::fromStdString(
+        instrument->getStringParameter(wavelengthsParamName)[0]);
+    const auto wavelengthsValue = wavelengths.toInt();
+    m_uiForm.spNumberWavelengths->setValue(wavelengthsValue);
+  }
+}
+
+void AbsorptionCorrections::setEventsValue(
+    Instrument_const_sptr instrument,
+    const std::string &eventsParamName) const {
+  if (instrument->hasParameter(eventsParamName)) {
+    const auto events = QString::fromStdString(
+        instrument->getStringParameter(eventsParamName)[0]);
+    const auto eventsValue = events.toInt();
+    m_uiForm.spNumberEvents->setValue(eventsValue);
+  }
+}
+
+void AbsorptionCorrections::setInterpolationValue(
+    Instrument_const_sptr instrument,
+    const std::string &interpolationParamName) const {
+  if (instrument->hasParameter(interpolationParamName)) {
+    const auto interpolation = QString::fromStdString(
+        instrument->getStringParameter(interpolationParamName)[0]);
+    const auto interpolationValue = interpolation.toStdString();
+    m_uiForm.cbInterpolation->setCurrentIndex(
+        interpolationValue == "CSpline" ? 1 : 0);
+  }
+}
+
+void AbsorptionCorrections::setMaxAttemptsValue(
+    Instrument_const_sptr instrument,
+    const std::string &maxAttemptsParamName) const {
+  if (instrument->hasParameter(maxAttemptsParamName)) {
+    const auto maxScatterAttempts = QString::fromStdString(
+        instrument->getStringParameter(maxAttemptsParamName)[0]);
+    const auto maxScatterAttemptsValue = maxScatterAttempts.toInt();
+    m_uiForm.spMaxScatterPtAttempts->setValue(maxScatterAttemptsValue);
+  }
+}
+
 /**
  * Handle saving of workspace
  */
diff --git a/qt/scientific_interfaces/Indirect/AbsorptionCorrections.h b/qt/scientific_interfaces/Indirect/AbsorptionCorrections.h
index d8040ad276c10f56b9949fef3ccb02cf0c742a99..89fa57a115de7d07284fde63f77a2bade83ac00b 100644
--- a/qt/scientific_interfaces/Indirect/AbsorptionCorrections.h
+++ b/qt/scientific_interfaces/Indirect/AbsorptionCorrections.h
@@ -28,6 +28,15 @@ private slots:
   void saveClicked();
   void plotClicked();
   void getBeamDefaults(const QString &dataName);
+  void getMonteCarloDefaults(const QString &dataName);
+  void setWavelengthsValue(Mantid::Geometry::Instrument_const_sptr instrument,
+                           const std::string &wavelengthsParamName) const;
+  void setEventsValue(Mantid::Geometry::Instrument_const_sptr instrument,
+                      const std::string &eventsParamName) const;
+  void setInterpolationValue(Mantid::Geometry::Instrument_const_sptr instrument,
+                             const std::string &interpolationParamName) const;
+  void setMaxAttemptsValue(Mantid::Geometry::Instrument_const_sptr instrument,
+                           const std::string &maxAttemptsParamName) const;
   void changeSampleDensityUnit(int);
   void changeCanDensityUnit(int);
   UserInputValidator doValidation();
diff --git a/qt/scientific_interfaces/Indirect/ConvFit.cpp b/qt/scientific_interfaces/Indirect/ConvFit.cpp
index c2717185708c373d7639106b37cea31475aa51f7..99a60d931ed4ad3b1924379e939e10686e3b36a4 100644
--- a/qt/scientific_interfaces/Indirect/ConvFit.cpp
+++ b/qt/scientific_interfaces/Indirect/ConvFit.cpp
@@ -106,6 +106,7 @@ void ConvFit::setupFitTab() {
       m_dblManager->addProperty("InstrumentResolution");
 
   // Post Plot and Save
+  connect(m_uiForm->pbRun, SIGNAL(clicked()), this, SLOT(runClicked()));
   connect(m_uiForm->pbSave, SIGNAL(clicked()), this, SLOT(saveClicked()));
   connect(m_uiForm->pbPlot, SIGNAL(clicked()), this, SLOT(plotClicked()));
   connect(this, SIGNAL(functionChanged()), this, SLOT(fitFunctionChanged()));
@@ -178,6 +179,14 @@ void ConvFit::setSaveResultEnabled(bool enabled) {
   m_uiForm->pbSave->setEnabled(enabled);
 }
 
+void ConvFit::setRunEnabled(bool enabled) {
+  m_uiForm->pvFitPlotView->enableFitSingleSpectrum(enabled);
+  m_uiForm->pbRun->setEnabled(enabled);
+  m_uiForm->pbRun->setText(!enabled ? "Running..." : "Run");
+}
+
+void ConvFit::runClicked() { runTab(); }
+
 } // namespace IDA
 } // namespace CustomInterfaces
 } // namespace MantidQt
diff --git a/qt/scientific_interfaces/Indirect/ConvFit.h b/qt/scientific_interfaces/Indirect/ConvFit.h
index f23d91b786a3c98be07ab8f9ed37d68a35bdc4e4..9a3a8477d284b4ff10fe9814381c3e8c20451789 100644
--- a/qt/scientific_interfaces/Indirect/ConvFit.h
+++ b/qt/scientific_interfaces/Indirect/ConvFit.h
@@ -19,6 +19,7 @@ public:
   ConvFit(QWidget *parent = nullptr);
 
 protected:
+  void setRunEnabled(bool enabled) override;
   void setPlotResultEnabled(bool enabled) override;
   void setSaveResultEnabled(bool enabled) override;
 
@@ -28,6 +29,7 @@ private:
 
 protected slots:
   void setModelResolution(const QString &resolutionName);
+  void runClicked();
   void saveClicked();
   void plotClicked();
   void updatePlotOptions() override;
diff --git a/qt/scientific_interfaces/Indirect/ConvFit.ui b/qt/scientific_interfaces/Indirect/ConvFit.ui
index d307c55349734c5d6b994824678d8a6aee273037..80aa491a2c0c77abd61e5477f5d073a4c061e25c 100644
--- a/qt/scientific_interfaces/Indirect/ConvFit.ui
+++ b/qt/scientific_interfaces/Indirect/ConvFit.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>719</width>
-    <height>809</height>
+    <width>801</width>
+    <height>734</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -48,103 +48,178 @@
         </layout>
        </item>
        <item>
-        <layout class="QHBoxLayout" name="loSpectrumView" stretch="0">
-         <property name="topMargin">
-          <number>0</number>
+        <widget class="QFrame" name="frame">
+         <property name="frameShape">
+          <enum>QFrame::StyledPanel</enum>
          </property>
-         <item>
-          <widget class="MantidQt::CustomInterfaces::IDA::IndirectSpectrumSelectionView" name="svSpectrumView" native="true">
-           <property name="sizePolicy">
-            <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
-             <horstretch>1</horstretch>
-             <verstretch>0</verstretch>
-            </sizepolicy>
-           </property>
-           <property name="minimumSize">
-            <size>
-             <width>0</width>
-             <height>0</height>
-            </size>
-           </property>
-          </widget>
-         </item>
-        </layout>
-       </item>
-       <item>
-        <widget class="QGroupBox" name="gbOutput">
-         <property name="title">
-          <string>Output</string>
+         <property name="frameShadow">
+          <enum>QFrame::Raised</enum>
          </property>
-         <layout class="QHBoxLayout" name="horizontalLayout_10">
-          <item>
-           <widget class="QLabel" name="lbPlotType">
-            <property name="text">
-             <string>Plot Output:</string>
-            </property>
-           </widget>
-          </item>
+         <layout class="QVBoxLayout" name="verticalLayout_3">
+          <property name="spacing">
+           <number>0</number>
+          </property>
+          <property name="leftMargin">
+           <number>0</number>
+          </property>
+          <property name="topMargin">
+           <number>0</number>
+          </property>
+          <property name="rightMargin">
+           <number>0</number>
+          </property>
+          <property name="bottomMargin">
+           <number>0</number>
+          </property>
           <item>
-           <widget class="QComboBox" name="cbPlotType">
-            <property name="sizePolicy">
-             <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-              <horstretch>0</horstretch>
-              <verstretch>0</verstretch>
-             </sizepolicy>
-            </property>
-            <property name="minimumSize">
-             <size>
-              <width>120</width>
-              <height>0</height>
-             </size>
+           <layout class="QHBoxLayout" name="loSpectrumView" stretch="0">
+            <property name="topMargin">
+             <number>0</number>
             </property>
             <item>
-             <property name="text">
-              <string>All</string>
-             </property>
+             <widget class="MantidQt::CustomInterfaces::IDA::IndirectSpectrumSelectionView" name="svSpectrumView" native="true">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+                <horstretch>1</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="minimumSize">
+               <size>
+                <width>0</width>
+                <height>0</height>
+               </size>
+              </property>
+             </widget>
             </item>
-            <item>
-             <property name="text">
-              <string>Amplitude</string>
-             </property>
-            </item>
-            <item>
-             <property name="text">
-              <string>FWHM</string>
-             </property>
-            </item>
-           </widget>
+           </layout>
           </item>
           <item>
-           <widget class="QPushButton" name="pbPlot">
-            <property name="enabled">
-             <bool>false</bool>
-            </property>
-            <property name="text">
-             <string>Plot</string>
+           <widget class="QGroupBox" name="gbRun">
+            <property name="title">
+             <string>Run</string>
             </property>
+            <layout class="QHBoxLayout" name="horizontalLayout">
+             <property name="topMargin">
+              <number>0</number>
+             </property>
+             <property name="bottomMargin">
+              <number>7</number>
+             </property>
+             <item>
+              <spacer name="horizontalSpacer">
+               <property name="orientation">
+                <enum>Qt::Horizontal</enum>
+               </property>
+               <property name="sizeHint" stdset="0">
+                <size>
+                 <width>40</width>
+                 <height>20</height>
+                </size>
+               </property>
+              </spacer>
+             </item>
+             <item>
+              <widget class="QPushButton" name="pbRun">
+               <property name="text">
+                <string>Run</string>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <spacer name="horizontalSpacer_2">
+               <property name="orientation">
+                <enum>Qt::Horizontal</enum>
+               </property>
+               <property name="sizeHint" stdset="0">
+                <size>
+                 <width>40</width>
+                 <height>20</height>
+                </size>
+               </property>
+              </spacer>
+             </item>
+            </layout>
            </widget>
           </item>
           <item>
-           <spacer name="horizontalSpacer_1">
-            <property name="orientation">
-             <enum>Qt::Horizontal</enum>
-            </property>
-            <property name="sizeHint" stdset="0">
-             <size>
-              <width>40</width>
-              <height>20</height>
-             </size>
-            </property>
-           </spacer>
-          </item>
-          <item>
-           <widget class="QPushButton" name="pbSave">
-            <property name="enabled">
-             <bool>false</bool>
-            </property>
-            <property name="text">
-             <string>Save Result</string>
+           <widget class="QGroupBox" name="gbOutput">
+            <property name="title">
+             <string>Output</string>
             </property>
+            <layout class="QHBoxLayout" name="horizontalLayout_10">
+             <item>
+              <widget class="QLabel" name="lbPlotType">
+               <property name="text">
+                <string>Plot Output:</string>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <widget class="QComboBox" name="cbPlotType">
+               <property name="sizePolicy">
+                <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+                 <horstretch>0</horstretch>
+                 <verstretch>0</verstretch>
+                </sizepolicy>
+               </property>
+               <property name="minimumSize">
+                <size>
+                 <width>120</width>
+                 <height>0</height>
+                </size>
+               </property>
+               <item>
+                <property name="text">
+                 <string>All</string>
+                </property>
+               </item>
+               <item>
+                <property name="text">
+                 <string>Amplitude</string>
+                </property>
+               </item>
+               <item>
+                <property name="text">
+                 <string>FWHM</string>
+                </property>
+               </item>
+              </widget>
+             </item>
+             <item>
+              <widget class="QPushButton" name="pbPlot">
+               <property name="enabled">
+                <bool>false</bool>
+               </property>
+               <property name="text">
+                <string>Plot</string>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <spacer name="horizontalSpacer_1">
+               <property name="orientation">
+                <enum>Qt::Horizontal</enum>
+               </property>
+               <property name="sizeHint" stdset="0">
+                <size>
+                 <width>40</width>
+                 <height>20</height>
+                </size>
+               </property>
+              </spacer>
+             </item>
+             <item>
+              <widget class="QPushButton" name="pbSave">
+               <property name="enabled">
+                <bool>false</bool>
+               </property>
+               <property name="text">
+                <string>Save Result</string>
+               </property>
+              </widget>
+             </item>
+            </layout>
            </widget>
           </item>
          </layout>
diff --git a/qt/scientific_interfaces/Indirect/Elwin.cpp b/qt/scientific_interfaces/Indirect/Elwin.cpp
index a4e0f77f89331f8034797e29c5007405d07d1266..bdd80033d61df534c7446f6c757ded76df903b28 100644
--- a/qt/scientific_interfaces/Indirect/Elwin.cpp
+++ b/qt/scientific_interfaces/Indirect/Elwin.cpp
@@ -102,6 +102,7 @@ void Elwin::setup() {
   connect(m_uiForm.spPreviewSpec, SIGNAL(valueChanged(int)), this,
           SLOT(plotInput()));
   // Handle plot and save
+  connect(m_uiForm.pbRun, SIGNAL(clicked()), this, SLOT(runClicked()));
   connect(m_uiForm.pbSave, SIGNAL(clicked()), this, SLOT(saveClicked()));
   connect(m_uiForm.pbPlot, SIGNAL(clicked()), this, SLOT(plotClicked()));
   connect(m_uiForm.pbPlotPreview, SIGNAL(clicked()), this,
@@ -116,6 +117,8 @@ void Elwin::setup() {
 }
 
 void Elwin::run() {
+  setRunEnabled(false);
+
   QStringList inputFilenames = m_uiForm.dsInputFiles->getFilenames();
   inputFilenames.sort();
 
@@ -247,7 +250,8 @@ void Elwin::unGroupInput(bool error) {
     ungroupAlg->execute();
   }
 
-  // Enable plot and save
+  // Enable run, plot and save
+  setRunEnabled(true);
   m_uiForm.pbPlot->setEnabled(true);
   m_uiForm.pbSave->setEnabled(true);
 }
@@ -508,6 +512,13 @@ void Elwin::saveClicked() {
   m_batchAlgoRunner->executeBatchAsync();
 }
 
+void Elwin::setRunEnabled(bool enabled) {
+  m_uiForm.pbRun->setEnabled(enabled);
+  m_uiForm.pbRun->setText(!enabled ? "Running..." : "Run");
+}
+
+void Elwin::runClicked() { runTab(); }
+
 } // namespace IDA
 } // namespace CustomInterfaces
 } // namespace MantidQt
diff --git a/qt/scientific_interfaces/Indirect/Elwin.h b/qt/scientific_interfaces/Indirect/Elwin.h
index e7c4d6a9e09b3808dc1ab515bf262b0806b622b4..e50c4f0f17fdfb39e890785c146eaadcd14b272f 100644
--- a/qt/scientific_interfaces/Indirect/Elwin.h
+++ b/qt/scientific_interfaces/Indirect/Elwin.h
@@ -14,9 +14,12 @@ class DLLExport Elwin : public IndirectDataAnalysisTab {
 public:
   Elwin(QWidget *parent = nullptr);
 
+protected:
+  void setRunEnabled(bool enabled) override;
+
 private:
-  void setup() override;
   void run() override;
+  void setup() override;
   bool validate() override;
   void loadSettings(const QSettings &settings) override;
   void setDefaultResolution(Mantid::API::MatrixWorkspace_const_sptr ws,
@@ -32,6 +35,7 @@ private slots:
   void maxChanged(double val);
   void updateRS(QtProperty *prop, double val);
   void unGroupInput(bool error);
+  void runClicked();
   void saveClicked();
   void plotClicked();
 
diff --git a/qt/scientific_interfaces/Indirect/Elwin.ui b/qt/scientific_interfaces/Indirect/Elwin.ui
index e8d3b1379dea2b544fc6c2c36ae318b0291284c3..622327b9b724682b52372f9c4cf32f8cd7571499 100644
--- a/qt/scientific_interfaces/Indirect/Elwin.ui
+++ b/qt/scientific_interfaces/Indirect/Elwin.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>581</width>
-    <height>651</height>
+    <width>801</width>
+    <height>731</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -197,42 +197,117 @@
     </layout>
    </item>
    <item>
-    <widget class="QGroupBox" name="gbOutput">
-     <property name="title">
-      <string>Output</string>
+    <widget class="QFrame" name="fResults">
+     <property name="frameShape">
+      <enum>QFrame::StyledPanel</enum>
+     </property>
+     <property name="frameShadow">
+      <enum>QFrame::Raised</enum>
      </property>
-     <layout class="QHBoxLayout" name="horizontalLayout_5">
+     <layout class="QVBoxLayout" name="verticalLayout">
+      <property name="spacing">
+       <number>0</number>
+      </property>
+      <property name="leftMargin">
+       <number>0</number>
+      </property>
+      <property name="topMargin">
+       <number>0</number>
+      </property>
+      <property name="rightMargin">
+       <number>0</number>
+      </property>
+      <property name="bottomMargin">
+       <number>0</number>
+      </property>
       <item>
-       <widget class="QPushButton" name="pbPlot">
-        <property name="enabled">
-         <bool>false</bool>
-        </property>
-        <property name="text">
-         <string>Plot Result</string>
+       <widget class="QGroupBox" name="gbRun">
+        <property name="title">
+         <string>Run</string>
         </property>
+        <layout class="QHBoxLayout" name="horizontalLayout">
+         <property name="topMargin">
+          <number>0</number>
+         </property>
+         <property name="bottomMargin">
+          <number>7</number>
+         </property>
+         <item>
+          <spacer name="horizontalSpacer">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QPushButton" name="pbRun">
+           <property name="text">
+            <string>Run</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_3">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
        </widget>
       </item>
       <item>
-       <spacer name="horizontalSpacer_1">
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
-        </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>40</width>
-          <height>20</height>
-         </size>
-        </property>
-       </spacer>
-      </item>
-      <item>
-       <widget class="QPushButton" name="pbSave">
-        <property name="enabled">
-         <bool>false</bool>
-        </property>
-        <property name="text">
-         <string>Save Result</string>
+       <widget class="QGroupBox" name="gbOutput">
+        <property name="title">
+         <string>Output</string>
         </property>
+        <layout class="QHBoxLayout" name="horizontalLayout_5">
+         <item>
+          <widget class="QPushButton" name="pbPlot">
+           <property name="enabled">
+            <bool>false</bool>
+           </property>
+           <property name="text">
+            <string>Plot Result</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_1">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QPushButton" name="pbSave">
+           <property name="enabled">
+            <bool>false</bool>
+           </property>
+           <property name="text">
+            <string>Save Result</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
        </widget>
       </item>
      </layout>
diff --git a/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.cpp b/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.cpp
index 0c1479de44e6289f70d40c2b6fc171ba97b9abb0..295ef2c0855cf46efe3c1e2bcc254461f9044d86 100644
--- a/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.cpp
+++ b/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.cpp
@@ -83,7 +83,6 @@ void IndirectDataAnalysis::initLayout() {
   connect(m_uiForm.pbPythonExport, SIGNAL(clicked()), this,
           SLOT(exportTabPython()));
   connect(m_uiForm.pbHelp, SIGNAL(clicked()), this, SLOT(help()));
-  connect(m_uiForm.pbRun, SIGNAL(clicked()), this, SLOT(run()));
   connect(m_uiForm.pbManageDirs, SIGNAL(clicked()), this,
           SLOT(openDirectoryDialog()));
 }
@@ -118,14 +117,6 @@ void IndirectDataAnalysis::loadSettings() {
   settings.endGroup();
 }
 
-/**
- * Private slot, called when the Run button is pressed.  Runs current tab.
- */
-void IndirectDataAnalysis::run() {
-  const unsigned int currentTab = m_uiForm.twIDATabs->currentIndex();
-  m_tabs[currentTab]->runTab();
-}
-
 /**
  * Opens a directory dialog.
  */
diff --git a/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.h b/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.h
index de620e1892dc3aeaa149aa6c52069a0c358fedd1..d7656cafb9730333071e3c85c2d9fdea5ebf316e 100644
--- a/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.h
+++ b/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.h
@@ -67,8 +67,6 @@ private:
 private slots:
   /// Called when the user clicks the Py button
   void exportTabPython();
-  /// Called when the Run button is pressed.  Runs current tab.
-  void run();
   /// Opens a directory dialog.
   void openDirectoryDialog();
   /// Opens the Mantid Wiki web page of the current tab.
diff --git a/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.ui b/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.ui
index f04cd6e8d582e0ca086bab0bd58fc7169b35f45b..47ecac1848aeb1583a879564c44bde5fcc904009 100644
--- a/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.ui
+++ b/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.ui
@@ -153,26 +153,6 @@
         </property>
        </spacer>
       </item>
-      <item>
-       <widget class="QPushButton" name="pbRun">
-        <property name="text">
-         <string>Run</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <spacer name="horizontalSpacer_11">
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
-        </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>40</width>
-          <height>20</height>
-         </size>
-        </property>
-       </spacer>
-      </item>
       <item>
        <widget class="QPushButton" name="pbManageDirs">
         <property name="text">
@@ -188,7 +168,6 @@
  <tabstops>
   <tabstop>twIDATabs</tabstop>
   <tabstop>pbHelp</tabstop>
-  <tabstop>pbRun</tabstop>
   <tabstop>pbManageDirs</tabstop>
  </tabstops>
  <resources/>
diff --git a/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTab.h b/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTab.h
index 9203a95d60f253a6e010f91ad1cf206367089f5d..b68ba4a18933b8c6568b632e7f4f967c8b2791c4 100644
--- a/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTab.h
+++ b/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTab.h
@@ -111,6 +111,8 @@ protected:
                        const QString &startRangePropName = "",
                        const QString &endRangePropName = "");
 
+  virtual void setRunEnabled(bool enabled) = 0;
+
   /// DoubleEditorFactory
   DoubleEditorFactory *m_dblEdFac;
   /// QtCheckBoxFactory
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.cpp b/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.cpp
index d2f780d7cde4736cc4f28fea328759f2a9e3cd32..521a8d3a07082ce357414c78128dce74de58807c 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.cpp
+++ b/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.cpp
@@ -666,6 +666,7 @@ void IndirectFitAnalysisTab::updateSingleFitOutput(bool error) {
 void IndirectFitAnalysisTab::fitAlgorithmComplete(bool error) {
   setSaveResultEnabled(!error);
   setPlotResultEnabled(!error);
+  setRunEnabled(true);
   updateParameterValues();
   m_spectrumPresenter->enableView();
   m_plotPresenter->updatePlots();
@@ -813,6 +814,7 @@ bool IndirectFitAnalysisTab::validate() {
  * Called when the 'Run' button is called in the IndirectTab.
  */
 void IndirectFitAnalysisTab::run() {
+  setRunEnabled(false);
   runFitAlgorithm(m_fittingModel->getFittingAlgorithm());
 }
 
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.h b/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.h
index e47bd499b132d90a069c475f8f6a73db838fe247..2e924f52492d676451e0308a75a82a8652a31f9a 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.h
+++ b/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.h
@@ -113,6 +113,7 @@ protected:
   void setResolutionWSSuffices(const QStringList &suffices);
   void setResolutionFBSuffices(const QStringList &suffices);
 
+  void run() override;
   void plotResult(const QString &plotType);
   void plotAll(Mantid::API::WorkspaceGroup_sptr workspaces);
   void plotParameter(Mantid::API::WorkspaceGroup_sptr workspace,
@@ -186,7 +187,6 @@ private:
   void loadSettings(const QSettings &settings) override;
   virtual void setupFitTab() = 0;
   bool validate() override;
-  void run() override;
 
   void connectDataAndPlotPresenters();
   void connectSpectrumAndPlotPresenters();
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitPlotPresenter.cpp b/qt/scientific_interfaces/Indirect/IndirectFitPlotPresenter.cpp
index a435626b19dead9577dfd2354462975addba06e5..442e46b79f734a8379c816ecb252221076a152fd 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitPlotPresenter.cpp
+++ b/qt/scientific_interfaces/Indirect/IndirectFitPlotPresenter.cpp
@@ -226,13 +226,13 @@ void IndirectFitPlotPresenter::updateAvailableSpectra() {
 }
 
 void IndirectFitPlotPresenter::disableAllDataSelection() {
-  m_view->disableSpectrumSelection();
-  m_view->disableFitRangeSelection();
+  m_view->enableSpectrumSelection(false);
+  m_view->enableFitRangeSelection(false);
 }
 
 void IndirectFitPlotPresenter::enableAllDataSelection() {
-  m_view->enableSpectrumSelection();
-  m_view->enableFitRangeSelection();
+  m_view->enableSpectrumSelection(true);
+  m_view->enableFitRangeSelection(true);
 }
 
 void IndirectFitPlotPresenter::updatePlots() {
@@ -313,19 +313,19 @@ void IndirectFitPlotPresenter::plotCurrentPreview() {
 
 void IndirectFitPlotPresenter::updateGuess() {
   if (m_model->canCalculateGuess()) {
-    m_view->enablePlotGuess();
+    m_view->enablePlotGuess(true);
     updateGuess(m_view->isPlotGuessChecked());
   } else {
-    m_view->disablePlotGuess();
+    m_view->enablePlotGuess(false);
     clearGuess();
   }
 }
 
 void IndirectFitPlotPresenter::updateGuessAvailability() {
   if (m_model->canCalculateGuess())
-    m_view->enablePlotGuess();
+    m_view->enablePlotGuess(true);
   else
-    m_view->disablePlotGuess();
+    m_view->enablePlotGuess(false);
 }
 
 void IndirectFitPlotPresenter::updateGuess(bool doPlotGuess) {
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitPlotView.cpp b/qt/scientific_interfaces/Indirect/IndirectFitPlotView.cpp
index fb14eddb59282479d5a49350f3bb12a22436a9b4..b4f42757dab5d66f9041327686eaa5af72f306f7 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitPlotView.cpp
+++ b/qt/scientific_interfaces/Indirect/IndirectFitPlotView.cpp
@@ -159,30 +159,24 @@ void IndirectFitPlotView::removeFromBottomPreview(const QString &name) {
   m_plotForm->ppPlotBottom->removeSpectrum(name);
 }
 
-void IndirectFitPlotView::disablePlotGuess() {
-  m_plotForm->ckPlotGuess->setDisabled(true);
-  m_plotForm->ckPlotGuess->setChecked(false);
+void IndirectFitPlotView::enablePlotGuess(bool enable) {
+  if (!enable)
+    m_plotForm->ckPlotGuess->setChecked(enable);
+  m_plotForm->ckPlotGuess->setEnabled(enable);
 }
 
-void IndirectFitPlotView::enablePlotGuess() {
-  m_plotForm->ckPlotGuess->setEnabled(true);
+void IndirectFitPlotView::enableFitSingleSpectrum(bool enable) {
+  m_plotForm->pbFitSingle->setEnabled(enable);
 }
 
-void IndirectFitPlotView::disableSpectrumSelection() {
-  m_plotForm->spPlotSpectrum->setValue(0);
-  m_plotForm->spPlotSpectrum->setDisabled(true);
+void IndirectFitPlotView::enableSpectrumSelection(bool enable) {
+  if (!enable)
+    m_plotForm->spPlotSpectrum->setValue(0);
+  m_plotForm->spPlotSpectrum->setEnabled(enable);
 }
 
-void IndirectFitPlotView::enableSpectrumSelection() {
-  m_plotForm->spPlotSpectrum->setEnabled(true);
-}
-
-void IndirectFitPlotView::disableFitRangeSelection() {
-  m_plotForm->ppPlotTop->getRangeSelector("FitRange")->setVisible(false);
-}
-
-void IndirectFitPlotView::enableFitRangeSelection() {
-  m_plotForm->ppPlotTop->getRangeSelector("FitRange")->setVisible(true);
+void IndirectFitPlotView::enableFitRangeSelection(bool enable) {
+  m_plotForm->ppPlotTop->getRangeSelector("FitRange")->setVisible(enable);
 }
 
 void IndirectFitPlotView::clearTopPreview() { m_plotForm->ppPlotTop->clear(); }
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitPlotView.h b/qt/scientific_interfaces/Indirect/IndirectFitPlotView.h
index bb8f190cf75cf04302bb72d592782bf9c8b2182d..333dbc0c85e8a51dd4d29476e654786a73e9b88e 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitPlotView.h
+++ b/qt/scientific_interfaces/Indirect/IndirectFitPlotView.h
@@ -46,14 +46,10 @@ public:
   void removeFromTopPreview(const QString &name);
   void removeFromBottomPreview(const QString &name);
 
-  void disablePlotGuess();
-  void enablePlotGuess();
-
-  void disableSpectrumSelection();
-  void enableSpectrumSelection();
-
-  void disableFitRangeSelection();
-  void enableFitRangeSelection();
+  void enableFitSingleSpectrum(bool enable);
+  void enablePlotGuess(bool enable);
+  void enableSpectrumSelection(bool enable);
+  void enableFitRangeSelection(bool enable);
 
   void setBackgroundLevel(double value);
 
diff --git a/qt/scientific_interfaces/Indirect/Iqt.cpp b/qt/scientific_interfaces/Indirect/Iqt.cpp
index 01de00883e1f22928ffce804140b4d3e1ec609dc..aa87e853681901daf730664dc706a4c3c0232484 100644
--- a/qt/scientific_interfaces/Indirect/Iqt.cpp
+++ b/qt/scientific_interfaces/Indirect/Iqt.cpp
@@ -123,6 +123,7 @@ void Iqt::setup() {
           SLOT(updateDisplayedBinParameters()));
   connect(m_batchAlgoRunner, SIGNAL(batchComplete(bool)), this,
           SLOT(algorithmComplete(bool)));
+  connect(m_uiForm.pbRun, SIGNAL(clicked()), this, SLOT(runClicked()));
   connect(m_uiForm.pbSave, SIGNAL(clicked()), this, SLOT(saveClicked()));
   connect(m_uiForm.pbPlot, SIGNAL(clicked()), this, SLOT(plotClicked()));
   connect(m_uiForm.pbTile, SIGNAL(clicked()), this, SLOT(plotTiled()));
@@ -135,6 +136,8 @@ void Iqt::setup() {
 void Iqt::run() {
   using namespace Mantid::API;
 
+  setRunEnabled(false);
+
   updateDisplayedBinParameters();
 
   // Construct the result workspace for Python script export
@@ -179,6 +182,7 @@ void Iqt::run() {
 void Iqt::algorithmComplete(bool error) {
   if (error)
     return;
+  setRunEnabled(true);
   m_uiForm.pbPlot->setEnabled(true);
   m_uiForm.pbSave->setEnabled(true);
   m_uiForm.pbTile->setEnabled(true);
@@ -303,7 +307,7 @@ void Iqt::updatePropertyValues(QtProperty *prop, double val) {
 
     m_dblManager->setValue(m_properties["ELow"], -val);
   } else if (prop == m_properties["ELow"]) {
-    // If the user enters a positive value for ELow, assume they ment to add a
+    // If the user enters a positive value for ELow, assume they meant to add a
     if (val > 0) {
       val = -val;
       m_dblManager->setValue(m_properties["ELow"], val);
@@ -448,6 +452,13 @@ void Iqt::updateRS(QtProperty *prop, double val) {
     xRangeSelector->setMaximum(val);
 }
 
+void Iqt::setRunEnabled(bool enabled) {
+  m_uiForm.pbRun->setEnabled(enabled);
+  m_uiForm.pbRun->setText(!enabled ? "Running..." : "Run");
+}
+
+void Iqt::runClicked() { runTab(); }
+
 } // namespace IDA
 } // namespace CustomInterfaces
 } // namespace MantidQt
diff --git a/qt/scientific_interfaces/Indirect/Iqt.h b/qt/scientific_interfaces/Indirect/Iqt.h
index 80dde813c3135815cde5ddc7fc0e198827621c24..5b551480a3b7f5ee5aaff129dd0580721b521416 100644
--- a/qt/scientific_interfaces/Indirect/Iqt.h
+++ b/qt/scientific_interfaces/Indirect/Iqt.h
@@ -13,9 +13,12 @@ class DLLExport Iqt : public IndirectDataAnalysisTab {
 public:
   Iqt(QWidget *parent = nullptr);
 
+protected:
+  void setRunEnabled(bool enabled) override;
+
 private:
-  void setup() override;
   void run() override;
+  void setup() override;
   bool validate() override;
   void loadSettings(const QSettings &settings) override;
 
@@ -28,12 +31,12 @@ private slots:
   void updateRS(QtProperty *prop, double val);
   void updatePropertyValues(QtProperty *prop, double val);
   void updateDisplayedBinParameters();
+  void runClicked();
   void saveClicked();
   void plotClicked();
   void errorsClicked();
   void plotTiled();
 
-private:
 private:
   Ui::Iqt m_uiForm;
   QtTreePropertyBrowser *m_iqtTree;
diff --git a/qt/scientific_interfaces/Indirect/Iqt.ui b/qt/scientific_interfaces/Indirect/Iqt.ui
index d7c7054ad0f12544f15b6335316ace22cf677eaa..522884e0fa57e856757fa00368a83edcf6cc3ed5 100644
--- a/qt/scientific_interfaces/Indirect/Iqt.ui
+++ b/qt/scientific_interfaces/Indirect/Iqt.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>791</width>
-    <height>538</height>
+    <width>800</width>
+    <height>736</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -188,122 +188,209 @@
     </layout>
    </item>
    <item>
-    <widget class="QGroupBox" name="ErrorCalc">
+    <widget class="QFrame" name="frame">
      <property name="minimumSize">
       <size>
        <width>0</width>
-       <height>65</height>
+       <height>0</height>
       </size>
      </property>
-     <property name="title">
-      <string>Monte Carlo Error Calculation</string>
+     <property name="frameShape">
+      <enum>QFrame::StyledPanel</enum>
+     </property>
+     <property name="frameShadow">
+      <enum>QFrame::Raised</enum>
      </property>
-     <layout class="QHBoxLayout" name="horizontalLayout_2">
+     <layout class="QVBoxLayout" name="verticalLayout_2">
+      <property name="spacing">
+       <number>0</number>
+      </property>
+      <property name="leftMargin">
+       <number>0</number>
+      </property>
+      <property name="topMargin">
+       <number>0</number>
+      </property>
+      <property name="rightMargin">
+       <number>0</number>
+      </property>
+      <property name="bottomMargin">
+       <number>0</number>
+      </property>
       <item>
-       <widget class="QLabel" name="label">
-        <property name="maximumSize">
-         <size>
-          <width>130</width>
-          <height>16777215</height>
-         </size>
-        </property>
-        <property name="text">
-         <string>Number of Iterations:</string>
-        </property>
-       </widget>
-      </item>
-      <item alignment="Qt::AlignLeft">
-       <widget class="QSpinBox" name="spIterations">
+       <widget class="QGroupBox" name="ErrorCalc">
         <property name="minimumSize">
          <size>
-          <width>60</width>
-          <height>26</height>
-         </size>
-        </property>
-        <property name="minimum">
-         <number>3</number>
-        </property>
-        <property name="maximum">
-         <number>10000</number>
-        </property>
-        <property name="value">
-         <number>50</number>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <spacer name="horizontalSpacer_2">
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
-        </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>40</width>
-          <height>20</height>
+          <width>0</width>
+          <height>65</height>
          </size>
         </property>
-       </spacer>
-      </item>
-      <item>
-       <widget class="QCheckBox" name="cbCalculateErrors">
-        <property name="text">
-         <string>Calculate Errors</string>
-        </property>
-        <property name="checked">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
-    <widget class="QGroupBox" name="gbOutput">
-     <property name="title">
-      <string>Output</string>
-     </property>
-     <layout class="QHBoxLayout" name="horizontalLayout_9">
-      <item>
-       <widget class="QPushButton" name="pbPlot">
-        <property name="enabled">
-         <bool>false</bool>
-        </property>
-        <property name="text">
-         <string>Plot Result</string>
+        <property name="title">
+         <string>Monte Carlo Error Calculation</string>
         </property>
+        <layout class="QHBoxLayout" name="horizontalLayout_2">
+         <property name="topMargin">
+          <number>0</number>
+         </property>
+         <property name="bottomMargin">
+          <number>7</number>
+         </property>
+         <item>
+          <widget class="QLabel" name="label">
+           <property name="maximumSize">
+            <size>
+             <width>130</width>
+             <height>16777215</height>
+            </size>
+           </property>
+           <property name="text">
+            <string>Number of Iterations:</string>
+           </property>
+          </widget>
+         </item>
+         <item alignment="Qt::AlignLeft">
+          <widget class="QSpinBox" name="spIterations">
+           <property name="minimumSize">
+            <size>
+             <width>60</width>
+             <height>26</height>
+            </size>
+           </property>
+           <property name="minimum">
+            <number>3</number>
+           </property>
+           <property name="maximum">
+            <number>10000</number>
+           </property>
+           <property name="value">
+            <number>50</number>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_4">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QCheckBox" name="cbCalculateErrors">
+           <property name="text">
+            <string>Calculate Errors</string>
+           </property>
+           <property name="checked">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+        </layout>
        </widget>
       </item>
       <item>
-       <widget class="QPushButton" name="pbTile">
-        <property name="enabled">
-         <bool>false</bool>
-        </property>
-        <property name="text">
-         <string>Tiled Plot</string>
+       <widget class="QGroupBox" name="gbRun">
+        <property name="title">
+         <string>Run</string>
         </property>
+        <layout class="QHBoxLayout" name="horizontalLayout_3">
+         <property name="topMargin">
+          <number>0</number>
+         </property>
+         <property name="bottomMargin">
+          <number>7</number>
+         </property>
+         <item>
+          <spacer name="horizontalSpacer_2">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QPushButton" name="pbRun">
+           <property name="text">
+            <string>Run</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_3">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
        </widget>
       </item>
       <item>
-       <spacer name="horizontalSpacer_1">
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
-        </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>40</width>
-          <height>20</height>
-         </size>
-        </property>
-       </spacer>
-      </item>
-      <item>
-       <widget class="QPushButton" name="pbSave">
-        <property name="enabled">
-         <bool>false</bool>
-        </property>
-        <property name="text">
-         <string>Save Result</string>
-        </property>
+       <widget class="QGroupBox" name="gbOutput">
+        <property name="title">
+         <string>Output</string>
+        </property>
+        <layout class="QHBoxLayout" name="horizontalLayout_9">
+         <item>
+          <widget class="QPushButton" name="pbPlot">
+           <property name="enabled">
+            <bool>false</bool>
+           </property>
+           <property name="text">
+            <string>Plot Result</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="pbTile">
+           <property name="enabled">
+            <bool>false</bool>
+           </property>
+           <property name="text">
+            <string>Tiled Plot</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_1">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QPushButton" name="pbSave">
+           <property name="enabled">
+            <bool>false</bool>
+           </property>
+           <property name="text">
+            <string>Save Result</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
        </widget>
       </item>
      </layout>
@@ -312,17 +399,17 @@
   </layout>
  </widget>
  <customwidgets>
-  <customwidget>
-   <class>MantidQt::MantidWidgets::DataSelector</class>
-   <extends>QWidget</extends>
-   <header>MantidQtWidgets/Common/DataSelector.h</header>
-  </customwidget>
   <customwidget>
    <class>MantidQt::MantidWidgets::PreviewPlot</class>
    <extends>QWidget</extends>
    <header>MantidQtWidgets/LegacyQwt/PreviewPlot.h</header>
    <container>1</container>
   </customwidget>
+  <customwidget>
+   <class>MantidQt::MantidWidgets::DataSelector</class>
+   <extends>QWidget</extends>
+   <header>MantidQtWidgets/Common/DataSelector.h</header>
+  </customwidget>
  </customwidgets>
  <resources/>
  <connections/>
diff --git a/qt/scientific_interfaces/Indirect/IqtFit.cpp b/qt/scientific_interfaces/Indirect/IqtFit.cpp
index b2aa51417d0de3cb1097fd383967533bb79b3d0b..2601a345e14cb078972bce21e860fcd0fb53d84f 100644
--- a/qt/scientific_interfaces/Indirect/IqtFit.cpp
+++ b/qt/scientific_interfaces/Indirect/IqtFit.cpp
@@ -62,6 +62,7 @@ void IqtFit::setupFitTab() {
   // Set available background options
   setBackgroundOptions({"None", "FlatBackground"});
 
+  connect(m_uiForm->pbRun, SIGNAL(clicked()), this, SLOT(runClicked()));
   connect(m_uiForm->pbPlot, SIGNAL(clicked()), this, SLOT(plotResult()));
   connect(m_uiForm->pbSave, SIGNAL(clicked()), this, SLOT(saveResult()));
 
@@ -135,6 +136,14 @@ void IqtFit::plotResult() {
   IndirectFitAnalysisTab::plotResult(m_uiForm->cbPlotType->currentText());
 }
 
+void IqtFit::setRunEnabled(bool enabled) {
+  m_uiForm->pvFitPlotView->enableFitSingleSpectrum(enabled);
+  m_uiForm->pbRun->setEnabled(enabled);
+  m_uiForm->pbRun->setText(!enabled ? "Running..." : "Run");
+}
+
+void IqtFit::runClicked() { runTab(); }
+
 } // namespace IDA
 } // namespace CustomInterfaces
 } // namespace MantidQt
diff --git a/qt/scientific_interfaces/Indirect/IqtFit.h b/qt/scientific_interfaces/Indirect/IqtFit.h
index 227f5394870d29e76b735d6983603cbd5aa38534..58656aa3d81a1ff78ffddb0792b096e4bf167f2d 100644
--- a/qt/scientific_interfaces/Indirect/IqtFit.h
+++ b/qt/scientific_interfaces/Indirect/IqtFit.h
@@ -31,6 +31,7 @@ private:
   void setupFitTab() override;
 
 protected:
+  void setRunEnabled(bool enabled) override;
   void setPlotResultEnabled(bool enabled) override;
   void setSaveResultEnabled(bool enabled) override;
 
@@ -40,6 +41,7 @@ protected slots:
   void fitFunctionChanged();
   void customBoolUpdated(const QString &key, bool value);
   void plotResult();
+  void runClicked();
 
 private:
   void setConstrainIntensitiesEnabled(bool enabled);
diff --git a/qt/scientific_interfaces/Indirect/IqtFit.ui b/qt/scientific_interfaces/Indirect/IqtFit.ui
index b34bba7a3cd5614b33c255274edc141f7deffaeb..00095efd654e82d3040301af3bfbdc42a2f8478d 100644
--- a/qt/scientific_interfaces/Indirect/IqtFit.ui
+++ b/qt/scientific_interfaces/Indirect/IqtFit.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>698</width>
-    <height>799</height>
+    <width>799</width>
+    <height>731</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -44,84 +44,159 @@
         </layout>
        </item>
        <item>
-        <widget class="MantidQt::CustomInterfaces::IDA::IndirectSpectrumSelectionView" name="svSpectrumView" native="true"/>
-       </item>
-       <item>
-        <widget class="QGroupBox" name="gbOutput">
-         <property name="title">
-          <string>Output</string>
+        <widget class="QFrame" name="frame">
+         <property name="frameShape">
+          <enum>QFrame::StyledPanel</enum>
+         </property>
+         <property name="frameShadow">
+          <enum>QFrame::Raised</enum>
          </property>
-         <layout class="QHBoxLayout" name="horizontalLayout_2">
+         <layout class="QVBoxLayout" name="verticalLayout_3">
+          <property name="spacing">
+           <number>0</number>
+          </property>
+          <property name="leftMargin">
+           <number>0</number>
+          </property>
+          <property name="topMargin">
+           <number>0</number>
+          </property>
+          <property name="rightMargin">
+           <number>0</number>
+          </property>
+          <property name="bottomMargin">
+           <number>0</number>
+          </property>
           <item>
-           <widget class="QLabel" name="lbPlotType">
-            <property name="text">
-             <string>Plot Output: </string>
-            </property>
-           </widget>
+           <widget class="MantidQt::CustomInterfaces::IDA::IndirectSpectrumSelectionView" name="svSpectrumView" native="true"/>
           </item>
           <item>
-           <widget class="QComboBox" name="cbPlotType">
-            <property name="enabled">
-             <bool>false</bool>
+           <widget class="QGroupBox" name="gbRun">
+            <property name="title">
+             <string>Run</string>
             </property>
-            <item>
-             <property name="text">
-              <string>Background</string>
+            <layout class="QHBoxLayout" name="horizontalLayout">
+             <property name="topMargin">
+              <number>0</number>
              </property>
-            </item>
-            <item>
-             <property name="text">
-              <string>Intensity</string>
+             <property name="bottomMargin">
+              <number>7</number>
              </property>
-            </item>
-            <item>
-             <property name="text">
-              <string>Tau</string>
-             </property>
-            </item>
-            <item>
-             <property name="text">
-              <string>Beta</string>
-             </property>
-            </item>
-            <item>
-             <property name="text">
-              <string>All</string>
-             </property>
-            </item>
-           </widget>
-          </item>
-          <item>
-           <widget class="QPushButton" name="pbPlot">
-            <property name="enabled">
-             <bool>false</bool>
-            </property>
-            <property name="text">
-             <string>Plot Result</string>
-            </property>
+             <item>
+              <spacer name="horizontalSpacer">
+               <property name="orientation">
+                <enum>Qt::Horizontal</enum>
+               </property>
+               <property name="sizeHint" stdset="0">
+                <size>
+                 <width>40</width>
+                 <height>20</height>
+                </size>
+               </property>
+              </spacer>
+             </item>
+             <item>
+              <widget class="QPushButton" name="pbRun">
+               <property name="text">
+                <string>Run</string>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <spacer name="horizontalSpacer_2">
+               <property name="orientation">
+                <enum>Qt::Horizontal</enum>
+               </property>
+               <property name="sizeHint" stdset="0">
+                <size>
+                 <width>40</width>
+                 <height>20</height>
+                </size>
+               </property>
+              </spacer>
+             </item>
+            </layout>
            </widget>
           </item>
           <item>
-           <spacer name="horizontalSpacer_1">
-            <property name="orientation">
-             <enum>Qt::Horizontal</enum>
-            </property>
-            <property name="sizeHint" stdset="0">
-             <size>
-              <width>40</width>
-              <height>20</height>
-             </size>
-            </property>
-           </spacer>
-          </item>
-          <item>
-           <widget class="QPushButton" name="pbSave">
-            <property name="enabled">
-             <bool>false</bool>
-            </property>
-            <property name="text">
-             <string>Save Result</string>
+           <widget class="QGroupBox" name="gbOutput">
+            <property name="title">
+             <string>Output</string>
             </property>
+            <layout class="QHBoxLayout" name="horizontalLayout_2">
+             <item>
+              <widget class="QLabel" name="lbPlotType">
+               <property name="text">
+                <string>Plot Output: </string>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <widget class="QComboBox" name="cbPlotType">
+               <property name="enabled">
+                <bool>false</bool>
+               </property>
+               <item>
+                <property name="text">
+                 <string>Background</string>
+                </property>
+               </item>
+               <item>
+                <property name="text">
+                 <string>Intensity</string>
+                </property>
+               </item>
+               <item>
+                <property name="text">
+                 <string>Tau</string>
+                </property>
+               </item>
+               <item>
+                <property name="text">
+                 <string>Beta</string>
+                </property>
+               </item>
+               <item>
+                <property name="text">
+                 <string>All</string>
+                </property>
+               </item>
+              </widget>
+             </item>
+             <item>
+              <widget class="QPushButton" name="pbPlot">
+               <property name="enabled">
+                <bool>false</bool>
+               </property>
+               <property name="text">
+                <string>Plot Result</string>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <spacer name="horizontalSpacer_1">
+               <property name="orientation">
+                <enum>Qt::Horizontal</enum>
+               </property>
+               <property name="sizeHint" stdset="0">
+                <size>
+                 <width>40</width>
+                 <height>20</height>
+                </size>
+               </property>
+              </spacer>
+             </item>
+             <item>
+              <widget class="QPushButton" name="pbSave">
+               <property name="enabled">
+                <bool>false</bool>
+               </property>
+               <property name="text">
+                <string>Save Result</string>
+               </property>
+              </widget>
+             </item>
+            </layout>
            </widget>
           </item>
          </layout>
diff --git a/qt/scientific_interfaces/Indirect/JumpFit.cpp b/qt/scientific_interfaces/Indirect/JumpFit.cpp
index 25293d4d61f7aeea42bb8936f3e3f3b8fcc6abe5..52d9fd6fd410360f99d8fbc571ff86515a57d04a 100644
--- a/qt/scientific_interfaces/Indirect/JumpFit.cpp
+++ b/qt/scientific_interfaces/Indirect/JumpFit.cpp
@@ -63,6 +63,7 @@ void JumpFit::setupFitTab() {
   m_uiForm->cbParameter->setEnabled(false);
 
   // Handle plotting and saving
+  connect(m_uiForm->pbRun, SIGNAL(clicked()), this, SLOT(runClicked()));
   connect(m_uiForm->pbSave, SIGNAL(clicked()), this, SLOT(saveResult()));
   connect(m_uiForm->pbPlot, SIGNAL(clicked()), this, SLOT(plotClicked()));
   connect(this, SIGNAL(functionChanged()), this,
@@ -90,6 +91,14 @@ void JumpFit::plotClicked() {
   IndirectFitAnalysisTab::plotResult(m_uiForm->cbPlotType->currentText());
 }
 
+void JumpFit::setRunEnabled(bool enabled) {
+  m_uiForm->pvFitPlotView->enableFitSingleSpectrum(enabled);
+  m_uiForm->pbRun->setEnabled(enabled);
+  m_uiForm->pbRun->setText(!enabled ? "Running..." : "Run");
+}
+
+void JumpFit::runClicked() { runTab(); }
+
 } // namespace IDA
 } // namespace CustomInterfaces
 } // namespace MantidQt
diff --git a/qt/scientific_interfaces/Indirect/JumpFit.h b/qt/scientific_interfaces/Indirect/JumpFit.h
index b077582b27c49575debb9561ead3c2cb304c58b3..5575de512e316fd166e4a63f72363de0a06c69c9 100644
--- a/qt/scientific_interfaces/Indirect/JumpFit.h
+++ b/qt/scientific_interfaces/Indirect/JumpFit.h
@@ -23,8 +23,10 @@ protected slots:
   void updatePlotOptions() override;
   void updateModelFitTypeString();
   void plotClicked();
+  void runClicked();
 
 protected:
+  void setRunEnabled(bool enabled) override;
   void setPlotResultEnabled(bool enabled) override;
   void setSaveResultEnabled(bool enabled) override;
 
diff --git a/qt/scientific_interfaces/Indirect/JumpFit.ui b/qt/scientific_interfaces/Indirect/JumpFit.ui
index 7a637d9169d4d833a36967e7b21dae1f516d253e..d54d47eb25eff31007be9af5c97718e954d49213 100644
--- a/qt/scientific_interfaces/Indirect/JumpFit.ui
+++ b/qt/scientific_interfaces/Indirect/JumpFit.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>805</width>
-    <height>798</height>
+    <width>798</width>
+    <height>734</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -137,63 +137,134 @@
         </layout>
        </item>
        <item>
-        <layout class="QHBoxLayout" name="loOutput">
-         <item>
-          <widget class="QGroupBox" name="gbOutput">
-           <property name="title">
-            <string>Output Options</string>
-           </property>
-           <layout class="QHBoxLayout" name="horizontalLayout">
-            <item>
-             <widget class="QLabel" name="lbPlotOutput">
-              <property name="text">
-               <string>Plot Output:</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QComboBox" name="cbPlotType">
-              <item>
+        <widget class="QFrame" name="fResults">
+         <property name="frameShape">
+          <enum>QFrame::StyledPanel</enum>
+         </property>
+         <property name="frameShadow">
+          <enum>QFrame::Raised</enum>
+         </property>
+         <layout class="QVBoxLayout" name="verticalLayout_3">
+          <property name="spacing">
+           <number>0</number>
+          </property>
+          <property name="leftMargin">
+           <number>0</number>
+          </property>
+          <property name="topMargin">
+           <number>0</number>
+          </property>
+          <property name="rightMargin">
+           <number>0</number>
+          </property>
+          <property name="bottomMargin">
+           <number>0</number>
+          </property>
+          <item>
+           <widget class="QGroupBox" name="gbRun">
+            <property name="title">
+             <string>Run</string>
+            </property>
+            <layout class="QHBoxLayout" name="horizontalLayout_2">
+             <property name="topMargin">
+              <number>0</number>
+             </property>
+             <property name="bottomMargin">
+              <number>7</number>
+             </property>
+             <item>
+              <spacer name="horizontalSpacer_2">
+               <property name="orientation">
+                <enum>Qt::Horizontal</enum>
+               </property>
+               <property name="sizeHint" stdset="0">
+                <size>
+                 <width>40</width>
+                 <height>20</height>
+                </size>
+               </property>
+              </spacer>
+             </item>
+             <item>
+              <widget class="QPushButton" name="pbRun">
                <property name="text">
-                <string>All</string>
+                <string>Run</string>
                </property>
-              </item>
-             </widget>
-            </item>
-            <item>
-             <widget class="QPushButton" name="pbPlot">
-              <property name="text">
-               <string>Plot</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <spacer name="horizontalSpacer">
-              <property name="orientation">
-               <enum>Qt::Horizontal</enum>
-              </property>
-              <property name="sizeHint" stdset="0">
-               <size>
-                <width>40</width>
-                <height>20</height>
-               </size>
-              </property>
-             </spacer>
-            </item>
-            <item>
-             <widget class="QPushButton" name="pbSave">
-              <property name="enabled">
-               <bool>false</bool>
-              </property>
-              <property name="text">
-               <string>Save Result</string>
-              </property>
-             </widget>
-            </item>
-           </layout>
-          </widget>
-         </item>
-        </layout>
+              </widget>
+             </item>
+             <item>
+              <spacer name="horizontalSpacer_3">
+               <property name="orientation">
+                <enum>Qt::Horizontal</enum>
+               </property>
+               <property name="sizeHint" stdset="0">
+                <size>
+                 <width>40</width>
+                 <height>20</height>
+                </size>
+               </property>
+              </spacer>
+             </item>
+            </layout>
+           </widget>
+          </item>
+          <item>
+           <widget class="QGroupBox" name="gbOutput">
+            <property name="title">
+             <string>Output Options</string>
+            </property>
+            <layout class="QHBoxLayout" name="horizontalLayout">
+             <item>
+              <widget class="QLabel" name="lbPlotOutput">
+               <property name="text">
+                <string>Plot Output:</string>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <widget class="QComboBox" name="cbPlotType">
+               <item>
+                <property name="text">
+                 <string>All</string>
+                </property>
+               </item>
+              </widget>
+             </item>
+             <item>
+              <widget class="QPushButton" name="pbPlot">
+               <property name="text">
+                <string>Plot</string>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <spacer name="horizontalSpacer">
+               <property name="orientation">
+                <enum>Qt::Horizontal</enum>
+               </property>
+               <property name="sizeHint" stdset="0">
+                <size>
+                 <width>40</width>
+                 <height>20</height>
+                </size>
+               </property>
+              </spacer>
+             </item>
+             <item>
+              <widget class="QPushButton" name="pbSave">
+               <property name="enabled">
+                <bool>false</bool>
+               </property>
+               <property name="text">
+                <string>Save Result</string>
+               </property>
+              </widget>
+             </item>
+            </layout>
+           </widget>
+          </item>
+         </layout>
+        </widget>
        </item>
       </layout>
      </widget>
diff --git a/qt/scientific_interfaces/Indirect/MSDFit.cpp b/qt/scientific_interfaces/Indirect/MSDFit.cpp
index 39f4b31e3b66bcf95b0c55debb100825986d0529..892884be5d1439d9e4ff888e23a68c8fc8a164f8 100644
--- a/qt/scientific_interfaces/Indirect/MSDFit.cpp
+++ b/qt/scientific_interfaces/Indirect/MSDFit.cpp
@@ -47,6 +47,7 @@ void MSDFit::setupFitTab() {
   setSampleWSSuffices({"_eq"});
   setSampleFBSuffices({"_eq.nxs"});
 
+  connect(m_uiForm->pbRun, SIGNAL(clicked()), this, SLOT(runClicked()));
   connect(m_uiForm->pbPlot, SIGNAL(clicked()), this, SLOT(plotClicked()));
   connect(m_uiForm->pbSave, SIGNAL(clicked()), this, SLOT(saveResult()));
   connect(this, SIGNAL(functionChanged()), this,
@@ -69,6 +70,14 @@ void MSDFit::setSaveResultEnabled(bool enabled) {
   m_uiForm->pbSave->setEnabled(enabled);
 }
 
+void MSDFit::setRunEnabled(bool enabled) {
+  m_uiForm->pvFitPlotView->enableFitSingleSpectrum(enabled);
+  m_uiForm->pbRun->setEnabled(enabled);
+  m_uiForm->pbRun->setText(!enabled ? "Running..." : "Run");
+}
+
+void MSDFit::runClicked() { runTab(); }
+
 } // namespace IDA
 } // namespace CustomInterfaces
 } // namespace MantidQt
diff --git a/qt/scientific_interfaces/Indirect/MSDFit.h b/qt/scientific_interfaces/Indirect/MSDFit.h
index c9e64b5f788bf0b3331d61c4447861a010df18c9..27e82480ff64a903ce83c6a8b276e8ba7830f70e 100644
--- a/qt/scientific_interfaces/Indirect/MSDFit.h
+++ b/qt/scientific_interfaces/Indirect/MSDFit.h
@@ -21,10 +21,12 @@ private:
 
 protected slots:
   void plotClicked();
+  void runClicked();
   void updatePlotOptions() override;
   void updateModelFitTypeString();
 
 protected:
+  void setRunEnabled(bool enabled) override;
   void setPlotResultEnabled(bool enabled) override;
   void setSaveResultEnabled(bool enabled) override;
 
diff --git a/qt/scientific_interfaces/Indirect/MSDFit.ui b/qt/scientific_interfaces/Indirect/MSDFit.ui
index 764d6a883172df358be5052f78059faf8111c682..0e7da511e9249580482372daf7442decf3e2fe73 100644
--- a/qt/scientific_interfaces/Indirect/MSDFit.ui
+++ b/qt/scientific_interfaces/Indirect/MSDFit.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>775</width>
-    <height>799</height>
+    <width>802</width>
+    <height>736</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -23,8 +23,11 @@
       <bool>false</bool>
      </property>
      <widget class="MantidQt::CustomInterfaces::IDA::IndirectFitDataView" name="fitDataView" native="true"/>
-     <widget class="QWidget" name="">
+     <widget class="QWidget" name="layoutWidget">
       <layout class="QVBoxLayout" name="verticalLayout">
+       <property name="spacing">
+        <number>6</number>
+       </property>
        <item>
         <layout class="QHBoxLayout" name="loPlotArea" stretch="1,1">
          <item>
@@ -38,48 +41,123 @@
         </layout>
        </item>
        <item>
-        <widget class="MantidQt::CustomInterfaces::IDA::IndirectSpectrumSelectionView" name="svSpectrumView" native="true"/>
-       </item>
-       <item>
-        <widget class="QGroupBox" name="gbOutput">
-         <property name="title">
-          <string>Output</string>
+        <widget class="QFrame" name="frame">
+         <property name="frameShape">
+          <enum>QFrame::StyledPanel</enum>
+         </property>
+         <property name="frameShadow">
+          <enum>QFrame::Raised</enum>
          </property>
-         <layout class="QHBoxLayout" name="horizontalLayout_8">
+         <layout class="QVBoxLayout" name="verticalLayout_3">
+          <property name="spacing">
+           <number>0</number>
+          </property>
+          <property name="leftMargin">
+           <number>0</number>
+          </property>
+          <property name="topMargin">
+           <number>0</number>
+          </property>
+          <property name="rightMargin">
+           <number>0</number>
+          </property>
+          <property name="bottomMargin">
+           <number>0</number>
+          </property>
           <item>
-           <widget class="QPushButton" name="pbPlot">
-            <property name="enabled">
-             <bool>false</bool>
-            </property>
-            <property name="text">
-             <string>Plot Result</string>
-            </property>
-            <property name="checked">
-             <bool>false</bool>
-            </property>
-           </widget>
+           <widget class="MantidQt::CustomInterfaces::IDA::IndirectSpectrumSelectionView" name="svSpectrumView" native="true"/>
           </item>
           <item>
-           <spacer name="horizontalSpacer_1">
-            <property name="orientation">
-             <enum>Qt::Horizontal</enum>
-            </property>
-            <property name="sizeHint" stdset="0">
-             <size>
-              <width>40</width>
-              <height>20</height>
-             </size>
+           <widget class="QGroupBox" name="gbRun">
+            <property name="title">
+             <string>Run</string>
             </property>
-           </spacer>
+            <layout class="QHBoxLayout" name="horizontalLayout">
+             <property name="topMargin">
+              <number>0</number>
+             </property>
+             <property name="bottomMargin">
+              <number>7</number>
+             </property>
+             <item>
+              <spacer name="horizontalSpacer">
+               <property name="orientation">
+                <enum>Qt::Horizontal</enum>
+               </property>
+               <property name="sizeHint" stdset="0">
+                <size>
+                 <width>40</width>
+                 <height>20</height>
+                </size>
+               </property>
+              </spacer>
+             </item>
+             <item>
+              <widget class="QPushButton" name="pbRun">
+               <property name="text">
+                <string>Run</string>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <spacer name="horizontalSpacer_2">
+               <property name="orientation">
+                <enum>Qt::Horizontal</enum>
+               </property>
+               <property name="sizeHint" stdset="0">
+                <size>
+                 <width>40</width>
+                 <height>20</height>
+                </size>
+               </property>
+              </spacer>
+             </item>
+            </layout>
+           </widget>
           </item>
           <item>
-           <widget class="QPushButton" name="pbSave">
-            <property name="enabled">
-             <bool>false</bool>
-            </property>
-            <property name="text">
-             <string>Save Result</string>
+           <widget class="QGroupBox" name="gbOutput">
+            <property name="title">
+             <string>Output</string>
             </property>
+            <layout class="QHBoxLayout" name="horizontalLayout_8">
+             <item>
+              <widget class="QPushButton" name="pbPlot">
+               <property name="enabled">
+                <bool>false</bool>
+               </property>
+               <property name="text">
+                <string>Plot Result</string>
+               </property>
+               <property name="checked">
+                <bool>false</bool>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <spacer name="horizontalSpacer_1">
+               <property name="orientation">
+                <enum>Qt::Horizontal</enum>
+               </property>
+               <property name="sizeHint" stdset="0">
+                <size>
+                 <width>40</width>
+                 <height>20</height>
+                </size>
+               </property>
+              </spacer>
+             </item>
+             <item>
+              <widget class="QPushButton" name="pbSave">
+               <property name="enabled">
+                <bool>false</bool>
+               </property>
+               <property name="text">
+                <string>Save Result</string>
+               </property>
+              </widget>
+             </item>
+            </layout>
            </widget>
           </item>
          </layout>
diff --git a/qt/widgets/common/inc/MantidQtWidgets/Common/PythonSystemHeader.h b/qt/widgets/common/inc/MantidQtWidgets/Common/PythonSystemHeader.h
index c34ec1bb3175293255fcf8b0200b23ba6e0cec76..bc25aa795879c881908ca410bb079f9249608016 100644
--- a/qt/widgets/common/inc/MantidQtWidgets/Common/PythonSystemHeader.h
+++ b/qt/widgets/common/inc/MantidQtWidgets/Common/PythonSystemHeader.h
@@ -20,14 +20,18 @@
 #define TO_LONG PyLong_AsLong
 #define FROM_LONG PyLong_FromLong
 #define STR_CHECK PyUnicode_Check
+#define BYTES_CHECK PyBytes_Check
 #define TO_CSTRING _PyUnicode_AsString
+#define PYBYTES_TO_CSTRING PyBytes_AsString
 #define FROM_CSTRING PyUnicode_FromString
 #define CODE_OBJECT(x) x
 #else
 #define INT_CHECK PyInt_Check
 #define TO_LONG PyInt_AsLong
 #define STR_CHECK PyString_Check
+#define BYTES_CHECK PyString_Check
 #define TO_CSTRING PyString_AsString
+#define PYBYTES_TO_CSTRING PyString_AsString
 #define FROM_CSTRING PyString_FromString
 #define CODE_OBJECT(x) (PyCodeObject *)x
 #define FROM_LONG PyInt_FromLong
diff --git a/qt/widgets/common/inc/MantidQtWidgets/Common/TSVSerialiser.h b/qt/widgets/common/inc/MantidQtWidgets/Common/TSVSerialiser.h
index 559bb49406703bb21e1a22835bc60813c47202b3..a4fb49291012a14a00a68bc7b55b154bc72dc041 100644
--- a/qt/widgets/common/inc/MantidQtWidgets/Common/TSVSerialiser.h
+++ b/qt/widgets/common/inc/MantidQtWidgets/Common/TSVSerialiser.h
@@ -123,6 +123,16 @@ public:
   bool selectLine(const std::string &name, const size_t i = 0);
   bool selectSection(const std::string &name, const size_t i = 0);
 
+  void storeDouble(const double val);
+  void storeInt(const int val);
+  void storeString(const std::string val);
+  void storeBool(const bool val);
+
+  double readDouble();
+  int readInt();
+  std::string readString();
+  bool readBool();
+
   int asInt(const size_t i) const;
   size_t asSize_t(const size_t i) const;
   double asDouble(const size_t i) const;
diff --git a/qt/widgets/common/src/TSVSerialiser.cpp b/qt/widgets/common/src/TSVSerialiser.cpp
index 7196097c1e058023d7237482d97e67f3ea6247f1..08676d3faeeb681358e0ad1c0236eba05a6577d9 100644
--- a/qt/widgets/common/src/TSVSerialiser.cpp
+++ b/qt/widgets/common/src/TSVSerialiser.cpp
@@ -316,6 +316,23 @@ QString TSVSerialiser::asQString(const size_t i) const {
   return QString::fromStdString(m_curValues.at(i));
 }
 
+void TSVSerialiser::storeDouble(const double val) { m_output << "\t" << val; }
+
+void TSVSerialiser::storeInt(const int val) { m_output << "\t" << val; }
+void TSVSerialiser::storeString(const std::string val) {
+  m_output << "\t" << val;
+}
+
+void TSVSerialiser::storeBool(const bool val) { m_output << "\t" << val; }
+
+double TSVSerialiser::readDouble() { return asDouble(m_curIndex++); }
+
+int TSVSerialiser::readInt() { return asInt(m_curIndex++); }
+
+std::string TSVSerialiser::readString() { return asString(m_curIndex++); }
+
+bool TSVSerialiser::readBool() { return asBool(m_curIndex++); }
+
 TSVSerialiser &TSVSerialiser::operator>>(int &val) {
   val = asInt(m_curIndex++);
   return *this;
@@ -384,7 +401,7 @@ TSVSerialiser &TSVSerialiser::writeLine(const std::string &name) {
 }
 
 TSVSerialiser &TSVSerialiser::operator<<(const std::string &val) {
-  m_output << "\t" << val;
+  storeString(val);
   return *this;
 }
 
@@ -400,12 +417,12 @@ TSVSerialiser &TSVSerialiser::operator<<(const QString &val) {
 }
 
 TSVSerialiser &TSVSerialiser::operator<<(const double &val) {
-  m_output << "\t" << val;
+  storeDouble(val);
   return *this;
 }
 
 TSVSerialiser &TSVSerialiser::operator<<(const int &val) {
-  m_output << "\t" << val;
+  storeInt(val);
   return *this;
 }
 
@@ -415,7 +432,7 @@ TSVSerialiser &TSVSerialiser::operator<<(const size_t &val) {
 }
 
 TSVSerialiser &TSVSerialiser::operator<<(const bool &val) {
-  m_output << "\t" << val;
+  storeBool(val);
   return *this;
 }
 
diff --git a/scripts/Diffraction/isis_powder/gem_routines/gem_algs.py b/scripts/Diffraction/isis_powder/gem_routines/gem_algs.py
index 3646b542c69464c2ad79e7bf4da0c6f9e29b01d3..38b586382d18481134578d454e4b4c67bcb173e9 100644
--- a/scripts/Diffraction/isis_powder/gem_routines/gem_algs.py
+++ b/scripts/Diffraction/isis_powder/gem_routines/gem_algs.py
@@ -21,13 +21,16 @@ def calculate_van_absorb_corrections(ws_to_correct, multiple_scattering, is_vana
 
 def get_run_details(run_number_string, inst_settings, is_vanadium_run):
     # Get empty and vanadium
-
     mode_run_numbers = _get_current_mode_dictionary(run_number_string, inst_settings)
 
     empty_runs = _get_run_numbers_for_key(current_mode_run_numbers=mode_run_numbers, key="empty_run_numbers")
     vanadium_runs = _get_run_numbers_for_key(current_mode_run_numbers=mode_run_numbers, key="vanadium_run_numbers")
-
     grouping_file_name = inst_settings.grouping_file_name
+    if inst_settings.texture_mode:
+        return create_run_details_object(run_number_string=run_number_string, inst_settings=inst_settings,
+                                         is_vanadium_run=is_vanadium_run, empty_run_number=empty_runs,
+                                         grouping_file_name=grouping_file_name, vanadium_string=vanadium_runs,
+                                         splined_name_list=["texture_mode"])
 
     return create_run_details_object(run_number_string=run_number_string, inst_settings=inst_settings,
 
diff --git a/scripts/Diffraction/isis_powder/gem_routines/gem_param_mapping.py b/scripts/Diffraction/isis_powder/gem_routines/gem_param_mapping.py
index 543f93db863a83ecdd8be82e43417479a5b37081..4c34b23f944512774e6db1ae289b29a96f3229a9 100644
--- a/scripts/Diffraction/isis_powder/gem_routines/gem_param_mapping.py
+++ b/scripts/Diffraction/isis_powder/gem_routines/gem_param_mapping.py
@@ -30,7 +30,7 @@ attr_mapping = \
      ParamMapEntry(ext_name="save_maud",                 int_name="save_maud"),
      ParamMapEntry(ext_name="spline_coefficient",        int_name="spline_coeff"),
      ParamMapEntry(ext_name="suffix",                    int_name="suffix",         optional=True),
-     ParamMapEntry(ext_name="texture_mode",              int_name="texture_mode"),
+     ParamMapEntry(ext_name="texture_mode",              int_name="texture_mode",         optional=True),
      ParamMapEntry(ext_name="output_directory",          int_name="output_dir"),
      ParamMapEntry(ext_name="unit_to_keep",              int_name="unit_to_keep",
                    enum_class=WORKSPACE_UNITS,           optional=True),
diff --git a/scripts/Diffraction/isis_powder/pearl.py b/scripts/Diffraction/isis_powder/pearl.py
index ef5d8fc5fc4901c2431f94227741771b3e188916..7463e45414adeea5f7604633496b9f88b9777102 100644
--- a/scripts/Diffraction/isis_powder/pearl.py
+++ b/scripts/Diffraction/isis_powder/pearl.py
@@ -72,7 +72,8 @@ class Pearl(AbstractInst):
 
     @contextmanager
     def _apply_temporary_inst_settings(self, kwargs):
-        self._switch_long_mode_inst_settings(kwargs.get("long_mode"))
+        if not self._inst_settings.long_mode == bool(kwargs.get("long_mode")):
+            self._switch_long_mode_inst_settings(kwargs.get("long_mode"))
         self._inst_settings.update_attributes(kwargs=kwargs)
         yield
         self._inst_settings = copy.deepcopy(self._default_inst_settings)
diff --git a/scripts/Diffraction/isis_powder/pearl_routines/pearl_advanced_config.py b/scripts/Diffraction/isis_powder/pearl_routines/pearl_advanced_config.py
index 9e61b6e2038796ae2ce3b6a51966c7311d3f3f53..5afa4338b15ab657abe89739c2fbcb77197be287 100644
--- a/scripts/Diffraction/isis_powder/pearl_routines/pearl_advanced_config.py
+++ b/scripts/Diffraction/isis_powder/pearl_routines/pearl_advanced_config.py
@@ -5,8 +5,7 @@ general_params = {
     "monitor_mask_regions": array([[3.45, 2.96, 2.1,  1.73],
                                    [3.7,  3.2,  2.26, 1.98]]),
     "monitor_spectrum_number": 1,
-    "monitor_spline_coefficient": 20,
-    "spline_coefficient": 60,
+
     "generate_absorb_corrections": False,
 
     "file_names": {
@@ -41,7 +40,9 @@ long_mode_off_params = {
         (1500, 19900),  # Bank 12
         (1500, 19900),  # Bank 13
         (1500, 19900)   # Bank 14
-    ]
+    ],
+    "monitor_spline_coefficient": 20,
+    "spline_coefficient": 60
 }
 
 long_mode_on_params = {
@@ -67,7 +68,9 @@ long_mode_on_params = {
         (20300, 39990),  # Bank 12
         (20300, 39990),  # Bank 13
         (20300, 39990)   # Bank 14
-    ]
+    ],
+    "monitor_spline_coefficient": 20,
+    "spline_coefficient": 60
 }
 
 calibration_params = {
@@ -112,17 +115,17 @@ variable_help = {
                                  "raw data to 20,000 microseconds worth of data",
         "focused_cropping_values": "These values are used to determine the TOF range to crop a focused (not Vanadium "
                                    "calibration) workspace to. These are applied on a bank by bank basis. They must "
-                                   "be less than the values specified for raw_data_tof_cropping."
-    },
-
-    "general_params": {
-        "monitor_spectrum_number": "The spectrum number the monitor is located at in the workspace",
+                                   "be less than the values specified for raw_data_tof_cropping.",
         "monitor_spline_coefficient": "The coefficient to use whilst calculating a spline from the monitor."
                                       "workspace. This is used to normalise the workspace current.",
         "spline_coefficient": "The coefficient to use whilst calculating a spline for each bank during "
                               "a vanadium calibration."
     },
 
+    "general_params": {
+        "monitor_spectrum_number": "The spectrum number the monitor is located at in the workspace",
+    },
+
     "calibration_params": {
         "create_cal_rebin_1_params": "The parameters for the first rebin step used to create a calibration file",
         "create_cal_rebin_2_params": "The parameters for the second rebin step used to create a calibration file",
diff --git a/scripts/Inelastic/IndirectReductionCommon.py b/scripts/Inelastic/IndirectReductionCommon.py
index 27198d971728769e322179174cce152b0577f6ef..c3153954aa684b2bf6075e9b1df436a470d7e488 100644
--- a/scripts/Inelastic/IndirectReductionCommon.py
+++ b/scripts/Inelastic/IndirectReductionCommon.py
@@ -966,7 +966,7 @@ def rebin_reduction(workspace_name, rebin_string, multi_frame_rebin_string, num_
     @param multi_frame_rebin_string Rebin string for multiple frame rebinning
     @param num_bins Max number of bins in input frames
     """
-    from mantid.simpleapi import (Rebin, RebinToWorkspace, SortXAxis)
+    from mantid.simpleapi import (Rebin, SortXAxis)
 
     if rebin_string is not None:
         if multi_frame_rebin_string is not None and num_bins is not None:
@@ -989,9 +989,18 @@ def rebin_reduction(workspace_name, rebin_string, multi_frame_rebin_string, num_
     else:
         try:
             # If user does not want to rebin then just ensure uniform binning across spectra
-            RebinToWorkspace(WorkspaceToRebin=workspace_name,
-                             WorkspaceToMatch=workspace_name,
-                             OutputWorkspace=workspace_name)
+            # extract the binning parameters from the first spectrum.
+            # there is probably a better way to calculate the binning parameters, but this
+            # gets the right answer.
+            xaxis = mtd[workspace_name].readX(0)
+            params = []
+            for i, x in enumerate(xaxis):
+                params.append(x)
+                if i < len(xaxis) -1:
+                    params.append(xaxis[i+1] - x) # delta
+            Rebin(InputWorkspace=workspace_name,
+                  OutputWorkspace=workspace_name,
+                  Params=params)
         except RuntimeError:
             logger.warning('Rebinning failed, will try to continue anyway.')
 
diff --git a/scripts/SANS/SANSUtility.py b/scripts/SANS/SANSUtility.py
index 2cc9f3d9fbc5d105272445bfa1c9459e71a0012b..cae2af7331027201d2b167a6e827c1eeefbfbe8e 100644
--- a/scripts/SANS/SANSUtility.py
+++ b/scripts/SANS/SANSUtility.py
@@ -290,9 +290,10 @@ def fromEvent2Histogram(ws_event, ws_monitor, binning = ""):
 
     if binning != "":
         aux_hist = Rebin(ws_event, binning, False)
-        Rebin(ws_monitor, binning, False, OutputWorkspace=name)
+        Rebin(InputWorkspace=ws_monitor, Params=binning, PreserveEvents=False, OutputWorkspace=name)
     else:
-        aux_hist = RebinToWorkspace(ws_event, ws_monitor, False)
+        aux_hist = RebinToWorkspace(WorkspaceToRebin=ws_event, WorkspaceToMatch=ws_monitor,
+                                    PreserveEvents=False)
         ws_monitor.clone(OutputWorkspace=name)
 
     ConjoinWorkspaces(name, aux_hist, CheckOverlapping=True)
diff --git a/scripts/test/Muon/PlottingPresenter_test.py b/scripts/test/Muon/PlottingPresenter_test.py
index caa481dfb3014407cc43f833ca58fafffdf30dac..6951c8abd6d11fc24efbc36d9143726b5993070e 100644
--- a/scripts/test/Muon/PlottingPresenter_test.py
+++ b/scripts/test/Muon/PlottingPresenter_test.py
@@ -1,8 +1,65 @@
 import unittest
 
+import os
+os.environ["QT_API"] = "pyqt"  # noqa E402
+
+from Muon.GUI.ElementalAnalysis.Plotting.plotting_presenter import PlotPresenter
+from Muon.GUI.ElementalAnalysis.Plotting.plotting_view import PlotView
+
+
+try:
+    from unittest import mock
+except ImportError:
+    import mock
+
 
 class PlottingPresenterTest(unittest.TestCase):
     def setUp(self):
+        view = mock.create_autospec(PlotView)
+        self.presenter = PlotPresenter(view)
+        self.presenter.view.canvas = mock.Mock()
+        self.presenter.view.canvas.draw = mock.Mock()
+        self.view = self.presenter.view
+
+        self.mock_name = mock.Mock()
+        self.mock_workspace = mock.Mock()
+        self.mock_func = mock.Mock()
+        self.mock_arbitrary_args = [mock.Mock() for i in range(3)]
+
+    def test_get_subplot(self):
+        self.presenter.get_subplot(self.mock_name)
+        self.view.get_subplot.assert_called_with(self.mock_name)
+
+    def test_get_subplots(self):
+        self.presenter.get_subplots()
+        self.assertEquals(self.view.get_subplots.call_count, 1)
+
+    def test_add_subplot(self):
+        self.presenter.add_subplot(self.mock_name)
+        self.view.add_subplot.assert_called_with(self.mock_name)
+
+    def test_plot(self):
+        self.presenter.plot(self.mock_name, self.mock_workspace)
+        self.view.plot.assert_called_with(self.mock_name, self.mock_workspace)
+
+    def test_remove_subplot(self):
+        self.presenter.remove_subplot(self.mock_name)
+        self.view.remove_subplot.assert_called_with(self.mock_name)
+
+    def test_update_canvas(self):
+        self.presenter.update_canvas()
+        self.assertEquals(self.view.canvas.draw.call_count, 1)
+
+    def test_add_moveable_vline(self):
+        """
+        To be added when moveable vlines are implemented.
+        """
+        pass
+
+    def test_add_moveable_hline(self):
+        """
+        To be added when moveable hlines are implemented.
+        """
         pass
 
 
diff --git a/scripts/test/Muon/PlottingUtils_test.py b/scripts/test/Muon/PlottingUtils_test.py
index d6838a77cd7a16445bf6935de6e54b95e24dc0ff..7a333edc6026874ec889d22332220ac19102c489 100644
--- a/scripts/test/Muon/PlottingUtils_test.py
+++ b/scripts/test/Muon/PlottingUtils_test.py
@@ -1,9 +1,25 @@
 import unittest
 
+from Muon.GUI.ElementalAnalysis.Plotting import plotting_utils as putils
+
+try:
+    from unittest import mock
+except ImportError:
+    import mock
+
 
 class PlottingUtilsTest(unittest.TestCase):
     def setUp(self):
-        pass
+        putils.layout = [mock.Mock() for i in putils.layout]
+
+    def test_get_layout_num_too_high(self):
+        with self.assertRaises(IndexError):
+            putils.get_layout(6)
+
+    def test_layout_functions_called(self):
+        for i, layout_function in zip(range(1, 6), putils.layout):
+            putils.get_layout(i)
+            self.assertEquals(layout_function.call_count, 1)
 
 
 if __name__ == "__main__":
diff --git a/scripts/test/Muon/PlottingView_test.py b/scripts/test/Muon/PlottingView_test.py
index 0ba0d0632205a3529c8dfb154e8d2eb85affa254..41e64c8f27d88c5ba657d40f1a14e1e28ff5ce55 100644
--- a/scripts/test/Muon/PlottingView_test.py
+++ b/scripts/test/Muon/PlottingView_test.py
@@ -1,8 +1,384 @@
 import unittest
 
+import os
+os.environ["QT_API"] = "pyqt"  # noqa E402
 
-class PlottingViewTest(unittest.TestCase):
+from Muon.GUI.ElementalAnalysis.Plotting.plotting_view import PlotView
+from Muon.GUI.ElementalAnalysis.Plotting.AxisChanger.axis_changer_presenter import AxisChangerPresenter
+
+from Muon.GUI.Common import mock_widget
+
+try:
+    from unittest import mock
+except ImportError:
+    import mock
+
+
+class PlottingViewHelperFunctionTests(unittest.TestCase):
     def setUp(self):
+        self._qapp = mock_widget.mockQapp()
+
+        self.view = PlotView()
+
+        self.mock_func = mock.Mock(return_value=True)
+        self.mock_args = [mock.Mock() for i in range(3)]
+        self.mock_kwargs = {}
+        self.mock_name = mock.Mock()
+
+        self.plot_name = "test plot"
+        self.plots_return_value = mock.Mock()
+        self.plots_return_value.set_position = mock.Mock()
+        self.plots_return_value.set_subplotspec = mock.Mock()
+        self.plots_return_value.remove = mock.Mock()
+
+        self.view.figure = mock.Mock()
+        self.view.figure.tight_layout = mock.Mock()
+        self.view.figure.add_subplot = mock.Mock(
+            return_value=self.plots_return_value)
+        self.view.canvas = mock.Mock()
+        self.view.canvas.draw = mock.Mock()
+
+        self.view.plots = {self.plot_name: self.plots_return_value}
+        self.view.workspaces = {self.plot_name: [self.plots_return_value]}
+        self.mock_plot = mock.Mock()
+        self.mock_plot.get_xlim = mock.Mock()
+        self.mock_plot.get_ylim = mock.Mock()
+        self.mock_workspace = mock.Mock()
+
+        self.mock_bounds = mock.Mock()
+
+        self.mock_grid_pos = mock.Mock()
+        self.view.current_grid = mock.Mock()
+        self.view.current_grid.__getitem__ = mock.Mock(
+            return_value=self.mock_grid_pos)
+        self.mock_grid_pos.get_position = mock.Mock(return_value=True)
+
+        self.view.gridspecs = mock.Mock()
+        self.view.gridspecs.__getitem__ = mock.Mock(
+            return_value=self.view.current_grid)
+
+        self.view.plot_selector = mock.Mock()
+        self.view.plot_selector.currentText = mock.Mock(
+            return_value=self.plot_name)
+        self.view.plot_selector.clear = mock.Mock()
+        self.view.plot_selector.addItems = mock.Mock()
+
+        self.view.x_axis_changer = mock.create_autospec(AxisChangerPresenter)
+        self.view.y_axis_changer = mock.create_autospec(AxisChangerPresenter)
+
+        self.view.errors = mock.Mock()
+        self.view.errors.blockSignals = mock.Mock()
+        self.view.errors.setChecked = mock.Mock()
+
+    def test_redo_layout_with_plots_not_equal_to_zero(self):
+        self.view.plots = [mock.Mock() for i in range(3)]
+        # uses moveable_vline as this calls redo_layout, but has no other
+        # functionality
+        self.view.add_moveable_vline(*[mock.Mock() for i in range(4)])
+        self.assertEquals(self.view.figure.tight_layout.call_count, 1)
+        self.assertEquals(self.view.canvas.draw.call_count, 1)
+
+    def test_redo_layout_with_plots_equal_to_zero(self):
+        self.view.plots = []
+        # uses moveable_vline as this calls redo_layout, but has no other
+        # functionality
+        self.view.add_moveable_vline(*[mock.Mock() for i in range(4)])
+        self.assertEquals(self.view.canvas.draw.call_count, 1)
+
+    def test_silent_checkbox_check(self):
+        test_state = mock.Mock()
+        self.view._silent_checkbox_check(test_state)
+        self.view.errors.blockSignals.assert_has_calls(
+            [mock.call(True), mock.call(False)])
+        self.view.errors.setChecked.assert_called_once_with(test_state)
+
+    def test_get_current_plot_name(self):
+        self.assertEquals(self.view._get_current_plot_name(), self.plot_name)
+
+    def _common_set_plot_bounds(self, result):
+        self.view._silent_checkbox_check = mock.Mock()
+        self.view._set_plot_bounds(self.plot_name, self.mock_plot)
+        self.view.x_axis_changer.set_bounds.assert_called_once_with(
+            self.mock_plot.get_xlim())
+        self.view.y_axis_changer.set_bounds.assert_called_once_with(
+            self.mock_plot.get_ylim())
+        self.view._silent_checkbox_check.assert_called_once_with(result)
+
+    def test_set_plot_bounds_in_errors_list(self):
+        self.view.errors_list = [self.plot_name]
+        self._common_set_plot_bounds(True)
+
+    def test_set_plot_bounds_not_in_errors_list(self):
+        self._common_set_plot_bounds(False)
+
+    def test_set_bounds_when_new_plots(self):
+        self.view._set_plot_bounds = mock.Mock()
+        self.view.get_subplot = mock.Mock(return_value=self.mock_plot)
+        self.view.plots = {self.plot_name: self.mock_plot}
+        self.view._set_bounds(self.plot_name)
+        self.view.get_subplot.assert_called_once_with(self.plot_name)
+        self.view._set_plot_bounds.assert_called_once_with(
+            self.plot_name, self.mock_plot)
+
+    def common_set_bounds_else_statement(self, plot_name):
+        self.view._set_bounds(plot_name)
+        self.assertEquals(self.view.x_axis_changer.clear_bounds.call_count, 1)
+        self.assertEquals(self.view.y_axis_changer.clear_bounds.call_count, 1)
+
+    def test_set_bounds_when_not_new_plots(self):
+        self.common_set_bounds_else_statement("")
+
+    def test_set_bounds_when_all(self):
+        self.common_set_bounds_else_statement("")
+
+    def test_get_current_plots(self):
+        self.assertEquals(
+            self.view._get_current_plots(),
+            [self.plots_return_value])
+
+    def test_get_current_plots_raises_key_error(self):
+        self.view.plots = {}
+        with self.assertRaises(KeyError):
+            self.view._get_current_plots()
+
+    def test_update_x_axis_lower(self):
+        self.view._update_x_axis = mock.Mock()
+        self.view._update_x_axis_lower(self.mock_bounds)
+        self.view._update_x_axis.assert_called_once_with(
+            {"left": self.mock_bounds})
+
+    def test_update_x_axis_upper(self):
+        self.view._update_x_axis = mock.Mock()
+        self.view._update_x_axis_upper(self.mock_bounds)
+        self.view._update_x_axis.assert_called_once_with(
+            {"right": self.mock_bounds})
+
+    def test_update_x_axis(self):
+        test_arg = {"left": self.mock_bounds}
+        self.view._update_x_axis(test_arg)
+        plot, = self.view._get_current_plots()
+        plot.set_xlim.assert_called_once_with(left=self.mock_bounds)
+
+    def test_update_y_axis_lower(self):
+        self.view._update_y_axis = mock.Mock()
+        self.view._update_y_axis_lower(self.mock_bounds)
+        self.view._update_y_axis.assert_called_once_with(
+            {"bottom": self.mock_bounds})
+
+    def test_update_y_axis_upper(self):
+        self.view._update_y_axis = mock.Mock()
+        self.view._update_y_axis_upper(self.mock_bounds)
+        self.view._update_y_axis.assert_called_once_with(
+            {"top": self.mock_bounds})
+
+    def test_update_y_axis(self):
+        test_arg = {"top": self.mock_bounds}
+        self.view._update_y_axis(test_arg)
+        plot, = self.view._get_current_plots()
+        plot.set_ylim.assert_called_once_with(top=self.mock_bounds)
+
+    def test_modify_errors_list_state_is_true(self):
+        self.view._modify_errors_list(self.plot_name, True)
+        self.assertEquals(self.view.errors_list, set([self.plot_name]))
+
+    def test_modify_errors_list_state_is_false(self):
+        self.view.errors_list = set([self.plot_name])
+        self.view._modify_errors_list(self.plot_name, False)
+        self.assertEquals(len(self.view.errors_list), 0)
+
+    def test_modify_errors_list_keyerror_thrown(self):
+        test_set = set(["test"])
+        self.view.errors_list = test_set
+        self.view._modify_errors_list(self.plot_name, False)
+        self.assertEquals(self.view.errors_list, test_set)
+
+    def test_errors_changed_all(self):
+        mock_state = True
+        self.view._get_current_plot_name = mock.Mock(return_value="All")
+        self.view._change_plot_errors = mock.Mock()
+        self.view._errors_changed(mock_state)
+        self.view._change_plot_errors.assert_called_once_with(
+            self.plot_name, self.plots_return_value, mock_state)
+
+    def test_errors_changed(self):
+        mock_state = True
+        self.view._get_current_plot_name = mock.Mock(
+            return_value=self.plot_name)
+        self.view._change_plot_errors = mock.Mock()
+        self.view._errors_changed(mock_state)
+        self.view._change_plot_errors.assert_called_once_with(
+            self.plot_name, self.plots_return_value, mock_state)
+
+    def test_change_plot_errors(self):
+        args = [self.plot_name, self.plots_return_value, True]
+        self.view._modify_errors_list = mock.Mock()
+        self.view.plot = mock.Mock()
+        self.view.workspace_plots[args[0]] = [self.plots_return_value]
+        self.view._change_plot_errors(*args)
+        self.view._modify_errors_list.assert_called_once_with(*args[::2])
+        self.assertEquals(self.plots_return_value.remove.call_count, 1)
+        self.view.plot.assert_called_once_with(
+            self.plot_name, self.plots_return_value)
+
+    def test_set_positions(self):
+        self.view._set_positions([[0, 0]])
+        self.plots_return_value.set_position.assert_called_once_with(
+            self.mock_grid_pos.get_position())
+        self.plots_return_value.set_subplotspec.assert_called_once_with(
+            self.mock_grid_pos)
+
+    def _set_update_plot_selector_and_set_positions_mocked(self):
+        self.view._set_positions = mock.Mock()
+        self.view._update_plot_selector = mock.Mock()
+
+    @mock.patch("Muon.GUI.ElementalAnalysis.Plotting.plotting_utils.get_layout")
+    def test_update_gridspec_if_new_plots(self, get_layout):
+        self._set_update_plot_selector_and_set_positions_mocked()
+        new_plots = [self.mock_plot]
+        self.view._update_gridspec(new_plots)
+        get_layout.assert_called_once_with(new_plots)
+        self.view._set_positions.assert_called_once_with(get_layout())
+        self.assertEquals(self.view._update_plot_selector.call_count, 1)
+
+    @mock.patch("Muon.GUI.ElementalAnalysis.Plotting.plotting_utils.get_layout")
+    def test_update_gridspec_if_new_plots_and_last(self, get_layout):
+        self._set_update_plot_selector_and_set_positions_mocked()
+        get_layout.return_value = [[0, 0]]
+        self.view._update_gridspec([self.mock_plot], last=self.plot_name)
+        self.view.figure.add_subplot.assert_called_once_with(
+            self.mock_grid_pos, label=self.plot_name)
+        self.plots_return_value.set_subplotspec.assert_called_once_with(
+            self.mock_grid_pos)
+        self.assertEquals(self.view._update_plot_selector.call_count, 1)
+
+    def test_gridspec_if_not_new_plots(self):
+        self.view._update_plot_selector = mock.Mock()
+        self.view._update_gridspec([])
+        self.assertEquals(self.view._update_plot_selector.call_count, 1)
+
+    def test_update_plot_selector(self):
+        self.view._update_plot_selector()
+        self.assertEquals(self.view.plot_selector.clear.call_count, 1)
+        self.view.plot_selector.addItems.assert_called_once_with(
+            list(self.view.plots.keys()))
+
+    def test_add_workspace_name_if_not_in_workspaces(self):
+        self.view._add_workspace_name(self.plot_name, self.mock_workspace)
+        self.assertEquals(self.view.workspaces[self.plot_name], [
+                          self.plots_return_value, self.mock_workspace])
+
+    def test_add_workspace_name_if_in_workspaces(self):
+        self.view.workspaces = {}
+        self.view._add_workspace_name(self.plot_name, self.mock_workspace)
+        self.assertEquals(self.view.workspaces[self.plot_name], [
+                          self.mock_workspace])
+
+
+class PlottingViewPlotFunctionsTests(unittest.TestCase):
+    def setUp(self):
+        self._qapp = mock_widget.mockQapp()
+
+        self.view = PlotView()
+
+        self.mock_func = mock.Mock(return_value=True)
+        self.mock_args = [mock.Mock() for i in range(3)]
+        self.mock_name = mock.Mock()
+
+        self.plot_name = "test plot"
+        self.plots_return_value = mock.Mock()
+
+        self.view.figure = mock.Mock()
+        self.view.figure.tight_layout = mock.Mock()
+        self.view.figure.delaxes = mock.Mock()
+        self.view.canvas = mock.Mock()
+        self.view.canvas.draw = mock.Mock()
+
+        self.mock_workspace = mock.Mock()
+
+        self.view._update_gridspec = mock.Mock()
+
+        self.view.errors = mock.Mock()
+        self.view.errors.isChecked = mock.Mock(return_value=True)
+
+        self.view._add_workspace_name = mock.Mock()
+        self.view._set_bounds = mock.Mock()
+
+        self.view.plots = {self.plot_name: self.plots_return_value}
+        self.view.workspaces = {self.plot_name: self.plots_return_value}
+        self.view.plot_additions = {self.plot_name: self.plots_return_value}
+
+    def test_plot_errors_in_errors_list(self):
+        self.view.errors_list = [self.plot_name]
+        self.view.plot_workspace_errors = mock.Mock()
+        self.view.plot(self.plot_name, self.mock_workspace)
+        self.view.plot_workspace_errors.assert_called_once_with(
+            self.plot_name, self.mock_workspace)
+        self.view._set_bounds.assert_called_once_with(self.plot_name)
+
+    def test_plot_errors_not_in_errors_list(self):
+        self.view.plot_workspace = mock.Mock()
+        self.view.plot(self.plot_name, self.mock_workspace)
+        self.view.plot_workspace.assert_called_once_with(
+            self.plot_name, self.mock_workspace)
+        self.view._set_bounds.assert_called_once_with(self.plot_name)
+
+    @mock.patch("mantid.plots.plotfunctions.errorbar")
+    def test_plot_workspace_errors(self, error_bar):
+        error_bar.return_value = tuple([[] for i in range(3)])
+        self.view.plot_workspace_errors(self.plot_name, self.mock_workspace)
+        self.assertEquals(error_bar.call_count, 1)
+
+    @mock.patch("mantid.plots.plotfunctions.plot")
+    def test_plot_workspace(self, plot):
+        plot.return_value = tuple([mock.Mock()])
+        self.view.plot_workspace(self.plot_name, self.mock_workspace)
+        self.assertEquals(plot.call_count, 1)
+
+    def test_get_subplot_raises_key_error(self):
+        self.view.plots = {}
+        with self.assertRaises(KeyError):
+            self.view.get_subplot(self.plot_name)
+
+    def test_get_subplot(self):
+        self.assertEquals(
+            self.view.get_subplot(
+                self.plot_name),
+            self.plots_return_value)
+
+    def test_get_subplots(self):
+        self.assertEquals(self.view.get_subplots(), self.view.plots)
+
+    def test_add_subplot(self):
+        self.view.get_subplot = mock.Mock(return_value=True)
+        return_value = self.view.add_subplot(self.mock_name)
+        self.view._update_gridspec.assert_called_once_with(
+            len(self.view.plots) + 1, last=self.mock_name)
+        self.assertEquals(return_value, True)
+
+    def test_remove_subplot(self):
+        self.view.remove_subplot(self.plot_name)
+        self.view.figure.delaxes.assert_called_once_with(
+            self.plots_return_value)
+        for _dict in [self.view.plots, self.view.workspaces]:
+            self.assertEquals(_dict, {})
+        self.view._update_gridspec.assert_called_once_with(
+            len(self.view.plots))
+
+    def test_remove_subplot_raise_key_error(self):
+        self.view.plots = {}
+        with self.assertRaises(KeyError):
+            self.view.remove_subplot(self.plot_name)
+
+    def test_add_moveable_vline(self):
+        """
+        To be added when moveable vlines are implemented.
+        """
+        pass
+
+    def test_add_moveable_hline(self):
+        """
+        To be added when moveable hlines are implemented.
+        """
         pass