diff --git a/qt/scientific_interfaces/Indirect/test/IndirectFitDataTest.h b/qt/scientific_interfaces/Indirect/test/IndirectFitDataTest.h
index 805c5b2d2df07d512f1bc71626b70fa71f6c1d20..3b70ec81087d3c926197b315977efad8242e2d1d 100644
--- a/qt/scientific_interfaces/Indirect/test/IndirectFitDataTest.h
+++ b/qt/scientific_interfaces/Indirect/test/IndirectFitDataTest.h
@@ -8,7 +8,7 @@
 
 #include <cxxtest/TestSuite.h>
 
-#include "IndirectFitDataLegacy.h"
+#include "IndirectFitData.h"
 #include "MantidAPI/MatrixWorkspace.h"
 #include "MantidDataObjects/Workspace2D.h"
 #include "MantidTestHelpers/IndirectFitDataCreationHelper.h"
@@ -18,16 +18,19 @@ using namespace Mantid::API;
 using namespace Mantid::DataObjects;
 using namespace MantidQt::CustomInterfaces::IDA;
 using namespace Mantid::IndirectFitDataCreationHelper;
+using namespace MantidQt::CustomInterfaces;
 
 namespace {
 
-std::unique_ptr<IndirectFitDataLegacy>
+std::unique_ptr<IndirectFitData>
 getIndirectFitData(int const &numberOfSpectra) {
   auto const workspace = createWorkspace(numberOfSpectra);
-  SpectraLegacy const spec =
-      std::make_pair(0u, workspace->getNumberHistograms() - 1);
-  IndirectFitDataLegacy data(workspace, spec);
-  return std::make_unique<IndirectFitDataLegacy>(data);
+  Spectra const spec =
+      Spectra(MantidQt::CustomInterfaces::IDA::WorkspaceIndex{0},
+              MantidQt::CustomInterfaces::IDA::WorkspaceIndex{
+                  static_cast<int>(workspace->getNumberHistograms() - 1)});
+  IndirectFitData data(workspace, spec);
+  return std::make_unique<IndirectFitData>(data);
 }
 
 } // namespace
@@ -44,11 +47,13 @@ public:
 
   void test_data_is_instantiated() {
     auto const workspace = createWorkspace(1);
-    SpectraLegacy const spec =
-        std::make_pair(0u, workspace->getNumberHistograms() - 1);
+    Spectra const spec =
+        Spectra(MantidQt::CustomInterfaces::IDA::WorkspaceIndex{0},
+                MantidQt::CustomInterfaces::IDA::WorkspaceIndex{
+                    static_cast<int>(workspace->getNumberHistograms() - 1)});
 
     workspace->setTitle("Test Title");
-    IndirectFitDataLegacy const data(workspace, spec);
+    IndirectFitData const data(workspace, spec);
 
     TS_ASSERT_EQUALS(data.workspace(), workspace);
     TS_ASSERT_EQUALS(data.workspace()->getTitle(), "Test Title");
@@ -56,11 +61,10 @@ public:
   }
 
   void test_that_DiscontinuousSpectra_is_set_up_correctly() {
-    DiscontinuousSpectra<std::size_t> const spectra =
-        DiscontinuousSpectra<std::size_t>("0-5,8,10");
+    Spectra const spectra = Spectra("0-5,8,10");
 
     std::string const spectraString = "0-5,8,10";
-    std::vector<std::size_t> const spectraVec{0, 1, 2, 3, 4, 5, 8, 10};
+    std::vector<IDA::WorkspaceIndex> const spectraVec{0, 1, 2, 3, 4, 5, 8, 10};
 
     TS_ASSERT_EQUALS(spectra.getString(), spectraString);
     for (auto it = spectra.begin(); it < spectra.end(); ++it)
@@ -72,11 +76,10 @@ public:
     auto data = getIndirectFitData(11);
 
     std::string const inputString = "8,0-7,6,10";
-    SpectraLegacy const spectra = DiscontinuousSpectra<std::size_t>("0-8,10");
+    Spectra const spectra = Spectra("0-8,10");
     data->setSpectra(inputString);
 
-    TS_ASSERT(
-        boost::apply_visitor(AreSpectraEqual(), data->spectra(), spectra));
+    TS_ASSERT_EQUALS(data->spectra(), spectra);
   }
 
   void
