diff --git a/Base/Types/Span.h b/Base/Types/Span.h
index 30c35d2a69c5ffe49ca97e54ae3eaae53a80d628..5b0c15ccf40053b5d4e9b4a76e0539024cb46422 100644
--- a/Base/Types/Span.h
+++ b/Base/Types/Span.h
@@ -21,7 +21,6 @@
 
 //! An interval. Limits are of type double, and may be infinite.
 //! Used for the z-coordinate, especially when slicing form factors.
-//!
 
 class Span {
 public:
diff --git a/Device/Coord/CoordSystem1D.cpp b/Device/Coord/CoordSystem1D.cpp
index 31507318ec2e7863ab76dfc7297e2c5b481383ba..2ab2aa4c359f031593411d0e16762bfb2d802b74 100644
--- a/Device/Coord/CoordSystem1D.cpp
+++ b/Device/Coord/CoordSystem1D.cpp
@@ -77,18 +77,17 @@ double CoordSystem1D::calculateMin(size_t i_axis, Coords units) const
     if (units == Coords::NBINS)
         return 0.0;
     auto translator = getTraslatorTo(units);
-    return translator(coordinateAxis()->binCenter(0));
+    return translator(m_axes[0]->binCenter(0));
 }
 
 double CoordSystem1D::calculateMax(size_t i_axis, Coords units) const
 {
     ASSERT(i_axis == 0);
     units = substituteDefaultUnits(units);
-    const IAxis* const coordinate_axis = coordinateAxis();
     if (units == Coords::NBINS)
-        return static_cast<double>(coordinate_axis->size());
+        return static_cast<double>(m_axes[0]->size());
     auto translator = getTraslatorTo(units);
-    return translator(coordinate_axis->binCenter(coordinate_axis->size() - 1));
+    return translator(m_axes[0]->binCenter(m_axes[0]->size() - 1));
 }
 
 IAxis* CoordSystem1D::createConvertedAxis(size_t i_axis, Coords units) const
@@ -96,11 +95,11 @@ IAxis* CoordSystem1D::createConvertedAxis(size_t i_axis, Coords units) const
     ASSERT(i_axis == 0);
     units = substituteDefaultUnits(units);
     if (units == Coords::NBINS)
-        return new FixedBinAxis(nameOfAxis(0, units), coordinateAxis()->size(),
-                                calculateMin(0, units), calculateMax(0, units));
+        return new FixedBinAxis(nameOfAxis(0, units), m_axes[0]->size(), calculateMin(0, units),
+                                calculateMax(0, units));
 
     std::function<double(double)> translator = getTraslatorTo(units);
-    auto coords = coordinateAxis()->binCenters();
+    auto coords = m_axes[0]->binCenters();
     for (size_t i = 0, size = coords.size(); i < size; ++i)
         coords[i] = translator(coords[i]);
     return new PointwiseAxis(nameOfAxis(0, units), coords);
@@ -194,7 +193,7 @@ WavenumberReflectometryCoords::WavenumberReflectometryCoords(const IAxis* axis)
 
 WavenumberReflectometryCoords::WavenumberReflectometryCoords(
     const WavenumberReflectometryCoords& other)
-    : CoordSystem1D(other.coordinateAxis()->clone())
+    : CoordSystem1D(other.m_axes[0]->clone())
 {
 }
 
diff --git a/Device/Coord/CoordSystem1D.h b/Device/Coord/CoordSystem1D.h
index bb0683573e7229a31a4cd44c742133673f67331c..cf2801ad565a06d6948bee8d7bb58f7802c8c7a2 100644
--- a/Device/Coord/CoordSystem1D.h
+++ b/Device/Coord/CoordSystem1D.h
@@ -40,11 +40,9 @@ public:
     //! Calculates maximum on-axis value in given units.
     double calculateMax(size_t i_axis, Coords units) const override;
 
-protected:
+private:
     //! Returns translating functional (rads --> output units)
     virtual std::function<double(double)> getTraslatorTo(Coords units) const = 0;
-
-    const IAxis* coordinateAxis() const { return m_axes[0]; }
 };
 
 
@@ -59,13 +57,13 @@ public:
     AngularReflectometryCoords* clone() const override;
 
     static std::vector<Coords> availableUnits0();
-    static std::string nameOfAxis0(Coords units = Coords::UNDEFINED);
+    static std::string nameOfAxis0(Coords units);
 
 private:
     //! Returns the list of all available units
     std::vector<Coords> availableUnits() const override;
 
