diff --git a/GUI/Model/Device/InstrumentCollection.h b/GUI/Model/Device/InstrumentCollection.h
index 44ff4f0464cde79f93881da75346cddcc7024143..3dfb7fa24d70ae7b7e8a523a673f22daa461d4c1 100644
--- a/GUI/Model/Device/InstrumentCollection.h
+++ b/GUI/Model/Device/InstrumentCollection.h
@@ -41,6 +41,8 @@ public:
 
     void serialize(Streamer& s);
 
+    void emplace_back(InstrumentItem* item) { m_instruments.push_back(item); } // TODO Qt6 emplace
+
     //! Inserts a deep copy (also of any non xml data in a pointwise axis)
     //! The id will not be copied, but a new unique one will be created
     //! Returns the newly created instrument.
diff --git a/GUI/Model/FromCore/GUIExamplesFactory.cpp b/GUI/Model/FromCore/GUIExamplesFactory.cpp
index fc3bbe2f56cb60e4bec737d1f1daa89c3fe77605..ed0b5dfb47e7c1753f79d6709d65f8d6aed41be2 100644
--- a/GUI/Model/FromCore/GUIExamplesFactory.cpp
+++ b/GUI/Model/FromCore/GUIExamplesFactory.cpp
@@ -14,8 +14,8 @@
 
 #include "GUI/Model/FromCore/GUIExamplesFactory.h"
 #include "Base/Util/Assert.h"
-#include "GUI/Model/FromCore/ItemizeSimulation.h"
 #include "GUI/Model/FromCore/ItemizeSample.h"
+#include "GUI/Model/FromCore/ItemizeSimulation.h"
 #include "Sample/Multilayer/MultiLayer.h"
 #include "Sample/StandardSamples/ExemplarySamples.h"
 #include <QMap>
diff --git a/GUI/Model/FromCore/ItemizeSimulation.cpp b/GUI/Model/FromCore/ItemizeSimulation.cpp
index 52c1b9000a31c36a8cc0ee82567ea3ef5c982681..8da32fdc95eaae447a34c8b6464a9cd52c4556f4 100644
--- a/GUI/Model/FromCore/ItemizeSimulation.cpp
+++ b/GUI/Model/FromCore/ItemizeSimulation.cpp
@@ -207,9 +207,8 @@ void setDistribution(BeamDistributionItem* part_distr_item, ParameterDistributio
     distItem->setLimits(par_distr.getLimits().scaledLimits(factor));
 }
 
