diff --git a/Device/Unit/IUnitConverter.h b/Device/Unit/IUnitConverter.h
index 89099fc6fede9e662a97892cb6650707419a237b..fb5a5f270844302921222a0f1d1eaacc8aaff458 100644
--- a/Device/Unit/IUnitConverter.h
+++ b/Device/Unit/IUnitConverter.h
@@ -12,6 +12,10 @@
 //
 //  ************************************************************************************************
 
+#ifdef SWIG
+#error no need to expose this header to Swig
+#endif
+
 #ifndef BORNAGAIN_DEVICE_UNIT_IUNITCONVERTER_H
 #define BORNAGAIN_DEVICE_UNIT_IUNITCONVERTER_H
 
diff --git a/Wrap/Swig/libBornAgainDevice.i b/Wrap/Swig/libBornAgainDevice.i
index 16b8fa063cad9abbb10a186d45e0ca0b98d584b1..923049f85a2827cfbe6509f9da04b04551d06d7d 100644
--- a/Wrap/Swig/libBornAgainDevice.i
+++ b/Wrap/Swig/libBornAgainDevice.i
@@ -98,7 +98,7 @@
 %include "Device/Resolution/ResolutionFunction2DGaussian.h"
 %include "Device/Resolution/ScanResolution.h"
 
-%include "Device/Unit/IUnitConverter.h"
+%include "Device/Unit/Axes.h"
 
 %include "Device/Detector/DetectorMask.h"
 %include "Device/Detector/IDetector.h"
diff --git a/auto/Wrap/libBornAgainDevice.py b/auto/Wrap/libBornAgainDevice.py
index 496107992c9657d27fecc17cfa8870f5727613b8..b4d47804d77e7b34cc03e22faba5e637078e8a04 100644
--- a/auto/Wrap/libBornAgainDevice.py
+++ b/auto/Wrap/libBornAgainDevice.py
@@ -3675,102 +3675,50 @@ def ScanResolution_scanAbsoluteResolution(*args):
     """
     return _libBornAgainDevice.ScanResolution_scanAbsoluteResolution(*args)
 
-class IUnitConverter(libBornAgainBase.ICloneable):
+class Axes(object):
     r"""
 
 
-    Interface to provide axis translations to different units for simulation output.
+    Wrapper for detector axes units, required for a better representation of detector axes units in python
 
-    Child classes are currently declared in
-     Device/Detector/SimpleUnitConverters.h,
-
-    Core/Scan/UnitConverter1D.h.
-
-    C++ includes: IUnitConverter.h
+    C++ includes: Axes.h
 
     """
 
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
-
-    def __init__(self, *args, **kwargs):
-        raise AttributeError("No constructor defined - class is abstract")
     __repr__ = _swig_repr
-    __swig_destroy__ = _libBornAgainDevice.delete_IUnitConverter
-
-    def clone(self):
-        r"""
-        clone(IUnitConverter self) -> IUnitConverter
-        virtual IUnitConverter* IUnitConverter::clone() const =0
-
-        """
-        return _libBornAgainDevice.IUnitConverter_clone(self)
-
-    def dimension(self):
-        r"""
-        dimension(IUnitConverter self) -> size_t
-        virtual size_t IUnitConverter::dimension() const =0
-
-        """
-        return _libBornAgainDevice.IUnitConverter_dimension(self)
-
-    def calculateMin(self, i_axis, units_type):
-        r"""
-        calculateMin(IUnitConverter self, size_t i_axis, Axes::Units units_type) -> double
-        virtual double IUnitConverter::calculateMin(size_t i_axis, Axes::Units units_type) const =0
-
-        """
-        return _libBornAgainDevice.IUnitConverter_calculateMin(self, i_axis, units_type)
-
-    def calculateMax(self, i_axis, units_type):
-        r"""
-        calculateMax(IUnitConverter self, size_t i_axis, Axes::Units units_type) -> double
-        virtual double IUnitConverter::calculateMax(size_t i_axis, Axes::Units units_type) const =0
-
-        """
-        return _libBornAgainDevice.IUnitConverter_calculateMax(self, i_axis, units_type)
-
-    def axisSize(self, i_axis):
-        r"""
-        axisSize(IUnitConverter self, size_t i_axis) -> size_t
-        virtual size_t IUnitConverter::axisSize(size_t i_axis) const =0
-
-        """
-        return _libBornAgainDevice.IUnitConverter_axisSize(self, i_axis)
-
-    def axisName(self, *args):
-        r"""
-        axisName(IUnitConverter self, size_t i_axis, Axes::Units const & units_type=Axes::Units::DEFAULT) -> std::string
-        std::string IUnitConverter::axisName(size_t i_axis, const Axes::Units &units_type=Axes::Units::DEFAULT) const
-
-        """
-        return _libBornAgainDevice.IUnitConverter_axisName(self, *args)
+    DEFAULT = _libBornAgainDevice.Axes_DEFAULT
+    
+    NBINS = _libBornAgainDevice.Axes_NBINS
+    
+    RADIANS = _libBornAgainDevice.Axes_RADIANS
+    
+    DEGREES = _libBornAgainDevice.Axes_DEGREES
+    
+    MM = _libBornAgainDevice.Axes_MM
+    
+    QSPACE = _libBornAgainDevice.Axes_QSPACE
+    
+    QXQY = _libBornAgainDevice.Axes_QXQY
+    
+    RQ4 = _libBornAgainDevice.Axes_RQ4
+    
 
-    def availableUnits(self):
+    def __init__(self):
         r"""
-        availableUnits(IUnitConverter self) -> std::vector< Axes::Units,std::allocator< Axes::Units > >
-        virtual std::vector<Axes::Units> IUnitConverter::availableUnits() const =0
+        __init__(Axes self) -> Axes
 
-        """
-        return _libBornAgainDevice.IUnitConverter_availableUnits(self)
 
-    def defaultUnits(self):
-        r"""
-        defaultUnits(IUnitConverter self) -> Axes::Units
-        virtual Axes::Units IUnitConverter::defaultUnits() const =0
+        Wrapper for detector axes units, required for a better representation of detector axes units in python
 
