diff --git a/Core/Export/SimulationToPython.cpp b/Core/Export/SimulationToPython.cpp
index 133512ac2a2a8b3ad975e0e7bf2704b520fcc1d6..3835e78b16ff80a7afd37a19f86493fc2652205a 100644
--- a/Core/Export/SimulationToPython.cpp
+++ b/Core/Export/SimulationToPython.cpp
@@ -272,7 +272,7 @@ std::string defineBeamIntensity(const Beam& beam)
 std::string defineGISASBeam(const GISASSimulation& simulation)
 {
     std::ostringstream result;
-    const Beam& beam = simulation.instrument().beam();
+    const Beam& beam = simulation.beam();
 
     result << indent() << "beam = ba.Beam(" << pyfmt::printDouble(beam.intensity()) << ", "
            << pyfmt::printNm(beam.wavelength()) << ", ba.Direction("
@@ -287,7 +287,7 @@ std::string defineGISASBeam(const GISASSimulation& simulation)
 std::string defineOffSpecularBeam(const OffSpecularSimulation& simulation)
 {
     std::ostringstream result;
-    const Beam& beam = simulation.instrument().beam();
+    const Beam& beam = simulation.beam();
 
     const std::string axidef = indent() + "alpha_i_axis = ";
     result << axidef << pyfmt2::printAxis(simulation.beamAxis(), "rad") << "\n";
@@ -310,7 +310,7 @@ std::string defineSpecularScan(const SpecularSimulation& simulation)
                                  "does not contain any scan");
     result << defineScan(scan) << "\n";
     result << indent() << "simulation.setScan(scan)\n";
-    result << defineBeamIntensity(simulation.instrument().beam()) << "\n";
+    result << defineBeamIntensity(simulation.beam()) << "\n";
     return result.str();
 }
 
diff --git a/Core/Simulation/DepthProbeSimulation.cpp b/Core/Simulation/DepthProbeSimulation.cpp
index f254f3e86adc31787d129ad9771e54a9f443d7ee..a9e03a73500ba285a00a7b02c8b61955dd372d23 100644
--- a/Core/Simulation/DepthProbeSimulation.cpp
+++ b/Core/Simulation/DepthProbeSimulation.cpp
@@ -98,7 +98,7 @@ size_t DepthProbeSimulation::intensityMapSize() const
 
 std::unique_ptr<IUnitConverter> DepthProbeSimulation::createUnitConverter() const
 {
-    return std::make_unique<DepthProbeConverter>(instrument().beam(), *m_alpha_axis, *m_z_axis);
+    return std::make_unique<DepthProbeConverter>(beam(), *m_alpha_axis, *m_z_axis);
 }
 
 DepthProbeSimulation::DepthProbeSimulation(const DepthProbeSimulation& other)
@@ -141,12 +141,12 @@ void DepthProbeSimulation::setBeamParameters(double lambda, const IAxis& alpha_a
     instrument().setBeamParameters(lambda, zero_alpha_i, zero_phi_i);
 
     if (beam_shape)
-        instrument().beam().setFootprintFactor(*beam_shape);
+        beam().setFootprintFactor(*beam_shape);
 }
 
 void DepthProbeSimulation::initSimulationElementVector()
 {
-    m_sim_elements = generateSimulationElements(instrument().beam());
+    m_sim_elements = generateSimulationElements(beam());
 
     if (!m_cache.empty())
         return;
@@ -222,7 +222,7 @@ void DepthProbeSimulation::initialize()
 
     // allow for negative inclinations in the beam of specular simulation
     // it is required for proper averaging in the case of divergent beam
-    auto inclination = instrument().beam().parameter("InclinationAngle");
+    auto inclination = beam().parameter("InclinationAngle");
     inclination->setLimits(RealLimits::limited(-M_PI_2, M_PI_2));
 }
 
