diff --git a/Device/Detector/IDetector.h b/Device/Detector/IDetector.h
index 24d3d5d8df6a31fea0cf208455a214033f2e600f..c6b71924ae2200af10a404b68e88a35b436c5a85 100644
--- a/Device/Detector/IDetector.h
+++ b/Device/Detector/IDetector.h
@@ -95,7 +95,7 @@ public:
     createDetectorIntensity(const std::vector<SimulationElement>& elements) const;
 
     //! Return default axes units
-    virtual Axes::Units defaultAxesUnits() const { return Axes::Units::DEFAULT; }
+    virtual Axes::Units defaultAxesUnits() const = 0;
 
     //! Returns number of simulation elements.
     size_t numberOfSimulationElements() const;
diff --git a/Device/Detector/RectangularDetector.cpp b/Device/Detector/RectangularDetector.cpp
index e5df3ededff6182d0292c4afb24cd59c920fcdc5..517ffed8a0ba9d1fa0937e1ef318aad287596f3a 100644
--- a/Device/Detector/RectangularDetector.cpp
+++ b/Device/Detector/RectangularDetector.cpp
@@ -161,11 +161,6 @@ RectangularDetector::EDetectorArrangement RectangularDetector::getDetectorArrang
     return m_detector_arrangement;
 }
 
-Axes::Units RectangularDetector::defaultAxesUnits() const
-{
-    return Axes::Units::MM;
-}
-
 RectangularPixel* RectangularDetector::regionOfInterestPixel() const
 {
     const IAxis& u_axis = axis(0);
diff --git a/Device/Detector/RectangularDetector.h b/Device/Detector/RectangularDetector.h
index c21c912ea625f7de20752be1a3c5a7613b2175be..774af2c4779c505c4a4489c0a94527186756bfc1 100644
--- a/Device/Detector/RectangularDetector.h
+++ b/Device/Detector/RectangularDetector.h
@@ -73,7 +73,7 @@ public:
     EDetectorArrangement getDetectorArrangment() const;
 
     //! return default axes units
-    Axes::Units defaultAxesUnits() const override;
+    virtual Axes::Units defaultAxesUnits() const final { return Axes::Units::MM; }
 
     RectangularPixel* regionOfInterestPixel() const;
 
diff --git a/Device/Detector/SpecularDetector1D.cpp b/Device/Detector/SpecularDetector1D.cpp
index 9ed6713ce6e22e2cef12b1d5537a0dfc57d32c5a..1fc74af3801acdad13d07ddd5e86e4beee76c353 100644
--- a/Device/Detector/SpecularDetector1D.cpp
+++ b/Device/Detector/SpecularDetector1D.cpp
@@ -37,11 +37,6 @@ SpecularDetector1D* SpecularDetector1D::clone() const
     return new SpecularDetector1D(*this);
 }
 