-        """
-        return _libBornAgainDevice.IUnitConverter_defaultUnits(self)
-
-    def substituteDefaultUnits(self, units):
-        r"""
-        substituteDefaultUnits(IUnitConverter self, Axes::Units units) -> Axes::Units
-        Axes::Units IUnitConverter::substituteDefaultUnits(Axes::Units units) const
+        C++ includes: Axes.h
 
         """
-        return _libBornAgainDevice.IUnitConverter_substituteDefaultUnits(self, units)
+        _libBornAgainDevice.Axes_swiginit(self, _libBornAgainDevice.new_Axes())
+    __swig_destroy__ = _libBornAgainDevice.delete_Axes
 
-# Register IUnitConverter in _libBornAgainDevice:
-_libBornAgainDevice.IUnitConverter_swigregister(IUnitConverter)
+# Register Axes in _libBornAgainDevice:
+_libBornAgainDevice.Axes_swigregister(Axes)
 
 class DetectorMask(object):
     r"""
@@ -5447,7 +5395,7 @@ class SimulationResult(object):
     def __init__(self, *args):
         r"""
         __init__(SimulationResult self) -> SimulationResult
-        __init__(SimulationResult self, IntensityData data, IUnitConverter unit_converter) -> SimulationResult
+        __init__(SimulationResult self, IntensityData data, IUnitConverter const & unit_converter) -> SimulationResult
         __init__(SimulationResult self, SimulationResult other) -> SimulationResult
         __init__(SimulationResult self, SimulationResult other) -> SimulationResult
         SimulationResult::SimulationResult(SimulationResult &&other)
@@ -5475,7 +5423,7 @@ class SimulationResult(object):
 
     def converter(self):
         r"""
-        converter(SimulationResult self) -> IUnitConverter
+        converter(SimulationResult self) -> IUnitConverter const &
         const IUnitConverter & SimulationResult::converter() const
 
         Returns underlying unit converter. 