-    std::string nameOfAxis(size_t i_axis, Coords units = Coords::UNDEFINED) const override;
+    std::string nameOfAxis(size_t i_axis, Coords units) const override;
 
     //! Returns default units to convert to.
     Coords defaultUnits() const override { return Coords::DEGREES; }
@@ -91,7 +89,7 @@ private:
     //! Returns the list of all available units
     std::vector<Coords> availableUnits() const override;
 
-    std::string nameOfAxis(size_t i_axis, Coords units = Coords::UNDEFINED) const override;
+    std::string nameOfAxis(size_t i_axis, Coords units) const override;
 
     //! Returns default units to convert to.
     Coords defaultUnits() const override { return Coords::QSPACE; }
diff --git a/Device/Coord/CoordSystem2D.h b/Device/Coord/CoordSystem2D.h
index db54697dee849df1c074041ffb74a591325b5ae7..2efa41ebb96b88bb627b64a163f5a7bc2e5602bf 100644
--- a/Device/Coord/CoordSystem2D.h
+++ b/Device/Coord/CoordSystem2D.h
@@ -63,7 +63,7 @@ private:
 
     Coords defaultUnits() const override { return Coords::DEGREES; }
 
-    std::string nameOfAxis(size_t i_axis, Coords units = Coords::UNDEFINED) const override;
+    std::string nameOfAxis(size_t i_axis, Coords units) const override;
 
     SphericalCoords(const SphericalCoords& other); //!< used by clone()
     double calculateValue(size_t i_axis, Coords units, double value) const override;
@@ -87,7 +87,7 @@ private:
 
     Coords defaultUnits() const override { return Coords::MM; }
 
-    std::string nameOfAxis(size_t i_axis, Coords units = Coords::UNDEFINED) const override;
+    std::string nameOfAxis(size_t i_axis, Coords units) const override;
 
     ImageCoords(const ImageCoords& other); //!< used by clone()
     double calculateValue(size_t i_axis, Coords units, double value) const override;
@@ -110,7 +110,7 @@ public:
 private:
     Coords defaultUnits() const override { return Coords::DEGREES; }
 
-    std::string nameOfAxis(size_t i_axis, Coords units = Coords::UNDEFINED) const override;
+    std::string nameOfAxis(size_t i_axis, Coords units) const override;
 
     OffspecCoords(const OffspecCoords& other); //!< used by clone()
     double calculateValue(size_t i_axis, Coords units, double value) const override;
@@ -132,7 +132,7 @@ private:
 
     Coords defaultUnits() const override { return Coords::DEGREES; }
 
-    std::string nameOfAxis(size_t i_axis, Coords units = Coords::UNDEFINED) const override;
+    std::string nameOfAxis(size_t i_axis, Coords units) const override;
 
     DepthprobeCoords(const DepthprobeCoords& other); //!< used by clone()
     double calculateValue(size_t, Coords units, double value) const override;
diff --git a/Device/Coord/ICoordSystem.h b/Device/Coord/ICoordSystem.h
index faca5fb9f26d2eaa4002458ec9242da6dca3833a..ab60b488088e2b8db7241c19ec24b7ec6155893a 100644
--- a/Device/Coord/ICoordSystem.h
+++ b/Device/Coord/ICoordSystem.h
@@ -48,7 +48,7 @@ public:
     virtual double calculateMin(size_t i_axis, Coords units) const = 0;
     virtual double calculateMax(size_t i_axis, Coords units) const = 0;
 
-    virtual std::string nameOfAxis(size_t i_axis, Coords units = Coords::UNDEFINED) const = 0;
+    virtual std::string nameOfAxis(size_t i_axis, Coords units) const = 0;
 
     virtual std::vector<Coords> availableUnits() const = 0;
     virtual Coords defaultUnits() const = 0;