-void setItemFromSample(
-    BeamDistributionItem* beam_distribution_item,
-    const ParameterDistribution& parameter_distribution)
+void setItemFromSample(BeamDistributionItem* beam_distribution_item,
+                       const ParameterDistribution& parameter_distribution)
 {
     ASSERT(beam_distribution_item);
 
@@ -246,8 +245,7 @@ void addRangedDistributionToItem(BeamDistributionItem* distributionItem,
     setItemFromSample(distributionItem, par_distr);
 }
 
-void setGISASBeamItem(BeamItem* beam_item,
-                                                const ScatteringSimulation& simulation)
+void setGISASBeamItem(BeamItem* beam_item, const ScatteringSimulation& simulation)
 {
     ASSERT(beam_item);
     const Beam& beam = simulation.beam();
@@ -270,8 +268,7 @@ void setGISASBeamItem(BeamItem* beam_item,
     }
 }
 
-void setOffspecBeamItem(BeamItem* beam_item,
-                                                  const OffspecSimulation& simulation)
+void setOffspecBeamItem(BeamItem* beam_item, const OffspecSimulation& simulation)
 {
     const Beam& beam = simulation.beam();
 
@@ -293,43 +290,7 @@ void setAxisItem(BasicAxisItem* item, const IAxis& axis, double factor)
     item->setTitle(QString::fromStdString(axis.axisName()));
 }
 
-void setSpecularBeamItem(SpecularBeamItem* beam_item,
-                                                   const SpecularSimulation& simulation)
-{
-    const Beam& beam = simulation.beam();
-
-    beam_item->setIntensity(beam.intensity());
-    beam_item->setWavelength(beam.wavelength());
-    beam_item->setInclinationAngle(0.0); // inclination angle is hardcoded
-    beam_item->setAzimuthalAngle(0.0);   // azimuthal angle is hardcoded
-
-    auto* axis_item = beam_item->inclinationAxis();
-    setAxisItem(axis_item, *simulation.coordinateAxis(), 1. / Units::deg);
-
-    setFootprintFactor(simulation.footprintFactor(), beam_item);
-
-    const auto* scan = dynamic_cast<const AlphaScan*>(simulation.dataHandler());
-    if (!scan)
-        return;
-
-    const auto* resolution = scan->wavelengthResolution();
-    if (!resolution->empty()) {
-        double mean = scan->wavelength();
-        double std_dev = resolution->stdDevs(mean, 1).front();
-        addRangedDistributionToItem(beam_item->wavelengthItem(), *resolution->distribution(), mean,
-                                    std_dev);
-    }
-
-    resolution = scan->angleResolution();
-    if (resolution && !resolution->empty()) {
-        double std_dev = resolution->stdDevs(0.0, 1).front();
-        addRangedDistributionToItem(beam_item->inclinationAngleItem(), *resolution->distribution(),
-                                    0.0, std_dev);
-    }
-}
-
-void setSphericalDetector(SphericalDetectorItem* detectorItem,
-                                                    const SphericalDetector& detector)
+void setSphericalDetector(SphericalDetectorItem* detectorItem, const SphericalDetector& detector)
 {
     // Axes
     const IAxis& phi_axis = detector.axis(0);
@@ -347,7 +308,7 @@ void setSphericalDetector(SphericalDetectorItem* detectorItem,
 }
 
 void setRectangularDetector(RectangularDetectorItem* detectorItem,
-                                                      const RectangularDetector& detector)
+                            const RectangularDetector& detector)
 {
     // Axes
     detectorItem->setXSize(detector.getNbinsX());
@@ -394,8 +355,7 @@ void setRectangularDetector(RectangularDetectorItem* detectorItem,
     }
 }
 
-void setDetectorGeometry(Instrument2DItem* instrument_item,
-                                                   const IDetector& detector)
+void setDetectorGeometry(Instrument2DItem* instrument_item, const IDetector& detector)
 {
     if (const auto* det = dynamic_cast<const SphericalDetector*>(&detector)) {
         auto* item = instrument_item->setDetectorType<SphericalDetectorItem>();
@@ -408,8 +368,7 @@ void setDetectorGeometry(Instrument2DItem* instrument_item,
     }
 }
 
-void setDetectorResolution(DetectorItem* detector_item,
-                                                     const IDetector& detector)
+void setDetectorResolution(DetectorItem* detector_item, const IDetector& detector)
 {
     const IDetectorResolution* p_resfunc = detector.detectorResolution();
 
@@ -434,8 +393,7 @@ void setDetectorResolution(DetectorItem* detector_item,
     }
 }
 
-void setPolarizerAnalyzer(Instrument2DItem* instrument_item,
-                                                    const ISimulation2D& simulation)
+void setPolarizerAnalyzer(Instrument2DItem* instrument_item, const ISimulation2D& simulation)
 {
     instrument_item->setPolarization(simulation.beam().polVector());
 
@@ -451,8 +409,7 @@ void setPolarizerAnalyzer(Instrument2DItem* instrument_item,
     instrument_item->setAnalyzerTotalTransmission(total_transmission);
 }
 
-void updateDetector(Instrument2DItem* instrument_item,
-                                              const ISimulation2D& simulation)
+void updateDetector(Instrument2DItem* instrument_item, const ISimulation2D& simulation)
 {
     const IDetector& detector = simulation.detector();
     setDetectorGeometry(instrument_item, detector);
@@ -464,8 +421,7 @@ void updateDetector(Instrument2DItem* instrument_item,
     setPolarizerAnalyzer(instrument_item, simulation);
 }
 
-void setBackground(InstrumentItem* instrument_item,
-                                             const ISimulation& simulation)
+void setBackground(InstrumentItem* instrument_item, const ISimulation& simulation)
 {
     const auto* p_bg = simulation.background();
     if (const auto* p_constant_bg = dynamic_cast<const ConstantBackground*>(p_bg)) {
@@ -476,24 +432,20 @@ void setBackground(InstrumentItem* instrument_item,
         instrument_item->setBackgroundType<PoissonBackgroundItem>();
 }
 
-GISASInstrumentItem* createGISASInstrumentItem(InstrumentCollection* model,
-                                               const ScatteringSimulation& simulation)
+GISASInstrumentItem* createGISASInstrumentItem(const ScatteringSimulation& simulation)
 {
-    auto* result = model->addInstrument<GISASInstrumentItem>();
+    auto* result = new GISASInstrumentItem();
     setGISASBeamItem(result->beamItem(), simulation);
     updateDetector(result, simulation);
-    setBackground(result, simulation);
 
     return result;
 }
 
-OffspecInstrumentItem* createOffspecInstrumentItem(InstrumentCollection* model,
-                                                   const OffspecSimulation& simulation)
+OffspecInstrumentItem* createOffspecInstrumentItem(const OffspecSimulation& simulation)
 {
-    auto* result = model->addInstrument<OffspecInstrumentItem>();
+    auto* result = new OffspecInstrumentItem();
     setOffspecBeamItem(result->beamItem(), simulation);
     updateDetector(result, simulation);
-    setBackground(result, simulation);
 
     const double factor = 1. / Units::deg;
     result->alphaAxis().setNbins(simulation.beamAxis()->size());
@@ -503,12 +455,42 @@ OffspecInstrumentItem* createOffspecInstrumentItem(InstrumentCollection* model,
     return result;
 }
 
-SpecularInstrumentItem* createSpecularInstrumentItem(InstrumentCollection* model,
-                                                     const SpecularSimulation& simulation)
+SpecularInstrumentItem* createSpecularInstrumentItem(const SpecularSimulation& simulation)
 {
-    auto* result = model->addInstrument<SpecularInstrumentItem>();
-    setSpecularBeamItem(result->beamItem(), simulation);
-    setBackground(result, simulation);
+    auto* result = new SpecularInstrumentItem();
+    SpecularBeamItem* beam_item = result->beamItem();
+
+    const Beam& beam = simulation.beam();
+    const ISpecularScan* scan = simulation.scan();
+
+    beam_item->setIntensity(beam.intensity());
+    beam_item->setWavelength(scan->wavelength());
+    beam_item->setInclinationAngle(0.0); // inclination angle is hardcoded
+    beam_item->setAzimuthalAngle(0.0);   // azimuthal angle is hardcoded
+
+    auto* axis_item = beam_item->inclinationAxis();
+    setAxisItem(axis_item, *simulation.coordinateAxis(), 1. / Units::deg);
+
+    setFootprintFactor(simulation.footprintFactor(), beam_item);
+
+    const auto* alphaScan = dynamic_cast<const AlphaScan*>(scan);
+    if (!alphaScan)
+        return result;
+
+    const auto* resolution = alphaScan->wavelengthResolution();
+    if (!resolution->empty()) {
+        double mean = alphaScan->wavelength();
+        double std_dev = resolution->stdDevs(mean, 1).front();
+        addRangedDistributionToItem(beam_item->wavelengthItem(), *resolution->distribution(), mean,
+                                    std_dev);
+    }
+
+    resolution = alphaScan->angleResolution();
+    if (resolution && !resolution->empty()) {
+        double std_dev = resolution->stdDevs(0.0, 1).front();
+        addRangedDistributionToItem(beam_item->inclinationAngleItem(), *resolution->distribution(),
+                                    0.0, std_dev);
+    }
 
     return result;
 }
@@ -518,18 +500,22 @@ SpecularInstrumentItem* createSpecularInstrumentItem(InstrumentCollection* model
 
 InstrumentCollection* GUI::Transform::FromCore::itemizeInstruments(const ISimulation& simulation)
 {
-    auto* result = new InstrumentCollection;
+    InstrumentItem* item;
 
     if (const auto* gisasSimulation = dynamic_cast<const ScatteringSimulation*>(&simulation))
-        createGISASInstrumentItem(result, *gisasSimulation);
+        item = createGISASInstrumentItem(*gisasSimulation);
     else if (const auto* offspecSimulation = dynamic_cast<const OffspecSimulation*>(&simulation))
-        createOffspecInstrumentItem(result, *offspecSimulation);
+        item = createOffspecInstrumentItem(*offspecSimulation);
     else if (const auto* spec_simulation = dynamic_cast<const SpecularSimulation*>(&simulation))
-        createSpecularInstrumentItem(result, *spec_simulation);
+        item = createSpecularInstrumentItem(*spec_simulation);
     else
         ASSERT(0);
 
-    return result;
+    setBackground(item, simulation);
+
+    auto* collection = new InstrumentCollection;
+    collection->emplace_back(item);
+    return collection;
 }
 
 SimulationOptionsItem* GUI::Transform::FromCore::itemizeOptions(const ISimulation& simulation)
diff --git a/GUI/View/Project/PyImportAssistant.cpp b/GUI/View/Project/PyImportAssistant.cpp
index 7880df33de3ae32d5193c519025f1b1a0fa801e4..565bbb0ac0b8475323660c3b2d21024a1b4c4ac8 100644
--- a/GUI/View/Project/PyImportAssistant.cpp
+++ b/GUI/View/Project/PyImportAssistant.cpp
@@ -19,8 +19,8 @@
 #include "Base/Util/Assert.h"
 #include "Base/Util/SysUtils.h"
 #include "GUI/Application/ApplicationSettings.h"
-#include "GUI/Model/FromCore/ItemizeSimulation.h"
 #include "GUI/Model/FromCore/ItemizeSample.h"
+#include "GUI/Model/FromCore/ItemizeSimulation.h"
 #include "GUI/Support/IO/ProjectUtils.h"
 #include "GUI/Util/Path.h"
 #include "GUI/Util/String.h"
diff --git a/Sim/Export/SimulationToPython.cpp b/Sim/Export/SimulationToPython.cpp
index 163a663c26a0d7d604c4f324487c144c5605ae29..451bd43dca132f60c1c7c1f58c400648e5211a79 100644
--- a/Sim/Export/SimulationToPython.cpp
+++ b/Sim/Export/SimulationToPython.cpp
@@ -316,7 +316,7 @@ std::string defineOffspecBeam(const OffspecSimulation& simulation)
 std::string defineSpecularScan(const SpecularSimulation& simulation)
 {
     std::ostringstream result;
-    const ISpecularScan* scan = simulation.dataHandler();
+    const ISpecularScan* scan = simulation.scan();
     if (!scan)
         throw std::runtime_error("Error defineSpecularScan: passed simulation "
                                  "does not contain any scan");
diff --git a/Sim/Scan/AlphaScan.h b/Sim/Scan/AlphaScan.h
index 04674bbd0d65529c94b14f05c87e10c7bebbe5c2..d425eb952f2444675d6643fb706f07f2732d0bff 100644
--- a/Sim/Scan/AlphaScan.h
+++ b/Sim/Scan/AlphaScan.h
@@ -59,13 +59,13 @@ public:
     //! Returns intensity vector corresponding to convolution of given simulation elements
     std::vector<double> createIntensities(const std::vector<SpecularElement>& eles) const override;
 
-    double wavelength() const { return m_wl; }
-
     // TODO: remove these getters after transition to the new resolution machinery is finished
     const ScanResolution* wavelengthResolution() const { return m_wl_resolution.get(); }
     const ScanResolution* angleResolution() const { return m_inc_resolution.get(); }
 #endif // USER_API
 
+    double wavelength() const override { return m_wl; }
+
     //! Sets footprint correction factor
     void setFootprintFactor(const IFootprintFactor* f_factor);
 
diff --git a/Sim/Scan/ISpecularScan.h b/Sim/Scan/ISpecularScan.h
index 048f9ddd5d1ae18a103e35875a5e1c8f2713c8ec..9bf6e37835c092ce3a6ea09283e8dad250bdf87c 100644
--- a/Sim/Scan/ISpecularScan.h
+++ b/Sim/Scan/ISpecularScan.h
@@ -42,6 +42,8 @@ public:
     //! Sets the polarization analyzer characteristics of the detector
     void setAnalyzer(R3 direction, double efficiency, double total_transmission);
 
+    virtual double wavelength() const = 0;
+
 #ifndef SWIG
     PolMatrices polMatrices() const;
 
diff --git a/Sim/Scan/QzScan.cpp b/Sim/Scan/QzScan.cpp
index 7b542b7f160067a79cfb39e364d13025d32340e1..b1bd5719a402b799d8868536e8dc389b3a441e1d 100644
--- a/Sim/Scan/QzScan.cpp
+++ b/Sim/Scan/QzScan.cpp
@@ -22,25 +22,33 @@
 #include "Sim/Scan/ScanResolution.h"
 #include <algorithm>
 
-QzScan::QzScan(std::vector<double> qs_nm)
-    : m_qs(std::make_unique<PointwiseAxis>("qs", std::move(qs_nm)))
+QzScan::QzScan(IAxis* qs_nm)
+    : m_qs(std::move(qs_nm))
     , m_resolution(ScanResolution::scanEmptyResolution())
 {
-    checkInitialization();
+    std::vector<double> axis_values = m_qs->binCenters();
+    if (!std::is_sorted(axis_values.begin(), axis_values.end()))
+        throw std::runtime_error("Error in QzScan::checkInitialization: q-vector values shall "
+                                 "be sorted in ascending order.");
+
+    if (axis_values.front() < 0)
+        throw std::runtime_error("Error in QzScan::checkInitialization: q-vector values are out "
+                                 "of acceptable range.");
+}
+
+QzScan::QzScan(std::vector<double> qs_nm)
+    : QzScan(new PointwiseAxis("qs", std::move(qs_nm)))
+{
 }
 
 QzScan::QzScan(const IAxis& qs_nm)
-    : m_qs(qs_nm.clone())
-    , m_resolution(ScanResolution::scanEmptyResolution())
+    : QzScan(qs_nm.clone())
 {
-    checkInitialization();
 }
 
 QzScan::QzScan(int nbins, double qz_min, double qz_max)
-    : m_qs(std::make_unique<FixedBinAxis>("qs", nbins, qz_min, qz_max))
-    , m_resolution(ScanResolution::scanEmptyResolution())
+    : QzScan(new FixedBinAxis("qs", nbins, qz_min, qz_max))
 {
-    checkInitialization();
 }
 
 QzScan::~QzScan() = default;
@@ -144,18 +152,6 @@ void QzScan::setAbsoluteQResolution(const IRangedDistribution& distr,
     setQResolution(*resolution);
 }
 
-void QzScan::checkInitialization()
-{
-    std::vector<double> axis_values = m_qs->binCenters();
-    if (!std::is_sorted(axis_values.begin(), axis_values.end()))
-        throw std::runtime_error("Error in QzScan::checkInitialization: q-vector values shall "
-                                 "be sorted in ascending order.");
-
-    if (axis_values.front() < 0)
-        throw std::runtime_error("Error in QzScan::checkInitialization: q-vector values are out "
-                                 "of acceptable range.");
-}
-
 std::vector<double> QzScan::generateQzVector() const
 {
     const auto samples = applyQResolution();
diff --git a/Sim/Scan/QzScan.h b/Sim/Scan/QzScan.h
index 236296276a5ccc7d8b61ee1e7d6f7da65fe6551f..90ddfa88424ed33ee24deeaee9c28ca612882684 100644
--- a/Sim/Scan/QzScan.h
+++ b/Sim/Scan/QzScan.h
@@ -41,6 +41,8 @@ public:
 
     const ScanResolution* resolution() const { return m_resolution.get(); }
 
+    double wavelength() const override { return 1.0; } // TODO (ISSUE #303)
+
 #ifndef SWIG
     //! Generates simulation elements for specular simulations
     std::vector<SpecularElement> generateElements() const override;
@@ -87,7 +89,8 @@ public:
     double offset() const { return m_offset; }
 
 private:
-    void checkInitialization();
+    QzScan(IAxis* qs_nm);
+
     std::vector<double> generateQzVector() const;
     std::vector<std::vector<ParameterSample>> applyQResolution() const;
 
diff --git a/Sim/Simulation/SpecularSimulation.cpp b/Sim/Simulation/SpecularSimulation.cpp
index 41c490ff3a416d8b534816a905dd26e586512e1a..7cbbf271b0da89967b018049751e9d71c5de6315 100644
--- a/Sim/Simulation/SpecularSimulation.cpp
+++ b/Sim/Simulation/SpecularSimulation.cpp
@@ -41,10 +41,6 @@ SpecularSimulation::SpecularSimulation(const ISpecularScan& scan, const MultiLay
         throw std::runtime_error("Invalid scan: minimum value on coordinate axis is negative");
 
     detector().addDetAxis(*scan.coordinateAxis());
-
-    // TODO: remove when pointwise resolution is implemented
-    if (const auto* aScan = dynamic_cast<const AlphaScan*>(&scan))
-        beam().setWavelength(aScan->wavelength());
 }
 
 SpecularSimulation::~SpecularSimulation() = default;
diff --git a/Sim/Simulation/SpecularSimulation.h b/Sim/Simulation/SpecularSimulation.h
index 478c6a696a8ed023d6d9340a67aaa6e1f278524b..b1492c09d6732a53856b1edcc0d5028a8552611f 100644
--- a/Sim/Simulation/SpecularSimulation.h
+++ b/Sim/Simulation/SpecularSimulation.h
@@ -56,7 +56,7 @@ public:
 
     ICoordSystem* createCoordSystem() const override;
     //! Returns internal data handler
-    const ISpecularScan* dataHandler() const { return m_scan.get(); }
+    const ISpecularScan* scan() const { return m_scan.get(); }
 
 private:
     SimulationResult pack_result() override;
diff --git a/Tests/Functional/GUI/Check.cpp b/Tests/Functional/GUI/Check.cpp
index 5c0f03613c6212eaa86a0b707129bf7724225503..195816aa72457dac166c6389c4854cf009d68dd7 100644
--- a/Tests/Functional/GUI/Check.cpp
+++ b/Tests/Functional/GUI/Check.cpp
@@ -19,8 +19,8 @@
 #include "Device/Histo/IOFactory.h"
 #include "Device/Histo/SimulationResult.h"
 #include "GUI/Model/Device/InstrumentCollection.h"
-#include "GUI/Model/FromCore/ItemizeSimulation.h"
 #include "GUI/Model/FromCore/ItemizeSample.h"
+#include "GUI/Model/FromCore/ItemizeSimulation.h"
 #include "GUI/Model/Sample/MultiLayerItem.h"
 #include "GUI/Model/ToCore/SimulationToCore.h"
 #include "GUI/Support/Data/SimulationOptionsItem.h"
diff --git a/auto/Wrap/doxygenSim.i b/auto/Wrap/doxygenSim.i
index 7a758fa62b03287bbf3c92b9ea08c7ce0ed9b878..0b3377aa144ed9afad153790a52f8ff2183f0bed 100644
--- a/auto/Wrap/doxygenSim.i
+++ b/auto/Wrap/doxygenSim.i
@@ -59,15 +59,15 @@ Returns the number of simulation elements.
 Returns intensity vector corresponding to convolution of given simulation elements. 
 ";
 
-%feature("docstring")  AlphaScan::wavelength "double AlphaScan::wavelength() const
-";
-
 %feature("docstring")  AlphaScan::wavelengthResolution "const ScanResolution* AlphaScan::wavelengthResolution() const
 ";
 
 %feature("docstring")  AlphaScan::angleResolution "const ScanResolution* AlphaScan::angleResolution() const
 ";
 
+%feature("docstring")  AlphaScan::wavelength "double AlphaScan::wavelength() const override
+";
+
 %feature("docstring")  AlphaScan::setFootprintFactor "void AlphaScan::setFootprintFactor(const IFootprintFactor *f_factor)
 
 Sets footprint correction factor. 
@@ -1062,6 +1062,9 @@ Sets the polarization density matrix according to the given Bloch vector.
 Sets the polarization analyzer characteristics of the detector. 
 ";
 
+%feature("docstring")  ISpecularScan::wavelength "virtual double ISpecularScan::wavelength() const =0
+";
+
 %feature("docstring")  ISpecularScan::polMatrices "PolMatrices ISpecularScan::polMatrices() const
 ";
 
@@ -1533,6 +1536,9 @@ Sets q-defined specular scan. Accepts either numpy array of q-values sorted in a
 %feature("docstring")  QzScan::resolution "const ScanResolution* QzScan::resolution() const
 ";
 
+%feature("docstring")  QzScan::wavelength "double QzScan::wavelength() const override
+";
+
 %feature("docstring")  QzScan::generateElements "std::vector< SpecularElement > QzScan::generateElements() const override
 
 Generates simulation elements for specular simulations. 
@@ -1960,7 +1966,7 @@ Put into a clean state for running a simulation.
 %feature("docstring")  SpecularSimulation::createCoordSystem "ICoordSystem * SpecularSimulation::createCoordSystem() const override
 ";
 
-%feature("docstring")  SpecularSimulation::dataHandler "const ISpecularScan* SpecularSimulation::dataHandler() const
+%feature("docstring")  SpecularSimulation::scan "const ISpecularScan* SpecularSimulation::scan() const
 
 Returns internal data handler. 
 ";
diff --git a/auto/Wrap/libBornAgainSim.py b/auto/Wrap/libBornAgainSim.py
index 7469d19f374c817a29dc9c695c6865012e67e114..591783f39e44e671be74e08fd47116ea5a6df039 100644
--- a/auto/Wrap/libBornAgainSim.py
+++ b/auto/Wrap/libBornAgainSim.py
@@ -3116,6 +3116,14 @@ class ISpecularScan(libBornAgainBase.ICloneable):
         """
         return _libBornAgainSim.ISpecularScan_setAnalyzer(self, direction, efficiency, total_transmission)
 
+    def wavelength(self):
+        r"""
+        wavelength(ISpecularScan self) -> double
+        virtual double ISpecularScan::wavelength() const =0
+
+        """
+        return _libBornAgainSim.ISpecularScan_wavelength(self)
+
 # Register ISpecularScan in _libBornAgainSim:
 _libBornAgainSim.ISpecularScan_swigregister(ISpecularScan)
 
@@ -3153,6 +3161,14 @@ class AlphaScan(ISpecularScan):
         """
         return _libBornAgainSim.AlphaScan_clone(self)
 
+    def wavelength(self):
+        r"""
+        wavelength(AlphaScan self) -> double
+        double AlphaScan::wavelength() const override
+
+        """
+        return _libBornAgainSim.AlphaScan_wavelength(self)
+
     def setFootprintFactor(self, f_factor):
         r"""
         setFootprintFactor(AlphaScan self, IFootprintFactor const * f_factor)
@@ -3272,6 +3288,14 @@ class QzScan(ISpecularScan):
         """
         return _libBornAgainSim.QzScan_resolution(self)
 
+    def wavelength(self):
+        r"""
+        wavelength(QzScan self) -> double
+        double QzScan::wavelength() const override
+
+        """
+        return _libBornAgainSim.QzScan_wavelength(self)
+
     def setQResolution(self, resolution):
         r"""
         setQResolution(QzScan self, ScanResolution resolution)
diff --git a/auto/Wrap/libBornAgainSim_wrap.cpp b/auto/Wrap/libBornAgainSim_wrap.cpp
index b9755dd2be9bcdfd83fcb0a4772e60e29e967a6f..711dabf258859b08482809833f29fe45c78e7fc7 100644
--- a/auto/Wrap/libBornAgainSim_wrap.cpp
+++ b/auto/Wrap/libBornAgainSim_wrap.cpp
@@ -35535,6 +35535,29 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_ISpecularScan_wavelength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISpecularScan *arg1 = (ISpecularScan *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  double result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ISpecularScan, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISpecularScan_wavelength" "', argument " "1"" of type '" "ISpecularScan const *""'"); 
+  }
+  arg1 = reinterpret_cast< ISpecularScan * >(argp1);
+  result = (double)((ISpecularScan const *)arg1)->wavelength();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *ISpecularScan_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
@@ -35770,6 +35793,29 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_AlphaScan_wavelength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AlphaScan *arg1 = (AlphaScan *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  double result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_AlphaScan, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AlphaScan_wavelength" "', argument " "1"" of type '" "AlphaScan const *""'"); 
+  }
+  arg1 = reinterpret_cast< AlphaScan * >(argp1);
+  result = (double)((AlphaScan const *)arg1)->wavelength();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_AlphaScan_setFootprintFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   AlphaScan *arg1 = (AlphaScan *) 0 ;
@@ -36639,6 +36685,29 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_QzScan_wavelength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  QzScan *arg1 = (QzScan *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  double result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_QzScan, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "QzScan_wavelength" "', argument " "1"" of type '" "QzScan const *""'"); 
+  }
+  arg1 = reinterpret_cast< QzScan * >(argp1);
+  result = (double)((QzScan const *)arg1)->wavelength();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_QzScan_setQResolution(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   QzScan *arg1 = (QzScan *) 0 ;
@@ -41992,6 +42061,11 @@ static PyMethodDef SwigMethods[] = {
 		"Sets the polarization analyzer characteristics of the detector. \n"
 		"\n"
 		""},
+	 { "ISpecularScan_wavelength", _wrap_ISpecularScan_wavelength, METH_O, "\n"
+		"ISpecularScan_wavelength(ISpecularScan self) -> double\n"
+		"virtual double ISpecularScan::wavelength() const =0\n"
+		"\n"
+		""},
 	 { "ISpecularScan_swigregister", ISpecularScan_swigregister, METH_O, NULL},
 	 { "new_AlphaScan", _wrap_new_AlphaScan, METH_VARARGS, "\n"
 		"AlphaScan(double wl, vdouble1d_t inc_angle)\n"
@@ -42012,6 +42086,11 @@ static PyMethodDef SwigMethods[] = {
 		"AlphaScan * AlphaScan::clone() const override\n"
 		"\n"
 		""},
+	 { "AlphaScan_wavelength", _wrap_AlphaScan_wavelength, METH_O, "\n"
+		"AlphaScan_wavelength(AlphaScan self) -> double\n"
+		"double AlphaScan::wavelength() const override\n"
+		"\n"
+		""},
 	 { "AlphaScan_setFootprintFactor", _wrap_AlphaScan_setFootprintFactor, METH_VARARGS, "\n"
 		"AlphaScan_setFootprintFactor(AlphaScan self, IFootprintFactor const * f_factor)\n"
 		"void AlphaScan::setFootprintFactor(const IFootprintFactor *f_factor)\n"
@@ -42091,6 +42170,11 @@ static PyMethodDef SwigMethods[] = {
 		"const ScanResolution* QzScan::resolution() const\n"
 		"\n"
 		""},
+	 { "QzScan_wavelength", _wrap_QzScan_wavelength, METH_O, "\n"
+		"QzScan_wavelength(QzScan self) -> double\n"
+		"double QzScan::wavelength() const override\n"
+		"\n"
+		""},
 	 { "QzScan_setQResolution", _wrap_QzScan_setQResolution, METH_VARARGS, "\n"
 		"QzScan_setQResolution(QzScan self, ScanResolution resolution)\n"
 		"void QzScan::setQResolution(const ScanResolution &resolution)\n"