diff --git a/auto/Wrap/libBornAgainDevice_wrap.cpp b/auto/Wrap/libBornAgainDevice_wrap.cpp
index 1f823f145221b37ac249393bd16010fcb56e32dd..92b00ab66633aab0fe2c7fa259f104a1750a9ea4 100644
--- a/auto/Wrap/libBornAgainDevice_wrap.cpp
+++ b/auto/Wrap/libBornAgainDevice_wrap.cpp
@@ -3097,7 +3097,7 @@ namespace Swig {
 
 /* -------- TYPES TABLE (BEGIN) -------- */
 
-#define SWIGTYPE_p_Axes__Units swig_types[0]
+#define SWIGTYPE_p_Axes swig_types[0]
 #define SWIGTYPE_p_AxisInfo swig_types[1]
 #define SWIGTYPE_p_BasicVector3DT_double_t swig_types[2]
 #define SWIGTYPE_p_BasicVector3DT_int_t swig_types[3]
@@ -3186,30 +3186,29 @@ namespace Swig {
 #define SWIGTYPE_p_std__lessT_std__string_t swig_types[86]
 #define SWIGTYPE_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t swig_types[87]
 #define SWIGTYPE_p_std__pairT_double_double_t swig_types[88]
-#define SWIGTYPE_p_std__vectorT_Axes__Units_std__allocatorT_Axes__Units_t_t swig_types[89]
-#define SWIGTYPE_p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t swig_types[90]
-#define SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t swig_types[91]
-#define SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t swig_types[92]
-#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[93]
-#define SWIGTYPE_p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t swig_types[94]
-#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[95]
-#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[96]
-#define SWIGTYPE_p_std__vectorT_size_t_std__allocatorT_size_t_t_t swig_types[97]
-#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[98]
-#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[99]
-#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[100]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[101]
-#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[102]
-#define SWIGTYPE_p_std__vectorT_unsigned_int_std__allocatorT_unsigned_int_t_t swig_types[103]
-#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[104]
-#define SWIGTYPE_p_swig__SwigPyIterator swig_types[105]
-#define SWIGTYPE_p_unsigned_char swig_types[106]
-#define SWIGTYPE_p_unsigned_int swig_types[107]
-#define SWIGTYPE_p_unsigned_long_long swig_types[108]
-#define SWIGTYPE_p_unsigned_short swig_types[109]
-#define SWIGTYPE_p_value_type swig_types[110]
-static swig_type_info *swig_types[112];
-static swig_module_info swig_module = {swig_types, 111, 0, 0, 0, 0};
+#define SWIGTYPE_p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t swig_types[89]
+#define SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t swig_types[90]
+#define SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t swig_types[91]
+#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[92]
+#define SWIGTYPE_p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t swig_types[93]
+#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[94]
+#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[95]
+#define SWIGTYPE_p_std__vectorT_size_t_std__allocatorT_size_t_t_t swig_types[96]
+#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[97]
+#define SWIGTYPE_p_std__vectorT_std__pairT_double_double_t_std__allocatorT_std__pairT_double_double_t_t_t swig_types[98]
+#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[99]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[100]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_int_std__allocatorT_int_t_t_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t_t swig_types[101]
+#define SWIGTYPE_p_std__vectorT_unsigned_int_std__allocatorT_unsigned_int_t_t swig_types[102]
+#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[103]
+#define SWIGTYPE_p_swig__SwigPyIterator swig_types[104]
+#define SWIGTYPE_p_unsigned_char swig_types[105]
+#define SWIGTYPE_p_unsigned_int swig_types[106]
+#define SWIGTYPE_p_unsigned_long_long swig_types[107]
+#define SWIGTYPE_p_unsigned_short swig_types[108]
+#define SWIGTYPE_p_value_type swig_types[109]
+static swig_type_info *swig_types[111];
+static swig_module_info swig_module = {swig_types, 110, 0, 0, 0, 0};
 #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
 #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
 
@@ -34851,408 +34850,52 @@ SWIGINTERN PyObject *ScanResolution_swigregister(PyObject *SWIGUNUSEDPARM(self),
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *_wrap_delete_IUnitConverter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_Axes(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IUnitConverter *arg1 = (IUnitConverter *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IUnitConverter, SWIG_POINTER_DISOWN |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IUnitConverter" "', argument " "1"" of type '" "IUnitConverter *""'"); 
-  }
-  arg1 = reinterpret_cast< IUnitConverter * >(argp1);
-  delete arg1;
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IUnitConverter_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IUnitConverter *arg1 = (IUnitConverter *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  IUnitConverter *result = 0 ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IUnitConverter, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IUnitConverter_clone" "', argument " "1"" of type '" "IUnitConverter const *""'"); 
-  }
-  arg1 = reinterpret_cast< IUnitConverter * >(argp1);
-  result = (IUnitConverter *)((IUnitConverter const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IUnitConverter, 0 |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IUnitConverter_dimension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IUnitConverter *arg1 = (IUnitConverter *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  size_t result;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IUnitConverter, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IUnitConverter_dimension" "', argument " "1"" of type '" "IUnitConverter const *""'"); 
-  }
-  arg1 = reinterpret_cast< IUnitConverter * >(argp1);
-  result = ((IUnitConverter const *)arg1)->dimension();
-  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IUnitConverter_calculateMin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IUnitConverter *arg1 = (IUnitConverter *) 0 ;
-  size_t arg2 ;
-  Axes::Units arg3 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  size_t val2 ;
-  int ecode2 = 0 ;
-  void *argp3 ;
-  int res3 = 0 ;
-  PyObject *swig_obj[3] ;
-  double result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "IUnitConverter_calculateMin", 3, 3, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IUnitConverter, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IUnitConverter_calculateMin" "', argument " "1"" of type '" "IUnitConverter const *""'"); 
-  }
-  arg1 = reinterpret_cast< IUnitConverter * >(argp1);
-  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IUnitConverter_calculateMin" "', argument " "2"" of type '" "size_t""'");
-  } 
-  arg2 = static_cast< size_t >(val2);
-  {
-    res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_Axes__Units,  0  | 0);
-    if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IUnitConverter_calculateMin" "', argument " "3"" of type '" "Axes::Units""'"); 
-    }  
-    if (!argp3) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IUnitConverter_calculateMin" "', argument " "3"" of type '" "Axes::Units""'");
-    } else {
-      Axes::Units * temp = reinterpret_cast< Axes::Units * >(argp3);
-      arg3 = *temp;
-      if (SWIG_IsNewObj(res3)) delete temp;
-    }
-  }
-  result = (double)((IUnitConverter const *)arg1)->calculateMin(arg2,arg3);
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IUnitConverter_calculateMax(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IUnitConverter *arg1 = (IUnitConverter *) 0 ;
-  size_t arg2 ;
-  Axes::Units arg3 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  size_t val2 ;
-  int ecode2 = 0 ;
-  void *argp3 ;
-  int res3 = 0 ;
-  PyObject *swig_obj[3] ;
-  double result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "IUnitConverter_calculateMax", 3, 3, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IUnitConverter, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IUnitConverter_calculateMax" "', argument " "1"" of type '" "IUnitConverter const *""'"); 
-  }
-  arg1 = reinterpret_cast< IUnitConverter * >(argp1);
-  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IUnitConverter_calculateMax" "', argument " "2"" of type '" "size_t""'");
-  } 
-  arg2 = static_cast< size_t >(val2);
-  {
-    res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_Axes__Units,  0  | 0);
-    if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IUnitConverter_calculateMax" "', argument " "3"" of type '" "Axes::Units""'"); 
-    }  
-    if (!argp3) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IUnitConverter_calculateMax" "', argument " "3"" of type '" "Axes::Units""'");
-    } else {
-      Axes::Units * temp = reinterpret_cast< Axes::Units * >(argp3);
-      arg3 = *temp;
-      if (SWIG_IsNewObj(res3)) delete temp;
-    }
-  }
-  result = (double)((IUnitConverter const *)arg1)->calculateMax(arg2,arg3);
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IUnitConverter_axisSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IUnitConverter *arg1 = (IUnitConverter *) 0 ;
-  size_t arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  size_t val2 ;
-  int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
-  size_t result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "IUnitConverter_axisSize", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IUnitConverter, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IUnitConverter_axisSize" "', argument " "1"" of type '" "IUnitConverter const *""'"); 
-  }
-  arg1 = reinterpret_cast< IUnitConverter * >(argp1);
-  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IUnitConverter_axisSize" "', argument " "2"" of type '" "size_t""'");
-  } 
-  arg2 = static_cast< size_t >(val2);
-  result = ((IUnitConverter const *)arg1)->axisSize(arg2);
-  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IUnitConverter_axisName__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  IUnitConverter *arg1 = (IUnitConverter *) 0 ;
-  size_t arg2 ;
-  Axes::Units *arg3 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  size_t val2 ;
-  int ecode2 = 0 ;
-  void *argp3 = 0 ;
-  int res3 = 0 ;
-  std::string result;
-  
-  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IUnitConverter, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IUnitConverter_axisName" "', argument " "1"" of type '" "IUnitConverter const *""'"); 
-  }
-  arg1 = reinterpret_cast< IUnitConverter * >(argp1);
-  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IUnitConverter_axisName" "', argument " "2"" of type '" "size_t""'");
-  } 
-  arg2 = static_cast< size_t >(val2);
-  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_Axes__Units,  0  | 0);
-  if (!SWIG_IsOK(res3)) {
-    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IUnitConverter_axisName" "', argument " "3"" of type '" "Axes::Units const &""'"); 
-  }
-  if (!argp3) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IUnitConverter_axisName" "', argument " "3"" of type '" "Axes::Units const &""'"); 
-  }
-  arg3 = reinterpret_cast< Axes::Units * >(argp3);
-  result = ((IUnitConverter const *)arg1)->axisName(arg2,(Axes::Units const &)*arg3);
-  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IUnitConverter_axisName__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  IUnitConverter *arg1 = (IUnitConverter *) 0 ;
-  size_t arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  size_t val2 ;
-  int ecode2 = 0 ;
-  std::string result;
-  
-  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IUnitConverter, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IUnitConverter_axisName" "', argument " "1"" of type '" "IUnitConverter const *""'"); 
-  }
-  arg1 = reinterpret_cast< IUnitConverter * >(argp1);
-  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IUnitConverter_axisName" "', argument " "2"" of type '" "size_t""'");
-  } 
-  arg2 = static_cast< size_t >(val2);
-  result = ((IUnitConverter const *)arg1)->axisName(arg2);
-  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IUnitConverter_axisName(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[4] = {
-    0
-  };
-  
-  if (!(argc = SWIG_Python_UnpackTuple(args, "IUnitConverter_axisName", 0, 3, argv))) SWIG_fail;
-  --argc;
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IUnitConverter, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_size_t(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_IUnitConverter_axisName__SWIG_1(self, argc, argv);
-      }
-    }
-  }
-  if (argc == 3) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IUnitConverter, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_size_t(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_Axes__Units, SWIG_POINTER_NO_NULL | 0);
-        _v = SWIG_CheckState(res);
-        if (_v) {
-          return _wrap_IUnitConverter_axisName__SWIG_0(self, argc, argv);
-        }
-      }
-    }
-  }
-  
-fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'IUnitConverter_axisName'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    IUnitConverter::axisName(size_t,Axes::Units const &) const\n"
-    "    IUnitConverter::axisName(size_t) const\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_IUnitConverter_availableUnits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IUnitConverter *arg1 = (IUnitConverter *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  SwigValueWrapper< std::vector< Axes::Units,std::allocator< Axes::Units > > > result;
+  Axes *result = 0 ;
   
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IUnitConverter, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IUnitConverter_availableUnits" "', argument " "1"" of type '" "IUnitConverter const *""'"); 
-  }
-  arg1 = reinterpret_cast< IUnitConverter * >(argp1);
-  result = ((IUnitConverter const *)arg1)->availableUnits();
-  resultobj = SWIG_NewPointerObj((new std::vector< Axes::Units,std::allocator< Axes::Units > >(static_cast< const std::vector< Axes::Units,std::allocator< Axes::Units > >& >(result))), SWIGTYPE_p_std__vectorT_Axes__Units_std__allocatorT_Axes__Units_t_t, SWIG_POINTER_OWN |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "new_Axes", 0, 0, 0)) SWIG_fail;
+  result = (Axes *)new Axes();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Axes, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IUnitConverter_defaultUnits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_Axes(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  IUnitConverter *arg1 = (IUnitConverter *) 0 ;
+  Axes *arg1 = (Axes *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  Axes::Units result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IUnitConverter, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IUnitConverter_defaultUnits" "', argument " "1"" of type '" "IUnitConverter const *""'"); 
-  }
-  arg1 = reinterpret_cast< IUnitConverter * >(argp1);
-  result = ((IUnitConverter const *)arg1)->defaultUnits();
-  resultobj = SWIG_NewPointerObj((new Axes::Units(static_cast< const Axes::Units& >(result))), SWIGTYPE_p_Axes__Units, SWIG_POINTER_OWN |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_IUnitConverter_substituteDefaultUnits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IUnitConverter *arg1 = (IUnitConverter *) 0 ;
-  Axes::Units arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  Axes::Units result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "IUnitConverter_substituteDefaultUnits", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IUnitConverter, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Axes, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IUnitConverter_substituteDefaultUnits" "', argument " "1"" of type '" "IUnitConverter const *""'"); 
-  }
-  arg1 = reinterpret_cast< IUnitConverter * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Axes__Units,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IUnitConverter_substituteDefaultUnits" "', argument " "2"" of type '" "Axes::Units""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IUnitConverter_substituteDefaultUnits" "', argument " "2"" of type '" "Axes::Units""'");
-    } else {
-      Axes::Units * temp = reinterpret_cast< Axes::Units * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Axes" "', argument " "1"" of type '" "Axes *""'"); 
   }