diff --git a/GUI/Model/FromCore/ItemizeSimulation.cpp b/GUI/Model/FromCore/ItemizeSimulation.cpp
index 71246653f02c4788d95eaf97deb374c709cbb372..c04bc5520912b981f203362f543ea3c7a404ec23 100644
--- a/GUI/Model/FromCore/ItemizeSimulation.cpp
+++ b/GUI/Model/FromCore/ItemizeSimulation.cpp
@@ -361,9 +361,8 @@ OffspecInstrumentItem* createOffspecInstrumentItem(const OffspecSimulation& simu
 {
     auto* result = new OffspecInstrumentItem();
 
-    ScanItem* scan_item = result->scanItem();
-    const IBeamScan* scan = &simulation.scan();
-    scan_item->setScan(scan);
+    const IBeamScan* scan = simulation.scan();
+    result->scanItem()->setScan(scan);
 
     const OffspecDetector& detector = simulation.detector();
     OffspecDetectorItem* detectorItem = result->detectorItem();
@@ -390,15 +389,14 @@ SpecularInstrumentItem* createSpecularInstrumentItem(const SpecularSimulation& s
 {
     auto* result = new SpecularInstrumentItem();
 
-    ScanItem* scan_item = result->scanItem();
     const IBeamScan* scan = simulation.scan();
-    scan_item->setScan(scan);
+    result->scanItem()->setScan(scan);
 
     if (const auto* s2 = dynamic_cast<const AlphaScan*>(scan)) {
         if (const IDistribution1D* distribution = s2->wavelengthDistribution())
-            addDistributionToItem(scan_item->wavelengthItem(), distribution);
+            addDistributionToItem(result->scanItem()->wavelengthItem(), distribution);
         if (const IDistribution1D* distribution = s2->angleDistribution())
-            addDistributionToItem(scan_item->grazingScanItem(), distribution);
+            addDistributionToItem(result->scanItem()->grazingScanItem(), distribution);
     }
     return result;
 }
diff --git a/Sim/Export/SimulationToPython.cpp b/Sim/Export/SimulationToPython.cpp
index 675846b4a55335337af5e2051a16e6ef113aca9f..2a4f93b415814203c6706e0df37aa16f98aabc3c 100644
--- a/Sim/Export/SimulationToPython.cpp
+++ b/Sim/Export/SimulationToPython.cpp
@@ -366,7 +366,7 @@ std::string defineOffspecSimulation(const OffspecSimulation& simulation)
 {
     std::ostringstream result;
 
-    result << defineBeamScan(simulation.scan());
+    result << defineBeamScan(*simulation.scan());
 
     const OffspecDetector& detector = simulation.detector();
     result << std::setprecision(12);
diff --git a/Sim/Simulation/DepthprobeSimulation.cpp b/Sim/Simulation/DepthprobeSimulation.cpp
index 7698ff4153f9b6cb8bc0f8362a164bdc43e2f9bb..1bff14290a395eeac778ad8eaf94492f105c8ce5 100644
--- a/Sim/Simulation/DepthprobeSimulation.cpp
+++ b/Sim/Simulation/DepthprobeSimulation.cpp
@@ -94,7 +94,7 @@ void DepthprobeSimulation::runComputation(const ReSample& re_sample, size_t i, d
     std::valarray<double> intensities; //!< simulated intensity for given z positions
     intensities.resize(n_z, 0.0);
 
-    const double result_angle = m_scan->coordinateAxis()->bin(i).center() + m_scan->alphaOffset();
+    const double result_angle = m_scan->coordinateAxis()->binCenter(i) + m_scan->alphaOffset();
     if (0 < result_angle && result_angle < M_PI_2) {
         const size_t n_layers = re_sample.numberOfSlices();
         size_t start_z_ind = n_z;
diff --git a/Sim/Simulation/DepthprobeSimulation.h b/Sim/Simulation/DepthprobeSimulation.h
index 837ebc9eb917132c62fc3d74da65cfb3ddfa7793..01e000ba7039a168a4324375c8b906d8cab80a4b 100644
--- a/Sim/Simulation/DepthprobeSimulation.h
+++ b/Sim/Simulation/DepthprobeSimulation.h
@@ -46,9 +46,9 @@ public:
 
 #ifndef SWIG
 
-    const AlphaScan& scan() const
+    const AlphaScan* scan() const
     {
-        return *m_scan;
+        return m_scan.get();
     }
 
     const ICoordSystem* simCoordSystem() const override;
diff --git a/Sim/Simulation/OffspecSimulation.h b/Sim/Simulation/OffspecSimulation.h
index 3f05b11f6c5a1bd83a19e100413f4fbeb67d0548..df59a22297d909f27a28a07887064920f5fdfd0f 100644
--- a/Sim/Simulation/OffspecSimulation.h
+++ b/Sim/Simulation/OffspecSimulation.h
@@ -36,19 +36,14 @@ public:
 
     std::string className() const final { return "OffspecSimulation"; }
 
-    OffspecDetector& detector() { return *m_detector; }
 #ifndef SWIG
     const ICoordSystem* simCoordSystem() const override;
 
     std::vector<const INode*> nodeChildren() const override;
 
-    IBeamScan& scan()
+    const IBeamScan* scan() const
     {
-        return *m_scan;
-    }
-    const IBeamScan& scan() const
-    {
-        return *m_scan;
+        return m_scan.get();
     }
     const OffspecDetector& detector() const
     {
diff --git a/Tests/Unit/Sim/CoordSystem1DTest.cpp b/Tests/Unit/Sim/CoordSystem1DTest.cpp
index bc5e04853e8d8c188390843b1fca590b610bc415..4204d7599cab8c60c714a3a434b51a98d0467c96 100644
--- a/Tests/Unit/Sim/CoordSystem1DTest.cpp
+++ b/Tests/Unit/Sim/CoordSystem1DTest.cpp
@@ -10,26 +10,17 @@
 
 class CoordSystem1DTest : public ::testing::Test {
 public:
-    CoordSystem1DTest();
-
     double getQ(double angle) { return 4.0 * M_PI * std::sin(angle) / m_wavelength; }
 
 protected:
     void checkConventionalConverter(const CoordSystem1D& test_object);
     void checkQSpecConverter(const CoordSystem1D& test_object);
-    FixedBinAxis m_axis;
-    FixedBinAxis m_q_axis;
-    QzScan m_qscan;
+    FixedBinAxis m_axis{"Angles", 5, 0.5, 1.0};
+    FixedBinAxis m_q_axis{"Q values", 5, 0.0, 1.0};
+    QzScan m_qscan{m_q_axis};
     double m_wavelength{1.};
 };
 
-CoordSystem1DTest::CoordSystem1DTest()
-    : m_axis("Angles", 5, 0.5, 1.0)     // angles in radians
-    , m_q_axis("Q values", 5, 0.0, 1.0) // q axis in inv. nm
-    , m_qscan(m_q_axis)
-{
-}
-
 void CoordSystem1DTest::checkConventionalConverter(const CoordSystem1D& test_object)
 {
     double expected_min = m_axis.binCenter(0);
diff --git a/auto/Wrap/libBornAgainSim.py b/auto/Wrap/libBornAgainSim.py
index f7ef1cb82c46ef9ecf961c6e94d7655b34599948..54c85365fb217f6650866d3316ffc9c92c291361 100644
--- a/auto/Wrap/libBornAgainSim.py
+++ b/auto/Wrap/libBornAgainSim.py
@@ -2775,10 +2775,6 @@ class OffspecSimulation(ISimulation):
         r"""className(OffspecSimulation self) -> std::string"""
         return _libBornAgainSim.OffspecSimulation_className(self)
 
-    def detector(self):
-        r"""detector(OffspecSimulation self) -> OffspecDetector &"""
-        return _libBornAgainSim.OffspecSimulation_detector(self)
-
 # Register OffspecSimulation in _libBornAgainSim:
 _libBornAgainSim.OffspecSimulation_swigregister(OffspecSimulation)
 class IBackground(libBornAgainBase.ICloneable, libBornAgainParam.INode):
diff --git a/auto/Wrap/libBornAgainSim_wrap.cpp b/auto/Wrap/libBornAgainSim_wrap.cpp
index d78f0377b60edc47576c7094789d26edf9941c03..b00b37eca663d70430db79cd403dbe4bed977376 100644
--- a/auto/Wrap/libBornAgainSim_wrap.cpp
+++ b/auto/Wrap/libBornAgainSim_wrap.cpp
@@ -33875,29 +33875,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_OffspecSimulation_detector(PyObject *self, PyObject *args) {
-  PyObject *resultobj = 0;
-  OffspecSimulation *arg1 = (OffspecSimulation *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  OffspecDetector *result = 0 ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_OffspecSimulation, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OffspecSimulation_detector" "', argument " "1"" of type '" "OffspecSimulation *""'"); 
-  }
-  arg1 = reinterpret_cast< OffspecSimulation * >(argp1);
-  result = (OffspecDetector *) &(arg1)->detector();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OffspecDetector, 0 |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *OffspecSimulation_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
@@ -36362,7 +36339,6 @@ static PyMethodDef SwigMethods[] = {
 	 { "new_OffspecSimulation", _wrap_new_OffspecSimulation, METH_VARARGS, "new_OffspecSimulation(IBeamScan 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_detector", _wrap_OffspecSimulation_detector, METH_O, "OffspecSimulation_detector(OffspecSimulation self) -> OffspecDetector &"},
 	 { "OffspecSimulation_swigregister", OffspecSimulation_swigregister, METH_O, NULL},
 	 { "OffspecSimulation_swiginit", OffspecSimulation_swiginit, METH_VARARGS, NULL},
 	 { "delete_IBackground", _wrap_delete_IBackground, METH_O, "delete_IBackground(IBackground self)"},