@@ -84,11 +87,10 @@ public:
     auto data = getIndirectFitData(11);
 
     std::string const inputString = "1,2,4-3,10";
-    SpectraLegacy const spectra = DiscontinuousSpectra<std::size_t>("1-4,10");
+    Spectra const spectra = Spectra("1-4,10");
     data->setSpectra(inputString);
 
-    TS_ASSERT(
-        boost::apply_visitor(AreSpectraEqual(), data->spectra(), spectra));
+    TS_ASSERT_EQUALS(data->spectra(), spectra);
   }
 
   void
@@ -96,11 +98,10 @@ public:
     auto data = getIndirectFitData(11);
 
     std::string const inputString = "  8,10,  7";
-    SpectraLegacy const spectra = DiscontinuousSpectra<std::size_t>("7-8,10");
+    Spectra const spectra = Spectra("7-8,10");
     data->setSpectra(inputString);
 
-    TS_ASSERT(
-        boost::apply_visitor(AreSpectraEqual(), data->spectra(), spectra));
+    TS_ASSERT_EQUALS(data->spectra(), spectra);
   }
 
   void test_data_is_stored_in_the_ADS() {
@@ -119,7 +120,7 @@ public:
     std::vector<std::string> const formatStrings{
         "%1%_s%2%_Result", "%1%_f%2%,s%2%_Parameter", "%1%_s%2%_Parameter"};
     std::string const rangeDelimiter = "_to_";
-    std::size_t const spectrum = 1;
+    IDA::WorkspaceIndex const spectrum = IDA::WorkspaceIndex{1};
 
     TS_ASSERT_EQUALS(data->displayName(formatStrings[0], rangeDelimiter),
                      "_s0_Result");
@@ -143,23 +144,26 @@ public:
   void
   test_that_the_number_of_spectra_returned_matches_the_instantiated_value() {
     auto const data = getIndirectFitData(10);
-    TS_ASSERT_EQUALS(data->numberOfSpectra(), 10);
+    TS_ASSERT_EQUALS(data->numberOfSpectra(), TableRowIndex{10});
   }
 
   void test_that_getSpectrum_returns_the_expected_spectrum_numbers() {
     auto const data = getIndirectFitData(4);
 
-    for (auto i = 0u; i < data->numberOfSpectra(); ++i) {
-      std::size_t const spectrumNum = data->getSpectrum(i);
-      TS_ASSERT_EQUALS(spectrumNum, i);
+    for (auto i = TableRowIndex{0}; i < data->numberOfSpectra(); ++i) {
+      MantidQt::CustomInterfaces::IDA::WorkspaceIndex const spectrumNum =
+          data->getSpectrum(i);
+      TS_ASSERT_EQUALS(spectrumNum.value, i.value);
     }
   }
 
   void
   test_that_true_is_returned_from_zeroSpectra_if_data_contains_empty_workspace() {
     auto workspace = std::make_shared<Workspace2D>();
-    SpectraLegacy const spec = std::make_pair(0u, 0u);
-    IndirectFitDataLegacy const data(workspace, spec);
+    Spectra const spec =
+        Spectra(MantidQt::CustomInterfaces::IDA::WorkspaceIndex{0},
+                MantidQt::CustomInterfaces::IDA::WorkspaceIndex{0});
+    IndirectFitData const data(workspace, spec);
 
     TS_ASSERT_EQUALS(data.zeroSpectra(), true);
   }
@@ -167,8 +171,8 @@ public:
   void
   test_that_true_is_returned_from_zeroSpectra_if_data_contains_empty_spectra() {
     auto const workspace = createWorkspace(1);
-    DiscontinuousSpectra<std::size_t> const spec("");
-    IndirectFitDataLegacy const data(workspace, spec);
+    Spectra const spec("");
+    IndirectFitData const data(workspace, spec);
 
     TS_ASSERT_EQUALS(data.zeroSpectra(), true);
   }
@@ -187,15 +191,25 @@ public:
     /// string is in the correct order(unordered: 10,11 9,7 ordered:10,11,7,9)
     auto data = getIndirectFitData(4);
 
-    data->setExcludeRegionString("1,8", 0);
-    data->setExcludeRegionString("2,5", 1);
-    data->setExcludeRegionString("1,2,5,6,3,4", 2);
-
-    TS_ASSERT_EQUALS(data->getExcludeRegion(0), "1.000,8.000");
-    TS_ASSERT_EQUALS(data->getExcludeRegion(1), "2.000,5.000");
-    TS_ASSERT_EQUALS(data->getExcludeRegion(2),
+    data->setExcludeRegionString(
+        "1,8", MantidQt::CustomInterfaces::IDA::WorkspaceIndex{0});
+    data->setExcludeRegionString(
+        "2,5", MantidQt::CustomInterfaces::IDA::WorkspaceIndex{1});
+    data->setExcludeRegionString(
+        "1,2,5,6,3,4", MantidQt::CustomInterfaces::IDA::WorkspaceIndex{2});
+
+    TS_ASSERT_EQUALS(data->getExcludeRegion(
+                         MantidQt::CustomInterfaces::IDA::WorkspaceIndex{0}),
+                     "1.000,8.000");
+    TS_ASSERT_EQUALS(data->getExcludeRegion(
+                         MantidQt::CustomInterfaces::IDA::WorkspaceIndex{1}),
+                     "2.000,5.000");
+    TS_ASSERT_EQUALS(data->getExcludeRegion(
+                         MantidQt::CustomInterfaces::IDA::WorkspaceIndex{2}),
                      "1.000,2.000,5.000,6.000,3.000,4.000");
-    TS_ASSERT_EQUALS(data->getExcludeRegion(3), "");
+    TS_ASSERT_EQUALS(data->getExcludeRegion(
+                         MantidQt::CustomInterfaces::IDA::WorkspaceIndex{3}),
+                     "");
   }
 
   void
@@ -204,48 +218,72 @@ public:
     /// string is in the correct order(unordered: 10,11 9,7 ordered:10,11,7,9)
     auto data = getIndirectFitData(4);
 
-    data->setExcludeRegionString("1,8", 0);
-    data->setExcludeRegionString("2,5", 1);
+    data->setExcludeRegionString(
+        "1,8", MantidQt::CustomInterfaces::IDA::WorkspaceIndex{0});
+    data->setExcludeRegionString(
+        "2,5", MantidQt::CustomInterfaces::IDA::WorkspaceIndex{1});
     std::vector<double> const regionVector1{1.0, 8.0};
     std::vector<double> const regionVector2{2.0, 5.0};
 
-    TS_ASSERT_EQUALS(data->excludeRegionsVector(0), regionVector1);
-    TS_ASSERT_EQUALS(data->excludeRegionsVector(1), regionVector2);
-    TS_ASSERT_EQUALS(data->excludeRegionsVector(3).empty(), true);
+    TS_ASSERT_EQUALS(data->excludeRegionsVector(IDA::WorkspaceIndex{0}),
+                     regionVector1);
+    TS_ASSERT_EQUALS(data->excludeRegionsVector(IDA::WorkspaceIndex{1}),
+                     regionVector2);
+    TS_ASSERT_EQUALS(data->excludeRegionsVector(IDA::WorkspaceIndex{3}).empty(),
+                     true);
   }
 
   void test_that_excludeRegion_pairs_are_stored_in_an_order_of_low_to_high() {
     /// Example: unordered: 10,11 9,7     ordered: 10,11,7,9
     auto data = getIndirectFitData(3);
 
-    data->setExcludeRegionString("6,2", 0);
-    data->setExcludeRegionString("6,2,1,2,3,4,7,6", 1);
-    data->setExcludeRegionString("1,2,2,3,20,18,21,22,7,8", 2);
+    data->setExcludeRegionString(
+        "6,2", MantidQt::CustomInterfaces::IDA::WorkspaceIndex{0});
+    data->setExcludeRegionString(
+        "6,2,1,2,3,4,7,6", MantidQt::CustomInterfaces::IDA::WorkspaceIndex{1});
+    data->setExcludeRegionString(
+        "1,2,2,3,20,18,21,22,7,8",
+        MantidQt::CustomInterfaces::IDA::WorkspaceIndex{2});
 
     std::vector<double> const regionVector{2.0, 6.0};
 
-    TS_ASSERT_EQUALS(data->getExcludeRegion(0), "2.000,6.000");
-    TS_ASSERT_EQUALS(data->getExcludeRegion(1),
+    TS_ASSERT_EQUALS(data->getExcludeRegion(
+                         MantidQt::CustomInterfaces::IDA::WorkspaceIndex{0}),
+                     "2.000,6.000");
+    TS_ASSERT_EQUALS(data->getExcludeRegion(
+                         MantidQt::CustomInterfaces::IDA::WorkspaceIndex{1}),
                      "2.000,6.000,1.000,2.000,3.000,4.000,6.000,7.000");
     TS_ASSERT_EQUALS(
-        data->getExcludeRegion(2),
+        data->getExcludeRegion(
+            MantidQt::CustomInterfaces::IDA::WorkspaceIndex{2}),
         "1.000,2.000,2.000,3.000,18.000,20.000,21.000,22.000,7.000,8.000");
-    TS_ASSERT_EQUALS(data->excludeRegionsVector(0), regionVector);
+    TS_ASSERT_EQUALS(data->excludeRegionsVector(
+                         MantidQt::CustomInterfaces::IDA::WorkspaceIndex{0}),
+                     regionVector);
   }
 
   void
   test_that_excludeRegion_is_stored_without_spaces_when_there_are_many_spaces_in_input_string() {
     auto data = getIndirectFitData(3);
 
-    data->setExcludeRegionString("  6,     2", 0);
-    data->setExcludeRegionString("6,  2,1  ,2,  3,4  ,7,6", 1);
-    data->setExcludeRegionString("1,2 ,2,3,  20,  18,21,22,7, 8   ", 2);
-
-    TS_ASSERT_EQUALS(data->getExcludeRegion(0), "2.000,6.000");
-    TS_ASSERT_EQUALS(data->getExcludeRegion(1),
+    data->setExcludeRegionString(
+        "  6,     2", MantidQt::CustomInterfaces::IDA::WorkspaceIndex{0});
+    data->setExcludeRegionString(
+        "6,  2,1  ,2,  3,4  ,7,6",
+        MantidQt::CustomInterfaces::IDA::WorkspaceIndex{1});
+    data->setExcludeRegionString(
+        "1,2 ,2,3,  20,  18,21,22,7, 8   ",
+        MantidQt::CustomInterfaces::IDA::WorkspaceIndex{2});
+
+    TS_ASSERT_EQUALS(data->getExcludeRegion(
+                         MantidQt::CustomInterfaces::IDA::WorkspaceIndex{0}),
+                     "2.000,6.000");
+    TS_ASSERT_EQUALS(data->getExcludeRegion(
+                         MantidQt::CustomInterfaces::IDA::WorkspaceIndex{1}),
                      "2.000,6.000,1.000,2.000,3.000,4.000,6.000,7.000");
     TS_ASSERT_EQUALS(
-        data->getExcludeRegion(2),
+        data->getExcludeRegion(
+            MantidQt::CustomInterfaces::IDA::WorkspaceIndex{2}),
         "1.000,2.000,2.000,3.000,18.000,20.000,21.000,22.000,7.000,8.000");
   }
 
@@ -253,21 +291,32 @@ public:
   test_that_setExcludeRegion_rounds_the_numbers_in_the_input_string_to_the_appropriate_decimal_place() {
     auto data = getIndirectFitData(2);
 
-    data->setExcludeRegionString("6.29445,2.93343", 0);
-    data->setExcludeRegionString("2.6,2.3,1.9999,3.0125", 1);
+    data->setExcludeRegionString(
+        "6.29445,2.93343", MantidQt::CustomInterfaces::IDA::WorkspaceIndex{0});
+    data->setExcludeRegionString(
+        "2.6,2.3,1.9999,3.0125",
+        MantidQt::CustomInterfaces::IDA::WorkspaceIndex{1});
 
-    TS_ASSERT_EQUALS(data->getExcludeRegion(0), "2.933,6.294");
-    TS_ASSERT_EQUALS(data->getExcludeRegion(1), "2.300,2.600,2.000,3.013");
+    TS_ASSERT_EQUALS(data->getExcludeRegion(
+                         MantidQt::CustomInterfaces::IDA::WorkspaceIndex{0}),
+                     "2.933,6.294");
+    TS_ASSERT_EQUALS(data->getExcludeRegion(
+                         MantidQt::CustomInterfaces::IDA::WorkspaceIndex{1}),
+                     "2.300,2.600,2.000,3.013");
   }
 
   void test_throws_when_setSpectra_is_provided_an_out_of_range_spectra() {
     auto data = getIndirectFitData(10);
 
-    std::vector<SpectraLegacy> const spectraPairs{
-        std::make_pair(0u, 11u), std::make_pair(0u, 1000000000000000000u),
-        std::make_pair(10u, 10u)};
-    std::vector<std::string> const spectraStrings{
-        "10", "100000000000000000000000000000", "1,5,10", "1,2,3,4,5,6,22"};
+    std::vector<Spectra> const spectraPairs{
+        Spectra(MantidQt::CustomInterfaces::IDA::WorkspaceIndex{0},
+                MantidQt::CustomInterfaces::IDA::WorkspaceIndex{11}),
+        Spectra(MantidQt::CustomInterfaces::IDA::WorkspaceIndex{0},
+                MantidQt::CustomInterfaces::IDA::WorkspaceIndex{1000000000}),
+        Spectra(MantidQt::CustomInterfaces::IDA::WorkspaceIndex{10},
+                MantidQt::CustomInterfaces::IDA::WorkspaceIndex{10})};
+    std::vector<std::string> const spectraStrings{"10", "1000000000", "1,5,10",
+                                                  "1,2,3,4,5,6,22"};
 
     for (auto i = 0u; i < spectraPairs.size(); ++i)
       TS_ASSERT_THROWS(data->setSpectra(spectraPairs[i]),
@@ -280,8 +329,10 @@ public:
   void test_no_throw_when_setSpectra_is_provided_a_valid_spectra() {
     auto data = getIndirectFitData(10);
 
-    std::vector<SpectraLegacy> const spectraPairs{
-        std::make_pair(0u, 9u), std::make_pair(4u, 4u), std::make_pair(7u, 4u)};
+    std::vector<Spectra> const spectraPairs{
+        Spectra(IDA::WorkspaceIndex{0}, IDA::WorkspaceIndex{9}),
+        Spectra(IDA::WorkspaceIndex{4}, IDA::WorkspaceIndex{4}),
+        Spectra(IDA::WorkspaceIndex{7}, IDA::WorkspaceIndex{4})};
     std::vector<std::string> const spectraStrings{"0", "9", "0,9,6,4,5",
                                                   "1,2,3,4,5,6"};
 
@@ -295,42 +346,44 @@ public:
   test_no_throw_when_setStartX_is_provided_a_valid_xValue_and_spectrum_number() {
     auto data = getIndirectFitData(10);
 
-    TS_ASSERT_THROWS_NOTHING(data->setStartX(0.0, 0));
-    TS_ASSERT_THROWS_NOTHING(data->setStartX(-5.0, 0));
-    TS_ASSERT_THROWS_NOTHING(data->setStartX(5000000, 10));
+    TS_ASSERT_THROWS_NOTHING(data->setStartX(0.0, IDA::WorkspaceIndex{0}));
+    TS_ASSERT_THROWS_NOTHING(data->setStartX(-5.0, IDA::WorkspaceIndex{0}));
+    TS_ASSERT_THROWS_NOTHING(data->setStartX(5000000, IDA::WorkspaceIndex{10}));
   }
 
   void test_the_provided_startX_is_stored_in_range_after_using_setStartX() {
     auto data = getIndirectFitData(3);
 
-    data->setStartX(-5.0, 0);
-    data->setStartX(6.53, 1);
-    data->setStartX(100000000000000.0, 2);
+    data->setStartX(-5.0, IDA::WorkspaceIndex{0});
+    data->setStartX(6.53, IDA::WorkspaceIndex{1});
+    data->setStartX(100000000000000.0, IDA::WorkspaceIndex{2});
 
-    TS_ASSERT_EQUALS(data->getRange(0).first, -5.0);
-    TS_ASSERT_EQUALS(data->getRange(1).first, 6.53);
-    TS_ASSERT_EQUALS(data->getRange(2).first, 100000000000000.0);
+    TS_ASSERT_EQUALS(data->getRange(IDA::WorkspaceIndex{0}).first, -5.0);
+    TS_ASSERT_EQUALS(data->getRange(IDA::WorkspaceIndex{1}).first, 6.53);
+    TS_ASSERT_EQUALS(data->getRange(IDA::WorkspaceIndex{2}).first,
+                     100000000000000.0);
   }
 
   void
   test_no_throw_when_setEndX_is_provided_a_valid_xValue_and_spectrum_number() {
     auto data = getIndirectFitData(10);
 
-    TS_ASSERT_THROWS_NOTHING(data->setStartX(0.0, 0));
-    TS_ASSERT_THROWS_NOTHING(data->setStartX(-5.0, 0));
-    TS_ASSERT_THROWS_NOTHING(data->setStartX(5000000, 10));
+    TS_ASSERT_THROWS_NOTHING(data->setStartX(0.0, IDA::WorkspaceIndex{0}));
+    TS_ASSERT_THROWS_NOTHING(data->setStartX(-5.0, IDA::WorkspaceIndex{0}));
+    TS_ASSERT_THROWS_NOTHING(data->setStartX(5000000, IDA::WorkspaceIndex{10}));
   }
 
   void test_the_provided_endX_is_stored_in_range_after_using_setEndX() {
     auto data = getIndirectFitData(3);
 
-    data->setEndX(-5.0, 0);
-    data->setEndX(6.53, 1);
-    data->setEndX(100000000000000.0, 2);
+    data->setEndX(-5.0, IDA::WorkspaceIndex{0});
+    data->setEndX(6.53, IDA::WorkspaceIndex{1});
+    data->setEndX(100000000000000.0, IDA::WorkspaceIndex{2});
 
-    TS_ASSERT_EQUALS(data->getRange(0).second, -5.0);
-    TS_ASSERT_EQUALS(data->getRange(1).second, 6.53);
-    TS_ASSERT_EQUALS(data->getRange(2).second, 100000000000000.0);
+    TS_ASSERT_EQUALS(data->getRange(IDA::WorkspaceIndex{0}).second, -5.0);
+    TS_ASSERT_EQUALS(data->getRange(IDA::WorkspaceIndex{1}).second, 6.53);
+    TS_ASSERT_EQUALS(data->getRange(IDA::WorkspaceIndex{2}).second,
+                     100000000000000.0);
   }
 
   void
@@ -338,12 +391,12 @@ public:
     auto data1 = getIndirectFitData(2);
     auto data2 = getIndirectFitData(2);
 
-    data1->setStartX(6.53, 0);
-    data2->setStartX(5.0, 1);
+    data1->setStartX(6.53, IDA::WorkspaceIndex{0});
+    data2->setStartX(5.0, IDA::WorkspaceIndex{1});
     auto const combinedData = data2->combine(*data1);
 
-    TS_ASSERT_EQUALS(combinedData.getRange(0).first, 6.53);
-    TS_ASSERT_EQUALS(combinedData.getRange(1).first, 5.0);
+    TS_ASSERT_EQUALS(combinedData.getRange(IDA::WorkspaceIndex{0}).first, 6.53);
+    TS_ASSERT_EQUALS(combinedData.getRange(IDA::WorkspaceIndex{1}).first, 5.0);
   }
 
   void
@@ -351,12 +404,13 @@ public:
     auto data1 = getIndirectFitData(2);
     auto data2 = getIndirectFitData(2);
 
-    data1->setEndX(2.34, 0);
-    data2->setEndX(5.9, 1);
+    data1->setEndX(2.34, IDA::WorkspaceIndex{0});
+    data2->setEndX(5.9, IDA::WorkspaceIndex{1});
     auto const combinedData = data2->combine(*data1);
 
-    TS_ASSERT_EQUALS(combinedData.getRange(0).second, 2.34);
-    TS_ASSERT_EQUALS(combinedData.getRange(1).second, 5.9);
+    TS_ASSERT_EQUALS(combinedData.getRange(IDA::WorkspaceIndex{0}).second,
+                     2.34);
+    TS_ASSERT_EQUALS(combinedData.getRange(IDA::WorkspaceIndex{1}).second, 5.9);
   }
 
   void
@@ -364,13 +418,14 @@ public:
     auto data1 = getIndirectFitData(2);
     auto data2 = getIndirectFitData(2);
 
-    data1->setExcludeRegionString("1,2,6,5", 0);
-    data1->setExcludeRegionString("6,2", 1);
+    data1->setExcludeRegionString("1,2,6,5", IDA::WorkspaceIndex{0});
+    data1->setExcludeRegionString("6,2", IDA::WorkspaceIndex{1});
     auto const combinedData = data2->combine(*data1);
 
-    TS_ASSERT_EQUALS(combinedData.getExcludeRegion(0),
-                     "1.000,2.000,5.000,6.000");
-    TS_ASSERT_EQUALS(combinedData.getExcludeRegion(1), "2.000,6.000");
+    TS_ASSERT_EQUALS(combinedData.getExcludeRegion(IDA::WorkspaceIndex{0}),
+                     std::string("1.000,2.000,5.000,6.000"));
+    TS_ASSERT_EQUALS(combinedData.getExcludeRegion(IDA::WorkspaceIndex{1}),
+                     std::string("2.000,6.000"));
   }
 
   void
@@ -378,13 +433,12 @@ public:
     auto data1 = getIndirectFitData(10);
     auto data2 = getIndirectFitData(10);
 
-    data1->setSpectra(std::make_pair(0u, 4u));
-    data2->setSpectra(std::make_pair(5u, 9u));
+    data1->setSpectra(Spectra(IDA::WorkspaceIndex{0}, IDA::WorkspaceIndex{4}));
+    data2->setSpectra(Spectra(IDA::WorkspaceIndex{5}, IDA::WorkspaceIndex{9}));
     auto const combinedData = data2->combine(*data1);
-    SpectraLegacy const spec(std::make_pair(0u, 9u));
+    Spectra const spec(Spectra(IDA::WorkspaceIndex{0}, IDA::WorkspaceIndex{9}));
 
-    TS_ASSERT(
-        boost::apply_visitor(AreSpectraEqual(), combinedData.spectra(), spec));
+    TS_ASSERT_EQUALS(combinedData.spectra(), spec);
   }
 
   void
@@ -392,13 +446,12 @@ public:
     auto data1 = getIndirectFitData(10);
     auto data2 = getIndirectFitData(10);
 
-    data1->setSpectra(std::make_pair(0u, 4u));
-    data2->setSpectra(std::make_pair(8u, 9u));
+    data1->setSpectra(Spectra(IDA::WorkspaceIndex{0}, IDA::WorkspaceIndex{4}));
+    data2->setSpectra(Spectra(IDA::WorkspaceIndex{8}, IDA::WorkspaceIndex{9}));
     auto const combinedData = data2->combine(*data1);
-    SpectraLegacy const spec(DiscontinuousSpectra<std::size_t>("0-4,8-9"));
+    Spectra const spec(Spectra("0-4,8-9"));
 
-    TS_ASSERT(
-        boost::apply_visitor(AreSpectraEqual(), combinedData.spectra(), spec));
+    TS_ASSERT_EQUALS(combinedData.spectra(), spec);
   }
 
   void
@@ -406,13 +459,12 @@ public:
     auto data1 = getIndirectFitData(10);
     auto data2 = getIndirectFitData(10);
 
-    data1->setSpectra(std::make_pair(0u, 8u));
-    data2->setSpectra(std::make_pair(4u, 9u));
+    data1->setSpectra(Spectra(IDA::WorkspaceIndex{0}, IDA::WorkspaceIndex{8}));
+    data2->setSpectra(Spectra(IDA::WorkspaceIndex{4}, IDA::WorkspaceIndex{9}));
     auto const combinedData = data2->combine(*data1);
-    SpectraLegacy const spec(DiscontinuousSpectra<std::size_t>("0-9"));
+    Spectra const spec(Spectra("0-9"));
 
-    TS_ASSERT(
-        boost::apply_visitor(AreSpectraEqual(), combinedData.spectra(), spec));
+    TS_ASSERT_EQUALS(combinedData.spectra(), spec);
   }
 
   void
