diff --git a/GUI/Model/Beam/SourceItems.cpp b/GUI/Model/Beam/SourceItems.cpp
index b764ccbd39adbc3c1a2553cd882e2af83f4049c8..b90b0760095a7cc4c5a89f0814cbc2e304d272e0 100644
--- a/GUI/Model/Beam/SourceItems.cpp
+++ b/GUI/Model/Beam/SourceItems.cpp
@@ -284,7 +284,7 @@ ScanItem::ScanItem()
     m_wavelengthItem.reset(new BeamWavelengthItem);
 }
 
-void ScanItem::setScan(const IBeamScan* scan)
+void ScanItem::setScan(const BeamScan* scan)
 {
     setIntensity(scan->intensity());
     if (const auto* s = dynamic_cast<const AlphaScan*>(scan))
diff --git a/GUI/Model/Beam/SourceItems.h b/GUI/Model/Beam/SourceItems.h
index 4c37f950aa68552da00c73fd4e131b8e7bb29a57..57a77f19d6509b2332c0c97535a6a0910c61b381 100644
--- a/GUI/Model/Beam/SourceItems.h
+++ b/GUI/Model/Beam/SourceItems.h
@@ -25,11 +25,11 @@ class BasicAxisItem;
 class Beam;
 class BeamAzimuthalAngleItem;
 class BeamDistributionItem;
+class BeamScan;
 class BeamWavelengthItem;
 class FootprintItem;
-class GrazingScanItem;
-class IBeamScan;
 class Frame;
+class GrazingScanItem;
 class IFootprint;
 class Scale;
 
@@ -97,7 +97,7 @@ class ScanItem : public SourceItem {
 public:
     explicit ScanItem();
 
-    void setScan(const IBeamScan* scan);
+    void setScan(const BeamScan* scan);
 
     void writeTo(QXmlStreamWriter* w) const;
     void readFrom(QXmlStreamReader* r);
diff --git a/GUI/Model/Device/InstrumentItems.cpp b/GUI/Model/Device/InstrumentItems.cpp
index c8bfa60f486b4cc2cbd23cf6247f14ccd4576251..4f7ee06c32f10263ef6c4bf007730fb56ca10f28 100644
--- a/GUI/Model/Device/InstrumentItems.cpp
+++ b/GUI/Model/Device/InstrumentItems.cpp
@@ -283,7 +283,7 @@ ScanningFunctionality::ScanningFunctionality(double intensity)
 }
 
 //! Takes ownership of argument 'axis'.
-std::unique_ptr<IBeamScan> ScanningFunctionality::createScan(const Scale& axis) const
+std::unique_ptr<BeamScan> ScanningFunctionality::createScan(const Scale& axis) const
 {
     auto result = std::make_unique<AlphaScan>(axis);
 
@@ -425,7 +425,7 @@ Frame SpecularInstrumentItem::makeFrame() const
 ISimulation* SpecularInstrumentItem::createSimulation(const MultiLayer& sample) const
 {
     const Frame frame = makeFrame();
-    std::unique_ptr<IBeamScan> scan = createScan(frame.axis(0));
+    std::unique_ptr<BeamScan> scan = createScan(frame.axis(0));
     if (withPolarizer())
         scan->setPolarization(m_polarizerBlochVector);
     if (withAnalyzer())
@@ -515,7 +515,7 @@ Frame DepthprobeInstrumentItem::makeFrame() const
 ISimulation* DepthprobeInstrumentItem::createSimulation(const MultiLayer& sample) const
 {
     const Frame frame = makeFrame();
-    std::unique_ptr<IBeamScan> scan = createScan(frame.axis(0));
+    std::unique_ptr<BeamScan> scan = createScan(frame.axis(0));
     return new DepthprobeSimulation(*scan, sample, frame.axis(1));
 }
 
@@ -610,7 +610,7 @@ ISimulation* OffspecInstrumentItem::createSimulation(const MultiLayer& sample) c
     const Frame frame = makeFrame();
     const auto detector = detectorItem()->createOffspecDetector();
     detector->setAnalyzer(m_analyzerBlochVector);
-    std::unique_ptr<IBeamScan> scan = createScan(frame.axis(0));
+    std::unique_ptr<BeamScan> scan = createScan(frame.axis(0));
     if (withPolarizer())
         scan->setPolarization(m_polarizerBlochVector);
     if (withAnalyzer())
diff --git a/GUI/Model/Device/InstrumentItems.h b/GUI/Model/Device/InstrumentItems.h
index 2ad1fa776ee0ae6661b7968d44c845369c5787de..db29c534dd6116dfb8090fd346fdfba815a720b7 100644
--- a/GUI/Model/Device/InstrumentItems.h
+++ b/GUI/Model/Device/InstrumentItems.h
@@ -26,10 +26,10 @@
 
 class BackgroundItem;
 class BeamItem;
+class BeamScan;
 class DataItem;
 class DepthprobeSimulation;
 class Frame;
-class IBeamScan;
 class ISimulation;
 class MaskContainerItem;
 class MultiLayer;
@@ -139,7 +139,7 @@ public:
     ScanningFunctionality(double intensity);
     ScanItem* scanItem() const { return m_scanItem.get(); }
 
-    std::unique_ptr<IBeamScan> createScan(const Scale& axis) const;
+    std::unique_ptr<BeamScan> createScan(const Scale& axis) const;
 
     void writeScanTo(QXmlStreamWriter* w) const;
     void readScanFrom(QXmlStreamReader* r);
diff --git a/GUI/Model/FromCore/ItemizeSimulation.cpp b/GUI/Model/FromCore/ItemizeSimulation.cpp
index 0844118351acca1316eb8d1906f552c5dd06c594..b5d55549929527c1ba9682b6f35a04512f1b738d 100644
--- a/GUI/Model/FromCore/ItemizeSimulation.cpp
+++ b/GUI/Model/FromCore/ItemizeSimulation.cpp
@@ -331,7 +331,7 @@ OffspecInstrumentItem* createOffspecInstrumentItem(const OffspecSimulation& simu
 {
     auto* result = new OffspecInstrumentItem();
 
-    const IBeamScan* scan = simulation.scan();
+    const BeamScan* scan = simulation.scan();
     result->scanItem()->setScan(scan);
 
     const OffspecDetector& detector = simulation.detector();
@@ -360,7 +360,7 @@ SpecularInstrumentItem* createSpecularInstrumentItem(const SpecularSimulation& s
 {
     auto* result = new SpecularInstrumentItem();
 
-    const IBeamScan* scan = simulation.scan();
+    const BeamScan* scan = simulation.scan();
     result->scanItem()->setScan(scan);
 
     if (const auto* s2 = dynamic_cast<const AlphaScan*>(scan)) {
diff --git a/Sim/Export/SimulationToPython.cpp b/Sim/Export/SimulationToPython.cpp
index c9573ff0436f190d36efe0a88a71d30c6f68adf9..4992683fd454070d85e9547ef42d3f63ab799ae7 100644
--- a/Sim/Export/SimulationToPython.cpp
+++ b/Sim/Export/SimulationToPython.cpp
@@ -219,7 +219,7 @@ std::string defineGISASBeam(const ScatteringSimulation& simulation)
     return result.str();
 }
 
-std::string defineBeamScan(const IBeamScan& scan)
+std::string defineBeamScan(const BeamScan& scan)
 {
     std::ostringstream result;
     if (const auto* s = dynamic_cast<const AlphaScan*>(&scan))
diff --git a/Sim/Scan/AlphaScan.cpp b/Sim/Scan/AlphaScan.cpp
index ec14f22f89248ee8004c1bff97e49528b6344b10..a040918b948a2add56161a4c24568ee0dd8db4e9 100644
--- a/Sim/Scan/AlphaScan.cpp
+++ b/Sim/Scan/AlphaScan.cpp
@@ -44,7 +44,7 @@ std::vector<ParameterSample> drawDistribution(const IDistribution1D* distrib)
 
 
 AlphaScan::AlphaScan(const Scale& alpha_axis)
-    : IBeamScan(alpha_axis.clone())
+    : BeamScan(alpha_axis.clone())
 {
     checkInitialization();
 }
@@ -82,7 +82,7 @@ AlphaScan* AlphaScan::clone() const
 std::vector<const INode*> AlphaScan::nodeChildren() const
 {
     std::vector<const INode*> result;
-    for (const INode* n : IBeamScan::nodeChildren())
+    for (const INode* n : BeamScan::nodeChildren())
         result << n;
     if (m_lambda_distrib)
         result << m_lambda_distrib.get();
diff --git a/Sim/Scan/AlphaScan.h b/Sim/Scan/AlphaScan.h
index e8f37c2f05955da35571b203b4b895adc2f13e23..369162ae9ab91ead631014830d03043d9def169a 100644
--- a/Sim/Scan/AlphaScan.h
+++ b/Sim/Scan/AlphaScan.h
@@ -15,7 +15,7 @@
 #ifndef BORNAGAIN_SIM_SCAN_ALPHASCAN_H
 #define BORNAGAIN_SIM_SCAN_ALPHASCAN_H
 
-#include "Sim/Scan/IBeamScan.h"
+#include "Sim/Scan/BeamScan.h"
 #include <memory>
 
 struct ParameterSample;
@@ -23,7 +23,7 @@ class IDistribution1D;
 
 //! Scan type with inclination angles as coordinate values and a unique wavelength.
 //! Features footprint correction.
-class AlphaScan : public IBeamScan {
+class AlphaScan : public BeamScan {
 public:
     AlphaScan(const Scale& alpha_axis);
     AlphaScan(int nbins, double alpha_i_min, double alpha_i_max);
diff --git a/Sim/Scan/IBeamScan.cpp b/Sim/Scan/BeamScan.cpp
similarity index 69%
rename from Sim/Scan/IBeamScan.cpp
rename to Sim/Scan/BeamScan.cpp
index 44cab9fd936dbd42179002123a68c90be28a90c3..fd5dee2b60af9a396af8e6c8f4f513722e4a4a83 100644
--- a/Sim/Scan/IBeamScan.cpp
+++ b/Sim/Scan/BeamScan.cpp
@@ -2,8 +2,8 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      Sim/Scan/IBeamScan.cpp
-//! @brief     Implements interface IBeamScan.
+//! @file      Sim/Scan/BeamScan.cpp
+//! @brief     Implements interface BeamScan.
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -12,7 +12,7 @@
 //
 //  ************************************************************************************************
 
-#include "Sim/Scan/IBeamScan.h"
+#include "Sim/Scan/BeamScan.h"
 #include "Base/Axis/Frame.h"
 #include "Base/Axis/Scale.h"
 #include "Base/Spin/SpinMatrix.h"
@@ -22,14 +22,14 @@
 #include <numbers>
 using std::numbers::pi;
 
-IBeamScan::IBeamScan(Scale* axis)
+BeamScan::BeamScan(Scale* axis)
     : m_axis(axis)
 {
 }
 
-IBeamScan::~IBeamScan() = default;
+BeamScan::~BeamScan() = default;
 
-std::vector<const INode*> IBeamScan::nodeChildren() const
+std::vector<const INode*> BeamScan::nodeChildren() const
 {
     std::vector<const INode*> result;
     if (m_footprint)
@@ -39,22 +39,22 @@ std::vector<const INode*> IBeamScan::nodeChildren() const
     return result;
 }
 
-void IBeamScan::setIntensity(double intensity)
+void BeamScan::setIntensity(double intensity)
 {
     m_intensity = intensity;
 }
 
-void IBeamScan::setPolarization(R3 bloch_vector)
+void BeamScan::setPolarization(R3 bloch_vector)
 {
     m_beamPolarization.reset(new R3(bloch_vector));
 }
 
-void IBeamScan::setAnalyzer(R3 Bloch_vector, double mean_transmission)
+void BeamScan::setAnalyzer(R3 Bloch_vector, double mean_transmission)
 {
     m_polAnalyzer.reset(new PolFilter(Bloch_vector, mean_transmission));
 }
 
-void IBeamScan::setAnalyzer(R3 direction, double efficiency, double mean_transmission)
+void BeamScan::setAnalyzer(R3 direction, double efficiency, double mean_transmission)
 {
     std::cout
         << "Function setAnalyzer(direction, efficiency, transmission) is obsolete since "
@@ -63,43 +63,43 @@ void IBeamScan::setAnalyzer(R3 direction, double efficiency, double mean_transmi
     setAnalyzer(direction * efficiency, mean_transmission);
 }
 
-void IBeamScan::setFootprint(const IFootprint* footprint)
+void BeamScan::setFootprint(const IFootprint* footprint)
 {
     m_footprint.reset(footprint ? footprint->clone() : nullptr);
 }
 
-double IBeamScan::wavelength(size_t i) const
+double BeamScan::wavelength(size_t i) const
 {
     return 2 * pi / wavenumber(i);
 }
 
-const R3 IBeamScan::polVector() const
+const R3 BeamScan::polVector() const
 {
     return m_beamPolarization ? *m_beamPolarization.get() : R3();
 }
 
-size_t IBeamScan::nScan() const
+size_t BeamScan::nScan() const
 {
     return m_axis->size();
 }
 
-bool IBeamScan::polarized() const
+bool BeamScan::polarized() const
 {
     return m_beamPolarization || m_polAnalyzer;
 }
 
-SpinMatrix IBeamScan::polarizerMatrix() const
+SpinMatrix BeamScan::polarizerMatrix() const
 {
     return m_beamPolarization ? SpinMatrix::FromBlochVector(*m_beamPolarization)
                               : SpinMatrix::One() / 2.;
 }
 
-SpinMatrix IBeamScan::analyzerMatrix() const
+SpinMatrix BeamScan::analyzerMatrix() const
 {
     return m_polAnalyzer ? m_polAnalyzer->matrix() : SpinMatrix::One();
 }
 
-Frame IBeamScan::scanCoordSystem() const
+Frame BeamScan::scanCoordSystem() const
 {
     return Frame(coordinateAxis()->clone());
 }
diff --git a/Sim/Scan/IBeamScan.h b/Sim/Scan/BeamScan.h
similarity index 93%
rename from Sim/Scan/IBeamScan.h
rename to Sim/Scan/BeamScan.h
index 398437f17d82a446a32d1b19e78fd31f2acbdc57..0a22ab4cb76c8cacdc9f21e091e1f3e5d50ad20e 100644
--- a/Sim/Scan/IBeamScan.h
+++ b/Sim/Scan/BeamScan.h
@@ -2,8 +2,8 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      Sim/Scan/IBeamScan.h
-//! @brief     Declares interface IBeamScan.
+//! @file      Sim/Scan/BeamScan.h
+//! @brief     Declares interface BeamScan.
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -33,12 +33,12 @@ class SpinMatrix;
 
 //! Abstract base class for all types of specular scans.
 
-class IBeamScan : public ICloneable, public INode {
+class BeamScan : public ICloneable, public INode {
 public:
-    IBeamScan(Scale* axis);
-    ~IBeamScan() override;
+    BeamScan(Scale* axis);
+    ~BeamScan() override;
 
-    IBeamScan* clone() const override = 0;
+    BeamScan* clone() const override = 0;
     std::vector<const INode*> nodeChildren() const override;
 
     //! Sets the intensity fudge factor
diff --git a/Sim/Scan/LambdaScan.cpp b/Sim/Scan/LambdaScan.cpp
index c89de389cb4a313210ece4d78dea2cafb23a09ef..7af578acf58795c37cc75e975dd01f8a45fec2df 100644
--- a/Sim/Scan/LambdaScan.cpp
+++ b/Sim/Scan/LambdaScan.cpp
@@ -27,7 +27,7 @@
 using std::numbers::pi;
 
 LambdaScan::LambdaScan(double alpha_i, Scale* lambdaScale)
-    : IBeamScan(lambdaScale)
+    : BeamScan(lambdaScale)
     , m_alpha_i(alpha_i)
 {
     std::vector<double> axis_values = m_axis->binCenters();
@@ -73,7 +73,7 @@ LambdaScan* LambdaScan::clone() const
 std::vector<const INode*> LambdaScan::nodeChildren() const
 {
     std::vector<const INode*> result;
-    for (const INode* n : IBeamScan::nodeChildren())
+    for (const INode* n : BeamScan::nodeChildren())
         result << n;
     return result;
 }
diff --git a/Sim/Scan/LambdaScan.h b/Sim/Scan/LambdaScan.h
index efe473d41f6ff24a76bb5a84857fabc72affdd46..d096344ec769d4470af43ccdc8c4ba48f8188bc0 100644
--- a/Sim/Scan/LambdaScan.h
+++ b/Sim/Scan/LambdaScan.h
@@ -15,7 +15,7 @@
 #ifndef BORNAGAIN_SIM_SCAN_LAMBDASCAN_H
 #define BORNAGAIN_SIM_SCAN_LAMBDASCAN_H
 
-#include "Sim/Scan/IBeamScan.h"
+#include "Sim/Scan/BeamScan.h"
 #include <memory>
 
 class IDistribution1D;
@@ -23,7 +23,7 @@ class IDistribution1D;
 //! Scan type with z-components of scattering vector as coordinate values.
 //! Wavelength and incident angles are not accessible separately.
 
-class LambdaScan : public IBeamScan {
+class LambdaScan : public BeamScan {
 public:
     LambdaScan(double alpha_i, std::vector<double> lambdaScale);
     LambdaScan(double alpha_i, const Scale& lambdaScale);
diff --git a/Sim/Scan/QzScan.cpp b/Sim/Scan/QzScan.cpp
index f25de46f2ca645697830287f7992fdd8b182b459..c37a788f09aaa25dc65fa0713d7626330bd3b181 100644
--- a/Sim/Scan/QzScan.cpp
+++ b/Sim/Scan/QzScan.cpp
@@ -24,7 +24,7 @@
 #include <algorithm> // is_sorted
 
 QzScan::QzScan(Scale* qs_nm)
-    : IBeamScan(qs_nm)
+    : BeamScan(qs_nm)
 {
     std::vector<double> axis_values = m_axis->binCenters();
     if (!std::is_sorted(axis_values.begin(), axis_values.end()))
@@ -74,7 +74,7 @@ QzScan* QzScan::clone() const
 std::vector<const INode*> QzScan::nodeChildren() const
 {
     std::vector<const INode*> result;
-    for (const INode* n : IBeamScan::nodeChildren())
+    for (const INode* n : BeamScan::nodeChildren())
         result << n;
     if (m_qz_distrib)
         result << m_qz_distrib.get();
diff --git a/Sim/Scan/QzScan.h b/Sim/Scan/QzScan.h
index 1cc1c5e4f81cccc6b527937f423de9468d5dafb8..8032fe5752260efb0bdbae44ebbccd9b8085b6dc 100644
--- a/Sim/Scan/QzScan.h
+++ b/Sim/Scan/QzScan.h
@@ -15,7 +15,7 @@
 #ifndef BORNAGAIN_SIM_SCAN_QZSCAN_H
 #define BORNAGAIN_SIM_SCAN_QZSCAN_H
 
-#include "Sim/Scan/IBeamScan.h"
+#include "Sim/Scan/BeamScan.h"
 #include <memory>
 
 class IDistribution1D;
@@ -23,7 +23,7 @@ class IDistribution1D;
 //! Scan type with z-components of scattering vector as coordinate values.
 //! Wavelength and incident angles are not accessible separately.
 
-class QzScan : public IBeamScan {
+class QzScan : public BeamScan {
 public:
     //! Accepts qz-value vector (in inverse nm)
     QzScan(std::vector<double> qs_nm);
diff --git a/Sim/Simulation/DepthprobeSimulation.cpp b/Sim/Simulation/DepthprobeSimulation.cpp
index 1ad553b42f61cba2ca39b378379d5e248221287a..e24a6a81ec280c9f1bc5688d939c0a0be1e02d2c 100644
--- a/Sim/Simulation/DepthprobeSimulation.cpp
+++ b/Sim/Simulation/DepthprobeSimulation.cpp
@@ -38,7 +38,7 @@ const int WaveProperty_Intensity = 0;
 const int WaveProperty_Modulus = 4;
 const int WaveProperty_Phase = 8;
 
-DepthprobeSimulation::DepthprobeSimulation(const IBeamScan& scan, const MultiLayer& sample,
+DepthprobeSimulation::DepthprobeSimulation(const BeamScan& scan, const MultiLayer& sample,
                                            const Scale& zaxis, int flags)
     : ISimulation(sample)
     , m_scan(dynamic_cast<AlphaScan*>(scan.clone()))
diff --git a/Sim/Simulation/DepthprobeSimulation.h b/Sim/Simulation/DepthprobeSimulation.h
index 8ea2e761a5a0a17bc5d4fa14da2cfed068696247..2090e7b065332fd926bce8e1514c254589ecbd41 100644
--- a/Sim/Simulation/DepthprobeSimulation.h
+++ b/Sim/Simulation/DepthprobeSimulation.h
@@ -18,9 +18,9 @@
 #include "Sim/Simulation/ISimulation.h"
 
 class AlphaScan;
-class Scale;
-class IBeamScan;
+class BeamScan;
 class IFootprint;
+class Scale;
 
 extern const int ZDirection_None;
 extern const int ZDirection_Reflected;
@@ -38,7 +38,7 @@ extern const int WaveProperty_Phase;
 
 class DepthprobeSimulation : public ISimulation {
 public:
-    DepthprobeSimulation(const IBeamScan& scan, const MultiLayer& sample, const Scale& zaxis,
+    DepthprobeSimulation(const BeamScan& scan, const MultiLayer& sample, const Scale& zaxis,
                          int flags = 0);
     ~DepthprobeSimulation() override;
 
diff --git a/Sim/Simulation/OffspecSimulation.cpp b/Sim/Simulation/OffspecSimulation.cpp
index c117f01c9dfb323d1eaa80759b53107baa2ec887..673e65e47d9fe9e0b23a12005807afd392316bb4 100644
--- a/Sim/Simulation/OffspecSimulation.cpp
+++ b/Sim/Simulation/OffspecSimulation.cpp
@@ -26,9 +26,9 @@
 #include "Resample/Element/DiffuseElement.h"
 #include "Sim/Background/IBackground.h"
 #include "Sim/Computation/DWBAComputation.h"
-#include "Sim/Scan/IBeamScan.h"
+#include "Sim/Scan/BeamScan.h"
 
-OffspecSimulation::OffspecSimulation(const IBeamScan& scan, const MultiLayer& sample,
+OffspecSimulation::OffspecSimulation(const BeamScan& scan, const MultiLayer& sample,
                                      const OffspecDetector& detector)
     : ISimulation(sample)
     , m_scan(scan.clone())
diff --git a/Sim/Simulation/OffspecSimulation.h b/Sim/Simulation/OffspecSimulation.h
index 37dca582d5951ff896aa94c0691ed621ed9cef16..1746aa694d875d8fe3cf8707fa4b481e5d98007c 100644
--- a/Sim/Simulation/OffspecSimulation.h
+++ b/Sim/Simulation/OffspecSimulation.h
@@ -18,8 +18,8 @@
 #include "Base/Types/OwningVector.h"
 #include "Sim/Simulation/ISimulation.h"
 
+class BeamScan;
 class Datafield;
-class IBeamScan;
 class IPixel;
 class OffspecDetector;
 
@@ -30,7 +30,7 @@ class OffspecDetector;
 
 class OffspecSimulation : public ISimulation {
 public:
-    OffspecSimulation(const IBeamScan& scan, const MultiLayer& sample,
+    OffspecSimulation(const BeamScan& scan, const MultiLayer& sample,
                       const OffspecDetector& detector);
     ~OffspecSimulation() override;
 
@@ -41,7 +41,7 @@ public:
 
     std::vector<const INode*> nodeChildren() const override;
 
-    const IBeamScan* scan() const
+    const BeamScan* scan() const
     {
         return m_scan.get();
     }
@@ -66,7 +66,7 @@ private:
     Datafield packResult() override;
 
     //... Model components:
-    std::unique_ptr<IBeamScan> m_scan;
+    std::unique_ptr<BeamScan> m_scan;
     std::unique_ptr<OffspecDetector> m_detector;
 
     //... Caches:
diff --git a/Sim/Simulation/SpecularSimulation.cpp b/Sim/Simulation/SpecularSimulation.cpp
index 74bac33fdb5ccb1da3f17b8f1ebead48181b0660..d96f8985ac8f3f00caba8b3ca926af39e40b9c98 100644
--- a/Sim/Simulation/SpecularSimulation.cpp
+++ b/Sim/Simulation/SpecularSimulation.cpp
@@ -29,7 +29,7 @@
 #include "Sim/Computation/SpecularComputation.h"
 #include "Sim/Scan/AlphaScan.h"
 
-SpecularSimulation::SpecularSimulation(const IBeamScan& scan, const MultiLayer& sample)
+SpecularSimulation::SpecularSimulation(const BeamScan& scan, const MultiLayer& sample)
     : ISimulation(sample)
     , m_scan(scan.clone())
 {
diff --git a/Sim/Simulation/SpecularSimulation.h b/Sim/Simulation/SpecularSimulation.h
index c0bb1cb7b418f7783b934d623d728df2d632feea..f249d3967abb8b4bb6cb9448abf0a930436c6dac 100644
--- a/Sim/Simulation/SpecularSimulation.h
+++ b/Sim/Simulation/SpecularSimulation.h
@@ -17,7 +17,7 @@
 
 #include "Sim/Simulation/ISimulation.h"
 
-class IBeamScan;
+class BeamScan;
 class SpecularElement;
 
 //! Specular reflectometry simulation.
@@ -27,7 +27,7 @@ class SpecularElement;
 
 class SpecularSimulation : public ISimulation {
 public:
-    SpecularSimulation(const IBeamScan& scan, const MultiLayer& sample);
+    SpecularSimulation(const BeamScan& scan, const MultiLayer& sample);
     ~SpecularSimulation() override;
 
     std::string className() const final { return "SpecularSimulation"; }
@@ -35,7 +35,7 @@ public:
 #ifndef SWIG
     Frame simCoordSystem() const override;
     //! Returns internal data handler
-    const IBeamScan* scan() const
+    const BeamScan* scan() const
     {
         return m_scan.get();
     }
@@ -55,7 +55,7 @@ private:
     Datafield packResult() override;
 
     //... Model components:
-    std::unique_ptr<const IBeamScan> m_scan;
+    std::unique_ptr<const BeamScan> m_scan;
 
     //... Caches:
     std::vector<SpecularElement> m_eles;
diff --git a/Tests/SimFactory/MakeSimulations.cpp b/Tests/SimFactory/MakeSimulations.cpp
index 2708d74c6dcb3bcf554325304a4a168a4185b8b2..250b89c61bb239811185b28dff4adede56ff465b 100644
--- a/Tests/SimFactory/MakeSimulations.cpp
+++ b/Tests/SimFactory/MakeSimulations.cpp
@@ -305,7 +305,7 @@ std::unique_ptr<OffspecSimulation> test::makeSimulation::MiniOffspec(const Multi
 //  specular simulations
 //  ************************************************************************************************
 
-IBeamScan* test::makeSimulation::BasicSpecularScan(bool vsQ)
+BeamScan* test::makeSimulation::BasicSpecularScan(bool vsQ)
 {
     const double wavelength = 1.54 * angstrom;
     const int n = 2000;
@@ -327,7 +327,7 @@ IBeamScan* test::makeSimulation::BasicSpecularScan(bool vsQ)
 std::unique_ptr<SpecularSimulation> test::makeSimulation::BasicSpecular(const MultiLayer& sample,
                                                                         bool vsQ, double intensity)
 {
-    std::unique_ptr<IBeamScan> scan(BasicSpecularScan(vsQ));
+    std::unique_ptr<BeamScan> scan(BasicSpecularScan(vsQ));
     scan->setIntensity(intensity);
 
     auto result = std::make_unique<SpecularSimulation>(*scan, sample);
@@ -340,7 +340,7 @@ test::makeSimulation::BasicYPolarizedSpecular(const MultiLayer& sample, const st
                                               bool vsQ)
 {
     const auto yCase = YPolarizationCases.at(polCase);
-    std::unique_ptr<IBeamScan> scan(BasicSpecularScan(vsQ));
+    std::unique_ptr<BeamScan> scan(BasicSpecularScan(vsQ));
     scan->setPolarization(yCase.first);
     scan->setAnalyzer(yCase.second);
     return std::make_unique<SpecularSimulation>(*scan, sample);
diff --git a/Tests/SimFactory/MakeSimulations.h b/Tests/SimFactory/MakeSimulations.h
index 3b2799ab8ee544f00dbcffe62321e6ed797036b2..8dc71278f787472b210cd62e2c15be0b12d6d3dd 100644
--- a/Tests/SimFactory/MakeSimulations.h
+++ b/Tests/SimFactory/MakeSimulations.h
@@ -21,8 +21,8 @@
 #include <memory>
 #include <string>
 
+class BeamScan;
 class DepthprobeSimulation;
-class IBeamScan;
 class MultiLayer;
 class OffspecSimulation;
 class ScatteringSimulation;
@@ -55,7 +55,7 @@ std::unique_ptr<ScatteringSimulation> ExtraLongWavelengthGISAS(const MultiLayer&
 
 std::unique_ptr<OffspecSimulation> MiniOffspec(const MultiLayer& sample);
 
-IBeamScan* BasicSpecularScan(bool vsQ);
+BeamScan* BasicSpecularScan(bool vsQ);
 std::unique_ptr<SpecularSimulation> BasicSpecular(const MultiLayer& sample, bool vsQ,
                                                   double intensity = 1.);
 std::unique_ptr<SpecularSimulation> BasicYPolarizedSpecular(const MultiLayer& sample,
diff --git a/Wrap/Swig/libBornAgainSim.i b/Wrap/Swig/libBornAgainSim.i
index 7a8627ad624387223171a41cdedc1cf8a7c911bb..c8f16a6968b5b5d9f942a6d5201c08acffab3737 100644
--- a/Wrap/Swig/libBornAgainSim.i
+++ b/Wrap/Swig/libBornAgainSim.i
@@ -96,7 +96,7 @@
 %include "Sim/Fitting/PyFittingCallbacks.h"
 %include "Sim/Fitting/FitObjective.h"
 
-%include "Sim/Scan/IBeamScan.h"
+%include "Sim/Scan/BeamScan.h"
 %include "Sim/Scan/AlphaScan.h"
 %include "Sim/Scan/LambdaScan.h"
 %include "Sim/Scan/QzScan.h"
diff --git a/auto/Wrap/libBornAgainSim.py b/auto/Wrap/libBornAgainSim.py
index 8623d76312249b89008b9e9654bbe62dd488a44e..6e6e547fd78e5ba87b0b0063dc25a2cf2c7a9d8d 100644
--- a/auto/Wrap/libBornAgainSim.py
+++ b/auto/Wrap/libBornAgainSim.py
@@ -2521,46 +2521,46 @@ class FitObjective(object):
 
 # Register FitObjective in _libBornAgainSim:
 _libBornAgainSim.FitObjective_swigregister(FitObjective)
-class IBeamScan(libBornAgainBase.ICloneable, libBornAgainParam.INode):
-    r"""Proxy of C++ IBeamScan class."""
+class BeamScan(libBornAgainBase.ICloneable, libBornAgainParam.INode):
+    r"""Proxy of C++ BeamScan class."""
 
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
 
     def __init__(self, *args, **kwargs):
         raise AttributeError("No constructor defined - class is abstract")
     __repr__ = _swig_repr
-    __swig_destroy__ = _libBornAgainSim.delete_IBeamScan
+    __swig_destroy__ = _libBornAgainSim.delete_BeamScan
 
     def clone(self):
-        r"""clone(IBeamScan self) -> IBeamScan"""
-        return _libBornAgainSim.IBeamScan_clone(self)
+        r"""clone(BeamScan self) -> BeamScan"""
+        return _libBornAgainSim.BeamScan_clone(self)
 
     def nodeChildren(self):
-        r"""nodeChildren(IBeamScan self) -> swig_dummy_type_const_inode_vector"""
-        return _libBornAgainSim.IBeamScan_nodeChildren(self)
+        r"""nodeChildren(BeamScan self) -> swig_dummy_type_const_inode_vector"""
+        return _libBornAgainSim.BeamScan_nodeChildren(self)
 
     def setIntensity(self, intensity):
-        r"""setIntensity(IBeamScan self, double intensity)"""
-        return _libBornAgainSim.IBeamScan_setIntensity(self, intensity)
+        r"""setIntensity(BeamScan self, double intensity)"""
+        return _libBornAgainSim.BeamScan_setIntensity(self, intensity)
 
     def setPolarization(self, bloch_vector):
-        r"""setPolarization(IBeamScan self, R3 bloch_vector)"""
-        return _libBornAgainSim.IBeamScan_setPolarization(self, bloch_vector)
+        r"""setPolarization(BeamScan self, R3 bloch_vector)"""
+        return _libBornAgainSim.BeamScan_setPolarization(self, bloch_vector)
 
     def setAnalyzer(self, *args):
         r"""
-        setAnalyzer(IBeamScan self, R3 Bloch_vector={}, double mean_transmission=0.5)
-        setAnalyzer(IBeamScan self, R3 direction, double efficiency, double transmission)
+        setAnalyzer(BeamScan self, R3 Bloch_vector={}, double mean_transmission=0.5)
+        setAnalyzer(BeamScan self, R3 direction, double efficiency, double transmission)
         """
-        return _libBornAgainSim.IBeamScan_setAnalyzer(self, *args)
+        return _libBornAgainSim.BeamScan_setAnalyzer(self, *args)
 
     def setFootprint(self, footprint):
-        r"""setFootprint(IBeamScan self, IFootprint const * footprint)"""
-        return _libBornAgainSim.IBeamScan_setFootprint(self, footprint)
+        r"""setFootprint(BeamScan self, IFootprint const * footprint)"""
+        return _libBornAgainSim.BeamScan_setFootprint(self, footprint)
 
-# Register IBeamScan in _libBornAgainSim:
-_libBornAgainSim.IBeamScan_swigregister(IBeamScan)
-class AlphaScan(IBeamScan):
+# Register BeamScan in _libBornAgainSim:
+_libBornAgainSim.BeamScan_swigregister(BeamScan)
+class AlphaScan(BeamScan):
     r"""Proxy of C++ AlphaScan class."""
 
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
@@ -2604,7 +2604,7 @@ class AlphaScan(IBeamScan):
 
 # Register AlphaScan in _libBornAgainSim:
 _libBornAgainSim.AlphaScan_swigregister(AlphaScan)
-class LambdaScan(IBeamScan):
+class LambdaScan(BeamScan):
     r"""Proxy of C++ LambdaScan class."""
 
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
@@ -2633,7 +2633,7 @@ class LambdaScan(IBeamScan):
 
 # Register LambdaScan in _libBornAgainSim:
 _libBornAgainSim.LambdaScan_swigregister(LambdaScan)
-class QzScan(IBeamScan):
+class QzScan(BeamScan):
     r"""Proxy of C++ QzScan class."""
 
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
@@ -2746,7 +2746,7 @@ class DepthprobeSimulation(ISimulation):
     __repr__ = _swig_repr
 
     def __init__(self, scan, sample, zaxis, flags=0):
-        r"""__init__(DepthprobeSimulation self, IBeamScan scan, MultiLayer const & sample, Scale zaxis, int flags=0) -> DepthprobeSimulation"""
+        r"""__init__(DepthprobeSimulation self, BeamScan scan, MultiLayer const & sample, Scale zaxis, int flags=0) -> DepthprobeSimulation"""
         _libBornAgainSim.DepthprobeSimulation_swiginit(self, _libBornAgainSim.new_DepthprobeSimulation(scan, sample, zaxis, flags))
     __swig_destroy__ = _libBornAgainSim.delete_DepthprobeSimulation
 
@@ -2770,7 +2770,7 @@ class SpecularSimulation(ISimulation):
     __repr__ = _swig_repr
 
     def __init__(self, scan, sample):
-        r"""__init__(SpecularSimulation self, IBeamScan scan, MultiLayer const & sample) -> SpecularSimulation"""
+        r"""__init__(SpecularSimulation self, BeamScan scan, MultiLayer const & sample) -> SpecularSimulation"""
         _libBornAgainSim.SpecularSimulation_swiginit(self, _libBornAgainSim.new_SpecularSimulation(scan, sample))
     __swig_destroy__ = _libBornAgainSim.delete_SpecularSimulation
 
@@ -2787,7 +2787,7 @@ class OffspecSimulation(ISimulation):
     __repr__ = _swig_repr
 
     def __init__(self, scan, sample, detector):
-        r"""__init__(OffspecSimulation self, IBeamScan scan, MultiLayer const & sample, OffspecDetector const & detector) -> OffspecSimulation"""
+        r"""__init__(OffspecSimulation self, BeamScan scan, MultiLayer const & sample, OffspecDetector const & detector) -> OffspecSimulation"""
         _libBornAgainSim.OffspecSimulation_swiginit(self, _libBornAgainSim.new_OffspecSimulation(scan, sample, detector))
     __swig_destroy__ = _libBornAgainSim.delete_OffspecSimulation
 
diff --git a/auto/Wrap/libBornAgainSim_wrap.cpp b/auto/Wrap/libBornAgainSim_wrap.cpp
index da6f65cb4f0d62793383ca83585f695a8474d681..e208d2ede4d91d2b0b2360b4a2df0bd6aefa475d 100644
--- a/auto/Wrap/libBornAgainSim_wrap.cpp
+++ b/auto/Wrap/libBornAgainSim_wrap.cpp
@@ -3388,13 +3388,13 @@ namespace Swig {
 
 #define SWIGTYPE_p_AlphaScan swig_types[0]
 #define SWIGTYPE_p_Beam swig_types[1]
-#define SWIGTYPE_p_ChiSquaredModule swig_types[2]
-#define SWIGTYPE_p_ConstantBackground swig_types[3]
-#define SWIGTYPE_p_Datafield swig_types[4]
-#define SWIGTYPE_p_DepthprobeSimulation swig_types[5]
-#define SWIGTYPE_p_FitObjective swig_types[6]
-#define SWIGTYPE_p_IBackground swig_types[7]
-#define SWIGTYPE_p_IBeamScan swig_types[8]
+#define SWIGTYPE_p_BeamScan swig_types[2]
+#define SWIGTYPE_p_ChiSquaredModule swig_types[3]
+#define SWIGTYPE_p_ConstantBackground swig_types[4]
+#define SWIGTYPE_p_Datafield swig_types[5]
+#define SWIGTYPE_p_DepthprobeSimulation swig_types[6]
+#define SWIGTYPE_p_FitObjective swig_types[7]
+#define SWIGTYPE_p_IBackground swig_types[8]
 #define SWIGTYPE_p_IChiSquaredModule swig_types[9]
 #define SWIGTYPE_p_ICloneable swig_types[10]
 #define SWIGTYPE_p_IDetector swig_types[11]
@@ -33946,20 +33946,20 @@ SWIGINTERN PyObject *FitObjective_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObj
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_delete_IBeamScan(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_BeamScan(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IBeamScan *arg1 = (IBeamScan *) 0 ;
+  BeamScan *arg1 = (BeamScan *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IBeamScan, SWIG_POINTER_DISOWN |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BeamScan, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IBeamScan" "', argument " "1"" of type '" "IBeamScan *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_BeamScan" "', argument " "1"" of type '" "BeamScan *""'"); 
   }
-  arg1 = reinterpret_cast< IBeamScan * >(argp1);
+  arg1 = reinterpret_cast< BeamScan * >(argp1);
   {
     try {
       delete arg1;
@@ -33978,24 +33978,24 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IBeamScan_clone(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_BeamScan_clone(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IBeamScan *arg1 = (IBeamScan *) 0 ;
+  BeamScan *arg1 = (BeamScan *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  IBeamScan *result = 0 ;
+  BeamScan *result = 0 ;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IBeamScan, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BeamScan, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IBeamScan_clone" "', argument " "1"" of type '" "IBeamScan const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BeamScan_clone" "', argument " "1"" of type '" "BeamScan const *""'"); 
   }
-  arg1 = reinterpret_cast< IBeamScan * >(argp1);
+  arg1 = reinterpret_cast< BeamScan * >(argp1);
   {
     try {
-      result = (IBeamScan *)((IBeamScan const *)arg1)->clone();
+      result = (BeamScan *)((BeamScan const *)arg1)->clone();
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -34004,16 +34004,16 @@ SWIGINTERN PyObject *_wrap_IBeamScan_clone(PyObject *self, PyObject *args) {
       SWIG_exception(SWIG_RuntimeError, msg.c_str());
     }
   }
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IBeamScan, 0 |  0 );
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_BeamScan, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IBeamScan_nodeChildren(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_BeamScan_nodeChildren(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IBeamScan *arg1 = (IBeamScan *) 0 ;
+  BeamScan *arg1 = (BeamScan *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -34021,14 +34021,14 @@ SWIGINTERN PyObject *_wrap_IBeamScan_nodeChildren(PyObject *self, PyObject *args
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IBeamScan, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BeamScan, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IBeamScan_nodeChildren" "', argument " "1"" of type '" "IBeamScan const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BeamScan_nodeChildren" "', argument " "1"" of type '" "BeamScan const *""'"); 
   }
-  arg1 = reinterpret_cast< IBeamScan * >(argp1);
+  arg1 = reinterpret_cast< BeamScan * >(argp1);
   {
     try {
-      result = ((IBeamScan const *)arg1)->nodeChildren();
+      result = ((BeamScan const *)arg1)->nodeChildren();
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -34044,9 +34044,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IBeamScan_setIntensity(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_BeamScan_setIntensity(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IBeamScan *arg1 = (IBeamScan *) 0 ;
+  BeamScan *arg1 = (BeamScan *) 0 ;
   double arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
@@ -34054,15 +34054,15 @@ SWIGINTERN PyObject *_wrap_IBeamScan_setIntensity(PyObject *self, PyObject *args
   int ecode2 = 0 ;
   PyObject *swig_obj[2] ;
   
-  if (!SWIG_Python_UnpackTuple(args, "IBeamScan_setIntensity", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IBeamScan, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "BeamScan_setIntensity", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BeamScan, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IBeamScan_setIntensity" "', argument " "1"" of type '" "IBeamScan *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BeamScan_setIntensity" "', argument " "1"" of type '" "BeamScan *""'"); 
   }
-  arg1 = reinterpret_cast< IBeamScan * >(argp1);
+  arg1 = reinterpret_cast< BeamScan * >(argp1);
   ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IBeamScan_setIntensity" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "BeamScan_setIntensity" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
   {
@@ -34083,9 +34083,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IBeamScan_setPolarization(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_BeamScan_setPolarization(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IBeamScan *arg1 = (IBeamScan *) 0 ;
+  BeamScan *arg1 = (BeamScan *) 0 ;
   R3 arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
@@ -34093,19 +34093,19 @@ SWIGINTERN PyObject *_wrap_IBeamScan_setPolarization(PyObject *self, PyObject *a
   int res2 = 0 ;
   PyObject *swig_obj[2] ;
   
-  if (!SWIG_Python_UnpackTuple(args, "IBeamScan_setPolarization", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IBeamScan, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "BeamScan_setPolarization", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BeamScan, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IBeamScan_setPolarization" "', argument " "1"" of type '" "IBeamScan *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BeamScan_setPolarization" "', argument " "1"" of type '" "BeamScan *""'"); 
   }
-  arg1 = reinterpret_cast< IBeamScan * >(argp1);
+  arg1 = reinterpret_cast< BeamScan * >(argp1);
   {
     res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Vec3T_double_t,  0  | 0);
     if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IBeamScan_setPolarization" "', argument " "2"" of type '" "R3""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BeamScan_setPolarization" "', argument " "2"" of type '" "R3""'"); 
     }  
     if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IBeamScan_setPolarization" "', argument " "2"" of type '" "R3""'");
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BeamScan_setPolarization" "', argument " "2"" of type '" "R3""'");
     } else {
       R3 * temp = reinterpret_cast< R3 * >(argp2);
       arg2 = *temp;
@@ -34130,9 +34130,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IBeamScan_setAnalyzer__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_BeamScan_setAnalyzer__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  IBeamScan *arg1 = (IBeamScan *) 0 ;
+  BeamScan *arg1 = (BeamScan *) 0 ;
   R3 arg2 ;
   double arg3 ;
   void *argp1 = 0 ;
@@ -34143,18 +34143,18 @@ SWIGINTERN PyObject *_wrap_IBeamScan_setAnalyzer__SWIG_0(PyObject *self, Py_ssiz
   int ecode3 = 0 ;
   
   if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IBeamScan, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BeamScan, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IBeamScan_setAnalyzer" "', argument " "1"" of type '" "IBeamScan *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BeamScan_setAnalyzer" "', argument " "1"" of type '" "BeamScan *""'"); 
   }
-  arg1 = reinterpret_cast< IBeamScan * >(argp1);
+  arg1 = reinterpret_cast< BeamScan * >(argp1);
   {
     res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Vec3T_double_t,  0  | 0);
     if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IBeamScan_setAnalyzer" "', argument " "2"" of type '" "R3""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BeamScan_setAnalyzer" "', argument " "2"" of type '" "R3""'"); 
     }  
     if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IBeamScan_setAnalyzer" "', argument " "2"" of type '" "R3""'");
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BeamScan_setAnalyzer" "', argument " "2"" of type '" "R3""'");
     } else {
       R3 * temp = reinterpret_cast< R3 * >(argp2);
       arg2 = *temp;
@@ -34163,7 +34163,7 @@ SWIGINTERN PyObject *_wrap_IBeamScan_setAnalyzer__SWIG_0(PyObject *self, Py_ssiz
   }
   ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
   if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IBeamScan_setAnalyzer" "', argument " "3"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "BeamScan_setAnalyzer" "', argument " "3"" of type '" "double""'");
   } 
   arg3 = static_cast< double >(val3);
   {
@@ -34184,9 +34184,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IBeamScan_setAnalyzer__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_BeamScan_setAnalyzer__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  IBeamScan *arg1 = (IBeamScan *) 0 ;
+  BeamScan *arg1 = (BeamScan *) 0 ;
   R3 arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
@@ -34194,18 +34194,18 @@ SWIGINTERN PyObject *_wrap_IBeamScan_setAnalyzer__SWIG_1(PyObject *self, Py_ssiz
   int res2 = 0 ;
   
   if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IBeamScan, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BeamScan, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IBeamScan_setAnalyzer" "', argument " "1"" of type '" "IBeamScan *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BeamScan_setAnalyzer" "', argument " "1"" of type '" "BeamScan *""'"); 
   }
-  arg1 = reinterpret_cast< IBeamScan * >(argp1);
+  arg1 = reinterpret_cast< BeamScan * >(argp1);
   {
     res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Vec3T_double_t,  0  | 0);
     if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IBeamScan_setAnalyzer" "', argument " "2"" of type '" "R3""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BeamScan_setAnalyzer" "', argument " "2"" of type '" "R3""'"); 
     }  
     if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IBeamScan_setAnalyzer" "', argument " "2"" of type '" "R3""'");
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BeamScan_setAnalyzer" "', argument " "2"" of type '" "R3""'");
     } else {
       R3 * temp = reinterpret_cast< R3 * >(argp2);
       arg2 = *temp;
@@ -34230,18 +34230,18 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IBeamScan_setAnalyzer__SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_BeamScan_setAnalyzer__SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  IBeamScan *arg1 = (IBeamScan *) 0 ;
+  BeamScan *arg1 = (BeamScan *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   
   if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IBeamScan, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BeamScan, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IBeamScan_setAnalyzer" "', argument " "1"" of type '" "IBeamScan *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BeamScan_setAnalyzer" "', argument " "1"" of type '" "BeamScan *""'"); 
   }
-  arg1 = reinterpret_cast< IBeamScan * >(argp1);
+  arg1 = reinterpret_cast< BeamScan * >(argp1);
   {
     try {
       (arg1)->setAnalyzer();
@@ -34260,9 +34260,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IBeamScan_setAnalyzer__SWIG_3(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_BeamScan_setAnalyzer__SWIG_3(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  IBeamScan *arg1 = (IBeamScan *) 0 ;
+  BeamScan *arg1 = (BeamScan *) 0 ;
   R3 arg2 ;
   double arg3 ;
   double arg4 ;
@@ -34276,18 +34276,18 @@ SWIGINTERN PyObject *_wrap_IBeamScan_setAnalyzer__SWIG_3(PyObject *self, Py_ssiz
   int ecode4 = 0 ;
   
   if ((nobjs < 4) || (nobjs > 4)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IBeamScan, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BeamScan, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IBeamScan_setAnalyzer" "', argument " "1"" of type '" "IBeamScan *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BeamScan_setAnalyzer" "', argument " "1"" of type '" "BeamScan *""'"); 
   }
-  arg1 = reinterpret_cast< IBeamScan * >(argp1);
+  arg1 = reinterpret_cast< BeamScan * >(argp1);
   {
     res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Vec3T_double_t,  0  | 0);
     if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IBeamScan_setAnalyzer" "', argument " "2"" of type '" "R3""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BeamScan_setAnalyzer" "', argument " "2"" of type '" "R3""'"); 
     }  
     if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IBeamScan_setAnalyzer" "', argument " "2"" of type '" "R3""'");
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BeamScan_setAnalyzer" "', argument " "2"" of type '" "R3""'");
     } else {
       R3 * temp = reinterpret_cast< R3 * >(argp2);
       arg2 = *temp;
@@ -34296,12 +34296,12 @@ SWIGINTERN PyObject *_wrap_IBeamScan_setAnalyzer__SWIG_3(PyObject *self, Py_ssiz
   }
   ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
   if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IBeamScan_setAnalyzer" "', argument " "3"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "BeamScan_setAnalyzer" "', argument " "3"" of type '" "double""'");
   } 
   arg3 = static_cast< double >(val3);
   ecode4 = SWIG_AsVal_double(swig_obj[3], &val4);
   if (!SWIG_IsOK(ecode4)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "IBeamScan_setAnalyzer" "', argument " "4"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "BeamScan_setAnalyzer" "', argument " "4"" of type '" "double""'");
   } 
   arg4 = static_cast< double >(val4);
   {
@@ -34322,40 +34322,40 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IBeamScan_setAnalyzer(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_BeamScan_setAnalyzer(PyObject *self, PyObject *args) {
   Py_ssize_t argc;
   PyObject *argv[5] = {
     0
   };
   
-  if (!(argc = SWIG_Python_UnpackTuple(args, "IBeamScan_setAnalyzer", 0, 4, argv))) SWIG_fail;
+  if (!(argc = SWIG_Python_UnpackTuple(args, "BeamScan_setAnalyzer", 0, 4, argv))) SWIG_fail;
   --argc;
   if (argc == 1) {
     int _v = 0;
     void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IBeamScan, 0);
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_BeamScan, 0);
     _v = SWIG_CheckState(res);
     if (_v) {
-      return _wrap_IBeamScan_setAnalyzer__SWIG_2(self, argc, argv);
+      return _wrap_BeamScan_setAnalyzer__SWIG_2(self, argc, argv);
     }
   }
   if (argc == 2) {
     int _v = 0;
     void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IBeamScan, 0);
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_BeamScan, 0);
     _v = SWIG_CheckState(res);
     if (_v) {
       int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_Vec3T_double_t, SWIG_POINTER_NO_NULL | 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_IBeamScan_setAnalyzer__SWIG_1(self, argc, argv);
+        return _wrap_BeamScan_setAnalyzer__SWIG_1(self, argc, argv);
       }
     }
   }
   if (argc == 3) {
     int _v = 0;
     void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IBeamScan, 0);
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_BeamScan, 0);
     _v = SWIG_CheckState(res);
     if (_v) {
       int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_Vec3T_double_t, SWIG_POINTER_NO_NULL | 0);
@@ -34366,7 +34366,7 @@ SWIGINTERN PyObject *_wrap_IBeamScan_setAnalyzer(PyObject *self, PyObject *args)
           _v = SWIG_CheckState(res);
         }
         if (_v) {
-          return _wrap_IBeamScan_setAnalyzer__SWIG_0(self, argc, argv);
+          return _wrap_BeamScan_setAnalyzer__SWIG_0(self, argc, argv);
         }
       }
     }
@@ -34374,7 +34374,7 @@ SWIGINTERN PyObject *_wrap_IBeamScan_setAnalyzer(PyObject *self, PyObject *args)
   if (argc == 4) {
     int _v = 0;
     void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IBeamScan, 0);
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_BeamScan, 0);
     _v = SWIG_CheckState(res);
     if (_v) {
       int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_Vec3T_double_t, SWIG_POINTER_NO_NULL | 0);
@@ -34390,7 +34390,7 @@ SWIGINTERN PyObject *_wrap_IBeamScan_setAnalyzer(PyObject *self, PyObject *args)
             _v = SWIG_CheckState(res);
           }
           if (_v) {
-            return _wrap_IBeamScan_setAnalyzer__SWIG_3(self, argc, argv);
+            return _wrap_BeamScan_setAnalyzer__SWIG_3(self, argc, argv);
           }
         }
       }
@@ -34398,19 +34398,19 @@ SWIGINTERN PyObject *_wrap_IBeamScan_setAnalyzer(PyObject *self, PyObject *args)
   }
   
 fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'IBeamScan_setAnalyzer'.\n"
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'BeamScan_setAnalyzer'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    IBeamScan::setAnalyzer(R3,double)\n"
-    "    IBeamScan::setAnalyzer(R3)\n"
-    "    IBeamScan::setAnalyzer()\n"
-    "    IBeamScan::setAnalyzer(R3,double,double)\n");
+    "    BeamScan::setAnalyzer(R3,double)\n"
+    "    BeamScan::setAnalyzer(R3)\n"
+    "    BeamScan::setAnalyzer()\n"
+    "    BeamScan::setAnalyzer(R3,double,double)\n");
   return 0;
 }
 
 
-SWIGINTERN PyObject *_wrap_IBeamScan_setFootprint(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_BeamScan_setFootprint(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IBeamScan *arg1 = (IBeamScan *) 0 ;
+  BeamScan *arg1 = (BeamScan *) 0 ;
   IFootprint *arg2 = (IFootprint *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
@@ -34418,15 +34418,15 @@ SWIGINTERN PyObject *_wrap_IBeamScan_setFootprint(PyObject *self, PyObject *args
   int res2 = 0 ;
   PyObject *swig_obj[2] ;
   
-  if (!SWIG_Python_UnpackTuple(args, "IBeamScan_setFootprint", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IBeamScan, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "BeamScan_setFootprint", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BeamScan, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IBeamScan_setFootprint" "', argument " "1"" of type '" "IBeamScan *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BeamScan_setFootprint" "', argument " "1"" of type '" "BeamScan *""'"); 
   }
-  arg1 = reinterpret_cast< IBeamScan * >(argp1);
+  arg1 = reinterpret_cast< BeamScan * >(argp1);
   res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_IFootprint, 0 |  0 );
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IBeamScan_setFootprint" "', argument " "2"" of type '" "IFootprint const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BeamScan_setFootprint" "', argument " "2"" of type '" "IFootprint const *""'"); 
   }
   arg2 = reinterpret_cast< IFootprint * >(argp2);
   {
@@ -34447,10 +34447,10 @@ fail:
 }
 
 
-SWIGINTERN PyObject *IBeamScan_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *BeamScan_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_IBeamScan, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_BeamScan, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
@@ -36304,7 +36304,7 @@ SWIGINTERN PyObject *Swig_var_WaveProperty_Phase_get(void) {
 
 SWIGINTERN PyObject *_wrap_new_DepthprobeSimulation__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  IBeamScan *arg1 = 0 ;
+  BeamScan *arg1 = 0 ;
   MultiLayer *arg2 = 0 ;
   Scale *arg3 = 0 ;
   int arg4 ;
@@ -36319,14 +36319,14 @@ SWIGINTERN PyObject *_wrap_new_DepthprobeSimulation__SWIG_0(PyObject *self, Py_s
   DepthprobeSimulation *result = 0 ;
   
   if ((nobjs < 4) || (nobjs > 4)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_IBeamScan,  0  | 0);
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_BeamScan,  0  | 0);
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_DepthprobeSimulation" "', argument " "1"" of type '" "IBeamScan const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_DepthprobeSimulation" "', argument " "1"" of type '" "BeamScan const &""'"); 
   }
   if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_DepthprobeSimulation" "', argument " "1"" of type '" "IBeamScan const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_DepthprobeSimulation" "', argument " "1"" of type '" "BeamScan const &""'"); 
   }
-  arg1 = reinterpret_cast< IBeamScan * >(argp1);
+  arg1 = reinterpret_cast< BeamScan * >(argp1);
   res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_MultiLayer,  0  | 0);
   if (!SWIG_IsOK(res2)) {
     SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_DepthprobeSimulation" "', argument " "2"" of type '" "MultiLayer const &""'"); 
@@ -36350,7 +36350,7 @@ SWIGINTERN PyObject *_wrap_new_DepthprobeSimulation__SWIG_0(PyObject *self, Py_s
   arg4 = static_cast< int >(val4);
   {
     try {
-      result = (DepthprobeSimulation *)new DepthprobeSimulation((IBeamScan const &)*arg1,(MultiLayer const &)*arg2,(Scale const &)*arg3,arg4);
+      result = (DepthprobeSimulation *)new DepthprobeSimulation((BeamScan const &)*arg1,(MultiLayer const &)*arg2,(Scale const &)*arg3,arg4);
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -36368,7 +36368,7 @@ fail:
 
 SWIGINTERN PyObject *_wrap_new_DepthprobeSimulation__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  IBeamScan *arg1 = 0 ;
+  BeamScan *arg1 = 0 ;
   MultiLayer *arg2 = 0 ;
   Scale *arg3 = 0 ;
   void *argp1 = 0 ;
@@ -36380,14 +36380,14 @@ SWIGINTERN PyObject *_wrap_new_DepthprobeSimulation__SWIG_1(PyObject *self, Py_s
   DepthprobeSimulation *result = 0 ;
   
   if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_IBeamScan,  0  | 0);
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_BeamScan,  0  | 0);
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_DepthprobeSimulation" "', argument " "1"" of type '" "IBeamScan const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_DepthprobeSimulation" "', argument " "1"" of type '" "BeamScan const &""'"); 
   }
   if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_DepthprobeSimulation" "', argument " "1"" of type '" "IBeamScan const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_DepthprobeSimulation" "', argument " "1"" of type '" "BeamScan const &""'"); 
   }
-  arg1 = reinterpret_cast< IBeamScan * >(argp1);
+  arg1 = reinterpret_cast< BeamScan * >(argp1);
   res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_MultiLayer,  0  | 0);
   if (!SWIG_IsOK(res2)) {
     SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_DepthprobeSimulation" "', argument " "2"" of type '" "MultiLayer const &""'"); 
@@ -36406,7 +36406,7 @@ SWIGINTERN PyObject *_wrap_new_DepthprobeSimulation__SWIG_1(PyObject *self, Py_s
   arg3 = reinterpret_cast< Scale * >(argp3);
   {
     try {
-      result = (DepthprobeSimulation *)new DepthprobeSimulation((IBeamScan const &)*arg1,(MultiLayer const &)*arg2,(Scale const &)*arg3);
+      result = (DepthprobeSimulation *)new DepthprobeSimulation((BeamScan const &)*arg1,(MultiLayer const &)*arg2,(Scale const &)*arg3);
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -36432,7 +36432,7 @@ SWIGINTERN PyObject *_wrap_new_DepthprobeSimulation(PyObject *self, PyObject *ar
   --argc;
   if (argc == 3) {
     int _v = 0;
-    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IBeamScan, SWIG_POINTER_NO_NULL | 0);
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_BeamScan, SWIG_POINTER_NO_NULL | 0);
     _v = SWIG_CheckState(res);
     if (_v) {
       int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_MultiLayer, SWIG_POINTER_NO_NULL | 0);
@@ -36448,7 +36448,7 @@ SWIGINTERN PyObject *_wrap_new_DepthprobeSimulation(PyObject *self, PyObject *ar
   }
   if (argc == 4) {
     int _v = 0;
-    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IBeamScan, SWIG_POINTER_NO_NULL | 0);
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_BeamScan, SWIG_POINTER_NO_NULL | 0);
     _v = SWIG_CheckState(res);
     if (_v) {
       int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_MultiLayer, SWIG_POINTER_NO_NULL | 0);
@@ -36472,8 +36472,8 @@ SWIGINTERN PyObject *_wrap_new_DepthprobeSimulation(PyObject *self, PyObject *ar
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_DepthprobeSimulation'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    DepthprobeSimulation::DepthprobeSimulation(IBeamScan const &,MultiLayer const &,Scale const &,int)\n"
-    "    DepthprobeSimulation::DepthprobeSimulation(IBeamScan const &,MultiLayer const &,Scale const &)\n");
+    "    DepthprobeSimulation::DepthprobeSimulation(BeamScan const &,MultiLayer const &,Scale const &,int)\n"
+    "    DepthprobeSimulation::DepthprobeSimulation(BeamScan const &,MultiLayer const &,Scale const &)\n");
   return 0;
 }
 
@@ -36556,7 +36556,7 @@ SWIGINTERN PyObject *DepthprobeSimulation_swiginit(PyObject *SWIGUNUSEDPARM(self
 
 SWIGINTERN PyObject *_wrap_new_SpecularSimulation(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IBeamScan *arg1 = 0 ;
+  BeamScan *arg1 = 0 ;
   MultiLayer *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
@@ -36566,14 +36566,14 @@ SWIGINTERN PyObject *_wrap_new_SpecularSimulation(PyObject *self, PyObject *args
   SpecularSimulation *result = 0 ;
   
   if (!SWIG_Python_UnpackTuple(args, "new_SpecularSimulation", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_IBeamScan,  0  | 0);
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_BeamScan,  0  | 0);
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SpecularSimulation" "', argument " "1"" of type '" "IBeamScan const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SpecularSimulation" "', argument " "1"" of type '" "BeamScan const &""'"); 
   }
   if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SpecularSimulation" "', argument " "1"" of type '" "IBeamScan const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SpecularSimulation" "', argument " "1"" of type '" "BeamScan const &""'"); 
   }
-  arg1 = reinterpret_cast< IBeamScan * >(argp1);
+  arg1 = reinterpret_cast< BeamScan * >(argp1);
   res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_MultiLayer,  0  | 0);
   if (!SWIG_IsOK(res2)) {
     SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_SpecularSimulation" "', argument " "2"" of type '" "MultiLayer const &""'"); 
@@ -36584,7 +36584,7 @@ SWIGINTERN PyObject *_wrap_new_SpecularSimulation(PyObject *self, PyObject *args
   arg2 = reinterpret_cast< MultiLayer * >(argp2);
   {
     try {
-      result = (SpecularSimulation *)new SpecularSimulation((IBeamScan const &)*arg1,(MultiLayer const &)*arg2);
+      result = (SpecularSimulation *)new SpecularSimulation((BeamScan const &)*arg1,(MultiLayer const &)*arg2);
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -36678,7 +36678,7 @@ SWIGINTERN PyObject *SpecularSimulation_swiginit(PyObject *SWIGUNUSEDPARM(self),
 
 SWIGINTERN PyObject *_wrap_new_OffspecSimulation(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IBeamScan *arg1 = 0 ;
+  BeamScan *arg1 = 0 ;
   MultiLayer *arg2 = 0 ;
   OffspecDetector *arg3 = 0 ;
   void *argp1 = 0 ;
@@ -36691,14 +36691,14 @@ SWIGINTERN PyObject *_wrap_new_OffspecSimulation(PyObject *self, PyObject *args)
   OffspecSimulation *result = 0 ;
   
   if (!SWIG_Python_UnpackTuple(args, "new_OffspecSimulation", 3, 3, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_IBeamScan,  0  | 0);
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_BeamScan,  0  | 0);
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_OffspecSimulation" "', argument " "1"" of type '" "IBeamScan const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_OffspecSimulation" "', argument " "1"" of type '" "BeamScan const &""'"); 
   }
   if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_OffspecSimulation" "', argument " "1"" of type '" "IBeamScan const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_OffspecSimulation" "', argument " "1"" of type '" "BeamScan const &""'"); 
   }
-  arg1 = reinterpret_cast< IBeamScan * >(argp1);
+  arg1 = reinterpret_cast< BeamScan * >(argp1);
   res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_MultiLayer,  0  | 0);
   if (!SWIG_IsOK(res2)) {
     SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_OffspecSimulation" "', argument " "2"" of type '" "MultiLayer const &""'"); 
@@ -36717,7 +36717,7 @@ SWIGINTERN PyObject *_wrap_new_OffspecSimulation(PyObject *self, PyObject *args)
   arg3 = reinterpret_cast< OffspecDetector * >(argp3);
   {
     try {
-      result = (OffspecSimulation *)new OffspecSimulation((IBeamScan const &)*arg1,(MultiLayer const &)*arg2,(OffspecDetector const &)*arg3);
+      result = (OffspecSimulation *)new OffspecSimulation((BeamScan const &)*arg1,(MultiLayer const &)*arg2,(OffspecDetector const &)*arg3);
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -39744,17 +39744,17 @@ static PyMethodDef SwigMethods[] = {
 	 { "disown_FitObjective", _wrap_disown_FitObjective, METH_O, NULL},
 	 { "FitObjective_swigregister", FitObjective_swigregister, METH_O, NULL},
 	 { "FitObjective_swiginit", FitObjective_swiginit, METH_VARARGS, NULL},
-	 { "delete_IBeamScan", _wrap_delete_IBeamScan, METH_O, "delete_IBeamScan(IBeamScan self)"},
-	 { "IBeamScan_clone", _wrap_IBeamScan_clone, METH_O, "IBeamScan_clone(IBeamScan self) -> IBeamScan"},
-	 { "IBeamScan_nodeChildren", _wrap_IBeamScan_nodeChildren, METH_O, "IBeamScan_nodeChildren(IBeamScan self) -> swig_dummy_type_const_inode_vector"},
-	 { "IBeamScan_setIntensity", _wrap_IBeamScan_setIntensity, METH_VARARGS, "IBeamScan_setIntensity(IBeamScan self, double intensity)"},
-	 { "IBeamScan_setPolarization", _wrap_IBeamScan_setPolarization, METH_VARARGS, "IBeamScan_setPolarization(IBeamScan self, R3 bloch_vector)"},
-	 { "IBeamScan_setAnalyzer", _wrap_IBeamScan_setAnalyzer, METH_VARARGS, "\n"
-		"IBeamScan_setAnalyzer(IBeamScan self, R3 Bloch_vector={}, double mean_transmission=0.5)\n"
-		"IBeamScan_setAnalyzer(IBeamScan self, R3 direction, double efficiency, double transmission)\n"
+	 { "delete_BeamScan", _wrap_delete_BeamScan, METH_O, "delete_BeamScan(BeamScan self)"},
+	 { "BeamScan_clone", _wrap_BeamScan_clone, METH_O, "BeamScan_clone(BeamScan self) -> BeamScan"},
+	 { "BeamScan_nodeChildren", _wrap_BeamScan_nodeChildren, METH_O, "BeamScan_nodeChildren(BeamScan self) -> swig_dummy_type_const_inode_vector"},
+	 { "BeamScan_setIntensity", _wrap_BeamScan_setIntensity, METH_VARARGS, "BeamScan_setIntensity(BeamScan self, double intensity)"},
+	 { "BeamScan_setPolarization", _wrap_BeamScan_setPolarization, METH_VARARGS, "BeamScan_setPolarization(BeamScan self, R3 bloch_vector)"},
+	 { "BeamScan_setAnalyzer", _wrap_BeamScan_setAnalyzer, METH_VARARGS, "\n"
+		"BeamScan_setAnalyzer(BeamScan self, R3 Bloch_vector={}, double mean_transmission=0.5)\n"
+		"BeamScan_setAnalyzer(BeamScan self, R3 direction, double efficiency, double transmission)\n"
 		""},
-	 { "IBeamScan_setFootprint", _wrap_IBeamScan_setFootprint, METH_VARARGS, "IBeamScan_setFootprint(IBeamScan self, IFootprint const * footprint)"},
-	 { "IBeamScan_swigregister", IBeamScan_swigregister, METH_O, NULL},
+	 { "BeamScan_setFootprint", _wrap_BeamScan_setFootprint, METH_VARARGS, "BeamScan_setFootprint(BeamScan self, IFootprint const * footprint)"},
+	 { "BeamScan_swigregister", BeamScan_swigregister, METH_O, NULL},
 	 { "new_AlphaScan", _wrap_new_AlphaScan, METH_VARARGS, "\n"
 		"AlphaScan(Scale alpha_axis)\n"
 		"new_AlphaScan(int nbins, double alpha_i_min, double alpha_i_max) -> AlphaScan\n"
@@ -39810,17 +39810,17 @@ static PyMethodDef SwigMethods[] = {
 	 { "ScatteringSimulation_detector", _wrap_ScatteringSimulation_detector, METH_O, "ScatteringSimulation_detector(ScatteringSimulation self) -> IDetector &"},
 	 { "ScatteringSimulation_swigregister", ScatteringSimulation_swigregister, METH_O, NULL},
 	 { "ScatteringSimulation_swiginit", ScatteringSimulation_swiginit, METH_VARARGS, NULL},
-	 { "new_DepthprobeSimulation", _wrap_new_DepthprobeSimulation, METH_VARARGS, "DepthprobeSimulation(IBeamScan scan, MultiLayer const & sample, Scale zaxis, int flags=0)"},
+	 { "new_DepthprobeSimulation", _wrap_new_DepthprobeSimulation, METH_VARARGS, "DepthprobeSimulation(BeamScan scan, MultiLayer const & sample, Scale zaxis, int flags=0)"},
 	 { "delete_DepthprobeSimulation", _wrap_delete_DepthprobeSimulation, METH_O, "delete_DepthprobeSimulation(DepthprobeSimulation self)"},
 	 { "DepthprobeSimulation_className", _wrap_DepthprobeSimulation_className, METH_O, "DepthprobeSimulation_className(DepthprobeSimulation self) -> std::string"},
 	 { "DepthprobeSimulation_swigregister", DepthprobeSimulation_swigregister, METH_O, NULL},
 	 { "DepthprobeSimulation_swiginit", DepthprobeSimulation_swiginit, METH_VARARGS, NULL},
-	 { "new_SpecularSimulation", _wrap_new_SpecularSimulation, METH_VARARGS, "new_SpecularSimulation(IBeamScan scan, MultiLayer const & sample) -> SpecularSimulation"},
+	 { "new_SpecularSimulation", _wrap_new_SpecularSimulation, METH_VARARGS, "new_SpecularSimulation(BeamScan scan, MultiLayer const & sample) -> SpecularSimulation"},
 	 { "delete_SpecularSimulation", _wrap_delete_SpecularSimulation, METH_O, "delete_SpecularSimulation(SpecularSimulation self)"},
 	 { "SpecularSimulation_className", _wrap_SpecularSimulation_className, METH_O, "SpecularSimulation_className(SpecularSimulation self) -> std::string"},
 	 { "SpecularSimulation_swigregister", SpecularSimulation_swigregister, METH_O, NULL},
 	 { "SpecularSimulation_swiginit", SpecularSimulation_swiginit, METH_VARARGS, NULL},
-	 { "new_OffspecSimulation", _wrap_new_OffspecSimulation, METH_VARARGS, "new_OffspecSimulation(IBeamScan scan, MultiLayer const & sample, OffspecDetector const & detector) -> OffspecSimulation"},
+	 { "new_OffspecSimulation", _wrap_new_OffspecSimulation, METH_VARARGS, "new_OffspecSimulation(BeamScan scan, MultiLayer const & sample, OffspecDetector const & detector) -> OffspecSimulation"},
 	 { "delete_OffspecSimulation", _wrap_delete_OffspecSimulation, METH_O, "delete_OffspecSimulation(OffspecSimulation self)"},
 	 { "OffspecSimulation_className", _wrap_OffspecSimulation_className, METH_O, "OffspecSimulation_className(OffspecSimulation self) -> std::string"},
 	 { "OffspecSimulation_swigregister", OffspecSimulation_swigregister, METH_O, NULL},
@@ -39907,26 +39907,29 @@ static PyMethodDef SwigMethods[] = {
 
 /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */
 
+static void *_p_AlphaScanTo_p_BeamScan(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((BeamScan *)  ((AlphaScan *) x));
+}
+static void *_p_LambdaScanTo_p_BeamScan(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((BeamScan *)  ((LambdaScan *) x));
+}
+static void *_p_QzScanTo_p_BeamScan(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((BeamScan *)  ((QzScan *) x));
+}
 static void *_p_ConstantBackgroundTo_p_IBackground(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IBackground *)  ((ConstantBackground *) x));
 }
 static void *_p_PoissonBackgroundTo_p_IBackground(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IBackground *)  ((PoissonBackground *) x));
 }
-static void *_p_AlphaScanTo_p_IBeamScan(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IBeamScan *)  ((AlphaScan *) x));
-}
-static void *_p_LambdaScanTo_p_IBeamScan(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IBeamScan *)  ((LambdaScan *) x));
-}
-static void *_p_QzScanTo_p_IBeamScan(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IBeamScan *)  ((QzScan *) x));
-}
 static void *_p_ChiSquaredModuleTo_p_IChiSquaredModule(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IChiSquaredModule *)  ((ChiSquaredModule *) x));
 }
 static void *_p_AlphaScanTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (IBeamScan *) ((AlphaScan *) x));
+    return (void *)((ICloneable *) (BeamScan *) ((AlphaScan *) x));
+}
+static void *_p_BeamScanTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *)  ((BeamScan *) x));
 }
 static void *_p_ChiSquaredModuleTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (IChiSquaredModule *) ((ChiSquaredModule *) x));
@@ -39937,9 +39940,6 @@ static void *_p_ConstantBackgroundTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(n
 static void *_p_IBackgroundTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *)  ((IBackground *) x));
 }
-static void *_p_IBeamScanTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *)  ((IBeamScan *) x));
-}
 static void *_p_IChiSquaredModuleTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *)  ((IChiSquaredModule *) x));
 }
@@ -39947,13 +39947,13 @@ static void *_p_ISampleNodeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemor
     return (void *)((ICloneable *)  ((ISampleNode *) x));
 }
 static void *_p_LambdaScanTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (IBeamScan *) ((LambdaScan *) x));
+    return (void *)((ICloneable *) (BeamScan *) ((LambdaScan *) x));
 }
 static void *_p_PoissonBackgroundTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (IBackground *) ((PoissonBackground *) x));
 }
 static void *_p_QzScanTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (IBeamScan *) ((QzScan *) x));
+    return (void *)((ICloneable *) (BeamScan *) ((QzScan *) x));
 }
 static void *_p_IntensityFunctionLogTo_p_IIntensityFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IIntensityFunction *)  ((IntensityFunctionLog *) x));
@@ -39962,7 +39962,10 @@ static void *_p_IntensityFunctionSqrtTo_p_IIntensityFunction(void *x, int *SWIGU
     return (void *)((IIntensityFunction *)  ((IntensityFunctionSqrt *) x));
 }
 static void *_p_AlphaScanTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (IBeamScan *) ((AlphaScan *) x));
+    return (void *)((INode *) (BeamScan *) ((AlphaScan *) x));
+}
+static void *_p_BeamScanTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INode *)  ((BeamScan *) x));
 }
 static void *_p_ConstantBackgroundTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (IBackground *) ((ConstantBackground *) x));
@@ -39973,9 +39976,6 @@ static void *_p_DepthprobeSimulationTo_p_INode(void *x, int *SWIGUNUSEDPARM(newm
 static void *_p_IBackgroundTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *)  ((IBackground *) x));
 }
-static void *_p_IBeamScanTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *)  ((IBeamScan *) x));
-}
 static void *_p_ISampleNodeTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *)  ((ISampleNode *) x));
 }
@@ -39983,7 +39983,7 @@ static void *_p_ISimulationTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *)  ((ISimulation *) x));
 }
 static void *_p_LambdaScanTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (IBeamScan *) ((LambdaScan *) x));
+    return (void *)((INode *) (BeamScan *) ((LambdaScan *) x));
 }
 static void *_p_OffspecSimulationTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (ISimulation *) ((OffspecSimulation *) x));
@@ -39992,7 +39992,7 @@ static void *_p_PoissonBackgroundTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemo
     return (void *)((INode *) (IBackground *) ((PoissonBackground *) x));
 }
 static void *_p_QzScanTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (IBeamScan *) ((QzScan *) x));