-  result = ((IUnitConverter const *)arg1)->substituteDefaultUnits(arg2);
-  resultobj = SWIG_NewPointerObj((new Axes::Units(static_cast< const Axes::Units& >(result))), SWIGTYPE_p_Axes__Units, SWIG_POINTER_OWN |  0 );
+  arg1 = reinterpret_cast< Axes * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *IUnitConverter_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *Axes_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_IUnitConverter, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_Axes, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
+SWIGINTERN PyObject *Axes_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
 SWIGINTERN PyObject *_wrap_new_DetectorMask__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
   PyObject *resultobj = 0;
   DetectorMask *result = 0 ;
@@ -36345,8 +35988,8 @@ SWIGINTERN PyObject *_wrap_IDetector_defaultAxesUnits(PyObject *SWIGUNUSEDPARM(s
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector_defaultAxesUnits" "', argument " "1"" of type '" "IDetector const *""'"); 
   }
   arg1 = reinterpret_cast< IDetector * >(argp1);
-  result = ((IDetector const *)arg1)->defaultAxesUnits();
-  resultobj = SWIG_NewPointerObj((new Axes::Units(static_cast< const Axes::Units& >(result))), SWIGTYPE_p_Axes__Units, SWIG_POINTER_OWN |  0 );
+  result = (Axes::Units)((IDetector const *)arg1)->defaultAxesUnits();
+  resultobj = SWIG_From_int(static_cast< int >(result));
   return resultobj;
 fail:
   return NULL;
@@ -37905,8 +37548,8 @@ SWIGINTERN PyObject *_wrap_RectangularDetector_defaultAxesUnits(PyObject *SWIGUN
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_defaultAxesUnits" "', argument " "1"" of type '" "RectangularDetector const *""'"); 
   }
   arg1 = reinterpret_cast< RectangularDetector * >(argp1);
-  result = ((RectangularDetector const *)arg1)->defaultAxesUnits();
-  resultobj = SWIG_NewPointerObj((new Axes::Units(static_cast< const Axes::Units& >(result))), SWIGTYPE_p_Axes__Units, SWIG_POINTER_OWN |  0 );
+  result = (Axes::Units)((RectangularDetector const *)arg1)->defaultAxesUnits();
+  resultobj = SWIG_From_int(static_cast< int >(result));
   return resultobj;
 fail:
   return NULL;
@@ -38278,8 +37921,8 @@ SWIGINTERN PyObject *_wrap_SphericalDetector_defaultAxesUnits(PyObject *SWIGUNUS
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SphericalDetector_defaultAxesUnits" "', argument " "1"" of type '" "SphericalDetector const *""'"); 
   }
   arg1 = reinterpret_cast< SphericalDetector * >(argp1);
-  result = ((SphericalDetector const *)arg1)->defaultAxesUnits();
-  resultobj = SWIG_NewPointerObj((new Axes::Units(static_cast< const Axes::Units& >(result))), SWIGTYPE_p_Axes__Units, SWIG_POINTER_OWN |  0 );
+  result = (Axes::Units)((SphericalDetector const *)arg1)->defaultAxesUnits();
+  resultobj = SWIG_From_int(static_cast< int >(result));
   return resultobj;
 fail:
   return NULL;
@@ -43094,8 +42737,8 @@ SWIGINTERN PyObject *_wrap_SimulationResult_histogram2d__SWIG_0(PyObject *SWIGUN
   Axes::Units arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
   Histogram2D *result = 0 ;
   
   if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
@@ -43104,19 +42747,11 @@ SWIGINTERN PyObject *_wrap_SimulationResult_histogram2d__SWIG_0(PyObject *SWIGUN
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationResult_histogram2d" "', argument " "1"" of type '" "SimulationResult const *""'"); 
   }
   arg1 = reinterpret_cast< SimulationResult * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Axes__Units,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SimulationResult_histogram2d" "', argument " "2"" of type '" "Axes::Units""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SimulationResult_histogram2d" "', argument " "2"" of type '" "Axes::Units""'");
-    } else {
-      Axes::Units * temp = reinterpret_cast< Axes::Units * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
-  }
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationResult_histogram2d" "', argument " "2"" of type '" "Axes::Units""'");
+  } 
+  arg2 = static_cast< Axes::Units >(val2);
   result = (Histogram2D *)((SimulationResult const *)arg1)->histogram2d(arg2);
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram2D, SWIG_POINTER_OWN |  0 );
   return resultobj;
