diff --git a/CMakeLists.txt b/CMakeLists.txt
index 626f4d7a97b82be3fc6d85409157a281b548a415..448bed15d4541fce5ae21fc823b36d1245089f63 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -387,7 +387,7 @@ if(ENABLE_CPACK)
       "sip >= 4.18,"
       "python-six,python-ipython >= 1.1.0,python-ipython-notebook,PyYAML,"
       "python-requests,"
-      "scipy,python2-scikit-image,"
+      "scipy,"
       "hdf,hdf5,jsoncpp >= 0.7.0")
     if(ENABLE_MANTIDPLOT)
       set(CPACK_RPM_PACKAGE_REQUIRES
@@ -395,7 +395,7 @@ if(ENABLE_CPACK)
     endif()
     if(ENABLE_WORKBENCH)
       set(CPACK_RPM_PACKAGE_REQUIRES
-          "${CPACK_RPM_PACKAGE_REQUIRES},qt5-qtbase,python-qt5")
+          "${CPACK_RPM_PACKAGE_REQUIRES},qt5-qtbase,python2-qt5")
     endif()
 
     if("${UNIX_CODENAME}" MATCHES "Santiago") # RHEL6
@@ -498,7 +498,6 @@ if(ENABLE_CPACK)
           "python3-matplotlib,"
           "python3-qtpy,"
           "python3-scipy,"
-          "python3-skimage,"
           "python3-pycifrw (>= 4.2.1),"
           "python3-yaml,"
           "ipython3-qtconsole") # transitional package for bionic
@@ -521,7 +520,6 @@ if(ENABLE_CPACK)
           "python-matplotlib,"
           "python-qtpy,"
           "python-scipy,"
-          "python-skimage,"
           "python-pycifrw (>= 4.2.1),"
           "python-yaml,"
           "ipython-qtconsole")
diff --git a/Framework/API/src/Algorithm.cpp b/Framework/API/src/Algorithm.cpp
index 8675f9c01dd69e143a3ed3f680112443d934f569..a9c04a2d467ea94120b5e8d1862c02ecfc3e8474 100644
--- a/Framework/API/src/Algorithm.cpp
+++ b/Framework/API/src/Algorithm.cpp
@@ -1758,8 +1758,8 @@ void Algorithm::registerFeatureUsage() const {
   if (UsageService::Instance().isEnabled()) {
     std::ostringstream oss;
     oss << this->name() << ".v" << this->version();
-    UsageService::Instance().registerFeatureUsage("Algorithm", oss.str(),
-                                                  isChild());
+    UsageService::Instance().registerFeatureUsage(FeatureType::Algorithm,
+                                                  oss.str(), isChild());
   }
 }
 
diff --git a/Framework/Kernel/inc/MantidKernel/UsageService.h b/Framework/Kernel/inc/MantidKernel/UsageService.h
index cf8282bc4ed252dba7edb5cef6c206f794e4dc7d..15feb908cf8483d830ccb1a79d0b4538730c2e68 100644
--- a/Framework/Kernel/inc/MantidKernel/UsageService.h
+++ b/Framework/Kernel/inc/MantidKernel/UsageService.h
@@ -22,6 +22,11 @@
 namespace Mantid {
 namespace Kernel {
 
+/** An enum specifying the 3 possible features types that can be logged in the
+    usage service
+*/
+enum class FeatureType { Algorithm, Interface, Feature };
+
 /** UsageReporter : The Usage reporter is responsible for collating, and sending
   all usage data.
   This  centralizes all the logic covering Usage Reporting including:
@@ -36,15 +41,17 @@ namespace Kernel {
 class FeatureUsage {
 public:
   /// Constructor
-  FeatureUsage(const std::string &type, const std::string &name,
-               const bool internal);
+  FeatureUsage(const FeatureType &type, std::string name, const bool internal);
   bool operator<(const FeatureUsage &r) const;
 
   ::Json::Value asJson() const;
 
-  std::string type;
+  FeatureType type;
   std::string name;
   bool internal;
+
+protected:
+  std::string featureTypeToString() const;
 };
 
 class MANTID_KERNEL_DLL UsageServiceImpl {
@@ -57,8 +64,22 @@ public:
   void setInterval(const uint32_t seconds = 60);
   /// Registers the Startup of Mantid
   void registerStartup();
-  /// Registers the use of a feature in mantid
-  void registerFeatureUsage(const std::string &type, const std::string &name,
+  /// registerFeatureUsage registers the use of a feature in mantid.
+  /// Provide three overloads:
+  /// Version that takes vector of strings if want to register
+  /// usage of a particular class/method combination
+  void registerFeatureUsage(const FeatureType &type,
+                            const std::vector<std::string> &name,
+                            const bool internal);
+  /// Version that takes a string if just registering usage of a class
+  void registerFeatureUsage(const FeatureType &type, const std::string &name,
+                            const bool internal);
+  /// Version that accepts an initializer list. This is required because
+  /// {"abc","def"} is both a valid constructor for std::string and an
+  /// initializer list so without this it's not clear which overload is being
+  /// called
+  void registerFeatureUsage(const FeatureType &type,
+                            std::initializer_list<std::string> name,
                             const bool internal);
 
   /// Returns true if usage reporting is enabled
diff --git a/Framework/Kernel/src/UsageService.cpp b/Framework/Kernel/src/UsageService.cpp
index 661c390c7c1edebcd81694ed104441d7d8f13676..f6e5638d7cd5f48a242008346d6056f1808e99be 100644
--- a/Framework/Kernel/src/UsageService.cpp
+++ b/Framework/Kernel/src/UsageService.cpp
@@ -15,9 +15,18 @@
 #include "MantidKernel/ParaViewVersion.h"
 
 #include <Poco/ActiveResult.h>
+#include <Poco/String.h>
+#include <algorithm>
+#include <boost/algorithm/string/join.hpp>
+#include <boost/algorithm/string/trim.hpp>
+#include <boost/bind.hpp>
 
 #include <json/json.h>
 
+namespace {
+constexpr auto SEPARATOR = "->";
+}
+
 namespace Mantid {
 namespace Kernel {
 
@@ -27,9 +36,9 @@ Kernel::Logger g_log("UsageServiceImpl");
 //----------------------------------------------------------------------------------------------
 /** FeatureUsage
  */
-FeatureUsage::FeatureUsage(const std::string &type, const std::string &name,
+FeatureUsage::FeatureUsage(const FeatureType &type, std::string name,
                            const bool internal)
-    : type(type), name(name), internal(internal) {}
+    : type(type), name(std::move(name)), internal(internal) {}
 
 // Better brute force.
 bool FeatureUsage::operator<(const FeatureUsage &r) const {
@@ -51,10 +60,24 @@ bool FeatureUsage::operator<(const FeatureUsage &r) const {
   return false;
 }
 
+/// Convert the stored feature type enum to a string
+std::string FeatureUsage::featureTypeToString() const {
+
+  switch (type) {
+  case FeatureType::Algorithm:
+    return "Algorithm";
+  case FeatureType::Feature:
+    return "Feature";
+  case FeatureType::Interface:
+    return "Interface";
+  }
+  return "Unknown";
+}
+
 ::Json::Value FeatureUsage::asJson() const {
   ::Json::Value retVal;
 
-  retVal["type"] = type;
+  retVal["type"] = featureTypeToString();
   retVal["name"] = name;
   retVal["internal"] = internal;
 
@@ -106,15 +129,34 @@ void UsageServiceImpl::registerStartup() {
 
 /** registerFeatureUsage
  */
-void UsageServiceImpl::registerFeatureUsage(const std::string &type,
+void UsageServiceImpl::registerFeatureUsage(
+    const FeatureType &type, const std::vector<std::string> &name,
+    const bool internal) {
+  if (isEnabled()) {
+    std::lock_guard<std::mutex> _lock(m_mutex);
+
+    using boost::algorithm::join;
+    m_FeatureQueue.push(FeatureUsage(type, join(name, SEPARATOR), internal));
+  }
+}
+
+void UsageServiceImpl::registerFeatureUsage(const FeatureType &type,
                                             const std::string &name,
                                             const bool internal) {
   if (isEnabled()) {
     std::lock_guard<std::mutex> _lock(m_mutex);
+
     m_FeatureQueue.push(FeatureUsage(type, name, internal));
   }
 }
 
+void UsageServiceImpl::registerFeatureUsage(
+    const FeatureType &type, std::initializer_list<std::string> name,
+    const bool internal) {
+
+  registerFeatureUsage(type, std::vector<std::string>(name), internal);
+}
+
 bool UsageServiceImpl::isEnabled() const { return m_isEnabled; }
 
 void UsageServiceImpl::setEnabled(const bool enabled) {
diff --git a/Framework/Kernel/test/UsageServiceTest.h b/Framework/Kernel/test/UsageServiceTest.h
index 3a5048c87aea34291bafb5405b0be4834b2734c5..3c3b8c8e9525375bf82f82d196e7f7cd99c04e0e 100644
--- a/Framework/Kernel/test/UsageServiceTest.h
+++ b/Framework/Kernel/test/UsageServiceTest.h
@@ -86,12 +86,18 @@ public:
     TestableUsageService usageService;
     usageService.setInterval(10000);
     usageService.setEnabled(true);
-    usageService.registerFeatureUsage("Algorithm", "MyAlg.v1", true);
-    usageService.registerFeatureUsage("Interface", "MyAlg.v1", true);
+    usageService.registerFeatureUsage(Mantid::Kernel::FeatureType::Algorithm,
+                                      "MyAlg.v1", true);
+    usageService.registerFeatureUsage(Mantid::Kernel::FeatureType::Interface,
+                                      "MyAlg.v1", true);
     for (size_t i = 0; i < 10000; i++) {
-      usageService.registerFeatureUsage("Algorithm", "MyLoopAlg.v1", false);
+      usageService.registerFeatureUsage(Mantid::Kernel::FeatureType::Algorithm,
+                                        "MyLoopAlg.v1", false);
     }
-    usageService.registerFeatureUsage("Algorithm", "MyLoopAlg.v1", true);
+    usageService.registerFeatureUsage(Mantid::Kernel::FeatureType::Algorithm,
+                                      "MyLoopAlg.v1", true);
+    usageService.registerFeatureUsage(Mantid::Kernel::FeatureType::Algorithm,
+                                      {"MyAlg.v1", "Method1"}, true);
 
     std::string message = usageService.generateFeatureUsageMessage();
 
@@ -127,6 +133,9 @@ public:
       if (type == "Algorithm" && name == "MyLoopAlg.v1" && internal == true &&
           count == 1)
         correct = true;
+      if (type == "Algorithm" && name == "MyAlg.v1->Method1" &&
+          internal == true && count == 1)
+        correct = true;
       TSM_ASSERT("Usage record was not as expected", correct)
     }
   }
@@ -136,7 +145,8 @@ public:
     usageService.setInterval(10000);
     usageService.setEnabled(true);
     for (size_t i = 0; i < 10; i++) {
-      usageService.registerFeatureUsage("Algorithm", "MyLoopAlg.v1", false);
+      usageService.registerFeatureUsage(Mantid::Kernel::FeatureType::Algorithm,
+                                        {"MyLoopAlg.v1"}, false);
     }
     // this should empty the feature usage list
     usageService.flush();
@@ -149,7 +159,8 @@ public:
     usageService.setInterval(10000);
     usageService.setEnabled(true);
     for (size_t i = 0; i < 10; i++) {
-      usageService.registerFeatureUsage("Algorithm", "MyLoopAlg.v1", false);
+      usageService.registerFeatureUsage(Mantid::Kernel::FeatureType::Algorithm,
+                                        {"MyLoopAlg.v1"}, false);
     }
     // this should empty the feature usage list
     usageService.shutdown();
diff --git a/Framework/PythonInterface/mantid/BundlePython.cmake b/Framework/PythonInterface/mantid/BundlePython.cmake
index 23cdc1a9c85fd7c04444686f23f1ae0252860202..88b40ede3d6794f851353a96f1fb63640be9a37b 100644
--- a/Framework/PythonInterface/mantid/BundlePython.cmake
+++ b/Framework/PythonInterface/mantid/BundlePython.cmake
@@ -25,110 +25,4 @@ if( MSVC )
   install ( DIRECTORY ${PYTHON_DIR}/Scripts DESTINATION bin PATTERN ".svn" EXCLUDE PATTERN ".git" EXCLUDE PATTERN "*_d.py" EXCLUDE )
   install ( DIRECTORY ${PYTHON_DIR}/tcl DESTINATION bin PATTERN ".svn" EXCLUDE PATTERN ".git" EXCLUDE )
   install ( FILES ${PYTHON_DIR}/python27.dll ${PYTHON_EXECUTABLE} ${PYTHONW_EXECUTABLE} DESTINATION bin )
-
-# elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
-
-#   # Find Python framework
-#   get_filename_component(PYTHON_VERSION_X_Y_DIR "${PYTHON_LIBRARY}" DIRECTORY)
-#   get_filename_component(PYTHON_VERSION_X_Y_DIR "${PYTHON_VERSION_X_Y_DIR}" DIRECTORY)
-#   set(PY_VER ${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR})
-#   set(_site_packages /usr/local/lib/python${PY_VER}/site-packages)
-#   if(NOT EXISTS "${_site_packages}")
-#     message(FATAL_ERROR "Cannot find python site packages in ${_site_packages}. ")
-#   endif()
-
-#   # common libraries
-#   set(BUNDLED_PACKAGES
-#     backports
-#     certifi
-#     chardet
-#     CifFile
-#     dateutil
-#     enum
-#     h5py
-#     idna
-#     IPython
-#     ipython_genutils
-#     ipykernel
-#     jupyter_core
-#     jupyter_client
-#     markupsafe
-#     matplotlib
-#     mpl_toolkits
-#     numpy
-#     pathlib2
-#     pexpect
-#     pkg_resources
-#     prompt_toolkit
-#     ptyprocess
-#     pygments
-#     qtconsole
-#     qtpy
-#     pygments
-#     tornado
-#     requests
-#     scipy
-#     sphinx
-#     sphinx_bootstrap_theme
-#     traitlets
-#     urllib3
-#     wcwidth
-#     yaml
-#     zmq
-#   )
-#   set(BUNDLED_PACKAGES_MANTIDPLOT
-#     PyQt4
-#   )
-#   set(BUNDLED_PACKAGES_WORKBENCH
-#     PyQt5
-#   )
-#   set(BUNDLED_MODULES
-#     _posixsubprocess32.so
-#     cycler.py
-#     pyparsing.py
-#     mistune.py
-#     decorator.py
-#     kiwisolver.so
-#     pickleshare.py
-#     scandir.py
-#     simplegeneric.py
-#     sip.so
-#     six.py
-#     subprocess32.py
-#   )
-  
-#   function(install_packages destination src_dir)
-#     foreach(_pkg ${ARGN})
-#       if(IS_SYMLINK ${_pkg})
-        
-#       else
-#         install(DIRECTORY "${src_dir}/${_pkg}"
-#                 DESTINATION "${destination}")
-#       endif()
-#     endforeach()
-#   endfunction()
-  
-#   foreach(_bundle ${BUNDLES})
-#     # install python
-#     install(DIRECTORY "${PYTHON_VERSION_X_Y_DIR}" 
-#             DESTINATION ${_bundle}Frameworks/Python.framework/Versions
-# 	    USE_SOURCE_PERMISSIONS
-# 	    # we'll make our own site-packages
-# 	    PATTERN "site-packages" EXCLUDE
-#     )
-#     # required third party libraries
-#     set(_bundle_site_packages
-#         ${_bundle}Frameworks/Python.framework/Versions/${PY_VER}/lib/python${PY_VER}/site-packages)
-#     install_packages("${_bundle_site_packages}" "${_site_packages}" ${BUNDLED_PACKAGES})
-#     if(${_bundle} MATCHES "^MantidPlot")
-#       install_packages("${_bundle_site_packages}" "${_site_packages}" ${BUNDLED_PACKAGES_MANTIDPLOT})
-#     elseif(${_bundle} MATCHES "^MantidWorkbench")
-#       install_packages("${_bundle_site_packages}" "${_site_packages}" ${BUNDLED_PACKAGES_WORKBENCH})
-#     endif()
-
-#     foreach(_module ${BUNDLED_MODULES})
-#       install(FILES "${_site_packages}/${_module}"
-#               DESTINATION ${_bundle_site_packages})
-#     endforeach()    
-#   endforeach()
 endif()
diff --git a/Framework/PythonInterface/mantid/kernel/src/Exports/UsageService.cpp b/Framework/PythonInterface/mantid/kernel/src/Exports/UsageService.cpp
index 0430447cf8b049ce296756dd2d9283fea5ca9931..1d75c6c6ba5049e6b7b89f909746a1b006002200 100644
--- a/Framework/PythonInterface/mantid/kernel/src/Exports/UsageService.cpp
+++ b/Framework/PythonInterface/mantid/kernel/src/Exports/UsageService.cpp
@@ -5,8 +5,10 @@
 //     & Institut Laue - Langevin
 // SPDX - License - Identifier: GPL - 3.0 +
 #include "MantidKernel/UsageService.h"
+#include "MantidPythonInterface/core/Converters/PySequenceToVector.h"
 #include "MantidPythonInterface/core/GetPointer.h"
 #include <boost/python/class.hpp>
+#include <boost/python/enum.hpp>
 #include <boost/python/reference_existing_object.hpp>
 
 #include <mutex>
@@ -14,6 +16,8 @@
 using Mantid::Kernel::UsageService;
 using Mantid::Kernel::UsageServiceImpl;
 using namespace boost::python;
+using ExtractStdString = boost::python::extract<std::string>;
+using Mantid::PythonInterface::Converters::PySequenceToVector;
 
 GET_POINTER_SPECIALIZATION(UsageServiceImpl)
 
@@ -37,9 +41,27 @@ UsageServiceImpl &instance() {
   });
   return svc;
 }
+
+/// Register feature usage from a python list
+void registerFeatureUsage(UsageServiceImpl &self,
+                          const Mantid::Kernel::FeatureType &type,
+                          const object &paths, const bool internal) {
+  ExtractStdString singleString(paths);
+  if (singleString.check()) {
+    self.registerFeatureUsage(type, singleString(), internal);
+  } else {
+    self.registerFeatureUsage(type, PySequenceToVector<std::string>(paths)(),
+                              internal);
+  }
+}
+
 } // namespace
 
 void export_UsageService() {
+  enum_<Mantid::Kernel::FeatureType>("FeatureType")
+      .value("Algorithm", Mantid::Kernel::FeatureType::Algorithm)
+      .value("Interface", Mantid::Kernel::FeatureType::Interface)
+      .value("Feature", Mantid::Kernel::FeatureType::Feature);
 
   class_<UsageServiceImpl, boost::noncopyable>("UsageServiceImpl", no_init)
       .def("flush", &UsageServiceImpl::flush, arg("self"),
@@ -64,7 +86,7 @@ void export_UsageService() {
            arg("self"), "Gets the application name that has invoked Mantid.")
       .def("registerStartup", &UsageServiceImpl::registerStartup, arg("self"),
            "Registers the startup of Mantid.")
-      .def("registerFeatureUsage", &UsageServiceImpl::registerFeatureUsage,
+      .def("registerFeatureUsage", &registerFeatureUsage,
            (arg("self"), arg("type"), arg("name"), arg("internal")),
            "Registers the use of a feature in Mantid.")
       .def("getStartTime", &UsageServiceImpl::getStartTime, (arg("self")),
diff --git a/Framework/PythonInterface/plugins/algorithms/HFIRSANS2Wavelength.py b/Framework/PythonInterface/plugins/algorithms/HFIRSANS2Wavelength.py
index 1e97c77719d93bb4fd613b786303c95e3364495f..08555abd701271d1e9e8f1c1dbcdd7193e61f855 100644
--- a/Framework/PythonInterface/plugins/algorithms/HFIRSANS2Wavelength.py
+++ b/Framework/PythonInterface/plugins/algorithms/HFIRSANS2Wavelength.py
@@ -32,6 +32,7 @@ class HFIRSANS2Wavelength(PythonAlgorithm):
         try:
             wavelength = runObj['wavelength'].getStatistics().mean
             wavelength_spread = runObj['wavelength_spread'].getStatistics().mean
+            wavelength_spread *= wavelength
         except:
             raise ValueError("Could not read wavelength and wavelength_spread logs from the workspace")
         progress = Progress(self, 0.0, 1.0, 4)
diff --git a/Framework/PythonInterface/plugins/algorithms/MaskBTP.py b/Framework/PythonInterface/plugins/algorithms/MaskBTP.py
index 32c57119c8a7d98d7345c054dde3180c0c3935d4..d8e26d283a2abed90b1e870bcb8c097c7327540b 100644
--- a/Framework/PythonInterface/plugins/algorithms/MaskBTP.py
+++ b/Framework/PythonInterface/plugins/algorithms/MaskBTP.py
@@ -23,9 +23,10 @@ class MaskBTP(mantid.api.PythonAlgorithm):
 
     instname = None
     instrument = None
-    bankmin = defaultdict(lambda: 1, {'SEQUOIA':23, 'TOPAZ':10})  # default is one
-    bankmax = {'ARCS':115, 'BIOSANS':2, 'CG2':48, 'CHESS':163, 'CNCS':50, 'CORELLI':91, 'EQ-SANS':48, 'HYSPEC':20, 'MANDI':59,
-               'NOMAD':99, 'POWGEN':300, 'REF_M':1, 'SEQUOIA':150,'SNAP':64,'SXD':11,'TOPAZ':59,'WAND':8,'WISH':10}
+    bankmin = defaultdict(lambda: 1, {'SEQUOIA': 23, 'TOPAZ': 10})  # default is one
+    bankmax = {'ARCS': 115, 'BIOSANS': 88, 'CG2': 48, 'CHESS': 163, 'CNCS': 50, 'CORELLI': 91, 'EQ-SANS': 48,
+               'HYSPEC': 20, 'MANDI': 59, 'NOMAD': 99, 'POWGEN': 300, 'REF_M': 1, 'SEQUOIA': 150, 'SNAP': 64,
+               'SXD': 11, 'TOPAZ': 59, 'WAND': 8, 'WISH': 10}
 
     def category(self):
         """ Mantid required
@@ -152,8 +153,15 @@ class MaskBTP(mantid.api.PythonAlgorithm):
         self.setProperty("MaskedDetectors", detlist)
 
     def _startsFrom(self):
-        '''Returns what the minimum tube/pixel index for the instrument'''
-        if self.instname in ['ARCS', 'BIOSANS', 'CG2', 'CHESS', 'CNCS', 'CORELLI', 'EQ-SANS', 'HYSPEC', 'NOMAD', 'SEQUOIA', 'WAND', 'WISH']:
+        r"""
+        Minimum tube or pixel index as specified in the instrument definition file.
+
+        Returns
+        -------
+        int
+        """
+        if self.instname in ['ARCS', 'BIOSANS', 'CG2', 'CHESS', 'CNCS', 'CORELLI', 'EQ-SANS', 'HYSPEC', 'NOMAD',
+                             'SEQUOIA', 'WAND', 'WISH']:
             return 1
         else:
             return 0
@@ -241,12 +249,13 @@ class MaskBTP(mantid.api.PythonAlgorithm):
             else:
                 return "detector{}".format(banknum)
         elif self.instname == 'BIOSANS':
-            if banknum == 1:
-                return 'detector1'
-            elif banknum == 2:
-                return 'wing_detector'
+            if '2019-10-01' in validFrom:
+                return "bank{}".format(banknum)
             else:
-                raise ValueError('Out of range index for BIOSANS instrument bank numbers: {}'.format(banknum))
+                if banknum == 1:
+                    return 'detector1'
+                elif banknum == 2:
+                    return 'wing_detector'
         else:
             return "bank" + str(banknum)
 
diff --git a/Framework/PythonInterface/test/python/mantid/kernel/UsageServiceTest.py b/Framework/PythonInterface/test/python/mantid/kernel/UsageServiceTest.py
index 01a57c0c759078414c4e015f3985deb3d2b28643..555f1bc3c0de43989b139f59b48cde7e9a64c751 100644
--- a/Framework/PythonInterface/test/python/mantid/kernel/UsageServiceTest.py
+++ b/Framework/PythonInterface/test/python/mantid/kernel/UsageServiceTest.py
@@ -8,7 +8,7 @@ from __future__ import (absolute_import, division, print_function, unicode_liter
 
 import unittest
 
-from mantid.kernel import (UsageService, UsageServiceImpl)
+from mantid.kernel import (UsageService, UsageServiceImpl, FeatureType)
 
 
 class UsageServiceTest(unittest.TestCase):
@@ -43,7 +43,10 @@ class UsageServiceTest(unittest.TestCase):
     def test_registerFeatureUsage(self):
         UsageService.setEnabled(False)
         #this will do nothing as it is disabled
-        UsageService.registerFeatureUsage("Algorithm", "Test.v1", True)
+        UsageService.registerFeatureUsage(FeatureType.Algorithm, "testv1", True)
+        UsageService.setEnabled(True)
+        UsageService.registerFeatureUsage(FeatureType.Algorithm, "testv1", True)
+        UsageService.registerFeatureUsage(FeatureType.Algorithm, ["testv1","level2feature"], True)
 
 
     def test_Flush(self):
diff --git a/Framework/PythonInterface/test/python/plugins/algorithms/HFIRSANS2WavelengthTest.py b/Framework/PythonInterface/test/python/plugins/algorithms/HFIRSANS2WavelengthTest.py
index cd4bc1a572c4e5ab7b7ba60798d5b4033a5b4207..ae3be4f2a61ea7372218554be5cfb0d6c33f36d4 100644
--- a/Framework/PythonInterface/test/python/plugins/algorithms/HFIRSANS2WavelengthTest.py
+++ b/Framework/PythonInterface/test/python/plugins/algorithms/HFIRSANS2WavelengthTest.py
@@ -18,7 +18,7 @@ class HFIRSANS2WavelengthTest(unittest.TestCase):
                              UnitX="TOF",
                              NSpec=2)
         AddSampleLog(ws, LogName='wavelength', LogText='6.5', LogType='Number Series')
-        AddSampleLog(ws, LogName='wavelength_spread', LogText='1.0', LogType='Number Series')
+        AddSampleLog(ws, LogName='wavelength_spread', LogText='0.1', LogType='Number Series')
 
     def tearDown(self):
         mtd.clear()
@@ -28,8 +28,8 @@ class HFIRSANS2WavelengthTest(unittest.TestCase):
         out = HFIRSANS2Wavelength(InputWorkspace="ws")
         self.assertTrue(out)
         self.assertEqual(out.blocksize(), 1)
-        self.assertEqual(out.readX(0)[0], 6)
-        self.assertEqual(out.readX(1)[1], 7)
+        self.assertEqual(out.readX(0)[0], 6.175)
+        self.assertEqual(out.readX(1)[1], 6.825)
         self.assertEqual(out.readY(0)[0], 24)
         self.assertAlmostEqual(out.readE(1)[0], 7.071067, 5)
         self.assertEqual(out.getAxis(0).getUnit().caption(), 'Wavelength')
diff --git a/Framework/PythonInterface/test/python/plugins/algorithms/MaskBTPTest.py b/Framework/PythonInterface/test/python/plugins/algorithms/MaskBTPTest.py
index 3597e3e9016757890733282f785909667406e42d..ef6b95555d1de5303ccc20f2e4afd766436a6f20 100644
--- a/Framework/PythonInterface/test/python/plugins/algorithms/MaskBTPTest.py
+++ b/Framework/PythonInterface/test/python/plugins/algorithms/MaskBTPTest.py
@@ -197,13 +197,13 @@ class MaskBTPTest(unittest.TestCase):
         ws_name = 'biosans_wing'
         LoadEmptyInstrument(InstrumentName='BIOSANS', OutputWorkspace=ws_name)
 
-        masked = MaskBTP(Workspace=ws_name, Bank=2, Tube='1:300:2')
+        masked = MaskBTP(Workspace=ws_name, Bank='49-88', Tube='1,3')
         wksp = mtd[ws_name]
         self.assertEqual(int(160 * 256 / 2), len(masked))
         self.checkConsistentMask(wksp, masked)
 
     def test_biosans_wing_ends(self):
-        masked = MaskBTP(Instrument='BIOSANS', Bank=2, Pixel='1-20,245-256')
+        masked = MaskBTP(Instrument='BIOSANS', Bank='49-88', Pixel='1-20,245-256')
         wksp = mtd['BIOSANSMaskBTP']
         self.assertEqual(int(32 * 160), len(masked))
         self.checkConsistentMask(wksp, masked)
diff --git a/MantidPlot/src/Mantid/InstrumentWidget/InstrumentWindow.cpp b/MantidPlot/src/Mantid/InstrumentWidget/InstrumentWindow.cpp
index cdc4a45b96bfd0a11f3fb687f85268e13f3d7a07..408de306a833fccfb32e4dc40eb3677a23a57570 100644
--- a/MantidPlot/src/Mantid/InstrumentWidget/InstrumentWindow.cpp
+++ b/MantidPlot/src/Mantid/InstrumentWidget/InstrumentWindow.cpp
@@ -41,7 +41,7 @@ InstrumentWindow::InstrumentWindow(const QString &wsName, const QString &label,
   connect(m_instrumentWidget, SIGNAL(clearingHandle()), this,
           SLOT(closeSafely()));
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Interface", "InstrumentView", false);
+      Mantid::Kernel::FeatureType::Interface, "InstrumentView", false);
 }
 
 InstrumentWindow::~InstrumentWindow() {}
diff --git a/MantidPlot/src/ProjectRecovery.cpp b/MantidPlot/src/ProjectRecovery.cpp
index a16b7623277af3d724054e631c57794ac33e91ef..131eb06af79472867a6f89ca0089dbf5fc0bad97 100644
--- a/MantidPlot/src/ProjectRecovery.cpp
+++ b/MantidPlot/src/ProjectRecovery.cpp
@@ -309,7 +309,8 @@ ProjectRecovery::~ProjectRecovery() {
 
 void ProjectRecovery::attemptRecovery() {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ProjectRecovery->AttemptRecovery", true);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ProjectRecovery", "AttemptRecovery"}, true);
 
   m_recoveryGui = new ProjectRecoveryPresenter(this, m_windowPtr);
   bool failed = m_recoveryGui->startRecoveryView();
diff --git a/MantidPlot/src/ProjectRecoveryGUIs/ProjectRecoveryView.cpp b/MantidPlot/src/ProjectRecoveryGUIs/ProjectRecoveryView.cpp
index 4e44af806e4539d7572914d56536775f56e43957..4d92f4753af7e2b25f18ed5c7c67859c4df67e75 100644
--- a/MantidPlot/src/ProjectRecoveryGUIs/ProjectRecoveryView.cpp
+++ b/MantidPlot/src/ProjectRecoveryGUIs/ProjectRecoveryView.cpp
@@ -21,7 +21,7 @@ ProjectRecoveryView::ProjectRecoveryView(QWidget *parent,
   // Set the table information
   addDataToTable();
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Interface", "ProjectRecoveryWindow", true);
+      Mantid::Kernel::FeatureType::Interface, "ProjectRecoveryWindow", true);
 }
 
 void ProjectRecoveryView::addDataToTable() {
@@ -34,28 +34,32 @@ void ProjectRecoveryView::onClickLastCheckpoint() {
   // Recover last checkpoint
   m_presenter->recoverLast();
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ProjectRecoveryWindow->RecoverLastCheckpoint", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ProjectRecoveryWindow", "RecoverLastCheckpoint"}, false);
 }
 
 void ProjectRecoveryView::onClickOpenLastInScriptWindow() {
   // Open checkpoint in script window
   m_presenter->openLastInEditor();
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ProjectRecoveryWindow->OpenInScriptWindow", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ProjectRecoveryWindow", "OpenInScriptWindow"}, false);
 }
 
 void ProjectRecoveryView::onClickStartMantidNormally() {
   // Start save and close this, clear checkpoint that was offered for load
   m_presenter->startMantidNormally();
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ProjectRecoveryWindow->StartMantidNormally", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ProjectRecoveryWindow", "StartMantidNormally"}, false);
 }
 
 void ProjectRecoveryView::reject() {
   // Do the same as startMantidNormally
   m_presenter->startMantidNormally();
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ProjectRecoveryWindow->StartMantidNormally", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ProjectRecoveryWindow", "StartMantidNormally"}, false);
 }
 
 void ProjectRecoveryView::updateProgressBar(int newValue, bool err) {
diff --git a/MantidPlot/src/ProjectRecoveryGUIs/RecoveryFailureView.cpp b/MantidPlot/src/ProjectRecoveryGUIs/RecoveryFailureView.cpp
index a8fd18f5995ebd5297582039c6b6be773fc1627b..f6cc6b9229dc8a89f71d27e123782f9aecc052df 100644
--- a/MantidPlot/src/ProjectRecoveryGUIs/RecoveryFailureView.cpp
+++ b/MantidPlot/src/ProjectRecoveryGUIs/RecoveryFailureView.cpp
@@ -22,7 +22,8 @@ RecoveryFailureView::RecoveryFailureView(QWidget *parent,
   // Set the table information
   addDataToTable();
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Interface", "ProjectRecoveryFailureWindow", true);
+      Mantid::Kernel::FeatureType::Interface, "ProjectRecoveryFailureWindow",
+      true);
 }
 
 void RecoveryFailureView::addDataToTable() {
@@ -41,7 +42,8 @@ void RecoveryFailureView::onClickLastCheckpoint() {
   // Recover last checkpoint
   m_presenter->recoverLast();
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ProjectRecoveryFailureWindow->RecoverLastCheckpoint", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ProjectRecoveryFailureWindow", "RecoverLastCheckpoint"}, false);
 }
 
 void RecoveryFailureView::onClickSelectedCheckpoint() {
@@ -55,8 +57,8 @@ void RecoveryFailureView::onClickSelectedCheckpoint() {
     m_presenter->recoverSelectedCheckpoint(text);
   }
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ProjectRecoveryFailureWindow->RecoverSelectedCheckpoint",
-      false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ProjectRecoveryFailureWindow", "RecoverSelectedCheckpoint"}, false);
 }
 
 void RecoveryFailureView::onClickOpenSelectedInScriptWindow() {
@@ -70,22 +72,24 @@ void RecoveryFailureView::onClickOpenSelectedInScriptWindow() {
     m_presenter->openSelectedInEditor(text);
   }
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ProjectRecoveryFailureWindow->OpenSelectedInScriptWindow",
-      false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ProjectRecoveryFailureWindow", "OpenSelectedInScriptWindow"}, false);
 }
 
 void RecoveryFailureView::onClickStartMantidNormally() {
   // Start save and close this, clear checkpoint that was offered for load
   m_presenter->startMantidNormally();
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ProjectRecoveryFailureWindow->StartMantidNormally", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ProjectRecoveryFailureWindow", "StartMantidNormally"}, false);
 }
 
 void RecoveryFailureView::reject() {
   // Do nothing just absorb request
   m_presenter->startMantidNormally();
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ProjectRecoveryFailureWindow->StartMantidNormally", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ProjectRecoveryFailureWindow", "StartMantidNormally"}, false);
 }
 
 void RecoveryFailureView::updateProgressBar(const int newValue,
diff --git a/buildconfig/CMake/DarwinSetup.cmake b/buildconfig/CMake/DarwinSetup.cmake
index 540eea222fafa28bedd4cada8d070bb822928c17..076069db34c4f434db7893d78a9bfbb017af0c13 100644
--- a/buildconfig/CMake/DarwinSetup.cmake
+++ b/buildconfig/CMake/DarwinSetup.cmake
@@ -162,9 +162,9 @@ if(NOT TARGET mantidpython)
   # Configure install script at the same time. Doing it later causes a warning
   # from ninja.
   if(MAKE_VATES)
+    # Python packages go into bundle Python site-packages
     set(
-      PARAVIEW_PYTHON_PATHS
-      ":\${SCRIPT_PATH}/../Libraries:\${SCRIPT_PATH}/../Python:\${SCRIPT_PATH}/../Python/vtk"
+      PARAVIEW_PYTHON_PATHS ""
     )
   else()
     set(PARAVIEW_PYTHON_PATHS "")
diff --git a/buildconfig/CMake/TargetFunctions.cmake b/buildconfig/CMake/TargetFunctions.cmake
index 98881263cbe985482136c01ecd37f387a6fcfc22..ac6f8a20f4d5d763438a8cdf39ad0c7cfb3b16e5 100644
--- a/buildconfig/CMake/TargetFunctions.cmake
+++ b/buildconfig/CMake/TargetFunctions.cmake
@@ -40,6 +40,9 @@ function (mtd_install_files)
      list(REMOVE_DUPLICATES PARSED_INSTALL_DIRS)
 
      foreach( _dir ${PARSED_INSTALL_DIRS})
+         # install (FILES ) only overwrites file if timestamp is different. Touch files here to always overwrite
+         # Wrap call to execute_process in install (CODE ) so it runs at package time and not build time
+         install ( CODE "execute_process(COMMAND \"${CMAKE_COMMAND}\" -E touch \"${PARSED_FILES}\")")
          install ( FILES ${PARSED_FILES} DESTINATION ${_dir} RENAME ${PARSED_RENAME} )
      endforeach ()
 endfunction()
diff --git a/buildconfig/Jenkins/buildscript b/buildconfig/Jenkins/buildscript
index 6af8bae413f127429f79d76da02ba6d5a3231cab..1178fdce29d1c0a03ac17c7265e7b1c3e91e5f90 100755
--- a/buildconfig/Jenkins/buildscript
+++ b/buildconfig/Jenkins/buildscript
@@ -11,18 +11,9 @@
 ###############################################################################
 SCRIPT_DIR=$(dirname "$0")
 XVFB_SERVER_NUM=101
+XVFB_ERROR_LOG_PREFIX=${WORKSPACE}/mantid-xvfb-error
 ULIMIT_CORE_ORIG=$(ulimit -c)
 
-if [ $(command -v xvfb-run) ]; then
-  X11_RUNNER="xvfb-run"
-  X11_RUNNER_ARGS1=--server-args="-screen 0 640x480x24"
-  X11_RUNNER_ARGS2=--server-num=${XVFB_SERVER_NUM}
-else
-  X11_RUNNER="eval"
-  X11_RUNNER_ARGS1=""
-  X11_RUNNER_ARGS2=""
-fi
-
 ###############################################################################
 # Functions
 ###############################################################################
@@ -34,7 +25,15 @@ function onexit {
 }
 
 function run_with_xvfb {
-  ${X11_RUNNER} "${X11_RUNNER_ARGS1}" "${X11_RUNNER_ARGS2}" $@
+  if [ $(command -v xvfb-run) ]; then
+    # -e=--error-file. A bug in Xvfb on RHEL7 means --error-file
+    # produces an error: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=337703;msg=2
+    xvfb-run --server-args="-screen 0 640x480x24" \
+             --server-num=${XVFB_SERVER_NUM} \
+             -e ${XVFB_ERROR_LOG_PREFIX}-`date +%y-%m-%d-%H-%M`.xlog $@
+  else
+    eval $@
+  fi
 }
 
 
@@ -49,6 +48,9 @@ if [ $(command -v xvfb-run) ]; then
 
   # Remove Xvfb X server lock files
   rm -f /tmp/.X${XVFB_SERVER_NUM}-lock
+
+  # Remove any Xvfb error logs
+  rm -f ${XVFB_ERROR_LOG_PREFIX}*.xlog
 fi
 
 ###############################################################################
diff --git a/buildconfig/dev-packages/deb/mantid-developer/ns-control b/buildconfig/dev-packages/deb/mantid-developer/ns-control
index dcebbde10ca6a1007449230808529454b3fdffa4..de83b01b18db0e772d662d0eac20ed68bd083915 100644
--- a/buildconfig/dev-packages/deb/mantid-developer/ns-control
+++ b/buildconfig/dev-packages/deb/mantid-developer/ns-control
@@ -42,7 +42,6 @@ Depends: git,
   python-setuptools,
   python-numpy,
   python-scipy,
-  python-skimage,
   python-qt4-dev,
   python-qt4-dbg,
   pyqt5-dev,
@@ -70,7 +69,6 @@ Depends: git,
   python3-qtpy,
   python3-numpy,
   python3-scipy,
-  python3-skimage,
   python3-sphinx,
   python3-sphinx-bootstrap-theme,
   python3-dateutil,
diff --git a/buildconfig/dev-packages/rpm/mantid-developer/mantid-developer.spec b/buildconfig/dev-packages/rpm/mantid-developer/mantid-developer.spec
index 1d38f40976f3c4b91ab0cf0415f511eca51a3baa..f5a9a55f41cf8dafd6a59dbe1078dd457350883f 100644
--- a/buildconfig/dev-packages/rpm/mantid-developer/mantid-developer.spec
+++ b/buildconfig/dev-packages/rpm/mantid-developer/mantid-developer.spec
@@ -5,7 +5,7 @@
 %endif
 
 Name:           mantid-developer
-Version:        1.33
+Version:        1.34
 Release:        1%{?dist}
 Summary:        Meta Package to install dependencies for Mantid Development
 
@@ -19,7 +19,8 @@ BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 Requires: clang
 %{?fedora:Requires: cmake-gui}
 %{?rhel:Requires: cmake3-gui}
-Requires: boost-devel
+Requires: boost169-devel
+Requires: boost169-python2-devel
 Requires: doxygen
 Requires: gperftools-devel
 Requires: gperftools-libs
@@ -40,15 +41,15 @@ Requires: numpy
 Requires: OCE-devel
 Requires: poco-devel >= 1.4.6
 Requires: PyQt4-devel
-Requires: python-qt5-devel
+Requires: python2-qt5-devel
 Requires: python-QtPy
 Requires: python-requests
 Requires: python-devel
 Requires: python-setuptools
 Requires: python-ipython >= 1.1
-Requires: python-matplotlib
-%{?fedora:Requires: python2-matplotlib-qt4}
-%{?el7:Requires: python-matplotlib-qt4}
+Requires: python2-matplotlib
+Requires: python2-matplotlib-qt4
+Requires: python2-matplotlib-qt4
 Requires: python-pip
 %{?fedora:Requires: python2-qtconsole}
 Requires: python-sphinx
@@ -63,7 +64,6 @@ Requires: qwtplot3d-qt4-devel
 Requires: redhat-lsb
 Requires: rpmdevtools
 Requires: scipy
-Requires: python2-scikit-image
 Requires: sip-devel
 Requires: tbb
 Requires: tbb-devel
@@ -91,7 +91,7 @@ Requires: graphviz
 Requires: python3-setuptools
 Requires: python3-sip-devel
 Requires: python3-PyQt4-devel
-Requires: python-qt5-devel
+Requires: python3-qt5-devel
 Requires: python3-QtPy
 Requires: python3-numpy
 Requires: python3-scipy
@@ -111,11 +111,17 @@ Requires: boost-python3-devel
 %endif
 
 %if 0%{?el7}
-Requires: boost-python36-devel
-Requires: python36-devel
-Requires: python36-h5py
+Requires: python36-setuptools
+Requires: python36-qt5-devel
 Requires: python36-numpy
+Requires: python36-scipy
+Requires: python36-sphinx
+Requires: python36-dateutil
 Requires: python36-PyYAML
+Requires: python36-mock
+Requires: python36-psutil
+Requires: python36-requests
+Requires: boost169-python3-devel
 %endif
 
 BuildArch: noarch
@@ -140,6 +146,19 @@ required for Mantid development.
 
 %changelog
 
+* Tue Nov 5 2019 Martyn Gigg <martyn.gigg@stfc.ac.uk>
+- Switch to python{2,3}-qt5-devel
+- Remove python2-scikit-image
+- Add remaining python36 packages that exist.
+  Missing:
+    * python36-h5py
+    * python36-qt4
+    * python36-QtPy
+    * python36-sphinx-bootstrap-theme
+    * python36-matplotlib
+    * python36-ipython-gui
+- Add boost169
+
 * Thu Jun 27 2019 Peter Peterson <petersonpf@ornl.gov>
 - Added python3 dependencies for framework on rhel7
 
diff --git a/docs/source/algorithms/HFIRSANS2Wavelength-v1.rst b/docs/source/algorithms/HFIRSANS2Wavelength-v1.rst
index 610a468e39ced401197ca1d8f0469495925a54ef..9992ce066ea0f5b83bb07b60fe7f908a660e3bc2 100644
--- a/docs/source/algorithms/HFIRSANS2Wavelength-v1.rst
+++ b/docs/source/algorithms/HFIRSANS2Wavelength-v1.rst
@@ -41,8 +41,8 @@ Output:
 .. testoutput:: HFIRSANS2Wavelength
 
   1
-  6.0
-  7.0
+  3.25
+  9.75
   Wavelength
 
 .. categories::
diff --git a/docs/source/algorithms/SolidAngle-v1.rst b/docs/source/algorithms/SolidAngle-v1.rst
index 740dc23bb2fdd7e1de4dba98937dd77d95a8c580..7d7abae3029e31375edb57e1ec7f703b6cc3b116 100644
--- a/docs/source/algorithms/SolidAngle-v1.rst
+++ b/docs/source/algorithms/SolidAngle-v1.rst
@@ -72,11 +72,9 @@ Output:
 
    LoadEmptyInstrument(InstrumentName='BIOSANS', OutputWorkspace='BIOSANS')
    mainDet = SolidAngle(InputWorkspace='BIOSANS', OutputWorkspace='main_detector',
-                        Method='VerticalTube',
-                        StartWorkspaceIndex=3-1, EndWorkspaceIndex=3+256*192-1)
+                        Method='VerticalTube', StartWorkspaceIndex=2, EndWorkspaceIndex=49153)
    wingDet = SolidAngle(InputWorkspace='BIOSANS', OutputWorkspace='wing_detector',
-                        Method='VerticalWing',
-                        StartWorkspaceIndex=49155-1, EndWorkspaceIndex=90114-1)
+                        Method='VerticalWing', StartWorkspaceIndex=49154, EndWorkspaceIndex=90113)
    # both are zero where nothing was calculated
    print('Solid angle where main was not calculated: %.2e' % mainDet.readY(1)[0])
    print('Solid angle where wing was not calculated: %.2e' % wingDet.readY(1)[0])
@@ -91,8 +89,8 @@ Output:
 
     Solid angle where main was not calculated: 0.00e+00
     Solid angle where wing was not calculated: 0.00e+00
-    Solid angle where main was calculated: 2.64e-05
-    Solid angle where wing was calculated: 1.26e-05
+    Solid angle where main was calculated: 2.82e-05
+    Solid angle where wing was calculated: 1.30e-05
 
 
 References
diff --git a/docs/source/images/CHESS.PNG b/docs/source/images/CHESS.PNG
new file mode 100644
index 0000000000000000000000000000000000000000..e5c01deb04aaab660c73d678e49d8f68167cb65e
Binary files /dev/null and b/docs/source/images/CHESS.PNG differ
diff --git a/docs/source/images/IndexPeaks.PNG b/docs/source/images/IndexPeaks.PNG
new file mode 100644
index 0000000000000000000000000000000000000000..c7827be99ab79a909a3f40d9ea9b26b8f27007f0
Binary files /dev/null and b/docs/source/images/IndexPeaks.PNG differ
diff --git a/docs/source/images/LiveDataUserInput.png b/docs/source/images/LiveDataUserInput.png
new file mode 100644
index 0000000000000000000000000000000000000000..82b310a6713750cab67b4bd432d436b8dc265261
Binary files /dev/null and b/docs/source/images/LiveDataUserInput.png differ
diff --git a/docs/source/images/MantidPlotMeme.jpg b/docs/source/images/MantidPlotMeme.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..883917500ad35b925cda6e37cfc92bc081b9cde0
Binary files /dev/null and b/docs/source/images/MantidPlotMeme.jpg differ
diff --git a/docs/source/images/MuonAnalysis.PNG b/docs/source/images/MuonAnalysis.PNG
new file mode 100644
index 0000000000000000000000000000000000000000..f6a16be448df779c9c439f8681696b52babc6fa3
Binary files /dev/null and b/docs/source/images/MuonAnalysis.PNG differ
diff --git a/docs/source/images/PredictFractionalPeaks.png b/docs/source/images/PredictFractionalPeaks.png
new file mode 100644
index 0000000000000000000000000000000000000000..02761815d7c0bf37d4fe28ecdf1f894d6969096d
Binary files /dev/null and b/docs/source/images/PredictFractionalPeaks.png differ
diff --git a/docs/source/images/UpdateOS.png b/docs/source/images/UpdateOS.png
new file mode 100644
index 0000000000000000000000000000000000000000..a7b094040f7be56b6a46b5e0865f962cc8f7bc90
Binary files /dev/null and b/docs/source/images/UpdateOS.png differ
diff --git a/docs/source/images/WB_ColormapIcons.png b/docs/source/images/WB_ColormapIcons.png
new file mode 100644
index 0000000000000000000000000000000000000000..d3d0b99a69d9ea6a07da2d7ae1dc4d4d1ea1a55f
Binary files /dev/null and b/docs/source/images/WB_ColormapIcons.png differ
diff --git a/docs/source/images/WB_GenerateaScript.png b/docs/source/images/WB_GenerateaScript.png
new file mode 100644
index 0000000000000000000000000000000000000000..39658f197b24ba54f38c4126729325bc91caa8d6
Binary files /dev/null and b/docs/source/images/WB_GenerateaScript.png differ
diff --git a/docs/source/images/WB_Scriptrepo.png b/docs/source/images/WB_Scriptrepo.png
new file mode 100644
index 0000000000000000000000000000000000000000..9e4e3d635b9797e61358974d0be9413a2a32285a
Binary files /dev/null and b/docs/source/images/WB_Scriptrepo.png differ
diff --git a/docs/source/images/WB_Tiled.png b/docs/source/images/WB_Tiled.png
new file mode 100644
index 0000000000000000000000000000000000000000..04c2d22eab71b1b14d7c42f713c5fb3ed2598431
Binary files /dev/null and b/docs/source/images/WB_Tiled.png differ
diff --git a/docs/source/images/WB_Viewmessages.png b/docs/source/images/WB_Viewmessages.png
new file mode 100644
index 0000000000000000000000000000000000000000..7ffc2717d57f7d790dbb91cb7f9bdd3f110e93e5
Binary files /dev/null and b/docs/source/images/WB_Viewmessages.png differ
diff --git a/docs/source/images/fish.jpeg b/docs/source/images/fish.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..1ce7b51765d8148f70f1998e7e3737164ee55557
Binary files /dev/null and b/docs/source/images/fish.jpeg differ
diff --git a/docs/source/release/v4.2.0/diffraction.rst b/docs/source/release/v4.2.0/diffraction.rst
index a360a3500044f67af5eeea02ffe475bb66d1a449..e834fbfde6708225ddf4f2e3512e413c6c4c264d 100644
--- a/docs/source/release/v4.2.0/diffraction.rst
+++ b/docs/source/release/v4.2.0/diffraction.rst
@@ -5,61 +5,64 @@ Diffraction Changes
 .. contents:: Table of Contents
    :local:
 
-.. 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
-############
+------------
 
 - The HRPD scripts now mask out the Bragg peaks from the Vanadium.
 - The file-naming scheme for ISIS powder is now controlled by a string template
 - The file-naming of output on HRPD as been updated to closely match old script outputs
 - Geometry definition for LLB 5C1
 - :ref:`SNAPReduce <algm-SNAPReduce-v1>` has an additional parameter ``MaxChunkSize`` for customizing the chunking behavior
-- :ref:`LorentzCorrection <algm-LorentzCorrection-v1>` has an additional option for single crystal (default) or powder operation
+- :ref:`LorentzCorrection <algm-LorentzCorrection-v1>` has an additional parameter ``Type`` for ``SingleCrystalTOF`` (default) or ``PowderTOF``
 - The create_total_scattering_pdf method in Polaris scripts now supports merging banks with a weighted mean.
-- The create_total_scattering_pdf method in Polaris scripts now applies the Placzek self scattering correction from :ref:CalculatePlaczekSelfScattering <algm-CalculatePlaczekSelfScattering>.
+- The create_total_scattering_pdf method in Polaris scripts now applies the Placzek self scattering correction from :ref:`CalculatePlaczekSelfScattering <algm-CalculatePlaczekSelfScattering>`.
 - Cropping limits can now be set as a fraction of the data limits for ISIS Powder focusing as well as absolute values. 
 
 Bug Fixes
-#########
+---------
 
 - The values used to mask the prompt pulse on HRPD have been fixed.
 - :ref:`AlignAndFocusPowderFromFiles <algm-AlignAndFocusPowderFromFiles-v1>` will reload the instrument if logs are skipped
 - Fixed issue with :ref:`WANDPowderReduction <algm-WANDPowderReduction-v1>` handling of event workspaces
 - Fixed issues with OptimizeLatticeForCellType, SelectCellOfType, SelectCellWithForm and TransformHKL when using modulated structures.
 
-Engineering Diffraction
------------------------
+
+.. figure:: ../../images/PredictFractionalPeaks.png
+   :class: screenshot
+   :width: 500px
+   :align: right
+
+.. figure:: ../../images/IndexPeaks.PNG
+   :class: screenshot
+   :width: 500px
+   :align: right   
 
 Single Crystal Diffraction
---------------------------
+##########################
 
 Improvements
-############
+------------
 
-- :ref:`PredictFractionalPeaks <algm-PredictFractionalPeaks>` now has the option to specify a reflection condition to restrict the number of peaks predicted,
-  along with the option to not require a predicted peak to hit a detector.
+- ``*``:ref:`PredictFractionalPeaks <algm-PredictFractionalPeaks>` now has the option to specify a reflection condition to restrict the number of peaks predicted,
+  along with the option to not require a predicted peak to hit a detector.``*``
 - :ref:`SaveHKL <algm-SaveHKL>` now saves the tbar and transmission values for shapes and materials provided by :ref:`SetSample <algm-SetSample>`.
 - :ref:`SelectCellOfType <algm-SelectCellOfType>` and :ref:`SelectCellWithForm <algm-SelectCellWithForm>` now return the transformation matrix
-- :ref:`IndexPeaks <algm-IndexPeaks>` now has options to enter modulation vectors and additional information required for satellite peak indexing. As
-  a result :ref:`IndexPeaksWithSatellites <algm-IndexPeaksWithSatellites>` has been deprecated and will be removed in a future release.
+- ``*``:ref:`IndexPeaks <algm-IndexPeaks>` now has options to enter modulation vectors and additional information required for satellite peak indexing. As
+  a result :ref:`IndexPeaksWithSatellites <algm-IndexPeaksWithSatellites>` has been deprecated and will be removed in a future release.``*``
 - Bugs in :ref:`LoadIsawPeaks <algm-LoadIsawPeaks>` and :ref:`SaveIsawPeaks <algm-SaveIsawPeaks>` for WISH have been fixed.
 - Added IDF for DEMAND (HB3A upgrade)
 
 
 Bug Fixes
-#########
+---------
 
 - :ref:`IndexPeaks <algm-IndexPeaks>` has been fixed
   so that it correctly reports the number of main & satellite reflections that have been indexed. Also, if a satellite
   peak cannot be indexed its HKL is reset to 000 rather than accidentally setting it to the HKL of the main reflection.
 
-Imaging
--------
+``*`` See associated photos ``*``
 
 :ref:`Release 4.2.0 <v4.2.0>`
diff --git a/docs/source/release/v4.2.0/direct_geometry.rst b/docs/source/release/v4.2.0/direct_geometry.rst
index 0f2a50088645199e4c0f1e29b39c61de71e94c23..c3817f51d54cd93416d8bb4fcea6eb00214cb5db 100644
--- a/docs/source/release/v4.2.0/direct_geometry.rst
+++ b/docs/source/release/v4.2.0/direct_geometry.rst
@@ -5,14 +5,29 @@ Direct Geometry Changes
 .. contents:: Table of Contents
    :local:
 
-.. warning:: **Developers:** Sort changes under appropriate heading
-    putting new features at the top of the section, followed by
-    improvements, followed by bug fixes.
-
-* :ref:`DirectILLApplySelfShielding <algm-DirectILLApplySelfShielding>` will now first subtract the empty container background, then apply the self-shielding correction of the sample.
-* Added the ``CHESS`` and ``ZEEMANS`` instruments  in the ``Facilities.xml`` to SNS for the second target station
-* Added CHESS IDF
-* Modified :ref:`MaskBTP <algm-MaskBTP-v1>`, Q/E Coverage and DGSPlanner for CHESS
-* Added the :ref:`ALF View <ALF_View-ref>` GUI for aligning samples.
+Interfaces
+##########
+
+-Added the :ref:`ALF View <ALF_View-ref>` GUI for aligning samples.
+
+Algorithms
+##########
+
+- :ref:`DirectILLApplySelfShielding <algm-DirectILLApplySelfShielding>` will now first subtract the empty container background, then apply the self-shielding correction of the sample.
+- Modified :ref:`MaskBTP <algm-MaskBTP-v1>` to include CHESS
+
+.. figure:: ../../images/CHESS.PNG
+   :class: screenshot
+   :width: 200px
+   :align: right
+
+Instrument Updates
+##################
+
+- Added the ``CHESS`` and ``ZEEMANS`` instruments  in the ``Facilities.xml`` to SNS for the second target station
+- Added CHESS IDF.
+- Updated scripts QECoverage and DGSPlanner/InstrumentWidget for CHESS
+
+ 
 
 :ref:`Release 4.2.0 <v4.2.0>`
diff --git a/docs/source/release/v4.2.0/framework.rst b/docs/source/release/v4.2.0/framework.rst
index 5398a635e55b7b157cfbbce2ba79bcda2920c4f7..04c620222f7a8735d0a5d425b704dbfedd463e16 100644
--- a/docs/source/release/v4.2.0/framework.rst
+++ b/docs/source/release/v4.2.0/framework.rst
@@ -5,33 +5,26 @@ Framework Changes
 .. contents:: Table of Contents
    :local:
 
-.. warning:: **Developers:** Sort changes under appropriate heading
-    putting new features at the top of the section, followed by
-    improvements, followed by bug fixes.
+.. figure:: ../../images/UpdateOS.png
+   :class: screenshot
+   :width: 385px
+   :align: right
 
 Packaging
----------
-* The macOS bundle now requires macOS High Sierra (10.13) as a minimum.
-
+#########
+- The macOS bundle now requires macOS High Sierra (10.13) as a minimum.
+- The Ubuntu bundle requires Ubuntu 18.04.
+- Although this release may continue to work on Windows 7/8, this will not have been verified or tested by the development team on anything earlier than Windows 10.
 
-Concepts
---------
+New
+###
 
 Algorithms
 ----------
-* :ref:`LoadNGEM <algm-LoadNGEM>` added as a loader for the .edb files generated by the nGEM detector used for diagnostics. Generates an event workspace.
-* :ref:`MaskAngle <algm-MaskAngle>` has an additional option of ``Angle='InPlane'``
-* :ref:`FitIncidentSpectrum <algm-FitIncidentSpectrum>` will fit a curve to an incident spectrum returning the curve and it's first derivative.
-* :ref:`CalculatePlaczekSelfScattering <algm-CalculatePlaczekSelfScattering>` will calculate the Placzek correction from an incident spectrum as generated by :ref:`FitIncidentSpectrum <algm-FitIncidentSpectrum>`.
-* Whitespace is now ignored anywhere in the string when setting the Filename parameter in :ref:`Load <algm-Load>`.
-* Added options to :ref:`SaveMD <algm-SaveMD>` to allow selection of what will be saved. For MDHistoWorkspace only.
-* :ref:`SetGoniometer <algm-SetGoniometer>` will now work on all workspaces not just Workspace2D.
-* A new Poisson cost function has been added to :ref:`CalculateCostFunction <algm-CalculateCostFunction>`.
-* New algorithm :ref:`SaveNexusESS <algm-SaveNexusESS>` to save data and nexus geometry to a single processed file.
-* Version upgrade :ref:`LoadNexusProcessed <algm-LoadNexusProcessed>` to allow loading of both existing Mantid format Processed Nexus files and those produced via :ref:`SaveNexusESS <algm-SaveNexusESS>`.
-* In :ref:`SaveAscii <algm-SaveAscii>` it is now possible to save out also the values of the spectrum axis.
-* :ref:`IndexPeaks <algm-IndexPeaks>` now has options to enter modulation vectors and additional information required for satellite peak indexing. As
-  a result :ref:`IndexPeaksWithSatellites <algm-IndexPeaksWithSatellites>` has been deprecated and will be removed in a future release.
+- :ref:`SaveNexusESS <algm-SaveNexusESS>` to save data and nexus geometry to a single processed file.
+- :ref:`LoadNGEM <algm-LoadNGEM>` added as a loader for the .edb files generated by the nGEM detector used for diagnostics. Generates an event workspace.
+- :ref:`CalculatePlaczekSelfScattering <algm-CalculatePlaczekSelfScattering>` will calculate the Placzek correction from an incident spectrum as generated by :ref:`FitIncidentSpectrum <algm-FitIncidentSpectrum>`.
+- :ref:`FitIncidentSpectrum <algm-FitIncidentSpectrum>` will fit a curve to an incident spectrum returning the curve and it's first derivative.
 
 Instrument Definition Files
 ---------------------------
@@ -40,26 +33,40 @@ Instrument Definition Files
 
 Data Objects
 ------------
-* New methods :py:obj:`mantid.api.SpectrumInfo.azimuthal` and :py:obj:`mantid.geometry.DetectorInfo.azimuthal`  which returns the out-of-plane angle for a spectrum
+- New methods :py:obj:`mantid.api.SpectrumInfo.azimuthal` and :py:obj:`mantid.geometry.DetectorInfo.azimuthal`  which returns the out-of-plane angle for a spectrum
+
+Improvements
+############
+
+Algorithms
+----------
+- Whitespace is now ignored anywhere in the string when setting the Filename parameter in :ref:`Load <algm-Load>`.
+- Added options to :ref:`SaveMD <algm-SaveMD>` to allow selection of what will be saved. For MDHistoWorkspace only.
+- :ref:`SetGoniometer <algm-SetGoniometer>` will now work on all workspaces not just Workspace2D.
+- Version upgrade :ref:`LoadNexusProcessed <algm-LoadNexusProcessed>` to allow loading of both existing Mantid format Processed Nexus files and those produced via :ref:`SaveNexusESS <algm-SaveNexusESS>`.
+- A new Poisson cost function has been added to :ref:`CalculateCostFunction <algm-CalculateCostFunction>`.
+- In :ref:`SaveAscii <algm-SaveAscii>` it is now possible to save out also the values of the spectrum axis.
+- :ref:`IndexPeaks <algm-IndexPeaks>` now has options to enter modulation vectors and additional information required for satellite peak indexing. As
+  a result :ref:`IndexPeaksWithSatellites <algm-IndexPeaksWithSatellites>` has been deprecated and will be removed in a future release.
+- :ref:`MaskAngle <algm-MaskAngle>` has an additional option of ``Angle='InPlane'``
 
 Live Data
 ---------
-* Streaming of json geometry has been added to the KafkaLiveListener. User configuration is not required for this.
+- Streaming of json geometry has been added to the KafkaLiveListener. User configuration is not required for this.
   The streamer automatically picks up the geometry as a part of the run information and constructs the in-memory geometry without the need for an IDF.
 
 Python
 ------
-* IPython widget command executor has been updated to cope with changes to IPython >= 7.1
+- IPython widget command executor has been updated to cope with changes to IPython >= 7.1
 
 API
 ---
-
-It is now possible to have MultipleFileProperty configured in such a way, that it will allow empty placeholder tokens.
+- :py:obj:`~mantid.api.MultipleFileProperty` can be configured to allow empty placeholder tokens.
 
 Bug Fixes
----------
-* ref:`LoadNexusMonitors <algm-LoadNexusMonitors>` bug fix for user provided top-level NXentry name.
-* ref:`LoadInstrument <algm-LoadInstrument>` correctly handles IDF files which use all lowercase naming.
-* Fix `LoadMD <algm-LoadMD>` handling for when parameter map is missing
+#########
+- :ref:`LoadNexusMonitors <algm-LoadNexusMonitors>` bug fix for user provided top-level NXentry name.
+- :ref:`LoadInstrument <algm-LoadInstrument>` correctly handles IDF files which use all lowercase naming.
+- Fix :ref:`LoadMD <algm-LoadMD>` handling for when parameter map is missing
 
 :ref:`Release 4.2.0 <v4.2.0>`
diff --git a/docs/source/release/v4.2.0/index.rst b/docs/source/release/v4.2.0/index.rst
index 1314d2db994b44cd0216766d9492f2bd3b97dfe8..c930315db3c90f9d51526827f5d950cad2197308 100644
--- a/docs/source/release/v4.2.0/index.rst
+++ b/docs/source/release/v4.2.0/index.rst
@@ -4,7 +4,7 @@
 Mantid 4.2.0 Release Notes
 ===========================
 
-.. figure:: ../../images/ImageNotFound.png
+.. figure:: ../../images/fish.jpeg
    :class: screenshot
    :width: 385px
    :align: right
@@ -16,6 +16,10 @@ Mantid 4.2.0 Release Notes
 
 We are proud to announce version 4.2.0 of Mantid.
 
+**THIS IS THE LAST RELEASE THAT WILL SUPPORT Python 2**
+
+From v4.3 onwards Mantid will no longer support Python 3 and scripts run in Mantid will have to change to reflect this. `Time is Ticking <https://pythonclock.org/>`_!
+
 **TODO: Add paragraph summarizing big changes**
 
 This is just one of many improvements in this release, so please take a
diff --git a/docs/source/release/v4.2.0/indirect_geometry.rst b/docs/source/release/v4.2.0/indirect_geometry.rst
index 3f44f1e8fd917ce938bca0e3e6ccfaaea78007e0..e390bd8f6e7297d6deda5e20133a05692e6b092c 100644
--- a/docs/source/release/v4.2.0/indirect_geometry.rst
+++ b/docs/source/release/v4.2.0/indirect_geometry.rst
@@ -5,97 +5,50 @@ Indirect Geometry Changes
 .. contents:: Table of Contents
    :local:
 
-.. warning:: **Developers:** Sort changes under appropriate heading
-    putting new features at the top of the section, followed by
-    improvements, followed by bug fixes.
 
-Improved
-########
+Improvements
+############
 
 - Instrument definition is improved for IN16B to have the physical detector on the correct side of the beam axis, and different analyser focus for single detectors.
-- :ref:`LoadILLIndirect <algm-LoadILLIndirect>` is extended to support also the configurations with the first tube angle at 33.1 degrees.
-- :ref:`IndirectILLEnergyTransfer <algm-IndirectILLEnergyTransfer>` now offers the possibility to enable or disable the detector grouping both for Doppler and BATS modes. By default the pixels will be grouped tube by tube as before.
-- :ref:`IndirectILLEnergyTransfer <algm-IndirectILLEnergyTransfer>` offers an option to discard the single detectors if they were not enabled in the measurement.
-- A bug has been fixed in :ref:`MatchPeaks <algm-MatchPeaks>` which was causing wrong alignment in :ref:`IndirectILLReductionQENS <algm-IndirectILLReductionQENS>` with unmirror option 7, when the peaks in the alignment run are too narrow to be fitted.
-- :ref:`SofQWNormalisedPolygon <algm-SofQWNormalisedPolygon>` now checks input properties are valid.
-- :ref:`IndirectILLReductionFWS <algm-IndirectILLReductionFWS>` will now integrate the inelastic peaks correctly, based on the peak positions in the monitor spectrum.
+- Able to choose a list of spectra for plotting for all Indirect Interfaces. For example, under Data Analysis>Elwin, entering 0-2,4,6-8 and clicking **Plot Spectra** will plot the workspace indices 0, 1, 2, 4, 6, 7 and 8. The same can be done for **Plot Tiled** on the Iqt tab. It is  also possible to produce a contour plot using **Plot Contour** on the Diffraction Interface.
+- The Plotting Options have also been made more consistent across the interface.
 
+.. figure:: ../../images/Indirect_Data_Analysis_IqtFit.PNG
+  :class: screenshot
+  :align: right
+  :figwidth: 60%
+  :alt: The Indirect Data Analysis GUI in the Workbench.
+
+Workbench
+-------------
+
+- The Indirect Bayes GUI has been added to the Workbench.
+- ``*``**The Indirect Data Analysis GUI has been added to the Workbench**``*``
 
 Algorithms
 ----------
 
-Improvements
-############
-
 - :ref:`IndirectQuickRun <algm-IndirectQuickRun>` and :ref:`IndirectSampleChanger <algm-IndirectSampleChanger>` have been
   extended to allow them to perform a Width Fit. This utilizes the new algorithm :ref:`IndirectTwoPeakFit <algm-IndirectTwoPeakFit>`.
-
-Data Analysis Interface
------------------------
-
-Improvements
-############
-- Improved the output plotting options for Elwin and Iqt so that it is now possible to choose
-  a list of spectra for plotting. For example, entering 0-2,4,6-8 and clicking **Plot Spectra**
-  will plot the workspace indices 0, 1, 2, 4, 6, 7 and 8. The same can be done for **Plot Tiled**
-  on the Iqt tab.
-
-
-Data Reduction Interface
-------------------------
-
-Improvements
-############
-- Improved the output plotting options so that it is now possible to choose a list of spectra
-  for plotting. This is the same as described for the Elwin and Iqt tab in Data Analysis.
-- Improved the output plotting options so that they now show the workspace currently selected.
-  The options have also been made more consistent across the interface.
-
-
-Data Corrections Interface
---------------------------
-
-Improvements
-############
-- Improved the output plotting options so that it is now possible to choose a list of spectra
-  for plotting.
-- Improved the output plotting options so that they now show the workspace currently selected.
-  The options have also been made more consistent across the interface.
+- :ref:`LoadILLIndirect <algm-LoadILLIndirect>` is extended to support also the configurations with the first tube angle at 33.1 degrees.
+- :ref:`IndirectILLEnergyTransfer <algm-IndirectILLEnergyTransfer>` now offers the possibility to enable or disable the detector grouping both for Doppler and BATS modes. By default the pixels will be grouped tube by tube as before.
+- :ref:`IndirectILLEnergyTransfer <algm-IndirectILLEnergyTransfer>` offers an option to discard the single detectors if they were not enabled in the measurement.
+- :ref:`SofQWNormalisedPolygon <algm-SofQWNormalisedPolygon>` now checks input properties are valid.
+- :ref:`IndirectILLReductionFWS <algm-IndirectILLReductionFWS>` will now integrate the inelastic peaks correctly, based on the peak positions in the monitor spectrum.
 
 
 Simulations Interface
 ---------------------
 
-Improvements
-############
-- Improved the output plotting options so that it is now possible to choose a list of spectra
-  for plotting for the relevant tabs.
-- Improved the output plotting options so that they now show the workspace currently selected.
-  The options have also been made more consistent across the interface.
 - Improved the format of Abins HDF5 files to include readable set of advanced parameters. Values
   in the AbinsParameters module have been re-organised into a logical heirarchy; user scripts
   may need to be modified to match this.
 
+BugFixes
+########
 
-Diffraction Interface
----------------------
-
-Improvements
-############
-- Improved the output plotting options so that it is now possible to choose a list of spectra
-  for plotting. It also possible to do a contour plot using **Plot Contour**.
-- Improved the output plotting options so that they now show the workspace currently selected.
-
-The Workbench
--------------
-
-- The Indirect Bayes GUI has been added to the Workbench.
-- The Indirect Data Analysis GUI has been added to the Workbench.
+- A bug has been fixed in :ref:`MatchPeaks <algm-MatchPeaks>` which was causing wrong alignment in :ref:`IndirectILLReductionQENS <algm-IndirectILLReductionQENS>` with unmirror option 7, when the peaks in the alignment run are too narrow to be fitted.
 
-.. figure:: ../../images/Indirect_Data_Analysis_IqtFit.PNG
-  :class: screenshot
-  :align: center
-  :figwidth: 90%
-  :alt: The Indirect Data Analysis GUI in the Workbench.
+``*`` See associated image ``*``
 
 :ref:`Release 4.2.0 <v4.2.0>`
diff --git a/docs/source/release/v4.2.0/mantidplot.rst b/docs/source/release/v4.2.0/mantidplot.rst
index 4be0141a3b6ad1b098cdf84d4574ac2508681609..f82231adc4500aaabfe8ea4fae4650b092f59a2c 100644
--- a/docs/source/release/v4.2.0/mantidplot.rst
+++ b/docs/source/release/v4.2.0/mantidplot.rst
@@ -5,18 +5,26 @@ MantidPlot Changes
 .. contents:: Table of Contents
    :local:
 
+.. figure:: ../../images/MantidPlotMeme.jpg
+   :class: screenshot
+   :width: 500px
+   :align: right
+
 Improvements
 ############
-- A warning is presented when saving a project larger than (by default) 10GB.
+
+The vast majority of development effort for user interfaces is now directed towards the :doc:`Mantid workbench <mantidworkbench>`, for now only significant bugs will be fixed within MantidPlot.
+
+- Saving a project larger than 10GB produces a pop-up to inform it may take a long time and gives the opportunity to cancel.
 
 Bugfixes
 ########
 - Algorithm progress bar now shows correct units for time remaining.
 - Sample Transmission Calculator no longer has the option to change the Y-axis of the plot to logarithmic.
+- Sample Transmission Calculator no longer accepts negative wavelength values.
 - Fixes an issue where the * to indicate an invalid property would appear in the wrong place in the Load dialog.
 - Fixes an issue where the Load dialog would not resize correctly after clicking Run.
-- Useless help buttons removed from multiple dialogs.
-- Sample Transmission Calculator no longer accepts negative wavelength values.
-- Dragging and dropping workspaces onto the spectrum viewer no longer causes a crash
+- Useless Help [?] buttons removed from multiple dialogs.
+- Dragging and dropping workspaces onto the Spectrum Viewer no longer causes a crash.
 
 :ref:`Release 4.2.0 <v4.2.0>`
diff --git a/docs/source/release/v4.2.0/mantidworkbench.rst b/docs/source/release/v4.2.0/mantidworkbench.rst
index 31d3f5034bc4049f4275b249816e67a20e156fbe..ea49050e9eac9bff2630e8c96605103f8f5915b8 100644
--- a/docs/source/release/v4.2.0/mantidworkbench.rst
+++ b/docs/source/release/v4.2.0/mantidworkbench.rst
@@ -6,54 +6,85 @@ MantidWorkbench Changes
    :local:
 
 
+Improvements
+############
+
+.. figure:: ../../images/WB_Scriptrepo.png
+   :class: screenshot
+   :width: 650px
+   :align: right
+
 User Interface
-##############
+--------------
 
-- The zoom icon in the SliceViewer and plot toolbars have been replaced with clearer icons.
-- Plots now allow the insertion of draggable horizontal and vertical markers.
-- Marker label, color and line style can be edited on a per-marker basis.
-- The button to remove a curve in the figure options is now the same size as the drop-down list of curves.
-- Uses of "MantidPlot" in window titles have been removed.
-- Figure options now has a Legend tab so that a plot's legend can be customised.
+- ``*``The Script Repository - Download from 'File > Script' Repository to a folder of your choice!``*``
+- 'File > Generate Recovery Script', essentially generates a Project Recovery script. It does NOT include Workspace Clean-Up or other features of Project Recovery.
+- "Show Detectors" - Right-click a workspace and select "Show Detectors". This creates a table workspace with detector information relevant to the workspace.
+- Clearer icons in SliceViewer and Plot Toolbars.
+- Marker Label, Color and Line Style can be edited on a per-marker basis.
+- Figure Options now has a Legend tab so that a plot's legend can be customised.
+- Project Save and Load will no longer freeze when processing large amounts of workspaces and/or interfaces.
+- Saving files larger than 10GB produces a pop-up to inform it may take a long time and gives the opportunity to cancel.
+- Fit-Result Workspaces are now accessible from the Fitting Interface.
+- Opening >1 instance of an interface is now disallowed, as was the case in MantidPlot.
+- The Help [?] Button in Manage User Directories has been restored.
+- It is now possible to fit Table Workspaces in the Fit Browser and in a script.
 
-New
-###
-- Added a 'Generate Recovery Script' button to Workbench under the File menu bar, it generates a script that is essentially what project recovery uses. However it is only the script and does not include the workspace clean up and other features Project Recovery offers.
-- There is now an algorithm to create a table workspace showing detector information for a given workspace, and a "Show Detectors" option when you right-click a workspace which executes this algorithm.
-- The script repository is now in workbench .
+.. figure:: ../../images/WB_Viewmessages.png
+   :class: screenshot
+   :width: 250px
+   :align: right
 
-Improvements
-############
-- The keyboard shortcut Ctrl+N now opens a new tab in the script editor.
-- Project Save and Load will no longer freeze when saving and loading large amounts of workspaces and/or interfaces.
-- Attempting to save files that are larger than (by default) 10GB now results in a dialog box to inform the user that it may take a long time and gives them the opportunity to cancel.
-- Added basic tiled plots to workbench interface.
-- Changing the axis' scale, by right-clicking on a figure with multiple plots, changes only the plot that was clicked on.
-- If a spectrum has a label, this will now be used instead of the spectrum number in the legend when the spectrum is plotted.
-- The dialog for selecting spectra to plot now has the spectrum number input field selected by default.
-- There are now icons alongside the colormap names in the plot options dialog.
-- The help button in the Manage User Directories widget has been restored.
-- Hex codes can now be inputted directly into the color selectors in figure options.
-- There is now a button on the plot window's toolbar to generate a script that will re-create the current figure.
-- There is now a "Filter by" menu in the message display's context menu, allowing you to filter output by script.
-- It is now possible to fit table workspaces in the fit browser and in a script.
-- The keyboard shortcuts Ctrl++ and Ctrl+- can now be used to increase/decrease the font size in the script editor.
-- It is now possible to input axis limits in the figure options using scientific notation.
-- The sub-tabs in the Curves tab in plot options now contain an "Apply to All" button which copies the properties of the current curve to all other curves in the plot.
-- The fit result workspaces are now accessible from the fitting interface.
+Scripting
+---------
+
+- New keyboard shortcuts:
+	- Ctrl+ (Ctrl-) increases (decreases) font size in the script editor.
+	- Ctrl+N opens a new tab in the script editor.
+	- Ctrl+D aborts a running script
 - The auto-complete in Workbench's script editor has been improved.
-- There are now forward and back buttons on figures to go back and forward through figure zoom states.
-- The home button on figures now always centres the figure's contents.
+- ``*``"View" option, allowing you to filter Messages output by script - Right-click in the Messages Display and hover over "View" to see the options. ``*``
+
+.. figure:: ../../images/WB_Tiled.png
+   :class: screenshot
+   :width: 650px
+   :align: right
+
+.. figure:: ../../images/WB_GenerateaScript.png
+   :class: screenshot
+   :width: 400px
+   :align: right
+
+.. figure:: ../../images/WB_ColormapIcons.png
+   :class: screenshot
+   :width: 400px
+   :align: right
+
+Plotting
+--------
+
+- ``*``Added basic Tiled plots.``*``
+- Changing the Axes' scale, by Right-clicking on a figure with multiple plots, changes only the plot that was clicked on.
+- Spectrum Label included in Legend (instead of Spectrum Number) if provided
+- Plotting Dialog uses Spectrum Number by default.
+- Home Button on Plot Windows now always centres the figure's contents.
+- Forward and Back Arrows on Plot Windows to navigate Zoom levels.
+- ``*``"Generate Script" Button on Plot Window to produce a script to re-create the current figure.``*``
 - You can now zoom in/out on figures by scrolling and pan figures using the middle mouse button.
-- The keyboard shortcut Ctrl+D now aborts a running script.
-- Plot windows now stay on top of Workbench's main window, so you can easily drag and drop workspaces onto existing figures.
-- Opening more than one instance of an interface is now disallowed, as was the case in MantidPlot.
+- The X value headers on data display now shows values to 4 decimal places.
+- Plot Windows stay on top of Workbench's main window, so you can easily Drag and Drop workspaces onto existing figures.
+- Draggable horizontal and vertical markers can be inserted into plots.
+- ``*``Colormap Icons - In a Plot Window open Figure Options (Gear Icon, under Images>Colormap shows Colormap Icons beside names.``*``
+- Hex Codes can be input into the Color Selectors in Figure Options.
+- Scientific Notation can be used to input Axis Limits in the Figure Options.
+- Sub-tabs in the Curves tab in Figure Options on plots now contain "Apply to All" buttons. It copies the current curve's properties to all others in the plot.
 
 Bugfixes
 ########
+
 - Pressing the tab key while in the axis quick editor now selects each input field in the correct order.
 - Clicking Cancel after attempting to save a project upon closing now keeps Workbench open instead of closing without saving.
-- Dialog windows no longer contain a useless ? button in their title bar.
+- Dialog windows no longer contain a useless help [?] button in their title bar.
 - Instrument view now keeps the saved rendering option when loading projects.
 - Fixes an issue where choosing to not overwrite an existing project when attempting to save upon closing would cause Workbench to close without saving.
 - Fit results on normalised plots are now also normalised to match the plot.
@@ -75,5 +106,9 @@ Bugfixes
 - You can now save scripts that contain unicode characters.
 - A crash no longer occurs when the GenerateEventsFilter algorithm fails in the Filter Events Interface
 - Workspaces contained within groups are no longer duplicated when saving a project.
+- The button to "Remove" a curve in Figure Options is now the same size as the drop-down list of curves.
+- "MantidPlot" in window titles have been removed.
+
+``*`` See associated image ``*``
 
 :ref:`Release 4.2.0 <v4.2.0>`
diff --git a/docs/source/release/v4.2.0/muon.rst b/docs/source/release/v4.2.0/muon.rst
index 04ffb345e54d14c149cbf6fcbfd1a0d429f8f72c..ab3e881b7a8feb7d10b7b2674d73fd5f6108202c 100644
--- a/docs/source/release/v4.2.0/muon.rst
+++ b/docs/source/release/v4.2.0/muon.rst
@@ -5,61 +5,48 @@ MuSR Changes
 .. contents:: Table of Contents
    :local:
 
-New
-###
-
 
 Improvements
-############
-  * Improved the speed of plotting during sequential fits.
-
-Removed
-#######
-
-
-Bug Fixes
-#########
-  * Fixed an issue where changing the normalisation on a plot with auto-scale disabled throws an exception.
-  * Fixed an issue where warnings about adding workspaces to workspace groups multiple times were appearing in the log.
-  * Fixed an issue where logs in TF asymmetry mode were not being propogated to the results tab.
-  * Fixed an issue where Muon Analysis 2 would crash if a polynomial background was used in combination with another fitting function.
-  * Fixed an issue where changing the dead time to from table workspace or other file did not work and reverted back to from data file.
+###############
 
-Known Issues
-############
+- The speed of plotting during Sequential Fits.
+- Removed the creation of a group of groups from the Elemental Analysis GUI. It will now create a workspace for each detector, with each workspace containing three spectra corresponding to Total, Delayed and Prompt data.
+- Muon Analysis Interface>Fitting>Property>TF Asymmetry mode now rescales the fit to match the rescaled data.
+- Adding a pair by right clicking now allows a name to be specified.
 
 Algorithms
-----------
-
-Improvements
-############
+-------------
 
 - Improve the handling of :ref:`LoadPSIMuonBin<algm-LoadPSIMuonBin-v1>` where a poor date is provided.
-- In TF asymmetry mode now rescales the fit to match the rescaled data.
-- Adding a pair by right clicking now allows a name to be specified.
+- :ref:`LoadPSIMuonBin <algm-LoadPSIMuonBin>` has been improved to correctly load data other than data from Dolly at the SmuS/PSI.
+- When there is a T0 for each spectrum, :ref:`LoadPSIMuonBin <algm-LoadPSIMuonBin>` chooses the max value out of the array instead of the first value.
 
-Interfaces
-----------
+.. figure:: ../../images/MuonAnalysis.PNG
+   :class: screenshot
+   :width: 500px
+   :align: right
 
-Muon Analysis 2 and Frequency Domain Analysis
-#############################################
+Muon Analysis 2 and Frequency Domain Interfaces
+---------------------------------------------------
 
 - When loading PSI data if the groups given are poorly stored in the file, it should now produce unique names in the grouping tab for groups.
-- When switching between data sets groups selected to fit are remembered.
-- The FFT tab now uses the group pair selection to make a guess at the users selection for workspaces.
+- When switching between Data Sets, Groups selected to fit are remembered.
+- The Frequency Domain>Transform>FFT tab now uses Group Pair Selection to guess at the User's selection for workspaces.
 - Can now plot FFT's of PhaseQuad data.
-- No longer produces an error if using multiple runs and the user plots all the FFT results when no imaginary data was used.
-- Muon Analysis (new) and Frequency Domain Analysis (new) work with project recovery. 
-- The original Muon Analysis GUI has been renamed Muon Analysis old and has been deprecated. 
-- The new Muon Analysis has been renamed Muon Analysis.
+- Both interfaces work with Project Recovery. 
+- The original Muon Analysis GUI has been renamed "Muon Analysis Old" and has been deprecated. 
+- ``*`` The new Muon Analysis GUI has been renamed Muon Analysis. ``*``
 
-Algorithms
-----------
+Bug Fixes
+#########
 
-Improvements
-############
+- No longer produces an error if using multiple runs and the user plots all the FFT results when no imaginary data was used.
+- Fixed an issue where changing the normalisation on a plot with auto-scale disabled throws an exception.
+- Fixed an issue where warnings about adding workspaces to workspace groups multiple times were appearing in the log.
+- Fixed an issue where logs in TF asymmetry mode were not being propogated to the results tab.
+- Fixed an issue where Muon Analysis 2 would crash if a polynomial background was used in combination with another fitting function.
+- Fixed an issue where changing the dead time to from table workspace or other file did not work and reverted back to from data file.
 
-- :ref:`LoadPSIMuonBin <algm-LoadPSIMuonBin>` has been improved to correctly load data other than data from Dolly at the SmuS/PSI.
-- When there is a T0 for each spectrum, :ref:`LoadPSIMuonBin <algm-LoadPSIMuonBin>` chooses the max value out of the array instead of the first value.
+``*`` See associated Image ``*``
 
 :ref:`Release 4.2.0 <v4.2.0>`
diff --git a/docs/source/release/v4.2.0/reflectometry.rst b/docs/source/release/v4.2.0/reflectometry.rst
index 5f3bdb366f346b591dff4b505eee298f5c1b6620..c8c2a5033c613c2c94440a6f97a5431e77026164 100644
--- a/docs/source/release/v4.2.0/reflectometry.rst
+++ b/docs/source/release/v4.2.0/reflectometry.rst
@@ -4,19 +4,24 @@ Reflectometry Changes
 
 .. contents:: Table of Contents
    :local:
-
-.. warning:: **Developers:** Sort changes under appropriate heading
-    putting new features at the top of the section, followed by
-    improvements, followed by bug fixes.
+   
 
 ISIS Reflectometry Interface
 ----------------------------
+
 New
 ###
+
 - Batch Save/Load: full saving the runs table and all of the related settings for a batch is now possible.
 - Project Save and Load: full saving of runs table including styling and related settings on a batch by batch level. All batches are saved.
 - Integration with Project Recovery: GUI should now recover should recovery successfully recreate all workspaces
 - The Slit Calculator dialog can now be accessed from the Tools menu.
+- :ref:`ReflectometryReductionOneAuto <algm-ReflectometryReductionOneAuto-v3>` has been rewritten and updated to version 3. In the new version the polarization correction properties have been removed from the algorithm input and are now taken from the parameter file. A checkbox has been added to indicate whether the corrections should be applied.
+
+.. figure:: ../../images/LiveDataUserInput.png
+   :class: screenshot
+   :width: 500px
+   :align: right
 
 Improved
 ########
@@ -25,31 +30,16 @@ Improved
 - The polarization correction inputs have been simplified to a single checkbox which when ticked will apply polarization corrections based on properties in the instrument parameters file.
 - Batch names will now have a unique number assigned to it, and there will no longer be multiple batches of the same name.
 - The Instrument is now synchronised across all Batch tabs.
-- Live data monitoring update intervals can now be user-specified.
+- ``*`` Live data monitoring update intervals can now be user-specified. ``*``
 
 Bug fixes
 #########
 
 - A bug has been fixed where the interface could sometimes not be closed after a failed attempt at starting Autoprocessing.
-  
-Algorithms
-----------
-
-New
-###
-
-- :ref:`ReflectometryReductionOneAuto <algm-ReflectometryReductionOneAuto-v3>` has been rewritten and updated to version 3. In the new version the polarization correction properties have been removed from the algorithm input and are now taken from the parameter file. A checkbox has been added to indicate whether the corrections should be applied.
-
-Improved
-########
-
-Bug fixes
-#########
-
-The following bugs have been fixed since the last release:
-
 - The pause button is now disabled upon opening the interface and becomes enabled when a process starts.
 - Ensure that the TOF group cannot contain non-TOF workspaces or nested groups (nested groups are not supported so are now flattened into a single group instead).
 - An issue has been fixed where the incorrect transmission workspaces were being output when debug is on/off.
 
+``*`` See associated Image ``*``
+
 :ref:`Release 4.2.0 <v4.2.0>`
diff --git a/docs/source/release/v4.2.0/sans.rst b/docs/source/release/v4.2.0/sans.rst
index 00619a028a0bc75397c16bc2b97b3abf078e7d7c..94a3192cb53f9b1476c75dda4103437e3864332f 100644
--- a/docs/source/release/v4.2.0/sans.rst
+++ b/docs/source/release/v4.2.0/sans.rst
@@ -5,16 +5,6 @@ SANS Changes
 .. contents:: Table of Contents
    :local:
 
-.. figure:: ../../images/ISISSansInterface/q_wavelength_release_4.2.png
-  :class: screenshot
-  :align: center
-  :figwidth: 70%
-  :alt: The Q, Wavelength tab of ISIS SANS
-
-
-.. warning:: **Developers:** Sort changes under appropriate heading
-    putting new features at the top of the section, followed by
-    improvements, followed by bug fixes.
 
 New
 ###
@@ -23,26 +13,29 @@ New
   perform monitor shifts without changing the selected transmission spectrum.
 - New :ref:`HFIRSANS2Wavelength <algm-HFIRSANS2Wavelength-v1>` algorithm to "convert" CG2 event files
   to histograms in wavelength.
+- New BIOSANS instrument definition file to accompany the data collection in event nexus new mode.
+- New CG2 definition file
 
 Improved
 ########
 
 - Option in :ref:`EQSANSCorrectFrame <algm-EQSANSCorrectFrame>` to correct
   TOF by path to individual pixel.
-- New CG2 definition file.
-- Option in :ref:`EQSANSCorrectFrame <algm-EQSANSCorrectFrame-v1>` to correct
-  TOF by path to individual pixel
-- New CG2 definition file
-- A bug causing large batch files (1000+ runs) to take minutes to load into the
-  ISIS SANS GUI has been fixed. Large batch files will now load within seconds.
 - :ref:`ApplyTransmissionCorrection <algm-ApplyTransmissionCorrection-v1>` now
   can be supplied any transmission workspace that is supported
   by :ref:`Divide <algm-Divide-v1>` .
-- Fixed a bug where Mantid would crash when a user went to change their default
-  save directory if no instrument was selected.
 
-Multiple ISIS SANS GUI usability fixes including:
+.. figure:: ../../images/ISISSansInterface/q_wavelength_release_4.2.png
+  :class: screenshot
+  :align: center
+  :figwidth: 70%
+  :alt: The Q, Wavelength tab of ISIS SANS
 
+Multiple ISIS SANS GUI Usability
+-----------------------------------
+
+- ``*`` The "visual noise" of the *General* and *Q, Wavelength* settings tabs has
+  been reduced. ``*``
 - Clicking on a cell in the table and typing will automatically start editing
   the cell without having to double click it.
 - Sample thickness is set when a user presses load or process selected,
@@ -54,15 +47,20 @@ Multiple ISIS SANS GUI usability fixes including:
   selected files.
 - *Open Mask File* and *Open Batch File* will only show .txt and .csv files
   respectively by default.
-- The "visual noise" of the *General* and *Q, Wavelength* settings tabs has
-  been reduced.
-- The check-boxes enabling extra table options, such as *Sample Geometry* have
+- The Check-boxes enabling extra table options, such as *Sample Geometry* have
   been moved alongside the table controls.
-
 - Multiple SANS Workflow Algorithms were converted into internal scripts.
   This removes the need for passing SANSState objects in unrolled histories.
   Additionally, it speeds up the reduction of each run by ~35%.
 
+Bug Fixes
+##########
+
+- Fixed a bug where Mantid would crash when a user went to change their default
+  save directory if no instrument was selected.
+- A bug causing large batch files (1000+ runs) to take minutes to load into the
+  ISIS SANS GUI has been fixed. Large batch files will now load within seconds.
+
 Removed
 #######
 
@@ -78,4 +76,6 @@ The following SANS Workflow algorithms were removed:
 - SANSScale
 - SANSSliceEvent
 
+``*`` See associated Image ``*``
+
 :ref:`Release 4.2.0 <v4.2.0>`
diff --git a/installers/MacInstaller/make_package.rb b/installers/MacInstaller/make_package.rb
index 9fce44fb13931c5c41ca5642d0a395e32a0be2bd..0e2744f3f1cf8bda2e795cf0c006706208c923be 100755
--- a/installers/MacInstaller/make_package.rb
+++ b/installers/MacInstaller/make_package.rb
@@ -147,7 +147,7 @@ end
 # +destination+:: Destination directory for bundle
 # +host_python_exe+:: Executable of Python bundle to copy over
 # +bundled_packages+:: A list of packages that should be bundled
-# returns the root of the framework directory
+# returns the bundle site packages directory
 def deploy_python_framework(destination, host_python_exe,
                             bundled_packages)
   host_py_home = host_python_exe.realpath.parent.parent
@@ -202,25 +202,36 @@ def deploy_python_framework(destination, host_python_exe,
   bundle_site_packages = Pathname.new("#{bundle_py_home}/lib/python#{py_ver}/site-packages")
   FileUtils.rm bundle_site_packages
   FileUtils.mkdir bundle_site_packages
-  bundled_packages.each do |package|
+  copy_selection_recursive(bundled_packages, src_site_packages,
+                           bundle_site_packages)
+  make_writable(bundle_site_packages)
+
+  # fix mpl_toolkit if it is missing __init__
+  mpltoolkit_init =
+    FileUtils.touch "#{bundle_site_packages}/mpl_toolkits/__init__.py"
+
+  bundle_site_packages
+end
+
+# Copies, recursively, the selected list of packages from the
+# src to the destination. The destination must already exist
+# Params:
+# +packages+:: A list of items in src_dir to copy
+# +src_dir+:: Source directory containing above packages
+# +dest_dir+:: Destination directory
+def copy_selection_recursive(packages, src_dir, dest_dir)
+  packages.each do |package|
     package_dir = Pathname.new(package).dirname
     if package_dir == Pathname.new('.')
-      destination = bundle_site_packages
+      destination = dest_dir
     else
-      destination = bundle_site_packages + package_dir
+      destination = dest_dir + package_dir
       FileUtils.makedirs destination
     end
 
     # use cp rather than FileUtils as cp will automatically follow symlinks
-    execute("cp -r #{src_site_packages + package} #{destination}")
+    execute("cp -r #{src_dir + package} #{destination}")
   end
-  make_writable(bundle_site_packages)
-
-  # fix mpl_toolkit if it is missing __init__
-  mpltoolkit_init =
-    FileUtils.touch "#{bundle_site_packages}/mpl_toolkits/__init__.py"
-
-  bundle_python_framework
 end
 
 # Install requested Qt plugins to bundle
@@ -580,8 +591,21 @@ end
 
 # We start with the assumption CMake has installed all required target libraries/executables
 # into the bundle and the main layout exists.
-deploy_python_framework(contents_frameworks, host_python_exe,
-                        bundled_packages)
+bundle_py_site_packages = deploy_python_framework(contents_frameworks, host_python_exe,
+                                                  bundled_packages)
+if $PARAVIEW_BUILD_DIR.start_with?('/')
+  pv_lib_dir = Pathname.new($PARAVIEW_BUILD_DIR) + 'lib'
+  # add bare VTK/ParaView so libraries
+  copy_selection_recursive(Dir[pv_lib_dir + '*Python.so'].map { |item| Pathname.new(item).basename },
+                           pv_lib_dir,
+                           bundle_py_site_packages)
+  # add ParaView python packages
+  pv_site_packages = pv_lib_dir + 'site-packages'
+  copy_selection_recursive(Dir[pv_site_packages + '*'].map { |item| Pathname.new(item).basename },
+                           pv_site_packages,
+                           bundle_py_site_packages)
+end
+
 install_qt_plugins(bundle_path, bundled_qt_plugins, host_qt_plugins_dir,
                    QT_PLUGINS_BLACKLIST)
 # We choose not to use macdeployqt as it uses @executable_path so we have to essentially
diff --git a/instrument/BIOSANS_Definition.xml b/instrument/BIOSANS_Definition.xml
index 9970ee8c0be6bdd03b341fdf58eef44fa293fc79..a370eda3b279f5e6478be3948177fd47e805c748 100644
--- a/instrument/BIOSANS_Definition.xml
+++ b/instrument/BIOSANS_Definition.xml
@@ -1,580 +1,614 @@
 <?xml version='1.0' encoding='ASCII'?>
 <instrument xmlns="http://www.mantidproject.org/IDF/1.0"
-			xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-			xsi:schemaLocation="http://www.mantidproject.org/IDF/1.0 http://schema.mantidproject.org/IDF/1.0/IDFSchema.xsd"
-			name="BIOSANS"
-			valid-from="2016-04-22 00:00:00"
-			valid-to="2100-01-31 23:59:59"
-			last-modified="2018-12-06 17:45:00.000">
-	
-	<defaults>
-		<length unit="meter"/>
-		<angle unit="degree"/>
-		<reference-frame>
-			<along-beam axis="z"/>
-			<pointing-up axis="y"/>
-			<handedness val="right"/>
-		</reference-frame>
-	</defaults>
-	
-	<!--SOURCE AND SAMPLE POSITION-->
-	<component type="moderator">
-		<location z="-13.601"/>
-	</component>
-	<type name="moderator" is="Source"/>
-	
-	<component type="sample-position">
-		<location y="0.0" x="0.0" z="0.0"/>
-	</component>
-	<type name="sample-position" is="SamplePos"/>
-	
-	<!-- ***************************************************************** -->
-	<!--MONITOR 1 -->
-	<component type="monitors" idlist="monitor1">
-		<location/>
-	</component>
-	<type name="monitors">
-	    <component type="monitor">
-    		<location z="-10.5" name="monitor1"/>
-    	</component>
-	</type>
-	<idlist idname="monitor1">
-		<id val="1" />
-	</idlist>
-
-	<!--MONITOR 2 -->
-	<component type="timers" idlist="timer1">
-		<location/>
-	</component>
-	<type name="timers">
-	    <component type="monitor">
-    		<location z="-10.5" name="timer1"/>
-    	</component>
-	</type>
-	<idlist idname="timer1">
-		<id val="2" />
-	</idlist>
-
-	<!--MONITOR SHAPE-->
-	<!--FIXME: Do something real here.-->
-	<type is="monitor" name="monitor">
-		<cylinder id="cyl-approx">
-		<centre-of-bottom-base y="0.0" x="0.0" z="0.0"/>
-		<axis y="0.0" x="0.0" z="1.0"/>
-		<radius val="0.01"/>
-		<height val="0.03"/>
-		</cylinder>
-		<algebra val="cyl-approx"/>
-	</type>
-		
-	<!-- ***************************************************************** -->
-	<!-- Main Detector -->
-	<component type="detector1" idstart="3" idfillbyfirst="x" idstep="256" idstepbyrow="1">
-		<location name="detector1">
-			<parameter name="z">
-				<logfile eq="0.001*value" id="sdd"/>
-			</parameter>
-			<parameter name="x">
-				<logfile eq="0.001*value" id="detector-translation"/>
-			</parameter>
-			<parameter name="y">
-        <value val="0.0"/>
+	    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	    name="BIOSANS"
+	    valid-from="2019-10-01 00:00:00"
+	    valid-to="2100-12-31 23:59:59"
+	    last-modified="2019-11-04 17:18:14.663174"
+	    xsi:schemaLocation="http://www.mantidproject.org/IDF/1.0 http://schema.mantidproject.org/IDF/1.0/IDFSchema.xsd">
+  <!--Created by Jose Borregero, borreguerojm@ornl.gov-->
+  <defaults>
+    <length unit="metre"/>
+    <angle unit="degree"/>
+    <reference-frame>
+      <along-beam axis="z"/>
+      <pointing-up axis="y"/>
+      <handedness val="right"/>
+    </reference-frame>
+    <default-view view="3D" axis-view="Z-"/>
+  </defaults>
+  <!---->
+  <!--COMPONENT and TYPE: SOURCE AND SAMPLE POSITION-->
+  <!---->
+  <component type="moderator">
+    <location z="-1.0"/>
+  </component>
+  <type name="moderator" is="Source"/>
+  <component type="sample-position">
+    <location x="0.0" y="0.0" z="0.0"/>
+  </component>
+  <type name="sample-position" is="SamplePos"/>
+  <!---->
+  <!--TYPE: PIXEL FOR STANDARD 256 PIXEL TUBE-->
+  <!---->
+  <type name="pixel" is="detector">
+    <cylinder id="cyl-approx">
+      <centre-of-bottom-base r="0.0" t="0.0" p="0.0"/>
+      <axis x="0.00000" y="1.00000" z="0.00000"/>
+      <radius val="0.00402"/>
+      <height val="0.00409"/>
+    </cylinder>
+    <algebra val="cyl-approx"/>
+  </type>
+  <!---->
+  <!--TYPE: STANDARD 256 PIXEL TUBE-->
+  <!---->
+  <type outline="yes" name="tube">
+    <properties/>
+    <component type="pixel">
+      <location name="pixel1" y="-0.52096"/>
+      <location name="pixel2" y="-0.51687"/>
+      <location name="pixel3" y="-0.51279"/>
+      <location name="pixel4" y="-0.50870"/>
+      <location name="pixel5" y="-0.50461"/>
+      <location name="pixel6" y="-0.50053"/>
+      <location name="pixel7" y="-0.49644"/>
+      <location name="pixel8" y="-0.49236"/>
+      <location name="pixel9" y="-0.48827"/>
+      <location name="pixel10" y="-0.48418"/>
+      <location name="pixel11" y="-0.48010"/>
+      <location name="pixel12" y="-0.47601"/>
+      <location name="pixel13" y="-0.47193"/>
+      <location name="pixel14" y="-0.46784"/>
+      <location name="pixel15" y="-0.46375"/>
+      <location name="pixel16" y="-0.45967"/>
+      <location name="pixel17" y="-0.45558"/>
+      <location name="pixel18" y="-0.45150"/>
+      <location name="pixel19" y="-0.44741"/>
+      <location name="pixel20" y="-0.44332"/>
+      <location name="pixel21" y="-0.43924"/>
+      <location name="pixel22" y="-0.43515"/>
+      <location name="pixel23" y="-0.43107"/>
+      <location name="pixel24" y="-0.42698"/>
+      <location name="pixel25" y="-0.42289"/>
+      <location name="pixel26" y="-0.41881"/>
+      <location name="pixel27" y="-0.41472"/>
+      <location name="pixel28" y="-0.41064"/>
+      <location name="pixel29" y="-0.40655"/>
+      <location name="pixel30" y="-0.40246"/>
+      <location name="pixel31" y="-0.39838"/>
+      <location name="pixel32" y="-0.39429"/>
+      <location name="pixel33" y="-0.39021"/>
+      <location name="pixel34" y="-0.38612"/>
+      <location name="pixel35" y="-0.38204"/>
+      <location name="pixel36" y="-0.37795"/>
+      <location name="pixel37" y="-0.37386"/>
+      <location name="pixel38" y="-0.36978"/>
+      <location name="pixel39" y="-0.36569"/>
+      <location name="pixel40" y="-0.36161"/>
+      <location name="pixel41" y="-0.35752"/>
+      <location name="pixel42" y="-0.35343"/>
+      <location name="pixel43" y="-0.34935"/>
+      <location name="pixel44" y="-0.34526"/>
+      <location name="pixel45" y="-0.34118"/>
+      <location name="pixel46" y="-0.33709"/>
+      <location name="pixel47" y="-0.33300"/>
+      <location name="pixel48" y="-0.32892"/>
+      <location name="pixel49" y="-0.32483"/>
+      <location name="pixel50" y="-0.32075"/>
+      <location name="pixel51" y="-0.31666"/>
+      <location name="pixel52" y="-0.31257"/>
+      <location name="pixel53" y="-0.30849"/>
+      <location name="pixel54" y="-0.30440"/>
+      <location name="pixel55" y="-0.30032"/>
+      <location name="pixel56" y="-0.29623"/>
+      <location name="pixel57" y="-0.29214"/>
+      <location name="pixel58" y="-0.28806"/>
+      <location name="pixel59" y="-0.28397"/>
+      <location name="pixel60" y="-0.27989"/>
+      <location name="pixel61" y="-0.27580"/>
+      <location name="pixel62" y="-0.27171"/>
+      <location name="pixel63" y="-0.26763"/>
+      <location name="pixel64" y="-0.26354"/>
+      <location name="pixel65" y="-0.25946"/>
+      <location name="pixel66" y="-0.25537"/>
+      <location name="pixel67" y="-0.25129"/>
+      <location name="pixel68" y="-0.24720"/>
+      <location name="pixel69" y="-0.24311"/>
+      <location name="pixel70" y="-0.23903"/>
+      <location name="pixel71" y="-0.23494"/>
+      <location name="pixel72" y="-0.23086"/>
+      <location name="pixel73" y="-0.22677"/>
+      <location name="pixel74" y="-0.22268"/>
+      <location name="pixel75" y="-0.21860"/>
+      <location name="pixel76" y="-0.21451"/>
+      <location name="pixel77" y="-0.21043"/>
+      <location name="pixel78" y="-0.20634"/>
+      <location name="pixel79" y="-0.20225"/>
+      <location name="pixel80" y="-0.19817"/>
+      <location name="pixel81" y="-0.19408"/>
+      <location name="pixel82" y="-0.19000"/>
+      <location name="pixel83" y="-0.18591"/>
+      <location name="pixel84" y="-0.18182"/>
+      <location name="pixel85" y="-0.17774"/>
+      <location name="pixel86" y="-0.17365"/>
+      <location name="pixel87" y="-0.16957"/>
+      <location name="pixel88" y="-0.16548"/>
+      <location name="pixel89" y="-0.16139"/>
+      <location name="pixel90" y="-0.15731"/>
+      <location name="pixel91" y="-0.15322"/>
+      <location name="pixel92" y="-0.14914"/>
+      <location name="pixel93" y="-0.14505"/>
+      <location name="pixel94" y="-0.14096"/>
+      <location name="pixel95" y="-0.13688"/>
+      <location name="pixel96" y="-0.13279"/>
+      <location name="pixel97" y="-0.12871"/>
+      <location name="pixel98" y="-0.12462"/>
+      <location name="pixel99" y="-0.12054"/>
+      <location name="pixel100" y="-0.11645"/>
+      <location name="pixel101" y="-0.11236"/>
+      <location name="pixel102" y="-0.10828"/>
+      <location name="pixel103" y="-0.10419"/>
+      <location name="pixel104" y="-0.10011"/>
+      <location name="pixel105" y="-0.09602"/>
+      <location name="pixel106" y="-0.09193"/>
+      <location name="pixel107" y="-0.08785"/>
+      <location name="pixel108" y="-0.08376"/>
+      <location name="pixel109" y="-0.07968"/>
+      <location name="pixel110" y="-0.07559"/>
+      <location name="pixel111" y="-0.07150"/>
+      <location name="pixel112" y="-0.06742"/>
+      <location name="pixel113" y="-0.06333"/>
+      <location name="pixel114" y="-0.05925"/>
+      <location name="pixel115" y="-0.05516"/>
+      <location name="pixel116" y="-0.05107"/>
+      <location name="pixel117" y="-0.04699"/>
+      <location name="pixel118" y="-0.04290"/>
+      <location name="pixel119" y="-0.03882"/>
+      <location name="pixel120" y="-0.03473"/>
+      <location name="pixel121" y="-0.03064"/>
+      <location name="pixel122" y="-0.02656"/>
+      <location name="pixel123" y="-0.02247"/>
+      <location name="pixel124" y="-0.01839"/>
+      <location name="pixel125" y="-0.01430"/>
+      <location name="pixel126" y="-0.01021"/>
+      <location name="pixel127" y="-0.00613"/>
+      <location name="pixel128" y="-0.00204"/>
+      <location name="pixel129" y="0.00204"/>
+      <location name="pixel130" y="0.00613"/>
+      <location name="pixel131" y="0.01021"/>
+      <location name="pixel132" y="0.01430"/>
+      <location name="pixel133" y="0.01839"/>
+      <location name="pixel134" y="0.02247"/>
+      <location name="pixel135" y="0.02656"/>
+      <location name="pixel136" y="0.03064"/>
+      <location name="pixel137" y="0.03473"/>
+      <location name="pixel138" y="0.03882"/>
+      <location name="pixel139" y="0.04290"/>
+      <location name="pixel140" y="0.04699"/>
+      <location name="pixel141" y="0.05107"/>
+      <location name="pixel142" y="0.05516"/>
+      <location name="pixel143" y="0.05925"/>
+      <location name="pixel144" y="0.06333"/>
+      <location name="pixel145" y="0.06742"/>
+      <location name="pixel146" y="0.07150"/>
+      <location name="pixel147" y="0.07559"/>
+      <location name="pixel148" y="0.07968"/>
+      <location name="pixel149" y="0.08376"/>
+      <location name="pixel150" y="0.08785"/>
+      <location name="pixel151" y="0.09193"/>
+      <location name="pixel152" y="0.09602"/>
+      <location name="pixel153" y="0.10011"/>
+      <location name="pixel154" y="0.10419"/>
+      <location name="pixel155" y="0.10828"/>
+      <location name="pixel156" y="0.11236"/>
+      <location name="pixel157" y="0.11645"/>
+      <location name="pixel158" y="0.12054"/>
+      <location name="pixel159" y="0.12462"/>
+      <location name="pixel160" y="0.12871"/>
+      <location name="pixel161" y="0.13279"/>
+      <location name="pixel162" y="0.13688"/>
+      <location name="pixel163" y="0.14096"/>
+      <location name="pixel164" y="0.14505"/>
+      <location name="pixel165" y="0.14914"/>
+      <location name="pixel166" y="0.15322"/>
+      <location name="pixel167" y="0.15731"/>
+      <location name="pixel168" y="0.16139"/>
+      <location name="pixel169" y="0.16548"/>
+      <location name="pixel170" y="0.16957"/>
+      <location name="pixel171" y="0.17365"/>
+      <location name="pixel172" y="0.17774"/>
+      <location name="pixel173" y="0.18182"/>
+      <location name="pixel174" y="0.18591"/>
+      <location name="pixel175" y="0.19000"/>
+      <location name="pixel176" y="0.19408"/>
+      <location name="pixel177" y="0.19817"/>
+      <location name="pixel178" y="0.20225"/>
+      <location name="pixel179" y="0.20634"/>
+      <location name="pixel180" y="0.21043"/>
+      <location name="pixel181" y="0.21451"/>
+      <location name="pixel182" y="0.21860"/>
+      <location name="pixel183" y="0.22268"/>
+      <location name="pixel184" y="0.22677"/>
+      <location name="pixel185" y="0.23086"/>
+      <location name="pixel186" y="0.23494"/>
+      <location name="pixel187" y="0.23903"/>
+      <location name="pixel188" y="0.24311"/>
+      <location name="pixel189" y="0.24720"/>
+      <location name="pixel190" y="0.25129"/>
+      <location name="pixel191" y="0.25537"/>
+      <location name="pixel192" y="0.25946"/>
+      <location name="pixel193" y="0.26354"/>
+      <location name="pixel194" y="0.26763"/>
+      <location name="pixel195" y="0.27171"/>
+      <location name="pixel196" y="0.27580"/>
+      <location name="pixel197" y="0.27989"/>
+      <location name="pixel198" y="0.28397"/>
+      <location name="pixel199" y="0.28806"/>
+      <location name="pixel200" y="0.29214"/>
+      <location name="pixel201" y="0.29623"/>
+      <location name="pixel202" y="0.30032"/>
+      <location name="pixel203" y="0.30440"/>
+      <location name="pixel204" y="0.30849"/>
+      <location name="pixel205" y="0.31257"/>
+      <location name="pixel206" y="0.31666"/>
+      <location name="pixel207" y="0.32075"/>
+      <location name="pixel208" y="0.32483"/>
+      <location name="pixel209" y="0.32892"/>
+      <location name="pixel210" y="0.33300"/>
+      <location name="pixel211" y="0.33709"/>
+      <location name="pixel212" y="0.34118"/>
+      <location name="pixel213" y="0.34526"/>
+      <location name="pixel214" y="0.34935"/>
+      <location name="pixel215" y="0.35343"/>
+      <location name="pixel216" y="0.35752"/>
+      <location name="pixel217" y="0.36161"/>
+      <location name="pixel218" y="0.36569"/>
+      <location name="pixel219" y="0.36978"/>
+      <location name="pixel220" y="0.37386"/>
+      <location name="pixel221" y="0.37795"/>
+      <location name="pixel222" y="0.38204"/>
+      <location name="pixel223" y="0.38612"/>
+      <location name="pixel224" y="0.39021"/>
+      <location name="pixel225" y="0.39429"/>
+      <location name="pixel226" y="0.39838"/>
+      <location name="pixel227" y="0.40246"/>
+      <location name="pixel228" y="0.40655"/>
+      <location name="pixel229" y="0.41064"/>
+      <location name="pixel230" y="0.41472"/>
+      <location name="pixel231" y="0.41881"/>
+      <location name="pixel232" y="0.42289"/>
+      <location name="pixel233" y="0.42698"/>
+      <location name="pixel234" y="0.43107"/>
+      <location name="pixel235" y="0.43515"/>
+      <location name="pixel236" y="0.43924"/>
+      <location name="pixel237" y="0.44332"/>
+      <location name="pixel238" y="0.44741"/>
+      <location name="pixel239" y="0.45150"/>
+      <location name="pixel240" y="0.45558"/>
+      <location name="pixel241" y="0.45967"/>
+      <location name="pixel242" y="0.46375"/>
+      <location name="pixel243" y="0.46784"/>
+      <location name="pixel244" y="0.47193"/>
+      <location name="pixel245" y="0.47601"/>
+      <location name="pixel246" y="0.48010"/>
+      <location name="pixel247" y="0.48418"/>
+      <location name="pixel248" y="0.48827"/>
+      <location name="pixel249" y="0.49236"/>
+      <location name="pixel250" y="0.49644"/>
+      <location name="pixel251" y="0.50053"/>
+      <location name="pixel252" y="0.50461"/>
+      <location name="pixel253" y="0.50870"/>
+      <location name="pixel254" y="0.51279"/>
+      <location name="pixel255" y="0.51687"/>
+      <location name="pixel256" y="0.52096"/>
+    </component>
+  </type>
+  <!---->
+  <!--TYPE: FOUR-PACK-->
+  <!---->
+  <type name="fourpack">
+    <properties/>
+    <component type="tube">
+      <location name="tube1" x="0.01688"/>
+      <location name="tube2" x="0.00563"/>
+      <location name="tube3" x="-0.00563"/>
+      <location name="tube4" x="-0.01688"/>
+    </component>
+  </type>
+  <!---->
+  <!--COMPONENT, TYPE, and IDLIST: MONITORS-->
+  <!---->
+  <component type="monitors" idlist="monitors">
+    <location/>
+  </component>
+  <type name="monitors">
+    <component type="monitor">
+      <location z="-10.5" name="monitor1"/>
+      <location z="-10.5" name="timer"/>
+    </component>
+  </type>
+  <idlist idname="monitors">
+    <id val="-1"/>
+    <id val="-2"/>
+  </idlist>
+  <type name="monitor" is="monitor">
+    <cylinder id="cyl-approx">
+      <centre-of-bottom-base p="0.0" r="0.0" t="0.0"/>
+      <axis x="0.0" y="0.0" z="1.0"/>
+      <radius val="0.01"/>
+      <height val="0.1"/>
+    </cylinder>
+    <algebra val="cyl-approx"/>
+  </type>
+  <!---->
+  <!--TYPE: FLAT PANEL-->
+  <!---->
+  <type name="front-panel">
+    <properties/>
+    <component type="fourpack">
+      <location name="bank1" x="0.51760"/>
+      <location name="bank2" x="0.47259"/>
+      <location name="bank3" x="0.42758"/>
+      <location name="bank4" x="0.38257"/>
+      <location name="bank5" x="0.33757"/>
+      <location name="bank6" x="0.29256"/>
+      <location name="bank7" x="0.24755"/>
+      <location name="bank8" x="0.20254"/>
+      <location name="bank9" x="0.15753"/>
+      <location name="bank10" x="0.11252"/>
+      <location name="bank11" x="0.06751"/>
+      <location name="bank12" x="0.02250"/>
+      <location name="bank13" x="-0.02250"/>
+      <location name="bank14" x="-0.06751"/>
+      <location name="bank15" x="-0.11252"/>
+      <location name="bank16" x="-0.15753"/>
+      <location name="bank17" x="-0.20254"/>
+      <location name="bank18" x="-0.24755"/>
+      <location name="bank19" x="-0.29256"/>
+      <location name="bank20" x="-0.33757"/>
+      <location name="bank21" x="-0.38257"/>
+      <location name="bank22" x="-0.42758"/>
+      <location name="bank23" x="-0.47259"/>
+      <location name="bank24" x="-0.51760"/>
+    </component>
+  </type>
+  <!---->
+  <!--TYPE: FLAT PANEL-->
+  <!---->
+  <type name="back-panel">
+    <properties/>
+    <component type="fourpack">
+      <location name="bank25" x="0.51760"/>
+      <location name="bank26" x="0.47259"/>
+      <location name="bank27" x="0.42758"/>
+      <location name="bank28" x="0.38257"/>
+      <location name="bank29" x="0.33757"/>
+      <location name="bank30" x="0.29256"/>
+      <location name="bank31" x="0.24755"/>
+      <location name="bank32" x="0.20254"/>
+      <location name="bank33" x="0.15753"/>
+      <location name="bank34" x="0.11252"/>
+      <location name="bank35" x="0.06751"/>
+      <location name="bank36" x="0.02250"/>
+      <location name="bank37" x="-0.02250"/>
+      <location name="bank38" x="-0.06751"/>
+      <location name="bank39" x="-0.11252"/>
+      <location name="bank40" x="-0.15753"/>
+      <location name="bank41" x="-0.20254"/>
+      <location name="bank42" x="-0.24755"/>
+      <location name="bank43" x="-0.29256"/>
+      <location name="bank44" x="-0.33757"/>
+      <location name="bank45" x="-0.38257"/>
+      <location name="bank46" x="-0.42758"/>
+      <location name="bank47" x="-0.47259"/>
+      <location name="bank48" x="-0.51760"/>
+    </component>
+  </type>
+  <!---->
+  <!--TYPE: DOUBLE FLAT PANEL-->
+  <!---->
+  <type name="double-flat-panel">
+    <properties/>
+    <component type="front-panel">
+      <location x="0.0027551507" y="0.0" z="-0.004102608"/>
+    </component>
+    <component type="back-panel">
+      <location x="-0.0027551507" y="0.0" z="0.004102608"/>
+    </component>
+  </type>
+  <!---->
+  <!--COMPONENT: DOUBLE FLAT PANEL-->
+  <!---->
+  <component type="double-flat-panel" idlist="flat_panel_ids" name="detector1">
+    <location>
+      <parameter name="x">
+        <logfile id="detector_trans_Readback" eq="-0.001*value"/>
       </parameter>
-		</location>
-	</component>
-	
-	<!-- Detector: -->
-	<type name="detector1" is="rectangular_detector" type="pixel_rectangular" xpixels="192"
-		xstart="0.52525" xstep="-0.0055" ypixels="256" ystart="-0.54825" ystep="0.0043">
-		<properties />
-	</type>
-	
-	<!-- Pixel for Detectors: 5.5x4 mm -->
-	<type is="detector" name="pixel_rectangular">
-		<cuboid id="pixel-shape">
-			<left-front-bottom-point y="-0.002" x="-0.00275" z="0.0" />
-			<left-front-top-point y="0.002" x="-0.00275" z="0.0" />
-			<left-back-bottom-point y="-0.002" x="-0.00275" z="-0.0001" />
-			<right-front-bottom-point y="-0.002" x="0.00275" z="0.0" />
-		</cuboid>
-		<algebra val="pixel-shape" />
-	</type>
-	
-	<!-- ***************************************************************** -->
-	<!-- Wing Detector -->
-	
-	<!-- Detector list def -->
-	<idlist idname="wing_detector_ids">
-		<id start="49155" end="90114" />
-	</idlist>
-	
-	<component type="wing_detector_arm" idlist="wing_detector_ids">
-		<location />
-	</component>
-	
-	<!-- Detector Banks -->
-	<type name="wing_detector_arm">
-		<component type="wing_detector">
-			<location>
-				<parameter name="r-position">
-					<value val="0"/>
-				</parameter>
-				<parameter name="t-position">
-					<logfile id="rotangle"  eq="0.0+value"/>
-				</parameter>
-				<parameter name="p-position">
-					<value val="0"/>
-				</parameter>
-				<parameter name="rotx">
-					<value val="0"/>
-				</parameter>
-				<parameter name="roty">
-					<logfile id="rotangle"  eq="0.0+value"/>
-				</parameter>
-				<parameter name="rotz">
-					<value val="0"/>
-				</parameter>
-			</location>
-		</component>
-	</type>
-	
-	<type name="wing_detector">
-		<component type="wing_tube">
-			
-			<location r="1.13" t="-0.0" name="wing_tube_0" />
-			<location r="1.13" t="-0.278873538391" name="wing_tube_1" />
-			<location r="1.13" t="-0.557747076782" name="wing_tube_2" />
-			<location r="1.13" t="-0.836620615172" name="wing_tube_3" />
-			<location r="1.13" t="-1.11549415356" name="wing_tube_4" />
-			<location r="1.13" t="-1.39436769195" name="wing_tube_5" />
-			<location r="1.13" t="-1.67324123034" name="wing_tube_6" />
-			<location r="1.13" t="-1.95211476874" name="wing_tube_7" />
-			<location r="1.13" t="-2.23098830713" name="wing_tube_8" />
-			<location r="1.13" t="-2.50986184552" name="wing_tube_9" />
-			<location r="1.13" t="-2.78873538391" name="wing_tube_10" />
-			<location r="1.13" t="-3.0676089223" name="wing_tube_11" />
-			<location r="1.13" t="-3.34648246069" name="wing_tube_12" />
-			<location r="1.13" t="-3.62535599908" name="wing_tube_13" />
-			<location r="1.13" t="-3.90422953747" name="wing_tube_14" />
-			<location r="1.13" t="-4.18310307586" name="wing_tube_15" />
-			<location r="1.13" t="-4.46197661425" name="wing_tube_16" />
-			<location r="1.13" t="-4.74085015264" name="wing_tube_17" />
-			<location r="1.13" t="-5.01972369103" name="wing_tube_18" />
-			<location r="1.13" t="-5.29859722943" name="wing_tube_19" />
-			<location r="1.13" t="-5.57747076782" name="wing_tube_20" />
-			<location r="1.13" t="-5.85634430621" name="wing_tube_21" />
-			<location r="1.13" t="-6.1352178446" name="wing_tube_22" />
-			<location r="1.13" t="-6.41409138299" name="wing_tube_23" />
-			<location r="1.13" t="-6.69296492138" name="wing_tube_24" />
-			<location r="1.13" t="-6.97183845977" name="wing_tube_25" />
-			<location r="1.13" t="-7.25071199816" name="wing_tube_26" />
-			<location r="1.13" t="-7.52958553655" name="wing_tube_27" />
-			<location r="1.13" t="-7.80845907494" name="wing_tube_28" />
-			<location r="1.13" t="-8.08733261333" name="wing_tube_29" />
-			<location r="1.13" t="-8.36620615172" name="wing_tube_30" />
-			<location r="1.13" t="-8.64507969012" name="wing_tube_31" />
-			<location r="1.13" t="-8.92395322851" name="wing_tube_32" />
-			<location r="1.13" t="-9.2028267669" name="wing_tube_33" />
-			<location r="1.13" t="-9.48170030529" name="wing_tube_34" />
-			<location r="1.13" t="-9.76057384368" name="wing_tube_35" />
-			<location r="1.13" t="-10.0394473821" name="wing_tube_36" />
-			<location r="1.13" t="-10.3183209205" name="wing_tube_37" />
-			<location r="1.13" t="-10.5971944589" name="wing_tube_38" />
-			<location r="1.13" t="-10.8760679972" name="wing_tube_39" />
-			<location r="1.13" t="-11.1549415356" name="wing_tube_40" />
-			<location r="1.13" t="-11.433815074" name="wing_tube_41" />
-			<location r="1.13" t="-11.7126886124" name="wing_tube_42" />
-			<location r="1.13" t="-11.9915621508" name="wing_tube_43" />
-			<location r="1.13" t="-12.2704356892" name="wing_tube_44" />
-			<location r="1.13" t="-12.5493092276" name="wing_tube_45" />
-			<location r="1.13" t="-12.828182766" name="wing_tube_46" />
-			<location r="1.13" t="-13.1070563044" name="wing_tube_47" />
-			<location r="1.13" t="-13.3859298428" name="wing_tube_48" />
-			<location r="1.13" t="-13.6648033812" name="wing_tube_49" />
-			<location r="1.13" t="-13.9436769195" name="wing_tube_50" />
-			<location r="1.13" t="-14.2225504579" name="wing_tube_51" />
-			<location r="1.13" t="-14.5014239963" name="wing_tube_52" />
-			<location r="1.13" t="-14.7802975347" name="wing_tube_53" />
-			<location r="1.13" t="-15.0591710731" name="wing_tube_54" />
-			<location r="1.13" t="-15.3380446115" name="wing_tube_55" />
-			<location r="1.13" t="-15.6169181499" name="wing_tube_56" />
-			<location r="1.13" t="-15.8957916883" name="wing_tube_57" />
-			<location r="1.13" t="-16.1746652267" name="wing_tube_58" />
-			<location r="1.13" t="-16.4535387651" name="wing_tube_59" />
-			<location r="1.13" t="-16.7324123034" name="wing_tube_60" />
-			<location r="1.13" t="-17.0112858418" name="wing_tube_61" />
-			<location r="1.13" t="-17.2901593802" name="wing_tube_62" />
-			<location r="1.13" t="-17.5690329186" name="wing_tube_63" />
-			<location r="1.13" t="-17.847906457" name="wing_tube_64" />
-			<location r="1.13" t="-18.1267799954" name="wing_tube_65" />
-			<location r="1.13" t="-18.4056535338" name="wing_tube_66" />
-			<location r="1.13" t="-18.6845270722" name="wing_tube_67" />
-			<location r="1.13" t="-18.9634006106" name="wing_tube_68" />
-			<location r="1.13" t="-19.242274149" name="wing_tube_69" />
-			<location r="1.13" t="-19.5211476874" name="wing_tube_70" />
-			<location r="1.13" t="-19.8000212257" name="wing_tube_71" />
-			<location r="1.13" t="-20.0788947641" name="wing_tube_72" />
-			<location r="1.13" t="-20.3577683025" name="wing_tube_73" />
-			<location r="1.13" t="-20.6366418409" name="wing_tube_74" />
-			<location r="1.13" t="-20.9155153793" name="wing_tube_75" />
-			<location r="1.13" t="-21.1943889177" name="wing_tube_76" />
-			<location r="1.13" t="-21.4732624561" name="wing_tube_77" />
-			<location r="1.13" t="-21.7521359945" name="wing_tube_78" />
-			<location r="1.13" t="-22.0310095329" name="wing_tube_79" />
-			<location r="1.13" t="-22.3098830713" name="wing_tube_80" />
-			<location r="1.13" t="-22.5887566097" name="wing_tube_81" />
-			<location r="1.13" t="-22.867630148" name="wing_tube_82" />
-			<location r="1.13" t="-23.1465036864" name="wing_tube_83" />
-			<location r="1.13" t="-23.4253772248" name="wing_tube_84" />
-			<location r="1.13" t="-23.7042507632" name="wing_tube_85" />
-			<location r="1.13" t="-23.9831243016" name="wing_tube_86" />
-			<location r="1.13" t="-24.26199784" name="wing_tube_87" />
-			<location r="1.13" t="-24.5408713784" name="wing_tube_88" />
-			<location r="1.13" t="-24.8197449168" name="wing_tube_89" />
-			<location r="1.13" t="-25.0986184552" name="wing_tube_90" />
-			<location r="1.13" t="-25.3774919936" name="wing_tube_91" />
-			<location r="1.13" t="-25.656365532" name="wing_tube_92" />
-			<location r="1.13" t="-25.9352390703" name="wing_tube_93" />
-			<location r="1.13" t="-26.2141126087" name="wing_tube_94" />
-			<location r="1.13" t="-26.4929861471" name="wing_tube_95" />
-			<location r="1.13" t="-26.7718596855" name="wing_tube_96" />
-			<location r="1.13" t="-27.0507332239" name="wing_tube_97" />
-			<location r="1.13" t="-27.3296067623" name="wing_tube_98" />
-			<location r="1.13" t="-27.6084803007" name="wing_tube_99" />
-			<location r="1.13" t="-27.8873538391" name="wing_tube_100" />
-			<location r="1.13" t="-28.1662273775" name="wing_tube_101" />
-			<location r="1.13" t="-28.4451009159" name="wing_tube_102" />
-			<location r="1.13" t="-28.7239744543" name="wing_tube_103" />
-			<location r="1.13" t="-29.0028479926" name="wing_tube_104" />
-			<location r="1.13" t="-29.281721531" name="wing_tube_105" />
-			<location r="1.13" t="-29.5605950694" name="wing_tube_106" />
-			<location r="1.13" t="-29.8394686078" name="wing_tube_107" />
-			<location r="1.13" t="-30.1183421462" name="wing_tube_108" />
-			<location r="1.13" t="-30.3972156846" name="wing_tube_109" />
-			<location r="1.13" t="-30.676089223" name="wing_tube_110" />
-			<location r="1.13" t="-30.9549627614" name="wing_tube_111" />
-			<location r="1.13" t="-31.2338362998" name="wing_tube_112" />
-			<location r="1.13" t="-31.5127098382" name="wing_tube_113" />
-			<location r="1.13" t="-31.7915833766" name="wing_tube_114" />
-			<location r="1.13" t="-32.0704569149" name="wing_tube_115" />
-			<location r="1.13" t="-32.3493304533" name="wing_tube_116" />
-			<location r="1.13" t="-32.6282039917" name="wing_tube_117" />
-			<location r="1.13" t="-32.9070775301" name="wing_tube_118" />
-			<location r="1.13" t="-33.1859510685" name="wing_tube_119" />
-			<location r="1.13" t="-33.4648246069" name="wing_tube_120" />
-			<location r="1.13" t="-33.7436981453" name="wing_tube_121" />
-			<location r="1.13" t="-34.0225716837" name="wing_tube_122" />
-			<location r="1.13" t="-34.3014452221" name="wing_tube_123" />
-			<location r="1.13" t="-34.5803187605" name="wing_tube_124" />
-			<location r="1.13" t="-34.8591922989" name="wing_tube_125" />
-			<location r="1.13" t="-35.1380658372" name="wing_tube_126" />
-			<location r="1.13" t="-35.4169393756" name="wing_tube_127" />
-			<location r="1.13" t="-35.695812914" name="wing_tube_128" />
-			<location r="1.13" t="-35.9746864524" name="wing_tube_129" />
-			<location r="1.13" t="-36.2535599908" name="wing_tube_130" />
-			<location r="1.13" t="-36.5324335292" name="wing_tube_131" />
-			<location r="1.13" t="-36.8113070676" name="wing_tube_132" />
-			<location r="1.13" t="-37.090180606" name="wing_tube_133" />
-			<location r="1.13" t="-37.3690541444" name="wing_tube_134" />
-			<location r="1.13" t="-37.6479276828" name="wing_tube_135" />
-			<location r="1.13" t="-37.9268012212" name="wing_tube_136" />
-			<location r="1.13" t="-38.2056747595" name="wing_tube_137" />
-			<location r="1.13" t="-38.4845482979" name="wing_tube_138" />
-			<location r="1.13" t="-38.7634218363" name="wing_tube_139" />
-			<location r="1.13" t="-39.0422953747" name="wing_tube_140" />
-			<location r="1.13" t="-39.3211689131" name="wing_tube_141" />
-			<location r="1.13" t="-39.6000424515" name="wing_tube_142" />
-			<location r="1.13" t="-39.8789159899" name="wing_tube_143" />
-			<location r="1.13" t="-40.1577895283" name="wing_tube_144" />
-			<location r="1.13" t="-40.4366630667" name="wing_tube_145" />
-			<location r="1.13" t="-40.7155366051" name="wing_tube_146" />
-			<location r="1.13" t="-40.9944101435" name="wing_tube_147" />
-			<location r="1.13" t="-41.2732836818" name="wing_tube_148" />
-			<location r="1.13" t="-41.5521572202" name="wing_tube_149" />
-			<location r="1.13" t="-41.8310307586" name="wing_tube_150" />
-			<location r="1.13" t="-42.109904297" name="wing_tube_151" />
-			<location r="1.13" t="-42.3887778354" name="wing_tube_152" />
-			<location r="1.13" t="-42.6676513738" name="wing_tube_153" />
-			<location r="1.13" t="-42.9465249122" name="wing_tube_154" />
-			<location r="1.13" t="-43.2253984506" name="wing_tube_155" />
-			<location r="1.13" t="-43.504271989" name="wing_tube_156" />
-			<location r="1.13" t="-43.7831455274" name="wing_tube_157" />
-			<location r="1.13" t="-44.0620190658" name="wing_tube_158" />
-			<location r="1.13" t="-44.3408926041" name="wing_tube_159" />
-		</component>
-	</type>
-	
-	<type name="wing_tube" outline="yes">
-		<component type="wing_pixel">
-			
-			<location y="-0.54825" name="wing_pixel_0" />
-			<location y="-0.54395" name="wing_pixel_1" />
-			<location y="-0.53965" name="wing_pixel_2" />
-			<location y="-0.53535" name="wing_pixel_3" />
-			<location y="-0.53105" name="wing_pixel_4" />
-			<location y="-0.52675" name="wing_pixel_5" />
-			<location y="-0.52245" name="wing_pixel_6" />
-			<location y="-0.51815" name="wing_pixel_7" />
-			<location y="-0.51385" name="wing_pixel_8" />
-			<location y="-0.50955" name="wing_pixel_9" />
-			<location y="-0.50525" name="wing_pixel_10" />
-			<location y="-0.50095" name="wing_pixel_11" />
-			<location y="-0.49665" name="wing_pixel_12" />
-			<location y="-0.49235" name="wing_pixel_13" />
-			<location y="-0.48805" name="wing_pixel_14" />
-			<location y="-0.48375" name="wing_pixel_15" />
-			<location y="-0.47945" name="wing_pixel_16" />
-			<location y="-0.47515" name="wing_pixel_17" />
-			<location y="-0.47085" name="wing_pixel_18" />
-			<location y="-0.46655" name="wing_pixel_19" />
-			<location y="-0.46225" name="wing_pixel_20" />
-			<location y="-0.45795" name="wing_pixel_21" />
-			<location y="-0.45365" name="wing_pixel_22" />
-			<location y="-0.44935" name="wing_pixel_23" />
-			<location y="-0.44505" name="wing_pixel_24" />
-			<location y="-0.44075" name="wing_pixel_25" />
-			<location y="-0.43645" name="wing_pixel_26" />
-			<location y="-0.43215" name="wing_pixel_27" />
-			<location y="-0.42785" name="wing_pixel_28" />
-			<location y="-0.42355" name="wing_pixel_29" />
-			<location y="-0.41925" name="wing_pixel_30" />
-			<location y="-0.41495" name="wing_pixel_31" />
-			<location y="-0.41065" name="wing_pixel_32" />
-			<location y="-0.40635" name="wing_pixel_33" />
-			<location y="-0.40205" name="wing_pixel_34" />
-			<location y="-0.39775" name="wing_pixel_35" />
-			<location y="-0.39345" name="wing_pixel_36" />
-			<location y="-0.38915" name="wing_pixel_37" />
-			<location y="-0.38485" name="wing_pixel_38" />
-			<location y="-0.38055" name="wing_pixel_39" />
-			<location y="-0.37625" name="wing_pixel_40" />
-			<location y="-0.37195" name="wing_pixel_41" />
-			<location y="-0.36765" name="wing_pixel_42" />
-			<location y="-0.36335" name="wing_pixel_43" />
-			<location y="-0.35905" name="wing_pixel_44" />
-			<location y="-0.35475" name="wing_pixel_45" />
-			<location y="-0.35045" name="wing_pixel_46" />
-			<location y="-0.34615" name="wing_pixel_47" />
-			<location y="-0.34185" name="wing_pixel_48" />
-			<location y="-0.33755" name="wing_pixel_49" />
-			<location y="-0.33325" name="wing_pixel_50" />
-			<location y="-0.32895" name="wing_pixel_51" />
-			<location y="-0.32465" name="wing_pixel_52" />
-			<location y="-0.32035" name="wing_pixel_53" />
-			<location y="-0.31605" name="wing_pixel_54" />
-			<location y="-0.31175" name="wing_pixel_55" />
-			<location y="-0.30745" name="wing_pixel_56" />
-			<location y="-0.30315" name="wing_pixel_57" />
-			<location y="-0.29885" name="wing_pixel_58" />
-			<location y="-0.29455" name="wing_pixel_59" />
-			<location y="-0.29025" name="wing_pixel_60" />
-			<location y="-0.28595" name="wing_pixel_61" />
-			<location y="-0.28165" name="wing_pixel_62" />
-			<location y="-0.27735" name="wing_pixel_63" />
-			<location y="-0.27305" name="wing_pixel_64" />
-			<location y="-0.26875" name="wing_pixel_65" />
-			<location y="-0.26445" name="wing_pixel_66" />
-			<location y="-0.26015" name="wing_pixel_67" />
-			<location y="-0.25585" name="wing_pixel_68" />
-			<location y="-0.25155" name="wing_pixel_69" />
-			<location y="-0.24725" name="wing_pixel_70" />
-			<location y="-0.24295" name="wing_pixel_71" />
-			<location y="-0.23865" name="wing_pixel_72" />
-			<location y="-0.23435" name="wing_pixel_73" />
-			<location y="-0.23005" name="wing_pixel_74" />
-			<location y="-0.22575" name="wing_pixel_75" />
-			<location y="-0.22145" name="wing_pixel_76" />
-			<location y="-0.21715" name="wing_pixel_77" />
-			<location y="-0.21285" name="wing_pixel_78" />
-			<location y="-0.20855" name="wing_pixel_79" />
-			<location y="-0.20425" name="wing_pixel_80" />
-			<location y="-0.19995" name="wing_pixel_81" />
-			<location y="-0.19565" name="wing_pixel_82" />
-			<location y="-0.19135" name="wing_pixel_83" />
-			<location y="-0.18705" name="wing_pixel_84" />
-			<location y="-0.18275" name="wing_pixel_85" />
-			<location y="-0.17845" name="wing_pixel_86" />
-			<location y="-0.17415" name="wing_pixel_87" />
-			<location y="-0.16985" name="wing_pixel_88" />
-			<location y="-0.16555" name="wing_pixel_89" />
-			<location y="-0.16125" name="wing_pixel_90" />
-			<location y="-0.15695" name="wing_pixel_91" />
-			<location y="-0.15265" name="wing_pixel_92" />
-			<location y="-0.14835" name="wing_pixel_93" />
-			<location y="-0.14405" name="wing_pixel_94" />
-			<location y="-0.13975" name="wing_pixel_95" />
-			<location y="-0.13545" name="wing_pixel_96" />
-			<location y="-0.13115" name="wing_pixel_97" />
-			<location y="-0.12685" name="wing_pixel_98" />
-			<location y="-0.12255" name="wing_pixel_99" />
-			<location y="-0.11825" name="wing_pixel_100" />
-			<location y="-0.11395" name="wing_pixel_101" />
-			<location y="-0.10965" name="wing_pixel_102" />
-			<location y="-0.10535" name="wing_pixel_103" />
-			<location y="-0.10105" name="wing_pixel_104" />
-			<location y="-0.09675" name="wing_pixel_105" />
-			<location y="-0.09245" name="wing_pixel_106" />
-			<location y="-0.08815" name="wing_pixel_107" />
-			<location y="-0.08385" name="wing_pixel_108" />
-			<location y="-0.07955" name="wing_pixel_109" />
-			<location y="-0.07525" name="wing_pixel_110" />
-			<location y="-0.07095" name="wing_pixel_111" />
-			<location y="-0.06665" name="wing_pixel_112" />
-			<location y="-0.06235" name="wing_pixel_113" />
-			<location y="-0.05805" name="wing_pixel_114" />
-			<location y="-0.05375" name="wing_pixel_115" />
-			<location y="-0.04945" name="wing_pixel_116" />
-			<location y="-0.04515" name="wing_pixel_117" />
-			<location y="-0.04085" name="wing_pixel_118" />
-			<location y="-0.03655" name="wing_pixel_119" />
-			<location y="-0.03225" name="wing_pixel_120" />
-			<location y="-0.02795" name="wing_pixel_121" />
-			<location y="-0.02365" name="wing_pixel_122" />
-			<location y="-0.01935" name="wing_pixel_123" />
-			<location y="-0.01505" name="wing_pixel_124" />
-			<location y="-0.01075" name="wing_pixel_125" />
-			<location y="-0.00645" name="wing_pixel_126" />
-			<location y="-0.00215" name="wing_pixel_127" />
-			<location y="0.00215" name="wing_pixel_128" />
-			<location y="0.00645" name="wing_pixel_129" />
-			<location y="0.01075" name="wing_pixel_130" />
-			<location y="0.01505" name="wing_pixel_131" />
-			<location y="0.01935" name="wing_pixel_132" />
-			<location y="0.02365" name="wing_pixel_133" />
-			<location y="0.02795" name="wing_pixel_134" />
-			<location y="0.03225" name="wing_pixel_135" />
-			<location y="0.03655" name="wing_pixel_136" />
-			<location y="0.04085" name="wing_pixel_137" />
-			<location y="0.04515" name="wing_pixel_138" />
-			<location y="0.04945" name="wing_pixel_139" />
-			<location y="0.05375" name="wing_pixel_140" />
-			<location y="0.05805" name="wing_pixel_141" />
-			<location y="0.06235" name="wing_pixel_142" />
-			<location y="0.06665" name="wing_pixel_143" />
-			<location y="0.07095" name="wing_pixel_144" />
-			<location y="0.07525" name="wing_pixel_145" />
-			<location y="0.07955" name="wing_pixel_146" />
-			<location y="0.08385" name="wing_pixel_147" />
-			<location y="0.08815" name="wing_pixel_148" />
-			<location y="0.09245" name="wing_pixel_149" />
-			<location y="0.09675" name="wing_pixel_150" />
-			<location y="0.10105" name="wing_pixel_151" />
-			<location y="0.10535" name="wing_pixel_152" />
-			<location y="0.10965" name="wing_pixel_153" />
-			<location y="0.11395" name="wing_pixel_154" />
-			<location y="0.11825" name="wing_pixel_155" />
-			<location y="0.12255" name="wing_pixel_156" />
-			<location y="0.12685" name="wing_pixel_157" />
-			<location y="0.13115" name="wing_pixel_158" />
-			<location y="0.13545" name="wing_pixel_159" />
-			<location y="0.13975" name="wing_pixel_160" />
-			<location y="0.14405" name="wing_pixel_161" />
-			<location y="0.14835" name="wing_pixel_162" />
-			<location y="0.15265" name="wing_pixel_163" />
-			<location y="0.15695" name="wing_pixel_164" />
-			<location y="0.16125" name="wing_pixel_165" />
-			<location y="0.16555" name="wing_pixel_166" />
-			<location y="0.16985" name="wing_pixel_167" />
-			<location y="0.17415" name="wing_pixel_168" />
-			<location y="0.17845" name="wing_pixel_169" />
-			<location y="0.18275" name="wing_pixel_170" />
-			<location y="0.18705" name="wing_pixel_171" />
-			<location y="0.19135" name="wing_pixel_172" />
-			<location y="0.19565" name="wing_pixel_173" />
-			<location y="0.19995" name="wing_pixel_174" />
-			<location y="0.20425" name="wing_pixel_175" />
-			<location y="0.20855" name="wing_pixel_176" />
-			<location y="0.21285" name="wing_pixel_177" />
-			<location y="0.21715" name="wing_pixel_178" />
-			<location y="0.22145" name="wing_pixel_179" />
-			<location y="0.22575" name="wing_pixel_180" />
-			<location y="0.23005" name="wing_pixel_181" />
-			<location y="0.23435" name="wing_pixel_182" />
-			<location y="0.23865" name="wing_pixel_183" />
-			<location y="0.24295" name="wing_pixel_184" />
-			<location y="0.24725" name="wing_pixel_185" />
-			<location y="0.25155" name="wing_pixel_186" />
-			<location y="0.25585" name="wing_pixel_187" />
-			<location y="0.26015" name="wing_pixel_188" />
-			<location y="0.26445" name="wing_pixel_189" />
-			<location y="0.26875" name="wing_pixel_190" />
-			<location y="0.27305" name="wing_pixel_191" />
-			<location y="0.27735" name="wing_pixel_192" />
-			<location y="0.28165" name="wing_pixel_193" />
-			<location y="0.28595" name="wing_pixel_194" />
-			<location y="0.29025" name="wing_pixel_195" />
-			<location y="0.29455" name="wing_pixel_196" />
-			<location y="0.29885" name="wing_pixel_197" />
-			<location y="0.30315" name="wing_pixel_198" />
-			<location y="0.30745" name="wing_pixel_199" />
-			<location y="0.31175" name="wing_pixel_200" />
-			<location y="0.31605" name="wing_pixel_201" />
-			<location y="0.32035" name="wing_pixel_202" />
-			<location y="0.32465" name="wing_pixel_203" />
-			<location y="0.32895" name="wing_pixel_204" />
-			<location y="0.33325" name="wing_pixel_205" />
-			<location y="0.33755" name="wing_pixel_206" />
-			<location y="0.34185" name="wing_pixel_207" />
-			<location y="0.34615" name="wing_pixel_208" />
-			<location y="0.35045" name="wing_pixel_209" />
-			<location y="0.35475" name="wing_pixel_210" />
-			<location y="0.35905" name="wing_pixel_211" />
-			<location y="0.36335" name="wing_pixel_212" />
-			<location y="0.36765" name="wing_pixel_213" />
-			<location y="0.37195" name="wing_pixel_214" />
-			<location y="0.37625" name="wing_pixel_215" />
-			<location y="0.38055" name="wing_pixel_216" />
-			<location y="0.38485" name="wing_pixel_217" />
-			<location y="0.38915" name="wing_pixel_218" />
-			<location y="0.39345" name="wing_pixel_219" />
-			<location y="0.39775" name="wing_pixel_220" />
-			<location y="0.40205" name="wing_pixel_221" />
-			<location y="0.40635" name="wing_pixel_222" />
-			<location y="0.41065" name="wing_pixel_223" />
-			<location y="0.41495" name="wing_pixel_224" />
-			<location y="0.41925" name="wing_pixel_225" />
-			<location y="0.42355" name="wing_pixel_226" />
-			<location y="0.42785" name="wing_pixel_227" />
-			<location y="0.43215" name="wing_pixel_228" />
-			<location y="0.43645" name="wing_pixel_229" />
-			<location y="0.44075" name="wing_pixel_230" />
-			<location y="0.44505" name="wing_pixel_231" />
-			<location y="0.44935" name="wing_pixel_232" />
-			<location y="0.45365" name="wing_pixel_233" />
-			<location y="0.45795" name="wing_pixel_234" />
-			<location y="0.46225" name="wing_pixel_235" />
-			<location y="0.46655" name="wing_pixel_236" />
-			<location y="0.47085" name="wing_pixel_237" />
-			<location y="0.47515" name="wing_pixel_238" />
-			<location y="0.47945" name="wing_pixel_239" />
-			<location y="0.48375" name="wing_pixel_240" />
-			<location y="0.48805" name="wing_pixel_241" />
-			<location y="0.49235" name="wing_pixel_242" />
-			<location y="0.49665" name="wing_pixel_243" />
-			<location y="0.50095" name="wing_pixel_244" />
-			<location y="0.50525" name="wing_pixel_245" />
-			<location y="0.50955" name="wing_pixel_246" />
-			<location y="0.51385" name="wing_pixel_247" />
-			<location y="0.51815" name="wing_pixel_248" />
-			<location y="0.52245" name="wing_pixel_249" />
-			<location y="0.52675" name="wing_pixel_250" />
-			<location y="0.53105" name="wing_pixel_251" />
-			<location y="0.53535" name="wing_pixel_252" />
-			<location y="0.53965" name="wing_pixel_253" />
-			<location y="0.54395" name="wing_pixel_254" />
-			<location y="0.54825" name="wing_pixel_255" />
-		</component>
-	</type>
-	
-	<type name="wing_pixel" is="detector">
-		<cylinder id="cyl-approx">
-			<centre-of-bottom-base p="0.0" r="0.0" t="0.0"/>
-			<axis y="1.0" x="0.0" z="0.0"/>
-			<radius val="0.00275"/>
-			<height val="0.0043"/>
-		</cylinder>
-		<algebra val="cyl-approx"/>
-	</type>
-	
+      <parameter name="z">
+        <logfile id="sample_detector_distance" eq="value"/>
+      </parameter>
+    </location>
+  </component>
+  <!---->
+  <!--LIST OF PIXEL IDs in DETECTOR-->
+  <!---->
+  <idlist idname="flat_panel_ids">
+    <id start="0" end="1023"/>
+    <id start="2048" end="3071"/>
+    <id start="4096" end="5119"/>
+    <id start="6144" end="7167"/>
+    <id start="8192" end="9215"/>
+    <id start="10240" end="11263"/>
+    <id start="12288" end="13311"/>
+    <id start="14336" end="15359"/>
+    <id start="16384" end="17407"/>
+    <id start="18432" end="19455"/>
+    <id start="20480" end="21503"/>
+    <id start="22528" end="23551"/>
+    <id start="24576" end="25599"/>
+    <id start="26624" end="27647"/>
+    <id start="28672" end="29695"/>
+    <id start="30720" end="31743"/>
+    <id start="32768" end="33791"/>
+    <id start="34816" end="35839"/>
+    <id start="36864" end="37887"/>
+    <id start="38912" end="39935"/>
+    <id start="40960" end="41983"/>
+    <id start="43008" end="44031"/>
+    <id start="45056" end="46079"/>
+    <id start="47104" end="48127"/>
+    <id start="1024" end="2047"/>
+    <id start="3072" end="4095"/>
+    <id start="5120" end="6143"/>
+    <id start="7168" end="8191"/>
+    <id start="9216" end="10239"/>
+    <id start="11264" end="12287"/>
+    <id start="13312" end="14335"/>
+    <id start="15360" end="16383"/>
+    <id start="17408" end="18431"/>
+    <id start="19456" end="20479"/>
+    <id start="21504" end="22527"/>
+    <id start="23552" end="24575"/>
+    <id start="25600" end="26623"/>
+    <id start="27648" end="28671"/>
+    <id start="29696" end="30719"/>
+    <id start="31744" end="32767"/>
+    <id start="33792" end="34815"/>
+    <id start="35840" end="36863"/>
+    <id start="37888" end="38911"/>
+    <id start="39936" end="40959"/>
+    <id start="41984" end="43007"/>
+    <id start="44032" end="45055"/>
+    <id start="46080" end="47103"/>
+    <id start="48128" end="49151"/>
+  </idlist>
+  <!---->
+  <!--TYPE: CURVED PANEL-->
+  <!---->
+  <type name="front-wing-panel">
+    <properties/>
+    <component type="fourpack">
+      <location name="bank49" x="0.40963" y="0.00000" z="1.04824" rot="21.34465" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank50" x="0.36850" y="0.00000" z="1.06340" rot="19.11255" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank51" x="0.32680" y="0.00000" z="1.07694" rot="16.88046" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank52" x="0.28461" y="0.00000" z="1.08885" rot="14.64837" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank53" x="0.24198" y="0.00000" z="1.09911" rot="12.41627" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank54" x="0.19899" y="0.00000" z="1.10770" rot="10.18418" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank55" x="0.15570" y="0.00000" z="1.11461" rot="7.95208" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank56" x="0.11217" y="0.00000" z="1.11983" rot="5.71999" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank57" x="0.06847" y="0.00000" z="1.12335" rot="3.48790" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank58" x="0.02467" y="0.00000" z="1.12517" rot="1.25580" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank59" x="-0.01918" y="0.00000" z="1.12527" rot="-0.97629" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank60" x="-0.06299" y="0.00000" z="1.12367" rot="-3.20839" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank61" x="-0.10670" y="0.00000" z="1.12037" rot="-5.44048" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank62" x="-0.15026" y="0.00000" z="1.11536" rot="-7.67257" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank63" x="-0.19359" y="0.00000" z="1.10866" rot="-9.90467" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank64" x="-0.23662" y="0.00000" z="1.10028" rot="-12.13676" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank65" x="-0.27929" y="0.00000" z="1.09023" rot="-14.36886" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank66" x="-0.32154" y="0.00000" z="1.07852" rot="-16.60095" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank67" x="-0.36330" y="0.00000" z="1.06518" rot="-18.83304" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank68" x="-0.40451" y="0.00000" z="1.05023" rot="-21.06514" axis-x="0" axis-y="1" axis-z="0"/>
+    </component>
+  </type>
+  <!---->
+  <!--TYPE: CURVED PANEL-->
+  <!---->
+  <type name="back-wing-panel">
+    <properties/>
+    <component type="fourpack">
+      <location name="bank69" x="0.40746" y="0.00000" z="1.05788" rot="21.06514" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank70" x="0.36595" y="0.00000" z="1.07295" rot="18.83304" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank71" x="0.32389" y="0.00000" z="1.08639" rot="16.60095" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank72" x="0.28133" y="0.00000" z="1.09818" rot="14.36886" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank73" x="0.23834" y="0.00000" z="1.10830" rot="12.13676" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank74" x="0.19500" y="0.00000" z="1.11674" rot="9.90467" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank75" x="0.15135" y="0.00000" z="1.12349" rot="7.67257" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank76" x="0.10748" y="0.00000" z="1.12853" rot="5.44048" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank77" x="0.06345" y="0.00000" z="1.13186" rot="3.20839" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank78" x="0.01932" y="0.00000" z="1.13348" rot="0.97629" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank79" x="-0.02485" y="0.00000" z="1.13337" rot="-1.25580" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank80" x="-0.06897" y="0.00000" z="1.13154" rot="-3.48790" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank81" x="-0.11299" y="0.00000" z="1.12800" rot="-5.71999" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank82" x="-0.15683" y="0.00000" z="1.12274" rot="-7.95208" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank83" x="-0.20044" y="0.00000" z="1.11578" rot="-10.18418" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank84" x="-0.24375" y="0.00000" z="1.10713" rot="-12.41627" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank85" x="-0.28668" y="0.00000" z="1.09679" rot="-14.64837" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank86" x="-0.32918" y="0.00000" z="1.08480" rot="-16.88046" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank87" x="-0.37118" y="0.00000" z="1.07115" rot="-19.11255" axis-x="0" axis-y="1" axis-z="0"/>
+      <location name="bank88" x="-0.41262" y="0.00000" z="1.05588" rot="-21.34465" axis-x="0" axis-y="1" axis-z="0"/>
+    </component>
+  </type>
+  <!---->
+  <!--TYPE: DOUBLE CURVED PANEL-->
+  <!--Panel is positioned 1.129538 meters downstream-->
+  <!---->
+  <type name="double-curved-panel">
+    <properties/>
+    <component type="front-wing-panel">
+      <location x="0.0" y="0.0" z="0.0"/>
+    </component>
+    <component type="back-wing-panel">
+      <location x="0.0" y="0.0" z="0.0"/>
+    </component>
+  </type>
+  <!---->
+  <!--COMPONENT: DOUBLE CURVED PANEL-->
+  <!---->
+  <component type="double-curved-panel" idlist="curved_panel_ids" name="wing_detector">
+    <location x="0.0" y="0.0" z="0">
+      <rot val="-22.18118506742357" axis-x="0" axis-y="1" axis-z="0"/>
+      <parameter name="t-position">
+        <logfile id="ww_rot_Readback" eq="-22.18118506742357-value"/>
+      </parameter>
+      <parameter name="roty">
+        <logfile id="ww_rot_Readback" eq="-22.18118506742357-value"/>
+      </parameter>
+    </location>
+  </component>
+  <!---->
+  <!--LIST OF PIXEL IDs in DETECTOR-->
+  <!---->
+  <idlist idname="curved_panel_ids">
+    <id start="49152" end="50175"/>
+    <id start="51200" end="52223"/>
+    <id start="53248" end="54271"/>
+    <id start="55296" end="56319"/>
+    <id start="57344" end="58367"/>
+    <id start="59392" end="60415"/>
+    <id start="61440" end="62463"/>
+    <id start="63488" end="64511"/>
+    <id start="65536" end="66559"/>
+    <id start="67584" end="68607"/>
+    <id start="69632" end="70655"/>
+    <id start="71680" end="72703"/>
+    <id start="73728" end="74751"/>
+    <id start="75776" end="76799"/>
+    <id start="77824" end="78847"/>
+    <id start="79872" end="80895"/>
+    <id start="81920" end="82943"/>
+    <id start="83968" end="84991"/>
+    <id start="86016" end="87039"/>
+    <id start="88064" end="89087"/>
+    <id start="50176" end="51199"/>
+    <id start="52224" end="53247"/>
+    <id start="54272" end="55295"/>
+    <id start="56320" end="57343"/>
+    <id start="58368" end="59391"/>
+    <id start="60416" end="61439"/>
+    <id start="62464" end="63487"/>
+    <id start="64512" end="65535"/>
+    <id start="66560" end="67583"/>
+    <id start="68608" end="69631"/>
+    <id start="70656" end="71679"/>
+    <id start="72704" end="73727"/>
+    <id start="74752" end="75775"/>
+    <id start="76800" end="77823"/>
+    <id start="78848" end="79871"/>
+    <id start="80896" end="81919"/>
+    <id start="82944" end="83967"/>
+    <id start="84992" end="86015"/>
+    <id start="87040" end="88063"/>
+    <id start="89088" end="90111"/>
+  </idlist>
 </instrument>
-
diff --git a/instrument/BIOSANS_Definition_2016_2019.xml b/instrument/BIOSANS_Definition_2016_2019.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5358864484c9f19a14a7245f9df33d29002ceea7
--- /dev/null
+++ b/instrument/BIOSANS_Definition_2016_2019.xml
@@ -0,0 +1,580 @@
+<?xml version='1.0' encoding='ASCII'?>
+<instrument xmlns="http://www.mantidproject.org/IDF/1.0"
+			xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+			xsi:schemaLocation="http://www.mantidproject.org/IDF/1.0 http://schema.mantidproject.org/IDF/1.0/IDFSchema.xsd"
+			name="BIOSANS"
+			valid-from="2016-04-22 00:00:00"
+			valid-to="2019-09-30 23:59:59"
+			last-modified="2018-12-06 17:45:00.000">
+	
+	<defaults>
+		<length unit="meter"/>
+		<angle unit="degree"/>
+		<reference-frame>
+			<along-beam axis="z"/>
+			<pointing-up axis="y"/>
+			<handedness val="right"/>
+		</reference-frame>
+	</defaults>
+	
+	<!--SOURCE AND SAMPLE POSITION-->
+	<component type="moderator">
+		<location z="-13.601"/>
+	</component>
+	<type name="moderator" is="Source"/>
+	
+	<component type="sample-position">
+		<location y="0.0" x="0.0" z="0.0"/>
+	</component>
+	<type name="sample-position" is="SamplePos"/>
+	
+	<!-- ***************************************************************** -->
+	<!--MONITOR 1 -->
+	<component type="monitors" idlist="monitor1">
+		<location/>
+	</component>
+	<type name="monitors">
+	    <component type="monitor">
+    		<location z="-10.5" name="monitor1"/>
+    	</component>
+	</type>
+	<idlist idname="monitor1">
+		<id val="1" />
+	</idlist>
+
+	<!--MONITOR 2 -->
+	<component type="timers" idlist="timer1">
+		<location/>
+	</component>
+	<type name="timers">
+	    <component type="monitor">
+    		<location z="-10.5" name="timer1"/>
+    	</component>
+	</type>
+	<idlist idname="timer1">
+		<id val="2" />
+	</idlist>
+
+	<!--MONITOR SHAPE-->
+	<!--FIXME: Do something real here.-->
+	<type is="monitor" name="monitor">
+		<cylinder id="cyl-approx">
+		<centre-of-bottom-base y="0.0" x="0.0" z="0.0"/>
+		<axis y="0.0" x="0.0" z="1.0"/>
+		<radius val="0.01"/>
+		<height val="0.03"/>
+		</cylinder>
+		<algebra val="cyl-approx"/>
+	</type>
+		
+	<!-- ***************************************************************** -->
+	<!-- Main Detector -->
+	<component type="detector1" idstart="3" idfillbyfirst="x" idstep="256" idstepbyrow="1">
+		<location name="detector1">
+			<parameter name="z">
+				<logfile eq="0.001*value" id="sdd"/>
+			</parameter>
+			<parameter name="x">
+				<logfile eq="0.001*value" id="detector-translation"/>
+			</parameter>
+			<parameter name="y">
+        <value val="0.0"/>
+      </parameter>
+		</location>
+	</component>
+	
+	<!-- Detector: -->
+	<type name="detector1" is="rectangular_detector" type="pixel_rectangular" xpixels="192"
+		xstart="0.52525" xstep="-0.0055" ypixels="256" ystart="-0.54825" ystep="0.0043">
+		<properties />
+	</type>
+	
+	<!-- Pixel for Detectors: 5.5x4 mm -->
+	<type is="detector" name="pixel_rectangular">
+		<cuboid id="pixel-shape">
+			<left-front-bottom-point y="-0.002" x="-0.00275" z="0.0" />
+			<left-front-top-point y="0.002" x="-0.00275" z="0.0" />
+			<left-back-bottom-point y="-0.002" x="-0.00275" z="-0.0001" />
+			<right-front-bottom-point y="-0.002" x="0.00275" z="0.0" />
+		</cuboid>
+		<algebra val="pixel-shape" />
+	</type>
+	
+	<!-- ***************************************************************** -->
+	<!-- Wing Detector -->
+	
+	<!-- Detector list def -->
+	<idlist idname="wing_detector_ids">
+		<id start="49155" end="90114" />
+	</idlist>
+	
+	<component type="wing_detector_arm" idlist="wing_detector_ids">
+		<location />
+	</component>
+	
+	<!-- Detector Banks -->
+	<type name="wing_detector_arm">
+		<component type="wing_detector">
+			<location>
+				<parameter name="r-position">
+					<value val="0"/>
+				</parameter>
+				<parameter name="t-position">
+					<logfile id="rotangle"  eq="0.0+value"/>
+				</parameter>
+				<parameter name="p-position">
+					<value val="0"/>
+				</parameter>
+				<parameter name="rotx">
+					<value val="0"/>
+				</parameter>
+				<parameter name="roty">
+					<logfile id="rotangle"  eq="0.0+value"/>
+				</parameter>
+				<parameter name="rotz">
+					<value val="0"/>
+				</parameter>
+			</location>
+		</component>
+	</type>
+	
+	<type name="wing_detector">
+		<component type="wing_tube">
+			
+			<location r="1.13" t="-0.0" name="wing_tube_0" />
+			<location r="1.13" t="-0.278873538391" name="wing_tube_1" />
+			<location r="1.13" t="-0.557747076782" name="wing_tube_2" />
+			<location r="1.13" t="-0.836620615172" name="wing_tube_3" />
+			<location r="1.13" t="-1.11549415356" name="wing_tube_4" />
+			<location r="1.13" t="-1.39436769195" name="wing_tube_5" />
+			<location r="1.13" t="-1.67324123034" name="wing_tube_6" />
+			<location r="1.13" t="-1.95211476874" name="wing_tube_7" />
+			<location r="1.13" t="-2.23098830713" name="wing_tube_8" />
+			<location r="1.13" t="-2.50986184552" name="wing_tube_9" />
+			<location r="1.13" t="-2.78873538391" name="wing_tube_10" />
+			<location r="1.13" t="-3.0676089223" name="wing_tube_11" />
+			<location r="1.13" t="-3.34648246069" name="wing_tube_12" />
+			<location r="1.13" t="-3.62535599908" name="wing_tube_13" />
+			<location r="1.13" t="-3.90422953747" name="wing_tube_14" />
+			<location r="1.13" t="-4.18310307586" name="wing_tube_15" />
+			<location r="1.13" t="-4.46197661425" name="wing_tube_16" />
+			<location r="1.13" t="-4.74085015264" name="wing_tube_17" />
+			<location r="1.13" t="-5.01972369103" name="wing_tube_18" />
+			<location r="1.13" t="-5.29859722943" name="wing_tube_19" />
+			<location r="1.13" t="-5.57747076782" name="wing_tube_20" />
+			<location r="1.13" t="-5.85634430621" name="wing_tube_21" />
+			<location r="1.13" t="-6.1352178446" name="wing_tube_22" />
+			<location r="1.13" t="-6.41409138299" name="wing_tube_23" />
+			<location r="1.13" t="-6.69296492138" name="wing_tube_24" />
+			<location r="1.13" t="-6.97183845977" name="wing_tube_25" />
+			<location r="1.13" t="-7.25071199816" name="wing_tube_26" />
+			<location r="1.13" t="-7.52958553655" name="wing_tube_27" />
+			<location r="1.13" t="-7.80845907494" name="wing_tube_28" />
+			<location r="1.13" t="-8.08733261333" name="wing_tube_29" />
+			<location r="1.13" t="-8.36620615172" name="wing_tube_30" />
+			<location r="1.13" t="-8.64507969012" name="wing_tube_31" />
+			<location r="1.13" t="-8.92395322851" name="wing_tube_32" />
+			<location r="1.13" t="-9.2028267669" name="wing_tube_33" />
+			<location r="1.13" t="-9.48170030529" name="wing_tube_34" />
+			<location r="1.13" t="-9.76057384368" name="wing_tube_35" />
+			<location r="1.13" t="-10.0394473821" name="wing_tube_36" />
+			<location r="1.13" t="-10.3183209205" name="wing_tube_37" />
+			<location r="1.13" t="-10.5971944589" name="wing_tube_38" />
+			<location r="1.13" t="-10.8760679972" name="wing_tube_39" />
+			<location r="1.13" t="-11.1549415356" name="wing_tube_40" />
+			<location r="1.13" t="-11.433815074" name="wing_tube_41" />
+			<location r="1.13" t="-11.7126886124" name="wing_tube_42" />
+			<location r="1.13" t="-11.9915621508" name="wing_tube_43" />
+			<location r="1.13" t="-12.2704356892" name="wing_tube_44" />
+			<location r="1.13" t="-12.5493092276" name="wing_tube_45" />
+			<location r="1.13" t="-12.828182766" name="wing_tube_46" />
+			<location r="1.13" t="-13.1070563044" name="wing_tube_47" />
+			<location r="1.13" t="-13.3859298428" name="wing_tube_48" />
+			<location r="1.13" t="-13.6648033812" name="wing_tube_49" />
+			<location r="1.13" t="-13.9436769195" name="wing_tube_50" />
+			<location r="1.13" t="-14.2225504579" name="wing_tube_51" />
+			<location r="1.13" t="-14.5014239963" name="wing_tube_52" />
+			<location r="1.13" t="-14.7802975347" name="wing_tube_53" />
+			<location r="1.13" t="-15.0591710731" name="wing_tube_54" />
+			<location r="1.13" t="-15.3380446115" name="wing_tube_55" />
+			<location r="1.13" t="-15.6169181499" name="wing_tube_56" />
+			<location r="1.13" t="-15.8957916883" name="wing_tube_57" />
+			<location r="1.13" t="-16.1746652267" name="wing_tube_58" />
+			<location r="1.13" t="-16.4535387651" name="wing_tube_59" />
+			<location r="1.13" t="-16.7324123034" name="wing_tube_60" />
+			<location r="1.13" t="-17.0112858418" name="wing_tube_61" />
+			<location r="1.13" t="-17.2901593802" name="wing_tube_62" />
+			<location r="1.13" t="-17.5690329186" name="wing_tube_63" />
+			<location r="1.13" t="-17.847906457" name="wing_tube_64" />
+			<location r="1.13" t="-18.1267799954" name="wing_tube_65" />
+			<location r="1.13" t="-18.4056535338" name="wing_tube_66" />
+			<location r="1.13" t="-18.6845270722" name="wing_tube_67" />
+			<location r="1.13" t="-18.9634006106" name="wing_tube_68" />
+			<location r="1.13" t="-19.242274149" name="wing_tube_69" />
+			<location r="1.13" t="-19.5211476874" name="wing_tube_70" />
+			<location r="1.13" t="-19.8000212257" name="wing_tube_71" />
+			<location r="1.13" t="-20.0788947641" name="wing_tube_72" />
+			<location r="1.13" t="-20.3577683025" name="wing_tube_73" />
+			<location r="1.13" t="-20.6366418409" name="wing_tube_74" />
+			<location r="1.13" t="-20.9155153793" name="wing_tube_75" />
+			<location r="1.13" t="-21.1943889177" name="wing_tube_76" />
+			<location r="1.13" t="-21.4732624561" name="wing_tube_77" />
+			<location r="1.13" t="-21.7521359945" name="wing_tube_78" />
+			<location r="1.13" t="-22.0310095329" name="wing_tube_79" />
+			<location r="1.13" t="-22.3098830713" name="wing_tube_80" />
+			<location r="1.13" t="-22.5887566097" name="wing_tube_81" />
+			<location r="1.13" t="-22.867630148" name="wing_tube_82" />
+			<location r="1.13" t="-23.1465036864" name="wing_tube_83" />
+			<location r="1.13" t="-23.4253772248" name="wing_tube_84" />
+			<location r="1.13" t="-23.7042507632" name="wing_tube_85" />
+			<location r="1.13" t="-23.9831243016" name="wing_tube_86" />
+			<location r="1.13" t="-24.26199784" name="wing_tube_87" />
+			<location r="1.13" t="-24.5408713784" name="wing_tube_88" />
+			<location r="1.13" t="-24.8197449168" name="wing_tube_89" />
+			<location r="1.13" t="-25.0986184552" name="wing_tube_90" />
+			<location r="1.13" t="-25.3774919936" name="wing_tube_91" />
+			<location r="1.13" t="-25.656365532" name="wing_tube_92" />
+			<location r="1.13" t="-25.9352390703" name="wing_tube_93" />
+			<location r="1.13" t="-26.2141126087" name="wing_tube_94" />
+			<location r="1.13" t="-26.4929861471" name="wing_tube_95" />
+			<location r="1.13" t="-26.7718596855" name="wing_tube_96" />
+			<location r="1.13" t="-27.0507332239" name="wing_tube_97" />
+			<location r="1.13" t="-27.3296067623" name="wing_tube_98" />
+			<location r="1.13" t="-27.6084803007" name="wing_tube_99" />
+			<location r="1.13" t="-27.8873538391" name="wing_tube_100" />
+			<location r="1.13" t="-28.1662273775" name="wing_tube_101" />
+			<location r="1.13" t="-28.4451009159" name="wing_tube_102" />
+			<location r="1.13" t="-28.7239744543" name="wing_tube_103" />
+			<location r="1.13" t="-29.0028479926" name="wing_tube_104" />
+			<location r="1.13" t="-29.281721531" name="wing_tube_105" />
+			<location r="1.13" t="-29.5605950694" name="wing_tube_106" />
+			<location r="1.13" t="-29.8394686078" name="wing_tube_107" />
+			<location r="1.13" t="-30.1183421462" name="wing_tube_108" />
+			<location r="1.13" t="-30.3972156846" name="wing_tube_109" />
+			<location r="1.13" t="-30.676089223" name="wing_tube_110" />
+			<location r="1.13" t="-30.9549627614" name="wing_tube_111" />
+			<location r="1.13" t="-31.2338362998" name="wing_tube_112" />
+			<location r="1.13" t="-31.5127098382" name="wing_tube_113" />
+			<location r="1.13" t="-31.7915833766" name="wing_tube_114" />
+			<location r="1.13" t="-32.0704569149" name="wing_tube_115" />
+			<location r="1.13" t="-32.3493304533" name="wing_tube_116" />
+			<location r="1.13" t="-32.6282039917" name="wing_tube_117" />
+			<location r="1.13" t="-32.9070775301" name="wing_tube_118" />
+			<location r="1.13" t="-33.1859510685" name="wing_tube_119" />
+			<location r="1.13" t="-33.4648246069" name="wing_tube_120" />
+			<location r="1.13" t="-33.7436981453" name="wing_tube_121" />
+			<location r="1.13" t="-34.0225716837" name="wing_tube_122" />
+			<location r="1.13" t="-34.3014452221" name="wing_tube_123" />
+			<location r="1.13" t="-34.5803187605" name="wing_tube_124" />
+			<location r="1.13" t="-34.8591922989" name="wing_tube_125" />
+			<location r="1.13" t="-35.1380658372" name="wing_tube_126" />
+			<location r="1.13" t="-35.4169393756" name="wing_tube_127" />
+			<location r="1.13" t="-35.695812914" name="wing_tube_128" />
+			<location r="1.13" t="-35.9746864524" name="wing_tube_129" />
+			<location r="1.13" t="-36.2535599908" name="wing_tube_130" />
+			<location r="1.13" t="-36.5324335292" name="wing_tube_131" />
+			<location r="1.13" t="-36.8113070676" name="wing_tube_132" />
+			<location r="1.13" t="-37.090180606" name="wing_tube_133" />
+			<location r="1.13" t="-37.3690541444" name="wing_tube_134" />
+			<location r="1.13" t="-37.6479276828" name="wing_tube_135" />
+			<location r="1.13" t="-37.9268012212" name="wing_tube_136" />
+			<location r="1.13" t="-38.2056747595" name="wing_tube_137" />
+			<location r="1.13" t="-38.4845482979" name="wing_tube_138" />
+			<location r="1.13" t="-38.7634218363" name="wing_tube_139" />
+			<location r="1.13" t="-39.0422953747" name="wing_tube_140" />
+			<location r="1.13" t="-39.3211689131" name="wing_tube_141" />
+			<location r="1.13" t="-39.6000424515" name="wing_tube_142" />
+			<location r="1.13" t="-39.8789159899" name="wing_tube_143" />
+			<location r="1.13" t="-40.1577895283" name="wing_tube_144" />
+			<location r="1.13" t="-40.4366630667" name="wing_tube_145" />
+			<location r="1.13" t="-40.7155366051" name="wing_tube_146" />
+			<location r="1.13" t="-40.9944101435" name="wing_tube_147" />
+			<location r="1.13" t="-41.2732836818" name="wing_tube_148" />
+			<location r="1.13" t="-41.5521572202" name="wing_tube_149" />
+			<location r="1.13" t="-41.8310307586" name="wing_tube_150" />
+			<location r="1.13" t="-42.109904297" name="wing_tube_151" />
+			<location r="1.13" t="-42.3887778354" name="wing_tube_152" />
+			<location r="1.13" t="-42.6676513738" name="wing_tube_153" />
+			<location r="1.13" t="-42.9465249122" name="wing_tube_154" />
+			<location r="1.13" t="-43.2253984506" name="wing_tube_155" />
+			<location r="1.13" t="-43.504271989" name="wing_tube_156" />
+			<location r="1.13" t="-43.7831455274" name="wing_tube_157" />
+			<location r="1.13" t="-44.0620190658" name="wing_tube_158" />
+			<location r="1.13" t="-44.3408926041" name="wing_tube_159" />
+		</component>
+	</type>
+	
+	<type name="wing_tube" outline="yes">
+		<component type="wing_pixel">
+			
+			<location y="-0.54825" name="wing_pixel_0" />
+			<location y="-0.54395" name="wing_pixel_1" />
+			<location y="-0.53965" name="wing_pixel_2" />
+			<location y="-0.53535" name="wing_pixel_3" />
+			<location y="-0.53105" name="wing_pixel_4" />
+			<location y="-0.52675" name="wing_pixel_5" />
+			<location y="-0.52245" name="wing_pixel_6" />
+			<location y="-0.51815" name="wing_pixel_7" />
+			<location y="-0.51385" name="wing_pixel_8" />
+			<location y="-0.50955" name="wing_pixel_9" />
+			<location y="-0.50525" name="wing_pixel_10" />
+			<location y="-0.50095" name="wing_pixel_11" />
+			<location y="-0.49665" name="wing_pixel_12" />
+			<location y="-0.49235" name="wing_pixel_13" />
+			<location y="-0.48805" name="wing_pixel_14" />
+			<location y="-0.48375" name="wing_pixel_15" />
+			<location y="-0.47945" name="wing_pixel_16" />
+			<location y="-0.47515" name="wing_pixel_17" />
+			<location y="-0.47085" name="wing_pixel_18" />
+			<location y="-0.46655" name="wing_pixel_19" />
+			<location y="-0.46225" name="wing_pixel_20" />
+			<location y="-0.45795" name="wing_pixel_21" />
+			<location y="-0.45365" name="wing_pixel_22" />
+			<location y="-0.44935" name="wing_pixel_23" />
+			<location y="-0.44505" name="wing_pixel_24" />
+			<location y="-0.44075" name="wing_pixel_25" />
+			<location y="-0.43645" name="wing_pixel_26" />
+			<location y="-0.43215" name="wing_pixel_27" />
+			<location y="-0.42785" name="wing_pixel_28" />
+			<location y="-0.42355" name="wing_pixel_29" />
+			<location y="-0.41925" name="wing_pixel_30" />
+			<location y="-0.41495" name="wing_pixel_31" />
+			<location y="-0.41065" name="wing_pixel_32" />
+			<location y="-0.40635" name="wing_pixel_33" />
+			<location y="-0.40205" name="wing_pixel_34" />
+			<location y="-0.39775" name="wing_pixel_35" />
+			<location y="-0.39345" name="wing_pixel_36" />
+			<location y="-0.38915" name="wing_pixel_37" />
+			<location y="-0.38485" name="wing_pixel_38" />
+			<location y="-0.38055" name="wing_pixel_39" />
+			<location y="-0.37625" name="wing_pixel_40" />
+			<location y="-0.37195" name="wing_pixel_41" />
+			<location y="-0.36765" name="wing_pixel_42" />
+			<location y="-0.36335" name="wing_pixel_43" />
+			<location y="-0.35905" name="wing_pixel_44" />
+			<location y="-0.35475" name="wing_pixel_45" />
+			<location y="-0.35045" name="wing_pixel_46" />
+			<location y="-0.34615" name="wing_pixel_47" />
+			<location y="-0.34185" name="wing_pixel_48" />
+			<location y="-0.33755" name="wing_pixel_49" />
+			<location y="-0.33325" name="wing_pixel_50" />
+			<location y="-0.32895" name="wing_pixel_51" />
+			<location y="-0.32465" name="wing_pixel_52" />
+			<location y="-0.32035" name="wing_pixel_53" />
+			<location y="-0.31605" name="wing_pixel_54" />
+			<location y="-0.31175" name="wing_pixel_55" />
+			<location y="-0.30745" name="wing_pixel_56" />
+			<location y="-0.30315" name="wing_pixel_57" />
+			<location y="-0.29885" name="wing_pixel_58" />
+			<location y="-0.29455" name="wing_pixel_59" />
+			<location y="-0.29025" name="wing_pixel_60" />
+			<location y="-0.28595" name="wing_pixel_61" />
+			<location y="-0.28165" name="wing_pixel_62" />
+			<location y="-0.27735" name="wing_pixel_63" />
+			<location y="-0.27305" name="wing_pixel_64" />
+			<location y="-0.26875" name="wing_pixel_65" />
+			<location y="-0.26445" name="wing_pixel_66" />
+			<location y="-0.26015" name="wing_pixel_67" />
+			<location y="-0.25585" name="wing_pixel_68" />
+			<location y="-0.25155" name="wing_pixel_69" />
+			<location y="-0.24725" name="wing_pixel_70" />
+			<location y="-0.24295" name="wing_pixel_71" />
+			<location y="-0.23865" name="wing_pixel_72" />
+			<location y="-0.23435" name="wing_pixel_73" />
+			<location y="-0.23005" name="wing_pixel_74" />
+			<location y="-0.22575" name="wing_pixel_75" />
+			<location y="-0.22145" name="wing_pixel_76" />
+			<location y="-0.21715" name="wing_pixel_77" />
+			<location y="-0.21285" name="wing_pixel_78" />
+			<location y="-0.20855" name="wing_pixel_79" />
+			<location y="-0.20425" name="wing_pixel_80" />
+			<location y="-0.19995" name="wing_pixel_81" />
+			<location y="-0.19565" name="wing_pixel_82" />
+			<location y="-0.19135" name="wing_pixel_83" />
+			<location y="-0.18705" name="wing_pixel_84" />
+			<location y="-0.18275" name="wing_pixel_85" />
+			<location y="-0.17845" name="wing_pixel_86" />
+			<location y="-0.17415" name="wing_pixel_87" />
+			<location y="-0.16985" name="wing_pixel_88" />
+			<location y="-0.16555" name="wing_pixel_89" />
+			<location y="-0.16125" name="wing_pixel_90" />
+			<location y="-0.15695" name="wing_pixel_91" />
+			<location y="-0.15265" name="wing_pixel_92" />
+			<location y="-0.14835" name="wing_pixel_93" />
+			<location y="-0.14405" name="wing_pixel_94" />
+			<location y="-0.13975" name="wing_pixel_95" />
+			<location y="-0.13545" name="wing_pixel_96" />
+			<location y="-0.13115" name="wing_pixel_97" />
+			<location y="-0.12685" name="wing_pixel_98" />
+			<location y="-0.12255" name="wing_pixel_99" />
+			<location y="-0.11825" name="wing_pixel_100" />
+			<location y="-0.11395" name="wing_pixel_101" />
+			<location y="-0.10965" name="wing_pixel_102" />
+			<location y="-0.10535" name="wing_pixel_103" />
+			<location y="-0.10105" name="wing_pixel_104" />
+			<location y="-0.09675" name="wing_pixel_105" />
+			<location y="-0.09245" name="wing_pixel_106" />
+			<location y="-0.08815" name="wing_pixel_107" />
+			<location y="-0.08385" name="wing_pixel_108" />
+			<location y="-0.07955" name="wing_pixel_109" />
+			<location y="-0.07525" name="wing_pixel_110" />
+			<location y="-0.07095" name="wing_pixel_111" />
+			<location y="-0.06665" name="wing_pixel_112" />
+			<location y="-0.06235" name="wing_pixel_113" />
+			<location y="-0.05805" name="wing_pixel_114" />
+			<location y="-0.05375" name="wing_pixel_115" />
+			<location y="-0.04945" name="wing_pixel_116" />
+			<location y="-0.04515" name="wing_pixel_117" />
+			<location y="-0.04085" name="wing_pixel_118" />
+			<location y="-0.03655" name="wing_pixel_119" />
+			<location y="-0.03225" name="wing_pixel_120" />
+			<location y="-0.02795" name="wing_pixel_121" />
+			<location y="-0.02365" name="wing_pixel_122" />
+			<location y="-0.01935" name="wing_pixel_123" />
+			<location y="-0.01505" name="wing_pixel_124" />
+			<location y="-0.01075" name="wing_pixel_125" />
+			<location y="-0.00645" name="wing_pixel_126" />
+			<location y="-0.00215" name="wing_pixel_127" />
+			<location y="0.00215" name="wing_pixel_128" />
+			<location y="0.00645" name="wing_pixel_129" />
+			<location y="0.01075" name="wing_pixel_130" />
+			<location y="0.01505" name="wing_pixel_131" />
+			<location y="0.01935" name="wing_pixel_132" />
+			<location y="0.02365" name="wing_pixel_133" />
+			<location y="0.02795" name="wing_pixel_134" />
+			<location y="0.03225" name="wing_pixel_135" />
+			<location y="0.03655" name="wing_pixel_136" />
+			<location y="0.04085" name="wing_pixel_137" />
+			<location y="0.04515" name="wing_pixel_138" />
+			<location y="0.04945" name="wing_pixel_139" />
+			<location y="0.05375" name="wing_pixel_140" />
+			<location y="0.05805" name="wing_pixel_141" />
+			<location y="0.06235" name="wing_pixel_142" />
+			<location y="0.06665" name="wing_pixel_143" />
+			<location y="0.07095" name="wing_pixel_144" />
+			<location y="0.07525" name="wing_pixel_145" />
+			<location y="0.07955" name="wing_pixel_146" />
+			<location y="0.08385" name="wing_pixel_147" />
+			<location y="0.08815" name="wing_pixel_148" />
+			<location y="0.09245" name="wing_pixel_149" />
+			<location y="0.09675" name="wing_pixel_150" />
+			<location y="0.10105" name="wing_pixel_151" />
+			<location y="0.10535" name="wing_pixel_152" />
+			<location y="0.10965" name="wing_pixel_153" />
+			<location y="0.11395" name="wing_pixel_154" />
+			<location y="0.11825" name="wing_pixel_155" />
+			<location y="0.12255" name="wing_pixel_156" />
+			<location y="0.12685" name="wing_pixel_157" />
+			<location y="0.13115" name="wing_pixel_158" />
+			<location y="0.13545" name="wing_pixel_159" />
+			<location y="0.13975" name="wing_pixel_160" />
+			<location y="0.14405" name="wing_pixel_161" />
+			<location y="0.14835" name="wing_pixel_162" />
+			<location y="0.15265" name="wing_pixel_163" />
+			<location y="0.15695" name="wing_pixel_164" />
+			<location y="0.16125" name="wing_pixel_165" />
+			<location y="0.16555" name="wing_pixel_166" />
+			<location y="0.16985" name="wing_pixel_167" />
+			<location y="0.17415" name="wing_pixel_168" />
+			<location y="0.17845" name="wing_pixel_169" />
+			<location y="0.18275" name="wing_pixel_170" />
+			<location y="0.18705" name="wing_pixel_171" />
+			<location y="0.19135" name="wing_pixel_172" />
+			<location y="0.19565" name="wing_pixel_173" />
+			<location y="0.19995" name="wing_pixel_174" />
+			<location y="0.20425" name="wing_pixel_175" />
+			<location y="0.20855" name="wing_pixel_176" />
+			<location y="0.21285" name="wing_pixel_177" />
+			<location y="0.21715" name="wing_pixel_178" />
+			<location y="0.22145" name="wing_pixel_179" />
+			<location y="0.22575" name="wing_pixel_180" />
+			<location y="0.23005" name="wing_pixel_181" />
+			<location y="0.23435" name="wing_pixel_182" />
+			<location y="0.23865" name="wing_pixel_183" />
+			<location y="0.24295" name="wing_pixel_184" />
+			<location y="0.24725" name="wing_pixel_185" />
+			<location y="0.25155" name="wing_pixel_186" />
+			<location y="0.25585" name="wing_pixel_187" />
+			<location y="0.26015" name="wing_pixel_188" />
+			<location y="0.26445" name="wing_pixel_189" />
+			<location y="0.26875" name="wing_pixel_190" />
+			<location y="0.27305" name="wing_pixel_191" />
+			<location y="0.27735" name="wing_pixel_192" />
+			<location y="0.28165" name="wing_pixel_193" />
+			<location y="0.28595" name="wing_pixel_194" />
+			<location y="0.29025" name="wing_pixel_195" />
+			<location y="0.29455" name="wing_pixel_196" />
+			<location y="0.29885" name="wing_pixel_197" />
+			<location y="0.30315" name="wing_pixel_198" />
+			<location y="0.30745" name="wing_pixel_199" />
+			<location y="0.31175" name="wing_pixel_200" />
+			<location y="0.31605" name="wing_pixel_201" />
+			<location y="0.32035" name="wing_pixel_202" />
+			<location y="0.32465" name="wing_pixel_203" />
+			<location y="0.32895" name="wing_pixel_204" />
+			<location y="0.33325" name="wing_pixel_205" />
+			<location y="0.33755" name="wing_pixel_206" />
+			<location y="0.34185" name="wing_pixel_207" />
+			<location y="0.34615" name="wing_pixel_208" />
+			<location y="0.35045" name="wing_pixel_209" />
+			<location y="0.35475" name="wing_pixel_210" />
+			<location y="0.35905" name="wing_pixel_211" />
+			<location y="0.36335" name="wing_pixel_212" />
+			<location y="0.36765" name="wing_pixel_213" />
+			<location y="0.37195" name="wing_pixel_214" />
+			<location y="0.37625" name="wing_pixel_215" />
+			<location y="0.38055" name="wing_pixel_216" />
+			<location y="0.38485" name="wing_pixel_217" />
+			<location y="0.38915" name="wing_pixel_218" />
+			<location y="0.39345" name="wing_pixel_219" />
+			<location y="0.39775" name="wing_pixel_220" />
+			<location y="0.40205" name="wing_pixel_221" />
+			<location y="0.40635" name="wing_pixel_222" />
+			<location y="0.41065" name="wing_pixel_223" />
+			<location y="0.41495" name="wing_pixel_224" />
+			<location y="0.41925" name="wing_pixel_225" />
+			<location y="0.42355" name="wing_pixel_226" />
+			<location y="0.42785" name="wing_pixel_227" />
+			<location y="0.43215" name="wing_pixel_228" />
+			<location y="0.43645" name="wing_pixel_229" />
+			<location y="0.44075" name="wing_pixel_230" />
+			<location y="0.44505" name="wing_pixel_231" />
+			<location y="0.44935" name="wing_pixel_232" />
+			<location y="0.45365" name="wing_pixel_233" />
+			<location y="0.45795" name="wing_pixel_234" />
+			<location y="0.46225" name="wing_pixel_235" />
+			<location y="0.46655" name="wing_pixel_236" />
+			<location y="0.47085" name="wing_pixel_237" />
+			<location y="0.47515" name="wing_pixel_238" />
+			<location y="0.47945" name="wing_pixel_239" />
+			<location y="0.48375" name="wing_pixel_240" />
+			<location y="0.48805" name="wing_pixel_241" />
+			<location y="0.49235" name="wing_pixel_242" />
+			<location y="0.49665" name="wing_pixel_243" />
+			<location y="0.50095" name="wing_pixel_244" />
+			<location y="0.50525" name="wing_pixel_245" />
+			<location y="0.50955" name="wing_pixel_246" />
+			<location y="0.51385" name="wing_pixel_247" />
+			<location y="0.51815" name="wing_pixel_248" />
+			<location y="0.52245" name="wing_pixel_249" />
+			<location y="0.52675" name="wing_pixel_250" />
+			<location y="0.53105" name="wing_pixel_251" />
+			<location y="0.53535" name="wing_pixel_252" />
+			<location y="0.53965" name="wing_pixel_253" />
+			<location y="0.54395" name="wing_pixel_254" />
+			<location y="0.54825" name="wing_pixel_255" />
+		</component>
+	</type>
+	
+	<type name="wing_pixel" is="detector">
+		<cylinder id="cyl-approx">
+			<centre-of-bottom-base p="0.0" r="0.0" t="0.0"/>
+			<axis y="1.0" x="0.0" z="0.0"/>
+			<radius val="0.00275"/>
+			<height val="0.0043"/>
+		</cylinder>
+		<algebra val="cyl-approx"/>
+	</type>
+	
+</instrument>
+
diff --git a/instrument/CG3_Parameters.xml b/instrument/CG3_Parameters.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f991ab7626026ecd54f408fbf365a3e1495b4bfb
--- /dev/null
+++ b/instrument/CG3_Parameters.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<parameter-file instrument = "BIOSANS"
+				valid-from="2019-10-01 00:00:00"
+				valid-to="2100-01-31 23:59:59">
+	
+	<component-link name = "BIOSANS">
+		
+		<parameter name="detector-name" type="string">
+			<value val="detector1"/>
+		</parameter>
+		
+		<parameter name="default-incident-timer-spectrum">
+			<value val="2"/>
+		</parameter>
+		
+		<parameter name="default-incident-monitor-spectrum">
+			<value val="1"/>
+		</parameter>
+		
+		<parameter name="number-of-x-pixels">
+			<value val="192"/>
+		</parameter>
+		
+		<parameter name="number-of-y-pixels">
+			<value val="256"/>
+		</parameter>
+		
+		<parameter name="number-of-monitors">
+			<value val="2"/>
+		</parameter>
+		
+		<parameter name="x-pixel-size">
+			<value val="5.5"/>
+		</parameter>
+		
+		<parameter name="y-pixel-size">
+			<value val="4.0"/>
+		</parameter>
+		
+		<parameter name="detector-distance-offset">
+			<value val="837.9"/>
+		</parameter>
+		
+		<!-- Aperture distances for 8 guides to 0 guides -->
+		<parameter name="aperture-distances" type="string">
+			<value val="2018.0, 3426.9, 5449.1, 7473.8, 9497.2, 11527.1, 13546.6, 15568.2, 17594.6"/>
+		</parameter>
+		
+		<parameter name="source-distance-offset">
+			<value val="-171.0"/>
+		</parameter>
+		
+	</component-link>
+	
+</parameter-file>
diff --git a/instrument/HB3A_Definition_20190926_3.xml b/instrument/HB3A_Definition_20190926_3.xml
index 23143dd03d1d4b807dbf8445c34863747668e9d7..d681b13d004eed47970d0e63c1c826c74a71dc42 100644
--- a/instrument/HB3A_Definition_20190926_3.xml
+++ b/instrument/HB3A_Definition_20190926_3.xml
@@ -21,7 +21,7 @@
         <value val="0.0"/>
       </parameter>
       <parameter name="roty">
-        <logfile eq="value+0.0" id="2theta"/>
+        <logfile eq="-value+0.0" id="2theta"/>
       </parameter>
       <parameter name="t-position">
         <value val="0.0"/>
@@ -53,7 +53,7 @@
           <logfile eq="value" id="cal::diffx1"/>
         </parameter>
         <parameter name="y">
-          <logfile eq="-0.12+value" id="cal::diffy1"/>
+          <logfile eq="0.0+value" id="cal::diffy1"/>
         </parameter>
       </location>
     </component>
@@ -68,7 +68,7 @@
         <value val="0.0"/>
       </parameter>
       <parameter name="roty">
-        <logfile eq="value+0.0" id="2theta"/>
+        <logfile eq="-value+0.0" id="2theta"/>
       </parameter>
       <parameter name="t-position">
         <value val="0.0"/>
@@ -100,7 +100,7 @@
           <logfile eq="value" id="cal::diffx2"/>
         </parameter>
         <parameter name="y">
-          <logfile eq="0+value" id="cal::diffy2"/>
+          <logfile eq="0.12+value" id="cal::diffy2"/>
         </parameter>
       </location>
     </component>
@@ -115,7 +115,7 @@
         <value val="0.0"/>
       </parameter>
       <parameter name="roty">
-        <logfile eq="value+0.0" id="2theta"/>
+        <logfile eq="-value+0.0" id="2theta"/>
       </parameter>
       <parameter name="t-position">
         <value val="0.0"/>
@@ -147,7 +147,7 @@
           <logfile eq="value" id="cal::diffx3"/>
         </parameter>
         <parameter name="y">
-          <logfile eq="0.12+value" id="cal::diffy3"/>
+          <logfile eq="0.24+value" id="cal::diffy3"/>
         </parameter>
       </location>
     </component>
diff --git a/qt/applications/workbench/workbench/plotting/figuremanager.py b/qt/applications/workbench/workbench/plotting/figuremanager.py
index 988643e12e9a7a32ce9a1d961a1d425f83494599..09cca35cbaaade1d07af4fa142d3351bc9f2da4f 100644
--- a/qt/applications/workbench/workbench/plotting/figuremanager.py
+++ b/qt/applications/workbench/workbench/plotting/figuremanager.py
@@ -209,6 +209,7 @@ class FigureManagerWorkbench(FigureManagerBase, QObject):
                 self.generate_plot_script_clipboard)
             self.toolbar.sig_generate_plot_script_file_triggered.connect(
                 self.generate_plot_script_file)
+            self.toolbar.sig_home_clicked.connect(self.set_figure_zoom_to_display_all)
             self.toolbar.setFloatable(False)
             tbs_height = self.toolbar.sizeHint().height()
         else:
@@ -398,6 +399,20 @@ class FigureManagerWorkbench(FigureManagerBase, QObject):
             if toolbar_action == action:
                 self.toolbar.actions()[i+1].setVisible(enabled)
 
+    def set_figure_zoom_to_display_all(self):
+        axes = self.canvas.figure.get_axes()
+        if axes:
+            for ax in axes:
+                # We check for axes type below as a pseudo check for an axes being
+                # a colorbar. this is based on the same check in
+                # FigureManagerADSObserver.deleteHandle.
+                if type(ax) is not Axes:
+                    if ax.lines:  # Relim causes issues with colour plots, which have no lines.
+                        ax.relim()
+                    ax.autoscale()
+
+            self.canvas.draw()
+
 
 # -----------------------------------------------------------------------------
 # Figure control
diff --git a/qt/applications/workbench/workbench/plotting/figurewindow.py b/qt/applications/workbench/workbench/plotting/figurewindow.py
index d87c9e8adab4e25b76baa684e430f64a36017410..ef14a45c62d105fa4af20073873bdd7cfca22ea8 100644
--- a/qt/applications/workbench/workbench/plotting/figurewindow.py
+++ b/qt/applications/workbench/workbench/plotting/figurewindow.py
@@ -11,7 +11,6 @@
 from __future__ import absolute_import
 
 # std imports
-import platform
 import weakref
 
 # 3rdparty imports
@@ -40,13 +39,14 @@ class FigureWindow(QMainWindow, ObservingView):
         self.setAttribute(Qt.WA_DeleteOnClose, True)
         self.setWindowIcon(QIcon(':/images/MantidIcon.ico'))
 
-        # On Windows, setting the Workbench's main window as this window's
-        # parent always keeps this window on top, but still allows minimization.
-        # On Ubuntu the child is NOT kept above the parent, hence we use the
-        # focusWindowChanged event to bring this window back to the top when
-        # the main window gets focus. This does cause a slight flicker effect
-        # as the window is hidden and quickly brought back to the front. Using
-        # the parent-child method at least avoids this flicker on Windows.
+        # We use the focusWindowChanged event to bring this window back to the
+        # top when the main window gets focus. This does cause a slight flicker
+        # effect as the window is hidden and quickly brought back to the front.
+
+        # Using the parent-child method was tried. This worked on windows but
+        # not on Ubuntu as the child is NOT kept above the parent.
+        # However this is not used for windows as whenever a plot was done by
+        # an interface it moved behind workbench.
 
         # Using the Qt.WindowStaysOnTopFlag was tried, however this caused the
         # window to stay on top of all other windows, including external
@@ -57,11 +57,7 @@ class FigureWindow(QMainWindow, ObservingView):
         # Using the Qt.Tool flag, and setting the main window as this window's
         # parent, keeps this window on top. However it does not allow the
         # window to be minimized.
-        if platform.system() == "Windows":
-            from workbench.utils.windowfinder import get_main_window_widget
-            self.setParent(get_main_window_widget(), Qt.Window)
-        else:
-            QApplication.instance().focusWindowChanged.connect(self._on_focusWindowChanged)
+        QApplication.instance().focusWindowChanged.connect(self._on_focusWindowChanged)
         self.close_signal.connect(self._run_close)
         self.setAcceptDrops(True)
 
diff --git a/qt/paraview_ext/VatesSimpleGui/ViewWidgets/src/MdViewerWidget.cpp b/qt/paraview_ext/VatesSimpleGui/ViewWidgets/src/MdViewerWidget.cpp
index 78df4cc5a8c5ba3fd723accb729f58eba7ce2fd3..7bf1d23949921bbc4226c9bdff6b87b9ec1d8103 100644
--- a/qt/paraview_ext/VatesSimpleGui/ViewWidgets/src/MdViewerWidget.cpp
+++ b/qt/paraview_ext/VatesSimpleGui/ViewWidgets/src/MdViewerWidget.cpp
@@ -352,8 +352,8 @@ ViewBase *MdViewerWidget::createAndSetMainViewWidget(QWidget *container,
   view->setColorScaleLock(&m_colorScaleLock);
 
   using Mantid::Kernel::UsageService;
-  UsageService::Instance().registerFeatureUsage("Interface", featureName,
-                                                false);
+  UsageService::Instance().registerFeatureUsage(
+      Mantid::Kernel::FeatureType::Interface, featureName, false);
   return view;
 }
 
diff --git a/qt/python/mantidqt/dialogs/spectraselectordialog.py b/qt/python/mantidqt/dialogs/spectraselectordialog.py
index c564ec3b59b06a06bb043682a96f629f09cfa329..44369091ba3f15c9706aa569df27b047251983bc 100644
--- a/qt/python/mantidqt/dialogs/spectraselectordialog.py
+++ b/qt/python/mantidqt/dialogs/spectraselectordialog.py
@@ -130,6 +130,8 @@ class SpectraSelectionDialog(SpectraSelectionDialogUIBase):
             for sp_set in ws_spectra[1:]:
                 plottable = plottable.intersection(sp_set)
         plottable = sorted(plottable)
+        if len(plottable) == 0:
+            raise Exception('Error: Workspaces have no common spectra.')
         spec_min, spec_max = min(plottable), max(plottable)
         self._ui.specNums.setPlaceholderText(PLACEHOLDER_FORMAT.format(spec_min, spec_max))
         self.spec_min, self.spec_max = spec_min, spec_max
diff --git a/qt/python/mantidqt/dialogs/spectraselectorutils.py b/qt/python/mantidqt/dialogs/spectraselectorutils.py
index 7c3b7de71ca9f4d747b37196a11098c9dff333f2..26e66111b87cdb0ec55b0ff570b539e14d1ba18f 100644
--- a/qt/python/mantidqt/dialogs/spectraselectorutils.py
+++ b/qt/python/mantidqt/dialogs/spectraselectorutils.py
@@ -24,9 +24,20 @@ def get_spectra_selection(workspaces, parent_widget=None, show_colorfill_btn=Fal
     """
     SpectraSelectionDialog.raise_error_if_workspaces_not_compatible(workspaces)
     single_spectra_ws = [wksp.getNumberHistograms() for wksp in workspaces if wksp.getNumberHistograms() == 1]
-    if len(single_spectra_ws) > 0 and len(workspaces) == 1:
-        # At least 1 workspace contains only a single spectrum so this is all
-        # that is possible to plot for all of them
+
+    if len(workspaces) == len(single_spectra_ws):
+        plottable = []
+    else:
+        ws_spectra = [{ws.getSpectrum(i).getSpectrumNo() for i in range(ws.getNumberHistograms())} for ws in workspaces]
+        plottable = ws_spectra[0]
+        # check if there are no common spectra in workspaces
+        if len(ws_spectra) > 1:
+            for sp_set in ws_spectra[1:]:
+                plottable = plottable.intersection(sp_set)
+
+    if len(single_spectra_ws) == len(workspaces) or len(plottable) == 0:
+        # At least 1 workspace contains only a single spectrum and these are no
+        # common spectra
         selection = SpectraSelection(workspaces)
         selection.wksp_indices = [0]
         return selection
diff --git a/qt/python/mantidqt/dialogs/test/test_spectraselectiondialog.py b/qt/python/mantidqt/dialogs/test/test_spectraselectiondialog.py
index f3427bd24104105fcfdb57f69c7f4689d2fdd842..4c16093eb3c0918a838a3ace20ce9bf0121956e5 100644
--- a/qt/python/mantidqt/dialogs/test/test_spectraselectiondialog.py
+++ b/qt/python/mantidqt/dialogs/test/test_spectraselectiondialog.py
@@ -11,6 +11,7 @@ from qtpy.QtWidgets import QDialogButtonBox
 
 from mantid.api import WorkspaceFactory
 from mantid.py3compat import mock
+from mantid.simpleapi import ExtractSpectra
 from mantidqt.dialogs.spectraselectordialog import parse_selection_str, SpectraSelectionDialog
 from mantidqt.dialogs.spectraselectorutils import get_spectra_selection
 from mantidqt.utils.qt.testing import start_qapplication
@@ -137,6 +138,12 @@ class SpectraSelectionDialogTest(unittest.TestCase):
         table = WorkspaceFactory.Instance().createTable()
         self.assertRaises(ValueError, get_spectra_selection, [self._single_spec_ws, table])
 
+    def test_set_placeholder_text_raises_error_if_workspaces_have_no_common_spectra(self):
+        spectra_1 = ExtractSpectra(InputWorkspace=self._multi_spec_ws, StartWorkspaceIndex=0, EndWorkspaceIndex=5)
+        spectra_2 = ExtractSpectra(InputWorkspace=self._multi_spec_ws, StartWorkspaceIndex=6, EndWorkspaceIndex=10)
+        workspaces = [spectra_1, spectra_2]
+        self.assertRaises(Exception, 'Error: Workspaces have no common spectra.', SpectraSelectionDialog, workspaces)
+
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/qt/python/mantidqt/dialogs/test/test_spectraselectorutils.py b/qt/python/mantidqt/dialogs/test/test_spectraselectorutils.py
index c0b04c284799355829c6a56d724c486b60a3477a..c91661ca720578581ed1ca7974e78cb38cba9dc2 100644
--- a/qt/python/mantidqt/dialogs/test/test_spectraselectorutils.py
+++ b/qt/python/mantidqt/dialogs/test/test_spectraselectorutils.py
@@ -11,6 +11,7 @@ import unittest
 
 from mantid.api import WorkspaceFactory
 from mantid.py3compat import mock
+from mantid.simpleapi import ExtractSpectra
 from mantidqt.dialogs.spectraselectorutils import get_spectra_selection
 from mantidqt.utils.qt.testing import start_qapplication
 from qtpy.QtGui import QIcon
@@ -58,3 +59,17 @@ class SpectraSelectionUtilsTest(unittest.TestCase):
         dialog_mock.assert_not_called()
         self.assertEqual([0], selection.wksp_indices)
         self.assertEqual([self._single_spec_ws], selection.workspaces)
+
+    @mock.patch('mantidqt.dialogs.spectraselectorutils.SpectraSelectionDialog')
+    def test_get_spectra_selection_does_not_use_dialog_for_multiple__single_spectrum(self, dialog_mock):
+        spectra_1 = ExtractSpectra(InputWorkspace=self._multi_spec_ws, StartWorkspaceIndex=0, EndWorkspaceIndex=0)
+        spectra_2 = ExtractSpectra(InputWorkspace=self._multi_spec_ws, StartWorkspaceIndex=1, EndWorkspaceIndex=1)
+        selection = get_spectra_selection([spectra_1, spectra_2])
+
+        dialog_mock.assert_not_called()
+        self.assertEqual([0], selection.wksp_indices)
+        self.assertEqual([spectra_1, spectra_2], selection.workspaces)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/qt/python/mantidqt/widgets/plotconfigdialog/legendtabwidget/legend_tab.ui b/qt/python/mantidqt/widgets/plotconfigdialog/legendtabwidget/legend_tab.ui
index 2e130ffce6ebb4b5b648ee1d82985081b0018db7..4161a524ffba33202492e69b4268962022d4dcca 100644
--- a/qt/python/mantidqt/widgets/plotconfigdialog/legendtabwidget/legend_tab.ui
+++ b/qt/python/mantidqt/widgets/plotconfigdialog/legendtabwidget/legend_tab.ui
@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>527</width>
-    <height>562</height>
+    <height>446</height>
    </rect>
   </property>
   <property name="sizePolicy">
@@ -28,27 +28,34 @@
   <layout class="QGridLayout" name="gridLayout">
    <item row="1" column="0">
     <layout class="QVBoxLayout" name="verticalLayout_2">
-     <item>
-      <spacer name="verticalSpacer_4">
-       <property name="orientation">
-        <enum>Qt::Vertical</enum>
-       </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>20</width>
-         <height>40</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
      <item>
       <layout class="QGridLayout" name="grid_layout">
        <property name="sizeConstraint">
         <enum>QLayout::SetDefaultConstraint</enum>
        </property>
-       <item row="13" column="2" colspan="2">
+       <item row="9" column="2" colspan="2">
+        <widget class="QWidget" name="title_color_selector_dummy_widget" native="true">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+        </widget>
+       </item>
+       <item row="11" column="2" colspan="2">
         <widget class="QComboBox" name="entries_font_combo_box"/>
        </item>
+       <item row="4" column="3">
+        <widget class="QSpinBox" name="transparency_spin_box">
+         <property name="suffix">
+          <string>%</string>
+         </property>
+         <property name="maximum">
+          <number>100</number>
+         </property>
+        </widget>
+       </item>
        <item row="2" column="2" colspan="2">
         <widget class="QWidget" name="background_color_selector_dummy_widget" native="true">
          <property name="sizePolicy">
@@ -59,10 +66,10 @@
          </property>
         </widget>
        </item>
-       <item row="4" column="0">
-        <widget class="QLabel" name="transparency_label">
+       <item row="2" column="0">
+        <widget class="QLabel" name="background_color_label">
          <property name="text">
-          <string>Transparency</string>
+          <string>Background Color</string>
          </property>
         </widget>
        </item>
@@ -76,7 +83,14 @@
          </property>
         </widget>
        </item>
-       <item row="6" column="0">
+       <item row="4" column="0">
+        <widget class="QLabel" name="transparency_label">
+         <property name="text">
+          <string>Transparency</string>
+         </property>
+        </widget>
+       </item>
+       <item row="5" column="0">
         <widget class="QLabel" name="title_label_2">
          <property name="font">
           <font>
@@ -90,27 +104,17 @@
          </property>
         </widget>
        </item>
-       <item row="2" column="0">
-        <widget class="QLabel" name="background_color_label">
+       <item row="1" column="0" colspan="2">
+        <widget class="QCheckBox" name="hide_box_check_box">
          <property name="text">
-          <string>Background Color</string>
-         </property>
-        </widget>
-       </item>
-       <item row="4" column="3">
-        <widget class="QSpinBox" name="transparency_spin_box">
-         <property name="suffix">
-          <string>%</string>
-         </property>
-         <property name="maximum">
-          <number>100</number>
+          <string>Hide Box</string>
          </property>
         </widget>
        </item>
-       <item row="3" column="0">
-        <widget class="QLabel" name="edge_color_label">
+       <item row="12" column="0">
+        <widget class="QLabel" name="entries_size_label">
          <property name="text">
-          <string>Edge Color</string>
+          <string>Size</string>
          </property>
         </widget>
        </item>
@@ -128,18 +132,12 @@
          </property>
         </widget>
        </item>
-       <item row="5" column="0" colspan="4">
-        <spacer name="verticalSpacer">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>20</width>
-           <height>40</height>
-          </size>
+       <item row="3" column="0">
+        <widget class="QLabel" name="edge_color_label">
+         <property name="text">
+          <string>Edge Color</string>
          </property>
-        </spacer>
+        </widget>
        </item>
        <item row="3" column="2" colspan="2">
         <widget class="QWidget" name="edge_color_selector_dummy_widget" native="true">
@@ -151,67 +149,17 @@
          </property>
         </widget>
        </item>
-       <item row="20" column="0">
+       <item row="17" column="0">
         <widget class="QLabel" name="marker_size_label">
          <property name="text">
           <string>Length</string>
          </property>
         </widget>
        </item>
-       <item row="17" column="0" colspan="4">
-        <spacer name="verticalSpacer_3">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>20</width>
-           <height>40</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-       <item row="1" column="0" colspan="2">
-        <widget class="QCheckBox" name="hide_box_check_box">
-         <property name="text">
-          <string>Hide Box</string>
-         </property>
-        </widget>
-       </item>
-       <item row="11" column="0" colspan="4">
-        <spacer name="verticalSpacer_2">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>20</width>
-           <height>40</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-       <item row="14" column="0">
-        <widget class="QLabel" name="entries_size_label">
-         <property name="text">
-          <string>Size</string>
-         </property>
-        </widget>
-       </item>
-       <item row="15" column="2" colspan="2">
+       <item row="13" column="2" colspan="2">
         <widget class="QWidget" name="entries_color_selector_dummy_widget" native="true"/>
        </item>
-       <item row="10" column="2" colspan="2">
-        <widget class="QWidget" name="title_color_selector_dummy_widget" native="true">
-         <property name="sizePolicy">
-          <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-           <horstretch>0</horstretch>
-           <verstretch>0</verstretch>
-          </sizepolicy>
-         </property>
-        </widget>
-       </item>
-       <item row="13" column="0">
+       <item row="11" column="0">
         <widget class="QLabel" name="entries_font_label">
          <property name="text">
           <string>Font</string>
@@ -234,14 +182,14 @@
          </property>
         </spacer>
        </item>
-       <item row="15" column="0">
+       <item row="13" column="0">
         <widget class="QLabel" name="entries_color_label">
          <property name="text">
           <string>Color</string>
          </property>
         </widget>
        </item>
-       <item row="14" column="2" colspan="2">
+       <item row="12" column="2" colspan="2">
         <widget class="QDoubleSpinBox" name="entries_size_spin_box">
          <property name="sizePolicy">
           <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
@@ -251,44 +199,44 @@
          </property>
         </widget>
        </item>
-       <item row="7" column="0">
+       <item row="6" column="0">
         <widget class="QLabel" name="title_label">
          <property name="text">
           <string>Title</string>
          </property>
         </widget>
        </item>
-       <item row="7" column="2" colspan="2">
+       <item row="6" column="2" colspan="2">
         <widget class="QLineEdit" name="title_line_edit"/>
        </item>
-       <item row="8" column="0">
+       <item row="7" column="0">
         <widget class="QLabel" name="label_2">
          <property name="text">
           <string>Font</string>
          </property>
         </widget>
        </item>
-       <item row="10" column="0">
+       <item row="9" column="0">
         <widget class="QLabel" name="label_4">
          <property name="text">
           <string>Color</string>
          </property>
         </widget>
        </item>
-       <item row="9" column="0">
+       <item row="8" column="0">
         <widget class="QLabel" name="label_3">
          <property name="text">
           <string>Size</string>
          </property>
         </widget>
        </item>
-       <item row="8" column="2" colspan="2">
+       <item row="7" column="2" colspan="2">
         <widget class="QComboBox" name="title_font_combo_box"/>
        </item>
-       <item row="9" column="2" colspan="2">
+       <item row="8" column="2" colspan="2">
         <widget class="QDoubleSpinBox" name="title_size_spin_box"/>
        </item>
-       <item row="12" column="0">
+       <item row="10" column="0">
         <widget class="QLabel" name="entries_label">
          <property name="font">
           <font>
@@ -302,10 +250,10 @@
          </property>
         </widget>
        </item>
-       <item row="20" column="2" colspan="2">
+       <item row="17" column="2" colspan="2">
         <widget class="QDoubleSpinBox" name="marker_size_spin_box"/>
        </item>
-       <item row="19" column="0">
+       <item row="16" column="0">
         <widget class="QLabel" name="markers_label">
          <property name="font">
           <font>
diff --git a/qt/python/mantidqt/widgets/plotconfigdialog/legendtabwidget/presenter.py b/qt/python/mantidqt/widgets/plotconfigdialog/legendtabwidget/presenter.py
index 93c6e0ab72db21529d1d121f4c326703fcecf777..169efbb6ae813dbb9b1683d8586bf87f35afaf8a 100644
--- a/qt/python/mantidqt/widgets/plotconfigdialog/legendtabwidget/presenter.py
+++ b/qt/python/mantidqt/widgets/plotconfigdialog/legendtabwidget/presenter.py
@@ -43,8 +43,7 @@ class LegendTabWidgetPresenter:
 
     def init_view(self):
         if int(matplotlib.__version__[0]) < 2:
-            self.view.background_color_selector_widget.setVisible(False)
-            self.view.edge_color_selector_widget.setVisible(False)
+            self.view.hide_box_properties()
 
         """Sets all of the initial values of the input fields when the tab is first loaded"""
         legend_props = LegendProperties.from_legend(self.axes[0].get_legend())
@@ -56,9 +55,10 @@ class LegendTabWidgetPresenter:
         self.view.set_edge_color(legend_props.edge_color)
 
         # Converts alpha value (opacity value between 0 and 1) to transparency percentage.
-        transparency = 100-(legend_props.transparency*100)
-        self.view.set_transparency_spin_box(transparency)
-        self.view.set_transparency_slider(transparency)
+        if int(matplotlib.__version__[0]) > 2:
+            transparency = 100-(legend_props.transparency*100)
+            self.view.set_transparency_spin_box(transparency)
+            self.view.set_transparency_slider(transparency)
         self.view.set_entries_font(legend_props.entries_font)
         self.view.set_entries_size(legend_props.entries_size)
         self.view.set_entries_color(legend_props.entries_color)
diff --git a/qt/python/mantidqt/widgets/plotconfigdialog/legendtabwidget/view.py b/qt/python/mantidqt/widgets/plotconfigdialog/legendtabwidget/view.py
index 74d2623fcb399caeeea5a904ba32d7acf7ee71ed..44e930baad4cf1f5700e100d3abdcde0d3b250cf 100644
--- a/qt/python/mantidqt/widgets/plotconfigdialog/legendtabwidget/view.py
+++ b/qt/python/mantidqt/widgets/plotconfigdialog/legendtabwidget/view.py
@@ -53,6 +53,11 @@ class LegendTabWidgetView(QWidget):
     def get_transparency_spin_box_value(self):
         return self.transparency_spin_box.value()
 
+    def hide_transparency(self):
+        self.transparency_label.setHidden(True)
+        self.transparency_slider.setHidden(True)
+        self.transparency_spin_box.setHidden(True)
+
     def set_title(self, title):
         self.title_line_edit.setText(title)
 
@@ -130,3 +135,12 @@ class LegendTabWidgetView(QWidget):
         advanced_props = self.advanced_options.get_properties()
         props.update(advanced_props)
         return props
+
+    def hide_box_properties(self):
+        self.box_label.setHidden(True)
+        self.hide_box_check_box.setHidden(True)
+        self.background_color_label.setHidden(True)
+        self.background_color_selector_widget.setHidden(True)
+        self.edge_color_label.setHidden(True)
+        self.edge_color_selector_widget.setHidden(True)
+        self.hide_transparency()
diff --git a/qt/python/mantidqt/widgets/workspacedisplay/matrix/table_view_model.py b/qt/python/mantidqt/widgets/workspacedisplay/matrix/table_view_model.py
index 115ec3a3f6322efe1f38e21a9824a9dfd22c7928..508e9f739a1a9439b341ba427a490c0c2a89fd3b 100644
--- a/qt/python/mantidqt/widgets/workspacedisplay/matrix/table_view_model.py
+++ b/qt/python/mantidqt/widgets/workspacedisplay/matrix/table_view_model.py
@@ -22,8 +22,8 @@ class MatrixWorkspaceTableViewModelType(Enum):
 
 
 class MatrixWorkspaceTableViewModel(QAbstractTableModel):
-    HORIZONTAL_HEADER_DISPLAY_STRING = u"{0}\n{1:0.1f}{2}"
-    HORIZONTAL_HEADER_TOOLTIP_STRING = u"index {0}\n{1} {2:0.1f}{3} (bin centre)"
+    HORIZONTAL_HEADER_DISPLAY_STRING = u"{0}\n{1:0.4f}{2}"
+    HORIZONTAL_HEADER_TOOLTIP_STRING = u"index {0}\n{1} {2:0.6f}{3} (bin centre)"
 
     HORIZONTAL_HEADER_DISPLAY_STRING_FOR_X_VALUES = "{0}"
     HORIZONTAL_HEADER_TOOLTIP_STRING_FOR_X_VALUES = "index {0}"
diff --git a/qt/scientific_interfaces/DynamicPDF/DPDFBackgroundRemover.cpp b/qt/scientific_interfaces/DynamicPDF/DPDFBackgroundRemover.cpp
index 2eab1e7a382b9f555aaeffa56c62d68be09ced6a..9064d38947f967af87b1056aa9a944b988eea35f 100644
--- a/qt/scientific_interfaces/DynamicPDF/DPDFBackgroundRemover.cpp
+++ b/qt/scientific_interfaces/DynamicPDF/DPDFBackgroundRemover.cpp
@@ -39,7 +39,8 @@ BackgroundRemover::BackgroundRemover(QWidget *parent)
     : UserSubWindow{parent}, m_sliceSelector(), m_inputDataControl(),
       m_displayControl(), m_fitControl{nullptr}, m_fourierTransform{nullptr} {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Interface", "DynamicPDF->BackgroundRemover", false);
+      Mantid::Kernel::FeatureType::Interface,
+      {"DynamicPDF", "BackgroundRemover"}, false);
 }
 
 /**
diff --git a/qt/scientific_interfaces/DynamicPDF/SliceSelector.cpp b/qt/scientific_interfaces/DynamicPDF/SliceSelector.cpp
index 217672043b3b2a924c77a530d45e3e2942270774..e273ee5130a05d579cc89ae643c5f89141bde4d3 100644
--- a/qt/scientific_interfaces/DynamicPDF/SliceSelector.cpp
+++ b/qt/scientific_interfaces/DynamicPDF/SliceSelector.cpp
@@ -71,7 +71,8 @@ SliceSelector::SliceSelector(QWidget *parent)
       m_loadedWorkspace(), m_selectedWorkspaceIndex{0} {
   this->observePreDelete(true); // Subscribe to notifications
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "DynamicPDF->SliceSelector", false);
+      Mantid::Kernel::FeatureType::Feature, {"DynamicPDF", "SliceSelector"},
+      false);
   this->initLayout();
 }
 
diff --git a/qt/scientific_interfaces/ISISReflectometry/GUI/Event/QtEventView.cpp b/qt/scientific_interfaces/ISISReflectometry/GUI/Event/QtEventView.cpp
index a0b3a9d92d630dffa8013f200fda388a0a0bd844..8fd1df390db72e16a7984189f4217f75a1531465 100644
--- a/qt/scientific_interfaces/ISISReflectometry/GUI/Event/QtEventView.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/GUI/Event/QtEventView.cpp
@@ -194,7 +194,8 @@ void QtEventView::enableSliceTypeSelection() {
 void QtEventView::onToggleUniform(bool isChecked) {
   if (isChecked) {
     Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-        "Feature", "ISIS Reflectometry->EventTab->EnableUniformSlicing", false);
+        Mantid::Kernel::FeatureType::Feature,
+        {"ISIS Reflectometry", "EventTab", "EnableUniformSlicing"}, false);
     m_notifyee->notifySliceTypeChanged(SliceType::Uniform);
   }
 }
@@ -202,8 +203,8 @@ void QtEventView::onToggleUniform(bool isChecked) {
 void QtEventView::onToggleUniformEven(bool isChecked) {
   if (isChecked) {
     Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-        "Feature", "ISIS Reflectometry->EventTab->EnableUniformEvenSlicing",
-        false);
+        Mantid::Kernel::FeatureType::Feature,
+        {"ISIS Reflectometry", "EventTab", "EnableUniformEvenSlicing"}, false);
     m_notifyee->notifySliceTypeChanged(SliceType::UniformEven);
   }
 }
@@ -211,7 +212,8 @@ void QtEventView::onToggleUniformEven(bool isChecked) {
 void QtEventView::onToggleCustom(bool isChecked) {
   if (isChecked) {
     Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-        "Feature", "ISIS Reflectometry->EventTab->EnableCustomSlicing", false);
+        Mantid::Kernel::FeatureType::Feature,
+        {"ISIS Reflectometry", "EventTab", "EnableCustomSlicing"}, false);
     m_notifyee->notifySliceTypeChanged(SliceType::Custom);
   }
 }
@@ -219,8 +221,8 @@ void QtEventView::onToggleCustom(bool isChecked) {
 void QtEventView::onToggleLogValue(bool isChecked) {
   if (isChecked) {
     Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-        "Feature", "ISIS Reflectometry->EventTab->EnableLogValueSlicing",
-        false);
+        Mantid::Kernel::FeatureType::Feature,
+        {"ISIS Reflectometry", "EventTab", "EnableLogValueSlicing"}, false);
     m_notifyee->notifySliceTypeChanged(SliceType::LogValue);
   }
 }
@@ -228,7 +230,8 @@ void QtEventView::onToggleLogValue(bool isChecked) {
 void QtEventView::onToggleDisabledSlicing(bool isChecked) {
   if (isChecked) {
     Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-        "Feature", "ISIS Reflectometry->EventTab->DisableSlicing", false);
+        Mantid::Kernel::FeatureType::Feature,
+        {"ISIS Reflectometry", "EventTab", "DisableSlicing"}, false);
     m_notifyee->notifySliceTypeChanged(SliceType::None);
   }
 }
diff --git a/qt/scientific_interfaces/ISISReflectometry/GUI/Experiment/QtExperimentView.cpp b/qt/scientific_interfaces/ISISReflectometry/GUI/Experiment/QtExperimentView.cpp
index e51d7ed1e25907228075731575bb569cde38b543..ba882e52d94feb0b8e98e2e23524c3ea1b58bd9a 100644
--- a/qt/scientific_interfaces/ISISReflectometry/GUI/Experiment/QtExperimentView.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/GUI/Experiment/QtExperimentView.cpp
@@ -54,7 +54,8 @@ QtExperimentView::QtExperimentView(
 
 void QtExperimentView::onRemovePerThetaDefaultsRequested() {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->ExperimentTab->RemovePerThetaDefaultsRow",
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "ExperimentTab", "RemovePerThetaDefaultsRow"},
       false);
   auto index = m_ui.optionsTable->currentIndex();
   if (index.isValid()) {
@@ -288,7 +289,8 @@ void QtExperimentView::disconnectExperimentSettingsWidgets() {
 
 void QtExperimentView::onRestoreDefaultsRequested() {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->ExperimentTab->RestoreDefaults", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "ExperimentTab", "RestoreDefaults"}, false);
   m_notifyee->notifyRestoreDefaultsRequested();
 }
 
@@ -449,8 +451,8 @@ void QtExperimentView::onPerAngleDefaultsChanged(int row, int column) {
 /** Add a new row to the transmission runs table **/
 void QtExperimentView::onNewPerThetaDefaultsRowRequested() {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->ExperimentTab->AddPerThetaDefaultsRow",
-      false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "ExperimentTab", "AddPerThetaDefaultsRow"}, false);
   m_notifyee->notifyNewPerAngleDefaultsRequested();
 }
 
diff --git a/qt/scientific_interfaces/ISISReflectometry/GUI/Instrument/QtInstrumentView.cpp b/qt/scientific_interfaces/ISISReflectometry/GUI/Instrument/QtInstrumentView.cpp
index aafdd24556fb70d99dc72cd5eb6e7afa90ce7d87..26b2ef3383771fd470f8719fe0c8973a334eac10 100644
--- a/qt/scientific_interfaces/ISISReflectometry/GUI/Instrument/QtInstrumentView.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/GUI/Instrument/QtInstrumentView.cpp
@@ -112,7 +112,8 @@ void QtInstrumentView::onSettingsChanged() {
 
 void QtInstrumentView::onRestoreDefaultsRequested() {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->InstrumentTab->RestoreDefaults", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "InstrumentTab", "RestoreDefaults"}, false);
   m_notifyee->notifyRestoreDefaultsRequested();
 }
 
diff --git a/qt/scientific_interfaces/ISISReflectometry/GUI/MainWindow/QtMainWindowView.cpp b/qt/scientific_interfaces/ISISReflectometry/GUI/MainWindow/QtMainWindowView.cpp
index e6e9238b1c405e2d313c57bd89348af3de7d9f06..e68d8dca0e186db16a430aaab510c656e977e93d 100644
--- a/qt/scientific_interfaces/ISISReflectometry/GUI/MainWindow/QtMainWindowView.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/GUI/MainWindow/QtMainWindowView.cpp
@@ -109,37 +109,43 @@ void QtMainWindowView::initLayout() {
 
 void QtMainWindowView::onTabCloseRequested(int tabIndex) {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->MainWindow->CloseBatch", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "MainWindow", "CloseBatch"}, false);
   m_notifyee->notifyCloseBatchRequested(tabIndex);
 }
 
 void QtMainWindowView::onNewBatchRequested(bool) {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->MainWindow->NewBatch", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "MainWindow", "NewBatch"}, false);
   m_notifyee->notifyNewBatchRequested();
 }
 
 void QtMainWindowView::onLoadBatchRequested(bool) {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->MainWindow->LoadBatch", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "MainWindow", "LoadBatch"}, false);
   m_notifyee->notifyLoadBatchRequested(m_ui.mainTabs->currentIndex());
 }
 
 void QtMainWindowView::onSaveBatchRequested(bool) {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->MainWindow->SaveBatch", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "MainWindow", "SaveBatch"}, false);
   m_notifyee->notifySaveBatchRequested(m_ui.mainTabs->currentIndex());
 }
 
 void QtMainWindowView::onShowOptionsRequested(bool) {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->MainWindow->ShowOptions", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "MainWindow", "ShowOptions"}, false);
   m_notifyee->notifyShowOptionsRequested();
 }
 
 void QtMainWindowView::onShowSlitCalculatorRequested(bool) {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->MainWindow->ShowSlitCalculator", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "MainWindow", "ShowSlitCalculator"}, false);
   m_notifyee->notifyShowSlitCalculatorRequested();
 }
 
@@ -149,7 +155,8 @@ void QtMainWindowView::subscribe(MainWindowSubscriber *notifyee) {
 
 void QtMainWindowView::helpPressed() {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->MainWindow->ShowHelp", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "MainWindow", "ShowHelp"}, false);
   m_notifyee->notifyHelpPressed();
 }
 
diff --git a/qt/scientific_interfaces/ISISReflectometry/GUI/Runs/QtRunsView.cpp b/qt/scientific_interfaces/ISISReflectometry/GUI/Runs/QtRunsView.cpp
index 25245cead0492fa0635d8e9ecb2734bc125f0384..238c1109ff0da0482e6cc4255a6cece44ce6ec91 100644
--- a/qt/scientific_interfaces/ISISReflectometry/GUI/Runs/QtRunsView.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/GUI/Runs/QtRunsView.cpp
@@ -238,7 +238,8 @@ This slot notifies the presenter that the "search" button has been pressed
 */
 void QtRunsView::on_actionSearch_triggered() {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->RunsTab->Search", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "RunsTab", "Search"}, false);
   m_notifyee->notifySearch();
 }
 
@@ -248,7 +249,8 @@ This slot conducts a search operation before notifying the presenter that the
 */
 void QtRunsView::on_actionAutoreduce_triggered() {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->RunsTab->StartAutoprocessing", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "RunsTab", "StartAutoprocessing"}, false);
   m_notifyee->notifyResumeAutoreductionRequested();
 }
 
@@ -258,7 +260,8 @@ This slot conducts a search operation before notifying the presenter that the
 */
 void QtRunsView::on_actionAutoreducePause_triggered() {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->RunsTab->PauseAutoprocessing", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "RunsTab", "PauseAutoprocessing"}, false);
   m_notifyee->notifyPauseAutoreductionRequested();
 }
 
@@ -267,7 +270,8 @@ This slot notifies the presenter that the "transfer" button has been pressed
 */
 void QtRunsView::on_actionTransfer_triggered() {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->RunsTab->Transfer", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "RunsTab", "Transfer"}, false);
   m_notifyee->notifyTransfer();
 }
 
@@ -277,7 +281,8 @@ This slot is triggered when the user right clicks on the search results table
 */
 void QtRunsView::onShowSearchContextMenuRequested(const QPoint &pos) {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->RunsTab->ShowSearchContextMenu", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "RunsTab", "ShowSearchContextMenu"}, false);
   if (!m_ui.tableSearchResults->indexAt(pos).isValid())
     return;
 
@@ -294,7 +299,8 @@ void QtRunsView::onShowSearchContextMenuRequested(const QPoint &pos) {
 void QtRunsView::onInstrumentChanged(int index) {
   UNUSED_ARG(index);
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->RunsTab->InstrumentChanged", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "RunsTab", "InstrumentChanged"}, false);
   m_ui.textSearch->clear();
   m_notifyee->notifyChangeInstrumentRequested();
 }
@@ -368,13 +374,15 @@ int QtRunsView::getLiveDataUpdateInterval() const {
 
 void QtRunsView::on_buttonMonitor_clicked() {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->RunsTab->StartMonitor", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "RunsTab", "StartMonitor"}, false);
   startMonitor();
 }
 
 void QtRunsView::on_buttonStopMonitor_clicked() {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->RunsTab->StopMonitor", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "RunsTab", "StopMonitor"}, false);
   stopMonitor();
 }
 
diff --git a/qt/scientific_interfaces/ISISReflectometry/GUI/RunsTable/QtRunsTableView.cpp b/qt/scientific_interfaces/ISISReflectometry/GUI/RunsTable/QtRunsTableView.cpp
index 1040862ffcfd30057878ab0e061dae6b9e328ff2..bf646821d4fb6a29f16f2aa9159de98a0e8d9034 100644
--- a/qt/scientific_interfaces/ISISReflectometry/GUI/RunsTable/QtRunsTableView.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/GUI/RunsTable/QtRunsTableView.cpp
@@ -87,7 +87,8 @@ void QtRunsTableView::onFilterChanged(QString const &filter) {
 void QtRunsTableView::onInstrumentChanged(int index) {
   UNUSED_ARG(index);
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->RunsTable->InstrumentChanged", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "RunsTable", "InstrumentChanged"}, false);
   m_notifyee->notifyChangeInstrumentRequested();
 }
 
@@ -243,13 +244,15 @@ void QtRunsTableView::onCollapseAllGroupsPressed(bool) {
 
 void QtRunsTableView::onProcessPressed(bool) {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->RunsTable->StartProcessing", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "RunsTable", "StartProcessing"}, false);
   m_notifyee->notifyResumeReductionRequested();
 }
 
 void QtRunsTableView::onPausePressed(bool) {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->RunsTable->PauseProcessing", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "RunsTable", "PauseProcessing"}, false);
   m_notifyee->notifyPauseReductionRequested();
 }
 
@@ -283,13 +286,15 @@ void QtRunsTableView::onPastePressed(bool) {
 
 void QtRunsTableView::onPlotSelectedPressed(bool) {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->RunsTable->PlotRows", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "RunsTable", "PlotRows"}, false);
   m_notifyee->notifyPlotSelectedPressed();
 }
 
 void QtRunsTableView::onPlotSelectedStitchedOutputPressed(bool) {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->RunsTable->PlotGroups", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "RunsTable", "PlotGroups"}, false);
   m_notifyee->notifyPlotSelectedStitchedOutputPressed();
 }
 
diff --git a/qt/scientific_interfaces/ISISReflectometry/GUI/Save/QtSaveView.cpp b/qt/scientific_interfaces/ISISReflectometry/GUI/Save/QtSaveView.cpp
index 7852eb921c957581dc4668aa559673847d03bd06..e9a6753a54072257e143e82d28eb5b2163debc35 100644
--- a/qt/scientific_interfaces/ISISReflectometry/GUI/Save/QtSaveView.cpp
+++ b/qt/scientific_interfaces/ISISReflectometry/GUI/Save/QtSaveView.cpp
@@ -62,18 +62,21 @@ void QtSaveView::browseToSaveDirectory() {
 
 void QtSaveView::onSavePathChanged() {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->SaveTab->SavePathChanged", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "SaveTab", "SavePathChanged"}, false);
   m_notifyee->notifySavePathChanged();
 }
 
 void QtSaveView::onAutosaveChanged(int state) {
   if (state == Qt::CheckState::Checked) {
     Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-        "Feature", "ISIS Reflectometry->SaveTab->EnableAutosave", false);
+        Mantid::Kernel::FeatureType::Feature,
+        {"ISIS Reflectometry", "SaveTab", "EnableAutosave"}, false);
     m_notifyee->notifyAutosaveEnabled();
   } else {
     Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-        "Feature", "ISIS Reflectometry->SaveTab->DisableAutosave", false);
+        Mantid::Kernel::FeatureType::Feature,
+        {"ISIS Reflectometry", "SaveTab", "DisableAutosave"}, false);
     m_notifyee->notifyAutosaveDisabled();
   }
 }
@@ -228,7 +231,8 @@ void QtSaveView::setParametersList(const std::vector<std::string> &logs) const {
  */
 void QtSaveView::populateListOfWorkspaces() const {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->SaveTab->PopulateWorkspaces", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "SaveTab", "PopulateWorkspaces"}, false);
   m_notifyee->notifyPopulateWorkspaceList();
 }
 
@@ -242,7 +246,8 @@ void QtSaveView::filterWorkspaceList() const {
  */
 void QtSaveView::requestWorkspaceParams() const {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->SaveTab->PopulateParameters", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "SaveTab", "PopulateParameters"}, false);
   m_notifyee->notifyPopulateParametersList();
 }
 
@@ -250,7 +255,8 @@ void QtSaveView::requestWorkspaceParams() const {
  */
 void QtSaveView::saveWorkspaces() const {
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "ISIS Reflectometry->SaveTab->SaveWorkspaces", false);
+      Mantid::Kernel::FeatureType::Feature,
+      {"ISIS Reflectometry", "SaveTab", "SaveWorkspaces"}, false);
   m_notifyee->notifySaveSelectedWorkspaces();
 }
 
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.cpp b/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.cpp
index 11893c6bea1f0ad2ed2edd46e97979cc90e77abe..4baf170fa5324cca097ef8b53ceac9a457f79a8f 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.cpp
+++ b/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.cpp
@@ -155,6 +155,9 @@ void IndirectFitAnalysisTab::setFitPropertyBrowser(
     IndirectFitPropertyBrowser *browser) {
   browser->init();
   m_fitPropertyBrowser = browser;
+#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
+  m_fitPropertyBrowser->setFeatures(QDockWidget::NoDockWidgetFeatures);
+#endif
 }
 
 void IndirectFitAnalysisTab::loadSettings(const QSettings &settings) {
diff --git a/qt/widgets/common/inc/MantidQtWidgets/Common/TrackedAction.h b/qt/widgets/common/inc/MantidQtWidgets/Common/TrackedAction.h
index a8b7b67c0b5af92554c30b8b98022ad33f64f8bc..10995997c9ce021b7133a93b540f2ee1404b127a 100644
--- a/qt/widgets/common/inc/MantidQtWidgets/Common/TrackedAction.h
+++ b/qt/widgets/common/inc/MantidQtWidgets/Common/TrackedAction.h
@@ -24,20 +24,20 @@ public:
   TrackedAction(const QIcon &icon, const QString &text, QObject *parent);
   virtual ~TrackedAction() = default;
 
-  void setTrackingName(const std::string &name);
-  std::string getTrackingName() const;
+  void setTrackingName(const std::vector<std::string> &name);
+  std::vector<std::string> getTrackingName() const;
 
   void setIsTracking(const bool enableTracking);
   bool getIsTracking() const;
 
 protected:
-  virtual std::string generateTrackingName() const;
-  virtual void registerUsage(const std::string &name);
+  virtual std::vector<std::string> generateTrackingName() const;
+  virtual void registerUsage(const std::vector<std::string> &name);
 
 private:
   void setupTracking();
   bool m_isTracking;
-  mutable std::string m_trackingName;
+  mutable std::vector<std::string> m_trackingName;
 
 public slots:
   void trackActivation(const bool checked);
diff --git a/qt/widgets/common/src/TrackedAction.cpp b/qt/widgets/common/src/TrackedAction.cpp
index 95bb9fdd5a29e6d5dd348d7fff3f867a62caa1b2..d1d4aa568f1a6b6c4bb680d8cbc68f4de97f7947 100644
--- a/qt/widgets/common/src/TrackedAction.cpp
+++ b/qt/widgets/common/src/TrackedAction.cpp
@@ -42,7 +42,7 @@ TrackedAction::TrackedAction(const QIcon &icon, const QString &text,
 /** Sets the tracking name for this action
  *   @param name the tracking name for this action
  **/
-void TrackedAction::setTrackingName(const std::string &name) {
+void TrackedAction::setTrackingName(const std::vector<std::string> &name) {
   m_trackingName = name;
 }
 
@@ -51,7 +51,7 @@ void TrackedAction::setTrackingName(const std::string &name) {
  *   generateTrackingName
  *   @returns The tracking name for this action
  **/
-std::string TrackedAction::getTrackingName() const {
+std::vector<std::string> TrackedAction::getTrackingName() const {
   if (m_trackingName.empty()) {
     m_trackingName = generateTrackingName();
   }
@@ -79,9 +79,9 @@ void TrackedAction::setupTracking() {
 /** Creates a tracking name from the action text
  *   @returns A generated name using ApplicationName->ActionText
  **/
-std::string TrackedAction::generateTrackingName() const {
-  return QCoreApplication::applicationName().toStdString() + "->" +
-         QAction::text().remove("&").remove(" ").toStdString();
+std::vector<std::string> TrackedAction::generateTrackingName() const {
+  return {QCoreApplication::applicationName().toStdString(),
+          QAction::text().remove("&").remove(" ").toStdString()};
 }
 
 /** Registers the feature usage if usage is enabled
@@ -98,9 +98,10 @@ void TrackedAction::trackActivation(const bool checked) {
 /** Registers the feature usage with the usage service
  *   @param name The name to use when registering usage
  **/
-void TrackedAction::registerUsage(const std::string &name) {
-  Mantid::Kernel::UsageService::Instance().registerFeatureUsage("Feature", name,
-                                                                false);
+void TrackedAction::registerUsage(const std::vector<std::string> &name) {
+  Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
+      Mantid::Kernel::FeatureType::Feature, name, false);
 }
+
 } // namespace MantidWidgets
 } // namespace MantidQt
diff --git a/qt/widgets/common/src/UserSubWindow.cpp b/qt/widgets/common/src/UserSubWindow.cpp
index a3ab7ef1cec6bb429cb9ba9a17a8f6a92ef62f07..07680a424d7bc86f6c38d43e51712c04fb9b899e 100644
--- a/qt/widgets/common/src/UserSubWindow.cpp
+++ b/qt/widgets/common/src/UserSubWindow.cpp
@@ -56,7 +56,7 @@ void UserSubWindow::initializeLayout() {
   m_bIsInitialized = true;
 
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Interface", m_ifacename.toStdString(), false);
+      Mantid::Kernel::FeatureType::Interface, m_ifacename.toStdString(), false);
 }
 
 /**
diff --git a/qt/widgets/common/test/TrackedActionTest.h b/qt/widgets/common/test/TrackedActionTest.h
index fcafa287d85978b3ef27ad0e367979c8b50c6a9e..74206f9703e1e65fad4fef27866c98e05a45f39d 100644
--- a/qt/widgets/common/test/TrackedActionTest.h
+++ b/qt/widgets/common/test/TrackedActionTest.h
@@ -26,13 +26,15 @@ class TrackedActionTest : public CxxTest::TestSuite {
                           QObject *parent)
         : TrackedAction(icon, text, parent), m_lastName(){};
 
-    std::string getLastUsedName() const { return m_lastName; };
+    std::vector<std::string> getLastUsedName() const { return m_lastName; };
 
   protected:
-    void registerUsage(const std::string &name) override { m_lastName = name; };
+    void registerUsage(const std::vector<std::string> &name) override {
+      m_lastName = name;
+    };
 
   private:
-    std::string m_lastName;
+    std::vector<std::string> m_lastName;
   };
 
 public:
@@ -55,12 +57,18 @@ public:
     TestableTrackedAction action(QString::fromStdString("TestName"), &parent);
 
     std::string appNamePrefix =
-        QCoreApplication::applicationName().toStdString() + "->";
+        QCoreApplication::applicationName().toStdString();
 
-    TS_ASSERT_EQUALS(action.getTrackingName(),
-                     appNamePrefix + "TestName"); // default state
-    action.setTrackingName("TestName2");
-    TS_ASSERT_EQUALS(action.getTrackingName(), "TestName2"); // altered state
+    TS_ASSERT_EQUALS(action.getTrackingName().size(), 2);
+    TS_ASSERT_EQUALS(action.getTrackingName()[0],
+                     appNamePrefix);                           // default state
+    TS_ASSERT_EQUALS(action.getTrackingName()[1], "TestName"); // default state
+
+    action.setTrackingName({"TestName2"});
+
+    TS_ASSERT_EQUALS(action.getTrackingName().size(), 1);
+    TS_ASSERT_EQUALS(action.getTrackingName()[0],
+                     "TestName2"); // altered state
   }
 
   void testTrackingCallLogic() {
@@ -68,17 +76,19 @@ public:
     TestableTrackedAction action(QString::fromStdString("TestName"), &parent);
 
     // tracking should be on by default
-    TS_ASSERT_EQUALS(action.getIsTracking(), true); // default state
-    TS_ASSERT_EQUALS(action.getLastUsedName(), ""); // default state
+    TS_ASSERT_EQUALS(action.getIsTracking(), true);           // default state
+    TS_ASSERT_EQUALS(action.getLastUsedName().empty(), true); // default state
 
-    action.setTrackingName("ShouldTrack");
+    action.setTrackingName({"ShouldTrack"});
     action.trigger();
-    TS_ASSERT_EQUALS(action.getLastUsedName(),
+    TS_ASSERT_EQUALS(action.getLastUsedName().size(), 1);
+    TS_ASSERT_EQUALS(action.getLastUsedName()[0],
                      "ShouldTrack"); // tracking occurred state
     action.setIsTracking(false);
-    action.setTrackingName("ShouldNotTrack");
+    action.setTrackingName({"ShouldNotTrack"});
     action.trigger();
-    TS_ASSERT_DIFFERS(action.getLastUsedName(),
+    TS_ASSERT_EQUALS(action.getLastUsedName().size(), 1);
+    TS_ASSERT_DIFFERS(action.getLastUsedName()[0],
                       "ShouldNotTrack"); // Should not have tracked
   }
 };
diff --git a/qt/widgets/sliceviewer/src/LineViewer.cpp b/qt/widgets/sliceviewer/src/LineViewer.cpp
index 8604ae615a0790d948c0cc529945e190a8ca8f7e..e451486e9f1436de3a4637004895bc5e6f761513 100644
--- a/qt/widgets/sliceviewer/src/LineViewer.cpp
+++ b/qt/widgets/sliceviewer/src/LineViewer.cpp
@@ -151,7 +151,7 @@ LineViewer::LineViewer(QWidget *parent)
                    SLOT(onToggleLogYAxis()));
 
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "SliceViewer->LineViewer", false);
+      FeatureType::Feature, {"SliceViewer", "LineViewer"}, false);
 }
 
 LineViewer::~LineViewer() {}
diff --git a/qt/widgets/sliceviewer/src/PeaksViewer.cpp b/qt/widgets/sliceviewer/src/PeaksViewer.cpp
index eb5e92595c5a860ed6e5fca36d6fb7987969d26d..b13be892f96357e208087994c00bcedec35a4bf8 100644
--- a/qt/widgets/sliceviewer/src/PeaksViewer.cpp
+++ b/qt/widgets/sliceviewer/src/PeaksViewer.cpp
@@ -21,7 +21,8 @@ namespace SliceViewer {
 PeaksViewer::PeaksViewer(QWidget *parent) : QWidget(parent) {
   this->setMinimumWidth(500);
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Feature", "SliceViewer->PeaksViewer", false);
+      Mantid::Kernel::FeatureType::Feature, {"SliceViewer", "PeaksViewer"},
+      false);
 }
 
 void PeaksViewer::setPeaksWorkspaces(const SetPeaksWorkspaces & /*unused*/) {}
diff --git a/qt/widgets/sliceviewer/src/SliceViewer.cpp b/qt/widgets/sliceviewer/src/SliceViewer.cpp
index fc81687b3c9d72030699f0720ec09b9a58f633a9..ba4d4665f4e018f11d3124aea0e797d0df3d606f 100644
--- a/qt/widgets/sliceviewer/src/SliceViewer.cpp
+++ b/qt/widgets/sliceviewer/src/SliceViewer.cpp
@@ -210,7 +210,7 @@ SliceViewer::SliceViewer(QWidget *parent)
   m_rescaler = new QwtPlotRescaler(m_plot->canvas());
 
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Interface", "SliceViewer", false);
+      FeatureType::Interface, "SliceViewer", false);
 }
 
 void SliceViewer::updateAspectRatios() {
diff --git a/qt/widgets/spectrumviewer/src/SpectrumView.cpp b/qt/widgets/spectrumviewer/src/SpectrumView.cpp
index 73c51b2d81b1330ce3d59fffb781a2995565528f..861d67e922d7c6da2fc2a9f68e14671fdcf98dec 100644
--- a/qt/widgets/spectrumviewer/src/SpectrumView.cpp
+++ b/qt/widgets/spectrumviewer/src/SpectrumView.cpp
@@ -56,7 +56,7 @@ SpectrumView::SpectrumView(QWidget *parent)
   observePreDelete();
   observeADSClear();
   Mantid::Kernel::UsageService::Instance().registerFeatureUsage(
-      "Interface", "SpectrumView", false);
+      Mantid::Kernel::FeatureType::Interface, "SpectrumView", false);
 
 #ifdef Q_OS_MAC
   // Work around to ensure that floating windows remain on top of the main
diff --git a/scripts/DGSPlanner/DGSPlannerGUI.py b/scripts/DGSPlanner/DGSPlannerGUI.py
index 441c7822349d771515e9ac8ab8e446ad5093893f..17b1e77103e8f018314d18fa2bbcebc655330d47 100644
--- a/scripts/DGSPlanner/DGSPlannerGUI.py
+++ b/scripts/DGSPlanner/DGSPlannerGUI.py
@@ -129,7 +129,7 @@ class DGSPlannerGUI(QtWidgets.QWidget):
         self.progress_canceled = False
 
         # register startup
-        mantid.UsageService.registerFeatureUsage("Interface", "DGSPlanner", False)
+        mantid.UsageService.registerFeatureUsage(mantid.kernel.FeatureType.Interface, "DGSPlanner", False)
 
     @QtCore.Slot(mantid.geometry.OrientedLattice)
     def updateUB(self, ol):
diff --git a/scripts/ExternalInterfaces/CMakeLists.txt b/scripts/ExternalInterfaces/CMakeLists.txt
index 4141eb6acce78ba16622c32d6a0b3a4c19a33930..bf6ee4eb26134164b8a5d52aa3cdade70347d4f5 100644
--- a/scripts/ExternalInterfaces/CMakeLists.txt
+++ b/scripts/ExternalInterfaces/CMakeLists.txt
@@ -8,7 +8,7 @@ externalproject_add(mslice
                     GIT_REPOSITORY
                     "https://github.com/mantidproject/mslice.git"
                     GIT_TAG
-                    73e8e366dd938c05ba1d9cfdb4e37e62f6e1a6cf
+                    c216e8ce9ba3a9804d980b16e4fcd9a0c078632e
                     EXCLUDE_FROM_ALL 1
                     CONFIGURE_COMMAND ""
                     BUILD_COMMAND ""
diff --git a/scripts/FilterEvents/eventFilterGUI.py b/scripts/FilterEvents/eventFilterGUI.py
index da9a8516dc3772953ec25c3c56e38a76ed9c1260..e80159c892f4b91425ce4fc8e8e83373967865da 100644
--- a/scripts/FilterEvents/eventFilterGUI.py
+++ b/scripts/FilterEvents/eventFilterGUI.py
@@ -198,7 +198,7 @@ class MainWindow(QMainWindow):
         self._defaultdir = os.getcwd()
 
         # register startup
-        mantid.UsageService.registerFeatureUsage("Interface", "EventFilter", False)
+        mantid.UsageService.registerFeatureUsage(mantid.kernel.FeatureType.Interface, "EventFilter", False)
 
     def on_mouseDownEvent(self, event):
         """ Respond to pick up a value with mouse down event
diff --git a/scripts/HFIR_4Circle_Reduction/reduce4circleControl.py b/scripts/HFIR_4Circle_Reduction/reduce4circleControl.py
index f0910ab559c416f6ed23effd6779d66aa3522ce8..65fe4d27775875a3809d4372aec77f3f16b6b2f5 100644
--- a/scripts/HFIR_4Circle_Reduction/reduce4circleControl.py
+++ b/scripts/HFIR_4Circle_Reduction/reduce4circleControl.py
@@ -211,7 +211,7 @@ class CWSCDReductionControl(object):
         self._curr_2theta_fwhm_func = None
 
         # register startup
-        mantid.UsageService.registerFeatureUsage("Interface", "4-Circle Reduction", False)
+        mantid.UsageService.registerFeatureUsage(mantid.kernel.FeatureType.Interface, "4-Circle Reduction", False)
 
         # debug mode
         self._debugPrintMode = True
diff --git a/scripts/Interface/reduction_gui/reduction/scripter.py b/scripts/Interface/reduction_gui/reduction/scripter.py
index 3315e21995f5f3948880023d8102d4db55e1773a..394ad98de7b2723ef25c12442c1f397a257192b2 100644
--- a/scripts/Interface/reduction_gui/reduction/scripter.py
+++ b/scripts/Interface/reduction_gui/reduction/scripter.py
@@ -21,7 +21,7 @@ import os
 # Disable unused import warning
 # pylint: disable=W0611
 try:
-    from mantid.kernel import ConfigService, Logger, version_str, UsageService
+    from mantid.kernel import ConfigService, Logger, version_str, UsageService, FeatureType
 
     HAS_MANTID = True
 except (ImportError, ImportWarning):
@@ -413,8 +413,7 @@ class BaseReductionScripter(object):
             config = ConfigService.Instance()
             #register startup
             if HAS_MANTID:
-                UsageService.registerFeatureUsage("Interface",
-                                                  "Reduction_gui:{0:.5}-{1:.10}".format(facility, name),False)
+                UsageService.registerFeatureUsage(FeatureType.Interface, "Reduction_gui:{0:.5}-{1:.10}".format(facility, name), False)
             try:
                 head, _tail = os.path.split(config.getUserFilename())
                 if os.path.isdir(head):
diff --git a/scripts/Interface/ui/reflectometer/refl_gui.py b/scripts/Interface/ui/reflectometer/refl_gui.py
index 8c761e4c749f24d4842966564570f4c835cc4456..37dfb1981900412d87dbeaa66582d5fc6f459a5d 100644
--- a/scripts/Interface/ui/reflectometer/refl_gui.py
+++ b/scripts/Interface/ui/reflectometer/refl_gui.py
@@ -26,7 +26,7 @@ from isis_reflectometry import load_live_runs
 from isis_reflectometry.combineMulti import *
 import mantidqtpython
 from mantid.api import Workspace, WorkspaceGroup, CatalogManager, AlgorithmManager
-from mantid import UsageService
+from mantid import UsageService, FeatureType
 from mantid import logger
 
 from ui.reflectometer.ui_refl_window import Ui_windowRefl
@@ -144,7 +144,7 @@ We recommend you use ISIS Reflectometry instead, If this is not possible contact
 
         del settings
         # register startup
-        UsageService.registerFeatureUsage("Interface", "ISIS Reflectomety", False)
+        UsageService.registerFeatureUsage(FeatureType.Interface, "ISIS Reflectomety", False)
 
     def __del__(self):
         """
diff --git a/scripts/Interface/ui/sans_isis/SANSSaveOtherWindow.py b/scripts/Interface/ui/sans_isis/SANSSaveOtherWindow.py
index 215768b50492e879b6d909ea735eb3f1eb8721c9..dabd7d061ea1dfc655c2044eed5c3a6c3dca06c7 100644
--- a/scripts/Interface/ui/sans_isis/SANSSaveOtherWindow.py
+++ b/scripts/Interface/ui/sans_isis/SANSSaveOtherWindow.py
@@ -10,6 +10,7 @@ from mantidqt.utils.qt import load_ui
 from mantidqt.widgets.workspacewidget import workspacetreewidget
 
 from mantid import UsageService
+from mantid.kernel import FeatureType
 from sans.common.enums import SaveType
 
 from qtpy import PYQT4
@@ -31,7 +32,7 @@ class SANSSaveOtherDialog(QtWidgets.QDialog, Ui_SaveOtherDialog):
         self.subscribers = []
         self.setup_view()
 
-        UsageService.registerFeatureUsage("Feature", "ISIS SANS->Save Other Tab", False)
+        UsageService.registerFeatureUsage(FeatureType.Feature, ["ISIS SANS","Save Other Tab"], False)
 
     def setup_view(self):
         self.setupUi(self)
diff --git a/scripts/Interface/ui/sans_isis/beam_centre.py b/scripts/Interface/ui/sans_isis/beam_centre.py
index 241a15d4a05ae06624a146d7f4cbae732d107c0e..427f5063ba95ca5b36883383c5871febd2557f11 100644
--- a/scripts/Interface/ui/sans_isis/beam_centre.py
+++ b/scripts/Interface/ui/sans_isis/beam_centre.py
@@ -14,6 +14,7 @@ from mantidqt.utils.qt import load_ui
 from mantidqt.widgets import messagedisplay
 
 from mantid import UsageService
+from mantid.kernel import FeatureType
 from sans.gui_logic.gui_common import get_detector_from_gui_selection, \
      get_detector_strings_for_gui, get_string_for_gui_from_reduction_mode
 
@@ -57,7 +58,7 @@ class BeamCentre(QtWidgets.QWidget, Ui_BeamCentre):
 
         # At the moment we only track how many times this is opened, if it's popular
         # we can track individual feature usage at a later date
-        UsageService.registerFeatureUsage("Feature", "ISIS SANS->Beam Centre Tab", False)
+        UsageService.registerFeatureUsage(FeatureType.Feature, ["ISIS SANS","Beam Centre Tab"], False)
 
     def _setup_log_widget(self):
         self.log_widget = messagedisplay.MessageDisplay(parent=self.groupBox_2)
diff --git a/scripts/Interface/ui/sans_isis/sans_data_processor_gui.py b/scripts/Interface/ui/sans_isis/sans_data_processor_gui.py
index da9d25bbe4b4c2d577b67aca2dfe55b647ddfdb9..7fd7aecba1fd1a93de29a81a2d26d217a6233bee 100644
--- a/scripts/Interface/ui/sans_isis/sans_data_processor_gui.py
+++ b/scripts/Interface/ui/sans_isis/sans_data_processor_gui.py
@@ -23,7 +23,7 @@ from mantidqt.utils.qt import load_ui
 from mantidqt.widgets import jobtreeview, manageuserdirectories
 from six import with_metaclass
 
-from mantid.kernel import (Logger, UsageService)
+from mantid.kernel import (Logger, UsageService, FeatureType)
 from reduction_gui.reduction.scripter import execute_script
 from sans.common.enums import (BinningType, ReductionDimensionality, OutputMode, SaveType, SANSInstrument,
                                RangeStepType, ReductionMode, FitType)
@@ -252,7 +252,7 @@ class SANSDataProcessorGui(QMainWindow,
         self._setup_add_runs_page()
 
         # At a later date we can drop new once we confirm the old GUI is not using "ISIS SANS"
-        UsageService.registerFeatureUsage("Interface", "ISIS SANS (new)", False)
+        UsageService.registerFeatureUsage(FeatureType.Interface, "ISIS SANS (new)", False)
 
     def _setup_progress_bar(self):
         self.batch_progress_bar.setMinimum(0)
@@ -491,22 +491,22 @@ class SANSDataProcessorGui(QMainWindow,
         """
         Process runs
         """
-        UsageService.registerFeatureUsage("Feature", "ISIS SANS->Process Selected", False)
+        UsageService.registerFeatureUsage(FeatureType.Feature, ["ISIS SANS","Process Selected"], False)
         self._call_settings_listeners(lambda listener: listener.on_process_selected_clicked())
 
     def _process_all_clicked(self):
         """
         Process All button clicked
         """
-        UsageService.registerFeatureUsage("Feature", "ISIS SANS->Process All", False)
+        UsageService.registerFeatureUsage(FeatureType.Feature, ["ISIS SANS","Process All"], False)
         self._call_settings_listeners(lambda listener: listener.on_process_all_clicked())
 
     def _load_clicked(self):
-        UsageService.registerFeatureUsage("Feature", "ISIS SANS->Load", False)
+        UsageService.registerFeatureUsage(FeatureType.Feature, ["ISIS SANS","Load"], False)
         self._call_settings_listeners(lambda listener: listener.on_load_clicked())
 
     def _export_table_clicked(self):
-        UsageService.registerFeatureUsage("Feature", "ISIS SANS->Export Table", False)
+        UsageService.registerFeatureUsage(FeatureType.Feature, ["ISIS SANS","Export Table"], False)
         self._call_settings_listeners(lambda listener: listener.on_export_table_clicked())
 
     def _processing_finished(self):
@@ -543,23 +543,23 @@ class SANSDataProcessorGui(QMainWindow,
 
     def _remove_rows_requested_from_button(self):
         rows = self.get_selected_rows()
-        UsageService.registerFeatureUsage("Feature", "ISIS SANS->Rows removed button", False)
+        UsageService.registerFeatureUsage(FeatureType.Feature, ["ISIS SANS","Rows removed button"], False)
         self._call_settings_listeners(lambda listener: listener.on_rows_removed(rows))
 
     def _copy_rows_requested(self):
-        UsageService.registerFeatureUsage("Feature", "ISIS SANS->Copy rows button", False)
+        UsageService.registerFeatureUsage(FeatureType.Feature, ["ISIS SANS","Copy rows button"], False)
         self._call_settings_listeners(lambda listener: listener.on_copy_rows_requested())
 
     def _erase_rows(self):
-        UsageService.registerFeatureUsage("Feature", "ISIS SANS->Erase rows button", False)
+        UsageService.registerFeatureUsage(FeatureType.Feature, ["ISIS SANS","Erase rows button"], False)
         self._call_settings_listeners(lambda listener: listener.on_erase_rows())
 
     def _cut_rows(self):
-        UsageService.registerFeatureUsage("Feature", "ISIS SANS->Cut rows button", False)
+        UsageService.registerFeatureUsage(FeatureType.Feature, ["ISIS SANS","Cut rows button"], False)
         self._call_settings_listeners(lambda listener: listener.on_cut_rows())
 
     def _paste_rows_requested(self):
-        UsageService.registerFeatureUsage("Feature", "ISIS SANS->Paste rows button", False)
+        UsageService.registerFeatureUsage(FeatureType.Feature, ["ISIS SANS","Paste rows button"], False)
         self._call_settings_listeners(lambda listener: listener.on_paste_rows_requested())
 
     def _instrument_changed(self):
@@ -596,7 +596,7 @@ class SANSDataProcessorGui(QMainWindow,
 
     def _on_save_can_clicked(self, value):
         self.save_can_checkBox.setChecked(value)
-        UsageService.registerFeatureUsage("Feature", "ISIS SANS->Save Can Toggled", False)
+        UsageService.registerFeatureUsage(FeatureType.Feature, ["ISIS SANS","Save Can Toggled"], False)
         set_setting(self.__generic_settings, self.__save_can_key, value)
 
     def _on_reduction_dimensionality_changed(self, is_1d):
@@ -669,7 +669,7 @@ class SANSDataProcessorGui(QMainWindow,
         Load the batch file
         """
 
-        UsageService.registerFeatureUsage("Feature", "ISIS SANS->Loaded Batch File", False)
+        UsageService.registerFeatureUsage(FeatureType.Feature, ["ISIS SANS","Loaded Batch File"], False)
         load_file(self.batch_line_edit, "*.*", self.__generic_settings, self.__batch_file_key,
                   self.get_batch_file_path)
         self._call_settings_listeners(lambda listener: listener.on_batch_file_load())
@@ -932,12 +932,12 @@ class SANSDataProcessorGui(QMainWindow,
         self._call_settings_listeners(lambda listener: listener.on_mask_file_add())
 
     def _on_multi_period_selection(self):
-        UsageService.registerFeatureUsage("Feature", "ISIS SANS->Multiple Period Toggled", False)
+        UsageService.registerFeatureUsage(FeatureType.Feature, ["ISIS SANS","Multiple Period Toggled"], False)
         self._call_settings_listeners(
             lambda listener: listener.on_multi_period_selection(self.is_multi_period_view()))
 
     def _on_sample_geometry_selection(self):
-        UsageService.registerFeatureUsage("Feature", "ISIS SANS->Sample Geometry Toggled", False)
+        UsageService.registerFeatureUsage(FeatureType.Feature, ["ISIS SANS","Sample Geometry Toggled"], False)
         self._call_settings_listeners(lambda listener: listener.on_sample_geometry_selection(self.is_sample_geometry()))
 
     def _on_manage_directories(self):
diff --git a/scripts/Interface/ui/sans_isis/sans_data_processor_window.ui b/scripts/Interface/ui/sans_isis/sans_data_processor_window.ui
index 50e02ac13df7abe722459709edf2bfcbb120c163..716857a7123ccf2c9272f1e5e8e4ef3664b777e9 100644
--- a/scripts/Interface/ui/sans_isis/sans_data_processor_window.ui
+++ b/scripts/Interface/ui/sans_isis/sans_data_processor_window.ui
@@ -855,6 +855,11 @@ QGroupBox::title {
                          <property name="enabled">
                           <bool>true</bool>
                          </property>
+                         <property name="toolTip">
+                         <string>
+                         &lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;In the case of data which was measured in event-mode, it is possible to perform time-of-flight slices of the data and reduce these separately.&lt;/p&gt;&lt;p&gt;Input can be:&lt;/p&gt;&lt;p&gt;-&lt;span style=&quot; font-style:italic;&quot;&gt; start:step:stop&lt;/span&gt; specifies time slices from the &lt;span style=&quot; font-style:italic;&quot;&gt;start&lt;/span&gt; value to the &lt;span style=&quot; font-style:italic;&quot;&gt;stop &lt;/span&gt;value in steps of &lt;span style=&quot; font-style:italic;&quot;&gt;step&lt;/span&gt;&lt;/p&gt;&lt;p&gt;- &lt;span style=&quot; font-style:italic;&quot;&gt;start-stop &lt;/span&gt;which specifies a time slice from the &lt;span style=&quot; font-style:italic;&quot;&gt;start&lt;/span&gt; value to the &lt;span style=&quot; font-style:italic;&quot;&gt;stop&lt;/span&gt; value&lt;/p&gt;&lt;p&gt;- &lt;span style=&quot; font-style:italic;&quot;&gt;&amp;gt;start&lt;/span&gt; specifies a slice from the &lt;span style=&quot; font-style:italic;&quot;&gt;start &lt;/span&gt;value to the end of the data set&lt;/p&gt;&lt;p&gt;- &lt;span style=&quot; font-style:italic;&quot;&gt;&amp;lt;stop&lt;/span&gt; specifes a slice from the start of the data set to the &lt;span style=&quot; font-style:italic;&quot;&gt;stop &lt;/span&gt;value&lt;/p&gt;&lt;p&gt;In addition it is possible to concatenate these specifications using comma-separation. An example is:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-style:italic;&quot;&gt;5-10,12:2:16,20-30&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;
+                         </string>
+                         </property>
                         </widget>
                        </item>
                        <item row="3" column="0">
diff --git a/scripts/Interface/ui/sans_isis/settings_diagnostic_tab.py b/scripts/Interface/ui/sans_isis/settings_diagnostic_tab.py
index 6c09b538f4c688fc8c2fb0224f562cf01b2c1c06..32a2880d0e879773e143df4e0cdc0ffabba70f89 100644
--- a/scripts/Interface/ui/sans_isis/settings_diagnostic_tab.py
+++ b/scripts/Interface/ui/sans_isis/settings_diagnostic_tab.py
@@ -21,6 +21,7 @@ from six import with_metaclass, PY3
 from mantidqt.utils.qt import load_ui
 
 from mantid import UsageService
+from mantid.kernel import FeatureType
 from sans.gui_logic.gui_common import (GENERIC_SETTINGS, JSON_SUFFIX, load_file)
 
 if PY3:
@@ -70,7 +71,7 @@ class SettingsDiagnosticTab(QtWidgets.QWidget, Ui_SettingsDiagnosticTab):
         self.__generic_settings = GENERIC_SETTINGS
         self.__save_location_path_key = "save_state_location"
 
-        UsageService.registerFeatureUsage("Feature", "ISIS SANS->Settings Diagnostics Tab", False)
+        UsageService.registerFeatureUsage(FeatureType.Feature, ["ISIS SANS","Settings Diagnostics Tab"], False)
 
     def add_listener(self, listener):
         if not isinstance(listener, SettingsDiagnosticTab.SettingsDiagnosticTabListener):
diff --git a/scripts/Muon/GUI/Common/usage_report.py b/scripts/Muon/GUI/Common/usage_report.py
index 1632c21a009c9cec55770f68e0b789316bd13e34..c09b33c061aabf52ca873efdaa69d3f8afb98113 100644
--- a/scripts/Muon/GUI/Common/usage_report.py
+++ b/scripts/Muon/GUI/Common/usage_report.py
@@ -6,9 +6,9 @@
 # SPDX - License - Identifier: GPL - 3.0 +
 from __future__ import (absolute_import, division, unicode_literals)
 
-from mantid.kernel import UsageService
+from mantid.kernel import (UsageService, FeatureType)
 
 
 def report_interface_startup(name):
     #interface startup
-    UsageService.registerFeatureUsage("Interface", name, False)
+    UsageService.registerFeatureUsage(FeatureType.Interface, name, False)
diff --git a/scripts/Muon/GUI/ElementalAnalysis/LoadWidget/load_utils.py b/scripts/Muon/GUI/ElementalAnalysis/LoadWidget/load_utils.py
index 800df655afeaf1aa01efcbd5c1602cc1e16b43f2..0e9d52c5cb3c5d79d44f6bd11fcb4f9e44987f43 100644
--- a/scripts/Muon/GUI/ElementalAnalysis/LoadWidget/load_utils.py
+++ b/scripts/Muon/GUI/ElementalAnalysis/LoadWidget/load_utils.py
@@ -8,13 +8,13 @@ from __future__ import (absolute_import, division, unicode_literals)
 
 import glob
 import os
-
+import numpy as np
 from six import iteritems
-
 from mantid import config
 import mantid.simpleapi as mantid
 
 type_keys = {"10": "Prompt", "20": "Delayed", "99": "Total"}
+spectrum_index = {"Delayed": 1, "Prompt": 2, "Total": 3}
 
 
 class LModel(object):
@@ -38,7 +38,7 @@ class LModel(object):
             for filename in to_load if get_filename(filename, self.run) is not None
         }
         self._load(workspaces)
-        self.loaded_runs[self.run] = group_by_detector(self.run, workspaces.values())
+        self.loaded_runs[self.run] = merge_workspaces(self.run, workspaces.values())
         self.last_loaded_runs.append(self.run)
         return self.loaded_runs[self.run]
 
@@ -68,28 +68,88 @@ def search_user_dirs(run):
     return files
 
 
-def group_by_detector(run, workspaces):
+# merge each detector workspace into one
+def merge_workspaces(run, workspaces):
     """ where workspaces is a tuple of form:
             (filepath, ws name)
     """
     d_string = "{}; Detector {}"
+    # detectors is a dictionary of {detector_name : [names_of_workspaces]}
     detectors = {d_string.format(run, x): [] for x in range(1, 5)}
+    # fill dictionary
     for workspace in workspaces:
         detector_number = get_detector_num_from_ws(workspace)
         detectors[d_string.format(run, detector_number)].append(workspace)
+    # initialise a group workspace
+    tmp = mantid.CreateSampleWorkspace()
+    overall_ws = mantid.GroupWorkspaces(tmp, OutputWorkspace=str(run))
+    # merge each workspace list in dectors into a single workspace
     for detector, workspace_list in iteritems(detectors):
-        mantid.GroupWorkspaces(workspace_list, OutputWorkspace=str(detector))
+        if workspace_list:
+            # sort workspace list according to type_index
+            sorted_workspace_list = [None] * len(workspace_list)
+            # sort workspace list according to type_index
+            for workspace in workspace_list:
+                data_type = workspace.rsplit("_")[1]
+                sorted_workspace_list[spectrum_index[data_type] - 1] = workspace
+            workspace_list = sorted_workspace_list
+            # create merged workspace
+            merged_ws = create_merged_workspace(workspace_list)
+            # add merged ws to ADS
+            mantid.mtd.add(detector, merged_ws)
+            mantid.ConvertToHistogram(InputWorkspace=detector, OutputWorkspace=detector)
+            overall_ws.add(detector)
+
+    mantid.AnalysisDataService.remove("tmp")
+    # return list of [run; Detector detectorNumber], in ascending order of detector number
     detector_list = sorted(list(detectors))
-    group_grouped_workspaces(run, detector_list)
     return detector_list
 
 
-def group_grouped_workspaces(name, workspaces):
-    tmp = mantid.CreateSampleWorkspace()
-    overall = mantid.GroupWorkspaces(tmp, OutputWorkspace=str(name))
-    for workspace in workspaces:
-        overall.add(workspace)
-    mantid.AnalysisDataService.remove("tmp")
+# creates merged workspace, based on workspaces from workspace list
+# returns a merged workspace in point data format.
+def create_merged_workspace(workspace_list):
+    if workspace_list:
+        # get max number of bins and max X range
+        num_workspaces = len(workspace_list)
+        max_num_bins = 0
+        for i in range(0, num_workspaces):
+            ws = mantid.mtd[workspace_list[i]]
+            max_num_bins = max(ws.blocksize(), max_num_bins)
+
+        # create single ws for the merged data, use original ws as a template
+        merged_ws = mantid.WorkspaceFactory.create(mantid.mtd[workspace_list[0]], NVectors=num_workspaces,
+                                                   XLength=max_num_bins, YLength=max_num_bins)
+
+        # create a merged workspace based on every entry from workspace list
+        for i in range(0, num_workspaces):
+            # load in ws
+            ws = mantid.mtd[workspace_list[i]]
+            # check if histogram data, and convert if necessary
+            if ws.isHistogramData():
+                ws = mantid.ConvertToPointData(InputWorkspace=ws.name(), OutputWorkspace=ws.name())
+            # find max x val
+            max_x = np.max(ws.readX(0))
+            # get current number of bins
+            num_bins = ws.blocksize()
+            # pad bins
+            X_padded = np.empty(max_num_bins)
+            X_padded.fill(max_x)
+            X_padded[:num_bins] = ws.readX(0)
+            Y_padded = np.zeros(max_num_bins)
+            Y_padded[:num_bins] = ws.readY(0)
+            E_padded = np.zeros(max_num_bins)
+            E_padded[:num_bins] = ws.readE(0)
+
+            # set row of merged workspace
+            merged_ws.setX(i, X_padded)
+            merged_ws.setY(i, Y_padded)
+            merged_ws.setE(i, E_padded)
+
+            # remove workspace from ADS
+            mantid.AnalysisDataService.remove(ws.getName())
+
+        return merged_ws
 
 
 def get_detector_num_from_ws(name):
diff --git a/scripts/Muon/GUI/ElementalAnalysis/elemental_analysis.py b/scripts/Muon/GUI/ElementalAnalysis/elemental_analysis.py
index e45e66db73228ec0d7be490e644747c2363cc688..4386cc423374c7add6bba3ba2b7bc27dd1ce620f 100644
--- a/scripts/Muon/GUI/ElementalAnalysis/elemental_analysis.py
+++ b/scripts/Muon/GUI/ElementalAnalysis/elemental_analysis.py
@@ -20,6 +20,8 @@ from MultiPlotting.multi_plotting_widget import MultiPlotWindow
 from MultiPlotting.label import Label
 
 from Muon.GUI.ElementalAnalysis.LoadWidget.load_model import LoadModel, CoLoadModel
+from Muon.GUI.ElementalAnalysis.LoadWidget.load_utils import spectrum_index
+
 from Muon.GUI.Common.load_widget.load_view import LoadView
 from Muon.GUI.Common.load_widget.load_presenter import LoadPresenter
 
@@ -177,7 +179,7 @@ class ElementalAnalysisGui(QtWidgets.QMainWindow):
             self.plot_window.closeEvent(event)
         super(ElementalAnalysisGui, self).closeEvent(event)
 
-# general functions
+    # general functions
 
     def _gen_label(self, name, x_value_in, element=None):
         if element is None:
@@ -303,14 +305,16 @@ class ElementalAnalysisGui(QtWidgets.QMainWindow):
     # detectors
     def add_detector_to_plot(self, detector, name):
         self.plotting.add_subplot(detector)
-        for ws in mantid.mtd[name]:
-            ws.setYUnit('Counts')
-            if self.lines.total.isChecked() and 'Total' in ws.getName():
-                self.plotting.plot(detector, ws.getName(), color=self.BLUE)
-            if self.lines.prompt.isChecked() and 'Prompt' in ws.getName():
-                self.plotting.plot(detector, ws.getName(), color=self.ORANGE)
-            if self.lines.delayed.isChecked() and 'Delayed' in ws.getName():
-                self.plotting.plot(detector, ws.getName(), color=self.GREEN)
+        ws = mantid.mtd[name]
+        ws.setYUnit('Counts')
+        # find correct detector number from the workspace group run
+        if self.lines.total.isChecked():
+            self.plotting.plot(detector, ws.getName(), spec_num=spectrum_index["Total"], color=self.BLUE)
+        if self.lines.prompt.isChecked():
+            self.plotting.plot(detector, ws.getName(), spec_num=spectrum_index["Prompt"], color=self.ORANGE)
+        if self.lines.delayed.isChecked():
+            self.plotting.plot(detector, ws.getName(), spec_num=spectrum_index["Delayed"], color=self.GREEN)
+
         # add current selection of lines
         for element in self.ptable.selection:
             self.add_peak_data(element.symbol, detector)
@@ -438,9 +442,9 @@ class ElementalAnalysisGui(QtWidgets.QMainWindow):
         else:
             color = self.GREEN
         for subplot in self.plotting.get_subplots():
-            for ws in mantid.mtd['{}; Detector {}'.format(run, subplot[-1])]:
-                if _type in ws.getName():
-                    self.plotting.plot(subplot, ws.getName(), color=color)
+            name = '{}; Detector {}'.format(run, subplot[-1])
+            ws = mantid.mtd[name]
+            self.plotting.plot(subplot, ws.getName(), spec_num=spectrum_index[_type], color=color)
 
     def remove_line_type(self, run, _type):
         if self.plot_window is None:
@@ -449,18 +453,18 @@ class ElementalAnalysisGui(QtWidgets.QMainWindow):
 
         # Remove the correct line type on all open subplots
         for subplot in self.plotting.get_subplots():
-            for ws in mantid.mtd['{}; Detector {}'.format(run, subplot[-1])]:
-                if _type in ws.getName():
-                    self.plotting.remove_line(subplot, ws.getName())
+            name = '{}; Detector {}'.format(run, subplot[-1])
+            ws = mantid.mtd[name]
+            self.plotting.remove_line(subplot, ws.getName(), spec=spectrum_index[_type])
 
         # If no line type is selected do not allow plotting
         self.uncheck_detectors_if_no_line_plotted()
 
     def uncheck_detectors_if_no_line_plotted(self):
         if not any([
-                self.lines.total.isChecked(),
-                self.lines.prompt.isChecked(),
-                self.lines.delayed.isChecked()
+            self.lines.total.isChecked(),
+            self.lines.prompt.isChecked(),
+            self.lines.delayed.isChecked()
         ]):
             for detector in self.detectors.detectors:
                 detector.setEnabled(False)
diff --git a/scripts/QECoverage.py b/scripts/QECoverage.py
index aea0442ba58cf4adb6d2410cd71702ef3b9fdea0..0e001a36c521fffa1dab417b0dc8e338f3720424 100644
--- a/scripts/QECoverage.py
+++ b/scripts/QECoverage.py
@@ -214,7 +214,7 @@ class QECoverageGUI(QtWidgets.QWidget):
         self.qt_url = 'qthelp://org.sphinx.mantidproject.' + version + '/doc/interfaces/QE Coverage.html'
         self.external_url = 'http://docs.mantidproject.org/nightly/interfaces/QE Coverage.html'
         #register startup
-        mantid.UsageService.registerFeatureUsage("Interface","QECoverage",False)
+        mantid.UsageService.registerFeatureUsage(mantid.kernel.FeatureType.Interface,"QECoverage",False)
 
     def onHelp(self):
         show_interface_help(self.mantidplot_name,
diff --git a/scripts/SANS/sans/gui_logic/models/batch_process_runner.py b/scripts/SANS/sans/gui_logic/models/batch_process_runner.py
index df93a4da5fa5914a5844c5440cd762a69e0b7c24..574d360b88ce90573913e2078dd9d64c62d13e10 100644
--- a/scripts/SANS/sans/gui_logic/models/batch_process_runner.py
+++ b/scripts/SANS/sans/gui_logic/models/batch_process_runner.py
@@ -30,26 +30,39 @@ class BatchProcessRunner(QObject):
         self.notify_done(result)
 
     @Slot()
-    def on_error(self, error):
+    def on_error(self):
         self._worker = None
 
-    def process_states(self, states, use_optimizations, output_mode, plot_results, output_graph, save_can=False):
-        self._worker = Worker(self._process_states_on_thread, states, use_optimizations, output_mode, plot_results,
-                              output_graph, save_can)
+    def process_states(self, rows, get_states_func, get_thickness_for_rows_func, use_optimizations, output_mode, plot_results, output_graph,
+                       save_can=False):
+        self._worker = Worker(self._process_states_on_thread,
+                              get_thickness_for_rows_func=get_thickness_for_rows_func,
+                              rows=rows, get_states_func=get_states_func, use_optimizations=use_optimizations,
+                              output_mode=output_mode, plot_results=plot_results,
+                              output_graph=output_graph, save_can=save_can)
         self._worker.signals.finished.connect(self.on_finished)
         self._worker.signals.error.connect(self.on_error)
 
         QThreadPool.globalInstance().start(self._worker)
 
-    def load_workspaces(self, states):
-        self._worker = Worker(self._load_workspaces_on_thread, states)
+    def load_workspaces(self, selected_rows, get_states_func, get_thickness_for_rows_func):
+
+        self._worker = Worker(self._load_workspaces_on_thread, selected_rows,
+                              get_states_func, get_thickness_for_rows_func)
         self._worker.signals.finished.connect(self.on_finished)
         self._worker.signals.error.connect(self.on_error)
 
         QThreadPool.globalInstance().start(self._worker)
 
-    def _process_states_on_thread(self, states, use_optimizations, output_mode, plot_results, output_graph,
-                                  save_can=False):
+    def _process_states_on_thread(self, rows, get_states_func, get_thickness_for_rows_func, use_optimizations, output_mode, plot_results,
+                                  output_graph, save_can=False):
+        get_thickness_for_rows_func()
+        # The above must finish before we can call get states
+        states, errors = get_states_func(row_index=rows)
+
+        for row, error in errors.items():
+            self.row_failed_signal.emit(row, error)
+
         for key, state in states.items():
             try:
                 out_scale_factors, out_shift_factors = \
@@ -65,7 +78,14 @@ class BatchProcessRunner(QObject):
             except Exception as e:
                 self.row_failed_signal.emit(key, str(e))
 
-    def _load_workspaces_on_thread(self, states):
+    def _load_workspaces_on_thread(self, selected_rows, get_states_func, get_thickness_for_rows_func):
+        get_thickness_for_rows_func()
+        # The above must finish before we can call get states
+        states, errors = get_states_func(row_index=selected_rows)
+
+        for row, error in errors.items():
+            self.row_failed_signal.emit(row, error)
+
         for key, state in states.items():
             try:
                 load_workspaces_from_states(state)
diff --git a/scripts/SANS/sans/gui_logic/models/table_model.py b/scripts/SANS/sans/gui_logic/models/table_model.py
index 43213f8da3daf55dbfb8bb2751b91430c843036a..8da0415785d9737a5f830cd2b017bb7acfff7039 100644
--- a/scripts/SANS/sans/gui_logic/models/table_model.py
+++ b/scripts/SANS/sans/gui_logic/models/table_model.py
@@ -12,14 +12,12 @@ information regarding the custom output name and the information in the options
 
 from __future__ import (absolute_import, division, print_function)
 
-import functools
 import os
 import re
 
 from sans.common.constants import ALL_PERIODS
 from sans.common.enums import RowState, SampleShape
 from sans.common.file_information import SANSFileInformationFactory
-from sans.gui_logic.presenter.create_file_information import create_file_information
 from ui.sans_isis.work_handler import WorkHandler
 
 
@@ -91,9 +89,6 @@ class TableModel(object):
         # Ensure state is created correctly if we have any values
         if table_index_model.sample_scatter:
             table_index_model.file_finding = False
-            create_file_information(table_index_model.sample_scatter, error_callback=lambda *args: None,
-                                    success_callback=lambda *args: None,
-                                    work_handler=self.work_handler, id=table_index_model.id)
 
     def append_table_entry(self, table_index_model):
         table_index_model.id = self._id_count
@@ -154,7 +149,6 @@ class TableModel(object):
     def reset_row_state(self, row):
         self._table_entries[row].update_attribute('row_state', RowState.Unprocessed)
         self._table_entries[row].update_attribute('tool_tip', '')
-        self.notify_subscribers()
 
     def set_row_to_error(self, row, tool_tip):
         self._table_entries[row].update_attribute('row_state', RowState.Error)
@@ -168,16 +162,20 @@ class TableModel(object):
         """
         if not rows:
             rows = range(len(self._table_entries))
+
+        file_information_factory = SANSFileInformationFactory()
         for row in rows:
             entry = self._table_entries[row]
             if entry.is_empty():
                 continue
             entry.file_finding = True
-            success_callback = functools.partial(self.update_thickness_from_file_information, entry.id)
 
-            error_callback = functools.partial(self.failure_handler, entry.id)
-            create_file_information(entry.sample_scatter, error_callback, success_callback,
-                                    self.work_handler, entry.id)
+            try:
+                file_info = file_information_factory.create_sans_file_information(entry.sample_scatter)
+            except RuntimeError:
+                continue
+
+            self.update_thickness_from_file_information(id=entry.id, file_information=file_info)
 
     def failure_handler(self, id, error):
         row = self.get_row_from_id(id)
diff --git a/scripts/SANS/sans/gui_logic/presenter/create_file_information.py b/scripts/SANS/sans/gui_logic/presenter/create_file_information.py
deleted file mode 100644
index d21f8c9eae57dd07c3c03e6d3ee824e57af9e018..0000000000000000000000000000000000000000
--- a/scripts/SANS/sans/gui_logic/presenter/create_file_information.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# Mantid Repository : https://github.com/mantidproject/mantid
-#
-# Copyright &copy; 2018 ISIS Rutherford Appleton Laboratory UKRI,
-#     NScD Oak Ridge National Laboratory, European Spallation Source
-#     & Institut Laue - Langevin
-# SPDX - License - Identifier: GPL - 3.0 +
-
-from sans.gui_logic.presenter.work_handler_listener_wrapper import GenericWorkHandlerListener
-from sans.common.file_information import SANSFileInformationFactory
-
-
-def create_file_information(run_number, error_callback, success_callback, work_handler, id):
-    """
-    The create_sans_file_information() is run in a new thread via the work_handler.
-
-    :param run_number: Argument provided to create_sans_file_information.
-    :param error_callback: Callback for error in create_sans_file_information.
-    :param success_callback: Callback if create_sans_file_information succeeds.
-    :param work_handler: WorkHandler instance.
-    :param id: Identifier for processing.
-    """
-    listener = GenericWorkHandlerListener(error_callback, success_callback)
-    file_information_factory = SANSFileInformationFactory()
-    work_handler.process(listener,
-                         file_information_factory.create_sans_file_information,
-                         id,
-                         run_number)
diff --git a/scripts/SANS/sans/gui_logic/presenter/run_tab_presenter.py b/scripts/SANS/sans/gui_logic/presenter/run_tab_presenter.py
index da016f4519e6f3c63c3c64e26504612d670983ae..87e8b5e23c821b3bd3880d2f82e86c4aab247162 100644
--- a/scripts/SANS/sans/gui_logic/presenter/run_tab_presenter.py
+++ b/scripts/SANS/sans/gui_logic/presenter/run_tab_presenter.py
@@ -540,18 +540,6 @@ class RunTabPresenter(PresenterCommon):
     # Processing
     # ----------------------------------------------------------------------------------------------
 
-    def _handle_get_states(self, rows):
-        """
-        Return the states for the supplied rows, calling on_processing_error for any errors
-        which occur.
-        """
-        states, errors = self.get_states(row_index=rows)
-        error_msg = "\n\n"
-        for row, error in errors.items():
-            self.on_processing_error(row, error)
-            error_msg += "{}\n".format(error)
-        return states, error_msg
-
     def _plot_graph(self):
         """
         Plot a graph if continuous output specified.
@@ -567,21 +555,23 @@ class RunTabPresenter(PresenterCommon):
                 fig.show()
                 self.output_fig = fig
 
-    def _set_progress_bar_min_max(self, min, max):
+    def _set_progress_bar(self, current, number_steps):
         """
         The progress of the progress bar is given by min / max
-        :param min: Current value of the progress bar.
-        :param max: The value at which the progress bar is full
+        :param current: Current value of the progress bar.
+        :param number_steps: The value at which the progress bar is full
         """
-        setattr(self._view, 'progress_bar_value', min)
-        setattr(self._view, 'progress_bar_maximum', max)
+        self.progress = current
+        setattr(self._view, 'progress_bar_value', current)
+        setattr(self._view, 'progress_bar_maximum', number_steps)
 
     def _process_rows(self, rows):
         """
         Processes a list of rows. Any errors cause the row to be coloured red.
         """
-        self._table_model.get_thickness_for_rows(rows=rows)
-        error_msg = ""
+
+        self._set_progress_bar(current=0, number_steps=len(rows))
+
         try:
             # Trip up early if output modes are invalid
             self._validate_output_modes()
@@ -594,19 +584,14 @@ class RunTabPresenter(PresenterCommon):
             self._processing = True
             self.sans_logger.information("Starting processing of batch table.")
 
-            states, error_msg = self._handle_get_states(rows)
-            if not states:
-                raise Exception("No states found")
-
             self._plot_graph()
-            self.progress = 0
-            self._set_progress_bar_min_max(self.progress, len(states))
             save_can = self._view.save_can
 
             # MantidPlot and Workbench have different approaches to plotting
             output_graph = self.output_graph if PYQT4 else self.output_fig
 
-            self.batch_process_runner.process_states(states,
+            self.batch_process_runner.process_states(rows, self.get_states,
+                                                     self._table_model.get_thickness_for_rows,
                                                      self._view.use_optimizations,
                                                      self._view.output_mode,
                                                      self._view.plot_results,
@@ -616,7 +601,7 @@ class RunTabPresenter(PresenterCommon):
         except Exception as e:
             self.on_processing_finished(None)
             self.sans_logger.error("Process halted due to: {}".format(str(e)))
-            self.display_warning_box('Warning', 'Process halted', str(e) + error_msg)
+            self.display_warning_box('Warning', 'Process halted', str(e))
 
     def on_reduction_dimensionality_changed(self, is_1d):
         """
@@ -694,35 +679,24 @@ class RunTabPresenter(PresenterCommon):
         self._processing = False
 
     def on_load_clicked(self):
-        error_msg = "\n\n"
-
-        self._table_model.get_thickness_for_rows()
-
-        try:
-            self._view.disable_buttons()
-            self._processing = True
-            self.sans_logger.information("Starting load of batch table.")
+        self._view.disable_buttons()
+        self._processing = True
+        self.sans_logger.information("Starting load of batch table.")
 
-            selected_rows = self._get_selected_rows()
-            selected_rows = self._table_model.get_non_empty_rows(selected_rows)
-            states, errors = self.get_states(row_index=selected_rows)
-
-            for row, error in errors.items():
-                self.on_processing_error(row, error)
-                error_msg += "{}\n".format(error)
+        selected_rows = self._get_selected_rows()
+        for row in selected_rows:
+            self._table_model.reset_row_state(row)
 
-            if not states:
-                self.on_processing_finished(None)
-                return
+        self._set_progress_bar(current=0, number_steps=len(selected_rows))
+        selected_rows = self._table_model.get_non_empty_rows(selected_rows)
 
-            self.progress = 0
-            setattr(self._view, 'progress_bar_value', self.progress)
-            setattr(self._view, 'progress_bar_maximum', len(states))
-            self.batch_process_runner.load_workspaces(states)
+        try:
+            self.batch_process_runner.load_workspaces(selected_rows=selected_rows, get_states_func=self.get_states,
+                                                      get_thickness_for_rows_func=self._table_model.get_thickness_for_rows)
         except Exception as e:
             self._view.enable_buttons()
             self.sans_logger.error("Process halted due to: {}".format(str(e)))
-            self.display_warning_box("Warning", "Process halted", str(e) + error_msg)
+            self.display_warning_box("Warning", "Process halted", str(e))
 
     @staticmethod
     def _get_filename_to_save(filename):
@@ -959,10 +933,6 @@ class RunTabPresenter(PresenterCommon):
     def _get_selected_rows(self):
         selected_rows = self._view.get_selected_rows()
         selected_rows = selected_rows if selected_rows else range(self._table_model.get_number_of_rows())
-        for row in selected_rows:
-            self._table_model.reset_row_state(row)
-        self.update_view_from_table_model()
-
         return selected_rows
 
     @log_times
diff --git a/scripts/SANS/sans/state/data.py b/scripts/SANS/sans/state/data.py
index 64a0c2ef80527d3340d1894a9d5f18098bc007b4..1930b314b42e2a03b010f1debceb7b8995822728 100644
--- a/scripts/SANS/sans/state/data.py
+++ b/scripts/SANS/sans/state/data.py
@@ -1,6 +1,6 @@
 # Mantid Repository : https://github.com/mantidproject/mantid
 #
-# Copyright &copy; 2018 ISIS Rutherford Appleton Laboratory UKRI,
+# Copyright &copy; 2019 ISIS Rutherford Appleton Laboratory UKRI,
 #     NScD Oak Ridge National Laboratory, European Spallation Source
 #     & Institut Laue - Langevin
 # SPDX - License - Identifier: GPL - 3.0 +
diff --git a/scripts/SANS/sans/user_file/user_file_parser.py b/scripts/SANS/sans/user_file/user_file_parser.py
index 47d059c5929e2da5e9c0d5142cbe0a50f6219ac5..bce1e1da1c9edf74f30d2e85fe761e7c98c22f60 100644
--- a/scripts/SANS/sans/user_file/user_file_parser.py
+++ b/scripts/SANS/sans/user_file/user_file_parser.py
@@ -1391,12 +1391,16 @@ class TransParser(UserFileComponentParser):
 
         dist, monitor = int(split_vars[0]), int(split_vars[1])
 
-        if monitor == 4:
-            return {TransId.spec_4_shift: dist}
-        elif monitor == 5:
+        if monitor == 5:
             return {TransId.spec_5_shift: dist}
+        elif monitor >= 0:
+            # Some instruments (i.e. LOQ) do not have monitor 4 on spectrum 4, as ZOOM
+            # is currently the only one with monitor 5 at spectrum 5 we can make it an edge case
+            # If a future instrument wants to use monitor 5 at a different spectrum number or
+            # uses monitor 4 at spectrum 5 this should be updated
+            return {TransId.spec_4_shift: dist}
         else:
-            raise RuntimeError("The monitor {0} cannot be shifted".format(monitor))
+            raise RuntimeError("Monitor {0} cannot be shifted".format(monitor))
 
     def _extract_trans_spec(self, line):
         trans_spec_string = re.sub(self._trans_spec, "", line)
@@ -1418,11 +1422,14 @@ class TransParser(UserFileComponentParser):
         trans_spec_shift_string = re.sub(" ", "", trans_spec_shift_string)
         trans_spec_shift = convert_string_to_float(trans_spec_shift_string)
 
-        # Pair up the monitor and shift amount
-        if trans_spec == 4:
-            return {TransId.spec_4_shift: trans_spec_shift, TransId.spec: trans_spec}
-        elif trans_spec == 5:
+        if trans_spec == 5:
             return {TransId.spec_5_shift: trans_spec_shift, TransId.spec: trans_spec}
+        elif trans_spec >= 0:
+            # Some instruments (i.e. LOQ) do not have monitor 4 on spectrum 4, as ZOOM
+            # is currently the only one with monitor 5 at spectrum 5 we can make it an edge case
+            # If a future instrument wants to use monitor 5 at a different spectrum number or
+            # uses monitor 4 at spectrum 5 this should be updated
+            return {TransId.spec_4_shift: trans_spec_shift, TransId.spec: trans_spec}
         else:
             raise RuntimeError("Monitor {0} cannot be shifted".format(trans_spec))
 
diff --git a/scripts/TofConverter/converterGUI.py b/scripts/TofConverter/converterGUI.py
index c015658cfdbea9c6fa00ba091a55e9118334cce2..68bb6209cbbf7ddab33f331fb35cd4c92f049359 100644
--- a/scripts/TofConverter/converterGUI.py
+++ b/scripts/TofConverter/converterGUI.py
@@ -92,7 +92,7 @@ class MainWindow(QMainWindow):
         try:
             import mantid
             #register startup
-            mantid.UsageService.registerFeatureUsage("Interface","TofConverter",False)
+            mantid.UsageService.registerFeatureUsage(mantid.kernel.FeatureType.Interface,"TofConverter",False)
         except ImportError:
             pass
 
diff --git a/scripts/test/Muon/elemental_analysis/elemental_analysis_test.py b/scripts/test/Muon/elemental_analysis/elemental_analysis_test.py
index b40ebbe2046fecdadcf90e9b19b80337140f9937..e7b3c7da99b42298bcec0e60f65ab24030606ac4 100644
--- a/scripts/test/Muon/elemental_analysis/elemental_analysis_test.py
+++ b/scripts/test/Muon/elemental_analysis/elemental_analysis_test.py
@@ -17,12 +17,14 @@ from qtpy.QtGui import QCloseEvent
 
 import matplotlib
 from Muon.GUI.ElementalAnalysis.elemental_analysis import ElementalAnalysisGui
+from Muon.GUI.ElementalAnalysis.LoadWidget.load_utils import spectrum_index
 from Muon.GUI.ElementalAnalysis.elemental_analysis import gen_name
 from MultiPlotting.multi_plotting_widget import MultiPlotWindow
 from MultiPlotting.multi_plotting_widget import MultiPlotWidget
 from MultiPlotting.label import Label
 
 
+
 @start_qapplication
 class ElementalAnalysisTest(unittest.TestCase):
     @classmethod
@@ -294,18 +296,15 @@ class ElementalAnalysisTest(unittest.TestCase):
     def test_add_detectors_to_plot_plots_all_given_ws_and_all_selected_elements(
             self, mock_mantid, mock_add_peak_data):
         mock_mantid.mtd = {
-            'name1': [mock.Mock(), mock.Mock(), mock.Mock()],
-            'name2': [mock.Mock(), mock.Mock(), mock.Mock()]
+            'name1': mock.Mock(),
+            'name2': mock.Mock(),
         }
         self.gui.plotting = mock.Mock()
         self.gui.lines = mock.Mock()
         self.gui.lines.total.isChecked.return_value = True
         self.gui.lines.prompt.isChecked.return_value = False
         self.gui.lines.delayed.isChecked.return_value = True
-        mock_mantid.mtd['name1'][0].getName.return_value = 'ws with Total'
-        mock_mantid.mtd['name1'][1].getName.return_value = 'ws with Delayed'
-        mock_mantid.mtd['name1'][2].getName.return_value = 'ws with Prompt'
-
+        mock_mantid.mtd['name1'].getName.return_value = 'Detector 1'
         self.gui.add_detector_to_plot('GE1', 'name1')
         self.assertEqual(self.gui.plotting.add_subplot.call_count, 1)
         self.assertEqual(self.gui.plotting.plot.call_count, 2)
@@ -463,8 +462,8 @@ class ElementalAnalysisTest(unittest.TestCase):
         mock_get_open_file_name.return_value = 'filename'
         mock_generate_element_widgets.side_effect = self.raise_ValueError_once
         self.gui.select_data_file()
-        warning_text = 'The file does not contain correctly formatted data, resetting to default data file.'\
-                       'See "https://docs.mantidproject.org/nightly/interfaces/'\
+        warning_text = 'The file does not contain correctly formatted data, resetting to default data file.' \
+                       'See "https://docs.mantidproject.org/nightly/interfaces/' \
                        'Muon%20Elemental%20Analysis.html" for more information.'
         mock_warning.assert_called_with(warning_text)
 
@@ -554,17 +553,15 @@ class ElementalAnalysisTest(unittest.TestCase):
         self.gui.plot_window = mock.Mock()
         self.gui.plotting.get_subplots.return_value = ['1', '2']
         mock_mantid.mtd = {
-            '2695; Detector 1': [mock.Mock(), mock.Mock()],
-            '2695; Detector 2': [mock.Mock(), mock.Mock()],
-            '2695; Detector 3': [mock.Mock(), mock.Mock()]
+            '2695; Detector 1': mock.Mock(),
+            '2695; Detector 2': mock.Mock(),
+            '2695; Detector 3': mock.Mock()
         }
-        mock_mantid.mtd['2695; Detector 1'][0].getName.return_value = 'det1, ws1 Total'
-        mock_mantid.mtd['2695; Detector 1'][1].getName.return_value = 'det1, ws2'
-        mock_mantid.mtd['2695; Detector 2'][0].getName.return_value = 'det2, ws1'
-        mock_mantid.mtd['2695; Detector 2'][1].getName.return_value = 'det2, ws2 Total'
+        mock_mantid.mtd['2695; Detector 1'].getName.return_value = '2695; Detector 1'
+        mock_mantid.mtd['2695; Detector 2'].getName.return_value = '2695; Detector 2'
         expected_calls = [
-            mock.call('1', 'det1, ws1 Total', color='C0'),
-            mock.call('2', 'det2, ws2 Total', color='C0')
+            mock.call('1', '2695; Detector 1', color='C0',spec_num=spectrum_index['Total']),
+            mock.call('2', '2695; Detector 2', color='C0',spec_num=spectrum_index['Total'])
         ]
         self.gui.add_line_by_type(2695, 'Total')
 
@@ -584,15 +581,14 @@ class ElementalAnalysisTest(unittest.TestCase):
         self.gui.plotting = mock.Mock()
         self.gui.plotting.get_subplots.return_value = ['1', '2']
         mock_mantid.mtd = {
-            '2695; Detector 1': [mock.Mock(), mock.Mock()],
-            '2695; Detector 2': [mock.Mock(), mock.Mock()],
-            '2695; Detector 3': [mock.Mock(), mock.Mock()]
+            '2695; Detector 1': mock.Mock(),
+            '2695; Detector 2': mock.Mock(),
+            '2695; Detector 3': mock.Mock()
         }
-        mock_mantid.mtd['2695; Detector 1'][0].getName.return_value = 'det1, ws1 Total'
-        mock_mantid.mtd['2695; Detector 1'][1].getName.return_value = 'det1, ws2'
-        mock_mantid.mtd['2695; Detector 2'][0].getName.return_value = 'det2, ws1'
-        mock_mantid.mtd['2695; Detector 2'][1].getName.return_value = 'det2, ws2 Total'
-        expected_calls = [mock.call('1', 'det1, ws1 Total'), mock.call('2', 'det2, ws2 Total')]
+        mock_mantid.mtd['2695; Detector 1'].getName.return_value = '2695; Detector 1'
+        mock_mantid.mtd['2695; Detector 2'].getName.return_value = '2695; Detector 2'
+        expected_calls = [mock.call('1', '2695; Detector 1', spec=spectrum_index['Total']),
+                          mock.call('2', '2695; Detector 2', spec=spectrum_index['Total'])]
         self.gui.remove_line_type(2695, 'Total')
 
         self.assertEqual(1, self.gui.plotting.get_subplots.call_count)
diff --git a/scripts/test/Muon/elemental_analysis/lmodel_test.py b/scripts/test/Muon/elemental_analysis/lmodel_test.py
index f292c9641c8274228cf963fcc87f66dd46d9ce13..f3c2bf9b84fcf88ed512f21dcb7e57ce69b82619 100644
--- a/scripts/test/Muon/elemental_analysis/lmodel_test.py
+++ b/scripts/test/Muon/elemental_analysis/lmodel_test.py
@@ -26,14 +26,14 @@ class LModelTest(unittest.TestCase):
         mock_mantid.LoadAscii.assert_has_calls(call_list, any_order=True)
         self.assertEqual(mock_mantid.LoadAscii.call_count, 2)
 
-    @mock.patch('Muon.GUI.ElementalAnalysis.LoadWidget.load_utils.group_by_detector')
+    @mock.patch('Muon.GUI.ElementalAnalysis.LoadWidget.load_utils.merge_workspaces')
     @mock.patch('Muon.GUI.ElementalAnalysis.LoadWidget.load_utils.search_user_dirs')
-    def test_load_run_calls_search_user_dirs(self, mock_search_user_dirs, mock_group):
+    def test_load_run_calls_search_user_dirs(self, mock_search_user_dirs, mock_merged):
         self.model.run = 1234
         self.model.load_run()
 
         self.assertEqual(mock_search_user_dirs.call_count, 1)
-        self.assertEqual(mock_group.call_count, 1)
+        self.assertEqual(mock_merged.call_count, 1)
         mock_search_user_dirs.assert_called_with(1234)
 
     @mock.patch('Muon.GUI.ElementalAnalysis.LoadWidget.load_utils.search_user_dirs')
diff --git a/scripts/test/Muon/elemental_analysis/load_utils_test.py b/scripts/test/Muon/elemental_analysis/load_utils_test.py
index 054f9d49fb833c7bcc307ebaea9dc0f68f5c081a..ac3c157d1f6237516e9bb0ffcab75d190a7aa350 100644
--- a/scripts/test/Muon/elemental_analysis/load_utils_test.py
+++ b/scripts/test/Muon/elemental_analysis/load_utils_test.py
@@ -11,7 +11,7 @@ from Muon.GUI.ElementalAnalysis.LoadWidget import load_utils as lutils
 
 import mantid.simpleapi as mantid
 from mantid import config
-
+import numpy as np
 from six import iteritems
 
 
@@ -70,16 +70,51 @@ class LoadUtilsTest(unittest.TestCase):
         for out, arg in iteritems(tests):
             self.assertEqual(lutils.hyphenise(arg), out)
 
-    def test_group_by_detector(self):
-        output, workspaces = [], []
+    def test_merge_workspaces(self):
+        expected_output, workspaces = [], []
         detectors = range(1, 5)
         for detector in detectors:
             workspace = self.var_ws_name.format(detector, self.test_run)
             workspaces.append(workspace)
-            mantid.CreateSampleWorkspace(OutputWorkspace=workspace).name()
-            output.append("{}; Detector {}".format(self.test_run, detector))
-
-        self.assertEquals(lutils.group_by_detector(self.test_run, workspaces), output)
+            mantid.CreateSampleWorkspace(OutputWorkspace=workspace)
+            expected_output.append("{}; Detector {}".format(self.test_run, detector))
+
+        self.assertEquals(lutils.merge_workspaces(self.test_run, workspaces), sorted(expected_output))
+        # check call works with empty workspace list
+        self.assertEqual(lutils.merge_workspaces(self.test_run, []), sorted(expected_output))
+
+    def test_create_merged_workspace(self):
+        workspace_list = []
+        num_workspaces = 5
+        workspace_names = []
+        num_bins = 100
+        X_data = np.linspace(0, 400, num_bins)
+        # create data in each workspace based on y = mx + specNumber
+        m = 0.1
+        Yfunc = lambda x, specNo: m * x + specNo
+        Efunc = lambda x, specNo: 2 * m * x + specNo
+        for i in range(0, 5):
+            name = "test_" + str(i)
+            workspace_names.append(name)
+            ws = mantid.WorkspaceFactory.create("Workspace2D", NVectors=1,
+                                                XLength=num_bins, YLength=num_bins)
+            mantid.mtd.add(name, ws)
+            Y_data = Yfunc(X_data, i)
+            E_data = Efunc(X_data, i)
+            ws.setY(0, Y_data)
+            ws.setX(0, X_data)
+            ws.setE(0, E_data)
+            workspace_list.append(ws.name())
+
+        merged_ws = lutils.create_merged_workspace(workspace_list)
+        # check number of bins, and number of histograms is correct
+        self.assertEqual(merged_ws.getNumberHistograms(), num_workspaces)
+        self.assertEqual(merged_ws.blocksize(), num_bins)
+        # check that data has been copied over correctly into the new merged workspace
+        for i in range(0, num_workspaces):
+            self.assertTrue(np.array_equal(merged_ws.readX(i), X_data))
+            self.assertTrue(np.array_equal(merged_ws.readY(i), Yfunc(X_data, i)))
+            self.assertTrue(np.array_equal(merged_ws.readE(i), Efunc(X_data, i)))
 
     def test_flatten_run_data(self):
         test_workspaces = [mantid.CreateSampleWorkspace(OutputWorkspace=name) for name in self.test_ws_names]
diff --git a/scripts/test/SANS/gui_logic/CMakeLists.txt b/scripts/test/SANS/gui_logic/CMakeLists.txt
index da25549b30c3c802f814d6b9e9d94bd310176311..62b534b2ccaaaa7e8850222e705ac7c6f7e16296 100644
--- a/scripts/test/SANS/gui_logic/CMakeLists.txt
+++ b/scripts/test/SANS/gui_logic/CMakeLists.txt
@@ -23,8 +23,7 @@ set(TEST_PY_FILES
     diagnostics_page_model_test.py
     create_state_test.py
     batch_process_runner_test.py
-    save_other_presenter_test.py
-    create_file_information_test.py)
+    save_other_presenter_test.py)
 
 check_tests_valid(${CMAKE_CURRENT_SOURCE_DIR} ${TEST_PY_FILES})
 
diff --git a/scripts/test/SANS/gui_logic/batch_process_runner_test.py b/scripts/test/SANS/gui_logic/batch_process_runner_test.py
index dc1611a6b5acffd89e81cea52a9cf94b7d20c83f..d8cb1f8d2b79b7eac45e9c0bca7faa3d6565a824 100644
--- a/scripts/test/SANS/gui_logic/batch_process_runner_test.py
+++ b/scripts/test/SANS/gui_logic/batch_process_runner_test.py
@@ -40,7 +40,18 @@ class BatchProcessRunnerTest(unittest.TestCase):
         self.notify_done.assert_called_once_with()
 
     def test_that_process_states_calls_batch_reduce_for_each_row(self):
-        self.batch_process_runner.process_states(self.states, False, OutputMode.Both, False, '')
+        get_states_mock = mock.MagicMock()
+        states = {0: mock.MagicMock(),
+                  1: mock.MagicMock(),
+                  2: mock.MagicMock()}
+        errors = {}
+        get_states_mock.return_value = states, errors
+
+        self.batch_process_runner.process_states(self.states,
+                                                 get_thickness_for_rows_func=mock.MagicMock,
+                                                 get_states_func=get_states_mock,
+                                                 use_optimizations=False, output_mode=OutputMode.Both,
+                                                 plot_results=False, output_graph='')
         QThreadPool.globalInstance().waitForDone()
 
         self.assertEqual(self.sans_batch_instance.call_count, 3)
@@ -48,7 +59,18 @@ class BatchProcessRunnerTest(unittest.TestCase):
     def test_that_process_states_emits_row_processed_signal_after_each_row(self):
         self.batch_process_runner.row_processed_signal = mock.MagicMock()
         self.batch_process_runner.row_failed_signal = mock.MagicMock()
-        self.batch_process_runner.process_states(self.states, False, OutputMode.Both, False, '')
+        get_states_mock = mock.MagicMock()
+        states = {0: mock.MagicMock(),
+                  1: mock.MagicMock(),
+                  2: mock.MagicMock()}
+        errors = {}
+        get_states_mock.return_value = states, errors
+
+        self.batch_process_runner.process_states(self.states,
+                                                 get_thickness_for_rows_func=mock.MagicMock,
+                                                 get_states_func=get_states_mock,
+                                                 use_optimizations=False, output_mode=OutputMode.Both,
+                                                 plot_results=False, output_graph='')
         QThreadPool.globalInstance().waitForDone()
 
         self.assertEqual(self.batch_process_runner.row_processed_signal.emit.call_count, 3)
@@ -62,10 +84,21 @@ class BatchProcessRunnerTest(unittest.TestCase):
         self.batch_process_runner.row_failed_signal = mock.MagicMock()
         self.sans_batch_instance.side_effect = Exception('failure')
 
-        self.batch_process_runner.process_states(self.states, False, OutputMode.Both, False, '')
+        get_states_mock = mock.MagicMock()
+        states = {0: mock.MagicMock(),
+                  1: mock.MagicMock(),
+                  2: mock.MagicMock()}
+        errors = {}
+        get_states_mock.return_value = states, errors
+
+        self.batch_process_runner.process_states(self.states,
+                                                 get_thickness_for_rows_func=mock.MagicMock,
+                                                 get_states_func=get_states_mock,
+                                                 use_optimizations=False, output_mode=OutputMode.Both,
+                                                 plot_results=False, output_graph='')
         QThreadPool.globalInstance().waitForDone()
 
-        self.assertEqual(self.batch_process_runner.row_failed_signal.emit.call_count, 3)
+        self.assertEqual(3, self.batch_process_runner.row_failed_signal.emit.call_count)
         self.batch_process_runner.row_failed_signal.emit.assert_any_call(0, 'failure')
         self.batch_process_runner.row_failed_signal.emit.assert_any_call(1, 'failure')
         self.batch_process_runner.row_failed_signal.emit.assert_any_call(2, 'failure')
@@ -75,10 +108,21 @@ class BatchProcessRunnerTest(unittest.TestCase):
         self.batch_process_runner.row_processed_signal = mock.MagicMock()
         self.batch_process_runner.row_failed_signal = mock.MagicMock()
 
-        self.batch_process_runner.load_workspaces(self.states)
+        get_thickness_func = mock.MagicMock()
+
+        states = {0: mock.MagicMock(),
+                  1: mock.MagicMock(),
+                  2: mock.MagicMock()}
+        errors = {}
+        get_states_mock = mock.MagicMock()
+        get_states_mock.return_value = states, errors
+
+        self.batch_process_runner.load_workspaces(self.states, get_states_func=get_states_mock,
+                                                  get_thickness_for_rows_func=get_thickness_func)
+
         QThreadPool.globalInstance().waitForDone()
 
-        self.assertEqual(self.batch_process_runner.row_processed_signal.emit.call_count, 3)
+        self.assertEqual(3, self.batch_process_runner.row_processed_signal.emit.call_count)
         self.batch_process_runner.row_processed_signal.emit.assert_any_call(0, [], [])
         self.batch_process_runner.row_processed_signal.emit.assert_any_call(1, [], [])
         self.batch_process_runner.row_processed_signal.emit.assert_any_call(2, [], [])
@@ -89,16 +133,24 @@ class BatchProcessRunnerTest(unittest.TestCase):
         self.batch_process_runner.row_failed_signal = mock.MagicMock()
         self.load_mock.side_effect = Exception('failure')
 
-        self.batch_process_runner.load_workspaces(self.states)
+        get_thickness_func = mock.MagicMock()
+
+        states = None
+        errors = {0: "failure",
+                  1: "failure",
+                  2: "failure"}
+        get_states_mock = mock.MagicMock()
+        get_states_mock.return_value = states, errors
+
+        self.batch_process_runner.load_workspaces(self.states, get_states_func=get_states_mock,
+                                                  get_thickness_for_rows_func=get_thickness_func)
         QThreadPool.globalInstance().waitForDone()
 
-        self.assertEqual(self.batch_process_runner.row_failed_signal.emit.call_count, 3)
+        self.assertEqual(3, self.batch_process_runner.row_failed_signal.emit.call_count)
         self.batch_process_runner.row_failed_signal.emit.assert_any_call(0, 'failure')
         self.batch_process_runner.row_failed_signal.emit.assert_any_call(1, 'failure')
         self.batch_process_runner.row_failed_signal.emit.assert_any_call(2, 'failure')
-        self.assertEqual(self.batch_process_runner.row_processed_signal.emit.call_count, 0)
-
 
 
 if __name__ == '__main__':
-    unittest.main()
\ No newline at end of file
+    unittest.main()
diff --git a/scripts/test/SANS/gui_logic/create_file_information_test.py b/scripts/test/SANS/gui_logic/create_file_information_test.py
deleted file mode 100644
index c4d04f1584e734e2ed41643a71c713893d04bd69..0000000000000000000000000000000000000000
--- a/scripts/test/SANS/gui_logic/create_file_information_test.py
+++ /dev/null
@@ -1,69 +0,0 @@
-# Mantid Repository : https://github.com/mantidproject/mantid
-#
-# Copyright &copy; 2018 ISIS Rutherford Appleton Laboratory UKRI,
-#     NScD Oak Ridge National Laboratory, European Spallation Source
-#     & Institut Laue - Langevin
-# SPDX - License - Identifier: GPL - 3.0 +
-from qtpy.QtCore import QCoreApplication
-import unittest
-
-from mantid.py3compat import mock
-from sans.gui_logic.presenter.create_file_information import create_file_information
-from ui.sans_isis.work_handler import WorkHandler
-
-class CreateFileInformationTest(unittest.TestCase):
-    def setUp(self):
-        self.success_callback = mock.MagicMock()
-        self.success_callback_1 = mock.MagicMock()
-        self.error_callback = mock.MagicMock()
-        self.work_handler = WorkHandler()
-        self.qApp = QCoreApplication(['test_app'])
-
-    def test_retieves_file_information_and_passes_to_callback(self):
-        create_file_information('LOQ74044', self.error_callback, self.success_callback, self.work_handler, 0)
-        self.work_handler.wait_for_done()
-        self.qApp.processEvents()
-
-        self.assertEqual(self.success_callback.call_count, 1)
-        self.assertEqual(self.error_callback.call_count, 0)
-
-    def test_that_retrieved_file_information_is_correct(self):
-        create_file_information('LOQ74044', self.error_callback, self.success_callback, self.work_handler, 0)
-        self.work_handler.wait_for_done()
-        self.qApp.processEvents()
-
-        file_information = self.success_callback.call_args[0][0]
-        self.assertEqual(file_information.is_event_mode(), False)
-        self.assertEqual(file_information.get_run_number(), 74044)
-        self.assertEqual(file_information.get_thickness(), 1.0)
-
-    def test_that_multiple_threading_calls_at_once_are_handled_cleanly(self):
-        create_file_information('LOQ74044', self.error_callback, self.success_callback, self.work_handler, 0)
-        create_file_information('LOQ74044', self.error_callback, self.success_callback_1, self.work_handler, 0)
-        create_file_information('LOQ74044', self.error_callback, self.success_callback_1, self.work_handler, 1)
-        create_file_information('LOQ74044', self.error_callback, self.success_callback_1, self.work_handler, 0)
-        create_file_information('LOQ74044', self.error_callback, self.success_callback_1, self.work_handler, 2)
-        self.work_handler.wait_for_done()
-        self.qApp.processEvents()
-
-        self.assertEqual(self.success_callback.call_count, 0)
-        self.assertEqual(self.success_callback_1.call_count, 3)
-        self.assertEqual(self.error_callback.call_count, 0)
-
-    @mock.patch('sans.gui_logic.presenter.create_file_information.SANSFileInformationFactory')
-    def test_that_error_callback_is_called_on_error_with_correct_message(self, file_information_factory_mock):
-        file_information_factory_instance = mock.MagicMock()
-        file_information_factory_instance.create_sans_file_information.side_effect = RuntimeError('File Error')
-        file_information_factory_mock.return_value = file_information_factory_instance
-
-        create_file_information('LOQ74044', self.error_callback, self.success_callback, self.work_handler, 0)
-        self.work_handler.wait_for_done()
-        self.qApp.processEvents()
-
-        self.success_callback.assert_called_once_with(None)
-        self.assertEqual(self.error_callback.call_count, 1)
-        self.assertEqual(str(self.error_callback.call_args[0][0][1]), 'File Error')
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/scripts/test/SANS/gui_logic/run_tab_presenter_test.py b/scripts/test/SANS/gui_logic/run_tab_presenter_test.py
index 9a589b4a1a23c496f1968325f383e7d0fdb76519..c10b5cc782f5904999a58e4da97397ea558eebba 100644
--- a/scripts/test/SANS/gui_logic/run_tab_presenter_test.py
+++ b/scripts/test/SANS/gui_logic/run_tab_presenter_test.py
@@ -87,10 +87,6 @@ class RunTabPresenterTest(unittest.TestCase):
         self.addCleanup(self.os_patcher.stop)
         self.osMock = self.os_patcher.start()
 
-        self.thickness_patcher = mock.patch('sans.gui_logic.models.table_model.create_file_information')
-        self.addCleanup(self.thickness_patcher.stop)
-        self.thickness_patcher.start()
-
     def test_that_will_load_user_file(self):
         # Setup presenter and mock view
         user_file_path = create_user_file(sample_user_file)
@@ -867,6 +863,16 @@ class RunTabPresenterTest(unittest.TestCase):
         self.assertEqual(presenter.progress, 1)
         self.assertEqual(presenter._view.progress_bar_value, 1)
 
+    def test_that_update_progress_sets_correctly(self):
+        presenter = RunTabPresenter(SANSFacility.ISIS)
+        view = mock.MagicMock()
+        presenter.set_view(view)
+
+        presenter._set_progress_bar(current=100, number_steps=200)
+        self.assertEqual(presenter.progress, 100)
+        self.assertEqual(view.progress_bar_value, 100)
+        self.assertEqual(view.progress_bar_maximum, 200)
+
     def test_that_notify_progress_updates_state_and_tooltip_of_row(self):
         presenter = RunTabPresenter(SANSFacility.ISIS)
         view = mock.MagicMock()
@@ -901,6 +907,8 @@ class RunTabPresenterTest(unittest.TestCase):
         presenter = RunTabPresenter(SANSFacility.ISIS)
         view = mock.MagicMock()
         view.get_selected_rows = mock.MagicMock(return_value=[0, 3, 4])
+        # Suppress plots
+        view.plot_results = False
         
         presenter.set_view(view)
         presenter._table_model.reset_row_state = mock.MagicMock()
@@ -936,6 +944,9 @@ class RunTabPresenterTest(unittest.TestCase):
         presenter = RunTabPresenter(SANSFacility.ISIS)
         view = mock.MagicMock()
         view.get_selected_rows = mock.MagicMock(return_value=[0, 3, 4])
+
+        # Suppress plots
+        view.plot_results = False
         
         presenter._table_model.get_number_of_rows = mock.MagicMock(return_value=7)
         presenter.set_view(view)
diff --git a/scripts/test/SANS/gui_logic/table_model_test.py b/scripts/test/SANS/gui_logic/table_model_test.py
index 4213241bafc4bf9e01731063244d4e151d5de0ee..1c04a05075ac072be6ca1f102b97010485f94102 100644
--- a/scripts/test/SANS/gui_logic/table_model_test.py
+++ b/scripts/test/SANS/gui_logic/table_model_test.py
@@ -16,11 +16,6 @@ from sans.common.enums import (RowState, SampleShape)
 
 
 class TableModelTest(unittest.TestCase):
-    def setUp(self):
-        self.thickness_patcher = mock.patch('sans.gui_logic.models.table_model.create_file_information')
-        self.addCleanup(self.thickness_patcher.stop)
-        self.thickness_patcher.start()
-
     def test_user_file_can_be_set(self):
         self._do_test_file_setting(self._user_file_wrapper, "user_file")
 
@@ -375,24 +370,6 @@ class TableModelThreadingTest(unittest.TestCase):
     def setUpClass(cls):
         cls.qApp = QCoreApplication(['test_app'])
 
-    @mock.patch('sans.gui_logic.presenter.create_file_information.SANSFileInformationFactory')
-    def test_that_get_thickness_for_row_handles_errors_correctly(self, file_information_factory_mock):
-        # self.thickness_patcher.stop()
-        file_information_factory_instance = mock.MagicMock()
-        file_information_factory_instance.create_sans_file_information.side_effect = RuntimeError('File Error')
-        file_information_factory_mock.return_value = file_information_factory_instance
-        table_model = TableModel()
-        table_index_model = TableIndexModel("00000", "", "", "", "", "", "",
-                                            "", "", "", "", "", "")
-        table_model.add_table_entry(0, table_index_model)
-
-        table_model.get_thickness_for_rows()
-        table_model.work_handler.wait_for_done()
-        self.qApp.processEvents()
-
-        self.assertEqual(table_index_model.tool_tip, 'File Error')
-        self.assertEqual(table_index_model.row_state, RowState.Error)
-
     def test_that_get_thickness_for_rows_updates_table_correctly(self):
         table_model = TableModel()
         table_index_model = TableIndexModel("LOQ74044", "", "", "", "", "", "",
diff --git a/scripts/test/SANS/user_file/user_file_parser_test.py b/scripts/test/SANS/user_file/user_file_parser_test.py
index 609b807bd81be4d7c4e8f508afe2d1d943f3bb71..5b618fddb8c7edd94dc7d47df0e4b16579d4a9b1 100644
--- a/scripts/test/SANS/user_file/user_file_parser_test.py
+++ b/scripts/test/SANS/user_file/user_file_parser_test.py
@@ -597,24 +597,27 @@ class TransParserTest(unittest.TestCase):
                           "TRANS/ SHIFT=4000 5": {TransId.spec_5_shift: 4000},
                           "TRANS /SHIFT=4000 5": {TransId.spec_5_shift: 4000},
                           "TRANS/SHIFT=4000      5": {TransId.spec_5_shift: 4000},
+                          # An unrecognised monitor position (i.e. not 5) should be considered as 4
+                          # see source code for details
+                          "TRANS/SHIFT=1000 12": {TransId.spec_4_shift: 1000},
+                          "TRANS/SHIFT=4000 =12": {TransId.spec_4_shift: 4000},
+                          "TRANS/SHIFT=4000 =1": {TransId.spec_4_shift: 4000},
+                          "TRANS/SHIFT4000 120": {TransId.spec_4_shift: 4000},
+                          "TRANS/SHIFT 4000 999": {TransId.spec_4_shift: 4000},
                           }
 
-        invalid_settings = {"TRANS/SHIFT=1000 12": RuntimeError,
+        invalid_settings = {
                             "TRANS/SHIFT=4000 -1" : RuntimeError,
                             "TRANS/SHIFT+4000 -1": RuntimeError,
                             "TRANS/TRANSSHIFT=4000 -1": RuntimeError,
                             "TRANS/SHIFTAab=4000 -1": RuntimeError,
                             "TRANS/SHIF=4000 1": RuntimeError,
                             "TRANS/SHIFT4000": RuntimeError,
-                            "TRANS/SHIFT4000 1": RuntimeError,
-                            "TRANS/SHIFT 4000 1": RuntimeError,
                             "TRANS/SHIFT 1": RuntimeError,
                             "TRANS/SHIFT 4000": RuntimeError,
                             "TRANS/SHIFT=4000": RuntimeError,
                             "TRANS/SHIFT=4000 a": RuntimeError,
-                            "TRANS/SHIFT=4000 =12": RuntimeError,
-                            "TRANS/SHIFT=4000 =1": RuntimeError,
-        }
+                            }
 
         trans_parser = TransParser()
         do_test(trans_parser, valid_settings, invalid_settings, self.assertTrue, self.assertRaises)
@@ -622,11 +625,11 @@ class TransParserTest(unittest.TestCase):
     def test_that_trans_spec_shift_is_parsed_correctly(self):
         valid_settings = {"TRANS/TRANSPEC=4/SHIFT=23": {TransId.spec_4_shift: 23, TransId.spec: 4},
                           "TRANS/TRANSPEC =4/ SHIFT = 23": {TransId.spec_4_shift: 23, TransId.spec: 4},
+                          "TRANS/TRANSPEC =900/ SHIFT = 23": {TransId.spec_4_shift: 23, TransId.spec: 900},
 
                           }
 
         invalid_settings = {
-                            "TRANS/TRANSPEC =6/ SHIFT = 23": RuntimeError,
                             "TRANS/TRANSPEC=4/SHIFT/23": RuntimeError,
                             "TRANS/TRANSPEC=4/SHIFT 23": RuntimeError,
                             "TRANS/TRANSPEC/SHIFT=23": RuntimeError,