+    return (void *)((INode *) (BeamScan *) ((QzScan *) x));
 }
 static void *_p_ScatteringSimulationTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (ISimulation *) ((ScatteringSimulation *) x));
@@ -40020,13 +40020,13 @@ static void *_p_VarianceSimFunctionTo_p_IVarianceFunction(void *x, int *SWIGUNUS
 }
 static swig_type_info _swigt__p_AlphaScan = {"_p_AlphaScan", "AlphaScan *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Beam = {"_p_Beam", "Beam *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_BeamScan = {"_p_BeamScan", "BeamScan *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ChiSquaredModule = {"_p_ChiSquaredModule", "ChiSquaredModule *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ConstantBackground = {"_p_ConstantBackground", "ConstantBackground *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Datafield = {"_p_Datafield", "Datafield *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_DepthprobeSimulation = {"_p_DepthprobeSimulation", "DepthprobeSimulation *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_FitObjective = {"_p_FitObjective", "FitObjective *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IBackground = {"_p_IBackground", "IBackground *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_IBeamScan = {"_p_IBeamScan", "IBeamScan *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IChiSquaredModule = {"_p_IChiSquaredModule", "IChiSquaredModule *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ICloneable = {"_p_ICloneable", "ICloneable *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ISampleNode = {"_p_ISampleNode", 0, 0, 0, 0, 0};
@@ -40112,13 +40112,13 @@ static swig_type_info _swigt__p_value_type = {"_p_value_type", "value_type *", 0
 static swig_type_info *swig_type_initial[] = {
   &_swigt__p_AlphaScan,
   &_swigt__p_Beam,
+  &_swigt__p_BeamScan,
   &_swigt__p_ChiSquaredModule,
   &_swigt__p_ConstantBackground,
   &_swigt__p_Datafield,
   &_swigt__p_DepthprobeSimulation,
   &_swigt__p_FitObjective,
   &_swigt__p_IBackground,
-  &_swigt__p_IBeamScan,
   &_swigt__p_IChiSquaredModule,
   &_swigt__p_ICloneable,
   &_swigt__p_IDetector,
@@ -40204,21 +40204,21 @@ static swig_type_info *swig_type_initial[] = {
 
 static swig_cast_info _swigc__p_AlphaScan[] = {  {&_swigt__p_AlphaScan, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Beam[] = {  {&_swigt__p_Beam, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_BeamScan[] = {  {&_swigt__p_BeamScan, 0, 0, 0},  {&_swigt__p_AlphaScan, _p_AlphaScanTo_p_BeamScan, 0, 0},  {&_swigt__p_LambdaScan, _p_LambdaScanTo_p_BeamScan, 0, 0},  {&_swigt__p_QzScan, _p_QzScanTo_p_BeamScan, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ChiSquaredModule[] = {  {&_swigt__p_ChiSquaredModule, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ConstantBackground[] = {  {&_swigt__p_ConstantBackground, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Datafield[] = {  {&_swigt__p_Datafield, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_DepthprobeSimulation[] = {  {&_swigt__p_DepthprobeSimulation, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_FitObjective[] = {  {&_swigt__p_FitObjective, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IBackground[] = {  {&_swigt__p_IBackground, 0, 0, 0},  {&_swigt__p_ConstantBackground, _p_ConstantBackgroundTo_p_IBackground, 0, 0},  {&_swigt__p_PoissonBackground, _p_PoissonBackgroundTo_p_IBackground, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_IBeamScan[] = {  {&_swigt__p_IBeamScan, 0, 0, 0},  {&_swigt__p_AlphaScan, _p_AlphaScanTo_p_IBeamScan, 0, 0},  {&_swigt__p_LambdaScan, _p_LambdaScanTo_p_IBeamScan, 0, 0},  {&_swigt__p_QzScan, _p_QzScanTo_p_IBeamScan, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IChiSquaredModule[] = {  {&_swigt__p_IChiSquaredModule, 0, 0, 0},  {&_swigt__p_ChiSquaredModule, _p_ChiSquaredModuleTo_p_IChiSquaredModule, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ISampleNode[] = {{&_swigt__p_ISampleNode, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_ICloneable[] = {  {&_swigt__p_ICloneable, 0, 0, 0},  {&_swigt__p_AlphaScan, _p_AlphaScanTo_p_ICloneable, 0, 0},  {&_swigt__p_ChiSquaredModule, _p_ChiSquaredModuleTo_p_ICloneable, 0, 0},  {&_swigt__p_ConstantBackground, _p_ConstantBackgroundTo_p_ICloneable, 0, 0},  {&_swigt__p_IBackground, _p_IBackgroundTo_p_ICloneable, 0, 0},  {&_swigt__p_IBeamScan, _p_IBeamScanTo_p_ICloneable, 0, 0},  {&_swigt__p_IChiSquaredModule, _p_IChiSquaredModuleTo_p_ICloneable, 0, 0},  {&_swigt__p_ISampleNode, _p_ISampleNodeTo_p_ICloneable, 0, 0},  {&_swigt__p_LambdaScan, _p_LambdaScanTo_p_ICloneable, 0, 0},  {&_swigt__p_PoissonBackground, _p_PoissonBackgroundTo_p_ICloneable, 0, 0},  {&_swigt__p_QzScan, _p_QzScanTo_p_ICloneable, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ICloneable[] = {  {&_swigt__p_ICloneable, 0, 0, 0},  {&_swigt__p_AlphaScan, _p_AlphaScanTo_p_ICloneable, 0, 0},  {&_swigt__p_BeamScan, _p_BeamScanTo_p_ICloneable, 0, 0},  {&_swigt__p_ChiSquaredModule, _p_ChiSquaredModuleTo_p_ICloneable, 0, 0},  {&_swigt__p_ConstantBackground, _p_ConstantBackgroundTo_p_ICloneable, 0, 0},  {&_swigt__p_IBackground, _p_IBackgroundTo_p_ICloneable, 0, 0},  {&_swigt__p_IChiSquaredModule, _p_IChiSquaredModuleTo_p_ICloneable, 0, 0},  {&_swigt__p_ISampleNode, _p_ISampleNodeTo_p_ICloneable, 0, 0},  {&_swigt__p_LambdaScan, _p_LambdaScanTo_p_ICloneable, 0, 0},  {&_swigt__p_PoissonBackground, _p_PoissonBackgroundTo_p_ICloneable, 0, 0},  {&_swigt__p_QzScan, _p_QzScanTo_p_ICloneable, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IDetector[] = {  {&_swigt__p_IDetector, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IDistribution1D[] = {  {&_swigt__p_IDistribution1D, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IFootprint[] = {  {&_swigt__p_IFootprint, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IIntensityFunction[] = {  {&_swigt__p_IIntensityFunction, 0, 0, 0},  {&_swigt__p_IntensityFunctionLog, _p_IntensityFunctionLogTo_p_IIntensityFunction, 0, 0},  {&_swigt__p_IntensityFunctionSqrt, _p_IntensityFunctionSqrtTo_p_IIntensityFunction, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_INode[] = {  {&_swigt__p_INode, 0, 0, 0},  {&_swigt__p_AlphaScan, _p_AlphaScanTo_p_INode, 0, 0},  {&_swigt__p_ConstantBackground, _p_ConstantBackgroundTo_p_INode, 0, 0},  {&_swigt__p_DepthprobeSimulation, _p_DepthprobeSimulationTo_p_INode, 0, 0},  {&_swigt__p_IBackground, _p_IBackgroundTo_p_INode, 0, 0},  {&_swigt__p_IBeamScan, _p_IBeamScanTo_p_INode, 0, 0},  {&_swigt__p_ISampleNode, _p_ISampleNodeTo_p_INode, 0, 0},  {&_swigt__p_ISimulation, _p_ISimulationTo_p_INode, 0, 0},  {&_swigt__p_LambdaScan, _p_LambdaScanTo_p_INode, 0, 0},  {&_swigt__p_OffspecSimulation, _p_OffspecSimulationTo_p_INode, 0, 0},  {&_swigt__p_PoissonBackground, _p_PoissonBackgroundTo_p_INode, 0, 0},  {&_swigt__p_QzScan, _p_QzScanTo_p_INode, 0, 0},  {&_swigt__p_ScatteringSimulation, _p_ScatteringSimulationTo_p_INode, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_INode, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_INode[] = {  {&_swigt__p_INode, 0, 0, 0},  {&_swigt__p_AlphaScan, _p_AlphaScanTo_p_INode, 0, 0},  {&_swigt__p_BeamScan, _p_BeamScanTo_p_INode, 0, 0},  {&_swigt__p_ConstantBackground, _p_ConstantBackgroundTo_p_INode, 0, 0},  {&_swigt__p_DepthprobeSimulation, _p_DepthprobeSimulationTo_p_INode, 0, 0},  {&_swigt__p_IBackground, _p_IBackgroundTo_p_INode, 0, 0},  {&_swigt__p_ISampleNode, _p_ISampleNodeTo_p_INode, 0, 0},  {&_swigt__p_ISimulation, _p_ISimulationTo_p_INode, 0, 0},  {&_swigt__p_LambdaScan, _p_LambdaScanTo_p_INode, 0, 0},  {&_swigt__p_OffspecSimulation, _p_OffspecSimulationTo_p_INode, 0, 0},  {&_swigt__p_PoissonBackground, _p_PoissonBackgroundTo_p_INode, 0, 0},  {&_swigt__p_QzScan, _p_QzScanTo_p_INode, 0, 0},  {&_swigt__p_ScatteringSimulation, _p_ScatteringSimulationTo_p_INode, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_INode, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ISimulation[] = {  {&_swigt__p_ISimulation, 0, 0, 0},  {&_swigt__p_DepthprobeSimulation, _p_DepthprobeSimulationTo_p_ISimulation, 0, 0},  {&_swigt__p_OffspecSimulation, _p_OffspecSimulationTo_p_ISimulation, 0, 0},  {&_swigt__p_ScatteringSimulation, _p_ScatteringSimulationTo_p_ISimulation, 0, 0},  {&_swigt__p_SpecularSimulation, _p_SpecularSimulationTo_p_ISimulation, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IVarianceFunction[] = {  {&_swigt__p_IVarianceFunction, 0, 0, 0},  {&_swigt__p_VarianceConstantFunction, _p_VarianceConstantFunctionTo_p_IVarianceFunction, 0, 0},  {&_swigt__p_VarianceSimFunction, _p_VarianceSimFunctionTo_p_IVarianceFunction, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IntensityFunctionLog[] = {  {&_swigt__p_IntensityFunctionLog, 0, 0, 0},{0, 0, 0, 0}};
@@ -40296,13 +40296,13 @@ static swig_cast_info _swigc__p_value_type[] = {  {&_swigt__p_value_type, 0, 0,
 static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_AlphaScan,
   _swigc__p_Beam,
+  _swigc__p_BeamScan,
   _swigc__p_ChiSquaredModule,
   _swigc__p_ConstantBackground,
   _swigc__p_Datafield,
   _swigc__p_DepthprobeSimulation,
   _swigc__p_FitObjective,
   _swigc__p_IBackground,
-  _swigc__p_IBeamScan,
   _swigc__p_IChiSquaredModule,
   _swigc__p_ICloneable,
   _swigc__p_IDetector,