diff --git a/Core/StandardSamples/StandardSimulations.cpp b/Core/StandardSamples/StandardSimulations.cpp
index 0f86c8047042b350cfc4f911d3e2ebc8f3b684a1..fa9e2c75806cf189bea53dcdfd5c6e2c842dac08 100644
--- a/Core/StandardSamples/StandardSimulations.cpp
+++ b/Core/StandardSamples/StandardSimulations.cpp
@@ -18,6 +18,7 @@
 #include "DepthProbeSimulation.h"
 #include "Distributions.h"
 #include "Ellipse.h"
+#include "FixedBinAxis.h"
 #include "FootprintFactorGaussian.h"
 #include "FootprintFactorSquare.h"
 #include "GISASSimulation.h"
@@ -30,6 +31,7 @@
 #include "RectangularDetector.h"
 #include "ResolutionFunction2DGaussian.h"
 #include "SampleBuilderFactory.h"
+#include "SpecularScan.h"
 #include "SpecularSimulation.h"
 #include "OffSpecSimulation.h"
 #include "Units.h"
@@ -379,18 +381,16 @@ GISASSimulation* StandardSimulations::ConstantBackgroundGISAS()
     return result;
 }
 
-#include "FixedBinAxis.h"
 SpecularSimulation* StandardSimulations::BasicSpecular()
 {
     const double wavelength = 1.54 * Units::angstrom;
     const int number_of_bins = 2000;
     const double min_angle = 0 * Units::deg;
     const double max_angle = 5 * Units::deg;
-
-    FixedBinAxis angle_axis("axis", number_of_bins, min_angle, max_angle);
+    AngularSpecScan scan(wavelength, FixedBinAxis("axis", number_of_bins, min_angle, max_angle));
 
     std::unique_ptr<SpecularSimulation> result(new SpecularSimulation());
-    result->setBeamParameters(wavelength, angle_axis);
+    result->setScan(scan);
     result->getOptions().setUseAvgMaterials(true);
     return result.release();
 }
@@ -410,9 +410,10 @@ SpecularSimulation* StandardSimulations::BasicSpecularQ()
         for (size_t i = 0, size = qs.size(); i < size; ++i)
             qs[i] = 4.0 * M_PI * std::sin(angles[i]) / wavelength_0;
     }
+    QSpecScan q_scan(qs);
 
     std::unique_ptr<SpecularSimulation> result(new SpecularSimulation());
-    result->setBeamParameters(qs);
+    result->setScan(q_scan);
     result->getOptions().setUseAvgMaterials(true);
     return result.release();
 }
@@ -423,11 +424,12 @@ SpecularSimulation* StandardSimulations::SpecularWithGaussianBeam()
     const int number_of_bins = 2000;
     const double min_angle = 0 * Units::deg;
     const double max_angle = 5 * Units::deg;
-
     auto gaussian_ff = std::make_unique<FootprintFactorGaussian>(1.0);
+    AngularSpecScan scan(wavelength, FixedBinAxis("axis", number_of_bins, min_angle, max_angle));
+    scan.setFootprintFactor(gaussian_ff.get());
 
     std::unique_ptr<SpecularSimulation> result(new SpecularSimulation());
-    result->setBeamParameters(wavelength, number_of_bins, min_angle, max_angle, gaussian_ff.get());
+    result->setScan(scan);
     return result.release();
 }
 
@@ -437,11 +439,12 @@ SpecularSimulation* StandardSimulations::SpecularWithSquareBeam()
     const int number_of_bins = 2000;
     const double min_angle = 0 * Units::deg;
     const double max_angle = 5 * Units::deg;
-
     auto square_ff = std::make_unique<FootprintFactorSquare>(1.0);
+    AngularSpecScan scan(wavelength, FixedBinAxis("axis", number_of_bins, min_angle, max_angle));
+    scan.setFootprintFactor(square_ff.get());
 
     std::unique_ptr<SpecularSimulation> result(new SpecularSimulation());
-    result->setBeamParameters(wavelength, number_of_bins, min_angle, max_angle, square_ff.get());
+    result->setScan(scan);
     return result.release();
 }
 
@@ -452,12 +455,13 @@ SpecularSimulation* StandardSimulations::SpecularDivergentBeam()
     const size_t n_integration_points = 10;
     const double min_angle = 0 * Units::deg;
     const double max_angle = 5 * Units::deg;