@@ -43169,8 +42804,10 @@ SWIGINTERN PyObject *_wrap_SimulationResult_histogram2d(PyObject *self, PyObject
     int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_SimulationResult, 0);
     _v = SWIG_CheckState(res);
     if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_Axes__Units, SWIG_POINTER_NO_NULL | 0);
-      _v = SWIG_CheckState(res);
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
       if (_v) {
         return _wrap_SimulationResult_histogram2d__SWIG_0(self, argc, argv);
       }
@@ -43192,8 +42829,8 @@ SWIGINTERN PyObject *_wrap_SimulationResult_axisInfo__SWIG_0(PyObject *SWIGUNUSE
   Axes::Units arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
   SwigValueWrapper< std::vector< AxisInfo,std::allocator< AxisInfo > > > result;
   
   if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
@@ -43202,19 +42839,11 @@ SWIGINTERN PyObject *_wrap_SimulationResult_axisInfo__SWIG_0(PyObject *SWIGUNUSE
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationResult_axisInfo" "', argument " "1"" of type '" "SimulationResult const *""'"); 
   }
   arg1 = reinterpret_cast< SimulationResult * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Axes__Units,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SimulationResult_axisInfo" "', argument " "2"" of type '" "Axes::Units""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SimulationResult_axisInfo" "', argument " "2"" of type '" "Axes::Units""'");
-    } else {
-      Axes::Units * temp = reinterpret_cast< Axes::Units * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
-  }
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationResult_axisInfo" "', argument " "2"" of type '" "Axes::Units""'");
+  } 
+  arg2 = static_cast< Axes::Units >(val2);
   result = ((SimulationResult const *)arg1)->axisInfo(arg2);
   resultobj = SWIG_NewPointerObj((new std::vector< AxisInfo,std::allocator< AxisInfo > >(static_cast< const std::vector< AxisInfo,std::allocator< AxisInfo > >& >(result))), SWIGTYPE_p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t, SWIG_POINTER_OWN |  0 );
   return resultobj;
@@ -43267,8 +42896,10 @@ SWIGINTERN PyObject *_wrap_SimulationResult_axisInfo(PyObject *self, PyObject *a
     int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_SimulationResult, 0);
     _v = SWIG_CheckState(res);
     if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_Axes__Units, SWIG_POINTER_NO_NULL | 0);
-      _v = SWIG_CheckState(res);
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
       if (_v) {
         return _wrap_SimulationResult_axisInfo__SWIG_0(self, argc, argv);
       }
@@ -43382,8 +43013,8 @@ SWIGINTERN PyObject *_wrap_SimulationResult_array__SWIG_0(PyObject *SWIGUNUSEDPA
   Axes::Units arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
   PyObject *result = 0 ;
   
   if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
@@ -43392,19 +43023,11 @@ SWIGINTERN PyObject *_wrap_SimulationResult_array__SWIG_0(PyObject *SWIGUNUSEDPA
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationResult_array" "', argument " "1"" of type '" "SimulationResult const *""'"); 
   }
   arg1 = reinterpret_cast< SimulationResult * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Axes__Units,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SimulationResult_array" "', argument " "2"" of type '" "Axes::Units""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SimulationResult_array" "', argument " "2"" of type '" "Axes::Units""'");
-    } else {
-      Axes::Units * temp = reinterpret_cast< Axes::Units * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
-  }
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationResult_array" "', argument " "2"" of type '" "Axes::Units""'");
+  } 
+  arg2 = static_cast< Axes::Units >(val2);
   result = (PyObject *)((SimulationResult const *)arg1)->array(arg2);
   resultobj = result;
   return resultobj;
@@ -43457,8 +43080,10 @@ SWIGINTERN PyObject *_wrap_SimulationResult_array(PyObject *self, PyObject *args
     int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_SimulationResult, 0);
     _v = SWIG_CheckState(res);
     if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_Axes__Units, SWIG_POINTER_NO_NULL | 0);
-      _v = SWIG_CheckState(res);
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
       if (_v) {
         return _wrap_SimulationResult_array__SWIG_0(self, argc, argv);
       }
@@ -43480,8 +43105,8 @@ SWIGINTERN PyObject *_wrap_SimulationResult_axis__SWIG_0(PyObject *SWIGUNUSEDPAR
   Axes::Units arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
   std::vector< double,std::allocator< double > > result;
   
   if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
@@ -43490,19 +43115,11 @@ SWIGINTERN PyObject *_wrap_SimulationResult_axis__SWIG_0(PyObject *SWIGUNUSEDPAR
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationResult_axis" "', argument " "1"" of type '" "SimulationResult const *""'"); 
   }
   arg1 = reinterpret_cast< SimulationResult * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Axes__Units,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SimulationResult_axis" "', argument " "2"" of type '" "Axes::Units""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SimulationResult_axis" "', argument " "2"" of type '" "Axes::Units""'");
-    } else {
-      Axes::Units * temp = reinterpret_cast< Axes::Units * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
-  }
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationResult_axis" "', argument " "2"" of type '" "Axes::Units""'");
+  } 
+  arg2 = static_cast< Axes::Units >(val2);
   result = ((SimulationResult const *)arg1)->axis(arg2);
   resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
   return resultobj;
