diff --git a/Framework/Algorithms/CMakeLists.txt b/Framework/Algorithms/CMakeLists.txt
index 2391cf3569c3a54b7c3b2f40dacedd3fd8d129d2..8cdd4b52b1ef959fdef511f1c4016313479073e8 100644
--- a/Framework/Algorithms/CMakeLists.txt
+++ b/Framework/Algorithms/CMakeLists.txt
@@ -836,6 +836,7 @@ set ( TEST_FILES
 	RectangularBeamProfileTest.h
 	ReflectometryReductionOneAutoTest.h
 	ReflectometryReductionOneTest.h
+	ReflectometryReductionOne2Test.h
 	RegroupTest.h
 	RemoveBackgroundTest.h
 	RemoveBinsTest.h
diff --git a/Framework/Algorithms/src/ReflectometryReductionOne2.cpp b/Framework/Algorithms/src/ReflectometryReductionOne2.cpp
index 4ce3203402660a124dbddbfba8d176b9ab781484..97a36d3ee336942fdb3b8049b6f3a361b03cc8ed 100644
--- a/Framework/Algorithms/src/ReflectometryReductionOne2.cpp
+++ b/Framework/Algorithms/src/ReflectometryReductionOne2.cpp
@@ -427,7 +427,7 @@ ReflectometryReductionOne2::convertToWavelength(MatrixWorkspace_sptr inputWS) {
 MatrixWorkspace_sptr ReflectometryReductionOne2::makeDetectorWS(
     MatrixWorkspace_sptr inputWS) {
 
-  std::string processingCommands = getProperty("ProcessingInstructions");
+  std::string processingCommands = getPropertyValue("ProcessingInstructions");
   auto groupAlg = this->createChildAlgorithm("GroupDetectors");
   groupAlg->initialize();
   groupAlg->setProperty("GroupingPattern", processingCommands);
@@ -445,7 +445,6 @@ MatrixWorkspace_sptr ReflectometryReductionOne2::makeDetectorWS(
   processingCommands = std::to_string(directBeamRegion[0]) + "-" +
                        std::to_string(directBeamRegion[1]);
 
-  processingCommands = getProperty("ProcessingInstructions");
   auto groupDirectBeamAlg = this->createChildAlgorithm("GroupDetectors");
   groupDirectBeamAlg->initialize();
   groupDirectBeamAlg->setProperty("GroupingPattern", processingCommands);
@@ -682,4 +681,4 @@ ReflectometryReductionOne2::convertToQ(MatrixWorkspace_sptr inputWS) {
 }
 
 } // namespace Algorithms
-} // namespace Mantid
\ No newline at end of file
+} // namespace Mantid
diff --git a/Framework/Algorithms/test/ReflectometryReductionOne2Test.h b/Framework/Algorithms/test/ReflectometryReductionOne2Test.h
new file mode 100644
index 0000000000000000000000000000000000000000..812009165c9acde55039410d680088a3915b1d4c
--- /dev/null
+++ b/Framework/Algorithms/test/ReflectometryReductionOne2Test.h
@@ -0,0 +1,488 @@
+#ifndef ALGORITHMS_TEST_REFLECTOMETRYREDUCTIONONE2TEST_H_
+#define ALGORITHMS_TEST_REFLECTOMETRYREDUCTIONONE2TEST_H_
+
+#include <cxxtest/TestSuite.h>
+#include "MantidAlgorithms/ReflectometryReductionOne2.h"
+#include "MantidAPI/AlgorithmManager.h"
+#include "MantidAPI/Axis.h"
+#include "MantidAPI/FrameworkManager.h"
+#include "MantidAPI/MatrixWorkspace.h"
+#include "MantidHistogramData/HistogramY.h"
+#include "MantidTestHelpers/WorkspaceCreationHelper.h"
+#include <algorithm>
+
+using namespace Mantid::API;
+using namespace Mantid::Algorithms;
+using namespace WorkspaceCreationHelper;
+
+class ReflectometryReductionOne2Test : public CxxTest::TestSuite {
+private:
+  MatrixWorkspace_sptr m_multiDetectorWS;
+  MatrixWorkspace_sptr m_wavelengthWS;
+
+public:
+  // This pair of boilerplate methods prevent the suite being created statically
+  // This means the constructor isn't called when running other tests
+  static ReflectometryReductionOne2Test *createSuite() {
+    return new ReflectometryReductionOne2Test();
+  }
+  static void destroySuite(ReflectometryReductionOne2Test *suite) {
+    delete suite;
+  }
+
+  ReflectometryReductionOne2Test() {
+    FrameworkManager::Instance();
+    // A multi detector ws
+    m_multiDetectorWS =
+        create2DWorkspaceWithReflectometryInstrumentMultiDetector();
+    // A workspace in wavelength
+    m_wavelengthWS = Create2DWorkspace154(1, 10, true);
+    m_wavelengthWS->setInstrument(m_multiDetectorWS->getInstrument());
+    m_wavelengthWS->getAxis(0)->setUnit("Wavelength");
+
+  }
+
+  void test_IvsLam() {
+    // Test IvsLam workspace
+    // No monitor normalization
+    // No direct beam normalization
+    // No transmission correction
+
+    ReflectometryReductionOne2 alg;
+    alg.setChild(true);
+    alg.initialize();
+    alg.setProperty("InputWorkspace", m_multiDetectorWS);
+    alg.setProperty("WavelengthMin", 1.5);
+    alg.setProperty("WavelengthMax", 15.0);
+    alg.setPropertyValue("ProcessingInstructions", "1");
+    alg.setPropertyValue("OutputWorkspace", "IvsQ");
+    alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam");
+    alg.execute();
+    MatrixWorkspace_sptr outLam = alg.getProperty("OutputWorkspaceWavelength");
+
+    TS_ASSERT(outLam);
+    TS_ASSERT_EQUALS(outLam->getNumberHistograms(), 1);
+    TS_ASSERT_EQUALS(outLam->blocksize(), 8);
+    TS_ASSERT(outLam->readX(0)[0] >= 1.5);
+    TS_ASSERT(outLam->readX(0)[7] <= 15.0);
+    TS_ASSERT_DELTA(outLam->y(0)[0], 3.1530, 0.0001);
+    TS_ASSERT_DELTA(outLam->y(0)[7], 3.1530, 0.0001);
+  }
+
+  void test_IvsLam_processing_instructions_1to2() {
+    // Test IvsLam workspace
+    // No monitor normalization
+    // No direct beam normalization
+    // No transmission correction
+    // Processing instructions : 1+2
+
+    ReflectometryReductionOne2 alg;
+    alg.setChild(true);
+    alg.initialize();
+    alg.setProperty("InputWorkspace", m_multiDetectorWS);
+    alg.setProperty("WavelengthMin", 1.5);
+    alg.setProperty("WavelengthMax", 15.0);
+    alg.setPropertyValue("ProcessingInstructions", "1+2");
+    alg.setPropertyValue("OutputWorkspace", "IvsQ");
+    alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam");
+    alg.execute();
+    MatrixWorkspace_sptr outLam = alg.getProperty("OutputWorkspaceWavelength");
+
+    TS_ASSERT_EQUALS(outLam->getNumberHistograms(), 1);
+    TS_ASSERT_EQUALS(outLam->blocksize(), 8);
+    TS_ASSERT(outLam->readX(0)[0] >= 1.5);
+    TS_ASSERT(outLam->readX(0)[7] <= 15.0);
+    // Y counts, should be 3.1530 * 2
+    TS_ASSERT_DELTA(outLam->y(0)[0], 6.3060, 0.0001);
+    TS_ASSERT_DELTA(outLam->y(0)[7], 6.3060, 0.0001);
+  }
+
+  void test_IvsLam_processing_instructions_1to3(){
+    // Test IvsLam workspace
+    // No monitor normalization
+    // No direct beam normalization
+    // No transmission correction
+    // Processing instructions : 1-3
+
+    ReflectometryReductionOne2 alg;
+    alg.setChild(true);
+    alg.initialize();
+    alg.setProperty("InputWorkspace", m_multiDetectorWS);
+    alg.setProperty("WavelengthMin", 1.5);
+    alg.setProperty("WavelengthMax", 15.0);
+    alg.setPropertyValue("ProcessingInstructions", "1-3");
+    alg.setPropertyValue("OutputWorkspace", "IvsQ");
+    alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam");
+    alg.execute();
+    MatrixWorkspace_sptr outLam = alg.getProperty("OutputWorkspaceWavelength");
+
+    TS_ASSERT_EQUALS(outLam->getNumberHistograms(), 1);
+    TS_ASSERT_EQUALS(outLam->blocksize(), 8);
+    TS_ASSERT(outLam->readX(0)[0] >= 1.5);
+    TS_ASSERT(outLam->readX(0)[7] <= 15.0);
+    // Y counts, should be 3.1530 * 3
+    TS_ASSERT_DELTA(outLam->y(0)[0], 9.4590, 0.0001);
+    TS_ASSERT_DELTA(outLam->y(0)[7], 9.4590, 0.0001);
+  }
+
+  void xtest_bad_processing_instructions() {
+    // Processing instructions : 5+6
+
+    auto alg = AlgorithmManager::Instance().create("ReflectometryReductionOne");
+    alg->setChild(true);
+    alg->initialize();
+    alg->setProperty("InputWorkspace", m_multiDetectorWS);
+    alg->setProperty("WavelengthMin", 1.5);
+    alg->setProperty("WavelengthMax", 15.0);
+    alg->setPropertyValue("OutputWorkspace", "IvsQ");
+    alg->setPropertyValue("OutputWorkspaceWavelength", "IvsLam");
+    alg->setPropertyValue("ProcessingInstructions", "1+2");
+    // Must throw as spectrum 2 is not defined
+    TS_ASSERT_THROWS_ANYTHING(alg->execute());
+  }
+
+  void xtest_IvsLam_direct_beam() {
+    // Test IvsLam workspace
+    // No monitor normalization
+    // Direct beam normalization: 2-3
+    // No transmission correction
+    // Processing instructions : 1
+
+    ReflectometryReductionOne2 alg;
+    alg.setChild(true);
+    alg.initialize();
+    alg.setProperty("InputWorkspace", m_multiDetectorWS);
+    alg.setProperty("WavelengthMin", 1.5);
+    alg.setProperty("WavelengthMax", 15.0);
+    alg.setPropertyValue("ProcessingInstructions", "1");
+    alg.setPropertyValue("RegionOfDirectBeam", "2-3");
+    alg.setPropertyValue("OutputWorkspace", "IvsQ");
+    alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam");
+    alg.execute();
+    MatrixWorkspace_sptr outLam = alg.getProperty("OutputWorkspaceWavelength");
+
+    TS_ASSERT_EQUALS(outLam->getNumberHistograms(), 1);
+    TS_ASSERT_EQUALS(outLam->blocksize(), 8);
+    TS_ASSERT(outLam->readX(0)[0] >= 1.5);
+    TS_ASSERT(outLam->readX(0)[7] <= 15.0);
+    // Y counts, should be 0.5 = 1 (from detector ws) / 2 (from direct beam)
+    TS_ASSERT_DELTA(outLam->y(0)[0], 0.5, 0.0001);
+    TS_ASSERT_DELTA(outLam->y(0)[7], 0.5, 0.0001);
+  }
+
+  void xtest_bad_direct_beam() {
+    // Direct beam : 4-5
+
+    auto alg = AlgorithmManager::Instance().create("ReflectometryReductionOne");
+    alg->setChild(true);
+    alg->initialize();
+    alg->setProperty("InputWorkspace", m_multiDetectorWS);
+    alg->setProperty("WavelengthMin", 1.5);
+    alg->setProperty("WavelengthMax", 15.0);
+    alg->setProperty("MomentumTransferStep", 0.1);
+    alg->setProperty("AnalysisMode", "PointDetectorAnalysis");
+    alg->setProperty("NormalizeByIntegratedMonitors", "0");
+    alg->setPropertyValue("ProcessingInstructions", "1");
+    alg->setPropertyValue("OutputWorkspace", "IvsQ");
+    alg->setPropertyValue("OutputWorkspaceWavelength", "IvsLam");
+    alg->setPropertyValue("RegionOfDirectBeam", "4-5");
+    // Must throw region of interest is incompatible with point detector
+    TS_ASSERT_THROWS_ANYTHING(alg->execute());
+  }
+
+  void test_IvsLam_no_monitors() {
+    // Test IvsLam workspace
+    // No monitor normalization
+    // Direct beam normalization: 2-3
+    // No transmission correction
+    // Processing instructions : 1
+
+    // I0MonitorIndex: 0
+    // MonitorBackgroundWavelengthMin : Not given
+    // MonitorBackgroundWavelengthMax : Not given
+
+    ReflectometryReductionOne2 alg;
+    alg.setChild(true);
+    alg.initialize();
+    alg.setProperty("InputWorkspace", m_multiDetectorWS);
+    alg.setProperty("WavelengthMin", 1.5);
+    alg.setProperty("WavelengthMax", 15.0);
+    alg.setProperty("I0MonitorIndex", "0");
+    alg.setPropertyValue("ProcessingInstructions", "1");
+    alg.setPropertyValue("OutputWorkspace", "IvsQ");
+    alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam");
+    alg.execute();
+    MatrixWorkspace_sptr outLam = alg.getProperty("OutputWorkspaceWavelength");
+
+    TS_ASSERT_EQUALS(outLam->getNumberHistograms(), 1);
+    TS_ASSERT_EQUALS(outLam->blocksize(), 8);
+    TS_ASSERT(outLam->readX(0)[0] >= 1.5);
+    TS_ASSERT(outLam->readX(0)[7] <= 15.0);
+    // No monitors considered because MonitorBackgroundWavelengthMin
+    // and MonitorBackgroundWavelengthMax were not set
+    // Y counts must be 3.1530
+    TS_ASSERT_DELTA(outLam->y(0)[0], 3.1530, 0.0001);
+    TS_ASSERT_DELTA(outLam->y(0)[7], 3.1530, 0.0001);
+  }
+
+  void xtest_IvsLam_monitor_normalization() {
+    // Test IvsLam workspace
+    // Monitor normalization
+    // No direct beam normalization
+    // No transmission correction
+    // Processing instructions : 1
+
+    // I0MonitorIndex: 0
+    // MonitorBackgroundWavelengthMin : 0.5
+    // MonitorBackgroundWavelengthMax : 3.0
+    // Normalize by integrated monitors : No
+
+    // Modify counts in monitor (only for this test)
+    // Modify counts only for range that will be fitted
+    auto inputWS = m_multiDetectorWS;
+    auto &Y = inputWS->mutableY(0);
+    Y = 1.0;
+    //std::fill(Y.begin(), Y.begin()+2, 1.0);
+
+    ReflectometryReductionOne2 alg;
+    alg.setChild(true);
+    alg.initialize();
+    alg.setProperty("InputWorkspace", inputWS);
+    alg.setProperty("WavelengthMin", 1.5);
+    alg.setProperty("WavelengthMax", 15.0);
+    alg.setProperty("I0MonitorIndex", "0");
+    alg.setProperty("MonitorBackgroundWavelengthMin", 0.5);
+    alg.setProperty("MonitorBackgroundWavelengthMax", 3.0);
+    alg.setProperty("NormalizeByIntegratedMonitors", "0");
+    alg.setPropertyValue("ProcessingInstructions", "1");
+    alg.setPropertyValue("OutputWorkspace", "IvsQ");
+    alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam");
+    alg.execute();
+    MatrixWorkspace_sptr outLam = alg.getProperty("OutputWorkspaceWavelength");
+
+    TS_ASSERT_EQUALS(outLam->getNumberHistograms(), 1);
+    TS_ASSERT_EQUALS(outLam->blocksize(), 8);
+    TS_ASSERT(outLam->readX(0)[0] >= 1.5);
+    TS_ASSERT(outLam->readX(0)[7] <= 15.0);
+    // Expected values are 2.4996 = 3.15301 (detectors) / 1.26139 (monitors)
+    TS_ASSERT_DELTA(outLam->y(0)[0], 2.4996, 0.0001);
+    TS_ASSERT_DELTA(outLam->y(0)[7], 2.4996, 0.0001);
+  }
+
+  void xtest_IvsLam_integrated_monitors() {
+    // Test IvsLam workspace
+    // Monitor normalization
+    // No direct beam normalization
+    // No transmission correction
+    // Processing instructions : 1
+
+    // I0MonitorIndex: 0
+    // MonitorBackgroundWavelengthMin : 0.5
+    // MonitorBackgroundWavelengthMax : 3.0
+    // Normalize by integrated monitors : Yes
+
+    // Modify counts in monitor (only for this test)
+    // Modify counts only for range that will be fitted
+    auto inputWS = m_multiDetectorWS;
+    auto &Y = inputWS->mutableY(0);
+    Y = 1.0;
+    //std::fill(Y.begin(), Y.begin()+2, 1.0);
+
+    ReflectometryReductionOne2 alg;
+    alg.setChild(true);
+    alg.initialize();
+    alg.setProperty("InputWorkspace", inputWS);
+    alg.setProperty("WavelengthMin", 1.5);
+    alg.setProperty("WavelengthMax", 15.0);
+    alg.setProperty("I0MonitorIndex", "0");
+    alg.setProperty("MonitorBackgroundWavelengthMin", 0.5);
+    alg.setProperty("MonitorBackgroundWavelengthMax", 3.0);
+    alg.setProperty("NormalizeByIntegratedMonitors", "1");
+    alg.setPropertyValue("ProcessingInstructions", "1");
+    alg.setPropertyValue("OutputWorkspace", "IvsQ");
+    alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam");
+    alg.execute();
+    MatrixWorkspace_sptr outLam = alg.getProperty("OutputWorkspaceWavelength");
+
+    TS_ASSERT_EQUALS(outLam->getNumberHistograms(), 1);
+    TS_ASSERT_EQUALS(outLam->blocksize(), 8);
+    TS_ASSERT(outLam->readX(0)[0] >= 1.5);
+    TS_ASSERT(outLam->readX(0)[7] <= 15.0);
+    // Expected values are 0.3124 = 3.15301 (detectors) / (1.26139*8) (monitors)
+    TS_ASSERT_DELTA(outLam->y(0)[0], 0.3124, 0.0001);
+    TS_ASSERT_DELTA(outLam->y(0)[7], 0.3124, 0.0001);
+  }
+
+  void xtest_transmission_correction_run() {
+    // Transmission run is the same as input run
+
+    ReflectometryReductionOne2 alg;
+    alg.setChild(true);
+    alg.initialize();
+    alg.setProperty("InputWorkspace", m_wavelengthWS);
+    alg.setProperty("FirstTransmissionRun", m_wavelengthWS);
+    alg.setProperty("WavelengthMin", 1.5);
+    alg.setProperty("WavelengthMax", 15.0);
+    alg.setProperty("ProcessingInstructions", "100");
+    alg.setPropertyValue("OutputWorkspace", "IvsQ");
+    alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam");
+    alg.execute();
+    MatrixWorkspace_sptr outLam = alg.getProperty("OutputWorkspaceWavelength");
+
+    TS_ASSERT_EQUALS(outLam->getNumberHistograms(), 1);
+    TS_ASSERT_EQUALS(outLam->blocksize(), 10);
+    // Expected values are 1 = m_wavelength / m_wavelength
+    TS_ASSERT_DELTA(outLam->y(0)[0], 1.0000, 0.0001);
+    TS_ASSERT_DELTA(outLam->y(0)[7], 1.0000, 0.0001);
+  }
+
+  void xtest_exponential_correction() {
+    // CorrectionAlgorithm: ExponentialCorrection
+    
+    ReflectometryReductionOne2 alg;
+    alg.setChild(true);
+    alg.initialize();
+    alg.setProperty("InputWorkspace", m_wavelengthWS);
+    alg.setProperty("WavelengthMin", 1.5);
+    alg.setProperty("WavelengthMax", 15.0);
+    alg.setProperty("ProcessingInstructions", "100");
+    alg.setProperty("CorrectDetectorPositions", false);
+    alg.setProperty("CorrectionAlgorithm", "ExponentialCorrection");
+    alg.setProperty("C0", 0.2);
+    alg.setProperty("C1", 0.1);
+    alg.setPropertyValue("OutputWorkspace", "IvsQ");
+    alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam");
+    alg.execute();
+    MatrixWorkspace_sptr outLam = alg.getProperty("OutputWorkspaceWavelength");
+
+    TS_ASSERT_EQUALS(outLam->getNumberHistograms(), 1);
+    TS_ASSERT_EQUALS(outLam->blocksize(), 10);
+    // Expected values are 29.0459 and 58.4912
+    TS_ASSERT_DELTA(outLam->y(0)[0], 29.0459, 0.0001);
+    TS_ASSERT_DELTA(outLam->y(0)[7], 58.4912, 0.0001);
+  }
+
+  void test_polynomial_correction() {
+    // CorrectionAlgorithm: PolynomialCorrection
+
+    ReflectometryReductionOne2 alg;
+    alg.setChild(true);
+    alg.initialize();
+    alg.setProperty("InputWorkspace", m_wavelengthWS);
+    alg.setProperty("WavelengthMin", 1.5);
+    alg.setProperty("WavelengthMax", 15.0);
+    alg.setProperty("ProcessingInstructions", "100");
+    alg.setProperty("CorrectionAlgorithm", "PolynomialCorrection");
+    alg.setProperty("Polynomial", "0.1,0.3,0.5");
+    alg.setPropertyValue("OutputWorkspace", "IvsQ");
+    alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam");
+    alg.execute();
+    MatrixWorkspace_sptr outLam = alg.getProperty("OutputWorkspaceWavelength");
+
+    TS_ASSERT_EQUALS(outLam->getNumberHistograms(), 1);
+    TS_ASSERT_EQUALS(outLam->blocksize(), 10);
+    // Expected values are 2.9851 and 0.1289
+    TS_ASSERT_DELTA(outLam->y(0)[0], 2.9851, 0.0001);
+    TS_ASSERT_DELTA(outLam->y(0)[7], 0.1289, 0.0001);
+  }
+
+  void xtest_IvsQ_no_rebin() {
+
+    ReflectometryReductionOne2 alg;
+    alg.setChild(true);
+    alg.initialize();
+    alg.setProperty("InputWorkspace", m_wavelengthWS);
+    alg.setProperty("WavelengthMin", 1.5);
+    alg.setProperty("WavelengthMax", 15.0);
+    alg.setProperty("ProcessingInstructions", "100");
+    alg.setPropertyValue("OutputWorkspace", "IvsQ");
+    alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam");
+    alg.execute();
+    MatrixWorkspace_sptr outQ = alg.getProperty("OutputWorkspace");
+
+    // TODO: test some values
+  }
+
+  void xtest_IvsQ_linear_binning() {
+
+    ReflectometryReductionOne2 alg;
+    alg.setChild(true);
+    alg.initialize();
+    alg.setProperty("InputWorkspace", m_wavelengthWS);
+    alg.setProperty("WavelengthMin", 1.5);
+    alg.setProperty("WavelengthMax", 15.0);
+    alg.setProperty("ProcessingInstructions", "100");
+    alg.setProperty("MomentumTransferMin", 1.0);
+    alg.setProperty("MomentumTransferMax", 10.0);
+    alg.setProperty("MomentumTransferStep", 0.04);
+    alg.setPropertyValue("OutputWorkspace", "IvsQ");
+    alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam");
+    alg.execute();
+    MatrixWorkspace_sptr outQ = alg.getProperty("OutputWorkspace");
+
+    // TODO: choose appropriate values for MomentumTransferMin, MomentumTransferMax, MomentumTransferStep
+    // TODO: test some values
+  }
+
+  void xtest_IvsQ_logarithmic_binning() {
+
+    ReflectometryReductionOne2 alg;
+    alg.setChild(true);
+    alg.initialize();
+    alg.setProperty("InputWorkspace", m_wavelengthWS);
+    alg.setProperty("WavelengthMin", 1.5);
+    alg.setProperty("WavelengthMax", 15.0);
+    alg.setProperty("ProcessingInstructions", "100");
+    alg.setProperty("MomentumTransferMin", 1.0);
+    alg.setProperty("MomentumTransferMax", 10.0);
+    alg.setProperty("MomentumTransferStep", 0.04);
+    alg.setPropertyValue("OutputWorkspace", "IvsQ");
+    alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam");
+    alg.execute();
+    MatrixWorkspace_sptr outQ = alg.getProperty("OutputWorkspace");
+
+    // TODO: choose appropriate values for MomentumTransferMin, MomentumTransferMax, MomentumTransferStep
+    // TODO: test some values
+  }
+
+  void xtest_IvsQ_q_range() {
+
+    ReflectometryReductionOne2 alg;
+    alg.setChild(true);
+    alg.initialize();
+    alg.setProperty("InputWorkspace", m_wavelengthWS);
+    alg.setProperty("WavelengthMin", 1.5);
+    alg.setProperty("WavelengthMax", 15.0);
+    alg.setProperty("ProcessingInstructions", "100");
+    alg.setPropertyValue("OutputWorkspace", "IvsQ");
+    alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam");
+    alg.execute();
+    MatrixWorkspace_sptr outLam = alg.getProperty("OutputWorkspaceWavelength");
+    MatrixWorkspace_sptr outQ = alg.getProperty("OutputWorkspace");
+
+    // TODO: check that q = 4 * pi / lambda * sin(theta)
+  }
+
+  void xtest_IvsQ_scale() {
+
+    ReflectometryReductionOne2 alg;
+    alg.setChild(true);
+    alg.initialize();
+    alg.setProperty("InputWorkspace", m_wavelengthWS);
+    alg.setProperty("WavelengthMin", 1.5);
+    alg.setProperty("WavelengthMax", 15.0);
+    alg.setProperty("ProcessingInstructions", "100");
+    alg.setPropertyValue("OutputWorkspace", "IvsQ");
+    alg.setPropertyValue("OutputWorkspaceWavelength", "IvsLam");
+    alg.execute();
+    MatrixWorkspace_sptr outQ = alg.getProperty("OutputWorkspace");
+
+    TS_ASSERT_EQUALS(outQ->getNumberHistograms(), 1);
+    TS_ASSERT_EQUALS(outQ->blocksize(), 10);
+
+    // TODO: test some values
+  }
+
+};
+
+#endif /* ALGORITHMS_TEST_REFLECTOMETRYREDUCTIONONE2TEST_H_ */
diff --git a/Framework/TestHelpers/inc/MantidTestHelpers/WorkspaceCreationHelper.h b/Framework/TestHelpers/inc/MantidTestHelpers/WorkspaceCreationHelper.h
index f0144963c8e90db0ab192c33c9009d81b0f0b492..81d2f08928b3b07b840f313bc9aebc340d3391dc 100644
--- a/Framework/TestHelpers/inc/MantidTestHelpers/WorkspaceCreationHelper.h
+++ b/Framework/TestHelpers/inc/MantidTestHelpers/WorkspaceCreationHelper.h
@@ -328,6 +328,11 @@ void create2DAngles(std::vector<double> &L2, std::vector<double> &polar,
 Mantid::API::MatrixWorkspace_sptr
 create2DWorkspaceWithReflectometryInstrument(double startX = 0);
 
+/// Create a 2D workspace with one monitor and three detectors based around
+/// a virtual reflectometry instrument.
+Mantid::API::MatrixWorkspace_sptr
+create2DWorkspaceWithReflectometryInstrumentMultiDetector(double startX = 0);
+
 void createInstrumentForWorkspaceWithDistances(
     Mantid::API::MatrixWorkspace_sptr workspace,
     const Mantid::Kernel::V3D &samplePosition,
diff --git a/Framework/TestHelpers/src/WorkspaceCreationHelper.cpp b/Framework/TestHelpers/src/WorkspaceCreationHelper.cpp
index 0ea9ef83badb5e07d2e60b93ef199e088799f6ed..057d18381d7defcd6a7dd75a131d380190bd9ae0 100644
--- a/Framework/TestHelpers/src/WorkspaceCreationHelper.cpp
+++ b/Framework/TestHelpers/src/WorkspaceCreationHelper.cpp
@@ -490,6 +490,71 @@ create2DWorkspaceWithReflectometryInstrument(double startX) {
   return workspace;
 }
 
+/**
+* Create a very small 2D workspace for a virtual reflectometry instrument with multiple detectors
+* @return workspace with instrument attached.
+* @param startX : X Tof start value for the workspace.
+*/
+MatrixWorkspace_sptr
+create2DWorkspaceWithReflectometryInstrumentMultiDetector(double startX) {
+  Instrument_sptr instrument = boost::make_shared<Instrument>();
+  instrument->setReferenceFrame(
+      boost::make_shared<ReferenceFrame>(Y /*up*/, X /*along*/, Left, "0,0,0"));
+
+  ObjComponent *source = new ObjComponent("source");
+  source->setPos(V3D(0, 0, 0));
+  instrument->add(source);
+  instrument->markAsSource(source);
+
+  ObjComponent *sample = new ObjComponent("some-surface-holder");
+  sample->setPos(V3D(15, 0, 0));
+  instrument->add(sample);
+  instrument->markAsSamplePos(sample);
+
+  Detector *monitor = new Detector("Monitor", 1, nullptr);
+  monitor->setPos(14, 0, 0);
+  instrument->add(monitor);
+  instrument->markAsMonitor(monitor);
+
+  Detector *det1 = new Detector(
+      "point-detector", 2,
+      ComponentCreationHelper::createCuboid(0.01, 0.02, 0.03), nullptr);
+  det1->setPos(20,(20 - sample->getPos().X()) , 0);
+  instrument->add(det1);
+  instrument->markAsDetector(det1);
+
+  Detector *det2 = new Detector(
+      "point-detector", 3,
+      ComponentCreationHelper::createCuboid(0.01, 0.02, 0.03), nullptr);
+  det2->setPos(20, (20 - sample->getPos().X()), 0);
+  instrument->add(det2);
+  instrument->markAsDetector(det2);
+
+  Detector *det3 = new Detector(
+      "point-detector", 4,
+      ComponentCreationHelper::createCuboid(0.01, 0.02, 0.03), nullptr);
+  det3->setPos(20, (20 - sample->getPos().X()), 0);
+  instrument->add(det3);
+  instrument->markAsDetector(det3);
+
+  const int nSpectra = 4;
+  const int nBins = 20;
+  const double deltaX = 5000; // TOF
+  auto workspace = Create2DWorkspaceBinned(nSpectra, nBins, startX, deltaX);
+
+  workspace->setTitle("Test histogram");
+  workspace->getAxis(0)->setUnit("TOF");
+  workspace->setYUnit("Counts");
+
+  workspace->setInstrument(instrument);
+  workspace->getSpectrum(0).setDetectorID(monitor->getID());
+  workspace->getSpectrum(1).setDetectorID(det1->getID());
+  workspace->getSpectrum(2).setDetectorID(det2->getID());
+  workspace->getSpectrum(3).setDetectorID(det3->getID());
+  return workspace;
+}
+
+
 void createInstrumentForWorkspaceWithDistances(
     MatrixWorkspace_sptr workspace, const V3D &samplePosition,
     const V3D &sourcePosition, const std::vector<V3D> &detectorPositions) {