+    AngularSpecScan scan(wavelength, FixedBinAxis("axis", number_of_bins, min_angle, max_angle));
 
     DistributionGaussian wavelength_distr(wavelength, 0.1*Units::angstrom);
     DistributionGaussian alpha_distr(0.0, 0.1*Units::degree);
 
     std::unique_ptr<SpecularSimulation> result(new SpecularSimulation());
-    result->setBeamParameters(wavelength, number_of_bins, min_angle, max_angle);
+    result->setScan(scan);
 
     ParameterPattern pattern1;
     pattern1.beginsWith("*").add(BornAgain::BeamType).add(BornAgain::Wavelength);
diff --git a/GUI/coregui/Models/DomainSimulationBuilder.cpp b/GUI/coregui/Models/DomainSimulationBuilder.cpp
index 26263fc8ef29b47a10d0ca96349bfc925621765f..82286be4d3c3854b214e68102c855f0f0d66412b 100644
--- a/GUI/coregui/Models/DomainSimulationBuilder.cpp
+++ b/GUI/coregui/Models/DomainSimulationBuilder.cpp
@@ -16,6 +16,8 @@
 #include "AxesItems.h"
 #include "BackgroundItems.h"
 #include "BeamItems.h"
+#include "DepthProbeInstrumentItem.h"
+#include "DepthProbeSimulation.h"
 #include "DetectorItems.h"
 #include "DomainObjectBuilder.h"
 #include "FootprintItems.h"
@@ -28,11 +30,10 @@
 #include "MultiLayerItem.h"
 #include "OffSpecSimulation.h"
 #include "SimulationOptionsItem.h"
-#include "SpecularSimulation.h"
 #include "SpecularBeamInclinationItem.h"
+#include "SpecularScan.h"
+#include "SpecularSimulation.h"
 #include "TransformToDomain.h"