@@ -43541,8 +43158,8 @@ SWIGINTERN PyObject *_wrap_SimulationResult_axis__SWIG_2(PyObject *SWIGUNUSEDPAR
   int res1 = 0 ;
   size_t val2 ;
   int ecode2 = 0 ;
-  void *argp3 ;
-  int res3 = 0 ;
+  int val3 ;
+  int ecode3 = 0 ;
   std::vector< double,std::allocator< double > > result;
   
   if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
@@ -43556,19 +43173,11 @@ SWIGINTERN PyObject *_wrap_SimulationResult_axis__SWIG_2(PyObject *SWIGUNUSEDPAR
     SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationResult_axis" "', argument " "2"" of type '" "size_t""'");
   } 
   arg2 = static_cast< size_t >(val2);
-  {
-    res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_Axes__Units,  0  | 0);
-    if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SimulationResult_axis" "', argument " "3"" of type '" "Axes::Units""'"); 
-    }  
-    if (!argp3) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SimulationResult_axis" "', argument " "3"" of type '" "Axes::Units""'");
-    } else {
-      Axes::Units * temp = reinterpret_cast< Axes::Units * >(argp3);
-      arg3 = *temp;
-      if (SWIG_IsNewObj(res3)) delete temp;
-    }
-  }
+  ecode3 = SWIG_AsVal_int(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SimulationResult_axis" "', argument " "3"" of type '" "Axes::Units""'");
+  } 
+  arg3 = static_cast< Axes::Units >(val3);
   result = ((SimulationResult const *)arg1)->axis(arg2,arg3);
   resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
   return resultobj;
@@ -43629,8 +43238,10 @@ SWIGINTERN PyObject *_wrap_SimulationResult_axis(PyObject *self, PyObject *args)
     int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_SimulationResult, 0);
     _v = SWIG_CheckState(res);
     if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_Axes__Units, SWIG_POINTER_NO_NULL | 0);
-      _v = SWIG_CheckState(res);
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
       if (_v) {
         return _wrap_SimulationResult_axis__SWIG_0(self, argc, argv);
       }
@@ -43662,8 +43273,10 @@ SWIGINTERN PyObject *_wrap_SimulationResult_axis(PyObject *self, PyObject *args)
         _v = SWIG_CheckState(res);
       }
       if (_v) {
-        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_Axes__Units, SWIG_POINTER_NO_NULL | 0);
-        _v = SWIG_CheckState(res);
+        {
+          int res = SWIG_AsVal_int(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
         if (_v) {
           return _wrap_SimulationResult_axis__SWIG_2(self, argc, argv);
         }
@@ -45408,57 +45021,18 @@ static PyMethodDef SwigMethods[] = {
 		"ScanResolution_scanAbsoluteResolution(IRangedDistribution const & distr, vdouble1d_t stddevs) -> ScanResolution\n"
 		""},
 	 { "ScanResolution_swigregister", ScanResolution_swigregister, METH_O, NULL},
-	 { "delete_IUnitConverter", _wrap_delete_IUnitConverter, METH_O, "\n"
-		"delete_IUnitConverter(IUnitConverter self)\n"
-		"IUnitConverter::~IUnitConverter()\n"
-		"\n"
-		""},
-	 { "IUnitConverter_clone", _wrap_IUnitConverter_clone, METH_O, "\n"
-		"IUnitConverter_clone(IUnitConverter self) -> IUnitConverter\n"
-		"virtual IUnitConverter* IUnitConverter::clone() const =0\n"
-		"\n"
-		""},
-	 { "IUnitConverter_dimension", _wrap_IUnitConverter_dimension, METH_O, "\n"
-		"IUnitConverter_dimension(IUnitConverter self) -> size_t\n"
-		"virtual size_t IUnitConverter::dimension() const =0\n"
+	 { "new_Axes", _wrap_new_Axes, METH_NOARGS, "\n"
+		"new_Axes() -> Axes\n"
 		"\n"
-		""},
-	 { "IUnitConverter_calculateMin", _wrap_IUnitConverter_calculateMin, METH_VARARGS, "\n"
-		"IUnitConverter_calculateMin(IUnitConverter self, size_t i_axis, Axes::Units units_type) -> double\n"
-		"virtual double IUnitConverter::calculateMin(size_t i_axis, Axes::Units units_type) const =0\n"
-		"\n"
-		""},
-	 { "IUnitConverter_calculateMax", _wrap_IUnitConverter_calculateMax, METH_VARARGS, "\n"
-		"IUnitConverter_calculateMax(IUnitConverter self, size_t i_axis, Axes::Units units_type) -> double\n"
-		"virtual double IUnitConverter::calculateMax(size_t i_axis, Axes::Units units_type) const =0\n"
-		"\n"
-		""},
-	 { "IUnitConverter_axisSize", _wrap_IUnitConverter_axisSize, METH_VARARGS, "\n"
-		"IUnitConverter_axisSize(IUnitConverter self, size_t i_axis) -> size_t\n"
-		"virtual size_t IUnitConverter::axisSize(size_t i_axis) const =0\n"
-		"\n"
-		""},
-	 { "IUnitConverter_axisName", _wrap_IUnitConverter_axisName, METH_VARARGS, "\n"
-		"IUnitConverter_axisName(IUnitConverter self, size_t i_axis, Axes::Units const & units_type=Axes::Units::DEFAULT) -> std::string\n"
-		"std::string IUnitConverter::axisName(size_t i_axis, const Axes::Units &units_type=Axes::Units::DEFAULT) const\n"
-		"\n"
-		""},
-	 { "IUnitConverter_availableUnits", _wrap_IUnitConverter_availableUnits, METH_O, "\n"
-		"IUnitConverter_availableUnits(IUnitConverter self) -> std::vector< Axes::Units,std::allocator< Axes::Units > >\n"
-		"virtual std::vector<Axes::Units> IUnitConverter::availableUnits() const =0\n"
 		"\n"
-		""},
-	 { "IUnitConverter_defaultUnits", _wrap_IUnitConverter_defaultUnits, METH_O, "\n"
-		"IUnitConverter_defaultUnits(IUnitConverter self) -> Axes::Units\n"
-		"virtual Axes::Units IUnitConverter::defaultUnits() const =0\n"
+		"Wrapper for detector axes units, required for a better representation of detector axes units in python\n"
 		"\n"
-		""},
-	 { "IUnitConverter_substituteDefaultUnits", _wrap_IUnitConverter_substituteDefaultUnits, METH_VARARGS, "\n"
-		"IUnitConverter_substituteDefaultUnits(IUnitConverter self, Axes::Units units) -> Axes::Units\n"
-		"Axes::Units IUnitConverter::substituteDefaultUnits(Axes::Units units) const\n"
+		"C++ includes: Axes.h\n"
 		"\n"
 		""},
-	 { "IUnitConverter_swigregister", IUnitConverter_swigregister, METH_O, NULL},
+	 { "delete_Axes", _wrap_delete_Axes, METH_O, "delete_Axes(Axes self)"},
+	 { "Axes_swigregister", Axes_swigregister, METH_O, NULL},
+	 { "Axes_swiginit", Axes_swiginit, METH_VARARGS, NULL},
 	 { "new_DetectorMask", _wrap_new_DetectorMask, METH_VARARGS, "\n"
 		"DetectorMask()\n"
 		"new_DetectorMask(DetectorMask other) -> DetectorMask\n"
@@ -46463,7 +46037,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "AxisInfo_swiginit", AxisInfo_swiginit, METH_VARARGS, NULL},
 	 { "new_SimulationResult", _wrap_new_SimulationResult, METH_VARARGS, "\n"
 		"SimulationResult()\n"
-		"SimulationResult(IntensityData data, IUnitConverter unit_converter)\n"
+		"SimulationResult(IntensityData data, IUnitConverter const & unit_converter)\n"
 		"SimulationResult(SimulationResult other)\n"
 		"new_SimulationResult(SimulationResult other) -> SimulationResult\n"
 		"SimulationResult::SimulationResult(SimulationResult &&other)\n"
@@ -46482,7 +46056,7 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		""},
 	 { "SimulationResult_converter", _wrap_SimulationResult_converter, METH_O, "\n"
-		"SimulationResult_converter(SimulationResult self) -> IUnitConverter\n"
+		"SimulationResult_converter(SimulationResult self) -> IUnitConverter const &\n"
 		"const IUnitConverter & SimulationResult::converter() const\n"
 		"\n"
 		"Returns underlying unit converter. \n"
@@ -46767,16 +46341,13 @@ static void *_p_PolygonTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory))
 static void *_p_FootprintSquareTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (IFootprintFactor *) ((FootprintSquare *) x));
 }
