diff --git a/qt/scientific_interfaces/Indirect/CMakeLists.txt b/qt/scientific_interfaces/Indirect/CMakeLists.txt
index 29a677f9460915f2a9dedb9a196dba7cb9bace8b..351eeed04434a54ec2358e457c5c3b5f3d22a82d 100644
--- a/qt/scientific_interfaces/Indirect/CMakeLists.txt
+++ b/qt/scientific_interfaces/Indirect/CMakeLists.txt
@@ -24,7 +24,7 @@ set(
   IndirectBayesTab.cpp
   IndirectCorrections.cpp
   IndirectDataAnalysis.cpp
-  IndirectDataAnalysisTabLegacy.cpp
+  IndirectDataAnalysisTab.cpp
   IndirectDataAnalysisTab.cpp
   IndirectDataReduction.cpp
   IndirectDataReductionTab.cpp
@@ -86,6 +86,9 @@ set(
   IqtFit.cpp
   IqtFitModel.cpp
   IndirectFitPropertyBrowser.cpp
+  IndirectFunctionBrowser/IqtFunctionModel.cpp
+  IndirectFunctionBrowser/IqtTemplateBrowser.cpp
+  IndirectFunctionBrowser/IqtTemplatePresenter.cpp
   JumpFit.cpp
   JumpFitAddWorkspaceDialog.cpp
   JumpFitDataPresenter.cpp
@@ -155,7 +158,7 @@ set(
   IndirectBayesTab.h
   IndirectCorrections.h
   IndirectDataAnalysis.h
-  IndirectDataAnalysisTabLegacy.h
+  IndirectDataAnalysisTab.h
   IndirectDataAnalysisTab.h
   IndirectDataReduction.h
   IndirectDataReductionTab.h
@@ -201,6 +204,8 @@ set(
   IndirectTransmissionCalc.h
   IndirectTransmission.h
   IqtFit.h
+  IndirectFunctionBrowser/IqtTemplateBrowser.h
+  IndirectFunctionBrowser/IqtTemplatePresenter.h
   IndirectFitPropertyBrowser.h
   Iqt.h
   ISISCalibration.h
diff --git a/qt/scientific_interfaces/Indirect/Elwin.cpp b/qt/scientific_interfaces/Indirect/Elwin.cpp
index c610dd8d7a0da60fa0a247af6fb9ee66925939fb..e12264f41ac6dbdbb8959e5b4ce4f5d9ed7cd1ed 100644
--- a/qt/scientific_interfaces/Indirect/Elwin.cpp
+++ b/qt/scientific_interfaces/Indirect/Elwin.cpp
@@ -101,7 +101,7 @@ namespace MantidQt {
 namespace CustomInterfaces {
 namespace IDA {
 Elwin::Elwin(QWidget *parent)
-    : IndirectDataAnalysisTabLegacy(parent), m_elwTree(nullptr) {
+    : IndirectDataAnalysisTab(parent), m_elwTree(nullptr) {
   m_uiForm.setupUi(parent);
   setOutputPlotOptionsPresenter(std::make_unique<IndirectPlotOptionsPresenter>(
       m_uiForm.ipoPlotOptions, this, PlotWidget::Spectra));
@@ -504,8 +504,8 @@ void Elwin::newPreviewFileSelected(int index) {
  * Replots the preview plot.
  */
 void Elwin::plotInput() {
-  IndirectDataAnalysisTabLegacy::plotInput(m_uiForm.ppPlot);
-  IndirectDataAnalysisTabLegacy::updatePlotRange("ElwinIntegrationRange",
+  IndirectDataAnalysisTab::plotInput(m_uiForm.ppPlot);
+  IndirectDataAnalysisTab::updatePlotRange("ElwinIntegrationRange",
                                            m_uiForm.ppPlot, "IntegrationStart",
                                            "IntegrationEnd");
 
diff --git a/qt/scientific_interfaces/Indirect/Elwin.h b/qt/scientific_interfaces/Indirect/Elwin.h
index f977a97904f64a451144e324f66c78cd7e5eeb27..313c5c0b4a215887444466e9af80fb1343c0bbd0 100644
--- a/qt/scientific_interfaces/Indirect/Elwin.h
+++ b/qt/scientific_interfaces/Indirect/Elwin.h
@@ -7,14 +7,14 @@
 #ifndef MANTIDQTCUSTOMINTERFACESIDA_ELWIN_H_
 #define MANTIDQTCUSTOMINTERFACESIDA_ELWIN_H_
 
-#include "IndirectDataAnalysisTabLegacy.h"
+#include "IndirectDataAnalysisTab.h"
 #include "MantidAPI/MatrixWorkspace_fwd.h"
 #include "ui_Elwin.h"
 
 namespace MantidQt {
 namespace CustomInterfaces {
 namespace IDA {
-class DLLExport Elwin : public IndirectDataAnalysisTabLegacy {
+class DLLExport Elwin : public IndirectDataAnalysisTab {
   Q_OBJECT
 
 public:
diff --git a/qt/scientific_interfaces/Indirect/IIndirectFitPlotViewLegacy.h b/qt/scientific_interfaces/Indirect/IIndirectFitPlotViewLegacy.h
index 4902cae02b7aba4b355a538df5659817305aa823..1e3ac24fe916fde529eddbf8df057217d5297280 100644
--- a/qt/scientific_interfaces/Indirect/IIndirectFitPlotViewLegacy.h
+++ b/qt/scientific_interfaces/Indirect/IIndirectFitPlotViewLegacy.h
@@ -4,8 +4,8 @@
 //     NScD Oak Ridge National Laboratory, European Spallation Source
 //     & Institut Laue - Langevin
 // SPDX - License - Identifier: GPL - 3.0 +
-#ifndef MANTIDQTCUSTOMINTERFACESIDA_IINDIRECTFITPLOTVIEW_H_
-#define MANTIDQTCUSTOMINTERFACESIDA_IINDIRECTFITPLOTVIEW_H_
+#ifndef MANTIDQTCUSTOMINTERFACESIDA_IINDIRECTFITPLOTVIEWLEGACY_H_
+#define MANTIDQTCUSTOMINTERFACESIDA_IINDIRECTFITPLOTVIEWLEGACY_H_
 
 #include "DllConfig.h"
 #include "MantidAPI/MatrixWorkspace.h"
diff --git a/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.cpp b/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.cpp
index ef30ddbe7e89f0bcbd1cf1078003e3af84b7c12e..82f06aa89d30e1feebf26687bbc544d31e31c4ff 100644
--- a/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.cpp
+++ b/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.cpp
@@ -124,9 +124,7 @@ void IndirectDataAnalysis::loadSettings() {
 /**
  * Sets the active workspace in the selected tab
  */
-void IndirectDataAnalysis::tabChanged(int index) {
-  m_tabs[index]->setActiveWorkspace();
-}
+void IndirectDataAnalysis::tabChanged(int index) {}
 
 std::string IndirectDataAnalysis::documentationPage() const {
   return "Indirect Data Analysis";
diff --git a/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.h b/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.h
index 30abd378afc2f81c5cd5a326452a54be4539c725..2b34cec3e484f258d0bba8f68c16cd75b1c4f704 100644
--- a/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.h
+++ b/qt/scientific_interfaces/Indirect/IndirectDataAnalysis.h
@@ -30,20 +30,20 @@ enum IDATabChoice { ELWIN, MSD_FIT, IQT, IQT_FIT, CONV_FIT, JUMP_FIT };
 static const unsigned int NUM_DECIMALS = 6;
 
 // Forward Declaration
-class IndirectDataAnalysisTabLegacy;
+class IndirectDataAnalysisTab;
 
 /**
  * The IndirectDataAnalysis class is the main class that handles the interface
  *and controls
  * its tabs.
  *
- * Is a friend to the IndirectDataAnalysisTabLegacy class.
+ * Is a friend to the IndirectDataAnalysisTab class.
  */
 class IndirectDataAnalysis : public IndirectInterface {
   Q_OBJECT
 
-  /// Allow IndirectDataAnalysisTabLegacy to have access.
-  friend class IndirectDataAnalysisTabLegacy;
+  /// Allow IndirectDataAnalysisTab to have access.
+  friend class IndirectDataAnalysisTab;
 
 public:
   /// The name of the interface as registered into the factory
@@ -93,7 +93,7 @@ private:
       m_changeObserver;
 
   /// Map of unsigned int (TabChoice enum values) to tabs.
-  std::map<unsigned int, IndirectDataAnalysisTabLegacy *> m_tabs;
+  std::map<unsigned int, IndirectDataAnalysisTab *> m_tabs;
 };
 } // namespace IDA
 } // namespace CustomInterfaces
diff --git a/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTab.h b/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTab.h
index 06412a089f6258eb22dfa9a9b5b1d680e0501fbc..3dfc281d8ccac58068649dbcc9696dcfd17a1e93 100644
--- a/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTab.h
+++ b/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTab.h
@@ -4,8 +4,8 @@
 //     NScD Oak Ridge National Laboratory, European Spallation Source
 //     & Institut Laue - Langevin
 // SPDX - License - Identifier: GPL - 3.0 +
-#ifndef MANTIDQTCUSTOMINTERFACESIDA_IDATAB_H_
-#define MANTIDQTCUSTOMINTERFACESIDA_IDATAB_H_
+#ifndef MANTIDQTCUSTOMINTERFACESIDA_IDATABLEGACY_H_
+#define MANTIDQTCUSTOMINTERFACESIDA_IDATABLEGACY_H_
 
 #include "IndirectDataAnalysis.h"
 #include "IndirectPlotOptionsPresenter.h"
@@ -162,6 +162,7 @@ private:
   /// Overidden by child class.
   virtual void loadSettings(const QSettings &settings) = 0;
   virtual void setFileExtensionsByName(bool filter) = 0;
+  virtual void setBrowserWorkspace() {};
 
   /// A pointer to the parent (friend) IndirectDataAnalysis object.
   IndirectDataAnalysis *m_parent;
@@ -177,4 +178,4 @@ private:
 } // namespace CustomInterfaces
 } // namespace MantidQt
 
-#endif /* MANTIDQTCUSTOMINTERFACESIDA_IDATAB_H_ */
+#endif /* MANTIDQTCUSTOMINTERFACESIDA_IDATABLEGACY_H_ */
diff --git a/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTabLegacy.cpp b/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTabLegacy.cpp
index 3502dfc81cac24d57cc758925d91e64242bc16e6..15c8096f5bd80e80cda9df0184d5789f81c20a06 100644
--- a/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTabLegacy.cpp
+++ b/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTabLegacy.cpp
@@ -4,7 +4,7 @@
 //     NScD Oak Ridge National Laboratory, European Spallation Source
 //     & Institut Laue - Langevin
 // SPDX - License - Identifier: GPL - 3.0 +
-#include "IndirectDataAnalysisTabLegacy.h"
+#include "IndirectDataAnalysisTab.h"
 
 #include "MantidAPI/AnalysisDataService.h"
 #include "MantidAPI/FunctionDomain1D.h"
@@ -28,7 +28,7 @@ namespace IDA {
  *
  * @param parent :: the parent widget (an IndirectDataAnalysis object).
  */
-IndirectDataAnalysisTabLegacy::IndirectDataAnalysisTabLegacy(QWidget *parent)
+IndirectDataAnalysisTab::IndirectDataAnalysisTab(QWidget *parent)
     : IndirectTab(parent), m_dblEdFac(nullptr), m_blnEdFac(nullptr),
       m_parent(nullptr), m_inputWorkspace(), m_previewPlotWorkspace(),
       m_selectedSpectrum(0), m_minSpectrum(0), m_maxSpectrum(0) {
@@ -39,17 +39,17 @@ IndirectDataAnalysisTabLegacy::IndirectDataAnalysisTabLegacy(QWidget *parent)
   m_blnEdFac = new QtCheckBoxFactory(this);
 }
 
-void IndirectDataAnalysisTabLegacy::setOutputPlotOptionsPresenter(
+void IndirectDataAnalysisTab::setOutputPlotOptionsPresenter(
     std::unique_ptr<IndirectPlotOptionsPresenter> presenter) {
   m_plotOptionsPresenter = std::move(presenter);
 }
 
-void IndirectDataAnalysisTabLegacy::setOutputPlotOptionsWorkspaces(
+void IndirectDataAnalysisTab::setOutputPlotOptionsWorkspaces(
     std::vector<std::string> const &outputWorkspaces) {
   m_plotOptionsPresenter->setWorkspaces(outputWorkspaces);
 }
 
-void IndirectDataAnalysisTabLegacy::clearOutputPlotOptionsWorkspaces() {
+void IndirectDataAnalysisTab::clearOutputPlotOptionsWorkspaces() {
   m_plotOptionsPresenter->clearWorkspaces();
 }
 
@@ -60,7 +60,7 @@ void IndirectDataAnalysisTabLegacy::clearOutputPlotOptionsWorkspaces() {
  *
  * @param settings :: the QSettings object from which to load
  */
-void IndirectDataAnalysisTabLegacy::loadTabSettings(const QSettings &settings) {
+void IndirectDataAnalysisTab::loadTabSettings(const QSettings &settings) {
   loadSettings(settings);
 }
 
@@ -69,26 +69,26 @@ void IndirectDataAnalysisTabLegacy::loadTabSettings(const QSettings &settings) {
  *
  * @param filter :: true if you want to allow filtering
  */
-void IndirectDataAnalysisTabLegacy::filterInputData(bool filter) {
+void IndirectDataAnalysisTab::filterInputData(bool filter) {
   setFileExtensionsByName(filter);
 }
 
 /**
  * Sets the active browser workspace when the tab is changed
  */
-void IndirectDataAnalysisTabLegacy::setActiveWorkspace() { setBrowserWorkspace(); }
+void IndirectDataAnalysisTab::setActiveWorkspace() { setBrowserWorkspace(); }
 
 /**
  * Slot that can be called when a user edits an input.
  */
-void IndirectDataAnalysisTabLegacy::inputChanged() { validate(); }
+void IndirectDataAnalysisTab::inputChanged() { validate(); }
 
 /**
  * Retrieves the input workspace to be used in data analysis.
  *
  * @return  The input workspace to be used in data analysis.
  */
-MatrixWorkspace_sptr IndirectDataAnalysisTabLegacy::inputWorkspace() const {
+MatrixWorkspace_sptr IndirectDataAnalysisTab::inputWorkspace() const {
   return m_inputWorkspace;
 }
 
@@ -97,7 +97,7 @@ MatrixWorkspace_sptr IndirectDataAnalysisTabLegacy::inputWorkspace() const {
  *
  * @param inputWorkspace  The workspace to set.
  */
-void IndirectDataAnalysisTabLegacy::setInputWorkspace(
+void IndirectDataAnalysisTab::setInputWorkspace(
     MatrixWorkspace_sptr inputWorkspace) {
   m_inputWorkspace = inputWorkspace;
 }
@@ -109,7 +109,7 @@ void IndirectDataAnalysisTabLegacy::setInputWorkspace(
  * @return  The workspace containing the data to be displayed in
  *          the preview plot.
  */
-MatrixWorkspace_sptr IndirectDataAnalysisTabLegacy::previewPlotWorkspace() {
+MatrixWorkspace_sptr IndirectDataAnalysisTab::previewPlotWorkspace() {
   return m_previewPlotWorkspace.lock();
 }
 
@@ -119,7 +119,7 @@ MatrixWorkspace_sptr IndirectDataAnalysisTabLegacy::previewPlotWorkspace() {
  *
  * @param previewPlotWorkspace The workspace to set.
  */
-void IndirectDataAnalysisTabLegacy::setPreviewPlotWorkspace(
+void IndirectDataAnalysisTab::setPreviewPlotWorkspace(
     MatrixWorkspace_sptr previewPlotWorkspace) {
   m_previewPlotWorkspace = previewPlotWorkspace;
 }
@@ -129,7 +129,7 @@ void IndirectDataAnalysisTabLegacy::setPreviewPlotWorkspace(
  *
  * @return  The selected spectrum.
  */
-int IndirectDataAnalysisTabLegacy::selectedSpectrum() const {
+int IndirectDataAnalysisTab::selectedSpectrum() const {
   return m_selectedSpectrum;
 }
 
@@ -138,7 +138,7 @@ int IndirectDataAnalysisTabLegacy::selectedSpectrum() const {
  *
  * @param spectrum  The spectrum to set.
  */
-void IndirectDataAnalysisTabLegacy::setSelectedSpectrum(int spectrum) {
+void IndirectDataAnalysisTab::setSelectedSpectrum(int spectrum) {
   m_selectedSpectrum = spectrum;
 }
 
@@ -147,14 +147,14 @@ void IndirectDataAnalysisTabLegacy::setSelectedSpectrum(int spectrum) {
  *
  * @return  The selected minimum spectrum.
  */
-int IndirectDataAnalysisTabLegacy::minimumSpectrum() const { return m_minSpectrum; }
+int IndirectDataAnalysisTab::minimumSpectrum() const { return m_minSpectrum; }
 
 /**
  * Sets the selected spectrum.
  *
  * @param spectrum  The spectrum to set.
  */
-void IndirectDataAnalysisTabLegacy::setMinimumSpectrum(int spectrum) {
+void IndirectDataAnalysisTab::setMinimumSpectrum(int spectrum) {
   m_minSpectrum = spectrum;
 }
 
@@ -163,14 +163,14 @@ void IndirectDataAnalysisTabLegacy::setMinimumSpectrum(int spectrum) {
  *
  * @return  The selected maximum spectrum.
  */
-int IndirectDataAnalysisTabLegacy::maximumSpectrum() const { return m_maxSpectrum; }
+int IndirectDataAnalysisTab::maximumSpectrum() const { return m_maxSpectrum; }
 
 /**
  * Sets the selected maximum spectrum.
  *
  * @param spectrum  The spectrum to set.
  */
-void IndirectDataAnalysisTabLegacy::setMaximumSpectrum(int spectrum) {
+void IndirectDataAnalysisTab::setMaximumSpectrum(int spectrum) {
   m_maxSpectrum = spectrum;
 }
 
@@ -178,7 +178,7 @@ void IndirectDataAnalysisTabLegacy::setMaximumSpectrum(int spectrum) {
  * Plots the current preview workspace, if none is set, plots
  * the selected spectrum of the current input workspace.
  */
-void IndirectDataAnalysisTabLegacy::plotCurrentPreview() {
+void IndirectDataAnalysisTab::plotCurrentPreview() {
   auto previewWs = previewPlotWorkspace();
   auto inputWs = inputWorkspace();
   auto index = boost::numeric_cast<size_t>(m_selectedSpectrum);
@@ -204,7 +204,7 @@ void IndirectDataAnalysisTabLegacy::plotCurrentPreview() {
  * @param previewPlot The preview plot widget in which to plot the input
  *                    input workspace.
  */
-void IndirectDataAnalysisTabLegacy::plotInput(
+void IndirectDataAnalysisTab::plotInput(
     MantidQt::MantidWidgets::PreviewPlot *previewPlot) {
   previewPlot->clear();
   auto inputWS = inputWorkspace();
@@ -221,7 +221,7 @@ void IndirectDataAnalysisTabLegacy::plotInput(
  * @param fitPreviewPlot    The fit preview plot.
  * @param diffPreviewPlot   The difference preview plot.
  */
-void IndirectDataAnalysisTabLegacy::clearAndPlotInput(
+void IndirectDataAnalysisTab::clearAndPlotInput(
     MantidQt::MantidWidgets::PreviewPlot *fitPreviewPlot,
     MantidQt::MantidWidgets::PreviewPlot *diffPreviewPlot) {
   m_previewPlotWorkspace.reset();
@@ -240,7 +240,7 @@ void IndirectDataAnalysisTabLegacy::clearAndPlotInput(
  * @param fitPreviewPlot    The fit preview plot.
  * @param diffPreviewPlot   The difference preview plot.
  */
-void IndirectDataAnalysisTabLegacy::updatePlot(
+void IndirectDataAnalysisTab::updatePlot(
     const std::string &outputWSName, size_t index,
     MantidQt::MantidWidgets::PreviewPlot *fitPreviewPlot,
     MantidQt::MantidWidgets::PreviewPlot *diffPreviewPlot) {
@@ -268,7 +268,7 @@ void IndirectDataAnalysisTabLegacy::updatePlot(
  * @param fitPreviewPlot    The fit preview plot.
  * @param diffPreviewPlot   The difference preview plot.
  */
-void IndirectDataAnalysisTabLegacy::updatePlot(
+void IndirectDataAnalysisTab::updatePlot(
     WorkspaceGroup_sptr outputWS, size_t index,
     MantidQt::MantidWidgets::PreviewPlot *fitPreviewPlot,
     MantidQt::MantidWidgets::PreviewPlot *diffPreviewPlot) {
@@ -291,7 +291,7 @@ void IndirectDataAnalysisTabLegacy::updatePlot(
  * @param fitPreviewPlot    The fit preview plot.
  * @param diffPreviewPlot   The difference preview plot.
  */
-void IndirectDataAnalysisTabLegacy::updatePlot(
+void IndirectDataAnalysisTab::updatePlot(
     const std::string &workspaceName,
     MantidQt::MantidWidgets::PreviewPlot *fitPreviewPlot,
     MantidQt::MantidWidgets::PreviewPlot *diffPreviewPlot) {
@@ -324,7 +324,7 @@ void IndirectDataAnalysisTabLegacy::updatePlot(
  * @param fitPreviewPlot    The fit preview plot.
  * @param diffPreviewPlot   The difference preview plot.
  */
-void IndirectDataAnalysisTabLegacy::updatePlot(
+void IndirectDataAnalysisTab::updatePlot(
     WorkspaceGroup_sptr outputWS,
     MantidQt::MantidWidgets::PreviewPlot *fitPreviewPlot,
     MantidQt::MantidWidgets::PreviewPlot *diffPreviewPlot) {
@@ -345,7 +345,7 @@ void IndirectDataAnalysisTabLegacy::updatePlot(
  * @param fitPreviewPlot    The fit preview plot.
  * @param diffPreviewPlot   The difference preview plot.
  */
-void IndirectDataAnalysisTabLegacy::updatePlot(
+void IndirectDataAnalysisTab::updatePlot(
     MatrixWorkspace_sptr outputWS,
     MantidQt::MantidWidgets::PreviewPlot *fitPreviewPlot,
     MantidQt::MantidWidgets::PreviewPlot *diffPreviewPlot) {
@@ -373,7 +373,7 @@ void IndirectDataAnalysisTabLegacy::updatePlot(
  * @parma endRangePropName    The name of the property specifying the end
  *                            value for the range.
  */
-void IndirectDataAnalysisTabLegacy::updatePlotRange(
+void IndirectDataAnalysisTab::updatePlotRange(
     const QString &rangeName, MantidQt::MantidWidgets::PreviewPlot *previewPlot,
     const QString &startRangePropName, const QString &endRangePropName) {
 
diff --git a/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTabLegacy.h b/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTabLegacy.h
index 537d36600d5caad18b24d1692ed222aae3a9cb5b..65441f668dfaffba7014473dc7e0e402e6527d8f 100644
--- a/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTabLegacy.h
+++ b/qt/scientific_interfaces/Indirect/IndirectDataAnalysisTabLegacy.h
@@ -53,12 +53,12 @@ class RangeSelector;
 namespace MantidQt {
 namespace CustomInterfaces {
 namespace IDA {
-class DLLExport IndirectDataAnalysisTabLegacy : public IndirectTab {
+class DLLExport IndirectDataAnalysisTab : public IndirectTab {
   Q_OBJECT
 
 public:
   /// Constructor
-  IndirectDataAnalysisTabLegacy(QWidget *parent = nullptr);
+  IndirectDataAnalysisTab(QWidget *parent = nullptr);
 
   /// Set the presenter for the output plotting options
   void setOutputPlotOptionsPresenter(
diff --git a/qt/scientific_interfaces/Indirect/IndirectDataTablePresenter.cpp b/qt/scientific_interfaces/Indirect/IndirectDataTablePresenter.cpp
index f691570a8e67a96e7331a6593fde2b1f9abdc1e1..e1b8f2f64f72c3952f6ee3d329e0c3aa5d25c5c7 100644
--- a/qt/scientific_interfaces/Indirect/IndirectDataTablePresenter.cpp
+++ b/qt/scientific_interfaces/Indirect/IndirectDataTablePresenter.cpp
@@ -16,7 +16,7 @@
 #include <QRegExpValidator>
 
 namespace {
-using MantidQt::CustomInterfaces::IDA::Spectra;
+using MantidQt::CustomInterfaces::IDA::SpectraNew;
 using MantidQt::CustomInterfaces::IDA::WorkspaceIndex;
 
 namespace Regexes {
@@ -84,13 +84,13 @@ std::string pairsToString(
   return boost::algorithm::join(pairStrings, ",");
 }
 
-boost::optional<Spectra> pairsToSpectra(
+boost::optional<SpectraNew> pairsToSpectra(
     const std::vector<std::pair<WorkspaceIndex, WorkspaceIndex>> &pairs) {
   if (pairs.empty())
     return boost::none;
   else if (pairs.size() == 1)
-    return Spectra(pairs[0].first, pairs[0].second);
-  return Spectra(pairsToString(pairs));
+    return SpectraNew(pairs[0].first, pairs[0].second);
+  return SpectraNew(pairsToString(pairs));
 }
 
 QVariant getVariant(std::size_t i) {
@@ -202,14 +202,14 @@ IndirectDataTablePresenter::getDataIndex(SpectrumRowIndex row) const {
       m_dataTable->item(row.value, 0)->data(Qt::UserRole).toInt()};
 }
 
-boost::optional<Spectra>
+boost::optional<SpectraNew>
 IndirectDataTablePresenter::getSpectra(DatasetIndex dataIndex) const {
   if (m_dataPositions.size() > dataIndex)
     return getSpectra(m_dataPositions[dataIndex], getNextPosition(dataIndex));
   return boost::none;
 }
 
-boost::optional<Spectra>
+boost::optional<SpectraNew>
 IndirectDataTablePresenter::getSpectra(SpectrumRowIndex start,
                                        SpectrumRowIndex end) const {
   std::vector<std::pair<WorkspaceIndex, WorkspaceIndex>> spectraPairs;
diff --git a/qt/scientific_interfaces/Indirect/IndirectDataTablePresenter.h b/qt/scientific_interfaces/Indirect/IndirectDataTablePresenter.h
index d9d8ea7a24e623899cc734b15d6225aa56b1cbf0..df7ebf9f3d4201057c6a7b23b58714f0d710ce25 100644
--- a/qt/scientific_interfaces/Indirect/IndirectDataTablePresenter.h
+++ b/qt/scientific_interfaces/Indirect/IndirectDataTablePresenter.h
@@ -96,8 +96,8 @@ private:
   QString getText(SpectrumRowIndex row, int column) const;
   SpectrumRowIndex getNextPosition(DatasetIndex index) const;
   DatasetIndex getDataIndex(SpectrumRowIndex row) const;
-  boost::optional<Spectra> getSpectra(DatasetIndex dataIndex) const;
-  boost::optional<Spectra> getSpectra(SpectrumRowIndex start,
+  boost::optional<SpectraNew> getSpectra(DatasetIndex dataIndex) const;
+  boost::optional<SpectraNew> getSpectra(SpectrumRowIndex start,
                                       SpectrumRowIndex end) const;
   boost::optional<SpectrumRowIndex>
   getRowIndex(DatasetIndex dataIndex, WorkspaceIndex spectrumIndex) const;
diff --git a/qt/scientific_interfaces/Indirect/IndirectDataTablePresenterLegacy.cpp b/qt/scientific_interfaces/Indirect/IndirectDataTablePresenterLegacy.cpp
index ed18dd84d3dcabdfeae9af0ed3253c76f19105a1..1afdd2d586f87a9fda06ad6e79cecf16a48623bc 100644
--- a/qt/scientific_interfaces/Indirect/IndirectDataTablePresenterLegacy.cpp
+++ b/qt/scientific_interfaces/Indirect/IndirectDataTablePresenterLegacy.cpp
@@ -227,7 +227,7 @@ IndirectDataTablePresenterLegacy::getRowIndex(std::size_t dataIndex,
 
 void IndirectDataTablePresenterLegacy::setStartX(double startX, std::size_t dataIndex,
                                            int spectrumIndex) {
-  if (FittingMode::SEQUENTIAL == m_model->getFittingMode())
+  if (FittingModeLegacy::SEQUENTIAL == m_model->getFittingMode())
     setStartX(startX);
   else if (auto row = getRowIndex(dataIndex, spectrumIndex))
     setStartX(startX, *row);
@@ -235,7 +235,7 @@ void IndirectDataTablePresenterLegacy::setStartX(double startX, std::size_t data
 
 void IndirectDataTablePresenterLegacy::setEndX(double endX, std::size_t dataIndex,
                                          int spectrumIndex) {
-  if (FittingMode::SEQUENTIAL == m_model->getFittingMode())
+  if (FittingModeLegacy::SEQUENTIAL == m_model->getFittingMode())
     setEndX(endX);
   else if (auto row = getRowIndex(dataIndex, spectrumIndex))
     setEndX(endX, *row);
@@ -244,7 +244,7 @@ void IndirectDataTablePresenterLegacy::setEndX(double endX, std::size_t dataInde
 void IndirectDataTablePresenterLegacy::setExclude(const std::string &exclude,
                                             std::size_t dataIndex,
                                             int spectrumIndex) {
-  if (FittingMode::SEQUENTIAL == m_model->getFittingMode())
+  if (FittingModeLegacy::SEQUENTIAL == m_model->getFittingMode())
     setExcludeRegion(exclude);
   else if (auto row = getRowIndex(dataIndex, spectrumIndex))
     setExcludeRegion(exclude, *row);
@@ -449,7 +449,7 @@ void IndirectDataTablePresenterLegacy::clearTable() {
 
 void IndirectDataTablePresenterLegacy::setStartX(double startX, int index) {
   MantidQt::API::SignalBlocker blocker(m_dataTable);
-  if (FittingMode::SEQUENTIAL == m_model->getFittingMode())
+  if (FittingModeLegacy::SEQUENTIAL == m_model->getFittingMode())
     setStartX(startX);
   else
     m_dataTable->item(index, startXColumn())->setText(makeNumber(startX));
@@ -457,7 +457,7 @@ void IndirectDataTablePresenterLegacy::setStartX(double startX, int index) {
 
 void IndirectDataTablePresenterLegacy::setEndX(double endX, int index) {
   MantidQt::API::SignalBlocker blocker(m_dataTable);
-  if (FittingMode::SEQUENTIAL == m_model->getFittingMode())
+  if (FittingModeLegacy::SEQUENTIAL == m_model->getFittingMode())
     setEndX(endX);
   else
     m_dataTable->item(index, endXColumn())->setText(makeNumber(endX));
@@ -466,7 +466,7 @@ void IndirectDataTablePresenterLegacy::setEndX(double endX, int index) {
 void IndirectDataTablePresenterLegacy::setExcludeRegion(const std::string &exclude,
                                                   int index) {
   MantidQt::API::SignalBlocker blocker(m_dataTable);
-  if (FittingMode::SEQUENTIAL == m_model->getFittingMode())
+  if (FittingModeLegacy::SEQUENTIAL == m_model->getFittingMode())
     setExcludeRegion(exclude);
   else
     m_dataTable->item(index, excludeColumn())
diff --git a/qt/scientific_interfaces/Indirect/IndirectDataTablePresenterLegacy.h b/qt/scientific_interfaces/Indirect/IndirectDataTablePresenterLegacy.h
index 81faae68bcbf022e0541fb1db14527976ca1c72d..95394fbd5b851b291fb22879fafaa14f235bd803 100644
--- a/qt/scientific_interfaces/Indirect/IndirectDataTablePresenterLegacy.h
+++ b/qt/scientific_interfaces/Indirect/IndirectDataTablePresenterLegacy.h
@@ -4,8 +4,8 @@
 //     NScD Oak Ridge National Laboratory, European Spallation Source
 //     & Institut Laue - Langevin
 // SPDX - License - Identifier: GPL - 3.0 +
-#ifndef MANTIDQTCUSTOMINTERFACES_INDIRECTDATATABLEPRESENTER_H_
-#define MANTIDQTCUSTOMINTERFACES_INDIRECTDATATABLEPRESENTER_H_
+#ifndef MANTIDQTCUSTOMINTERFACES_INDIRECTDATATABLEPRESENTERLEGACY_H_
+#define MANTIDQTCUSTOMINTERFACES_INDIRECTDATATABLEPRESENTERLEGACY_H_
 
 #include "IndirectFittingModelLegacy.h"
 
@@ -128,4 +128,4 @@ private:
 } // namespace CustomInterfaces
 } // namespace MantidQt
 
-#endif /* MANTIDQTCUSTOMINTERFACES_INDIRECTDATATABLEPRESENTER_H_ */
+#endif /* MANTIDQTCUSTOMINTERFACES_INDIRECTDATATABLEPRESENTERLEGACY_H_ */
diff --git a/qt/scientific_interfaces/Indirect/IndirectDiffractionReduction.ui b/qt/scientific_interfaces/Indirect/IndirectDiffractionReduction.ui
index 93b8ff28b34d84ae1309da955d3bf1115f849d66..1b670a197e3b1861571b29887649bea35fd2959a 100644
--- a/qt/scientific_interfaces/Indirect/IndirectDiffractionReduction.ui
+++ b/qt/scientific_interfaces/Indirect/IndirectDiffractionReduction.ui
@@ -105,7 +105,7 @@
            <item row="2" column="0">
             <widget class="QLabel" name="lbSpecMin">
              <property name="text">
-              <string>Spectra Min:</string>
+              <string>SpectraNew Min:</string>
              </property>
             </widget>
            </item>
@@ -129,7 +129,7 @@
            <item row="4" column="0">
             <widget class="QLabel" name="lbSpecMax">
              <property name="text">
-              <string>Spectra Max:</string>
+              <string>SpectraNew Max:</string>
              </property>
             </widget>
            </item>
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.cpp b/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.cpp
index 769d64b152ba1bfbb0596c57880a52d5036b7824..2641582e140eb98b5308b82ec8ff043cb646ad3b 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.cpp
+++ b/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.cpp
@@ -6,7 +6,7 @@
 // SPDX - License - Identifier: GPL - 3.0 +
 #include "IndirectFitAnalysisTab.h"
 // #include "ui_ConvFit.h"
-// #include "ui_IqtFit.h"
+#include "ui_IqtFit.h"
 // #include "ui_JumpFit.h"
 // #include "ui_MSDFit.h"
 
@@ -39,7 +39,7 @@ WorkspaceGroup_sptr getADSGroupWorkspace(std::string const &workspaceName) {
 
 // void updateParameters(
 //    IFunction_sptr function,
-//    std::unordered_map<std::string, ParameterValue> const &parameters) {
+//    std::unordered_map<std::string, ParameterValueNew> const &parameters) {
 //  if (!function)
 //    return;
 //  for (auto i = 0u; i < function->nParams(); ++i) {
@@ -400,7 +400,7 @@ void IndirectFitAnalysisTab::updateParameterValues() {
  * @param parameters  The parameter values to update the browser with.
  */
 void IndirectFitAnalysisTab::updateParameterValues(
-    const std::unordered_map<std::string, ParameterValue> &) {
+    const std::unordered_map<std::string, ParameterValueNew> &) {
   try {
     updateFitBrowserParameterValues();
   } catch (const std::out_of_range &) {
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.h b/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.h
index 7a8ef93930ee5bd089a74a542ea8fd5ae508a85a..52b8e2305432c8c5577fde135d3129bee419f67f 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.h
+++ b/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTab.h
@@ -101,7 +101,7 @@ protected slots:
   void executeFit();
   void updateParameterValues();
   void updateParameterValues(
-      const std::unordered_map<std::string, ParameterValue> &parameters);
+      const std::unordered_map<std::string, ParameterValueNew> &parameters);
   void updateFitBrowserParameterValues();
   void updateDataReferences();
   void updateResultOptions();
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTabLegacy.cpp b/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTabLegacy.cpp
index e8be125e15579ea72ee5a4a46b89300989b76531..51191cb78ac1f0f959f59bee121f453c7e84c960 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTabLegacy.cpp
+++ b/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTabLegacy.cpp
@@ -6,7 +6,7 @@
 // SPDX - License - Identifier: GPL - 3.0 +
 #include "IndirectFitAnalysisTabLegacy.h"
 #include "ui_ConvFit.h"
-#include "ui_IqtFit.h"
+// #include "ui_IqtFit.h"
 #include "ui_JumpFit.h"
 #include "ui_MSDFit.h"
 
@@ -67,7 +67,7 @@ namespace IDA {
 
 IndirectFitAnalysisTabLegacy::IndirectFitAnalysisTabLegacy(IndirectFittingModelLegacy *model,
                                                QWidget *parent)
-    : IndirectDataAnalysisTabLegacy(parent), m_fittingModel(model) {}
+    : IndirectDataAnalysisTab(parent), m_fittingModel(model) {}
 
 void IndirectFitAnalysisTabLegacy::setup() {
   setupFitTab();
@@ -353,7 +353,7 @@ std::size_t IndirectFitAnalysisTabLegacy::getSelectedSpectrum() const {
 
 bool IndirectFitAnalysisTabLegacy::isRangeCurrentlySelected(
     std::size_t dataIndex, std::size_t spectrum) const {
-  return FittingMode::SEQUENTIAL == m_fittingModel->getFittingMode() ||
+  return FittingModeLegacy::SEQUENTIAL == m_fittingModel->getFittingMode() ||
          m_plotPresenter->isCurrentlySelected(dataIndex, spectrum);
 }
 
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTabLegacy.h b/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTabLegacy.h
index 0b87d7194619650285efdc1aacd17d5d238b9d72..2e10b1a1a2efc9a993d4a543d14d6359645c428a 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTabLegacy.h
+++ b/qt/scientific_interfaces/Indirect/IndirectFitAnalysisTabLegacy.h
@@ -4,10 +4,10 @@
 //     NScD Oak Ridge National Laboratory, European Spallation Source
 //     & Institut Laue - Langevin
 // SPDX - License - Identifier: GPL - 3.0 +
-#ifndef MANTIDQTCUSTOMINTERFACESIDA_IFATAB_H_
-#define MANTIDQTCUSTOMINTERFACESIDA_IFATAB_H_
+#ifndef MANTIDQTCUSTOMINTERFACESIDA_IFATABLEGACY_H_
+#define MANTIDQTCUSTOMINTERFACESIDA_IFATABLEGACY_H_
 
-#include "IndirectDataAnalysisTabLegacy.h"
+#include "IndirectDataAnalysisTab.h"
 #include "IndirectFitDataPresenterLegacy.h"
 #include "IndirectFitOutputOptionsPresenter.h"
 #include "IndirectFitOutputOptionsView.h"
@@ -29,7 +29,7 @@ namespace MantidQt {
 namespace CustomInterfaces {
 namespace IDA {
 
-class DLLExport IndirectFitAnalysisTabLegacy : public IndirectDataAnalysisTabLegacy {
+class DLLExport IndirectFitAnalysisTabLegacy : public IndirectDataAnalysisTab {
   Q_OBJECT
 
 public:
@@ -240,4 +240,4 @@ private:
 } // namespace CustomInterfaces
 } // namespace MantidQt
 
-#endif /* MANTIDQTCUSTOMINTERFACESIDA_IFATAB_H_ */
+#endif /* MANTIDQTCUSTOMINTERFACESIDA_IFATABLEGACY_H_ */
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitData.cpp b/qt/scientific_interfaces/Indirect/IndirectFitData.cpp
index 43be3e3af57eefd6b18c08b1935ddad61d0f6ad7..eef0e210e9296905c0078ebb6e4c87ef1505b5fa 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitData.cpp
+++ b/qt/scientific_interfaces/Indirect/IndirectFitData.cpp
@@ -148,7 +148,7 @@ std::string createExcludeRegionString(std::string regionString) {
 
 std::vector<MantidQt::CustomInterfaces::IDA::WorkspaceIndex>
 workspaceIndexVectorFromString(const std::string &listString) {
-  auto const intVec = vectorFromString<int>(listString);
+  auto const intVec = vectorFromStringNew<int>(listString);
   std::vector<MantidQt::CustomInterfaces::IDA::WorkspaceIndex> output;
   for (auto const i : intVec) {
     output.push_back(MantidQt::CustomInterfaces::IDA::WorkspaceIndex{i});
@@ -162,12 +162,12 @@ namespace MantidQt {
 namespace CustomInterfaces {
 namespace IDA {
 
-Spectra::Spectra(const std::string &str)
+SpectraNew::SpectraNew(const std::string &str)
     : m_vec(workspaceIndexVectorFromString(str)), m_isContinuous(true) {
   checkContinuous();
 }
 
-Spectra::Spectra(WorkspaceIndex minimum, WorkspaceIndex maximum) {
+SpectraNew::SpectraNew(WorkspaceIndex minimum, WorkspaceIndex maximum) {
   if (maximum < minimum) {
     std::swap(minimum, maximum);
   }
@@ -175,32 +175,32 @@ Spectra::Spectra(WorkspaceIndex minimum, WorkspaceIndex maximum) {
   std::iota(m_vec.begin(), m_vec.end(), minimum);
 }
 
-Spectra::Spectra(const Spectra &vec)
+SpectraNew::SpectraNew(const SpectraNew &vec)
     : m_vec(vec.m_vec), m_isContinuous(vec.m_isContinuous) {}
 
-Spectra::Spectra(Spectra &&vec)
+SpectraNew::SpectraNew(SpectraNew &&vec)
     : m_vec(std::move(vec.m_vec)),
       m_isContinuous(std::move(vec.m_isContinuous)) {}
 
-Spectra &Spectra::operator=(const Spectra &vec) {
+SpectraNew &SpectraNew::operator=(const SpectraNew &vec) {
   m_vec = vec.m_vec;
   m_isContinuous = vec.m_isContinuous;
   return *this;
 }
 
-Spectra &Spectra::operator=(Spectra &&vec) {
+SpectraNew &SpectraNew::operator=(SpectraNew &&vec) {
   m_vec = std::move(vec.m_vec);
   m_isContinuous = std::move(vec.m_isContinuous);
   return *this;
 }
 
-bool Spectra::empty() const { return m_vec.empty(); }
+bool SpectraNew::empty() const { return m_vec.empty(); }
 
-SpectrumRowIndex Spectra::size() const {
+SpectrumRowIndex SpectraNew::size() const {
   return SpectrumRowIndex{static_cast<int>(m_vec.size())};
 }
 
-std::string Spectra::getString() const {
+std::string SpectraNew::getString() const {
   if (empty())
     return "";
   if (m_isContinuous)
@@ -213,19 +213,19 @@ std::string Spectra::getString() const {
   return Mantid::Kernel::Strings::toString(out);
 }
 
-std::pair<WorkspaceIndex, WorkspaceIndex> Spectra::getMinMax() const {
+std::pair<WorkspaceIndex, WorkspaceIndex> SpectraNew::getMinMax() const {
   if (empty())
     return std::make_pair(WorkspaceIndex{0}, WorkspaceIndex{0});
   return std::make_pair(m_vec.front(), m_vec.back());
 }
 
-bool Spectra::operator==(Spectra const &spec) const {
+bool SpectraNew::operator==(SpectraNew const &spec) const {
   return this->getString() == spec.getString();
 }
 
-bool Spectra::isContinuous() const { return m_isContinuous; }
+bool SpectraNew::isContinuous() const { return m_isContinuous; }
 
-SpectrumRowIndex Spectra::indexOf(WorkspaceIndex i) const {
+SpectrumRowIndex SpectraNew::indexOf(WorkspaceIndex i) const {
   auto const it = std::find(begin(), end(), i);
   if (it == end()) {
     throw std::runtime_error("Spectrum index " + std::to_string(i.value) +
@@ -234,18 +234,18 @@ SpectrumRowIndex Spectra::indexOf(WorkspaceIndex i) const {
   return SpectrumRowIndex{static_cast<int>(std::distance(begin(), it))};
 }
 
-Spectra Spectra::combine(const Spectra &other) const {
+SpectraNew SpectraNew::combine(const SpectraNew &other) const {
   std::set<WorkspaceIndex> indices(begin(), end());
   indices.insert(other.begin(), other.end());
-  return Spectra(indices);
+  return SpectraNew(indices);
 }
 
-Spectra::Spectra(const std::set<WorkspaceIndex> &indices)
+SpectraNew::SpectraNew(const std::set<WorkspaceIndex> &indices)
     : m_vec(indices.begin(), indices.end()) {
   checkContinuous();
 }
 
-void Spectra::checkContinuous() {
+void SpectraNew::checkContinuous() {
   m_isContinuous = true;
   if (m_vec.size() > 1) {
     for (size_t i = 1; i < m_vec.size(); ++i) {
@@ -258,8 +258,8 @@ void Spectra::checkContinuous() {
 }
 
 IndirectFitData::IndirectFitData(MatrixWorkspace_sptr workspace,
-                                 const Spectra &spectra)
-    : m_workspace(workspace), m_spectra(Spectra("")) {
+                                 const SpectraNew &spectra)
+    : m_workspace(workspace), m_spectra(SpectraNew("")) {
   setSpectra(spectra);
   auto const range =
       !spectra.empty() ? getBinRange(workspace) : std::make_pair(0.0, 0.0);
@@ -300,7 +300,7 @@ Mantid::API::MatrixWorkspace_sptr IndirectFitData::workspace() const {
   return m_workspace;
 }
 
-const Spectra &IndirectFitData::spectra() const { return m_spectra; }
+const SpectraNew &IndirectFitData::spectra() const { return m_spectra; }
 
 WorkspaceIndex IndirectFitData::getSpectrum(SpectrumRowIndex index) const {
   return m_spectra[index];
@@ -338,30 +338,30 @@ std::string IndirectFitData::getExcludeRegion(WorkspaceIndex spectrum) const {
 
 std::vector<double>
 IndirectFitData::excludeRegionsVector(WorkspaceIndex spectrum) const {
-  return vectorFromString<double>(getExcludeRegion(spectrum));
+  return vectorFromStringNew<double>(getExcludeRegion(spectrum));
 }
 
 void IndirectFitData::setSpectra(std::string const &spectra) {
   try {
-    const Spectra spec = Spectra(createSpectraString(spectra));
+    const SpectraNew spec = SpectraNew(createSpectraString(spectra));
     setSpectra(spec);
   } catch (std::exception &ex) {
-    throw std::runtime_error("Spectra too large for cast: " +
+    throw std::runtime_error("SpectraNew too large for cast: " +
                              std::string(ex.what()));
   }
 }
 
-void IndirectFitData::setSpectra(Spectra &&spectra) {
+void IndirectFitData::setSpectra(SpectraNew &&spectra) {
   validateSpectra(spectra);
   m_spectra = std::move(spectra);
 }
 
-void IndirectFitData::setSpectra(Spectra const &spectra) {
+void IndirectFitData::setSpectra(SpectraNew const &spectra) {
   validateSpectra(spectra);
   m_spectra = spectra;
 }
 
-void IndirectFitData::validateSpectra(Spectra const &spectra) {
+void IndirectFitData::validateSpectra(SpectraNew const &spectra) {
   int maxValue = static_cast<int>(workspace()->getNumberHistograms()) - 1;
   std::vector<int> notInRange;
   for (auto const i : spectra) {
@@ -370,9 +370,9 @@ void IndirectFitData::validateSpectra(Spectra const &spectra) {
   }
   if (!notInRange.empty()) {
     if (notInRange.size() > 5)
-      throw std::runtime_error("Spectra out of range: " +
+      throw std::runtime_error("SpectraNew out of range: " +
                                join(subvector(notInRange, 0, 5), ",") + "...");
-    throw std::runtime_error("Spectra out of range: " + join(notInRange, ","));
+    throw std::runtime_error("SpectraNew out of range: " + join(notInRange, ","));
   }
 }
 
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitData.h b/qt/scientific_interfaces/Indirect/IndirectFitData.h
index 945133b83e732a04178845d90fbd1a0a467fe501..3875f96b741fb9e79b7627104e3b0b528372b2cd 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitData.h
+++ b/qt/scientific_interfaces/Indirect/IndirectFitData.h
@@ -4,8 +4,8 @@
 //     NScD Oak Ridge National Laboratory, European Spallation Source
 //     & Institut Laue - Langevin
 // SPDX - License - Identifier: GPL - 3.0 +
-#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITDATA_H_
-#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITDATA_H_
+#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITDATALEGACY_H_
+#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITDATALEGACY_H_
 
 #include "DllConfig.h"
 #include "IndexTypes.h"
@@ -30,14 +30,14 @@ namespace IDA {
  *
  * Holds a string and vector representation.
  */
-class MANTIDQT_INDIRECT_DLL Spectra {
+class MANTIDQT_INDIRECT_DLL SpectraNew {
 public:
-  explicit Spectra(const std::string &str);
-  Spectra(WorkspaceIndex minimum, WorkspaceIndex maximum);
-  Spectra(const Spectra &vec);
-  Spectra(Spectra &&vec);
-  Spectra &operator=(const Spectra &vec);
-  Spectra &operator=(Spectra &&vec);
+  explicit SpectraNew(const std::string &str);
+  SpectraNew(WorkspaceIndex minimum, WorkspaceIndex maximum);
+  SpectraNew(const SpectraNew &vec);
+  SpectraNew(SpectraNew &&vec);
+  SpectraNew &operator=(const SpectraNew &vec);
+  SpectraNew &operator=(SpectraNew &&vec);
   bool empty() const;
   SpectrumRowIndex size() const;
   std::string getString() const;
@@ -55,22 +55,22 @@ public:
   const WorkspaceIndex &operator[](SpectrumRowIndex index) const {
     return m_vec[index.value];
   }
-  bool operator==(Spectra const &spec) const;
+  bool operator==(SpectraNew const &spec) const;
   bool isContinuous() const;
   SpectrumRowIndex indexOf(WorkspaceIndex i) const;
-  Spectra combine(const Spectra &other) const;
+  SpectraNew combine(const SpectraNew &other) const;
 
 private:
-  explicit Spectra(const std::set<WorkspaceIndex> &indices);
+  explicit SpectraNew(const std::set<WorkspaceIndex> &indices);
   void checkContinuous();
   std::vector<WorkspaceIndex> m_vec;
   bool m_isContinuous;
 };
 
-template <typename F> struct ApplySpectra {
-  explicit ApplySpectra(F &&functor) : m_functor(std::forward<F>(functor)) {}
+template <typename F> struct ApplySpectraNew {
+  explicit ApplySpectraNew(F &&functor) : m_functor(std::forward<F>(functor)) {}
 
-  void operator()(const Spectra &spectra) const {
+  void operator()(const SpectraNew &spectra) const {
     for (const auto &spectrum : spectra)
       m_functor(spectrum);
   }
@@ -79,11 +79,11 @@ private:
   F m_functor;
 };
 
-template <typename F> struct ApplyEnumeratedSpectra {
-  ApplyEnumeratedSpectra(F &&functor, WorkspaceIndex start = WorkspaceIndex{0})
+template <typename F> struct ApplyEnumeratedSpectraNew {
+  ApplyEnumeratedSpectraNew(F &&functor, WorkspaceIndex start = WorkspaceIndex{0})
       : m_start(start), m_functor(std::forward<F>(functor)) {}
 
-  WorkspaceIndex operator()(const Spectra &spectra) const {
+  WorkspaceIndex operator()(const SpectraNew &spectra) const {
     auto i = m_start;
     for (const auto &spectrum : spectra)
       m_functor(i++, spectrum);
@@ -96,7 +96,7 @@ private:
 };
 
 template <class T>
-std::vector<T> vectorFromString(const std::string &listString) {
+std::vector<T> vectorFromStringNew(const std::string &listString) {
   try {
     return Mantid::Kernel::ArrayProperty<T>("vector", listString);
   } catch (const std::runtime_error &) {
@@ -112,7 +112,7 @@ std::vector<T> vectorFromString(const std::string &listString) {
 class MANTIDQT_INDIRECT_DLL IndirectFitData {
 public:
   IndirectFitData(Mantid::API::MatrixWorkspace_sptr workspace,
-                  const Spectra &spectra);
+                  const SpectraNew &spectra);
 
   std::string displayName(const std::string &formatString,
                           const std::string &rangeDelimiter) const;
@@ -121,7 +121,7 @@ public:
   std::string getBasename() const;
 
   Mantid::API::MatrixWorkspace_sptr workspace() const;
-  const Spectra &spectra() const;
+  const SpectraNew &spectra() const;
   WorkspaceIndex getSpectrum(SpectrumRowIndex index) const;
   SpectrumRowIndex numberOfSpectra() const;
   bool zeroSpectra() const;
@@ -132,20 +132,20 @@ public:
   std::vector<double> excludeRegionsVector(WorkspaceIndex spectrum) const;
 
   template <typename F> void applySpectra(F &&functor) const {
-    ApplySpectra<F>(std::forward<F>(functor))(m_spectra);
+    ApplySpectraNew<F>(std::forward<F>(functor))(m_spectra);
   }
 
   template <typename F>
   WorkspaceIndex
   applyEnumeratedSpectra(F &&functor,
                          WorkspaceIndex start = WorkspaceIndex{0}) const {
-    return ApplyEnumeratedSpectra<F>(std::forward<F>(functor),
+    return ApplyEnumeratedSpectraNew<F>(std::forward<F>(functor),
                                      start)(m_spectra);
   }
 
   void setSpectra(std::string const &spectra);
-  void setSpectra(Spectra &&spectra);
-  void setSpectra(Spectra const &spectra);
+  void setSpectra(SpectraNew &&spectra);
+  void setSpectra(SpectraNew const &spectra);
   void setStartX(double const &startX, WorkspaceIndex const &index);
   void setStartX(double const &startX);
   void setEndX(double const &endX, WorkspaceIndex const &spectrum);
@@ -154,10 +154,10 @@ public:
                               WorkspaceIndex const &spectrum);
 
 private:
-  void validateSpectra(Spectra const &spectra);
+  void validateSpectra(SpectraNew const &spectra);
 
   Mantid::API::MatrixWorkspace_sptr m_workspace;
-  Spectra m_spectra;
+  SpectraNew m_spectra;
   std::map<WorkspaceIndex, std::string> m_excludeRegions;
   std::map<WorkspaceIndex, std::pair<double, double>> m_ranges;
 };
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitDataPresenterLegacy.h b/qt/scientific_interfaces/Indirect/IndirectFitDataPresenterLegacy.h
index acce49e6ef314279a6db7974ac4365ba69e8863a..4847111953b22efbcca55b9a4e6ff70cbcb40a44 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitDataPresenterLegacy.h
+++ b/qt/scientific_interfaces/Indirect/IndirectFitDataPresenterLegacy.h
@@ -4,8 +4,8 @@
 //     NScD Oak Ridge National Laboratory, European Spallation Source
 //     & Institut Laue - Langevin
 // SPDX - License - Identifier: GPL - 3.0 +
-#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITDATAPRESENTER_H_
-#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITDATAPRESENTER_H_
+#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITDATAPRESENTERLEGACY_H_
+#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITDATAPRESENTERLEGACY_H_
 
 #include "IAddWorkspaceDialog.h"
 #include "IIndirectFitDataViewLegacy.h"
@@ -113,4 +113,4 @@ private:
 } // namespace CustomInterfaces
 } // namespace MantidQt
 
-#endif /* MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITDATAPRESENTER_H_ */
+#endif /* MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITDATAPRESENTERLEGACY_H_ */
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitDataViewLegacy.h b/qt/scientific_interfaces/Indirect/IndirectFitDataViewLegacy.h
index 0906007c4ad5ad980e109ee199a16e91138b946c..d390ceeafff6750f3a8e1b0b6dcb6514cc98d3c3 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitDataViewLegacy.h
+++ b/qt/scientific_interfaces/Indirect/IndirectFitDataViewLegacy.h
@@ -4,8 +4,8 @@
 //     NScD Oak Ridge National Laboratory, European Spallation Source
 //     & Institut Laue - Langevin
 // SPDX - License - Identifier: GPL - 3.0 +
-#ifndef MANTIDQTCUSTOMINTERFACES_INDIRECTFITDATAVIEW_H_
-#define MANTIDQTCUSTOMINTERFACES_INDIRECTFITDATAVIEW_H_
+#ifndef MANTIDQTCUSTOMINTERFACES_INDIRECTFITDATAVIEWLEGACY_H_
+#define MANTIDQTCUSTOMINTERFACES_INDIRECTFITDATAVIEWLEGACY_H_
 
 #include "ui_IndirectFitDataView.h"
 
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitOutput.cpp b/qt/scientific_interfaces/Indirect/IndirectFitOutput.cpp
index 75e3b7b43d83e3a00b67e35899e189169d102950..0d734ebe3cdbdd0319171850c5f0a9410318bb0b 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitOutput.cpp
+++ b/qt/scientific_interfaces/Indirect/IndirectFitOutput.cpp
@@ -28,14 +28,14 @@ struct TableRowExtractor {
                  m_columns.begin();
   }
 
-  std::unordered_map<std::string, ParameterValue>
+  std::unordered_map<std::string, ParameterValueNew>
   operator()(IDAWorkspaceIndex index) {
     TableRow row = m_table->getRow(index.value);
-    std::unordered_map<std::string, ParameterValue> parameters;
+    std::unordered_map<std::string, ParameterValueNew> parameters;
 
     for (auto i = 1u; i < m_chiIndex; i += 2) {
       const auto &columnName = m_columns[i];
-      parameters[columnName] = ParameterValue(row.Double(i), row.Double(i + 1));
+      parameters[columnName] = ParameterValueNew(row.Double(i), row.Double(i + 1));
     }
     return parameters;
   }
@@ -55,24 +55,24 @@ typename Map::mapped_type &extractOrAddDefault(Map &map, const Key &key) {
 }
 
 template <typename F>
-void applyEnumeratedData(F &&functor, const FitDataIterator &fitDataBegin,
-                         const FitDataIterator &fitDataEnd) {
+void applyEnumeratedData(F &&functor, const FitDataIteratorNew &fitDataBegin,
+                         const FitDataIteratorNew &fitDataEnd) {
   IDAWorkspaceIndex start{0};
   for (auto it = fitDataBegin; it < fitDataEnd; ++it)
     start = (*it)->applyEnumeratedSpectra(functor(it->get()), start);
 }
 
 template <typename F>
-void applyData(F &&functor, const FitDataIterator &fitDataBegin,
-               const FitDataIterator &fitDataEnd) {
+void applyData(F &&functor, const FitDataIteratorNew &fitDataBegin,
+               const FitDataIteratorNew &fitDataEnd) {
   for (auto it = fitDataBegin; it < fitDataEnd; ++it)
     (*it)->applySpectra(functor(it->get()));
 }
 
 void extractParametersFromTable(
-    ITableWorkspace_sptr tableWs, const FitDataIterator &fitDataBegin,
-    const FitDataIterator &fitDataEnd,
-    std::unordered_map<IndirectFitData const *, ParameterValues> &parameters) {
+    ITableWorkspace_sptr tableWs, const FitDataIteratorNew &fitDataBegin,
+    const FitDataIteratorNew &fitDataEnd,
+    std::unordered_map<IndirectFitData const *, ParameterValuesNew> &parameters) {
   TableRowExtractor extractRowFromTable(tableWs);
   IDAWorkspaceIndex index;
   for (auto fitData = fitDataBegin; fitData < fitDataEnd; ++fitData) {
@@ -185,8 +185,8 @@ void renameResult(WorkspaceGroup_sptr resultWorkspace,
 }
 
 void renameResultWithoutSpectra(WorkspaceGroup_sptr resultWorkspace,
-                                const FitDataIterator &fitDataBegin,
-                                const FitDataIterator &fitDataEnd) {
+                                const FitDataIteratorNew &fitDataBegin,
+                                const FitDataIteratorNew &fitDataEnd) {
   std::size_t index = 0;
   MatrixWorkspace const *previous = nullptr;
 
@@ -200,16 +200,16 @@ void renameResultWithoutSpectra(WorkspaceGroup_sptr resultWorkspace,
 }
 
 void renameResultWithSpectra(WorkspaceGroup_sptr resultWorkspace,
-                             const FitDataIterator &fitDataBegin,
-                             const FitDataIterator &fitDataEnd) {
+                             const FitDataIteratorNew &fitDataBegin,
+                             const FitDataIteratorNew &fitDataEnd) {
   std::size_t index = 0;
   for (auto it = fitDataBegin; it < fitDataEnd; ++it)
     renameResult(resultWorkspace->getItem(index++), it->get());
 }
 
 void renameResult(WorkspaceGroup_sptr resultWorkspace,
-                  const FitDataIterator &fitDataBegin,
-                  const FitDataIterator &fitDataEnd) {
+                  const FitDataIteratorNew &fitDataBegin,
+                  const FitDataIteratorNew &fitDataEnd) {
   if (static_cast<int>(resultWorkspace->size()) >= fitDataEnd - fitDataBegin)
     renameResultWithSpectra(resultWorkspace, fitDataBegin, fitDataEnd);
   else
@@ -224,8 +224,8 @@ typename Map::mapped_type &findOrCreateDefaultInMap(Map &map, const Key &key) {
   return map[key] = typename Map::mapped_type();
 }
 
-SpectrumRowIndex numberOfSpectraIn(const FitDataIterator &fitDataBegin,
-                                   const FitDataIterator &fitDataEnd) {
+SpectrumRowIndex numberOfSpectraIn(const FitDataIteratorNew &fitDataBegin,
+                                   const FitDataIteratorNew &fitDataEnd) {
   SpectrumRowIndex spectra{0};
   for (auto it = fitDataBegin; it < fitDataEnd; ++it)
     spectra += (*it)->numberOfSpectra();
@@ -240,8 +240,8 @@ namespace IDA {
 IndirectFitOutput::IndirectFitOutput(WorkspaceGroup_sptr resultGroup,
                                      ITableWorkspace_sptr parameterTable,
                                      WorkspaceGroup_sptr resultWorkspace,
-                                     const FitDataIterator &fitDataBegin,
-                                     const FitDataIterator &fitDataEnd)
+                                     const FitDataIteratorNew &fitDataBegin,
+                                     const FitDataIteratorNew &fitDataEnd)
     : m_resultGroup(resultGroup), m_resultWorkspace(resultWorkspace),
       m_parameters(), m_outputResultLocations() {
   addOutput(resultGroup, parameterTable, resultWorkspace, fitDataBegin,
@@ -253,8 +253,8 @@ IndirectFitOutput::IndirectFitOutput(WorkspaceGroup_sptr resultGroup,
                                      WorkspaceGroup_sptr resultWorkspace,
                                      IndirectFitData const *fitData,
                                      WorkspaceIndex spectrum) {
-  m_parameters[fitData] = ParameterValues();
-  m_outputResultLocations[fitData] = ResultLocations();
+  m_parameters[fitData] = ParameterValuesNew();
+  m_outputResultLocations[fitData] = ResultLocationsNew();
   addOutput(resultGroup, parameterTable, resultWorkspace, fitData, spectrum);
 }
 
@@ -265,19 +265,19 @@ bool IndirectFitOutput::isSpectrumFit(IndirectFitData const *fitData,
          values->second.find(spectrum) != values->second.end();
 }
 
-std::unordered_map<std::string, ParameterValue>
+std::unordered_map<std::string, ParameterValueNew>
 IndirectFitOutput::getParameters(IndirectFitData const *fitData,
                                  WorkspaceIndex spectrum) const {
   return getValueOr(m_parameters,
-                    std::unordered_map<std::string, ParameterValue>(), fitData,
+                    std::unordered_map<std::string, ParameterValueNew>(), fitData,
                     spectrum);
 }
 
-boost::optional<ResultLocation>
+boost::optional<ResultLocationNew>
 IndirectFitOutput::getResultLocation(IndirectFitData const *fitData,
                                      WorkspaceIndex spectrum) const {
   return getValueOr(m_outputResultLocations,
-                    boost::optional<ResultLocation>(boost::none), fitData,
+                    boost::optional<ResultLocationNew>(boost::none), fitData,
                     spectrum);
 }
 
@@ -298,7 +298,7 @@ WorkspaceGroup_sptr IndirectFitOutput::getLastResultGroup() const {
 
 void IndirectFitOutput::mapParameterNames(
     const std::unordered_map<std::string, std::string> &parameterNameChanges,
-    const FitDataIterator &fitDataBegin, const FitDataIterator &fitDataEnd) {
+    const FitDataIteratorNew &fitDataBegin, const FitDataIteratorNew &fitDataEnd) {
   for (auto it = fitDataBegin; it < fitDataEnd; ++it)
     mapParameterNames(parameterNameChanges, it->get());
 }
@@ -324,8 +324,8 @@ void IndirectFitOutput::mapParameterNames(
 void IndirectFitOutput::addOutput(WorkspaceGroup_sptr resultGroup,
                                   ITableWorkspace_sptr parameterTable,
                                   WorkspaceGroup_sptr resultWorkspace,
-                                  const FitDataIterator &fitDataBegin,
-                                  const FitDataIterator &fitDataEnd) {
+                                  const FitDataIteratorNew &fitDataBegin,
+                                  const FitDataIteratorNew &fitDataEnd) {
   updateParameters(parameterTable, fitDataBegin, fitDataEnd);
   updateFitResults(resultGroup, fitDataBegin, fitDataEnd);
   renameResult(resultWorkspace, fitDataBegin, fitDataEnd);
@@ -341,7 +341,7 @@ void IndirectFitOutput::addOutput(WorkspaceGroup_sptr resultGroup,
   TableRowExtractor extractRowFromTable(parameterTable);
   m_parameters[fitData][spectrum] = extractRowFromTable(WorkspaceIndex{0});
   m_outputResultLocations[fitData][spectrum] =
-      ResultLocation(resultGroup, GroupIndex{0});
+      ResultLocationNew(resultGroup, GroupIndex{0});
   renameResult(resultWorkspace, fitData);
   m_resultWorkspace = resultWorkspace;
   m_resultGroup = resultGroup;
@@ -353,8 +353,8 @@ void IndirectFitOutput::removeOutput(IndirectFitData const *fitData) {
 }
 
 void IndirectFitOutput::updateFitResults(WorkspaceGroup_sptr resultGroup,
-                                         const FitDataIterator &fitDataBegin,
-                                         const FitDataIterator &fitDataEnd) {
+                                         const FitDataIteratorNew &fitDataBegin,
+                                         const FitDataIteratorNew &fitDataEnd) {
   if (numberOfSpectraIn(fitDataBegin, fitDataEnd).value <=
       static_cast<int>(resultGroup->size()))
     updateFitResultsFromStructured(resultGroup, fitDataBegin, fitDataEnd);
@@ -363,15 +363,15 @@ void IndirectFitOutput::updateFitResults(WorkspaceGroup_sptr resultGroup,
 }
 
 void IndirectFitOutput::updateParameters(ITableWorkspace_sptr parameterTable,
-                                         const FitDataIterator &fitDataBegin,
-                                         const FitDataIterator &fitDataEnd) {
+                                         const FitDataIteratorNew &fitDataBegin,
+                                         const FitDataIteratorNew &fitDataEnd) {
   extractParametersFromTable(parameterTable, fitDataBegin, fitDataEnd,
                              m_parameters);
 }
 
 void IndirectFitOutput::updateFitResultsFromUnstructured(
-    WorkspaceGroup_sptr resultGroup, const FitDataIterator &fitDataBegin,
-    const FitDataIterator &fitDataEnd) {
+    WorkspaceGroup_sptr resultGroup, const FitDataIteratorNew &fitDataBegin,
+    const FitDataIteratorNew &fitDataEnd) {
   std::unordered_map<MatrixWorkspace *, std::map<WorkspaceIndex, GroupIndex>>
       resultIndices;
   GroupIndex index{0};
@@ -382,9 +382,9 @@ void IndirectFitOutput::updateFitResultsFromUnstructured(
     for (const auto &spectrum : (**fitData).spectra()) {
       auto defaultIt = indices.find(spectrum);
       if (defaultIt != indices.end()) {
-        fitResults[spectrum] = ResultLocation(resultGroup, defaultIt->second);
+        fitResults[spectrum] = ResultLocationNew(resultGroup, defaultIt->second);
       } else if (static_cast<int>(resultGroup->size()) > index.value) {
-        fitResults[spectrum] = ResultLocation(resultGroup, index);
+        fitResults[spectrum] = ResultLocationNew(resultGroup, index);
         indices[spectrum] = index;
         ++index;
       }
@@ -393,13 +393,13 @@ void IndirectFitOutput::updateFitResultsFromUnstructured(
 }
 
 void IndirectFitOutput::updateFitResultsFromStructured(
-    WorkspaceGroup_sptr resultGroup, const FitDataIterator &fitDataBegin,
-    const FitDataIterator &fitDataEnd) {
+    WorkspaceGroup_sptr resultGroup, const FitDataIteratorNew &fitDataBegin,
+    const FitDataIteratorNew &fitDataEnd) {
   GroupIndex index;
   for (auto fitData = fitDataBegin; fitData < fitDataEnd; ++fitData) {
     auto &fitResults = m_outputResultLocations[fitData->get()];
     for (const auto &spectrum : (**fitData).spectra()) {
-      fitResults[spectrum] = ResultLocation(resultGroup, index);
+      fitResults[spectrum] = ResultLocationNew(resultGroup, index);
       ++index;
     }
   }
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitOutput.h b/qt/scientific_interfaces/Indirect/IndirectFitOutput.h
index e1d53e5d8bc7cf7eae749c6bfe7ce05a0903106c..7b795ec67abcf03086fa9ef6e493e18f75a9b7a3 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitOutput.h
+++ b/qt/scientific_interfaces/Indirect/IndirectFitOutput.h
@@ -4,8 +4,8 @@
 //     NScD Oak Ridge National Laboratory, European Spallation Source
 //     & Institut Laue - Langevin
 // SPDX - License - Identifier: GPL - 3.0 +
-#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITOUTPUT_H_
-#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITOUTPUT_H_
+#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITOUTPUTLEGACY_H_
+#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITOUTPUTLEGACY_H_
 
 #include "IndirectFitData.h"
 
@@ -21,28 +21,28 @@ namespace MantidQt {
 namespace CustomInterfaces {
 namespace IDA {
 
-struct ParameterValue {
-  ParameterValue() : value(0) {}
-  explicit ParameterValue(double val) : value(val) {}
-  ParameterValue(double val, double err) : value(val), error(err) {}
+struct ParameterValueNew {
+  ParameterValueNew() : value(0) {}
+  explicit ParameterValueNew(double val) : value(val) {}
+  ParameterValueNew(double val, double err) : value(val), error(err) {}
   double value;
   boost::optional<double> error;
 };
 
-struct ResultLocation {
-  ResultLocation() = default;
-  ResultLocation(Mantid::API::WorkspaceGroup_sptr group, GroupIndex i)
+struct ResultLocationNew {
+  ResultLocationNew() = default;
+  ResultLocationNew(Mantid::API::WorkspaceGroup_sptr group, GroupIndex i)
       : result(group), index(i) {}
   boost::weak_ptr<Mantid::API::WorkspaceGroup> result;
   GroupIndex index = GroupIndex{0};
 };
 
-using ParameterValues =
-    std::map<WorkspaceIndex, std::unordered_map<std::string, ParameterValue>>;
+using ParameterValuesNew =
+    std::map<WorkspaceIndex, std::unordered_map<std::string, ParameterValueNew>>;
 
-using ResultLocations = std::map<WorkspaceIndex, ResultLocation>;
+using ResultLocationsNew = std::map<WorkspaceIndex, ResultLocationNew>;
 
-using FitDataIterator =
+using FitDataIteratorNew =
     std::vector<std::unique_ptr<IndirectFitData>>::const_iterator;
 
 /*
@@ -54,8 +54,8 @@ public:
   IndirectFitOutput(Mantid::API::WorkspaceGroup_sptr resultGroup,
                     Mantid::API::ITableWorkspace_sptr parameterTable,
                     Mantid::API::WorkspaceGroup_sptr resultWorkspace,
-                    const FitDataIterator &fitDataBegin,
-                    const FitDataIterator &fitDataEnd);
+                    const FitDataIteratorNew &fitDataBegin,
+                    const FitDataIteratorNew &fitDataEnd);
 
   IndirectFitOutput(Mantid::API::WorkspaceGroup_sptr resultGroup,
                     Mantid::API::ITableWorkspace_sptr parameterTable,
@@ -65,10 +65,10 @@ public:
   bool isSpectrumFit(IndirectFitData const *fitData,
                      WorkspaceIndex spectrum) const;
 
-  std::unordered_map<std::string, ParameterValue>
+  std::unordered_map<std::string, ParameterValueNew>
   getParameters(IndirectFitData const *fitData, WorkspaceIndex spectrum) const;
 
-  boost::optional<ResultLocation>
+  boost::optional<ResultLocationNew>
   getResultLocation(IndirectFitData const *fitData,
                     WorkspaceIndex spectrum) const;
   std::vector<std::string> getResultParameterNames() const;
@@ -77,7 +77,7 @@ public:
 
   void mapParameterNames(
       const std::unordered_map<std::string, std::string> &parameterNameChanges,
-      const FitDataIterator &fitDataBegin, const FitDataIterator &fitDataEnd);
+      const FitDataIteratorNew &fitDataBegin, const FitDataIteratorNew &fitDataEnd);
   void mapParameterNames(
       const std::unordered_map<std::string, std::string> &parameterNameChanges,
       IndirectFitData const *fitData);
@@ -88,8 +88,8 @@ public:
   void addOutput(Mantid::API::WorkspaceGroup_sptr resultGroup,
                  Mantid::API::ITableWorkspace_sptr parameterTable,
                  Mantid::API::WorkspaceGroup_sptr resultWorkspace,
-                 const FitDataIterator &fitDataBegin,
-                 const FitDataIterator &fitDataEnd);
+                 const FitDataIteratorNew &fitDataBegin,
+                 const FitDataIteratorNew &fitDataEnd);
   void addOutput(Mantid::API::WorkspaceGroup_sptr resultGroup,
                  Mantid::API::ITableWorkspace_sptr parameterTable,
                  Mantid::API::WorkspaceGroup_sptr resultWorkspace,
@@ -99,24 +99,24 @@ public:
 
 private:
   void updateFitResults(Mantid::API::WorkspaceGroup_sptr resultGroup,
-                        const FitDataIterator &fitDataBegin,
-                        const FitDataIterator &fitDataEnd);
+                        const FitDataIteratorNew &fitDataBegin,
+                        const FitDataIteratorNew &fitDataEnd);
   void updateParameters(Mantid::API::ITableWorkspace_sptr parameterTable,
-                        const FitDataIterator &fitDataBegin,
-                        const FitDataIterator &fitDataEnd);
+                        const FitDataIteratorNew &fitDataBegin,
+                        const FitDataIteratorNew &fitDataEnd);
   void
   updateFitResultsFromUnstructured(Mantid::API::WorkspaceGroup_sptr resultGroup,
-                                   const FitDataIterator &fitDataBegin,
-                                   const FitDataIterator &fitDataEnd);
+                                   const FitDataIteratorNew &fitDataBegin,
+                                   const FitDataIteratorNew &fitDataEnd);
   void
   updateFitResultsFromStructured(Mantid::API::WorkspaceGroup_sptr resultGroup,
-                                 const FitDataIterator &fitDataBegin,
-                                 const FitDataIterator &fitDataEnd);
+                                 const FitDataIteratorNew &fitDataBegin,
+                                 const FitDataIteratorNew &fitDataEnd);
 
   boost::weak_ptr<Mantid::API::WorkspaceGroup> m_resultGroup;
   boost::weak_ptr<Mantid::API::WorkspaceGroup> m_resultWorkspace;
-  std::unordered_map<IndirectFitData const *, ParameterValues> m_parameters;
-  std::unordered_map<IndirectFitData const *, ResultLocations>
+  std::unordered_map<IndirectFitData const *, ParameterValuesNew> m_parameters;
+  std::unordered_map<IndirectFitData const *, ResultLocationsNew>
       m_outputResultLocations;
 };
 
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitPlotModel.cpp b/qt/scientific_interfaces/Indirect/IndirectFitPlotModel.cpp
index aae021bac6573687fb6499bd628edb58398f2781..75be9141fbdb4ee54fff66b77962fce3f31c7ac0 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitPlotModel.cpp
+++ b/qt/scientific_interfaces/Indirect/IndirectFitPlotModel.cpp
@@ -158,7 +158,7 @@ MatrixWorkspace_sptr IndirectFitPlotModel::getWorkspace() const {
   return m_fittingModel->getWorkspace(m_activeIndex);
 }
 
-Spectra IndirectFitPlotModel::getSpectra() const {
+SpectraNew IndirectFitPlotModel::getSpectra() const {
   return m_fittingModel->getSpectra(m_activeIndex);
 }
 
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitPlotModel.h b/qt/scientific_interfaces/Indirect/IndirectFitPlotModel.h
index 1f34b92b8859d78b27909c1b7fdbea733a7da962..783e41fe662b3e8208c8d5594a506787035db3d9 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitPlotModel.h
+++ b/qt/scientific_interfaces/Indirect/IndirectFitPlotModel.h
@@ -4,8 +4,8 @@
 //     NScD Oak Ridge National Laboratory, European Spallation Source
 //     & Institut Laue - Langevin
 // SPDX - License - Identifier: GPL - 3.0 +
-#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITPLOTMODEL_H_
-#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITPLOTMODEL_H_
+#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITPLOTMODELLEGACY_H_
+#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITPLOTMODELLEGACY_H_
 
 #include "IndexTypes.h"
 #include "IndirectFittingModel.h"
@@ -29,7 +29,7 @@ public:
   Mantid::API::MatrixWorkspace_sptr getWorkspace() const;
   Mantid::API::MatrixWorkspace_sptr getResultWorkspace() const;
   Mantid::API::MatrixWorkspace_sptr getGuessWorkspace() const;
-  Spectra getSpectra() const;
+  SpectraNew getSpectra() const;
 
   Mantid::API::MatrixWorkspace_sptr
   appendGuessToInput(Mantid::API::MatrixWorkspace_sptr guessWorkspace) const;
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitPlotPresenter.cpp b/qt/scientific_interfaces/Indirect/IndirectFitPlotPresenter.cpp
index 3ee0366538f60c7f5668fa784a231894466d627f..120e458e07885ba11aa7a20c96eccf7fbf0cd897 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitPlotPresenter.cpp
+++ b/qt/scientific_interfaces/Indirect/IndirectFitPlotPresenter.cpp
@@ -10,14 +10,14 @@
 
 namespace {
 using MantidQt::CustomInterfaces::IDA::IIndirectFitPlotView;
-using MantidQt::CustomInterfaces::IDA::Spectra;
+using MantidQt::CustomInterfaces::IDA::SpectraNew;
 using MantidQt::CustomInterfaces::IDA::WorkspaceIndex;
 
 struct UpdateAvailableSpectra : public boost::static_visitor<> {
 public:
   explicit UpdateAvailableSpectra(IIndirectFitPlotView *view) : m_view(view) {}
 
-  void operator()(const Spectra &spectra) {
+  void operator()(const SpectraNew &spectra) {
     if (spectra.isContinuous()) {
       auto const minmax = spectra.getMinMax();
       m_view->setAvailableSpectra(minmax.first, minmax.second);
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitPlotPresenter.h b/qt/scientific_interfaces/Indirect/IndirectFitPlotPresenter.h
index 44ad7c9fa1c69313709ae2e0120c19eb4b931cd1..c1c48678dac4af5694b2affa5eaf63838e395cdb 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitPlotPresenter.h
+++ b/qt/scientific_interfaces/Indirect/IndirectFitPlotPresenter.h
@@ -4,8 +4,8 @@
 //     NScD Oak Ridge National Laboratory, European Spallation Source
 //     & Institut Laue - Langevin
 // SPDX - License - Identifier: GPL - 3.0 +
-#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITPLOTPRESENTER_H_
-#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITPLOTPRESENTER_H_
+#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITPLOTPRESENTERLEGACY_H_
+#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITPLOTPRESENTERLEGACY_H_
 
 #include "DllConfig.h"
 
diff --git a/qt/scientific_interfaces/Indirect/IndirectFitPlotViewLegacy.h b/qt/scientific_interfaces/Indirect/IndirectFitPlotViewLegacy.h
index b6f534ebd43db8258aa3b9d9a0ea88eaeb5bf39e..34f646db750ae790425d98bcbadb5de2790b4764 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFitPlotViewLegacy.h
+++ b/qt/scientific_interfaces/Indirect/IndirectFitPlotViewLegacy.h
@@ -4,8 +4,8 @@
 //     NScD Oak Ridge National Laboratory, European Spallation Source
 //     & Institut Laue - Langevin
 // SPDX - License - Identifier: GPL - 3.0 +
-#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITPLOTVIEW_H_
-#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITPLOTVIEW_H_
+#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITPLOTVIEWLEGACY_H_
+#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITPLOTVIEWLEGACY_H_
 
 #include "ui_IndirectFitPreviewPlot.h"
 
diff --git a/qt/scientific_interfaces/Indirect/IndirectFittingModel.cpp b/qt/scientific_interfaces/Indirect/IndirectFittingModel.cpp
index afd638a60d2d5a0b51d1e67fd1510111a2fbe95a..347594843cd12644016265d7cc66f7477d4aea58 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFittingModel.cpp
+++ b/qt/scientific_interfaces/Indirect/IndirectFittingModel.cpp
@@ -348,10 +348,10 @@ std::vector<std::string> IndirectFittingModel::getWorkspaceNames() const {
   return names;
 }
 
-Spectra IndirectFittingModel::getSpectra(DatasetIndex index) const {
+SpectraNew IndirectFittingModel::getSpectra(DatasetIndex index) const {
   if (index < m_fittingData.size())
     return m_fittingData[index]->spectra();
-  return Spectra("");
+  return SpectraNew("");
 }
 
 std::pair<double, double>
@@ -477,17 +477,17 @@ void IndirectFittingModel::setFittingData(PrivateFittingData &&fittingData) {
 
 void IndirectFittingModel::setSpectra(const std::string &spectra,
                                       DatasetIndex dataIndex) {
-  setSpectra(Spectra(spectra), dataIndex);
+  setSpectra(SpectraNew(spectra), dataIndex);
 }
 
-void IndirectFittingModel::setSpectra(Spectra &&spectra,
+void IndirectFittingModel::setSpectra(SpectraNew &&spectra,
                                       DatasetIndex dataIndex) {
   if (m_fittingData.empty())
     return;
-  m_fittingData[dataIndex]->setSpectra(std::forward<Spectra>(spectra));
+  m_fittingData[dataIndex]->setSpectra(std::forward<SpectraNew>(spectra));
 }
 
-void IndirectFittingModel::setSpectra(const Spectra &spectra,
+void IndirectFittingModel::setSpectra(const SpectraNew &spectra,
                                       DatasetIndex dataIndex) {
   if (m_fittingData.empty())
     return;
@@ -533,7 +533,7 @@ void IndirectFittingModel::addWorkspace(const std::string &workspaceName) {
       workspaceName);
   addWorkspace(
       ws,
-      Spectra(WorkspaceIndex{0},
+      SpectraNew(WorkspaceIndex{0},
               WorkspaceIndex{static_cast<int>(ws->getNumberHistograms()) - 1}));
 }
 
@@ -545,18 +545,18 @@ void IndirectFittingModel::addWorkspace(const std::string &workspaceName,
   if (workspaceName.empty() || !doesExistInADS(workspaceName))
     throw std::runtime_error("A valid sample file needs to be selected.");
 
-  addWorkspace(workspaceName, Spectra(spectra));
+  addWorkspace(workspaceName, SpectraNew(spectra));
 }
 
 void IndirectFittingModel::addWorkspace(const std::string &workspaceName,
-                                        const Spectra &spectra) {
+                                        const SpectraNew &spectra) {
   auto ws = AnalysisDataService::Instance().retrieveWS<MatrixWorkspace>(
       workspaceName);
   addWorkspace(ws, spectra);
 }
 
 void IndirectFittingModel::addWorkspace(MatrixWorkspace_sptr workspace,
-                                        const Spectra &spectra) {
+                                        const SpectraNew &spectra) {
   if (!m_fittingData.empty() &&
       equivalentWorkspaces(workspace, m_fittingData.back()->workspace()))
     m_fittingData.back()->combine(IndirectFitData(workspace, spectra));
@@ -565,7 +565,7 @@ void IndirectFittingModel::addWorkspace(MatrixWorkspace_sptr workspace,
 }
 
 void IndirectFittingModel::addNewWorkspace(MatrixWorkspace_sptr workspace,
-                                           const Spectra &spectra) {
+                                           const SpectraNew &spectra) {
   m_fittingData.emplace_back(new IndirectFitData(workspace, spectra));
   m_defaultParameters.emplace_back(
       createDefaultParameters(m_fittingData.last()));
@@ -620,7 +620,7 @@ void IndirectFittingModel::setDefaultParameterValue(const std::string &name,
                                                     double value,
                                                     DatasetIndex dataIndex) {
   if (m_defaultParameters.size() > dataIndex)
-    m_defaultParameters[dataIndex][name] = ParameterValue(value);
+    m_defaultParameters[dataIndex][name] = ParameterValueNew(value);
 }
 
 void IndirectFittingModel::addOutput(IAlgorithm_sptr fitAlgorithm) {
@@ -628,8 +628,8 @@ void IndirectFittingModel::addOutput(IAlgorithm_sptr fitAlgorithm) {
 }
 
 void IndirectFittingModel::addOutput(IAlgorithm_sptr fitAlgorithm,
-                                     const FitDataIterator &fitDataBegin,
-                                     const FitDataIterator &fitDataEnd) {
+                                     const FitDataIteratorNew &fitDataBegin,
+                                     const FitDataIteratorNew &fitDataEnd) {
   auto group = getOutputGroup(fitAlgorithm);
   auto parameters = getOutputParameters(fitAlgorithm);
   auto result = getOutputResult(fitAlgorithm);
@@ -653,8 +653,8 @@ void IndirectFittingModel::addSingleFitOutput(IAlgorithm_sptr fitAlgorithm,
 void IndirectFittingModel::addOutput(WorkspaceGroup_sptr resultGroup,
                                      ITableWorkspace_sptr parameterTable,
                                      WorkspaceGroup_sptr resultWorkspace,
-                                     const FitDataIterator &fitDataBegin,
-                                     const FitDataIterator &fitDataEnd) {
+                                     const FitDataIteratorNew &fitDataBegin,
+                                     const FitDataIteratorNew &fitDataEnd) {
   if (m_previousModelSelected && m_fitOutput)
     addOutput(m_fitOutput.get(), resultGroup, parameterTable, resultWorkspace,
               fitDataBegin, fitDataEnd);
@@ -681,8 +681,8 @@ void IndirectFittingModel::addOutput(WorkspaceGroup_sptr resultGroup,
 
 IndirectFitOutput IndirectFittingModel::createFitOutput(
     WorkspaceGroup_sptr resultGroup, ITableWorkspace_sptr parameterTable,
-    WorkspaceGroup_sptr resultWorkspace, const FitDataIterator &fitDataBegin,
-    const FitDataIterator &fitDataEnd) const {
+    WorkspaceGroup_sptr resultWorkspace, const FitDataIteratorNew &fitDataBegin,
+    const FitDataIteratorNew &fitDataEnd) const {
   return IndirectFitOutput(resultGroup, parameterTable, resultWorkspace,
                            fitDataBegin, fitDataEnd);
 }
@@ -700,8 +700,8 @@ void IndirectFittingModel::addOutput(IndirectFitOutput *fitOutput,
                                      WorkspaceGroup_sptr resultGroup,
                                      ITableWorkspace_sptr parameterTable,
                                      WorkspaceGroup_sptr resultWorkspace,
-                                     const FitDataIterator &fitDataBegin,
-                                     const FitDataIterator &fitDataEnd) const {
+                                     const FitDataIteratorNew &fitDataBegin,
+                                     const FitDataIteratorNew &fitDataEnd) const {
   fitOutput->addOutput(resultGroup, parameterTable, resultWorkspace,
                        fitDataBegin, fitDataEnd);
 }
@@ -719,7 +719,7 @@ FittingMode IndirectFittingModel::getFittingMode() const {
   return m_fittingMode;
 }
 
-std::unordered_map<std::string, ParameterValue>
+std::unordered_map<std::string, ParameterValueNew>
 IndirectFittingModel::getParameterValues(DatasetIndex index,
                                          WorkspaceIndex spectrum) const {
   if (m_fittingData.size() > index) {
@@ -730,22 +730,22 @@ IndirectFittingModel::getParameterValues(DatasetIndex index,
       return getDefaultParameters(index);
     return combine(getDefaultParameters(index), parameters);
   }
-  return std::unordered_map<std::string, ParameterValue>();
+  return std::unordered_map<std::string, ParameterValueNew>();
 }
 
-std::unordered_map<std::string, ParameterValue>
+std::unordered_map<std::string, ParameterValueNew>
 IndirectFittingModel::getFitParameters(DatasetIndex index,
                                        WorkspaceIndex spectrum) const {
   if (m_fitOutput)
     return m_fitOutput->getParameters(m_fittingData[index].get(), spectrum);
-  return std::unordered_map<std::string, ParameterValue>();
+  return std::unordered_map<std::string, ParameterValueNew>();
 }
 
-std::unordered_map<std::string, ParameterValue>
+std::unordered_map<std::string, ParameterValueNew>
 IndirectFittingModel::getDefaultParameters(DatasetIndex index) const {
   if (index < m_defaultParameters.size())
     return mapKeys(m_defaultParameters[index], mapDefaultParameterNames());
-  return std::unordered_map<std::string, ParameterValue>();
+  return std::unordered_map<std::string, ParameterValueNew>();
 }
 
 std::unordered_map<std::string, std::string>
@@ -755,9 +755,9 @@ IndirectFittingModel::mapDefaultParameterNames() const {
   return std::unordered_map<std::string, std::string>();
 }
 
-std::unordered_map<std::string, ParameterValue>
+std::unordered_map<std::string, ParameterValueNew>
 IndirectFittingModel::createDefaultParameters(DatasetIndex /*unused*/) const {
-  return std::unordered_map<std::string, ParameterValue>();
+  return std::unordered_map<std::string, ParameterValueNew>();
 }
 
 std::string IndirectFittingModel::getResultXAxisUnit() const {
@@ -766,7 +766,7 @@ std::string IndirectFittingModel::getResultXAxisUnit() const {
 
 std::string IndirectFittingModel::getResultLogName() const { return "axis-1"; }
 
-boost::optional<ResultLocation>
+boost::optional<ResultLocationNew>
 IndirectFittingModel::getResultLocation(DatasetIndex index,
                                         WorkspaceIndex spectrum) const {
   if (/*m_previousModelSelected && */ m_fitOutput &&
@@ -893,7 +893,7 @@ IAlgorithm_sptr IndirectFittingModel::createSimultaneousFitWithEqualRange(
   auto const dataIndex = DatasetIndex{0};
   auto const workspaceIndex = getSpectra(dataIndex).front();
   auto exclude =
-      vectorFromString<double>(getExcludeRegion(dataIndex, workspaceIndex));
+      vectorFromStringNew<double>(getExcludeRegion(dataIndex, workspaceIndex));
   addInputDataToSimultaneousFit(fitAlgorithm, m_fittingData,
                                 getFittingRange(dataIndex, workspaceIndex),
                                 exclude);
diff --git a/qt/scientific_interfaces/Indirect/IndirectFittingModel.h b/qt/scientific_interfaces/Indirect/IndirectFittingModel.h
index 070f03d3d2bc0d2fc6bb143b7d827898813ec957..d7b5470b22791ebcc4644fd6282740a2dd426271 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFittingModel.h
+++ b/qt/scientific_interfaces/Indirect/IndirectFittingModel.h
@@ -4,8 +4,8 @@
 //     NScD Oak Ridge National Laboratory, European Spallation Source
 //     & Institut Laue - Langevin
 // SPDX - License - Identifier: GPL - 3.0 +
-#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITTINGMODEL_H_
-#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITTINGMODEL_H_
+#ifndef MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITTINGMODELLEGACY_H_
+#define MANTIDQTCUSTOMINTERFACESIDA_INDIRECTFITTINGMODELLEGACY_H_
 
 #include "IndexTypes.h"
 #include "IndirectFitData.h"
@@ -31,7 +31,7 @@ using IndirectFitDataCollectionType =
     IndexCollectionType<DatasetIndex, std::unique_ptr<IndirectFitData>>;
 using DefaultParametersType =
     IndexCollectionType<DatasetIndex,
-                        std::unordered_map<std::string, ParameterValue>>;
+                        std::unordered_map<std::string, ParameterValueNew>>;
 
 struct PrivateFittingData {
   friend class IndirectFittingModel;
@@ -58,7 +58,7 @@ public:
   virtual bool hasWorkspace(std::string const &workspaceName) const;
   virtual Mantid::API::MatrixWorkspace_sptr
   getWorkspace(DatasetIndex index) const;
-  Spectra getSpectra(DatasetIndex index) const;
+  SpectraNew getSpectra(DatasetIndex index) const;
   virtual std::pair<double, double>
   getFittingRange(DatasetIndex dataIndex, WorkspaceIndex spectrum) const;
   virtual std::string getExcludeRegion(DatasetIndex dataIndex,
@@ -84,8 +84,8 @@ public:
 
   void setFittingData(PrivateFittingData &&fittingData);
   void setSpectra(const std::string &spectra, DatasetIndex dataIndex);
-  void setSpectra(Spectra &&spectra, DatasetIndex dataIndex);
-  void setSpectra(const Spectra &spectra, DatasetIndex dataIndex);
+  void setSpectra(SpectraNew &&spectra, DatasetIndex dataIndex);
+  void setSpectra(const SpectraNew &spectra, DatasetIndex dataIndex);
   virtual void setStartX(double startX, DatasetIndex dataIndex,
                          WorkspaceIndex spectrum);
   virtual void setStartX(double startX, DatasetIndex dataIndex);
@@ -99,9 +99,9 @@ public:
   virtual void addWorkspace(const std::string &workspaceName);
   void addWorkspace(const std::string &workspaceName,
                     const std::string &spectra);
-  void addWorkspace(const std::string &workspaceName, const Spectra &spectra);
+  void addWorkspace(const std::string &workspaceName, const SpectraNew &spectra);
   virtual void addWorkspace(Mantid::API::MatrixWorkspace_sptr workspace,
-                            const Spectra &spectra);
+                            const SpectraNew &spectra);
   virtual void removeWorkspace(DatasetIndex index);
   virtual PrivateFittingData clearWorkspaces();
   void setFittingMode(FittingMode mode);
@@ -116,13 +116,13 @@ public:
   void applySpectra(DatasetIndex index, const F &functor) const;
 
   FittingMode getFittingMode() const;
-  std::unordered_map<std::string, ParameterValue>
+  std::unordered_map<std::string, ParameterValueNew>
   getParameterValues(DatasetIndex dataIndex, WorkspaceIndex spectrum) const;
-  std::unordered_map<std::string, ParameterValue>
+  std::unordered_map<std::string, ParameterValueNew>
   getFitParameters(DatasetIndex dataIndex, WorkspaceIndex spectrum) const;
-  std::unordered_map<std::string, ParameterValue>
+  std::unordered_map<std::string, ParameterValueNew>
   getDefaultParameters(DatasetIndex dataIndex) const;
-  boost::optional<ResultLocation>
+  boost::optional<ResultLocationNew>
   getResultLocation(DatasetIndex dataIndex, WorkspaceIndex spectrum) const;
   Mantid::API::WorkspaceGroup_sptr getResultWorkspace() const;
   Mantid::API::WorkspaceGroup_sptr getResultGroup() const;
@@ -154,7 +154,7 @@ protected:
                                         DatasetIndex index,
                                         WorkspaceIndex spectrum) const;
   void addNewWorkspace(Mantid::API::MatrixWorkspace_sptr workspace,
-                       const Spectra &spectra);
+                       const SpectraNew &spectra);
   void removeFittingData(DatasetIndex index);
 
 private:
@@ -172,7 +172,7 @@ private:
   virtual std::string simultaneousFitOutputName() const = 0;
   virtual std::string singleFitOutputName(DatasetIndex index,
                                           WorkspaceIndex spectrum) const = 0;
-  virtual std::unordered_map<std::string, ParameterValue>
+  virtual std::unordered_map<std::string, ParameterValueNew>
   createDefaultParameters(DatasetIndex index) const;
 
   virtual std::string getResultXAxisUnit() const;
@@ -184,8 +184,8 @@ private:
   createFitOutput(Mantid::API::WorkspaceGroup_sptr resultGroup,
                   Mantid::API::ITableWorkspace_sptr parameterTable,
                   Mantid::API::WorkspaceGroup_sptr resultWorkspace,
-                  const FitDataIterator &fitDataBegin,
-                  const FitDataIterator &fitDataEnd) const;
+                  const FitDataIteratorNew &fitDataBegin,
+                  const FitDataIteratorNew &fitDataEnd) const;
   virtual IndirectFitOutput
   createFitOutput(Mantid::API::WorkspaceGroup_sptr resultGroup,
                   Mantid::API::ITableWorkspace_sptr parameterTable,
@@ -193,13 +193,13 @@ private:
                   IndirectFitData *fitData, WorkspaceIndex spectrum) const;
 
   void addOutput(Mantid::API::IAlgorithm_sptr fitAlgorithm,
-                 const FitDataIterator &fitDataBegin,
-                 const FitDataIterator &fitDataEnd);
+                 const FitDataIteratorNew &fitDataBegin,
+                 const FitDataIteratorNew &fitDataEnd);
   void addOutput(Mantid::API::WorkspaceGroup_sptr resultGroup,
                  Mantid::API::ITableWorkspace_sptr parameterTable,
                  Mantid::API::WorkspaceGroup_sptr resultWorkspace,
-                 const FitDataIterator &fitDataBegin,
-                 const FitDataIterator &fitDataEnd);
+                 const FitDataIteratorNew &fitDataBegin,
+                 const FitDataIteratorNew &fitDataEnd);
   void addOutput(Mantid::API::WorkspaceGroup_sptr resultGroup,
                  Mantid::API::ITableWorkspace_sptr parameterTable,
                  Mantid::API::WorkspaceGroup_sptr resultWorkspace,
@@ -209,8 +209,8 @@ private:
                          Mantid::API::WorkspaceGroup_sptr resultGroup,
                          Mantid::API::ITableWorkspace_sptr parameterTable,
                          Mantid::API::WorkspaceGroup_sptr resultWorkspace,
-                         const FitDataIterator &fitDataBegin,
-                         const FitDataIterator &fitDataEnd) const;
+                         const FitDataIteratorNew &fitDataBegin,
+                         const FitDataIteratorNew &fitDataEnd) const;
   virtual void addOutput(IndirectFitOutput *fitOutput,
                          Mantid::API::WorkspaceGroup_sptr resultGroup,
                          Mantid::API::ITableWorkspace_sptr parameterTable,
diff --git a/qt/scientific_interfaces/Indirect/IndirectFittingModelLegacy.cpp b/qt/scientific_interfaces/Indirect/IndirectFittingModelLegacy.cpp
index 897086416983117c0de351f9426dd97aaf8de70e..5b777450289caec4ca286ebd28979fcbd14dd963 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFittingModelLegacy.cpp
+++ b/qt/scientific_interfaces/Indirect/IndirectFittingModelLegacy.cpp
@@ -336,7 +336,7 @@ operator=(PrivateFittingDataLegacy &&fittingData) {
 }
 
 IndirectFittingModelLegacy::IndirectFittingModelLegacy()
-    : m_previousModelSelected(false), m_fittingMode(FittingMode::SEQUENTIAL) {}
+    : m_previousModelSelected(false), m_fittingMode(FittingModeLegacy::SEQUENTIAL) {}
 
 bool IndirectFittingModelLegacy::hasWorkspace(
     std::string const &workspaceName) const {
@@ -371,7 +371,7 @@ IndirectFittingModelLegacy::getFittingRange(std::size_t dataIndex,
                                       std::size_t spectrum) const {
   if (dataIndex < m_fittingData.size() &&
       !m_fittingData[dataIndex]->zeroSpectra()) {
-    if (FittingMode::SEQUENTIAL == m_fittingMode)
+    if (FittingModeLegacy::SEQUENTIAL == m_fittingMode)
       return m_fittingData.front()->getRange(0);
     return m_fittingData[dataIndex]->getRange(spectrum);
   }
@@ -382,7 +382,7 @@ std::string IndirectFittingModelLegacy::getExcludeRegion(std::size_t dataIndex,
                                                    std::size_t spectrum) const {
   if (dataIndex < m_fittingData.size() &&
       !m_fittingData[dataIndex]->zeroSpectra()) {
-    if (FittingMode::SEQUENTIAL == m_fittingMode)
+    if (FittingModeLegacy::SEQUENTIAL == m_fittingMode)
       return m_fittingData.back()->getExcludeRegion(0);
     return m_fittingData[dataIndex]->getExcludeRegion(spectrum);
   }
@@ -482,7 +482,7 @@ void IndirectFittingModelLegacy::setSpectra(const Spectra &spectra,
 
 void IndirectFittingModelLegacy::setStartX(double startX, std::size_t dataIndex,
                                      std::size_t spectrum) {
-  if (FittingMode::SEQUENTIAL == m_fittingMode)
+  if (FittingModeLegacy::SEQUENTIAL == m_fittingMode)
     m_fittingData.front()->setStartX(startX, 0);
   else
     m_fittingData[dataIndex]->setStartX(startX, spectrum);
@@ -490,7 +490,7 @@ void IndirectFittingModelLegacy::setStartX(double startX, std::size_t dataIndex,
 
 void IndirectFittingModelLegacy::setEndX(double endX, std::size_t dataIndex,
                                    std::size_t spectrum) {
-  if (FittingMode::SEQUENTIAL == m_fittingMode)
+  if (FittingModeLegacy::SEQUENTIAL == m_fittingMode)
     m_fittingData.front()->setEndX(endX, 0);
   else
     m_fittingData[dataIndex]->setEndX(endX, spectrum);
@@ -499,7 +499,7 @@ void IndirectFittingModelLegacy::setEndX(double endX, std::size_t dataIndex,
 void IndirectFittingModelLegacy::setExcludeRegion(const std::string &exclude,
                                             std::size_t dataIndex,
                                             std::size_t spectrum) {
-  if (FittingMode::SEQUENTIAL == m_fittingMode)
+  if (FittingModeLegacy::SEQUENTIAL == m_fittingMode)
     m_fittingData.front()->setExcludeRegionString(exclude, 0);
   else
     m_fittingData[dataIndex]->setExcludeRegionString(exclude, spectrum);
@@ -581,7 +581,7 @@ PrivateFittingDataLegacy IndirectFittingModelLegacy::clearWorkspaces() {
   return std::move(m_fittingData);
 }
 
-void IndirectFittingModelLegacy::setFittingMode(FittingMode mode) {
+void IndirectFittingModelLegacy::setFittingMode(FittingModeLegacy mode) {
   m_fittingMode = mode;
 }
 
@@ -689,7 +689,7 @@ void IndirectFittingModelLegacy::addOutput(
                        spectrum);
 }
 
-FittingMode IndirectFittingModelLegacy::getFittingMode() const {
+FittingModeLegacy IndirectFittingModelLegacy::getFittingMode() const {
   return m_fittingMode;
 }
 
@@ -770,8 +770,8 @@ IAlgorithm_sptr IndirectFittingModelLegacy::getFittingAlgorithm() const {
 }
 
 IAlgorithm_sptr
-IndirectFittingModelLegacy::getFittingAlgorithm(FittingMode mode) const {
-  if (mode == FittingMode::SEQUENTIAL)
+IndirectFittingModelLegacy::getFittingAlgorithm(FittingModeLegacy mode) const {
+  if (mode == FittingModeLegacy::SEQUENTIAL)
     return createSequentialFit(getFittingFunction());
   else
     return createSimultaneousFit(getMultiDomainFunction());
diff --git a/qt/scientific_interfaces/Indirect/IndirectFittingModelLegacy.h b/qt/scientific_interfaces/Indirect/IndirectFittingModelLegacy.h
index 71fceb8e31d6a4b1d0d5388652757a3e9cfe36cb..0df33d931c33d5519a22eaa6c0961948f7462108 100644
--- a/qt/scientific_interfaces/Indirect/IndirectFittingModelLegacy.h
+++ b/qt/scientific_interfaces/Indirect/IndirectFittingModelLegacy.h
@@ -21,7 +21,7 @@ namespace MantidQt {
 namespace CustomInterfaces {
 namespace IDA {
 
-enum class FittingMode { SEQUENTIAL, SIMULTANEOUS };
+enum class FittingModeLegacy { SEQUENTIAL, SIMULTANEOUS };
 
 class IndirectFittingModelLegacy;
 
@@ -91,7 +91,7 @@ public:
                             const Spectra &spectra);
   virtual void removeWorkspace(std::size_t index);
   virtual PrivateFittingDataLegacy clearWorkspaces();
-  void setFittingMode(FittingMode mode);
+  void setFittingMode(FittingModeLegacy mode);
   virtual void setFitFunction(Mantid::API::IFunction_sptr function);
   virtual void setDefaultParameterValue(const std::string &name, double value,
                                         std::size_t dataIndex);
@@ -102,7 +102,7 @@ public:
   template <typename F>
   void applySpectra(std::size_t index, const F &functor) const;
 
-  FittingMode getFittingMode() const;
+  FittingModeLegacy getFittingMode() const;
   std::unordered_map<std::string, ParameterValue>
   getParameterValues(std::size_t dataIndex, std::size_t spectrum) const;
   std::unordered_map<std::string, ParameterValue>
@@ -123,7 +123,7 @@ public:
                             std::size_t index);
 
 protected:
-  Mantid::API::IAlgorithm_sptr getFittingAlgorithm(FittingMode mode) const;
+  Mantid::API::IAlgorithm_sptr getFittingAlgorithm(FittingModeLegacy mode) const;
   Mantid::API::IAlgorithm_sptr
   createSequentialFit(Mantid::API::IFunction_sptr function) const;
   Mantid::API::IAlgorithm_sptr
@@ -207,7 +207,7 @@ private:
   std::vector<std::unordered_map<std::string, ParameterValue>>
       m_defaultParameters;
   bool m_previousModelSelected;
-  FittingMode m_fittingMode;
+  FittingModeLegacy m_fittingMode;
 };
 
 template <typename F>
diff --git a/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtFunctionModel.cpp b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtFunctionModel.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..3be5ec56bfae030cc37c6d6ba5dbbe23334d8880
--- /dev/null
+++ b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtFunctionModel.cpp
@@ -0,0 +1,679 @@
+// 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 +
+#include "IqtFunctionModel.h"
+#include "MantidAPI/FunctionFactory.h"
+#include "MantidAPI/IFunction.h"
+#include "MantidAPI/ITableWorkspace.h"
+#include "MantidQtWidgets/Common/FunctionBrowser/FunctionBrowserUtils.h"
+#include <map>
+
+namespace MantidQt {
+namespace CustomInterfaces {
+namespace IDA {
+
+using namespace MantidWidgets;
+using namespace Mantid::API;
+
+namespace {
+std::map<IqtFunctionModel::ParamID, QString> g_paramName{
+    {IqtFunctionModel::ParamID::EXP1_HEIGHT, "Height"},
+    {IqtFunctionModel::ParamID::EXP1_LIFETIME, "Lifetime"},
+    {IqtFunctionModel::ParamID::EXP2_HEIGHT, "Height"},
+    {IqtFunctionModel::ParamID::EXP2_LIFETIME, "Lifetime"},
+    {IqtFunctionModel::ParamID::STRETCH_HEIGHT, "Height"},
+    {IqtFunctionModel::ParamID::STRETCH_LIFETIME, "Lifetime"},
+    {IqtFunctionModel::ParamID::STRETCH_STRETCHING, "Stretching"},
+    {IqtFunctionModel::ParamID::BG_A0, "A0"}};
+}
+
+IqtFunctionModel::IqtFunctionModel() {}
+
+void IqtFunctionModel::clearData() {
+  m_numberOfExponentials = 0;
+  m_hasStretchExponential = false;
+  m_background.clear();
+  m_model.clear();
+}
+
+void IqtFunctionModel::setFunction(IFunction_sptr fun) {
+  clearData();
+  if (!fun)
+    return;
+  if (fun->nFunctions() == 0) {
+    auto const name = fun->name();
+    if (name == "ExpDecay") {
+      m_numberOfExponentials = 1;
+    } else if (name == "StretchExp") {
+      m_hasStretchExponential = true;
+    } else if (name == "FlatBackground") {
+      m_background = QString::fromStdString(name);
+    } else {
+      throw std::runtime_error("Cannot set function " + name);
+    }
+    m_model.setFunction(fun);
+    return;
+  }
+  bool areExponentialsSet = false;
+  bool isStretchSet = false;
+  bool isBackgroundSet = false;
+  for (size_t i = 0; i < fun->nFunctions(); ++i) {
+    auto f = fun->getFunction(i);
+    auto const name = f->name();
+    if (name == "ExpDecay") {
+      if (areExponentialsSet) {
+        throw std::runtime_error("Function has wrong structure.");
+      }
+      if (m_numberOfExponentials == 0) {
+        m_numberOfExponentials = 1;
+      } else {
+        m_numberOfExponentials = 2;
+        areExponentialsSet = true;
+      }
+    } else if (name == "StretchExp") {
+      if (isStretchSet) {
+        throw std::runtime_error("Function has wrong structure.");
+      }
+      m_hasStretchExponential = true;
+      areExponentialsSet = true;
+      isStretchSet = true;
+    } else if (name == "FlatBackground") {
+      if (isBackgroundSet) {
+        throw std::runtime_error("Function has wrong structure.");
+      }
+      m_background = QString::fromStdString(name);
+      areExponentialsSet = true;
+      isStretchSet = true;
+      isBackgroundSet = true;
+    } else {
+      clear();
+      throw std::runtime_error("Function has wrong structure.");
+    }
+  }
+  m_model.setFunction(fun);
+}
+
+IFunction_sptr IqtFunctionModel::getFitFunction() const {
+  return m_model.getFitFunction();
+}
+
+bool IqtFunctionModel::hasFunction() const { return m_model.hasFunction(); }
+
+void IqtFunctionModel::addFunction(const QString &prefix,
+                                   const QString &funStr) {
+  if (!prefix.isEmpty())
+    throw std::runtime_error(
+        "Function doesn't have member function with prefix " +
+        prefix.toStdString());
+  auto fun =
+      FunctionFactory::Instance().createInitialized(funStr.toStdString());
+  auto const name = fun->name();
+  QString newPrefix;
+  if (name == "ExpDecay") {
+    auto const ne = getNumberOfExponentials();
+    if (ne > 1)
+      throw std::runtime_error("Cannot add more exponentials.");
+    setNumberOfExponentials(ne + 1);
+    if (auto const prefix = getExp2Prefix()) {
+      newPrefix = *prefix;
+    } else {
+      newPrefix = *getExp1Prefix();
+    }
+  } else if (name == "StretchExp") {
+    if (hasStretchExponential())
+      throw std::runtime_error("Cannot add more stretched exponentials.");
+    setStretchExponential(true);
+    newPrefix = *getStretchPrefix();
+  } else if (name == "FlatBackground") {
+    if (hasBackground())
+      throw std::runtime_error("Cannot add more backgrounds.");
+    setBackground(QString::fromStdString(name));
+    newPrefix = *getBackgroundPrefix();
+  } else {
+    throw std::runtime_error("Cannot add funtion " + name);
+  }
+  auto newFun = getFunctionWithPrefix(newPrefix, getSingleFunction(0));
+  copyParametersAndErrors(*fun, *newFun);
+  if (getNumberLocalFunctions() > 1) {
+    copyParametersAndErrorsToAllLocalFunctions(*getSingleFunction(0));
+  }
+}
+
+void IqtFunctionModel::removeFunction(const QString &prefix) {
+  if (prefix.isEmpty()) {
+    clear();
+    return;
+  }
+  auto prefix1 = getExp1Prefix();
+  if (prefix1 && *prefix1 == prefix) {
+    setNumberOfExponentials(0);
+    return;
+  }
+  prefix1 = getExp2Prefix();
+  if (prefix1 && *prefix1 == prefix) {
+    setNumberOfExponentials(1);
+    return;
+  }
+  prefix1 = getStretchPrefix();
+  if (prefix1 && *prefix1 == prefix) {
+    setStretchExponential(false);
+    return;
+  }
+  prefix1 = getBackgroundPrefix();
+  if (prefix1 && *prefix1 == prefix) {
+    removeBackground();
+    return;
+  }
+  throw std::runtime_error(
+      "Function doesn't have member function with prefix " +
+      prefix.toStdString());
+}
+
+void IqtFunctionModel::setNumberOfExponentials(int n) {
+  auto oldValues = getCurrentValues();
+  m_numberOfExponentials = n;
+  m_model.setFunctionString(buildFunctionString());
+  m_model.setGlobalParameters(makeGlobalList());
+  setCurrentValues(oldValues);
+}
+
+int IqtFunctionModel::getNumberOfExponentials() const {
+  return m_numberOfExponentials;
+}
+
+void IqtFunctionModel::setStretchExponential(bool on) {
+  auto oldValues = getCurrentValues();
+  m_hasStretchExponential = on;
+  m_model.setFunctionString(buildFunctionString());
+  m_model.setGlobalParameters(makeGlobalList());
+  setCurrentValues(oldValues);
+  if (on) {
+    estimateStretchExpParameters();
+  }
+}
+
+bool IqtFunctionModel::hasStretchExponential() const {
+  return m_hasStretchExponential;
+}
+
+void IqtFunctionModel::setBackground(const QString &name) {
+  auto oldValues = getCurrentValues();
+  m_background = name;
+  m_model.setFunctionString(buildFunctionString());
+  m_model.setGlobalParameters(makeGlobalList());
+  setCurrentValues(oldValues);
+}
+
+void IqtFunctionModel::removeBackground() {
+  auto oldValues = getCurrentValues();
+  m_background.clear();
+  m_model.setFunctionString(buildFunctionString());
+  m_model.setGlobalParameters(makeGlobalList());
+  setCurrentValues(oldValues);
+}
+
+bool IqtFunctionModel::hasBackground() const { return !m_background.isEmpty(); }
+
+void IqtFunctionModel::tieIntensities(bool on) {
+  auto heightName = getParameterName(ParamID::STRETCH_HEIGHT);
+  if (!heightName)
+    heightName = getParameterName(ParamID::EXP1_HEIGHT);
+  auto const a0Name = getParameterName(ParamID::BG_A0);
+  if (!heightName || !a0Name)
+    return;
+  auto const tie = on ? QString("1-%1").arg(*a0Name) : QString();
+  for (auto i = 0; i < getNumberDomains(); ++i) {
+    setLocalParameterTie(*heightName, i, tie);
+  }
+}
+
+void IqtFunctionModel::updateParameterEstimationData(
+    DataForParameterEstimationCollection &&data) {
+  m_estimationData = std::move(data);
+}
+
+QString IqtFunctionModel::setBackgroundA0(double value) {
+  if (hasBackground()) {
+    setParameter(ParamID::BG_A0, value);
+    return *getParameterName(ParamID::BG_A0);
+  }
+  return "";
+}
+
+void IqtFunctionModel::setNumberDomains(int n) { m_model.setNumberDomains(n); }
+
+int IqtFunctionModel::getNumberDomains() const {
+  return m_model.getNumberDomains();
+}
+
+void IqtFunctionModel::setParameter(const QString &paramName, double value) {
+  m_model.setParameter(paramName, value);
+}
+
+void IqtFunctionModel::setParameterError(const QString &paramName,
+                                         double value) {
+  m_model.setParameterError(paramName, value);
+}
+
+double IqtFunctionModel::getParameter(const QString &paramName) const {
+  return m_model.getParameter(paramName);
+}
+
+double IqtFunctionModel::getParameterError(const QString &paramName) const {
+  return m_model.getParameterError(paramName);
+}
+
+QString
+IqtFunctionModel::getParameterDescription(const QString &paramName) const {
+  return m_model.getParameterDescription(paramName);
+}
+
+QStringList IqtFunctionModel::getParameterNames() const {
+  return m_model.getParameterNames();
+}
+
+IFunction_sptr IqtFunctionModel::getSingleFunction(int index) const {
+  return m_model.getSingleFunction(index);
+}
+
+IFunction_sptr IqtFunctionModel::getCurrentFunction() const {
+  return m_model.getCurrentFunction();
+}
+
+QStringList IqtFunctionModel::getGlobalParameters() const {
+  return m_model.getGlobalParameters();
+}
+
+QStringList IqtFunctionModel::getLocalParameters() const {
+  return m_model.getLocalParameters();
+}
+
+void IqtFunctionModel::setGlobalParameters(const QStringList &globals) {
+  m_globals.clear();
+  for (auto const &name : globals) {
+    addGlobal(name);
+  }
+  auto newGlobals = makeGlobalList();
+  m_model.setGlobalParameters(newGlobals);
+}
+
+bool IqtFunctionModel::isGlobal(const QString &parName) const {
+  return m_model.isGlobal(parName);
+}
+
+void IqtFunctionModel::setGlobal(const QString &parName, bool on) {
+  if (parName.isEmpty())
+    return;
+  if (on)
+    addGlobal(parName);
+  else
+    removeGlobal(parName);
+  auto globals = makeGlobalList();
+  m_model.setGlobalParameters(globals);
+}
+
+void IqtFunctionModel::addGlobal(const QString &parName) {
+  auto const pid = getParameterId(parName);
+  if (pid && !m_globals.contains(*pid)) {
+    m_globals.push_back(*pid);
+  }
+}
+
+void IqtFunctionModel::removeGlobal(const QString &parName) {
+  auto const pid = getParameterId(parName);
+  if (pid && m_globals.contains(*pid)) {
+    m_globals.removeOne(*pid);
+  }
+}
+
+QStringList IqtFunctionModel::makeGlobalList() const {
+  QStringList globals;
+  for (auto const id : m_globals) {
+    auto const name = getParameterName(id);
+    if (name)
+      globals << *name;
+  }
+  return globals;
+}
+
+void IqtFunctionModel::updateMultiDatasetParameters(const IFunction &fun) {
+  m_model.updateMultiDatasetParameters(fun);
+}
+
+void IqtFunctionModel::updateMultiDatasetParameters(
+    const ITableWorkspace &paramTable) {
+  auto const nRows = paramTable.rowCount();
+  if (nRows == 0)
+    return;
+
+  auto const globalParameterNames = getGlobalParameters();
+  for (auto &&name : globalParameterNames) {
+    auto valueColumn = paramTable.getColumn(name.toStdString());
+    auto errorColumn = paramTable.getColumn((name + "_Err").toStdString());
+    m_model.setParameter(name, valueColumn->toDouble(0));
+    m_model.setParameterError(name, errorColumn->toDouble(0));
+  }
+
+  auto const localParameterNames = getLocalParameters();
+  for (auto &&name : localParameterNames) {
+    auto valueColumn = paramTable.getColumn(name.toStdString());
+    auto errorColumn = paramTable.getColumn((name + "_Err").toStdString());
+    if (nRows > 1) {
+      for (size_t i = 0; i < nRows; ++i) {
+        m_model.setLocalParameterValue(name, static_cast<int>(i),
+                                       valueColumn->toDouble(i),
+                                       errorColumn->toDouble(i));
+      }
+    } else {
+      auto const i = m_model.currentDomainIndex();
+      m_model.setLocalParameterValue(name, static_cast<int>(i),
+                                     valueColumn->toDouble(0),
+                                     errorColumn->toDouble(0));
+    }
+  }
+}
+
+void IqtFunctionModel::updateParameters(const IFunction &fun) {
+  m_model.updateParameters(fun);
+}
+
+void IqtFunctionModel::setCurrentDomainIndex(int i) {
+  m_model.setCurrentDomainIndex(i);
+}
+
+int IqtFunctionModel::currentDomainIndex() const {
+  return m_model.currentDomainIndex();
+}
+
+void IqtFunctionModel::changeTie(const QString &paramName, const QString &tie) {
+  m_model.changeTie(paramName, tie);
+}
+
+void IqtFunctionModel::addConstraint(const QString &functionIndex,
+                                     const QString &constraint) {
+  m_model.addConstraint(functionIndex, constraint);
+}
+
+void IqtFunctionModel::removeConstraint(const QString &paramName) {
+  m_model.removeConstraint(paramName);
+}
+
+void IqtFunctionModel::setDatasetNames(const QStringList &names) {
+  m_model.setDatasetNames(names);
+}
+
+QStringList IqtFunctionModel::getDatasetNames() const {
+  return m_model.getDatasetNames();
+}
+
+double IqtFunctionModel::getLocalParameterValue(const QString &parName,
+                                                int i) const {
+  return m_model.getLocalParameterValue(parName, i);
+}
+
+bool IqtFunctionModel::isLocalParameterFixed(const QString &parName,
+                                             int i) const {
+  return m_model.isLocalParameterFixed(parName, i);
+}
+
+QString IqtFunctionModel::getLocalParameterTie(const QString &parName,
+                                               int i) const {
+  return m_model.getLocalParameterTie(parName, i);
+}
+
+QString IqtFunctionModel::getLocalParameterConstraint(const QString &parName,
+                                                      int i) const {
+  return m_model.getLocalParameterConstraint(parName, i);
+}
+
+void IqtFunctionModel::setLocalParameterValue(const QString &parName, int i,
+                                              double value) {
+  m_model.setLocalParameterValue(parName, i, value);
+}
+
+void IqtFunctionModel::setLocalParameterValue(const QString &parName, int i,
+                                              double value, double error) {
+  m_model.setLocalParameterValue(parName, i, value, error);
+}
+
+void IqtFunctionModel::setLocalParameterTie(const QString &parName, int i,
+                                            const QString &tie) {
+  m_model.setLocalParameterTie(parName, i, tie);
+}
+
+void IqtFunctionModel::setLocalParameterConstraint(const QString &parName,
+                                                   int i,
+                                                   const QString &constraint) {
+  m_model.setLocalParameterConstraint(parName, i, constraint);
+}
+
+void IqtFunctionModel::setLocalParameterFixed(const QString &parName, int i,
+                                              bool fixed) {
+  m_model.setLocalParameterFixed(parName, i, fixed);
+}
+
+void IqtFunctionModel::setParameter(ParamID name, double value) {
+  auto const prefix = getPrefix(name);
+  if (prefix) {
+    m_model.setParameter(*prefix + g_paramName.at(name), value);
+  }
+}
+
+boost::optional<double> IqtFunctionModel::getParameter(ParamID name) const {
+  auto const paramName = getParameterName(name);
+  return paramName ? m_model.getParameter(*paramName)
+                   : boost::optional<double>();
+}
+
+boost::optional<double>
+IqtFunctionModel::getParameterError(ParamID name) const {
+  auto const paramName = getParameterName(name);
+  return paramName ? m_model.getParameterError(*paramName)
+                   : boost::optional<double>();
+}
+
+boost::optional<QString>
+IqtFunctionModel::getParameterName(ParamID name) const {
+  auto const prefix = getPrefix(name);
+  return prefix ? *prefix + g_paramName.at(name) : boost::optional<QString>();
+}
+
+boost::optional<QString>
+IqtFunctionModel::getParameterDescription(ParamID name) const {
+  auto const paramName = getParameterName(name);
+  return paramName ? m_model.getParameterDescription(*paramName)
+                   : boost::optional<QString>();
+}
+
+boost::optional<QString> IqtFunctionModel::getPrefix(ParamID name) const {
+  if (name <= ParamID::EXP1_LIFETIME) {
+    return getExp1Prefix();
+  } else if (name <= ParamID::EXP2_LIFETIME) {
+    return getExp2Prefix();
+  } else if (name <= ParamID::STRETCH_STRETCHING) {
+    return getStretchPrefix();
+  } else {
+    return getBackgroundPrefix();
+  }
+}
+
+QMap<IqtFunctionModel::ParamID, double>
+IqtFunctionModel::getCurrentValues() const {
+  QMap<ParamID, double> values;
+  auto store = [&values, this](ParamID name) {
+    values[name] = *getParameter(name);
+  };
+  applyParameterFunction(store);
+  return values;
+}
+
+QMap<IqtFunctionModel::ParamID, double>
+IqtFunctionModel::getCurrentErrors() const {
+  QMap<ParamID, double> errors;
+  auto store = [&errors, this](ParamID name) {
+    errors[name] = *getParameterError(name);
+  };
+  applyParameterFunction(store);
+  return errors;
+}
+
+QMap<int, QString> IqtFunctionModel::getParameterNameMap() const {
+  QMap<int, QString> out;
+  auto addToMap = [&out, this](ParamID name) {
+    out[static_cast<int>(name)] = *getParameterName(name);
+  };
+  applyParameterFunction(addToMap);
+  return out;
+}
+
+QMap<int, std::string> IqtFunctionModel::getParameterDescriptionMap() const {
+  QMap<int, std::string> out;
+  auto expDecay = FunctionFactory::Instance().createInitialized(
+      buildExpDecayFunctionString());
+  out[static_cast<int>(ParamID::EXP1_HEIGHT)] =
+      expDecay->parameterDescription(0);
+  out[static_cast<int>(ParamID::EXP1_LIFETIME)] =
+      expDecay->parameterDescription(1);
+  out[static_cast<int>(ParamID::EXP2_HEIGHT)] =
+      expDecay->parameterDescription(0);
+  out[static_cast<int>(ParamID::EXP2_LIFETIME)] =
+      expDecay->parameterDescription(1);
+  auto stretchExp = FunctionFactory::Instance().createInitialized(
+      buildStretchExpFunctionString());
+  out[static_cast<int>(ParamID::STRETCH_HEIGHT)] =
+      stretchExp->parameterDescription(0);
+  out[static_cast<int>(ParamID::STRETCH_LIFETIME)] =
+      stretchExp->parameterDescription(1);
+  out[static_cast<int>(ParamID::STRETCH_STRETCHING)] =
+      stretchExp->parameterDescription(2);
+  auto background = FunctionFactory::Instance().createInitialized(
+      buildBackgroundFunctionString());
+  out[static_cast<int>(ParamID::BG_A0)] = background->parameterDescription(0);
+  return out;
+}
+
+void IqtFunctionModel::setCurrentValues(const QMap<ParamID, double> &values) {
+  for (auto const name : values.keys()) {
+    setParameter(name, values[name]);
+  }
+}
+
+void IqtFunctionModel::applyParameterFunction(
+    std::function<void(ParamID)> paramFun) const {
+  if (m_numberOfExponentials > 0) {
+    paramFun(ParamID::EXP1_HEIGHT);
+    paramFun(ParamID::EXP1_LIFETIME);
+  }
+  if (m_numberOfExponentials > 1) {
+    paramFun(ParamID::EXP2_HEIGHT);
+    paramFun(ParamID::EXP2_LIFETIME);
+  }
+  if (m_hasStretchExponential) {
+    paramFun(ParamID::STRETCH_HEIGHT);
+    paramFun(ParamID::STRETCH_LIFETIME);
+    paramFun(ParamID::STRETCH_STRETCHING);
+  }
+  if (!m_background.isEmpty()) {
+    paramFun(ParamID::BG_A0);
+  }
+}
+
+boost::optional<IqtFunctionModel::ParamID>
+IqtFunctionModel::getParameterId(const QString &parName) {
+  boost::optional<ParamID> result;
+  auto getter = [&result, parName, this](ParamID pid) {
+    if (parName == *getParameterName(pid))
+      result = pid;
+  };
+  applyParameterFunction(getter);
+  return result;
+}
+
+std::string IqtFunctionModel::buildExpDecayFunctionString() const {
+  return "name=ExpDecay,Height=1,Lifetime=1,constraints=(Height>0,Lifetime>0)";
+}
+
+std::string IqtFunctionModel::buildStretchExpFunctionString() const {
+  return "name=StretchExp,Height=1,Lifetime=1,Stretching=1,constraints=(Height>"
+         "0,Lifetime>0,0<Stretching<1.001)";
+}
+
+std::string IqtFunctionModel::buildBackgroundFunctionString() const {
+  return "name=FlatBackground,A0=0,constraints=(A0>0)";
+}
+
+void IqtFunctionModel::estimateStretchExpParameters() {
+  auto const heightName = getParameterName(ParamID::STRETCH_HEIGHT);
+  auto const lifeTimeName = getParameterName(ParamID::STRETCH_LIFETIME);
+  auto const stretchingName = getParameterName(ParamID::STRETCH_STRETCHING);
+  if (!heightName || !lifeTimeName || !stretchingName)
+    return;
+  assert(getNumberDomains() == m_estimationData.size());
+  for (auto i = 0; i < getNumberDomains(); ++i) {
+    auto const &x = m_estimationData[i].x;
+    auto const &y = m_estimationData[i].y;
+    auto lifeTime = (x[1] - x[0]) / (log(y[0]) - log(y[1]));
+    if (lifeTime <= 0)
+      lifeTime = 1.0;
+    auto const height = y[0] * exp(x[0] / lifeTime);
+    setLocalParameterValue(*heightName, i, height);
+    setLocalParameterValue(*lifeTimeName, i, lifeTime);
+    setLocalParameterValue(*stretchingName, i, 1.0);
+  }
+}
+
+QString IqtFunctionModel::buildFunctionString() const {
+  QStringList functions;
+  if (m_numberOfExponentials > 0) {
+    functions << QString::fromStdString(buildExpDecayFunctionString());
+  }
+  if (m_numberOfExponentials > 1) {
+    functions << QString::fromStdString(buildExpDecayFunctionString());
+  }
+  if (m_hasStretchExponential) {
+    functions << QString::fromStdString(buildStretchExpFunctionString());
+  }
+  if (!m_background.isEmpty()) {
+    functions << QString::fromStdString(buildBackgroundFunctionString());
+  }
+  return functions.join(";");
+}
+
+boost::optional<QString> IqtFunctionModel::getExp1Prefix() const {
+  if (m_numberOfExponentials == 0)
+    return boost::optional<QString>();
+  if (m_numberOfExponentials == 1 && !m_hasStretchExponential &&
+      m_background.isEmpty())
+    return QString("");
+  return QString("f0.");
+}
+
+boost::optional<QString> IqtFunctionModel::getExp2Prefix() const {
+  if (m_numberOfExponentials < 2)
+    return boost::optional<QString>();
+  return QString("f1.");
+}
+
+boost::optional<QString> IqtFunctionModel::getStretchPrefix() const {
+  if (!m_hasStretchExponential)
+    return boost::optional<QString>();
+  if (m_numberOfExponentials == 0 && m_background.isEmpty())
+    return QString("");
+  return QString("f%1.").arg(m_numberOfExponentials);
+}
+
+boost::optional<QString> IqtFunctionModel::getBackgroundPrefix() const {
+  if (m_background.isEmpty())
+    return boost::optional<QString>();
+  if (m_numberOfExponentials == 0 && !m_hasStretchExponential)
+    return QString("");
+  return QString("f%1.").arg(m_numberOfExponentials +
+                             (m_hasStretchExponential ? 1 : 0));
+}
+
+} // namespace IDA
+} // namespace CustomInterfaces
+} // namespace MantidQt
diff --git a/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtFunctionModel.h b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtFunctionModel.h
new file mode 100644
index 0000000000000000000000000000000000000000..48bf3d6d52aae2218e1a3c3848b2f19e5fc5cfa2
--- /dev/null
+++ b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtFunctionModel.h
@@ -0,0 +1,140 @@
+// 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 +
+#ifndef MANTIDQT_INDIRECT_IQTFUNCTIONMODEL_H_
+#define MANTIDQT_INDIRECT_IQTFUNCTIONMODEL_H_
+
+#include "DllConfig.h"
+#include "MantidAPI/IFunction_fwd.h"
+#include "MantidAPI/ITableWorkspace_fwd.h"
+#include "MantidQtWidgets/Common/FunctionModel.h"
+#include "ParameterEstimation.h"
+
+#include <QMap>
+#include <boost/optional.hpp>
+
+namespace MantidQt {
+namespace CustomInterfaces {
+namespace IDA {
+
+using namespace Mantid::API;
+using namespace MantidWidgets;
+
+class MANTIDQT_INDIRECT_DLL IqtFunctionModel : public IFunctionModel {
+public:
+  IqtFunctionModel();
+  void setFunction(IFunction_sptr fun) override;
+  IFunction_sptr getFitFunction() const override;
+  bool hasFunction() const override;
+  void addFunction(const QString &prefix, const QString &funStr) override;
+  void removeFunction(const QString &prefix) override;
+  void setParameter(const QString &paramName, double value) override;
+  void setParameterError(const QString &paramName, double value) override;
+  double getParameter(const QString &paramName) const override;
+  double getParameterError(const QString &paramName) const override;
+  QString getParameterDescription(const QString &paramName) const override;
+  QStringList getParameterNames() const override;
+  IFunction_sptr getSingleFunction(int index) const override;
+  IFunction_sptr getCurrentFunction() const override;
+  void setNumberDomains(int) override;
+  void setDatasetNames(const QStringList &names) override;
+  QStringList getDatasetNames() const override;
+  int getNumberDomains() const override;
+  void setCurrentDomainIndex(int i) override;
+  int currentDomainIndex() const override;
+  void changeTie(const QString &paramName, const QString &tie) override;
+  void addConstraint(const QString &functionIndex,
+                     const QString &constraint) override;
+  void removeConstraint(const QString &paramName) override;
+  QStringList getGlobalParameters() const override;
+  void setGlobalParameters(const QStringList &globals) override;
+  bool isGlobal(const QString &parName) const override;
+  void setGlobal(const QString &parName, bool on);
+  QStringList getLocalParameters() const override;
+  void updateMultiDatasetParameters(const IFunction &fun) override;
+  void updateParameters(const IFunction &fun) override;
+
+  double getLocalParameterValue(const QString &parName, int i) const override;
+  bool isLocalParameterFixed(const QString &parName, int i) const override;
+  QString getLocalParameterTie(const QString &parName, int i) const override;
+  QString getLocalParameterConstraint(const QString &parName,
+                                      int i) const override;
+  void setLocalParameterValue(const QString &parName, int i,
+                              double value) override;
+  void setLocalParameterValue(const QString &parName, int i, double value,
+                              double error) override;
+  void setLocalParameterFixed(const QString &parName, int i,
+                              bool fixed) override;
+  void setLocalParameterTie(const QString &parName, int i,
+                            const QString &tie) override;
+  void setLocalParameterConstraint(const QString &parName, int i,
+                                   const QString &constraint) override;
+  QString setBackgroundA0(double value) override;
+
+  void updateMultiDatasetParameters(const ITableWorkspace &paramTable);
+  void setNumberOfExponentials(int);
+  int getNumberOfExponentials() const;
+  void setStretchExponential(bool);
+  bool hasStretchExponential() const;
+  void setBackground(const QString &name);
+  void removeBackground();
+  bool hasBackground() const;
+  void tieIntensities(bool on);
+  void
+  updateParameterEstimationData(DataForParameterEstimationCollection &&data);
+
+  enum class ParamID {
+    EXP1_HEIGHT,
+    EXP1_LIFETIME,
+    EXP2_HEIGHT,
+    EXP2_LIFETIME,
+    STRETCH_HEIGHT,
+    STRETCH_LIFETIME,
+    STRETCH_STRETCHING,
+    BG_A0
+  };
+  QMap<ParamID, double> getCurrentValues() const;
+  QMap<ParamID, double> getCurrentErrors() const;
+  QMap<int, QString> getParameterNameMap() const;
+  QMap<int, std::string> getParameterDescriptionMap() const;
+
+private:
+  void clearData();
+  QString buildFunctionString() const;
+  boost::optional<QString> getExp1Prefix() const;
+  boost::optional<QString> getExp2Prefix() const;
+  boost::optional<QString> getStretchPrefix() const;
+  boost::optional<QString> getBackgroundPrefix() const;
+  void setParameter(ParamID name, double value);
+  boost::optional<double> getParameter(ParamID name) const;
+  boost::optional<double> getParameterError(ParamID name) const;
+  boost::optional<QString> getParameterName(ParamID name) const;
+  boost::optional<QString> getParameterDescription(ParamID name) const;
+  boost::optional<QString> getPrefix(ParamID name) const;
+  void setCurrentValues(const QMap<ParamID, double> &);
+  void applyParameterFunction(std::function<void(ParamID)> paramFun) const;
+  boost::optional<ParamID> getParameterId(const QString &parName);
+  std::string buildExpDecayFunctionString() const;
+  std::string buildStretchExpFunctionString() const;
+  std::string buildBackgroundFunctionString() const;
+  void estimateStretchExpParameters();
+  void addGlobal(const QString &parName);
+  void removeGlobal(const QString &parName);
+  QStringList makeGlobalList() const;
+
+  FunctionModel m_model;
+  int m_numberOfExponentials = 0;
+  bool m_hasStretchExponential = false;
+  QString m_background;
+  DataForParameterEstimationCollection m_estimationData;
+  QList<ParamID> m_globals;
+};
+
+} // namespace IDA
+} // namespace CustomInterfaces
+} // namespace MantidQt
+
+#endif /* MANTIDQT_INDIRECT_IQTFUNCTIONMODEL_H_ */
diff --git a/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtTemplateBrowser.cpp b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtTemplateBrowser.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..2bd0bacf2b4003c5b818562297daf1fbeb46b461
--- /dev/null
+++ b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtTemplateBrowser.cpp
@@ -0,0 +1,398 @@
+// 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 +
+#include "IqtTemplateBrowser.h"
+
+#include "MantidAPI/CostFunctionFactory.h"
+#include "MantidAPI/FuncMinimizerFactory.h"
+#include "MantidAPI/IAlgorithm.h"
+#include "MantidAPI/IFuncMinimizer.h"
+#include "MantidAPI/ITableWorkspace.h"
+#include "MantidAPI/IWorkspaceProperty.h"
+#include "MantidKernel/PropertyWithValue.h"
+
+#include "MantidQtWidgets/Common/FunctionBrowser/FunctionBrowserUtils.h"
+#include "MantidQtWidgets/Common/QtPropertyBrowser/ButtonEditorFactory.h"
+#include "MantidQtWidgets/Common/QtPropertyBrowser/CompositeEditorFactory.h"
+#include "MantidQtWidgets/Common/QtPropertyBrowser/DoubleEditorFactory.h"
+#include "MantidQtWidgets/Common/QtPropertyBrowser/qteditorfactory.h"
+#include "MantidQtWidgets/Common/QtPropertyBrowser/qtpropertymanager.h"
+#include "MantidQtWidgets/Common/QtPropertyBrowser/qttreepropertybrowser.h"
+
+#include <QMessageBox>
+#include <QSettings>
+#include <QVBoxLayout>
+
+#include <iostream>
+#include <limits>
+
+namespace MantidQt {
+namespace CustomInterfaces {
+namespace IDA {
+
+/**
+ * Constructor
+ * @param parent :: The parent widget.
+ */
+IqtTemplateBrowser::IqtTemplateBrowser(QWidget *parent)
+    : FunctionTemplateBrowser(parent), m_presenter(this) {
+  connect(&m_presenter, SIGNAL(functionStructureChanged()), this,
+          SIGNAL(functionStructureChanged()));
+}
+
+void IqtTemplateBrowser::createProperties() {
+  m_parameterManager->blockSignals(true);
+  m_boolManager->blockSignals(true);
+  m_enumManager->blockSignals(true);
+  m_exp1Height = m_parameterManager->addProperty("f0.Height");
+  m_parameterManager->setDecimals(m_exp1Height, 6);
+  m_exp1Lifetime = m_parameterManager->addProperty("f0.Lifetime");
+  m_parameterManager->setDecimals(m_exp1Lifetime, 6);
+  m_exp2Height = m_parameterManager->addProperty("f1.Height");
+  m_parameterManager->setDecimals(m_exp2Height, 6);
+  m_exp2Lifetime = m_parameterManager->addProperty("f1.Lifetime");
+  m_parameterManager->setDecimals(m_exp2Lifetime, 6);
+  m_stretchExpHeight = m_parameterManager->addProperty("Height");
+  m_parameterManager->setDecimals(m_stretchExpHeight, 6);
+  m_stretchExpLifetime = m_parameterManager->addProperty("Lifetime");
+  m_parameterManager->setDecimals(m_stretchExpLifetime, 6);
+  m_stretchExpStretching = m_parameterManager->addProperty("Stretching");
+  m_parameterManager->setDecimals(m_stretchExpStretching, 6);
+  m_A0 = m_parameterManager->addProperty("A0");
+  m_parameterManager->setDecimals(m_A0, 6);
+
+  m_parameterMap[m_exp1Height] = 0;
+  m_parameterMap[m_exp1Lifetime] = 1;
+  m_parameterMap[m_exp2Height] = 2;
+  m_parameterMap[m_exp2Lifetime] = 3;
+  m_parameterMap[m_stretchExpHeight] = 4;
+  m_parameterMap[m_stretchExpLifetime] = 5;
+  m_parameterMap[m_stretchExpStretching] = 6;
+  m_parameterMap[m_A0] = 7;
+
+  m_presenter.setViewParameterDescriptions();
+
+  m_parameterManager->setDescription(m_exp1Height,
+                                     m_parameterDescriptions[m_exp1Height]);
+  m_parameterManager->setDescription(m_exp1Lifetime,
+                                     m_parameterDescriptions[m_exp1Lifetime]);
+  m_parameterManager->setDescription(m_exp2Height,
+                                     m_parameterDescriptions[m_exp2Height]);
+  m_parameterManager->setDescription(m_exp2Lifetime,
+                                     m_parameterDescriptions[m_exp2Lifetime]);
+  m_parameterManager->setDescription(
+      m_stretchExpHeight, m_parameterDescriptions[m_stretchExpHeight]);
+  m_parameterManager->setDescription(
+      m_stretchExpLifetime, m_parameterDescriptions[m_stretchExpLifetime]);
+  m_parameterManager->setDescription(
+      m_stretchExpStretching, m_parameterDescriptions[m_stretchExpStretching]);
+  m_parameterManager->setDescription(m_A0, m_parameterDescriptions[m_A0]);
+
+  m_numberOfExponentials = m_intManager->addProperty("Exponentials");
+  m_intManager->setMinimum(m_numberOfExponentials, 0);
+  m_intManager->setMaximum(m_numberOfExponentials, 2);
+  m_browser->addProperty(m_numberOfExponentials);
+
+  m_stretchExponential = m_boolManager->addProperty("Stretch Exponential");
+  m_browser->addProperty(m_stretchExponential);
+
+  m_background = m_enumManager->addProperty("Background");
+  QStringList backgrounds;
+  backgrounds << "None"
+              << "FlatBackground";
+  m_enumManager->setEnumNames(m_background, backgrounds);
+  m_browser->addProperty(m_background);
+
+  m_tieIntensities = m_boolManager->addProperty("Tie Intensities");
+  m_browser->addProperty(m_tieIntensities);
+  m_parameterManager->blockSignals(false);
+  m_enumManager->blockSignals(false);
+  m_boolManager->blockSignals(false);
+  updateState();
+}
+
+void IqtTemplateBrowser::addExponentialOne() {
+  m_numberOfExponentials->addSubProperty(m_exp1Height);
+  m_numberOfExponentials->addSubProperty(m_exp1Lifetime);
+  ScopedFalse _false(m_emitIntChange);
+  m_intManager->setValue(m_numberOfExponentials, 1);
+}
+
+void IqtTemplateBrowser::removeExponentialOne() {
+  m_numberOfExponentials->removeSubProperty(m_exp1Height);
+  m_numberOfExponentials->removeSubProperty(m_exp1Lifetime);
+  ScopedFalse _false(m_emitIntChange);
+  m_intManager->setValue(m_numberOfExponentials, 0);
+}
+
+void IqtTemplateBrowser::addExponentialTwo() {
+  m_numberOfExponentials->addSubProperty(m_exp2Height);
+  m_numberOfExponentials->addSubProperty(m_exp2Lifetime);
+  ScopedFalse _false(m_emitIntChange);
+  m_intManager->setValue(m_numberOfExponentials, 2);
+}
+
+void IqtTemplateBrowser::removeExponentialTwo() {
+  m_numberOfExponentials->removeSubProperty(m_exp2Height);
+  m_numberOfExponentials->removeSubProperty(m_exp2Lifetime);
+  ScopedFalse _false(m_emitIntChange);
+  m_intManager->setValue(m_numberOfExponentials, 1);
+}
+
+void IqtTemplateBrowser::addStretchExponential() {
+  m_stretchExponential->addSubProperty(m_stretchExpHeight);
+  m_stretchExponential->addSubProperty(m_stretchExpLifetime);
+  m_stretchExponential->addSubProperty(m_stretchExpStretching);
+  ScopedFalse _false(m_emitBoolChange);
+  m_boolManager->setValue(m_stretchExponential, true);
+}
+
+void IqtTemplateBrowser::removeStretchExponential() {
+  m_stretchExponential->removeSubProperty(m_stretchExpHeight);
+  m_stretchExponential->removeSubProperty(m_stretchExpLifetime);
+  m_stretchExponential->removeSubProperty(m_stretchExpStretching);
+  ScopedFalse _false(m_emitBoolChange);
+  m_boolManager->setValue(m_stretchExponential, false);
+}
+
+void IqtTemplateBrowser::addFlatBackground() {
+  m_background->addSubProperty(m_A0);
+  ScopedFalse _false(m_emitEnumChange);
+  m_enumManager->setValue(m_background, 1);
+}
+
+void IqtTemplateBrowser::removeBackground() {
+  m_background->removeSubProperty(m_A0);
+  ScopedFalse _false(m_emitEnumChange);
+  m_enumManager->setValue(m_background, 0);
+}
+
+void IqtTemplateBrowser::setExp1Height(double value, double error) {
+  setParameterPropertyValue(m_exp1Height, value, error);
+}
+
+void IqtTemplateBrowser::setExp1Lifetime(double value, double error) {
+  setParameterPropertyValue(m_exp1Lifetime, value, error);
+}
+
+void IqtTemplateBrowser::setExp2Height(double value, double error) {
+  setParameterPropertyValue(m_exp2Height, value, error);
+}
+
+void IqtTemplateBrowser::setExp2Lifetime(double value, double error) {
+  setParameterPropertyValue(m_exp2Lifetime, value, error);
+}
+
+void IqtTemplateBrowser::setStretchHeight(double value, double error) {
+  setParameterPropertyValue(m_stretchExpHeight, value, error);
+}
+
+void IqtTemplateBrowser::setStretchLifetime(double value, double error) {
+  setParameterPropertyValue(m_stretchExpLifetime, value, error);
+}
+
+void IqtTemplateBrowser::setStretchStretching(double value, double error) {
+  setParameterPropertyValue(m_stretchExpStretching, value, error);
+}
+
+void IqtTemplateBrowser::setA0(double value, double error) {
+  setParameterPropertyValue(m_A0, value, error);
+}
+
+void IqtTemplateBrowser::setFunction(const QString &funStr) {
+  m_presenter.setFunction(funStr);
+}
+
+IFunction_sptr IqtTemplateBrowser::getGlobalFunction() const {
+  return m_presenter.getGlobalFunction();
+}
+
+IFunction_sptr IqtTemplateBrowser::getFunction() const {
+  return m_presenter.getFunction();
+}
+
+void IqtTemplateBrowser::setNumberOfDatasets(int n) {
+  m_presenter.setNumberOfDatasets(n);
+}
+
+int IqtTemplateBrowser::getNumberOfDatasets() const {
+  return m_presenter.getNumberOfDatasets();
+}
+
+void IqtTemplateBrowser::setDatasetNames(const QStringList &names) {
+  m_presenter.setDatasetNames(names);
+}
+
+QStringList IqtTemplateBrowser::getGlobalParameters() const {
+  return m_presenter.getGlobalParameters();
+}
+
+QStringList IqtTemplateBrowser::getLocalParameters() const {
+  return m_presenter.getLocalParameters();
+}
+
+void IqtTemplateBrowser::setGlobalParameters(const QStringList &globals) {
+  m_presenter.setGlobalParameters(globals);
+}
+
+void IqtTemplateBrowser::intChanged(QtProperty *prop) {
+  if (prop == m_numberOfExponentials && m_emitIntChange) {
+    m_presenter.setNumberOfExponentials(m_intManager->value(prop));
+  }
+}
+
+void IqtTemplateBrowser::boolChanged(QtProperty *prop) {
+  if (!m_emitBoolChange)
+    return;
+  auto const on = m_boolManager->value(prop);
+  if (prop == m_stretchExponential) {
+    m_presenter.setStretchExponential(on);
+  }
+  if (prop == m_tieIntensities) {
+    m_presenter.tieIntensities(on);
+  }
+}
+
+void IqtTemplateBrowser::enumChanged(QtProperty *prop) {
+  if (!m_emitEnumChange)
+    return;
+  if (prop == m_background) {
+    auto background =
+        m_enumManager->enumNames(prop)[m_enumManager->value(prop)];
+    m_presenter.setBackground(background);
+  }
+}
+
+void IqtTemplateBrowser::globalChanged(QtProperty *prop, const QString &name,
+                                       bool on) {
+  std::cerr << "Global " << name.toStdString() << ' ' << on << std::endl;
+}
+
+void IqtTemplateBrowser::parameterChanged(QtProperty *prop) {
+  auto isGlobal = m_parameterManager->isGlobal(prop);
+  m_presenter.setGlobal(m_actualParameterNames[prop], isGlobal);
+  if (m_emitParameterValueChange) {
+    emit parameterValueChanged(m_actualParameterNames[prop],
+                               m_parameterManager->value(prop));
+  }
+}
+
+void IqtTemplateBrowser::parameterButtonClicked(QtProperty *prop) {
+  emit localParameterButtonClicked(m_actualParameterNames[prop]);
+}
+
+void IqtTemplateBrowser::updateMultiDatasetParameters(const IFunction &fun) {
+  m_presenter.updateMultiDatasetParameters(fun);
+}
+
+void IqtTemplateBrowser::updateMultiDatasetParameters(
+    const ITableWorkspace &paramTable) {
+  m_presenter.updateMultiDatasetParameters(paramTable);
+}
+
+void IqtTemplateBrowser::updateParameters(const IFunction &fun) {
+  m_presenter.updateParameters(fun);
+}
+
+void IqtTemplateBrowser::setCurrentDataset(int i) {
+  m_presenter.setCurrentDataset(i);
+}
+
+void IqtTemplateBrowser::updateParameterNames(
+    const QMap<int, QString> &parameterNames) {
+  m_actualParameterNames.clear();
+  ScopedFalse _false(m_emitParameterValueChange);
+  for (auto const prop : m_parameterMap.keys()) {
+    auto const i = m_parameterMap[prop];
+    auto const name = parameterNames[i];
+    m_actualParameterNames[prop] = name;
+    if (!name.isEmpty()) {
+      prop->setPropertyName(name);
+    }
+  }
+}
+
+void IqtTemplateBrowser::updateParameterDescriptions(
+    const QMap<int, std::string> &parameterDescriptions) {
+  m_parameterDescriptions.clear();
+  for (auto const prop : m_parameterMap.keys()) {
+    auto const i = m_parameterMap[prop];
+    m_parameterDescriptions[prop] = parameterDescriptions[i];
+  }
+}
+
+void IqtTemplateBrowser::setErrorsEnabled(bool enabled) {
+  ScopedFalse _false(m_emitParameterValueChange);
+  m_parameterManager->setErrorsEnabled(enabled);
+}
+
+void IqtTemplateBrowser::clear() {
+  removeBackground();
+  removeStretchExponential();
+  removeExponentialTwo();
+  removeExponentialOne();
+}
+
+void IqtTemplateBrowser::updateParameterEstimationData(
+    DataForParameterEstimationCollection &&data) {
+  m_presenter.updateParameterEstimationData(std::move(data));
+}
+
+void IqtTemplateBrowser::setBackgroundA0(double value) {
+  m_presenter.setBackgroundA0(value);
+}
+
+void IqtTemplateBrowser::popupMenu(const QPoint &) {
+  std::cerr << "Popup" << std::endl;
+}
+
+double IqtTemplateBrowser::getParameterPropertyValue(QtProperty *prop) const {
+  return prop ? m_parameterManager->value(prop) : 0.0;
+}
+
+void IqtTemplateBrowser::setParameterPropertyValue(QtProperty *prop,
+                                                   double value, double error) {
+  if (prop) {
+    ScopedFalse _false(m_emitParameterValueChange);
+    m_parameterManager->setValue(prop, value);
+    m_parameterManager->setError(prop, error);
+  }
+}
+
+void IqtTemplateBrowser::setGlobalParametersQuiet(const QStringList &globals) {
+  ScopedFalse _false(m_emitParameterValueChange);
+  auto parameterProperies = m_parameterMap.keys();
+  for (auto const prop : m_parameterMap.keys()) {
+    auto const name = m_actualParameterNames[prop];
+    if (globals.contains(name)) {
+      m_parameterManager->setGlobal(prop, true);
+      parameterProperies.removeOne(prop);
+    }
+  }
+  for (auto const prop : parameterProperies) {
+    if (!m_actualParameterNames[prop].isEmpty()) {
+      m_parameterManager->setGlobal(prop, false);
+    }
+  }
+}
+
+void IqtTemplateBrowser::setTieIntensitiesQuiet(bool on) {
+  ScopedFalse _false(m_emitBoolChange);
+  m_boolManager->setValue(m_tieIntensities, on);
+}
+
+void IqtTemplateBrowser::updateState() {
+  auto const on = m_presenter.canTieIntensities();
+  if (!on && m_boolManager->value(m_tieIntensities)) {
+    ScopedFalse _false(m_emitBoolChange);
+    m_boolManager->setValue(m_tieIntensities, false);
+  }
+  m_tieIntensities->setEnabled(on);
+}
+
+} // namespace IDA
+} // namespace CustomInterfaces
+} // namespace MantidQt
diff --git a/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtTemplateBrowser.h b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtTemplateBrowser.h
new file mode 100644
index 0000000000000000000000000000000000000000..0d89cd893fbba190945e972a52c6210d17df8b10
--- /dev/null
+++ b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtTemplateBrowser.h
@@ -0,0 +1,120 @@
+// 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 +
+#ifndef INDIRECT_IQTTEMPLATEBROWSER_H_
+#define INDIRECT_IQTTEMPLATEBROWSER_H_
+
+#include "DllConfig.h"
+#include "FunctionTemplateBrowser.h"
+#include "IqtTemplatePresenter.h"
+
+#include <QMap>
+#include <QWidget>
+
+class QtProperty;
+
+namespace MantidQt {
+namespace CustomInterfaces {
+namespace IDA {
+
+/**
+ * Class FunctionTemplateBrowser implements QtPropertyBrowser to display
+ * and set properties that can be used to generate a fit function.
+ *
+ */
+class MANTIDQT_INDIRECT_DLL IqtTemplateBrowser
+    : public FunctionTemplateBrowser {
+  Q_OBJECT
+public:
+  explicit IqtTemplateBrowser(QWidget *parent = nullptr);
+  void addExponentialOne();
+  void removeExponentialOne();
+  void addExponentialTwo();
+  void removeExponentialTwo();
+  void addStretchExponential();
+  void removeStretchExponential();
+  void addFlatBackground();
+  void removeBackground();
+
+  void setExp1Height(double, double);
+  void setExp1Lifetime(double, double);
+  void setExp2Height(double, double);
+  void setExp2Lifetime(double, double);
+  void setStretchHeight(double, double);
+  void setStretchLifetime(double, double);
+  void setStretchStretching(double, double);
+  void setA0(double, double);
+
+  void setFunction(const QString &funStr) override;
+  IFunction_sptr getGlobalFunction() const override;
+  IFunction_sptr getFunction() const override;
+  void setNumberOfDatasets(int) override;
+  int getNumberOfDatasets() const override;
+  void setDatasetNames(const QStringList &names) override;
+  QStringList getGlobalParameters() const override;
+  QStringList getLocalParameters() const override;
+  void setGlobalParameters(const QStringList &globals) override;
+  void updateMultiDatasetParameters(const IFunction &fun) override;
+  void updateMultiDatasetParameters(const ITableWorkspace &paramTable) override;
+  void updateParameters(const IFunction &fun) override;
+  void setCurrentDataset(int i) override;
+  void updateParameterNames(const QMap<int, QString> &parameterNames) override;
+  void updateParameterDescriptions(
+      const QMap<int, std::string> &parameterNames); // override;
+  void setErrorsEnabled(bool enabled) override;
+  void clear() override;
+  void updateParameterEstimationData(
+      DataForParameterEstimationCollection &&data) override;
+  void setBackgroundA0(double value) override;
+  void setResolution(std::string const &, DatasetIndex const &) override {}
+
+protected slots:
+  void intChanged(QtProperty *) override;
+  void boolChanged(QtProperty *) override;
+  void enumChanged(QtProperty *) override;
+  void globalChanged(QtProperty *, const QString &, bool) override;
+  void parameterChanged(QtProperty *) override;
+  void parameterButtonClicked(QtProperty *) override;
+
+private:
+  void createProperties() override;
+  void popupMenu(const QPoint &) override;
+  double getParameterPropertyValue(QtProperty *prop) const;
+  void setParameterPropertyValue(QtProperty *prop, double value, double error);
+  void setGlobalParametersQuiet(const QStringList &globals);
+  void setTieIntensitiesQuiet(bool on);
+  void updateState();
+
+  QtProperty *m_numberOfExponentials;
+  QtProperty *m_exp1Height = nullptr;
+  QtProperty *m_exp1Lifetime = nullptr;
+  QtProperty *m_exp2Height = nullptr;
+  QtProperty *m_exp2Lifetime = nullptr;
+  QtProperty *m_stretchExponential;
+  QtProperty *m_stretchExpHeight = nullptr;
+  QtProperty *m_stretchExpLifetime = nullptr;
+  QtProperty *m_stretchExpStretching = nullptr;
+  QtProperty *m_background;
+  QtProperty *m_A0 = nullptr;
+  QtProperty *m_tieIntensities = nullptr;
+  QMap<QtProperty *, int> m_parameterMap;
+  QMap<QtProperty *, QString> m_actualParameterNames;
+  QMap<QtProperty *, std::string> m_parameterDescriptions;
+
+private:
+  IqtTemplatePresenter m_presenter;
+  bool m_emitParameterValueChange = true;
+  bool m_emitIntChange = true;
+  bool m_emitBoolChange = true;
+  bool m_emitEnumChange = true;
+  friend class IqtTemplatePresenter;
+};
+
+} // namespace IDA
+} // namespace CustomInterfaces
+} // namespace MantidQt
+
+#endif /*INDIRECT_IQTTEMPLATEBROWSER_H_*/
diff --git a/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtTemplatePresenter.cpp b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtTemplatePresenter.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..16b45560141a9dfdadac125031585a7b17a0950d
--- /dev/null
+++ b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtTemplatePresenter.cpp
@@ -0,0 +1,361 @@
+// 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 +
+#include "IqtTemplatePresenter.h"
+#include "IqtTemplateBrowser.h"
+#include "MantidQtWidgets/Common/EditLocalParameterDialog.h"
+
+#include <cmath>
+#include <iostream>
+
+namespace MantidQt {
+namespace CustomInterfaces {
+namespace IDA {
+
+using namespace MantidWidgets;
+
+/**
+ * Constructor
+ * @param parent :: The parent widget.
+ */
+IqtTemplatePresenter::IqtTemplatePresenter(IqtTemplateBrowser *view)
+    : QObject(view), m_view(view) {
+  connect(m_view, SIGNAL(localParameterButtonClicked(const QString &)), this,
+          SLOT(editLocalParameter(const QString &)));
+  connect(m_view, SIGNAL(parameterValueChanged(const QString &, double)), this,
+          SLOT(viewChangedParameterValue(const QString &, double)));
+}
+
+void IqtTemplatePresenter::setNumberOfExponentials(int n) {
+  if (n < 0) {
+    throw std::logic_error(
+        "The number of exponents cannot be a negative number.");
+  }
+  if (n > 2) {
+    throw std::logic_error("The number of exponents is limited to 2.");
+  }
+  auto nCurrent = m_model.getNumberOfExponentials();
+  if (n == 0) {
+    if (nCurrent == 2) {
+      m_view->removeExponentialTwo();
+      --nCurrent;
+    }
+    if (nCurrent == 1) {
+      m_view->removeExponentialOne();
+      --nCurrent;
+    }
+  } else if (n == 1) {
+    if (nCurrent == 0) {
+      m_view->addExponentialOne();
+      ++nCurrent;
+    } else {
+      m_view->removeExponentialTwo();
+      --nCurrent;
+    }
+  } else /*n == 2*/ {
+    if (nCurrent == 0) {
+      m_view->addExponentialOne();
+      ++nCurrent;
+    }
+    if (nCurrent == 1) {
+      m_view->addExponentialTwo();
+      ++nCurrent;
+    }
+  }
+  assert(nCurrent == n);
+  m_model.setNumberOfExponentials(n);
+  setErrorsEnabled(false);
+  updateView();
+  emit functionStructureChanged();
+}
+
+void IqtTemplatePresenter::setStretchExponential(bool on) {
+  if (on == m_model.hasStretchExponential())
+    return;
+  if (on) {
+    m_view->addStretchExponential();
+  } else {
+    m_view->removeStretchExponential();
+  }
+  m_model.setStretchExponential(on);
+  setErrorsEnabled(false);
+  updateView();
+  emit functionStructureChanged();
+}
+
+void IqtTemplatePresenter::setBackground(const QString &name) {
+  if (name == "None") {
+    m_view->removeBackground();
+    m_model.removeBackground();
+  } else if (name == "FlatBackground") {
+    m_view->addFlatBackground();
+    m_model.setBackground(name);
+  } else {
+    throw std::logic_error("Browser doesn't support background " +
+                           name.toStdString());
+  }
+  setErrorsEnabled(false);
+  updateView();
+  emit functionStructureChanged();
+}
+
+void IqtTemplatePresenter::setNumberOfDatasets(int n) {
+  m_model.setNumberDomains(n);
+}
+
+int IqtTemplatePresenter::getNumberOfDatasets() const {
+  return m_model.getNumberDomains();
+}
+
+void IqtTemplatePresenter::setFunction(const QString &funStr) {
+  m_model.setFunctionString(funStr);
+  m_view->clear();
+  setErrorsEnabled(false);
+  if (m_model.hasBackground()) {
+    m_view->addFlatBackground();
+  }
+  if (m_model.hasStretchExponential()) {
+    m_view->addStretchExponential();
+  }
+  auto const nExp = m_model.getNumberOfExponentials();
+  if (nExp > 0) {
+    m_view->addExponentialOne();
+  }
+  if (nExp > 1) {
+    m_view->addExponentialTwo();
+  }
+  updateView();
+  emit functionStructureChanged();
+}
+
+IFunction_sptr IqtTemplatePresenter::getGlobalFunction() const {
+  return m_model.getFitFunction();
+}
+
+IFunction_sptr IqtTemplatePresenter::getFunction() const {
+  return m_model.getCurrentFunction();
+}
+
+QStringList IqtTemplatePresenter::getGlobalParameters() const {
+  return m_model.getGlobalParameters();
+}
+
+QStringList IqtTemplatePresenter::getLocalParameters() const {
+  return m_model.getLocalParameters();
+}
+
+void IqtTemplatePresenter::setGlobalParameters(const QStringList &globals) {
+  m_model.setGlobalParameters(globals);
+  m_view->setGlobalParametersQuiet(globals);
+}
+
+void IqtTemplatePresenter::setGlobal(const QString &parName, bool on) {
+  m_model.setGlobal(parName, on);
+  m_view->setGlobalParametersQuiet(m_model.getGlobalParameters());
+}
+
+void IqtTemplatePresenter::updateMultiDatasetParameters(const IFunction &fun) {
+  m_model.updateMultiDatasetParameters(fun);
+  updateViewParameters();
+}
+
+void IqtTemplatePresenter::updateMultiDatasetParameters(
+    const ITableWorkspace &paramTable) {
+  m_model.updateMultiDatasetParameters(paramTable);
+  updateViewParameters();
+}
+
+void IqtTemplatePresenter::updateParameters(const IFunction &fun) {
+  m_model.updateParameters(fun);
+  updateViewParameters();
+}
+
+void IqtTemplatePresenter::setCurrentDataset(int i) {
+  m_model.setCurrentDomainIndex(i);
+  updateViewParameters();
+}
+
+void IqtTemplatePresenter::setDatasetNames(const QStringList &names) {
+  m_model.setDatasetNames(names);
+}
+
+void IqtTemplatePresenter::setViewParameterDescriptions() {
+  m_view->updateParameterDescriptions(m_model.getParameterDescriptionMap());
+}
+
+void IqtTemplatePresenter::setErrorsEnabled(bool enabled) {
+  m_view->setErrorsEnabled(enabled);
+}
+
+void IqtTemplatePresenter::tieIntensities(bool on) {
+  if (on && !canTieIntensities())
+    return;
+  m_model.tieIntensities(on);
+  emit functionStructureChanged();
+}
+
+bool IqtTemplatePresenter::canTieIntensities() const {
+  return (m_model.hasStretchExponential() ||
+          m_model.getNumberOfExponentials() > 0) &&
+         m_model.hasBackground();
+}
+
+void IqtTemplatePresenter::updateParameterEstimationData(
+    DataForParameterEstimationCollection &&data) {
+  m_model.updateParameterEstimationData(std::move(data));
+}
+
+void IqtTemplatePresenter::setBackgroundA0(double value) {
+  m_model.setBackgroundA0(value);
+  m_view->setA0(value, 0.0);
+}
+
+void IqtTemplatePresenter::updateViewParameters() {
+  static std::map<IqtFunctionModel::ParamID,
+                  void (IqtTemplateBrowser::*)(double, double)>
+      setters{{IqtFunctionModel::ParamID::EXP1_HEIGHT,
+               &IqtTemplateBrowser::setExp1Height},
+              {IqtFunctionModel::ParamID::EXP1_LIFETIME,
+               &IqtTemplateBrowser::setExp1Lifetime},
+              {IqtFunctionModel::ParamID::EXP2_HEIGHT,
+               &IqtTemplateBrowser::setExp2Height},
+              {IqtFunctionModel::ParamID::EXP2_LIFETIME,
+               &IqtTemplateBrowser::setExp2Lifetime},
+              {IqtFunctionModel::ParamID::STRETCH_HEIGHT,
+               &IqtTemplateBrowser::setStretchHeight},
+              {IqtFunctionModel::ParamID::STRETCH_LIFETIME,
+               &IqtTemplateBrowser::setStretchLifetime},
+              {IqtFunctionModel::ParamID::STRETCH_STRETCHING,
+               &IqtTemplateBrowser::setStretchStretching},
+              {IqtFunctionModel::ParamID::BG_A0, &IqtTemplateBrowser::setA0}};
+  auto values = m_model.getCurrentValues();
+  auto errors = m_model.getCurrentErrors();
+  for (auto const name : values.keys()) {
+    (m_view->*setters.at(name))(values[name], errors[name]);
+  }
+}
+
+QStringList IqtTemplatePresenter::getDatasetNames() const {
+  return m_model.getDatasetNames();
+}
+
+double IqtTemplatePresenter::getLocalParameterValue(const QString &parName,
+                                                    int i) const {
+  return m_model.getLocalParameterValue(parName, i);
+}
+
+bool IqtTemplatePresenter::isLocalParameterFixed(const QString &parName,
+                                                 int i) const {
+  return m_model.isLocalParameterFixed(parName, i);
+}
+
+QString IqtTemplatePresenter::getLocalParameterTie(const QString &parName,
+                                                   int i) const {
+  return m_model.getLocalParameterTie(parName, i);
+}
+
+QString
+IqtTemplatePresenter::getLocalParameterConstraint(const QString &parName,
+                                                  int i) const {
+  return m_model.getLocalParameterConstraint(parName, i);
+}
+
+void IqtTemplatePresenter::setLocalParameterValue(const QString &parName, int i,
+                                                  double value) {
+  m_model.setLocalParameterValue(parName, i, value);
+}
+
+void IqtTemplatePresenter::setLocalParameterTie(const QString &parName, int i,
+                                                const QString &tie) {
+  m_model.setLocalParameterTie(parName, i, tie);
+}
+
+void IqtTemplatePresenter::updateViewParameterNames() {
+  m_view->updateParameterNames(m_model.getParameterNameMap());
+}
+
+void IqtTemplatePresenter::updateView() {
+  updateViewParameterNames();
+  updateViewParameters();
+  m_view->updateState();
+}
+
+void IqtTemplatePresenter::setLocalParameterFixed(const QString &parName, int i,
+                                                  bool fixed) {
+  m_model.setLocalParameterFixed(parName, i, fixed);
+}
+
+void IqtTemplatePresenter::editLocalParameter(const QString &parName) {
+  auto const wsNames = getDatasetNames();
+  QList<double> values;
+  QList<bool> fixes;
+  QStringList ties;
+  QStringList constraints;
+  const int n = wsNames.size();
+  for (int i = 0; i < n; ++i) {
+    const double value = getLocalParameterValue(parName, i);
+    values.push_back(value);
+    const bool fixed = isLocalParameterFixed(parName, i);
+    fixes.push_back(fixed);
+    const auto tie = getLocalParameterTie(parName, i);
+    ties.push_back(tie);
+    const auto constraint = getLocalParameterConstraint(parName, i);
+    constraints.push_back(constraint);
+  }
+
+  m_editLocalParameterDialog = new EditLocalParameterDialog(
+      m_view, parName, wsNames, values, fixes, ties, constraints);
+  connect(m_editLocalParameterDialog, SIGNAL(finished(int)), this,
+          SLOT(editLocalParameterFinish(int)));
+  m_editLocalParameterDialog->open();
+}
+
+void IqtTemplatePresenter::editLocalParameterFinish(int result) {
+  if (result == QDialog::Accepted) {
+    auto parName = m_editLocalParameterDialog->getParameterName();
+    auto values = m_editLocalParameterDialog->getValues();
+    auto fixes = m_editLocalParameterDialog->getFixes();
+    auto ties = m_editLocalParameterDialog->getTies();
+    assert(values.size() == getNumberOfDatasets());
+    for (int i = 0; i < values.size(); ++i) {
+      setLocalParameterValue(parName, i, values[i]);
+      if (!ties[i].isEmpty()) {
+        setLocalParameterTie(parName, i, ties[i]);
+      } else if (fixes[i]) {
+        setLocalParameterFixed(parName, i, fixes[i]);
+      } else {
+        setLocalParameterTie(parName, i, "");
+      }
+    }
+  }
+  m_editLocalParameterDialog = nullptr;
+  updateViewParameters();
+  emit functionStructureChanged();
+}
+
+void IqtTemplatePresenter::viewChangedParameterValue(const QString &parName,
+                                                     double value) {
+  if (parName.isEmpty())
+    return;
+  if (m_model.isGlobal(parName)) {
+    auto const n = getNumberOfDatasets();
+    for (int i = 0; i < n; ++i) {
+      setLocalParameterValue(parName, i, value);
+    }
+  } else {
+    auto const i = m_model.currentDomainIndex();
+    auto const oldValue = m_model.getLocalParameterValue(parName, i);
+    if (fabs(value - oldValue) > 1e-6) {
+      setErrorsEnabled(false);
+    }
+    setLocalParameterValue(parName, i, value);
+  }
+  emit functionStructureChanged();
+}
+
+} // namespace IDA
+} // namespace CustomInterfaces
+} // namespace MantidQt
diff --git a/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtTemplatePresenter.h b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtTemplatePresenter.h
new file mode 100644
index 0000000000000000000000000000000000000000..b87c34bd4dae7a17798cb4835c24e0d8d33f386b
--- /dev/null
+++ b/qt/scientific_interfaces/Indirect/IndirectFunctionBrowser/IqtTemplatePresenter.h
@@ -0,0 +1,91 @@
+// 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 +
+#ifndef INDIRECT_IQTTEMPLATEPRESENTER_H_
+#define INDIRECT_IQTTEMPLATEPRESENTER_H_
+
+#include "DllConfig.h"
+#include "IqtFunctionModel.h"
+#include "ParameterEstimation.h"
+
+#include <QMap>
+#include <QWidget>
+
+class QtProperty;
+
+namespace MantidQt {
+namespace MantidWidgets {
+class EditLocalParameterDialog;
+}
+namespace CustomInterfaces {
+namespace IDA {
+
+class IqtTemplateBrowser;
+
+/**
+ * Class FunctionTemplateBrowser implements QtPropertyBrowser to display
+ * and set properties that can be used to generate a fit function.
+ *
+ */
+class MANTIDQT_INDIRECT_DLL IqtTemplatePresenter : public QObject {
+  Q_OBJECT
+public:
+  explicit IqtTemplatePresenter(IqtTemplateBrowser *view);
+  void setNumberOfExponentials(int);
+  void setStretchExponential(bool);
+  void setBackground(const QString &name);
+  void setNumberOfDatasets(int);
+  int getNumberOfDatasets() const;
+  void setFunction(const QString &funStr);
+  IFunction_sptr getGlobalFunction() const;
+  IFunction_sptr getFunction() const;
+  QStringList getGlobalParameters() const;
+  QStringList getLocalParameters() const;
+  void setGlobalParameters(const QStringList &globals);
+  void setGlobal(const QString &parName, bool on);
+  void updateMultiDatasetParameters(const IFunction &fun);
+  void updateMultiDatasetParameters(const ITableWorkspace &paramTable);
+  void updateParameters(const IFunction &fun);
+  void setCurrentDataset(int i);
+  void setDatasetNames(const QStringList &names);
+  void setViewParameterDescriptions();
+  void setErrorsEnabled(bool enabled);
+  void tieIntensities(bool on);
+  bool canTieIntensities() const;
+  void
+  updateParameterEstimationData(DataForParameterEstimationCollection &&data);
+  void setBackgroundA0(double value);
+
+signals:
+  void functionStructureChanged();
+
+private slots:
+  void editLocalParameter(const QString &parName);
+  void editLocalParameterFinish(int result);
+  void viewChangedParameterValue(const QString &parName, double value);
+
+private:
+  void updateViewParameters();
+  QStringList getDatasetNames() const;
+  double getLocalParameterValue(const QString &parName, int i) const;
+  bool isLocalParameterFixed(const QString &parName, int i) const;
+  QString getLocalParameterTie(const QString &parName, int i) const;
+  QString getLocalParameterConstraint(const QString &parName, int i) const;
+  void setLocalParameterValue(const QString &parName, int i, double value);
+  void setLocalParameterFixed(const QString &parName, int i, bool fixed);
+  void setLocalParameterTie(const QString &parName, int i, const QString &tie);
+  void updateViewParameterNames();
+  void updateView();
+  IqtTemplateBrowser *m_view;
+  IqtFunctionModel m_model;
+  EditLocalParameterDialog *m_editLocalParameterDialog;
+};
+
+} // namespace IDA
+} // namespace CustomInterfaces
+} // namespace MantidQt
+
+#endif /*INDIRECT_IQTTEMPLATEPRESENTER_H_*/
diff --git a/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionPresenter.cpp b/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionPresenter.cpp
index 40abda2fcb881de8a2cbb98a22d0e0a4279a21bc..21bb570e99d894eea07e4679e95359a0bdcad9af 100644
--- a/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionPresenter.cpp
+++ b/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionPresenter.cpp
@@ -23,7 +23,7 @@ using namespace Mantid::Kernel::Strings;
 struct SetViewSpectra {
   explicit SetViewSpectra(IndirectSpectrumSelectionView *view) : m_view(view) {}
 
-  void operator()(const Spectra &spectra) const {
+  void operator()(const SpectraNew &spectra) const {
     if (spectra.isContinuous()) {
       m_view->displaySpectra(spectra.getMinMax());
     } else {
@@ -196,7 +196,7 @@ void IndirectSpectrumSelectionPresenter::setSpectraRange(
 }
 
 void IndirectSpectrumSelectionPresenter::setModelSpectra(
-    Spectra const &spectra) {
+    SpectraNew const &spectra) {
   try {
     m_model->setSpectra(spectra, m_activeIndex);
     m_spectraError.clear();
@@ -211,20 +211,20 @@ void IndirectSpectrumSelectionPresenter::setModelSpectra(
 
 void IndirectSpectrumSelectionPresenter::updateSpectraList(
     std::string const &spectraList) {
-  setModelSpectra(Spectra(createSpectraString(spectraList)));
+  setModelSpectra(SpectraNew(createSpectraString(spectraList)));
   emit spectraChanged(m_activeIndex);
 }
 
 void IndirectSpectrumSelectionPresenter::updateSpectraRange(
     WorkspaceIndex minimum, WorkspaceIndex maximum) {
-  setModelSpectra(Spectra(minimum, maximum));
+  setModelSpectra(SpectraNew(minimum, maximum));
   emit spectraChanged(m_activeIndex);
 }
 
 void IndirectSpectrumSelectionPresenter::setMaskSpectraList(
     std::string const &spectra) {
   if (m_spectraError.empty()) {
-    auto const intVec = vectorFromString<int>(spectra);
+    auto const intVec = vectorFromStringNew<int>(spectra);
     std::vector<WorkspaceIndex> vec(intVec.size());
     std::transform(intVec.begin(), intVec.end(), vec.begin(),
                    [](int i) { return WorkspaceIndex{i}; });
diff --git a/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionPresenter.h b/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionPresenter.h
index f29c063f9fbb136df5ee1a09b658da4667365100..1bbcc0a1d17a487a20e62d9b7cb43ead2ce9e8e6 100644
--- a/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionPresenter.h
+++ b/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionPresenter.h
@@ -57,7 +57,7 @@ private slots:
 
 private:
   void setSpectraRange(WorkspaceIndex minimum, WorkspaceIndex maximum);
-  void setModelSpectra(Spectra const &spectra);
+  void setModelSpectra(SpectraNew const &spectra);
 
   UserInputValidator validateSpectraString();
   UserInputValidator &validateSpectraString(UserInputValidator &validator);
diff --git a/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionPresenterLegacy.h b/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionPresenterLegacy.h
index 3e43cd9dfdd937b60d0032e41fc37254a792ca53..60a57f7011181ab009073a4af7d46ffd39e2ae80 100644
--- a/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionPresenterLegacy.h
+++ b/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionPresenterLegacy.h
@@ -4,8 +4,8 @@
 //     NScD Oak Ridge National Laboratory, European Spallation Source
 //     & Institut Laue - Langevin
 // SPDX - License - Identifier: GPL - 3.0 +
-#ifndef MANTID_CUSTOMINTERFACES_INDIRECTSPECTRUMSELECTIONPRESENTER_H_
-#define MANTID_CUSTOMINTERFACES_INDIRECTSPECTRUMSELECTIONPRESENTER_H_
+#ifndef MANTID_CUSTOMINTERFACES_INDIRECTSPECTRUMSELECTIONPRESENTERLEGACY_H_
+#define MANTID_CUSTOMINTERFACES_INDIRECTSPECTRUMSELECTIONPRESENTERLEGACY_H_
 
 #include "IndirectFittingModelLegacy.h"
 #include "IndirectSpectrumSelectionViewLegacy.h"
diff --git a/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionView.cpp b/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionView.cpp
index 0bc300ebe4029189eb650eebebba48d7746e239c..33192f34c595335178b086576bcdbe36e9eca0ba 100644
--- a/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionView.cpp
+++ b/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionView.cpp
@@ -210,7 +210,7 @@ IndirectSpectrumSelectionView::createValidator(const QString &regex) {
 UserInputValidator &IndirectSpectrumSelectionView::validateSpectraString(
     UserInputValidator &uiv) const {
   if (selectionMode() == SpectrumSelectionMode::STRING)
-    uiv.checkFieldIsValid("Spectra", m_selector->leSpectra,
+    uiv.checkFieldIsValid("SpectraNew", m_selector->leSpectra,
                           m_selector->lbSpectraError);
   return uiv;
 }
diff --git a/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionViewLegacy.cpp b/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionViewLegacy.cpp
index 86eb8c583536cbc797eebd188ded794b16bc6882..636ed92d2087663166825109e903dbc064d943aa 100644
--- a/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionViewLegacy.cpp
+++ b/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionViewLegacy.cpp
@@ -51,8 +51,8 @@ IndirectSpectrumSelectionViewLegacy::IndirectSpectrumSelectionViewLegacy(QWidget
 
 IndirectSpectrumSelectionViewLegacy::~IndirectSpectrumSelectionViewLegacy() {}
 
-SpectrumSelectionMode IndirectSpectrumSelectionViewLegacy::selectionMode() const {
-  return static_cast<SpectrumSelectionMode>(
+SpectrumSelectionModeLegacy IndirectSpectrumSelectionViewLegacy::selectionMode() const {
+  return static_cast<SpectrumSelectionModeLegacy>(
       m_selector->swSpectraSelection->currentIndex());
 }
 
@@ -78,14 +78,14 @@ void IndirectSpectrumSelectionViewLegacy::displaySpectra(
     const std::string &spectraString) {
   setSpectraString(spectraString);
   m_selector->cbSelectionMode->setCurrentIndex(
-      static_cast<int>(SpectrumSelectionMode::STRING));
+      static_cast<int>(SpectrumSelectionModeLegacy::STRING));
 }
 
 void IndirectSpectrumSelectionViewLegacy::displaySpectra(int minimum, int maximum) {
   setMinimumSpectrum(minimum);
   setMaximumSpectrum(maximum);
   m_selector->cbSelectionMode->setCurrentIndex(
-      static_cast<int>(SpectrumSelectionMode::RANGE));
+      static_cast<int>(SpectrumSelectionModeLegacy::RANGE));
 }
 
 void IndirectSpectrumSelectionViewLegacy::setSpectraRange(int minimum, int maximum) {
@@ -199,7 +199,7 @@ IndirectSpectrumSelectionViewLegacy::createValidator(const QString &regex) {
 
 UserInputValidator &IndirectSpectrumSelectionViewLegacy::validateSpectraString(
     UserInputValidator &uiv) const {
-  if (selectionMode() == SpectrumSelectionMode::STRING)
+  if (selectionMode() == SpectrumSelectionModeLegacy::STRING)
     uiv.checkFieldIsValid("Spectra", m_selector->leSpectra,
                           m_selector->lbSpectraError);
   return uiv;
@@ -239,15 +239,15 @@ void IndirectSpectrumSelectionViewLegacy::clearMaskString() {
 }
 
 void IndirectSpectrumSelectionViewLegacy::enableMaskLineEdit(int doEnable) {
-  if (doEnable >= 0 || selectionMode() == SpectrumSelectionMode::RANGE)
+  if (doEnable >= 0 || selectionMode() == SpectrumSelectionModeLegacy::RANGE)
     m_selector->leMaskBins->setEnabled(true);
   else
     m_selector->leMaskBins->setEnabled(false);
 }
 
 void IndirectSpectrumSelectionViewLegacy::emitSpectraChanged(int modeIndex) {
-  const auto mode = static_cast<SpectrumSelectionMode>(modeIndex);
-  if (mode == SpectrumSelectionMode::RANGE)
+  const auto mode = static_cast<SpectrumSelectionModeLegacy>(modeIndex);
+  if (mode == SpectrumSelectionModeLegacy::RANGE)
     emitSpectraRangeChanged();
   else
     emitSpectraStringChanged();
diff --git a/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionViewLegacy.h b/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionViewLegacy.h
index c567bf8747d7514dcca23da69e2001ee0db40b7d..157c01afe3ee943e800e09cdc2636a70e8caa63a 100644
--- a/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionViewLegacy.h
+++ b/qt/scientific_interfaces/Indirect/IndirectSpectrumSelectionViewLegacy.h
@@ -4,8 +4,8 @@
 //     NScD Oak Ridge National Laboratory, European Spallation Source
 //     & Institut Laue - Langevin
 // SPDX - License - Identifier: GPL - 3.0 +
-#ifndef MANTID_CUSTOMINTERFACES_INDIRECTSPECTRUMSELECTIONVIEW_H_
-#define MANTID_CUSTOMINTERFACES_INDIRECTSPECTRUMSELECTIONVIEW_H_
+#ifndef MANTID_CUSTOMINTERFACES_INDIRECTSPECTRUMSELECTIONVIEWLEGACY_H_
+#define MANTID_CUSTOMINTERFACES_INDIRECTSPECTRUMSELECTIONVIEWLEGACY_H_
 
 #include "ui_IndirectSpectrumSelector.h"
 
@@ -20,7 +20,7 @@ namespace MantidQt {
 namespace CustomInterfaces {
 namespace IDA {
 
-enum class SpectrumSelectionMode { RANGE, STRING };
+enum class SpectrumSelectionModeLegacy { RANGE, STRING };
 
 class MANTIDQT_INDIRECT_DLL IndirectSpectrumSelectionViewLegacy
     : public API::MantidWidget {
@@ -30,7 +30,7 @@ public:
   IndirectSpectrumSelectionViewLegacy(QWidget *parent = nullptr);
   virtual ~IndirectSpectrumSelectionViewLegacy() override;
 
-  SpectrumSelectionMode selectionMode() const;
+  SpectrumSelectionModeLegacy selectionMode() const;
 
   virtual std::size_t minimumSpectrum() const;
   virtual std::size_t maximumSpectrum() const;
diff --git a/qt/scientific_interfaces/Indirect/Iqt.cpp b/qt/scientific_interfaces/Indirect/Iqt.cpp
index d1a59978190dccfefdee10a7a37d2930486bf956..2c9f0d32e236f546d696dd5af3f9d5d5cf7eebfa 100644
--- a/qt/scientific_interfaces/Indirect/Iqt.cpp
+++ b/qt/scientific_interfaces/Indirect/Iqt.cpp
@@ -150,7 +150,7 @@ namespace MantidQt {
 namespace CustomInterfaces {
 namespace IDA {
 Iqt::Iqt(QWidget *parent)
-    : IndirectDataAnalysisTabLegacy(parent), m_iqtTree(nullptr), m_iqtResFileType() {
+    : IndirectDataAnalysisTab(parent), m_iqtTree(nullptr), m_iqtResFileType() {
   m_uiForm.setupUi(parent);
   setOutputPlotOptionsPresenter(std::make_unique<IndirectPlotOptionsPresenter>(
       m_uiForm.ipoPlotOptions, this, PlotWidget::SpectraTiled));
@@ -438,7 +438,7 @@ void Iqt::loadSettings(const QSettings &settings) {
   m_uiForm.dsResolution->readSettings(settings.group());
 }
 
-void Iqt::plotInput() { IndirectDataAnalysisTabLegacy::plotInput(m_uiForm.ppPlot); }
+void Iqt::plotInput() { IndirectDataAnalysisTab::plotInput(m_uiForm.ppPlot); }
 
 void Iqt::setFileExtensionsByName(bool filter) {
   QStringList const noSuffixes{""};
@@ -471,7 +471,7 @@ void Iqt::plotInput(const QString &wsname) {
   setPreviewSpectrumMaximum(
       static_cast<int>(inputWorkspace()->getNumberHistograms()) - 1);
 
-  IndirectDataAnalysisTabLegacy::plotInput(m_uiForm.ppPlot);
+  IndirectDataAnalysisTab::plotInput(m_uiForm.ppPlot);
   auto xRangeSelector = m_uiForm.ppPlot->getRangeSelector("IqtRange");
 
   try {
diff --git a/qt/scientific_interfaces/Indirect/Iqt.h b/qt/scientific_interfaces/Indirect/Iqt.h
index 806ab7790ce7a8f7c3d36c733c437528110b1752..9f67f30bbe6a7d7a2990f39d0547d45ed510c3e3 100644
--- a/qt/scientific_interfaces/Indirect/Iqt.h
+++ b/qt/scientific_interfaces/Indirect/Iqt.h
@@ -7,13 +7,13 @@
 #ifndef MANTIDQTCUSTOMINTERFACESIDA_IQT_H_
 #define MANTIDQTCUSTOMINTERFACESIDA_IQT_H_
 
-#include "IndirectDataAnalysisTabLegacy.h"
+#include "IndirectDataAnalysisTab.h"
 #include "ui_Iqt.h"
 
 namespace MantidQt {
 namespace CustomInterfaces {
 namespace IDA {
-class DLLExport Iqt : public IndirectDataAnalysisTabLegacy {
+class DLLExport Iqt : public IndirectDataAnalysisTab {
   Q_OBJECT
 
 public:
@@ -25,7 +25,6 @@ private:
   bool validate() override;
   void loadSettings(const QSettings &settings) override;
   void setFileExtensionsByName(bool filter) override;
-  void setBrowserWorkspace() override{};
 
   bool isErrorsEnabled();
 
diff --git a/qt/scientific_interfaces/Indirect/IqtFit.cpp b/qt/scientific_interfaces/Indirect/IqtFit.cpp
index c26d10318471f3f9b53221e6714535b69083dcbd..31cac3e8bedf08a820f5551a56ca3a51fcba4b91 100644
--- a/qt/scientific_interfaces/Indirect/IqtFit.cpp
+++ b/qt/scientific_interfaces/Indirect/IqtFit.cpp
@@ -5,6 +5,7 @@
 //     & Institut Laue - Langevin
 // SPDX - License - Identifier: GPL - 3.0 +
 #include "IqtFit.h"
+#include "IndirectFunctionBrowser/IqtTemplateBrowser.h"
 
 #include "MantidQtWidgets/Common/UserInputValidator.h"
 
@@ -23,6 +24,7 @@
 
 #include <boost/algorithm/string/predicate.hpp>
 
+using namespace Mantid;
 using namespace Mantid::API;
 
 namespace {
@@ -34,74 +36,49 @@ namespace CustomInterfaces {
 namespace IDA {
 
 IqtFit::IqtFit(QWidget *parent)
-    : IndirectFitAnalysisTabLegacy(new IqtFitModel, parent),
+    : IndirectFitAnalysisTab(new IqtFitModel, parent),
       m_uiForm(new Ui::IqtFit) {
   m_uiForm->setupUi(parent);
   m_iqtFittingModel = dynamic_cast<IqtFitModel *>(fittingModel());
 
-  setFitDataPresenter(std::make_unique<IndirectFitDataPresenterLegacy>(
+  setFitDataPresenter(std::make_unique<IndirectFitDataPresenter>(
       m_iqtFittingModel, m_uiForm->fitDataView));
   setPlotView(m_uiForm->pvFitPlotView);
   setSpectrumSelectionView(m_uiForm->svSpectrumView);
   setOutputOptionsView(m_uiForm->ovOutputOptionsView);
+  auto templateBrowser = new IqtTemplateBrowser;
+  m_uiForm->fitPropertyBrowser->setFunctionTemplateBrowser(templateBrowser);
   setFitPropertyBrowser(m_uiForm->fitPropertyBrowser);
 
   setEditResultVisible(true);
 }
 
 void IqtFit::setupFitTab() {
+  // setSampleWSSuffices({"_iqt"});
+  // setSampleFBSuffices({"_iqt.nxs"});
+
   // Create custom function groups
   auto &functionFactory = FunctionFactory::Instance();
   const auto exponential = functionFactory.createFunction("ExpDecay");
   const auto stretchedExponential =
       functionFactory.createFunction("StretchExp");
-  addSpinnerFunctionGroup("Exponential", {exponential}, 0, 2);
-  addCheckBoxFunctionGroup("Stretched Exponential", {stretchedExponential});
-
-  // Add custom settings
-  addBoolCustomSetting("ConstrainIntensities", "Constrain Intensities");
-  addBoolCustomSetting("ConstrainBeta", "Make Beta Global");
-  addBoolCustomSetting("ExtractMembers", "Extract Members");
-  setCustomSettingEnabled("ConstrainBeta", false);
-  setCustomSettingEnabled("ConstrainIntensities", false);
-
-  // Set available background options
-  setBackgroundOptions({"None", "FlatBackground"});
 
   connect(m_uiForm->pbRun, SIGNAL(clicked()), this, SLOT(runClicked()));
-
   connect(this, SIGNAL(functionChanged()), this, SLOT(fitFunctionChanged()));
-  connect(this, SIGNAL(customBoolChanged(const QString &, bool)), this,
-          SLOT(customBoolUpdated(const QString &, bool)));
-}
-
-void IqtFit::fitFunctionChanged() {
-  if (numberOfCustomFunctions("StretchExp") > 0) {
-    setCustomSettingEnabled("ConstrainBeta", true);
-  } else {
-    setCustomBoolSetting("ConstrainBeta", false);
-    setCustomSettingEnabled("ConstrainBeta", false);
-  }
-  setConstrainIntensitiesEnabled(m_iqtFittingModel->canConstrainIntensities());
-  m_iqtFittingModel->setFitTypeString(fitTypeString());
 }
 
-void IqtFit::setConstrainIntensitiesEnabled(bool enabled) {
-  setCustomSettingEnabled("ConstrainIntensities", enabled);
-  if (!enabled)
-    setCustomBoolSetting("ConstrainIntensities", false);
-  else if (boolSettingValue("ConstrainIntensities")) {
-    if (m_iqtFittingModel->setConstrainIntensities(true))
-      updateTies();
-  }
+EstimationDataSelector IqtFit::getEstimationDataSelector() const {
+  return
+      [](const MantidVec &x, const MantidVec &y) -> DataForParameterEstimation {
+        size_t const n = 4;
+        if (y.size() < n + 1)
+          return DataForParameterEstimation{{}, {}};
+        return DataForParameterEstimation{{x[0], x[n]}, {y[0], y[n]}};
+      };
 }
 
-void IqtFit::customBoolUpdated(const QString &key, bool value) {
-  if (key == "Constrain Intensities") {
-    if (m_iqtFittingModel->setConstrainIntensities(value))
-      updateTies();
-  } else if (key == "Make Beta Global")
-    m_iqtFittingModel->setBetaIsGlobal(value);
+void IqtFit::fitFunctionChanged() {
+  m_iqtFittingModel->setFitTypeString(fitTypeString());
 }
 
 std::string IqtFit::fitTypeString() const {
@@ -118,9 +95,9 @@ std::string IqtFit::fitTypeString() const {
 }
 
 void IqtFit::setupFit(Mantid::API::IAlgorithm_sptr fitAlgorithm) {
-  fitAlgorithm->setProperty("ExtractMembers",
-                            boolSettingValue("ExtractMembers"));
-  IndirectFitAnalysisTabLegacy::setupFit(fitAlgorithm);
+  // fitAlgorithm->setProperty("ExtractMembers",
+  //                          boolSettingValue("ExtractMembers"));
+  IndirectFitAnalysisTab::setupFit(fitAlgorithm);
 }
 
 void IqtFit::runClicked() { runTab(); }
diff --git a/qt/scientific_interfaces/Indirect/IqtFit.h b/qt/scientific_interfaces/Indirect/IqtFit.h
index c50ae3c751c48043654b65208043f00c05b5ff7c..21cebfdbf8f917fd0f0292433e9ecad16e4aa104 100644
--- a/qt/scientific_interfaces/Indirect/IqtFit.h
+++ b/qt/scientific_interfaces/Indirect/IqtFit.h
@@ -7,7 +7,7 @@
 #ifndef MANTIDQTCUSTOMINTERFACESIDA_IQTFIT_H_
 #define MANTIDQTCUSTOMINTERFACESIDA_IQTFIT_H_
 
-#include "IndirectFitAnalysisTabLegacy.h"
+#include "IndirectFitAnalysisTab.h"
 #include "IqtFitModel.h"
 
 #include "MantidAPI/CompositeFunction.h"
@@ -27,7 +27,7 @@ namespace MantidQt {
 namespace CustomInterfaces {
 namespace IDA {
 
-class DLLExport IqtFit : public IndirectFitAnalysisTabLegacy {
+class DLLExport IqtFit : public IndirectFitAnalysisTab {
   Q_OBJECT
 
 public:
@@ -40,7 +40,6 @@ public:
 protected slots:
   void setupFit(Mantid::API::IAlgorithm_sptr fitAlgorithm) override;
   void fitFunctionChanged();
-  void customBoolUpdated(const QString &key, bool value);
   void runClicked();
 
 protected:
@@ -48,10 +47,9 @@ protected:
   void setRunEnabled(bool enable) override;
 
 private:
-  void setConstrainIntensitiesEnabled(bool enabled);
   std::string fitTypeString() const;
-
   void setupFitTab() override;
+  EstimationDataSelector getEstimationDataSelector() const override;
 
   IqtFitModel *m_iqtFittingModel;
   std::unique_ptr<Ui::IqtFit> m_uiForm;
diff --git a/qt/scientific_interfaces/Indirect/IqtFit.ui b/qt/scientific_interfaces/Indirect/IqtFit.ui
index 1b92821f385b05ff88e099e6995cd3bda869a68e..8fef9828f439fc406e6042bc298873c108cf4fc3 100644
--- a/qt/scientific_interfaces/Indirect/IqtFit.ui
+++ b/qt/scientific_interfaces/Indirect/IqtFit.ui
@@ -22,7 +22,7 @@
      <property name="childrenCollapsible">
       <bool>false</bool>
      </property>
-     <widget class="MantidQt::CustomInterfaces::IDA::IndirectFitDataViewLegacy" name="fitDataView" native="true"/>
+     <widget class="MantidQt::CustomInterfaces::IDA::IndirectFitDataView" name="fitDataView" native="true"/>
      <widget class="QWidget" name="layoutWidget">
       <layout class="QVBoxLayout" name="verticalLayout">
        <item>
@@ -34,12 +34,12 @@
           <number>0</number>
          </property>
          <item>
-          <widget class="MantidQt::MantidWidgets::IndirectFitPropertyBrowserLegacy" name="fitPropertyBrowser">
+          <widget class="MantidQt::CustomInterfaces::IDA::IndirectFitPropertyBrowser" name="fitPropertyBrowser">
            <widget class="QWidget" name="dockWidgetContents"/>
           </widget>
          </item>
          <item>
-          <widget class="MantidQt::CustomInterfaces::IDA::IndirectFitPlotViewLegacy" name="pvFitPlotView" native="true"/>
+          <widget class="MantidQt::CustomInterfaces::IDA::IndirectFitPlotView" name="pvFitPlotView" native="true"/>
          </item>
         </layout>
        </item>
@@ -62,7 +62,7 @@
            <number>0</number>
           </property>
           <item>
-           <widget class="MantidQt::CustomInterfaces::IDA::IndirectSpectrumSelectionViewLegacy" name="svSpectrumView" native="true"/>
+           <widget class="MantidQt::CustomInterfaces::IDA::IndirectSpectrumSelectionView" name="svSpectrumView" native="true"/>
           </item>
           <item>
            <widget class="QGroupBox" name="gbRun">
@@ -126,27 +126,27 @@
  </widget>
  <customwidgets>
   <customwidget>
-   <class>MantidQt::CustomInterfaces::IDA::IndirectSpectrumSelectionViewLegacy</class>
+   <class>MantidQt::CustomInterfaces::IDA::IndirectSpectrumSelectionView</class>
    <extends>QWidget</extends>
-   <header>IndirectSpectrumSelectionViewLegacy.h</header>
+   <header>IndirectSpectrumSelectionView.h</header>
    <container>1</container>
   </customwidget>
   <customwidget>
-   <class>MantidQt::MantidWidgets::IndirectFitPropertyBrowserLegacy</class>
+   <class>MantidQt::CustomInterfaces::IDA::IndirectFitPropertyBrowser</class>
    <extends>QDockWidget</extends>
-   <header>MantidQtWidgets/Common/IndirectFitPropertyBrowserLegacy.h</header>
+   <header>IndirectFitPropertyBrowser.h</header>
    <container>1</container>
   </customwidget>
   <customwidget>
-   <class>MantidQt::CustomInterfaces::IDA::IndirectFitPlotViewLegacy</class>
+   <class>MantidQt::CustomInterfaces::IDA::IndirectFitPlotView</class>
    <extends>QWidget</extends>
-   <header>IndirectFitPlotViewLegacy.h</header>
+   <header>IndirectFitPlotView.h</header>
    <container>1</container>
   </customwidget>
   <customwidget>
-   <class>MantidQt::CustomInterfaces::IDA::IndirectFitDataViewLegacy</class>
+   <class>MantidQt::CustomInterfaces::IDA::IndirectFitDataView</class>
    <extends>QWidget</extends>
-   <header>IndirectFitDataViewLegacy.h</header>
+   <header>IndirectFitDataView.h</header>
    <container>1</container>
   </customwidget>
   <customwidget>
diff --git a/qt/scientific_interfaces/Indirect/IqtFitModel.cpp b/qt/scientific_interfaces/Indirect/IqtFitModel.cpp
index 9ff96c15138f7f7685a598ff7928bd767d701099..7bbbd9c236d1e5e148acfdf247e098adb28fa60f 100644
--- a/qt/scientific_interfaces/Indirect/IqtFitModel.cpp
+++ b/qt/scientific_interfaces/Indirect/IqtFitModel.cpp
@@ -185,19 +185,19 @@ namespace CustomInterfaces {
 namespace IDA {
 
 IqtFitModel::IqtFitModel()
-    : IndirectFittingModelLegacy(), m_makeBetaGlobal(false),
+    : IndirectFittingModel(), m_makeBetaGlobal(false),
       m_constrainIntensities(false) {}
 
-CompositeFunction_sptr IqtFitModel::getMultiDomainFunction() const {
+MultiDomainFunction_sptr IqtFitModel::getMultiDomainFunction() const {
   if (m_makeBetaGlobal)
     return createFunctionWithGlobalBeta(getFittingFunction());
-  return IndirectFittingModelLegacy::getMultiDomainFunction();
+  return IndirectFittingModel::getMultiDomainFunction();
 }
 
 IAlgorithm_sptr IqtFitModel::getFittingAlgorithm() const {
   if (m_makeBetaGlobal)
     return createSimultaneousFitWithEqualRange(getMultiDomainFunction());
-  return IndirectFittingModelLegacy::getFittingAlgorithm();
+  return IndirectFittingModel::getFittingAlgorithm();
 }
 
 std::vector<std::string> IqtFitModel::getSpectrumDependentAttributes() const {
@@ -219,22 +219,22 @@ IAlgorithm_sptr IqtFitModel::simultaneousFitAlgorithm() const {
 std::string IqtFitModel::sequentialFitOutputName() const {
   if (isMultiFit())
     return "MultiIqtFit_" + m_fitType + "_Results";
-  auto const fitString = getFitString(getWorkspace(0));
+  auto const fitString = getFitString(getWorkspace(DatasetIndex{0}));
   return createOutputName("%1%" + fitString + "_" + m_fitType + "_s%2%", "_to_",
-                          0);
+                          DatasetIndex{0});
 }
 
 std::string IqtFitModel::simultaneousFitOutputName() const {
   if (isMultiFit())
     return "MultiSimultaneousIqtFit_" + m_fitType + "_Results";
-  auto const fitString = getFitString(getWorkspace(0));
+  auto const fitString = getFitString(getWorkspace(DatasetIndex{0}));
   return createOutputName("%1%" + fitString + "_mult" + m_fitType + "_s%2%",
-                          "_to_", 0);
+                          "_to_", DatasetIndex{0});
 }
 
-std::string IqtFitModel::singleFitOutputName(std::size_t index,
-                                             std::size_t spectrum) const {
-  auto const fitString = getFitString(getWorkspace(0));
+std::string IqtFitModel::singleFitOutputName(DatasetIndex index,
+                                             WorkspaceIndex spectrum) const {
+  auto const fitString = getFitString(getWorkspace(DatasetIndex{0}));
   return createSingleFitOutputName(
       "%1%" + fitString + "_" + m_fitType + "_s%2%_Results", index, spectrum);
 }
@@ -243,50 +243,35 @@ void IqtFitModel::setFitTypeString(const std::string &fitType) {
   m_fitType = fitType;
 }
 
-void IqtFitModel::setFitFunction(Mantid::API::IFunction_sptr function) {
-  IndirectFittingModelLegacy::setFitFunction(function);
+void IqtFitModel::setFitFunction(
+    Mantid::API::MultiDomainFunction_sptr function) {
+  IndirectFittingModel::setFitFunction(function);
   if (m_constrainIntensities)
     constrainIntensities(function);
 }
 
-bool IqtFitModel::canConstrainIntensities() const {
-  return hasConstrainableIntensities(getFittingFunction());
-}
-
-bool IqtFitModel::setConstrainIntensities(bool constrain) {
-  if (constrain != m_constrainIntensities) {
-    m_constrainIntensities = constrain;
-    if (constrain)
-      return constrainIntensities(getFittingFunction());
-    return unconstrainIntensities(getFittingFunction());
-  }
-  return true;
-}
-
-void IqtFitModel::setBetaIsGlobal(bool global) { m_makeBetaGlobal = global; }
-
-std::unordered_map<std::string, ParameterValue>
-IqtFitModel::createDefaultParameters(std::size_t index) const {
-  std::unordered_map<std::string, ParameterValue> parameters;
+std::unordered_map<std::string, ParameterValueNew>
+IqtFitModel::createDefaultParameters(DatasetIndex index) const {
+  std::unordered_map<std::string, ParameterValueNew> parameters;
   parameters["Height"] =
-      ParameterValue(computeHeightApproximation(getFittingFunction()));
+      ParameterValueNew(computeHeightApproximation(getFittingFunction()));
 
   const auto inputWs = getWorkspace(index);
   const auto tau = inputWs ? computeTauApproximation(inputWs) : 0.0;
 
-  parameters["Lifetime"] = ParameterValue(tau);
-  parameters["Stretching"] = ParameterValue(1.0);
-  parameters["A0"] = ParameterValue(0.0);
+  parameters["Lifetime"] = ParameterValueNew(tau);
+  parameters["Stretching"] = ParameterValueNew(1.0);
+  parameters["A0"] = ParameterValueNew(0.0);
   return parameters;
 }
 
-CompositeFunction_sptr
+MultiDomainFunction_sptr
 IqtFitModel::createFunctionWithGlobalBeta(IFunction_sptr function) const {
   boost::shared_ptr<MultiDomainFunction> multiDomainFunction(
       new MultiDomainFunction);
   const auto functionString = function->asString();
-  for (auto i = 0u; i < numberOfWorkspaces(); ++i) {
-    auto addDomains = [&](std::size_t /*unused*/) {
+  for (auto i = DatasetIndex{0}; i < numberOfWorkspaces(); ++i) {
+    auto addDomains = [&](WorkspaceIndex /*unused*/) {
       const auto index = multiDomainFunction->nFunctions();
       multiDomainFunction->addFunction(createFunction(functionString));
       multiDomainFunction->setDomainIndex(index, index);
diff --git a/qt/scientific_interfaces/Indirect/IqtFitModel.h b/qt/scientific_interfaces/Indirect/IqtFitModel.h
index 02f8fdd8ad890cb69ba8f572d9faa955f32b9a4a..3f3aa320421cf65955294fa8b4b1a852f82ee67a 100644
--- a/qt/scientific_interfaces/Indirect/IqtFitModel.h
+++ b/qt/scientific_interfaces/Indirect/IqtFitModel.h
@@ -7,38 +7,32 @@
 #ifndef MANTIDQTCUSTOMINTERFACESIDA_IQTFITMODEL_H_
 #define MANTIDQTCUSTOMINTERFACESIDA_IQTFITMODEL_H_
 
-#include "IndirectFittingModelLegacy.h"
+#include "IndirectFittingModel.h"
 
 namespace MantidQt {
 namespace CustomInterfaces {
 namespace IDA {
 
-class DLLExport IqtFitModel : public IndirectFittingModelLegacy {
+class DLLExport IqtFitModel : public IndirectFittingModel {
 public:
   IqtFitModel();
 
   Mantid::API::IAlgorithm_sptr getFittingAlgorithm() const override;
-
   std::vector<std::string> getSpectrumDependentAttributes() const override;
-
   void setFitTypeString(const std::string &fitType);
-
-  void setFitFunction(Mantid::API::IFunction_sptr function) override;
-  bool canConstrainIntensities() const;
-  bool setConstrainIntensities(bool constrain);
-  void setBetaIsGlobal(bool global);
+  void setFitFunction(Mantid::API::MultiDomainFunction_sptr function) override;
 
 private:
-  Mantid::API::CompositeFunction_sptr getMultiDomainFunction() const override;
+  Mantid::API::MultiDomainFunction_sptr getMultiDomainFunction() const override;
   Mantid::API::IAlgorithm_sptr sequentialFitAlgorithm() const override;
   Mantid::API::IAlgorithm_sptr simultaneousFitAlgorithm() const override;
   std::string sequentialFitOutputName() const override;
   std::string simultaneousFitOutputName() const override;
-  std::string singleFitOutputName(std::size_t index,
-                                  std::size_t spectrum) const override;
-  std::unordered_map<std::string, ParameterValue>
-  createDefaultParameters(std::size_t index) const override;
-  Mantid::API::CompositeFunction_sptr
+  std::string singleFitOutputName(DatasetIndex index,
+                                  WorkspaceIndex spectrum) const override;
+  std::unordered_map<std::string, ParameterValueNew>
+  createDefaultParameters(DatasetIndex index) const override;
+  Mantid::API::MultiDomainFunction_sptr
   createFunctionWithGlobalBeta(Mantid::API::IFunction_sptr function) const;
 
   bool m_makeBetaGlobal;
diff --git a/qt/scientific_interfaces/Indirect/test/IqtFitModelTest.h b/qt/scientific_interfaces/Indirect/test/IqtFitModelTest.h
index f7cc235a78aa712a70a2822ee619728f097c21ae..add9269b176ae6a1817f682af2df2326bdcb9e71 100644
--- a/qt/scientific_interfaces/Indirect/test/IqtFitModelTest.h
+++ b/qt/scientific_interfaces/Indirect/test/IqtFitModelTest.h
@@ -16,6 +16,7 @@
 #include "MantidAPI/FunctionFactory.h"
 #include "MantidAPI/IFunction.h"
 #include "MantidAPI/MatrixWorkspace_fwd.h"
+#include "MantidAPI/MultiDomainFunction.h"
 #include "MantidTestHelpers/IndirectFitDataCreationHelper.h"
 
 using namespace Mantid::API;
@@ -24,19 +25,21 @@ using namespace MantidQt::CustomInterfaces::IDA;
 
 namespace {
 
-std::string getFunctionString(bool multipleIntensities) {
-  return multipleIntensities
-             ? "name=ExpDecay,Height=1,Lifetime=1;name=ExpDecay,Height=1,"
-               "Lifetime=0.0247558;name=FlatBackground,A0=0"
-             : "name=LinearBackground,A0=0,A1=0,ties=(A0=0.000000,A1=0.0);"
-               "(composite=Convolution,FixResolution=true,NumDeriv=true;"
-               "name=Resolution,Workspace=Name,WorkspaceIndex=0;((composite="
-               "ProductFunction,NumDeriv=false;name=Lorentzian,Amplitude=1,"
-               "PeakCentre=0,FWHM=0.0175)))";
-}
-
-IFunction_sptr getFunction(std::string const &functionString) {
-  return FunctionFactory::Instance().createInitialized(functionString);
+MultiDomainFunction_sptr getFunction(bool multipleIntensities) {
+  std::string const functionString =
+      multipleIntensities
+          ? "composite=CompositeFunction,$domains=i;name=ExpDecay,Height=1,"
+            "Lifetime=1;name=ExpDecay,Height=1,"
+            "Lifetime=0.0247558;name=FlatBackground,A0=0"
+          : "composite=CompositeFunction,$domains=i;name=LinearBackground,A0=0,"
+            "A1=0,ties=(A0=0.000000,A1=0.0);"
+            "(composite=Convolution,FixResolution=true,NumDeriv=true;"
+            "name=Resolution,Workspace=Name,WorkspaceIndex=0;((composite="
+            "ProductFunction,NumDeriv=false;name=Lorentzian,Amplitude=1,"
+            "PeakCentre=0,FWHM=0.0175)))";
+  auto fun = FunctionFactory::Instance().createInitialized(
+      "composite=MultiDomainFunction;" + functionString + ";" + functionString);
+  return boost::dynamic_pointer_cast<MultiDomainFunction>(fun);
 }
 
 } // namespace
@@ -65,59 +68,17 @@ public:
   }
 
   void test_that_the_model_is_instantiated_and_can_hold_a_workspace() {
-    Spectra const spectra = DiscontinuousSpectra<std::size_t>("0-1");
+    SpectraNew const spectra = SpectraNew("0-1");
 
     m_model->addWorkspace(m_workspace, spectra);
 
-    TS_ASSERT_EQUALS(m_model->numberOfWorkspaces(), 1);
+    TS_ASSERT_EQUALS(m_model->numberOfWorkspaces(), DatasetIndex{1});
   }
 
   void test_that_getSpectrumDependentAttributes_will_return_an_empty_vector() {
     TS_ASSERT(m_model->getSpectrumDependentAttributes().empty());
   }
 
-  void
-  test_that_canConstrainIntensities_returns_false_if_it_contains_less_than_2_intensity_parameters() {
-    /// Intensity can either be represented by A0 or Height IqtFit
-    Spectra const spectra = DiscontinuousSpectra<std::size_t>("0-1");
-
-    m_model->addWorkspace(m_workspace, spectra);
-    m_model->setFitFunction(getFunction(getFunctionString(false)));
-
-    TS_ASSERT(!m_model->canConstrainIntensities());
-  }
-
-  void
-  test_that_canConstrainIntensities_returns_true_if_it_contains_2_or_more_intensity_parameters() {
-    /// Intensity can either be represented by A0 or Height in IqtFit
-    Spectra const spectra = DiscontinuousSpectra<std::size_t>("0-1");
-
-    m_model->addWorkspace(m_workspace, spectra);
-    m_model->setFitFunction(getFunction(getFunctionString(true)));
-
-    TS_ASSERT(m_model->canConstrainIntensities());
-  }
-
-  void
-  test_that_setConstrainIntensities_returns_false_if_there_is_not_multiple_intensities_to_be_constrained() {
-    Spectra const spectra = DiscontinuousSpectra<std::size_t>("0-1");
-
-    m_model->addWorkspace(m_workspace, spectra);
-    m_model->setFitFunction(getFunction(getFunctionString(false)));
-
-    TS_ASSERT(!m_model->setConstrainIntensities(true));
-  }
-
-  void
-  test_that_setConstrainIntensities_returns_true_if_there_are_multiple_intensities_to_be_constrained() {
-    Spectra const spectra = DiscontinuousSpectra<std::size_t>("0-1");
-
-    m_model->addWorkspace(m_workspace, spectra);
-    m_model->setFitFunction(getFunction(getFunctionString(true)));
-
-    TS_ASSERT(m_model->setConstrainIntensities(true));
-  }
-
 private:
   MatrixWorkspace_sptr m_workspace;
   std::unique_ptr<SetUpADSWithWorkspace> m_ads;
diff --git a/qt/widgets/common/inc/MantidQtWidgets/Common/IndirectFitPropertyBrowserLegacy.h b/qt/widgets/common/inc/MantidQtWidgets/Common/IndirectFitPropertyBrowserLegacy.h
index 532f8eb7f9f337787c875dfbe8f8f7e21b152bd3..c8476c29f169106045d4f9abcad4b38b08e22beb 100644
--- a/qt/widgets/common/inc/MantidQtWidgets/Common/IndirectFitPropertyBrowserLegacy.h
+++ b/qt/widgets/common/inc/MantidQtWidgets/Common/IndirectFitPropertyBrowserLegacy.h
@@ -4,8 +4,8 @@
 //     NScD Oak Ridge National Laboratory, European Spallation Source
 //     & Institut Laue - Langevin
 // SPDX - License - Identifier: GPL - 3.0 +
-#ifndef INDIRECTFITPROPERTYBROWSER_H_
-#define INDIRECTFITPROPERTYBROWSER_H_
+#ifndef INDIRECTFITPROPERTYBROWSERLEGACY_H_
+#define INDIRECTFITPROPERTYBROWSERLEGACY_H_
 
 #include "MantidQtWidgets/Common/FitPropertyBrowser.h"
 #include "MantidQtWidgets/Common/QtPropertyBrowser/qtpropertymanager.h"