diff --git a/GUI/Model/Device/InstrumentItems.cpp b/GUI/Model/Device/InstrumentItems.cpp
index 06e693a6ff3305fd5479f397d137e38f1418fc01..b97248f622a57df27c0832e187363f5f749f959f 100644
--- a/GUI/Model/Device/InstrumentItems.cpp
+++ b/GUI/Model/Device/InstrumentItems.cpp
@@ -37,6 +37,8 @@
 #include "GUI/Util/Error.h"
 #include "GUI/Util/String.h"
 #include "Sim/Simulation/DepthProbeSimulation.h"
+#include "Sim/Simulation/OffSpecularSimulation.h"
+#include "Sim/Simulation/ScatteringSimulation.h"
 
 namespace {
 
@@ -365,16 +367,30 @@ std::unique_ptr<Instrument> Instrument2DItem::createInstrument() const
     return std::make_unique<Instrument>(*beam, *detector);
 }
 
-std::unique_ptr<Instrument> Instrument2DItem::createPolInstrument() const
+std::unique_ptr<ScatteringSimulation> Instrument2DItem::createScatteringSimulation(
+    const MultiLayer& sample) const
 {
     auto beam = beamItem()->createBeam();
     auto detector = detectorItem()->createDetector();
     detector->setDetectorNormal(beam->direction().zReflected());
 
-    beam->setPolarization(m_polarization);
-    detector->setAnalyzer(m_analyzerDirection, m_analyzerEfficiency, m_analyzerTotalTransmission);
+    auto result = std::make_unique<ScatteringSimulation>(*beam, sample, *detector);
+    result->setPolarization(m_polarization);
+    result->setAnalyzer(m_analyzerDirection, m_analyzerEfficiency, m_analyzerTotalTransmission);
+    return result;
+}
 
-    return std::make_unique<Instrument>(*beam, *detector);
+std::unique_ptr<OffSpecularSimulation> Instrument2DItem::createOffSpecularSimulation(
+    const MultiLayer& sample) const
+{
+    auto beam = beamItem()->createBeam();
+    auto detector = detectorItem()->createDetector();
+    detector->setDetectorNormal(beam->direction().zReflected());
+
+    auto result = std::make_unique<OffSpecularSimulation>(*beam, sample, *detector);
+    result->setPolarization(m_polarization);
+    result->setAnalyzer(m_analyzerDirection, m_analyzerEfficiency, m_analyzerTotalTransmission);
+    return result;
 }
 
 //  ************************************************************************************************
diff --git a/GUI/Model/Device/InstrumentItems.h b/GUI/Model/Device/InstrumentItems.h
index efe28f1247b1c3715d476d0e1000921e30d46888..f758b690d083c3b874c53989d70de68c47ffe681 100644
--- a/GUI/Model/Device/InstrumentItems.h
+++ b/GUI/Model/Device/InstrumentItems.h
@@ -28,10 +28,13 @@
 class BackgroundItem;
 class DataItem;
 class DepthProbeSimulation;
-class Instrument;
 class ICoordSystem;
+class Instrument;
 class MaskContainerItem;
+class MultiLayer;
 class RealDataItem;
+class OffSpecularSimulation;
+class ScatteringSimulation;
 
 //! Abstract base class for instrument-specific item classes.
 
@@ -156,7 +159,10 @@ public:
     void importMasks(const MaskContainerItem* maskContainer) override;
 
     std::unique_ptr<Instrument> createInstrument() const;
-    std::unique_ptr<Instrument> createPolInstrument() const;
+    std::unique_ptr<ScatteringSimulation> createScatteringSimulation(
+        const MultiLayer& sample) const;
+    std::unique_ptr<OffSpecularSimulation> createOffSpecularSimulation(
+        const MultiLayer& sample) const;
 
     static bool isDetectorPropertyName(const QString& name);
 
diff --git a/GUI/Model/To/DomainSimulationBuilder.cpp b/GUI/Model/To/DomainSimulationBuilder.cpp
index ba396a918e4216048c4f208183cd13753d378b12..1a9af18fb2700792d7ef5f0523423717c6e2be0e 100644
--- a/GUI/Model/To/DomainSimulationBuilder.cpp
+++ b/GUI/Model/To/DomainSimulationBuilder.cpp
@@ -119,9 +119,8 @@ createScatteringSimulation(std::unique_ptr<MultiLayer> multilayer,
                            const GISASInstrumentItem* instrumentItem,
                            const SimulationOptionsItem& optionsItem)
 {
-    std::unique_ptr<const Instrument> instrument = instrumentItem->createPolInstrument();
-    auto result = std::make_unique<ScatteringSimulation>(
-        instrument->beam(), *multilayer, instrument->detector());
+    std::unique_ptr<ScatteringSimulation> result(
+        instrumentItem->createScatteringSimulation(*multilayer));
 
     addDistributionParametersToSimulation(*instrumentItem->beamItem(), *result);
 
@@ -138,9 +137,8 @@ createOffSpecularSimulation(std::unique_ptr<MultiLayer> multilayer,
                             const OffSpecularInstrumentItem* instrumentItem,
                             const SimulationOptionsItem& optionsItem)
 {
-    std::unique_ptr<const Instrument> instrument = instrumentItem->createPolInstrument();
-    auto result = std::make_unique<OffSpecularSimulation>(
-        instrument->beam(), *multilayer, instrument->detector());
+    std::unique_ptr<OffSpecularSimulation> result(
+        instrumentItem->createOffSpecularSimulation(*multilayer));
 
     auto* beamItem = instrumentItem->beamItem();
     const auto axis = instrumentItem->alphaAxis().createAxis(Units::deg);