-static void *_p_IUnitConverterTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *)  ((IUnitConverter *) x));
-}
 static void *_p_IResolutionFunction2DTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *)  ((IResolutionFunction2D *) x));
 }
 static void *_p_LineTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (IShape2D *) ((Line *) x));
 }
-static swig_type_info _swigt__p_Axes__Units = {"_p_Axes__Units", "Axes::Units *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Axes = {"_p_Axes", "Axes *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_AxisInfo = {"_p_AxisInfo", "AxisInfo *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_BasicVector3DT_double_t = {"_p_BasicVector3DT_double_t", "std::vector< BasicVector3D< double > >::value_type *|kvector_t *|BasicVector3D< double > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_BasicVector3DT_int_t = {"_p_BasicVector3DT_int_t", "ivector_t *|BasicVector3D< int > *", 0, 0, (void*)0, 0};
@@ -46865,7 +46436,6 @@ static swig_type_info _swigt__p_std__invalid_argument = {"_p_std__invalid_argume
 static swig_type_info _swigt__p_std__lessT_std__string_t = {"_p_std__lessT_std__string_t", "std::less< std::string > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t = {"_p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t", "std::map< std::string,double,std::less< std::string >,std::allocator< std::pair< std::string const,double > > > *|std::map< std::string,double > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__pairT_double_double_t = {"_p_std__pairT_double_double_t", "std::pair< double,double > *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_std__vectorT_Axes__Units_std__allocatorT_Axes__Units_t_t = {"_p_std__vectorT_Axes__Units_std__allocatorT_Axes__Units_t_t", "std::vector< Axes::Units,std::allocator< Axes::Units > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t = {"_p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t", "std::vector< AxisInfo,std::allocator< AxisInfo > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t = {"_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t", "std::vector< BasicVector3D< double > > *|std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t = {"_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t", "std::vector< BasicVector3D< std::complex< double > > > *|std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > *", 0, 0, (void*)0, 0};
@@ -46889,7 +46459,7 @@ static swig_type_info _swigt__p_unsigned_short = {"_p_unsigned_short", "unsigned
 static swig_type_info _swigt__p_value_type = {"_p_value_type", "value_type *", 0, 0, (void*)0, 0};
 
 static swig_type_info *swig_type_initial[] = {
-  &_swigt__p_Axes__Units,
+  &_swigt__p_Axes,
   &_swigt__p_AxisInfo,
   &_swigt__p_BasicVector3DT_double_t,
   &_swigt__p_BasicVector3DT_int_t,
@@ -46978,7 +46548,6 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_std__lessT_std__string_t,
   &_swigt__p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t,
   &_swigt__p_std__pairT_double_double_t,
-  &_swigt__p_std__vectorT_Axes__Units_std__allocatorT_Axes__Units_t_t,
   &_swigt__p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t,
   &_swigt__p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t,
   &_swigt__p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t,
@@ -47002,7 +46571,7 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_value_type,
 };
 
-static swig_cast_info _swigc__p_Axes__Units[] = {  {&_swigt__p_Axes__Units, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Axes[] = {  {&_swigt__p_Axes, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_AxisInfo[] = {  {&_swigt__p_AxisInfo, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_BasicVector3DT_double_t[] = {  {&_swigt__p_BasicVector3DT_double_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_BasicVector3DT_int_t[] = {  {&_swigt__p_BasicVector3DT_int_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -47020,7 +46589,7 @@ static swig_cast_info _swigc__p_Histogram2D[] = {  {&_swigt__p_Histogram2D, 0, 0
 static swig_cast_info _swigc__p_HorizontalLine[] = {  {&_swigt__p_HorizontalLine, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IAxis[] = {  {&_swigt__p_IAxis, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ParameterPool[] = {{&_swigt__p_ParameterPool, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_ICloneable[] = {  {&_swigt__p_FootprintGauss, _p_FootprintGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_ICloneable, 0, 0},  {&_swigt__p_ScanResolution, _p_ScanResolutionTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_ICloneable, 0, 0},  {&_swigt__p_Line, _p_LineTo_p_ICloneable, 0, 0},  {&_swigt__p_ICloneable, 0, 0, 0},  {&_swigt__p_Rectangle, _p_RectangleTo_p_ICloneable, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_ICloneable, 0, 0},  {&_swigt__p_IFootprintFactor, _p_IFootprintFactorTo_p_ICloneable, 0, 0},  {&_swigt__p_IShape2D, _p_IShape2DTo_p_ICloneable, 0, 0},  {&_swigt__p_Ellipse, _p_EllipseTo_p_ICloneable, 0, 0},  {&_swigt__p_ParameterPool, _p_ParameterPoolTo_p_ICloneable, 0, 0},  {&_swigt__p_HorizontalLine, _p_HorizontalLineTo_p_ICloneable, 0, 0},  {&_swigt__p_VerticalLine, _p_VerticalLineTo_p_ICloneable, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetector, _p_IDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_FootprintSquare, _p_FootprintSquareTo_p_ICloneable, 0, 0},  {&_swigt__p_Polygon, _p_PolygonTo_p_ICloneable, 0, 0},  {&_swigt__p_IUnitConverter, _p_IUnitConverterTo_p_ICloneable, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_ICloneable, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ICloneable[] = {  {&_swigt__p_FootprintGauss, _p_FootprintGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_ICloneable, 0, 0},  {&_swigt__p_ScanResolution, _p_ScanResolutionTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_ICloneable, 0, 0},  {&_swigt__p_Line, _p_LineTo_p_ICloneable, 0, 0},  {&_swigt__p_ICloneable, 0, 0, 0},  {&_swigt__p_Rectangle, _p_RectangleTo_p_ICloneable, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_ICloneable, 0, 0},  {&_swigt__p_IFootprintFactor, _p_IFootprintFactorTo_p_ICloneable, 0, 0},  {&_swigt__p_IShape2D, _p_IShape2DTo_p_ICloneable, 0, 0},  {&_swigt__p_Ellipse, _p_EllipseTo_p_ICloneable, 0, 0},  {&_swigt__p_ParameterPool, _p_ParameterPoolTo_p_ICloneable, 0, 0},  {&_swigt__p_HorizontalLine, _p_HorizontalLineTo_p_ICloneable, 0, 0},  {&_swigt__p_VerticalLine, _p_VerticalLineTo_p_ICloneable, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetector, _p_IDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_FootprintSquare, _p_FootprintSquareTo_p_ICloneable, 0, 0},  {&_swigt__p_Polygon, _p_PolygonTo_p_ICloneable, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_ICloneable, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ParameterDistribution[] = {{&_swigt__p_ParameterDistribution, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IComponent[] = {  {&_swigt__p_Beam, _p_BeamTo_p_IComponent, 0, 0},  {&_swigt__p_FootprintGauss, _p_FootprintGaussTo_p_IComponent, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_IComponent, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_IComponent, 0, 0},  {&_swigt__p_IParametricComponent, _p_IParametricComponentTo_p_IComponent, 0, 0},  {&_swigt__p_IComponent, 0, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_IComponent, 0, 0},  {&_swigt__p_IFootprintFactor, _p_IFootprintFactorTo_p_IComponent, 0, 0},  {&_swigt__p_IDetector, _p_IDetectorTo_p_IComponent, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_IComponent, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_IComponent, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_IComponent, 0, 0},  {&_swigt__p_ParameterDistribution, _p_ParameterDistributionTo_p_IComponent, 0, 0},  {&_swigt__p_FootprintSquare, _p_FootprintSquareTo_p_IComponent, 0, 0},  {&_swigt__p_INode, _p_INodeTo_p_IComponent, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_IComponent, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IDetector[] = {  {&_swigt__p_IDetector, 0, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_IDetector, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_IDetector, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_IDetector, 0, 0},  {&_swigt__p_IDetector2D, _p_IDetector2DTo_p_IDetector, 0, 0},{0, 0, 0, 0}};
@@ -47091,7 +46660,6 @@ static swig_cast_info _swigc__p_std__invalid_argument[] = {  {&_swigt__p_std__in
 static swig_cast_info _swigc__p_std__lessT_std__string_t[] = {  {&_swigt__p_std__lessT_std__string_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t[] = {  {&_swigt__p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__pairT_double_double_t[] = {  {&_swigt__p_std__pairT_double_double_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_std__vectorT_Axes__Units_std__allocatorT_Axes__Units_t_t[] = {  {&_swigt__p_std__vectorT_Axes__Units_std__allocatorT_Axes__Units_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t[] = {  {&_swigt__p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t[] = {  {&_swigt__p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t[] = {  {&_swigt__p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -47115,7 +46683,7 @@ static swig_cast_info _swigc__p_unsigned_short[] = {  {&_swigt__p_unsigned_short
 static swig_cast_info _swigc__p_value_type[] = {  {&_swigt__p_value_type, 0, 0, 0},{0, 0, 0, 0}};
 
 static swig_cast_info *swig_cast_initial[] = {
-  _swigc__p_Axes__Units,
+  _swigc__p_Axes,
   _swigc__p_AxisInfo,
   _swigc__p_BasicVector3DT_double_t,
   _swigc__p_BasicVector3DT_int_t,
@@ -47204,7 +46772,6 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_std__lessT_std__string_t,
   _swigc__p_std__mapT_std__string_double_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_double_t_t_t,
   _swigc__p_std__pairT_double_double_t,
-  _swigc__p_std__vectorT_Axes__Units_std__allocatorT_Axes__Units_t_t,
   _swigc__p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t,
   _swigc__p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t,
   _swigc__p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t,
@@ -47969,6 +47536,14 @@ SWIG_init(void) {
   // thread safe initialization
   swig::container_owner_attribute();
   
+  SWIG_Python_SetConstant(d, "Axes_DEFAULT",SWIG_From_int(static_cast< int >(Axes::DEFAULT)));
+  SWIG_Python_SetConstant(d, "Axes_NBINS",SWIG_From_int(static_cast< int >(Axes::NBINS)));
+  SWIG_Python_SetConstant(d, "Axes_RADIANS",SWIG_From_int(static_cast< int >(Axes::RADIANS)));
+  SWIG_Python_SetConstant(d, "Axes_DEGREES",SWIG_From_int(static_cast< int >(Axes::DEGREES)));
+  SWIG_Python_SetConstant(d, "Axes_MM",SWIG_From_int(static_cast< int >(Axes::MM)));
+  SWIG_Python_SetConstant(d, "Axes_QSPACE",SWIG_From_int(static_cast< int >(Axes::QSPACE)));
+  SWIG_Python_SetConstant(d, "Axes_QXQY",SWIG_From_int(static_cast< int >(Axes::QXQY)));
+  SWIG_Python_SetConstant(d, "Axes_RQ4",SWIG_From_int(static_cast< int >(Axes::RQ4)));
   SWIG_Python_SetConstant(d, "RectangularDetector_GENERIC",SWIG_From_int(static_cast< int >(RectangularDetector::GENERIC)));
   SWIG_Python_SetConstant(d, "RectangularDetector_PERPENDICULAR_TO_SAMPLE",SWIG_From_int(static_cast< int >(RectangularDetector::PERPENDICULAR_TO_SAMPLE)));
   SWIG_Python_SetConstant(d, "RectangularDetector_PERPENDICULAR_TO_DIRECT_BEAM",SWIG_From_int(static_cast< int >(RectangularDetector::PERPENDICULAR_TO_DIRECT_BEAM)));