-#include "DepthProbeSimulation.h"
-#include "DepthProbeInstrumentItem.h"
 #include "Units.h"
 
 namespace {
@@ -154,10 +155,11 @@ createSpecularSimulation(std::unique_ptr<MultiLayer> P_multilayer,
     const auto axis_item = beam_item->currentInclinationAxisItem();
     const auto footprint = beam_item->currentFootprintItem();
 
+    AngularSpecScan scan(beam_item->getWavelength(), *axis_item->createAxis(Units::degree));
+    scan.setFootprintFactor(footprint->createFootprint().get());
+
     specular_simulation->setBeamIntensity(beam_item->getIntensity());
-    specular_simulation->setBeamParameters(beam_item->getWavelength(),
-                                           *axis_item->createAxis(Units::degree),
-                                           footprint->createFootprint().get());
+    specular_simulation->setScan(scan);
 
     TransformToDomain::addDistributionParametersToSimulation(*beam_item,
                                                              *specular_simulation.get());
diff --git a/Tests/UnitTests/Core/Fresnel/SpecularSimulationTest.cpp b/Tests/UnitTests/Core/Fresnel/SpecularSimulationTest.cpp
index bf7963bb11cecc2714232e28f9ee8254c82c50b6..0cbc22e91d2918df964e9413eceb4dca7ce7fd0d 100644
--- a/Tests/UnitTests/Core/Fresnel/SpecularSimulationTest.cpp
+++ b/Tests/UnitTests/Core/Fresnel/SpecularSimulationTest.cpp
@@ -10,6 +10,7 @@
 #include "MultiLayer.h"
 #include "ParameterPattern.h"
 #include "RealParameter.h"
+#include "SpecularScan.h"
 #include "SpecularSimulation.h"
 #include "Units.h"
 #include "VariableBinAxis.h"
@@ -56,7 +57,8 @@ TEST_F(SpecularSimulationTest, InitialState)
 std::unique_ptr<SpecularSimulation> SpecularSimulationTest::defaultSimulation()
 {
     auto result = std::make_unique<SpecularSimulation>();
-    result->setBeamParameters(1.0, 10, 0.0 * Units::degree, 2.0 * Units::degree);
+    AngularSpecScan scan(1.0, FixedBinAxis("axis", 10, 0.0 * Units::degree, 2.0 * Units::degree));
+    result->setScan(scan);
     result->setSample(multilayer);
     return result;
 }
@@ -83,12 +85,12 @@ TEST_F(SpecularSimulationTest, CloneOfEmpty)
     checkBeamState(*clone);
 }
 
-TEST_F(SpecularSimulationTest, SetBeamParameters)
+TEST_F(SpecularSimulationTest, SetAngularScan)
 {
     SpecularSimulation sim;
 
-    VariableBinAxis axis("axis", 2, std::vector<double>{1.0, 2.0, 3.0});
-    sim.setBeamParameters(1.0, axis);
+    AngularSpecScan scan(1.0, std::vector<double>{1.0, 3.0});
+    sim.setScan(scan);
 
     const auto& beam = sim.getInstrument().getBeam();
 
@@ -105,7 +107,8 @@ TEST_F(SpecularSimulationTest, SetBeamParameters)
     sim.setBeamIntensity(2.0);
     EXPECT_EQ(2.0, beam.getIntensity());
 
-    sim.setBeamParameters(1.0, 10, 1.0 * Units::degree, 10.0 * Units::degree);
+    AngularSpecScan scan2(1.0, 10, 1.0 * Units::degree, 10.0 * Units::degree);
+    sim.setScan(scan2);
     EXPECT_EQ(10u, sim.coordinateAxis()->size());
     EXPECT_EQ(1.0 * Units::degree, sim.coordinateAxis()->getMin());
     EXPECT_EQ(10.0 * Units::degree, sim.coordinateAxis()->getMax());
@@ -113,17 +116,10 @@ TEST_F(SpecularSimulationTest, SetBeamParameters)
     EXPECT_EQ(1.0, beam.getWavelength());
     EXPECT_EQ(0.0, beam.getAlpha());
     EXPECT_EQ(0.0, beam.getPhi());
-
     checkBeamState(sim);
 
-    EXPECT_THROW(sim.setBeamParameters(1.0, 10, -2.0, 3.0),
-                 std::runtime_error);
-    EXPECT_THROW(sim.setBeamParameters(1.0, 10, 2.0, 1.0),
-                 std::runtime_error);
-    EXPECT_THROW(sim.setBeamParameters(1.0, 0, 1.0, 2.0),
-                 std::runtime_error);
-    EXPECT_THROW(sim.setBeamParameters(-1.0, 1, 1.0, 2.0),
-                 std::runtime_error);
+    AngularSpecScan scan3(1.0, 10, -1.0 * Units::degree, 2.0 * Units::degree);
+    EXPECT_THROW(sim.setScan(scan3), std::runtime_error);
 
     EXPECT_EQ(10u, sim.coordinateAxis()->size());
     EXPECT_EQ(1.0 * Units::degree, sim.coordinateAxis()->getMin());
@@ -132,11 +128,43 @@ TEST_F(SpecularSimulationTest, SetBeamParameters)
     EXPECT_EQ(1.0, beam.getWavelength());
     EXPECT_EQ(0.0, beam.getAlpha());
     EXPECT_EQ(0.0, beam.getPhi());
-
     checkBeamState(sim);
 
     sim.setInstrument(Instrument());
+    checkBeamState(sim);
+}
 
+TEST_F(SpecularSimulationTest, SetQScan)
+{
+    SpecularSimulation sim;
+
+    QSpecScan scan(std::vector<double>{1.0, 3.0});
+    sim.setScan(scan);
+
+    const auto& beam = sim.getInstrument().getBeam();
+
+    EXPECT_EQ(2u, sim.coordinateAxis()->size());
+    EXPECT_EQ(1.0, sim.coordinateAxis()->getMin());
+    EXPECT_EQ(3.0, sim.coordinateAxis()->getMax());
+    EXPECT_EQ(1.0, beam.getIntensity());
+    EXPECT_EQ(1.0, beam.getWavelength());
+    EXPECT_EQ(0.0, beam.getAlpha());
+    EXPECT_EQ(0.0, beam.getPhi());
+
+    checkBeamState(sim);
+
+    sim.setBeamIntensity(2.0);
+    EXPECT_EQ(2.0, beam.getIntensity());
+
+    QSpecScan scan2(10, 1.0, 10.0);
+    sim.setScan(scan2);
+    EXPECT_EQ(10u, sim.coordinateAxis()->size());
+    EXPECT_EQ(1.0, sim.coordinateAxis()->getMin());
+    EXPECT_EQ(10.0, sim.coordinateAxis()->getMax());
+    EXPECT_EQ(2.0, beam.getIntensity());
+    EXPECT_EQ(1.0, beam.getWavelength());
+    EXPECT_EQ(0.0, beam.getAlpha());
+    EXPECT_EQ(0.0, beam.getPhi());
     checkBeamState(sim);
 }