@@ -420,13 +472,12 @@ public:
     auto data1 = getIndirectFitData(10);
     auto data2 = getIndirectFitData(10);
 
-    data1->setSpectra(DiscontinuousSpectra<std::size_t>("0-4"));
-    data2->setSpectra(DiscontinuousSpectra<std::size_t>("5-9"));
+    data1->setSpectra(Spectra("0-4"));
+    data2->setSpectra(Spectra("5-9"));
     auto const combinedData = data2->combine(*data1);
-    SpectraLegacy const spec(DiscontinuousSpectra<std::size_t>("0-9"));
+    Spectra const spec(Spectra("0-9"));
 
-    TS_ASSERT(
-        boost::apply_visitor(AreSpectraEqual(), combinedData.spectra(), spec));
+    TS_ASSERT_EQUALS(combinedData.spectra(), spec);
   }
 
   void
@@ -434,13 +485,12 @@ public:
     auto data1 = getIndirectFitData(10);
     auto data2 = getIndirectFitData(10);
 
-    data1->setSpectra(DiscontinuousSpectra<std::size_t>("0-7"));
-    data2->setSpectra(DiscontinuousSpectra<std::size_t>("2-9"));
+    data1->setSpectra(Spectra("0-7"));
+    data2->setSpectra(Spectra("2-9"));
     auto const combinedData = data2->combine(*data1);