-Axes::Units SpecularDetector1D::defaultAxesUnits() const
-{
-    return Axes::Units::RADIANS;
-}
-
 std::string SpecularDetector1D::axisName(size_t index) const
 {
     if (index == 0) {
diff --git a/Device/Detector/SpecularDetector1D.h b/Device/Detector/SpecularDetector1D.h
index 353cb8ab0476fd4dbbd2b1a46f4daa02c6f25863..09501594e1010f2cc9b8eb4c8bd7bfb737301244 100644
--- a/Device/Detector/SpecularDetector1D.h
+++ b/Device/Detector/SpecularDetector1D.h
@@ -49,7 +49,8 @@ public:
     void setAxis(const IAxis& axis);
 
     //! Return default axes units
-    Axes::Units defaultAxesUnits() const override;
+    virtual Axes::Units defaultAxesUnits() const final { return Axes::Units::RADIANS; }
+
 
 protected:
     SpecularDetector1D(const SpecularDetector1D& other);
diff --git a/Device/Detector/SphericalDetector.cpp b/Device/Detector/SphericalDetector.cpp
index 6c4803f6529c021c2a1cf36ea2460b1742ce22f2..a1686167e80ca8e2f846670ec3e6cf4e961819c5 100644
--- a/Device/Detector/SphericalDetector.cpp
+++ b/Device/Detector/SphericalDetector.cpp
@@ -48,11 +48,6 @@ SphericalDetector* SphericalDetector::clone() const
     return new SphericalDetector(*this);
 }
 
-Axes::Units SphericalDetector::defaultAxesUnits() const
-{
-    return Axes::Units::RADIANS;
-}
-
 IPixel* SphericalDetector::createPixel(size_t index) const
 {
     const IAxis& phi_axis = axis(0);
diff --git a/Device/Detector/SphericalDetector.h b/Device/Detector/SphericalDetector.h
index f31460c4cbb551f8925db6cdcea9a5ed4c7f4490..52eef2a455a44a3315c65690c102baf208d3fd71 100644
--- a/Device/Detector/SphericalDetector.h
+++ b/Device/Detector/SphericalDetector.h
@@ -53,7 +53,7 @@ public:
     ~SphericalDetector() override {}
 
     //! return default axes units
-    Axes::Units defaultAxesUnits() const override;
+    virtual Axes::Units defaultAxesUnits() const final { return Axes::Units::RADIANS; }
 
 protected:
     //! Creates an IPixel for the given OutputData object and index
diff --git a/auto/Wrap/doxygenDevice.i b/auto/Wrap/doxygenDevice.i
index 2d46df823e663944afd8625b93c9e953a84c2c1a..ef9fd2fa7afca16cbf8ae7186d5f4ae37b2ace38 100644
--- a/auto/Wrap/doxygenDevice.i
+++ b/auto/Wrap/doxygenDevice.i
@@ -881,7 +881,7 @@ Returns detection properties.
 Returns new intensity map with resolution applied, and cropped to ROI if applicable. 
 ";
 
-%feature("docstring")  IDetector::defaultAxesUnits "virtual Axes::Units IDetector::defaultAxesUnits() const
+%feature("docstring")  IDetector::defaultAxesUnits "virtual Axes::Units IDetector::defaultAxesUnits() const =0
 
 Return default axes units. 
 ";
@@ -2263,7 +2263,7 @@ Inits detector with the beam settings.
 %feature("docstring")  RectangularDetector::getDetectorArrangment "RectangularDetector::EDetectorArrangement RectangularDetector::getDetectorArrangment() const
 ";
 
-%feature("docstring")  RectangularDetector::defaultAxesUnits "Axes::Units RectangularDetector::defaultAxesUnits() const override
+%feature("docstring")  RectangularDetector::defaultAxesUnits "virtual Axes::Units RectangularDetector::defaultAxesUnits() const final
 
 return default axes units 
 ";
@@ -2577,7 +2577,7 @@ Resets region of interest making whole detector plane available for the simulati
 %feature("docstring")  SpecularDetector1D::setAxis "void SpecularDetector1D::setAxis(const IAxis &axis)
 ";
 
-%feature("docstring")  SpecularDetector1D::defaultAxesUnits "Axes::Units SpecularDetector1D::defaultAxesUnits() const override
+%feature("docstring")  SpecularDetector1D::defaultAxesUnits "virtual Axes::Units SpecularDetector1D::defaultAxesUnits() const final
 
 Return default axes units. 
 ";
@@ -2678,7 +2678,7 @@ central alpha angle
 %feature("docstring")  SphericalDetector::~SphericalDetector "SphericalDetector::~SphericalDetector() override
 ";
 
-%feature("docstring")  SphericalDetector::defaultAxesUnits "Axes::Units SphericalDetector::defaultAxesUnits() const override
+%feature("docstring")  SphericalDetector::defaultAxesUnits "virtual Axes::Units SphericalDetector::defaultAxesUnits() const final
 
 return default axes units 
 ";
diff --git a/auto/Wrap/libBornAgainDevice.py b/auto/Wrap/libBornAgainDevice.py
index 8fc149e36b3e022b61ecc2449620f8d1ad5678e9..cb2f32659e3421658a0807af7a3d2fe3564ae2e6 100644
--- a/auto/Wrap/libBornAgainDevice.py
+++ b/auto/Wrap/libBornAgainDevice.py
@@ -4037,7 +4037,7 @@ class IDetector(libBornAgainBase.ICloneable, libBornAgainParam.INode):
     def defaultAxesUnits(self):
         r"""
         defaultAxesUnits(IDetector self) -> Axes::Units
-        virtual Axes::Units IDetector::defaultAxesUnits() const
+        virtual Axes::Units IDetector::defaultAxesUnits() const =0
 
         Return default axes units. 
 
@@ -4402,7 +4402,7 @@ class RectangularDetector(IDetector2D):
     def defaultAxesUnits(self):
         r"""
         defaultAxesUnits(RectangularDetector self) -> Axes::Units
-        Axes::Units RectangularDetector::defaultAxesUnits() const override
+        virtual Axes::Units RectangularDetector::defaultAxesUnits() const final
 
         return default axes units 
 
@@ -4464,7 +4464,7 @@ class SphericalDetector(IDetector2D):
     def defaultAxesUnits(self):
         r"""
         defaultAxesUnits(SphericalDetector self) -> Axes::Units
-        Axes::Units SphericalDetector::defaultAxesUnits() const override
+        virtual Axes::Units SphericalDetector::defaultAxesUnits() const final
 
         return default axes units 
 
diff --git a/auto/Wrap/libBornAgainDevice_wrap.cpp b/auto/Wrap/libBornAgainDevice_wrap.cpp
index e73747c2a4b81d9a4ce654dc5d01f8c67d576593..a88ac3eff81d09d820cef18304bdb45eb64d37a4 100644
--- a/auto/Wrap/libBornAgainDevice_wrap.cpp
+++ b/auto/Wrap/libBornAgainDevice_wrap.cpp
@@ -45206,7 +45206,7 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "IDetector_defaultAxesUnits", _wrap_IDetector_defaultAxesUnits, METH_O, "\n"
 		"IDetector_defaultAxesUnits(IDetector self) -> Axes::Units\n"
-		"virtual Axes::Units IDetector::defaultAxesUnits() const\n"
+		"virtual Axes::Units IDetector::defaultAxesUnits() const =0\n"
 		"\n"
 		"Return default axes units. \n"
 		"\n"
@@ -45431,7 +45431,7 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "RectangularDetector_defaultAxesUnits", _wrap_RectangularDetector_defaultAxesUnits, METH_O, "\n"
 		"RectangularDetector_defaultAxesUnits(RectangularDetector self) -> Axes::Units\n"
-		"Axes::Units RectangularDetector::defaultAxesUnits() const override\n"
+		"virtual Axes::Units RectangularDetector::defaultAxesUnits() const final\n"
 		"\n"
 		"return default axes units \n"
 		"\n"
@@ -45468,7 +45468,7 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "SphericalDetector_defaultAxesUnits", _wrap_SphericalDetector_defaultAxesUnits, METH_O, "\n"
 		"SphericalDetector_defaultAxesUnits(SphericalDetector self) -> Axes::Units\n"
-		"Axes::Units SphericalDetector::defaultAxesUnits() const override\n"
+		"virtual Axes::Units SphericalDetector::defaultAxesUnits() const final\n"
 		"\n"
 		"return default axes units \n"
 		"\n"