@@ -232,7 +232,7 @@ void DepthProbeSimulation::normalize(size_t start_ind, size_t n_elements)
     for (size_t i = start_ind, stop_point = start_ind + n_elements; i < stop_point; ++i) {
         auto& element = m_sim_elements[i];
         const double alpha_i = -element.getAlphaI();
-        const auto footprint = instrument().beam().footprintFactor();
+        const auto footprint = beam().footprintFactor();
         double intensity_factor = beam_intensity;
         if (footprint != nullptr)
             intensity_factor = intensity_factor * footprint->calculate(alpha_i);
diff --git a/Core/Simulation/GISASSimulation.cpp b/Core/Simulation/GISASSimulation.cpp
index ec4a277f0736d0f2167bc68a7b4939000ff13edb..2e9df72829bb380f9834ea7e62c66ddd12013dcd 100644
--- a/Core/Simulation/GISASSimulation.cpp
+++ b/Core/Simulation/GISASSimulation.cpp
@@ -51,7 +51,7 @@ SimulationResult GISASSimulation::result() const
 {
     const auto converter = UnitConverterUtils::createConverterForGISAS(instrument());
     const std::unique_ptr<OutputData<double>> data(
-        instrument().detector().createDetectorIntensity(m_sim_elements));
+        detector().createDetectorIntensity(m_sim_elements));
     return SimulationResult(*data, *converter);
 }
 