-    SpectraLegacy const spec(DiscontinuousSpectra<std::size_t>("0-9"));
+    Spectra const spec(Spectra("0-9"));
 
-    TS_ASSERT(
-        boost::apply_visitor(AreSpectraEqual(), combinedData.spectra(), spec));
+    TS_ASSERT_EQUALS(combinedData.spectra(), spec);
   }
 
   void
@@ -448,13 +498,12 @@ public:
     auto data1 = getIndirectFitData(10);
     auto data2 = getIndirectFitData(10);
 
-    data1->setSpectra(DiscontinuousSpectra<std::size_t>("0-4"));
-    data2->setSpectra(std::make_pair(5u, 9u));
+    data1->setSpectra(Spectra("0-4"));
+    data2->setSpectra(Spectra(IDA::WorkspaceIndex{5}, IDA::WorkspaceIndex{9}));
     auto const combinedData = data2->combine(*data1);
-    SpectraLegacy const spec(DiscontinuousSpectra<std::size_t>("0-9"));
+    Spectra const spec(Spectra("0-9"));
 
-    TS_ASSERT(
-        boost::apply_visitor(AreSpectraEqual(), combinedData.spectra(), spec));
+    TS_ASSERT_EQUALS(combinedData.spectra(), spec);
   }
 
   void
@@ -462,12 +511,11 @@ public:
     auto data1 = getIndirectFitData(10);
     auto data2 = getIndirectFitData(10);
 
-    data1->setSpectra(DiscontinuousSpectra<std::size_t>("0-7"));
-    data2->setSpectra(std::make_pair(4u, 9u));
+    data1->setSpectra(Spectra("0-7"));
+    data2->setSpectra(Spectra(IDA::WorkspaceIndex{4}, IDA::WorkspaceIndex{9}));
     auto const combinedData = data2->combine(*data1);
-    SpectraLegacy const spec(DiscontinuousSpectra<std::size_t>("0-9"));
+    Spectra const spec(Spectra("0-9"));
 
-    TS_ASSERT(
-        boost::apply_visitor(AreSpectraEqual(), combinedData.spectra(), spec));
+    TS_ASSERT_EQUALS(combinedData.spectra(), spec);
   }
 };