diff --git a/Core/Simulation/GISASSimulation.cpp b/Core/Simulation/GISASSimulation.cpp
index e818abb6d01db06ff05c5bd2b55230e8a7ea77af..ec4a277f0736d0f2167bc68a7b4939000ff13edb 100644
--- a/Core/Simulation/GISASSimulation.cpp
+++ b/Core/Simulation/GISASSimulation.cpp
@@ -26,6 +26,13 @@ GISASSimulation::GISASSimulation(const Beam& beam, const MultiLayer& sample,
 {
 }
 
+#ifndef SWIG
+GISASSimulation::GISASSimulation(const Beam& beam, const IDetector& detector)
+    : ISimulation2D(beam, detector)
+{
+}
+#endif // SWIG
+
 GISASSimulation::GISASSimulation()
 {
     initialize();
diff --git a/Core/Simulation/GISASSimulation.h b/Core/Simulation/GISASSimulation.h
index cbecdcd7877e656c1d07ea4dd1a7baabec048e83..071df23111aa630be4200189b525e4025c92f704 100644
--- a/Core/Simulation/GISASSimulation.h
+++ b/Core/Simulation/GISASSimulation.h
@@ -27,6 +27,9 @@ class ISampleBuilder;
 class GISASSimulation : public ISimulation2D {
 public:
     GISASSimulation(const Beam& beam, const MultiLayer& sample, const IDetector& detector);
+#ifndef SWIG
+    GISASSimulation(const Beam& beam, const IDetector& detector);
+#endif // SWIG
     GISASSimulation();
     ~GISASSimulation() {}
 
diff --git a/Core/Simulation/ISimulation.cpp b/Core/Simulation/ISimulation.cpp
index 618b5874d9ad31246ff6a106071f7024d29fd2d6..8dbc85d37bbf86f2754e34acfa38e70286e7102b 100644
--- a/Core/Simulation/ISimulation.cpp
+++ b/Core/Simulation/ISimulation.cpp
@@ -123,6 +123,13 @@ ISimulation::ISimulation(const Beam& beam, const MultiLayer& sample, const IDete
     initialize();
 }
 
+#ifndef SWIG
+ISimulation::ISimulation(const Beam& beam, const IDetector& detector) : m_instrument(beam, detector)
+{
+    initialize();
+}
+#endif // SWIG
+
 ISimulation::ISimulation()
 {
     initialize();
@@ -150,6 +157,14 @@ void ISimulation::initialize()
     registerChild(&m_sample_provider);
 }
 
+#ifndef SWIG
+void ISimulation::setInstrument(const Instrument& instrument_)
+{
+    m_instrument = instrument_;
+    updateIntensityMap();
+}
+#endif // SWIG
+
 //! Initializes a progress monitor that prints to stdout.
 void ISimulation::setTerminalProgressMonitor()
 {
@@ -220,12 +235,6 @@ void ISimulation::runMPISimulation()
     ompi.runSimulation(this);
 }
 
-void ISimulation::setInstrument(const Instrument& instrument_)
-{
-    m_instrument = instrument_;
-    updateIntensityMap();
-}
-
 //! The MultiLayer object will not be owned by the ISimulation object
 void ISimulation::setSample(const MultiLayer& sample)
 {
diff --git a/Core/Simulation/ISimulation.h b/Core/Simulation/ISimulation.h
index 8b278a04c82b9f4c0b65eac314d27b22cec9f791..b7f314ed781d4b64fa5ed98a854bbf5f8e363466 100644
--- a/Core/Simulation/ISimulation.h
+++ b/Core/Simulation/ISimulation.h
@@ -52,7 +52,6 @@ public:
     //! Run a simulation in a MPI environment
     void runMPISimulation();
 
-    void setInstrument(const Instrument& instrument_);
     const Instrument& instrument() const { return m_instrument; }
     Instrument& instrument() { return m_instrument; }
 
@@ -103,6 +102,11 @@ public:
 
     friend class MPISimulation;
 
+#ifndef SWIG
+    ISimulation(const Beam& beam, const IDetector& detector);
+    void setInstrument(const Instrument& instrument_);
+#endif // SWIG
+
 protected:
     ISimulation(const ISimulation& other);
 
diff --git a/Core/Simulation/ISimulation2D.cpp b/Core/Simulation/ISimulation2D.cpp
index 322ba8668c3ac5ff11df1d65ee4fbb49502763d3..44f6bbc62b45831f5dde5f922aaecfa00e6634de 100644
--- a/Core/Simulation/ISimulation2D.cpp
+++ b/Core/Simulation/ISimulation2D.cpp
@@ -24,6 +24,13 @@ ISimulation2D::ISimulation2D(const Beam& beam, const MultiLayer& sample, const I
 {
 }
 
+#ifndef SWIG
+ISimulation2D::ISimulation2D(const Beam& beam, const IDetector& detector)
+    : ISimulation(beam, detector)
+{
+}
+#endif // SWIG
+
 ISimulation2D::ISimulation2D() = default;
 
 ISimulation2D::~ISimulation2D() = default;
diff --git a/Core/Simulation/ISimulation2D.h b/Core/Simulation/ISimulation2D.h
index 3b2b1bbca014864160f1ecc031ca55a19392b311..0d9531aacf4b184f4e22ffaf2c7d2c367f657010 100644
--- a/Core/Simulation/ISimulation2D.h
+++ b/Core/Simulation/ISimulation2D.h
@@ -27,6 +27,9 @@ class DetectorContext;
 class ISimulation2D : public ISimulation {
 public:
     ISimulation2D(const Beam& beam, const MultiLayer& sample, const IDetector& detector);
+#ifndef SWIG
+    ISimulation2D(const Beam& beam, const IDetector& detector);
+#endif // SWIG
     ISimulation2D();
     ~ISimulation2D() override;
 
diff --git a/Tests/Functional/GUI/Translate/GUITranslationTest.cpp b/Tests/Functional/GUI/Translate/GUITranslationTest.cpp
index 08ccaed8c43d8a4f8dda68b1eb5e6f865e78ed9c..0dbd2307e5993398be2c539f5691e061ef3ba576 100644
--- a/Tests/Functional/GUI/Translate/GUITranslationTest.cpp
+++ b/Tests/Functional/GUI/Translate/GUITranslationTest.cpp
@@ -126,13 +126,13 @@ bool GUITranslationTest::runTest()
     std::cout << translationResultsToString() << std::endl;
 
     if (!checkExistingTranslations()) {
-        std::cout << "GUITranslationTest::checkExistingTranslations failed: "
-                  << m_simulationName << " " << m_sampleName << std::endl;
+        std::cout << "GUITranslationTest::checkExistingTranslations failed: " << m_simulationName
+                  << " " << m_sampleName << std::endl;
         return false;
     }
     if (!checkMissedTranslations()) {
-        std::cout << "GUITranslationTest::checkMissedTranslations failed: "
-                  << m_simulationName << " " << m_sampleName << std::endl;
+        std::cout << "GUITranslationTest::checkMissedTranslations failed: " << m_simulationName
+                  << " " << m_sampleName << std::endl;
         return false;
     }
     return true;
diff --git a/auto/Wrap/doxygenCore.i b/auto/Wrap/doxygenCore.i
index 2a2f3c967dafe774cffb3416ba844630a2b7f5e2..57fb95c8e1833d1f4048a7dab83f625f12f9bdd3 100644
--- a/auto/Wrap/doxygenCore.i
+++ b/auto/Wrap/doxygenCore.i
@@ -771,6 +771,9 @@ C++ includes: GISASSimulation.h
 %feature("docstring")  GISASSimulation::GISASSimulation "GISASSimulation::GISASSimulation(const Beam &beam, const MultiLayer &sample, const IDetector &detector)
 ";
 
+%feature("docstring")  GISASSimulation::GISASSimulation "GISASSimulation::GISASSimulation(const Beam &beam, const IDetector &detector)
+";
+
 %feature("docstring")  GISASSimulation::GISASSimulation "GISASSimulation::GISASSimulation()
 ";
 
@@ -1004,9 +1007,6 @@ Run simulation with possible averaging over parameter distributions.
 Run a simulation in a MPI environment. 
 ";
 
-%feature("docstring")  ISimulation::setInstrument "void ISimulation::setInstrument(const Instrument &instrument_)
-";
-
 %feature("docstring")  ISimulation::instrument "const Instrument& ISimulation::instrument() const
 ";
 
@@ -1094,6 +1094,12 @@ Initializes a progress monitor that prints to stdout.
 Convert user data to SimulationResult object for later drawing in various axes units. User data will be cropped to the ROI defined in the simulation, amplitudes in areas corresponding to the masked areas of the detector will be set to zero. 
 ";
 
+%feature("docstring")  ISimulation::ISimulation "ISimulation::ISimulation(const Beam &beam, const IDetector &detector)
+";
+
+%feature("docstring")  ISimulation::setInstrument "void ISimulation::setInstrument(const Instrument &instrument_)
+";
+
 
 // File: classISimulation2D.xml
 %feature("docstring") ISimulation2D "
@@ -1106,6 +1112,9 @@ C++ includes: ISimulation2D.h
 %feature("docstring")  ISimulation2D::ISimulation2D "ISimulation2D::ISimulation2D(const Beam &beam, const MultiLayer &sample, const IDetector &detector)
 ";
 
+%feature("docstring")  ISimulation2D::ISimulation2D "ISimulation2D::ISimulation2D(const Beam &beam, const IDetector &detector)
+";
+
 %feature("docstring")  ISimulation2D::ISimulation2D "ISimulation2D::ISimulation2D()
 ";
 
diff --git a/auto/Wrap/libBornAgainCore.py b/auto/Wrap/libBornAgainCore.py
index d3a58baa64beff39bc098cbeaa051ac290505ebb..5ca93f77cbd519bd5b0a513cb9713730e9c7f1ae 100644
--- a/auto/Wrap/libBornAgainCore.py
+++ b/auto/Wrap/libBornAgainCore.py
@@ -3519,14 +3519,6 @@ class ISimulation(libBornAgainBase.ICloneable, libBornAgainParam.INode):
         """
         return _libBornAgainCore.ISimulation_runMPISimulation(self)
 
-    def setInstrument(self, instrument_):
-        r"""
-        setInstrument(ISimulation self, Instrument const & instrument_)
-        void ISimulation::setInstrument(const Instrument &instrument_)
-
-        """
-        return _libBornAgainCore.ISimulation_setInstrument(self, instrument_)
-
     def instrument(self, *args):
         r"""
         instrument(ISimulation self) -> Instrument const
diff --git a/auto/Wrap/libBornAgainCore_wrap.cpp b/auto/Wrap/libBornAgainCore_wrap.cpp
index ae87a6c4ce4a752f94043a257d5a53163de6e372..ac0b1ad27f42cac5493e4b09aefc3a519ca80226 100644
--- a/auto/Wrap/libBornAgainCore_wrap.cpp
+++ b/auto/Wrap/libBornAgainCore_wrap.cpp
@@ -38864,38 +38864,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_ISimulation_setInstrument(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  ISimulation *arg1 = (ISimulation *) 0 ;
-  Instrument *arg2 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "ISimulation_setInstrument", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ISimulation, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISimulation_setInstrument" "', argument " "1"" of type '" "ISimulation *""'"); 
-  }
-  arg1 = reinterpret_cast< ISimulation * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Instrument,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISimulation_setInstrument" "', argument " "2"" of type '" "Instrument const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ISimulation_setInstrument" "', argument " "2"" of type '" "Instrument const &""'"); 
-  }
-  arg2 = reinterpret_cast< Instrument * >(argp2);
-  (arg1)->setInstrument((Instrument const &)*arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_ISimulation_instrument__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   ISimulation *arg1 = (ISimulation *) 0 ;
@@ -44647,11 +44615,6 @@ static PyMethodDef SwigMethods[] = {
 		"Run a simulation in a MPI environment. \n"
 		"\n"
 		""},
-	 { "ISimulation_setInstrument", _wrap_ISimulation_setInstrument, METH_VARARGS, "\n"
-		"ISimulation_setInstrument(ISimulation self, Instrument const & instrument_)\n"
-		"void ISimulation::setInstrument(const Instrument &instrument_)\n"
-		"\n"
-		""},
 	 { "ISimulation_instrument", _wrap_ISimulation_instrument, METH_VARARGS, "\n"
 		"ISimulation_instrument(ISimulation self) -> Instrument const\n"
 		"ISimulation_instrument(ISimulation self) -> Instrument &\n"