@@ -66,7 +66,7 @@ void GISASSimulation::setBeamParameters(double wavelength, double alpha_i, doubl
 size_t GISASSimulation::intensityMapSize() const
 {
     size_t result = 0;
-    instrument().detector().iterate([&result](IDetector::const_iterator) { ++result; }, true);
+    detector().iterate([&result](IDetector::const_iterator) { ++result; }, true);
     return result;
 }
 
@@ -77,7 +77,7 @@ GISASSimulation::GISASSimulation(const GISASSimulation& other) : ISimulation2D(o
 
 void GISASSimulation::initSimulationElementVector()
 {
-    m_sim_elements = generateSimulationElements(instrument().beam());
+    m_sim_elements = generateSimulationElements(beam());
     if (m_cache.empty())
         m_cache.resize(m_sim_elements.size(), 0.0);
 }
diff --git a/Core/Simulation/ISimulation.cpp b/Core/Simulation/ISimulation.cpp
index 8dbc85d37bbf86f2754e34acfa38e70286e7102b..6bec07491009ea836136ea7519a8f9648e2443a4 100644
--- a/Core/Simulation/ISimulation.cpp
+++ b/Core/Simulation/ISimulation.cpp
@@ -317,12 +317,10 @@ SimulationResult ISimulation::convertData(const OutputData<double>& data,
     auto converter = UnitConverterUtils::createConverter(*this);
     auto roi_data = UnitConverterUtils::createOutputData(*converter, converter->defaultUnits());
 
-    const IDetector& detector = instrument().detector();
-
     if (roi_data->hasSameDimensions(data)) {
         // data is already cropped to ROI
         if (put_masked_areas_to_zero) {
-            detector.iterate(
+            detector().iterate(
                 [&](IDetector::const_iterator it) {
                     (*roi_data)[it.roiIndex()] = data[it.roiIndex()];
                 },
@@ -331,9 +329,9 @@ SimulationResult ISimulation::convertData(const OutputData<double>& data,
             roi_data->setRawDataVector(data.getRawDataVector());
         }
 
-    } else if (detHasSameDimensions(detector, data)) {
+    } else if (detHasSameDimensions(detector(), data)) {
         // exp data has same shape as the detector, we have to put orig data to smaller roi map
-        detector.iterate(
+        detector().iterate(
             [&](IDetector::const_iterator it) {
                 (*roi_data)[it.roiIndex()] = data[it.detectorIndex()];
             },
diff --git a/Core/Simulation/OffSpecularSimulation.cpp b/Core/Simulation/OffSpecularSimulation.cpp
index a2610b9eb13ef3e462c27c28d3eb8e6dfc1c63a1..4e454e19f930214c6d1e3eda9510b6d84c4619d2 100644
--- a/Core/Simulation/OffSpecularSimulation.cpp
+++ b/Core/Simulation/OffSpecularSimulation.cpp
@@ -48,7 +48,7 @@ size_t OffSpecularSimulation::numberOfSimulationElements() const
 SimulationResult OffSpecularSimulation::result() const
 {
     auto data = std::unique_ptr<OutputData<double>>(m_intensity_map.clone());
-    OffSpecularConverter converter(instrument().detector2D(), instrument().beam(), *m_alpha_i_axis);
+    OffSpecularConverter converter(instrument().detector2D(), beam(), *m_alpha_i_axis);
     return SimulationResult(*data, converter);
 }
 
@@ -75,8 +75,7 @@ std::unique_ptr<IUnitConverter> OffSpecularSimulation::createUnitConverter() con
     if (!axis)
         throw std::runtime_error("Error in OffSpecularSimulation::createUnitConverter:"
                                  " missing inclination angle axis");
-    return std::make_unique<OffSpecularConverter>(instrument().detector2D(), instrument().beam(),
-                                                  *axis);
+    return std::make_unique<OffSpecularConverter>(instrument().detector2D(), beam(), *axis);
 }
 
 size_t OffSpecularSimulation::intensityMapSize() const
@@ -97,10 +96,10 @@ OffSpecularSimulation::OffSpecularSimulation(const OffSpecularSimulation& other)
 void OffSpecularSimulation::initSimulationElementVector()
 {
     m_sim_elements.clear();
-    Beam beam = instrument().beam();
+    Beam beam2 = beam();
     for (size_t i = 0; i < m_alpha_i_axis->size(); ++i) {
-        beam.setInclination(m_alpha_i_axis->bin(i).center());
-        std::vector<SimulationElement> sim_elements_i = generateSimulationElements(beam);
+        beam2.setInclination(m_alpha_i_axis->bin(i).center());
+        std::vector<SimulationElement> sim_elements_i = generateSimulationElements(beam2);
         for (auto ele : sim_elements_i)
             m_sim_elements.emplace_back(ele);
     }
diff --git a/Core/Simulation/SpecularSimulation.cpp b/Core/Simulation/SpecularSimulation.cpp
index 24b0863a6b8f82580f623a84989fdbc50ae185a1..37f0d9d7bddec37e46b7a564226c1b2dd26a823e 100644
--- a/Core/Simulation/SpecularSimulation.cpp
+++ b/Core/Simulation/SpecularSimulation.cpp
@@ -204,7 +204,7 @@ void SpecularSimulation::normalize(size_t start_ind, size_t n_elements)
     std::vector<double> footprints;
     // TODO: use just m_scan when pointwise resolution is implemented
     if (const auto* aScan = dynamic_cast<const AngularSpecScan*>(m_scan.get()))
-        footprints = mangledScan(*aScan, instrument().beam())->footprint(start_ind, n_elements);
+        footprints = mangledScan(*aScan, beam())->footprint(start_ind, n_elements);
     else
         footprints = m_scan->footprint(start_ind, n_elements);
 
diff --git a/GUI/coregui/Models/TransformFromDomain.cpp b/GUI/coregui/Models/TransformFromDomain.cpp
index ca6fa3ecc4cd84c01fd09b390090cd87de6610cf..854491afb3f165d9d41bf3064df84f869cfbfbcf 100644
--- a/GUI/coregui/Models/TransformFromDomain.cpp
+++ b/GUI/coregui/Models/TransformFromDomain.cpp
@@ -239,7 +239,7 @@ bool TransformFromDomain::isValidRoughness(const LayerRoughness* roughness)
 void TransformFromDomain::setGISASBeamItem(BeamItem* beam_item, const GISASSimulation& simulation)
 {
     ASSERT(beam_item);
-    Beam beam = simulation.instrument().beam();
+    Beam beam = simulation.beam();
 
     beam_item->setIntensity(beam.intensity());
     beam_item->setWavelength(beam.wavelength());
@@ -265,7 +265,7 @@ void TransformFromDomain::setGISASBeamItem(BeamItem* beam_item, const GISASSimul
 void TransformFromDomain::setOffSpecularBeamItem(BeamItem* beam_item,
                                                  const OffSpecularSimulation& simulation)
 {
-    Beam beam = simulation.instrument().beam();
+    Beam beam = simulation.beam();
 
     beam_item->setIntensity(beam.intensity());
     beam_item->setWavelength(beam.wavelength());
@@ -277,7 +277,7 @@ void TransformFromDomain::setOffSpecularBeamItem(BeamItem* beam_item,
 void TransformFromDomain::setSpecularBeamItem(SpecularBeamItem* beam_item,
                                               const SpecularSimulation& simulation)
 {
-    const Beam& beam = simulation.instrument().beam();
+    const Beam& beam = simulation.beam();
 
     beam_item->setIntensity(beam.intensity());
     beam_item->setWavelength(beam.wavelength());
diff --git a/Tests/UnitTests/Core/Fresnel/DepthProbeSimulationTest.cpp b/Tests/UnitTests/Core/Fresnel/DepthProbeSimulationTest.cpp
index 224e44ab82b1e7a0438354d496493da5dac3c9fc..70f6d245b2108df1d4238ffc53d920133cbab037 100644
--- a/Tests/UnitTests/Core/Fresnel/DepthProbeSimulationTest.cpp
+++ b/Tests/UnitTests/Core/Fresnel/DepthProbeSimulationTest.cpp
@@ -48,7 +48,7 @@ std::unique_ptr<DepthProbeSimulation> DepthProbeSimulationTest::defaultSimulatio
 
 void DepthProbeSimulationTest::checkBeamState(const DepthProbeSimulation& sim)
 {
-    const auto* inclination = sim.instrument().beam().parameter("InclinationAngle");
+    const auto* inclination = sim.beam().parameter("InclinationAngle");
     const auto test_limits = RealLimits::limited(-M_PI_2, M_PI_2);
     EXPECT_EQ(test_limits, inclination->limits());
     EXPECT_EQ(0.0, inclination->value());
@@ -98,7 +98,7 @@ TEST_F(DepthProbeSimulationTest, CheckAxesOfDefaultSimulation)
 TEST_F(DepthProbeSimulationTest, SetBeamParameters)
 {
     DepthProbeSimulation sim;
-    const auto& beam = sim.instrument().beam();
+    const auto& beam = sim.beam();
 
     sim.setBeamParameters(1.0, 10, 1.0 * Units::deg, 10.0 * Units::deg);
     EXPECT_EQ(10u, sim.getAlphaAxis()->size());
diff --git a/Tests/UnitTests/Core/Fresnel/SpecularSimulationTest.cpp b/Tests/UnitTests/Core/Fresnel/SpecularSimulationTest.cpp
index 04b9ce2a0010ef30bb069efeb29c93a1e0cbded9..742919cc530f1fa18adf82be61b1a1c25ec0e2eb 100644
--- a/Tests/UnitTests/Core/Fresnel/SpecularSimulationTest.cpp
+++ b/Tests/UnitTests/Core/Fresnel/SpecularSimulationTest.cpp
@@ -60,7 +60,7 @@ std::unique_ptr<SpecularSimulation> SpecularSimulationTest::defaultSimulation()
 
 void SpecularSimulationTest::checkBeamState(const SpecularSimulation& sim)
 {
-    const auto* inclination = sim.instrument().beam().parameter("InclinationAngle");
+    const auto* inclination = sim.beam().parameter("InclinationAngle");
     const auto test_limits = RealLimits::limited(-M_PI_2, M_PI_2);
     EXPECT_EQ(test_limits, inclination->limits());
     EXPECT_EQ(0.0, inclination->value());
@@ -85,7 +85,7 @@ TEST_F(SpecularSimulationTest, SetAngularScan)
     SpecularSimulation sim;
     AngularSpecScan scan(1.0, std::vector<double>{1.0 * Units::deg, 3.0 * Units::deg});
     sim.setScan(scan);
-    const auto& beam = sim.instrument().beam();
+    const auto& beam = sim.beam();
 
     EXPECT_EQ(2u, sim.coordinateAxis()->size());
     EXPECT_EQ(1.0 * Units::deg, sim.coordinateAxis()->lowerBound());
@@ -134,7 +134,7 @@ TEST_F(SpecularSimulationTest, SetQScan)
     QSpecScan scan(std::vector<double>{1.0, 3.0});
     sim.setScan(scan);
 
-    const auto& beam = sim.instrument().beam();
+    const auto& beam = sim.beam();
 
     EXPECT_EQ(2u, sim.coordinateAxis()->size());
     EXPECT_EQ(1.0, sim.coordinateAxis()->lowerBound());
@@ -243,7 +243,7 @@ TEST_F(SpecularSimulationTest, AddingBeamDistributions)
 TEST_F(SpecularSimulationTest, OutOfRangeAngles)
 {
     auto sim = defaultSimulation();
-    auto& beam = sim->instrument().beam();
+    auto& beam = sim->beam();
     beam.parameter("InclinationAngle")->setValue(-0.2 * Units::deg);
 
     sim->runSimulation();
diff --git a/Tests/UnitTests/Core/Instrument/RectangularDetectorTest.cpp b/Tests/UnitTests/Core/Instrument/RectangularDetectorTest.cpp
index ecd91bd6c2721d167e99c7600397ed5545918133..0bb315d3b8c48db6b9f5484505156ee871acb509 100644
--- a/Tests/UnitTests/Core/Instrument/RectangularDetectorTest.cpp
+++ b/Tests/UnitTests/Core/Instrument/RectangularDetectorTest.cpp
@@ -80,13 +80,13 @@ TEST_F(RectangularDetectorTest, PerpToSample)
     // initializing with the simulation
     GISASSimulation simulation;
     simulation.setBeamParameters(1.0, 10.0 * Units::deg, 0.0);
-    det.init(simulation.instrument().beam());
+    det.init(simulation.beam());
     EXPECT_TRUE(kvector_t(distance, 0, 0) == det.getNormalVector());
     EXPECT_TRUE(kvector_t(0.0, -1.0, 0.0) == det.getDirectionVector());
 
     // FIXME cleanup, replace with DetectorContext tests
     //    std::vector<DetectorElement> elements
-    //        = det.createDetectorElements(simulation.instrument().beam());
+    //        = det.createDetectorElements(simulation.beam());
     //    EXPECT_EQ(elements.size(), nbinsx * nbinsy);
 
     //    double wavelength = 1.0;
@@ -134,13 +134,13 @@ TEST_F(RectangularDetectorTest, PerpToDirectBeam)
     // initializing with the simulation
     GISASSimulation simulation;
     simulation.setBeamParameters(1.0, alpha_i, 0.0);
-    det.init(simulation.instrument().beam());
+    det.init(simulation.beam());
     kvector_t normal(distance * cos(alpha_i), 0.0, -1.0 * distance * sin(alpha_i));
     EXPECT_TRUE(isEqual(normal, det.getNormalVector()));
     EXPECT_TRUE(kvector_t(0.0, -1.0, 0.0) == det.getDirectionVector());
 
     //    std::vector<DetectorElement> elements
-    //        = det.createDetectorElements(simulation.instrument().beam());
+    //        = det.createDetectorElements(simulation.beam());
     //    EXPECT_EQ(elements.size(), nbinsx * nbinsy);
 
     //    // lower left bin
@@ -177,14 +177,14 @@ TEST_F(RectangularDetectorTest, PerpToReflectedBeam)
     // initializing with the simulation
     GISASSimulation simulation;
     simulation.setBeamParameters(1.0, alpha_i, 0.0);
-    det.init(simulation.instrument().beam());
+    det.init(simulation.beam());
     kvector_t normal(distance * cos(alpha_i), 0.0, 1.0 * distance * sin(alpha_i));
     EXPECT_TRUE(isEqual(normal, det.getNormalVector()));
     EXPECT_TRUE(kvector_t(0.0, -1.0, 0.0) == det.getDirectionVector());
 
     //    // checking detector elements
     //    std::vector<DetectorElement> elements
-    //        = det.createDetectorElements(simulation.instrument().beam());
+    //        = det.createDetectorElements(simulation.beam());
     //    EXPECT_EQ(elements.size(), nbinsx * nbinsy);
 
     //    double ds = v0 - dy / 2.;
@@ -232,7 +232,7 @@ TEST_F(RectangularDetectorTest, PerpToReflectedBeamDpos)
     // initializing with the simulation
     GISASSimulation simulation;
     simulation.setBeamParameters(1.0, alpha_i, 0.0);
-    det.init(simulation.instrument().beam());
+    det.init(simulation.beam());
 
     kvector_t normal(distance * cos(alpha_i), 0.0, 1.0 * distance * sin(alpha_i));
     EXPECT_TRUE(isEqual(normal, det.getNormalVector()));
@@ -242,7 +242,7 @@ TEST_F(RectangularDetectorTest, PerpToReflectedBeamDpos)
 
     //    // checking detector elements
     //    std::vector<DetectorElement> elements
-    //        = det.createDetectorElements(simulation.instrument().beam());
+    //        = det.createDetectorElements(simulation.beam());
     //    EXPECT_EQ(elements.size(), nbinsx * nbinsy);
 
     //    double ds = v0 - dy / 2.;
diff --git a/auto/Wrap/libBornAgainBase_wrap.cpp b/auto/Wrap/libBornAgainBase_wrap.cpp
index 3f552042266dd53ee9b19d1116eb79fb2b8835af..1ba716ca029730195503c1486cbe75f0b0f36bf6 100644
--- a/auto/Wrap/libBornAgainBase_wrap.cpp
+++ b/auto/Wrap/libBornAgainBase_wrap.cpp
@@ -5665,7 +5665,7 @@ SWIG_AsVal_std_complex_Sl_double_Sg_  (PyObject *o, std::complex<double>* val)
 
 
 SWIGINTERNINLINE PyObject*
-SWIG_From_std_complex_Sl_double_Sg_  (/*@SWIG:/usr/share/swig4.0/typemaps/swigmacros.swg,104,%ifcplusplus@*/
+SWIG_From_std_complex_Sl_double_Sg_  (/*@SWIG:/usr/local/share/swig/4.0.2/typemaps/swigmacros.swg,104,%ifcplusplus@*/
 
 const std::complex<double>&
 
diff --git a/auto/Wrap/libBornAgainFit_wrap.cpp b/auto/Wrap/libBornAgainFit_wrap.cpp
index 4da2484a8ce260740bb6d177ce99ea6df9f0cd4b..1a63f36554245c61099a8c2e465471cd17fbdf78 100644
--- a/auto/Wrap/libBornAgainFit_wrap.cpp
+++ b/auto/Wrap/libBornAgainFit_wrap.cpp
@@ -5665,7 +5665,7 @@ SWIG_AsVal_std_complex_Sl_double_Sg_  (PyObject *o, std::complex<double>* val)
 
 
 SWIGINTERNINLINE PyObject*
-SWIG_From_std_complex_Sl_double_Sg_  (/*@SWIG:/usr/share/swig4.0/typemaps/swigmacros.swg,104,%ifcplusplus@*/
+SWIG_From_std_complex_Sl_double_Sg_  (/*@SWIG:/usr/local/share/swig/4.0.2/typemaps/swigmacros.swg,104,%ifcplusplus@*/
 
 const std::complex<double>&