From bc9e461bccd58915b4a8930b489dccefe6a080e3 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (o)" <j.wuttke@fz-juelich.de>
Date: Thu, 4 May 2023 16:00:28 +0200
Subject: [PATCH] rename IAxis -> Scale

---
 Base/Axis/Frame.cpp                           |  10 +-
 Base/Axis/Frame.h                             |  12 +-
 Base/Axis/FrameUtil.cpp                       |  10 +-
 Base/Axis/FrameUtil.h                         |   8 +-
 Base/Axis/MakeScale.cpp                       |  40 +-
 Base/Axis/MakeScale.h                         |  24 +-
 Base/Axis/{IAxis.cpp => Scale.cpp}            |  42 +-
 Base/Axis/{IAxis.h => Scale.h}                |  24 +-
 Base/Pixel/RectangularPixel.cpp               |   2 +-
 Base/Pixel/RectangularPixel.h                 |   4 +-
 Device/Coord/CoordSystem1D.cpp                |  12 +-
 Device/Coord/CoordSystem1D.h                  |   8 +-
 Device/Coord/CoordSystem2D.cpp                |  14 +-
 Device/Coord/CoordSystem2D.h                  |  12 +-
 Device/Coord/ICoordSystem.cpp                 |  10 +-
 Device/Coord/ICoordSystem.h                   |   8 +-
 Device/Data/ArrayUtil.cpp                     |   6 +-
 Device/Data/DataUtil.cpp                      |   4 +-
 Device/Data/Datafield.cpp                     |  16 +-
 Device/Data/Datafield.h                       |  10 +-
 Device/Detector/IDetector.cpp                 |  18 +-
 Device/Detector/IDetector.h                   |  12 +-
 Device/Detector/OffspecDetector.cpp           |  12 +-
 Device/Detector/OffspecDetector.h             |   6 +-
 Device/Detector/RectangularDetector.cpp       |  14 +-
 Device/Detector/RectangularDetector.h         |   2 +-
 Device/Detector/SphericalDetector.cpp         |  14 +-
 Device/Detector/SphericalDetector.h           |   2 +-
 Device/Histo/DiffUtil.cpp                     |   2 +-
 Device/Histo/SimulationResult.cpp             |   2 +-
 Device/IO/DataFormatUtil.cpp                  |   4 +-
 Device/IO/DataFormatUtil.h                    |   4 +-
 Device/IO/ReadWriteINT.cpp                    |   6 +-
 Device/IO/ReadWriteNicos.cpp                  |   2 +-
 Device/IO/ReadWriteNumpyTXT.cpp               |   2 +-
 Device/IO/ReadWriteTiff.cpp                   |   2 +-
 Device/Mask/DetectorMask.cpp                  |   4 +-
 Device/Mask/DetectorMask.h                    |   8 +-
 .../ConvolutionDetectorResolution.cpp         |   8 +-
 GUI/Model/Axis/BasicAxisItem.cpp              |   8 +-
 GUI/Model/Axis/BasicAxisItem.h                |   6 +-
 GUI/Model/Axis/PointwiseAxisItem.cpp          |  16 +-
 GUI/Model/Axis/PointwiseAxisItem.h            |   8 +-
 GUI/Model/Beam/GrazingScanItem.cpp            |   6 +-
 GUI/Model/Beam/GrazingScanItem.h              |   6 +-
 GUI/Model/Beam/SourceItems.cpp                |   6 +-
 GUI/Model/Beam/SourceItems.h                  |   4 +-
 GUI/Model/Data/IntensityDataItem.cpp          |   2 +-
 GUI/Model/Data/SpecularDataItem.cpp           |   2 +-
 GUI/Model/Descriptor/AxisProperty.cpp         |   4 +-
 GUI/Model/Descriptor/AxisProperty.h           |   2 +-
 GUI/Model/Device/InstrumentItems.cpp          |  22 +-
 GUI/Model/Device/InstrumentItems.h            |   4 +-
 GUI/Model/FromCore/ItemizeSimulation.cpp      |  10 +-
 GUI/Support/IO/ImportDataInfo.cpp             |   2 +-
 GUI/View/Projection/ProjectionsPlot.cpp       |   2 +-
 .../Projection/SaveProjectionsAssistant.cpp   |   2 +-
 Sim/Export/PyFmt2.cpp                         |   4 +-
 Sim/Export/PyFmt2.h                           |   4 +-
 Sim/Export/SimulationToPython.cpp             |   2 +-
 Sim/Fitting/SimDataPair.cpp                   |   2 +-
 Sim/Scan/AlphaScan.cpp                        |   4 +-
 Sim/Scan/AlphaScan.h                          |   2 +-
 Sim/Scan/IBeamScan.cpp                        |   4 +-
 Sim/Scan/IBeamScan.h                          |   8 +-
 Sim/Scan/QzScan.cpp                           |   6 +-
 Sim/Scan/QzScan.h                             |   6 +-
 Sim/Simulation/DepthprobeSimulation.cpp       |   8 +-
 Sim/Simulation/DepthprobeSimulation.h         |   6 +-
 Sim/Simulation/OffspecSimulation.cpp          |   4 +-
 Sim/Simulation/ScatteringSimulation.cpp       |   2 +-
 Sim/Simulation/SpecularSimulation.cpp         |   2 +-
 Tests/Functional/Fitting/FitTests.cpp         |   2 +-
 Tests/SimFactory/MakeSimulations.cpp          |  10 +-
 Tests/Suite/Common/TestSuite.h                |   2 +-
 Tests/Unit/Device/ArrayUtilsTest.cpp          |   2 +-
 Tests/Unit/Device/DepthprobeConverterTest.cpp |   8 +-
 Tests/Unit/Device/FixedBinAxisTest.cpp        |  38 +-
 Tests/Unit/Device/IOReaderWriterTest.cpp      |   2 +-
 .../Device/IntensityDataFunctionsTest.cpp     |   4 +-
 Tests/Unit/Device/OffspecConverterTest.cpp    |  10 +-
 Tests/Unit/Device/PointwiseAxisTest.cpp       |  42 +-
 .../Unit/Device/RectangularConverterTest.cpp  |   6 +-
 Tests/Unit/Device/RegionOfInterestTest.cpp    |   6 +-
 Tests/Unit/Device/SphericalConverterTest.cpp  |   6 +-
 Tests/Unit/Device/SphericalDetectorTest.cpp   |   6 +-
 Tests/Unit/GUI/Utils.cpp                      |   2 +-
 Tests/Unit/Sim/CoordSystem1DTest.cpp          |  24 +-
 Tests/Unit/Sim/SpecularScanTest.cpp           |   8 +-
 Tests/Unit/Sim/SpecularSimulationTest.cpp     |   2 +-
 Wrap/Swig/fromBase.i                          |   2 +-
 Wrap/Swig/libBornAgainBase.i                  |   4 +-
 Wrap/Swig/libBornAgainDevice.i                |   2 +-
 Wrap/Swig/libBornAgainSim.i                   |   2 +-
 auto/Wrap/libBornAgainBase.py                 | 112 ++--
 auto/Wrap/libBornAgainBase_wrap.cpp           | 516 +++++++++---------
 auto/Wrap/libBornAgainDevice.py               |  20 +-
 auto/Wrap/libBornAgainDevice_wrap.cpp         | 248 ++++-----
 auto/Wrap/libBornAgainSim.py                  |   6 +-
 auto/Wrap/libBornAgainSim_wrap.cpp            | 128 ++---
 100 files changed, 898 insertions(+), 898 deletions(-)
 rename Base/Axis/{IAxis.cpp => Scale.cpp} (77%)
 rename Base/Axis/{IAxis.h => Scale.h} (77%)

diff --git a/Base/Axis/Frame.cpp b/Base/Axis/Frame.cpp
index e29aabf72fb..db0d75253d3 100644
--- a/Base/Axis/Frame.cpp
+++ b/Base/Axis/Frame.cpp
@@ -14,10 +14,10 @@
 
 #include "Base/Axis/Frame.h"
 #include "Base/Axis/FrameUtil.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Util/Assert.h"
 
-Frame::Frame(std::vector<const IAxis*>&& axes)
+Frame::Frame(std::vector<const Scale*>&& axes)
     : m_axes(std::move(axes))
     , m_size(FrameUtil::product_size(m_axes.reference()))
 {
@@ -40,15 +40,15 @@ size_t Frame::size() const
     return m_size;
 }
 
-const IAxis& Frame::axis(size_t k_axis) const
+const Scale& Frame::axis(size_t k_axis) const
 {
     return *m_axes.at(k_axis);
 }
-const IAxis& Frame::xAxis() const
+const Scale& Frame::xAxis() const
 {
     return *m_axes.at(0);
 }
-const IAxis& Frame::yAxis() const
+const Scale& Frame::yAxis() const
 {
     return *m_axes.at(1);
 }
diff --git a/Base/Axis/Frame.h b/Base/Axis/Frame.h
index 8da665d1ffa..d79ee1b912f 100644
--- a/Base/Axis/Frame.h
+++ b/Base/Axis/Frame.h
@@ -20,14 +20,14 @@
 
 using std::size_t;
 
-class IAxis;
+class Scale;
 
 //! Holds one or two axes.
 
 class Frame : public ICloneable {
 public:
     //! Constructor that takes ownership of supplied axes.
-    Frame(std::vector<const IAxis*>&& axes);
+    Frame(std::vector<const Scale*>&& axes);
 
     virtual ~Frame();
 
@@ -43,9 +43,9 @@ public:
     size_t projectedSize(size_t k_axis) const;
 
     //! Returns axis with given serial number
-    const IAxis& axis(size_t k_axis) const;
-    const IAxis& xAxis() const;
-    const IAxis& yAxis() const;
+    const Scale& axis(size_t k_axis) const;
+    const Scale& xAxis() const;
+    const Scale& yAxis() const;
 
     //! Returns the value of selected axis for given i_flat.
     //! @param i_flat The global index of this data structure.
@@ -77,7 +77,7 @@ public:
     bool operator==(const Frame&) const;
 
 protected:
-    OwningVector<const IAxis> m_axes;
+    OwningVector<const Scale> m_axes;
 
 private:
     size_t m_size; // cached product of axis sizes
diff --git a/Base/Axis/FrameUtil.cpp b/Base/Axis/FrameUtil.cpp
index 8cf1bdd4c5f..07c85e2bad6 100644
--- a/Base/Axis/FrameUtil.cpp
+++ b/Base/Axis/FrameUtil.cpp
@@ -14,14 +14,14 @@
 
 #include "Base/Axis/FrameUtil.h"
 #include "Base/Axis/Frame.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 
-size_t FrameUtil::product_size(const std::vector<const IAxis*>& axes)
+size_t FrameUtil::product_size(const std::vector<const Scale*>& axes)
 {
     if (axes.empty())
         return 0;
     size_t result = 1;
-    for (const IAxis* ax : axes)
+    for (const Scale* ax : axes)
         result *= ax->size();
     return result;
 }
@@ -32,7 +32,7 @@ size_t FrameUtil::product_size(const std::vector<const IAxis*>& axes)
 // (center of non-existing bin #-1).
 // Used for Mask conversion.
 
-double FrameUtil::coordinateToBinf(double coordinate, const IAxis& axis)
+double FrameUtil::coordinateToBinf(double coordinate, const Scale& axis)
 {
     size_t index = axis.closestIndex(coordinate);
     Bin1D bin = axis.bin(index);
@@ -40,7 +40,7 @@ double FrameUtil::coordinateToBinf(double coordinate, const IAxis& axis)
     return static_cast<double>(index) + f;
 }
 
-double FrameUtil::coordinateFromBinf(double value, const IAxis& axis)
+double FrameUtil::coordinateFromBinf(double value, const Scale& axis)
 {
     int index = static_cast<int>(value);
 
diff --git a/Base/Axis/FrameUtil.h b/Base/Axis/FrameUtil.h
index 28ad4ded0a5..76a35ba424a 100644
--- a/Base/Axis/FrameUtil.h
+++ b/Base/Axis/FrameUtil.h
@@ -19,18 +19,18 @@
 #include <vector>
 
 class Frame;
-class IAxis;
+class Scale;
 
 namespace FrameUtil {
 
 //! Product of axis sizes.
-size_t product_size(const std::vector<const IAxis*>& axes);
+size_t product_size(const std::vector<const Scale*>& axes);
 
 //! Transforms coordinate on axis into the bin-fraction-coordinate.
-double coordinateToBinf(double coordinate, const IAxis& axis);
+double coordinateToBinf(double coordinate, const Scale& axis);
 
 //! Transforms bin-fraction-coordinate into axis coordinate.
-double coordinateFromBinf(double value, const IAxis& axis);
+double coordinateFromBinf(double value, const Scale& axis);
 
 //! Transforms x,y coordinate from Datafield axes coordinates to bin-fraction-coordinates.
 void coordinatesToBinf(double& x, double& y, const Frame& frame);
diff --git a/Base/Axis/MakeScale.cpp b/Base/Axis/MakeScale.cpp
index 7056980bec9..97fd635a616 100644
--- a/Base/Axis/MakeScale.cpp
+++ b/Base/Axis/MakeScale.cpp
@@ -3,7 +3,7 @@
 //  BornAgain: simulate and fit reflection and scattering
 //
 //! @file      Base/Axis/MakeScale.cpp
-//! @brief     Implements functions that create instances of class IAxis.
+//! @brief     Implements functions that create instances of class Scale.
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Base/Axis/MakeScale.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Util/Assert.h"
 
 namespace {
@@ -41,41 +41,41 @@ std::vector<Bin1D> bounds2bins(size_t N, double start, double end)
 } // namespace
 
 
-IAxis DiscreteAxis(const std::string& name, const std::vector<double>& points)
+Scale DiscreteAxis(const std::string& name, const std::vector<double>& points)
 {
-    return IAxis(name, centers2bins(points));
+    return Scale(name, centers2bins(points));
 }
 
-IAxis* newDiscreteAxis(const std::string& name, const std::vector<double>& points)
+Scale* newDiscreteAxis(const std::string& name, const std::vector<double>& points)
 {
-    return new IAxis(name, centers2bins(points));
+    return new Scale(name, centers2bins(points));
 }
 
 
-IAxis FixedBinAxis(const std::string& name, size_t nbins, double start, double end)
+Scale FixedBinAxis(const std::string& name, size_t nbins, double start, double end)
 {
-    return IAxis(name, bounds2bins(nbins, start, end));
+    return Scale(name, bounds2bins(nbins, start, end));
 }
 
-IAxis* newFixedBinAxis(const std::string& name, size_t nbins, double start, double end)
+Scale* newFixedBinAxis(const std::string& name, size_t nbins, double start, double end)
 {
-    return new IAxis(name, bounds2bins(nbins, start, end));
+    return new Scale(name, bounds2bins(nbins, start, end));
 }
 
-std::shared_ptr<IAxis> sharedFixedBinAxis(const std::string& name, size_t nbins, double start,
+std::shared_ptr<Scale> sharedFixedBinAxis(const std::string& name, size_t nbins, double start,
                                           double end)
 {
-    return std::shared_ptr<IAxis>(newFixedBinAxis(name, nbins, start, end));
+    return std::shared_ptr<Scale>(newFixedBinAxis(name, nbins, start, end));
 }
 
-std::unique_ptr<IAxis> uniqueFixedBinAxis(const std::string& name, size_t nbins, double start,
+std::unique_ptr<Scale> uniqueFixedBinAxis(const std::string& name, size_t nbins, double start,
                                           double end)
 {
-    return std::unique_ptr<IAxis>(newFixedBinAxis(name, nbins, start, end));
+    return std::unique_ptr<Scale>(newFixedBinAxis(name, nbins, start, end));
 }
 
 
-IAxis FixedScanAxis(const std::string& name, size_t nbins, double scan_start, double scan_end)
+Scale FixedScanAxis(const std::string& name, size_t nbins, double scan_start, double scan_end)
 {
     if (nbins < 2)
         throw std::runtime_error("Cannot create scan axis with less than two points");
@@ -83,7 +83,7 @@ IAxis FixedScanAxis(const std::string& name, size_t nbins, double scan_start, do
     return FixedBinAxis(name, nbins, scan_start - delta / 2, scan_end + delta / 2);
 }
 
-IAxis* newFixedScanAxis(const std::string& name, size_t nbins, double scan_start, double scan_end)
+Scale* newFixedScanAxis(const std::string& name, size_t nbins, double scan_start, double scan_end)
 {
     if (nbins < 2)
         throw std::runtime_error("Cannot create scan axis with less than two points");
@@ -91,14 +91,14 @@ IAxis* newFixedScanAxis(const std::string& name, size_t nbins, double scan_start
     return newFixedBinAxis(name, nbins, scan_start - delta / 2, scan_end + delta / 2);
 }
 
-std::shared_ptr<IAxis> sharedFixedScanAxis(const std::string& name, size_t nbins, double scan_start,
+std::shared_ptr<Scale> sharedFixedScanAxis(const std::string& name, size_t nbins, double scan_start,
                                            double scan_end)
 {
-    return std::shared_ptr<IAxis>(newFixedBinAxis(name, nbins, scan_start, scan_end));
+    return std::shared_ptr<Scale>(newFixedBinAxis(name, nbins, scan_start, scan_end));
 }
 
-std::unique_ptr<IAxis> uniqueFixedScanAxis(const std::string& name, size_t nbins, double scan_start,
+std::unique_ptr<Scale> uniqueFixedScanAxis(const std::string& name, size_t nbins, double scan_start,
                                            double scan_end)
 {
-    return std::unique_ptr<IAxis>(newFixedBinAxis(name, nbins, scan_start, scan_end));
+    return std::unique_ptr<Scale>(newFixedBinAxis(name, nbins, scan_start, scan_end));
 }
diff --git a/Base/Axis/MakeScale.h b/Base/Axis/MakeScale.h
index 6901d9b974d..1202ba9e618 100644
--- a/Base/Axis/MakeScale.h
+++ b/Base/Axis/MakeScale.h
@@ -3,7 +3,7 @@
 //  BornAgain: simulate and fit reflection and scattering
 //
 //! @file      Base/Axis/MakeScale.h
-//! @brief     Declares functions that create instances of class IAxis.
+//! @brief     Declares functions that create instances of class Scale.
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -18,26 +18,26 @@
 #include <memory>
 #include <vector>
 
-class IAxis;
+class Scale;
 
-IAxis DiscreteAxis(const std::string& name, const std::vector<double>& points);
-IAxis* newDiscreteAxis(const std::string& name, const std::vector<double>& points);
+Scale DiscreteAxis(const std::string& name, const std::vector<double>& points);
+Scale* newDiscreteAxis(const std::string& name, const std::vector<double>& points);
 
 //! Returns axis with fixed bin size.
-IAxis FixedBinAxis(const std::string& name, size_t nbins, double start, double end);
-IAxis* newFixedBinAxis(const std::string& name, size_t nbins, double start, double end);
-std::shared_ptr<IAxis> sharedFixedBinAxis(const std::string& name, size_t nbins, double start,
+Scale FixedBinAxis(const std::string& name, size_t nbins, double start, double end);
+Scale* newFixedBinAxis(const std::string& name, size_t nbins, double start, double end);
+std::shared_ptr<Scale> sharedFixedBinAxis(const std::string& name, size_t nbins, double start,
                                           double end);
-std::unique_ptr<IAxis> uniqueFixedBinAxis(const std::string& name, size_t nbins, double start,
+std::unique_ptr<Scale> uniqueFixedBinAxis(const std::string& name, size_t nbins, double start,
                                           double end);
 
 #ifndef SWIG
 //! Returns a FixedBinAxis determined by first and last point in scan.
-IAxis FixedScanAxis(const std::string& name, size_t nbins, double scan_start, double scan_end);
-IAxis* newFixedScanAxis(const std::string& name, size_t nbins, double scan_start, double scan_end);
-std::shared_ptr<IAxis> sharedFixedScanAxis(const std::string& name, size_t nbins, double scan_start,
+Scale FixedScanAxis(const std::string& name, size_t nbins, double scan_start, double scan_end);
+Scale* newFixedScanAxis(const std::string& name, size_t nbins, double scan_start, double scan_end);
+std::shared_ptr<Scale> sharedFixedScanAxis(const std::string& name, size_t nbins, double scan_start,
                                            double scan_end);
-std::unique_ptr<IAxis> uniqueFixedScanAxis(const std::string& name, size_t nbins, double scan_start,
+std::unique_ptr<Scale> uniqueFixedScanAxis(const std::string& name, size_t nbins, double scan_start,
                                            double scan_end);
 
 #endif // SWIG
diff --git a/Base/Axis/IAxis.cpp b/Base/Axis/Scale.cpp
similarity index 77%
rename from Base/Axis/IAxis.cpp
rename to Base/Axis/Scale.cpp
index 06c3766b831..e8bade0dadf 100644
--- a/Base/Axis/IAxis.cpp
+++ b/Base/Axis/Scale.cpp
@@ -2,8 +2,8 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      Base/Axis/IAxis.cpp
-//! @brief     Implements interface IAxis.
+//! @file      Base/Axis/Scale.cpp
+//! @brief     Implements interface Scale.
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -12,11 +12,11 @@
 //
 //  ************************************************************************************************
 
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Util/Assert.h"
 #include <iomanip>
 
-IAxis::IAxis(std::string name, const std::vector<Bin1D>& bins)
+Scale::Scale(std::string name, const std::vector<Bin1D>& bins)
     : m_name(name)
     , m_bins(bins)
 {
@@ -27,52 +27,52 @@ IAxis::IAxis(std::string name, const std::vector<Bin1D>& bins)
     }
 }
 
-size_t IAxis::size() const
+size_t Scale::size() const
 {
     return m_bins.size();
 }
 
-double IAxis::min() const
+double Scale::min() const
 {
     return m_bins.front().lowerBound();
 }
 
-double IAxis::max() const
+double Scale::max() const
 {
     return m_bins.back().upperBound();
 }
 
-std::pair<double, double> IAxis::bounds() const
+std::pair<double, double> Scale::bounds() const
 {
     return {min(), max()};
 }
 
-bool IAxis::rangeComprises(double value) const
+bool Scale::rangeComprises(double value) const
 {
     return value >= min() && value < max();
 }
 
-double IAxis::span() const
+double Scale::span() const
 {
     return max() - min();
 }
 
-double IAxis::center() const
+double Scale::center() const
 {
     return (max() + min()) / 2;
 }
 
-const Bin1D& IAxis::bin(size_t i) const
+const Bin1D& Scale::bin(size_t i) const
 {
     return m_bins.at(i);
 }
 
-double IAxis::binCenter(size_t i) const
+double Scale::binCenter(size_t i) const
 {
     return bin(i).center();
 }
 
-std::vector<double> IAxis::binCenters() const
+std::vector<double> Scale::binCenters() const
 {
     std::vector<double> result;
     for (const Bin1D& b : m_bins)
@@ -80,7 +80,7 @@ std::vector<double> IAxis::binCenters() const
     return result;
 }
 
-size_t IAxis::closestIndex(double value) const
+size_t Scale::closestIndex(double value) const
 {
     for (size_t i = 0; i < size() - 1; ++i)
         if (value < (bin(i).upperBound() + bin(i + 1).lowerBound()) / 2)
@@ -88,7 +88,7 @@ size_t IAxis::closestIndex(double value) const
     return size() - 1;
 }
 
-bool IAxis::isEquidistantCoverage() const
+bool Scale::isEquidistantCoverage() const
 {
     const size_t N = size();
     for (size_t i = 0; i < N; ++i) {
@@ -101,7 +101,7 @@ bool IAxis::isEquidistantCoverage() const
     return true;
 }
 
-bool IAxis::isDiscrete() const
+bool Scale::isDiscrete() const
 {
     for (const Bin1D& b : bins())
         if (b.binSize())
@@ -109,7 +109,7 @@ bool IAxis::isDiscrete() const
     return true;
 }
 
-IAxis IAxis::clipped(double lower, double upper) const
+Scale Scale::clipped(double lower, double upper) const
 {
     std::vector<Bin1D> out_bins;
     for (const Bin1D& b : m_bins)
@@ -118,17 +118,17 @@ IAxis IAxis::clipped(double lower, double upper) const
     return {m_name, out_bins};
 }
 
-IAxis IAxis::clipped(std::pair<double, double> bounds) const
+Scale Scale::clipped(std::pair<double, double> bounds) const
 {
     return clipped(bounds.first, bounds.second);
 }
 
-bool IAxis::operator==(const IAxis& other) const
+bool Scale::operator==(const Scale& other) const
 {
     return m_name == other.m_name && m_bins == other.m_bins;
 }
 
-std::ostream& operator<<(std::ostream& ostr, const IAxis& ax)
+std::ostream& operator<<(std::ostream& ostr, const Scale& ax)
 {
     size_t N = ax.size();
     ASSERT(N > 0);
diff --git a/Base/Axis/IAxis.h b/Base/Axis/Scale.h
similarity index 77%
rename from Base/Axis/IAxis.h
rename to Base/Axis/Scale.h
index 68b734e0ade..28fd16d5e0f 100644
--- a/Base/Axis/IAxis.h
+++ b/Base/Axis/Scale.h
@@ -2,8 +2,8 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      Base/Axis/IAxis.h
-//! @brief     Defines interface IAxis.
+//! @file      Base/Axis/Scale.h
+//! @brief     Defines interface Scale.
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -12,8 +12,8 @@
 //
 //  ************************************************************************************************
 
-#ifndef BORNAGAIN_BASE_AXIS_IAXIS_H
-#define BORNAGAIN_BASE_AXIS_IAXIS_H
+#ifndef BORNAGAIN_BASE_AXIS_SCALE_H
+#define BORNAGAIN_BASE_AXIS_SCALE_H
 
 #include "Base/Axis/Bin.h"
 #include <string>
@@ -22,10 +22,10 @@
 
 //! Abstract base class for one-dimensional axes.
 
-class IAxis {
+class Scale {
 public:
-    IAxis(std::string name, const std::vector<Bin1D>& bins);
-    IAxis* clone() const { return new IAxis(*this); }
+    Scale(std::string name, const std::vector<Bin1D>& bins);
+    Scale* clone() const { return new Scale(*this); }
 
     //! Sets the axis label
     void setAxisName(std::string name) { m_name = name; }
@@ -69,12 +69,12 @@ public:
     bool isEquidistantCoverage() const;
     bool isDiscrete() const;
 
-    IAxis clipped(double lower, double upper) const;
-    IAxis clipped(std::pair<double, double> bounds) const;
+    Scale clipped(double lower, double upper) const;
+    Scale clipped(std::pair<double, double> bounds) const;
 
-    bool operator==(const IAxis& right) const;
+    bool operator==(const Scale& right) const;
 
-    friend std::ostream& operator<<(std::ostream& ostr, const IAxis& m);
+    friend std::ostream& operator<<(std::ostream& ostr, const Scale& m);
 
 protected:
     // private:
@@ -82,4 +82,4 @@ protected:
     std::vector<Bin1D> m_bins;
 };
 
-#endif // BORNAGAIN_BASE_AXIS_IAXIS_H
+#endif // BORNAGAIN_BASE_AXIS_SCALE_H
diff --git a/Base/Pixel/RectangularPixel.cpp b/Base/Pixel/RectangularPixel.cpp
index 4048ce34570..76ecb4b619c 100644
--- a/Base/Pixel/RectangularPixel.cpp
+++ b/Base/Pixel/RectangularPixel.cpp
@@ -76,7 +76,7 @@ double RectangularPixel::calculateSolidAngle() const
     return std::abs(position.dot(m_normal)) / std::pow(length, 3);
 }
 
-IAxis* RectangularPixel::createAxis(size_t n) const
+Scale* RectangularPixel::createAxis(size_t n) const
 {
     const auto k00 = getPosition(0.0, 0.0);
     const auto k01 = getPosition(0.0, 1.0);
diff --git a/Base/Pixel/RectangularPixel.h b/Base/Pixel/RectangularPixel.h
index 82deddcc31d..adbfb05fd97 100644
--- a/Base/Pixel/RectangularPixel.h
+++ b/Base/Pixel/RectangularPixel.h
@@ -20,7 +20,7 @@
 
 #include "Base/Pixel/IPixel.h"
 
-class IAxis;
+class Scale;
 
 //! A pixel in a RectangularDetector.
 
@@ -35,7 +35,7 @@ public:
     double integrationFactor(double x, double y) const override;
     double solidAngle() const override;
 
-    IAxis* createAxis(size_t n) const;
+    Scale* createAxis(size_t n) const;
 
 private:
     R3 normalizeLength(R3 direction, double length) const;
diff --git a/Device/Coord/CoordSystem1D.cpp b/Device/Coord/CoordSystem1D.cpp
index 037acae7fae..184d6584c71 100644
--- a/Device/Coord/CoordSystem1D.cpp
+++ b/Device/Coord/CoordSystem1D.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Device/Coord/CoordSystem1D.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Base/Const/Units.h"
 #include "Base/Util/Assert.h"
@@ -50,7 +50,7 @@ double backTransform(double value, Coords coords, double wavelength)
     }
 }
 
-IAxis* createAxisFrom(const IAxis& axis, Coords coords, const std::string& name, double wavelength)
+Scale* createAxisFrom(const Scale& axis, Coords coords, const std::string& name, double wavelength)
 {
     std::vector<double> ret;
     ret.reserve(axis.size());
@@ -66,7 +66,7 @@ IAxis* createAxisFrom(const IAxis& axis, Coords coords, const std::string& name,
 //  class CoordSystem1D
 //  ************************************************************************************************
 
-CoordSystem1D::CoordSystem1D(const IAxis* axis)
+CoordSystem1D::CoordSystem1D(const Scale* axis)
     : ICoordSystem({axis})
 {
 }
@@ -91,7 +91,7 @@ double CoordSystem1D::calculateMax(size_t i_axis, Coords units) const
     return translator(m_axes[0]->binCenter(m_axes[0]->size() - 1));
 }
 
-IAxis* CoordSystem1D::convertedAxis(size_t i_axis, Coords units) const
+Scale* CoordSystem1D::convertedAxis(size_t i_axis, Coords units) const
 {
     ASSERT(i_axis == 0);
     units = substituteDefaultUnits(units);
@@ -111,7 +111,7 @@ IAxis* CoordSystem1D::convertedAxis(size_t i_axis, Coords units) const
 //  class AngularReflectometryCoords
 //  ************************************************************************************************
 
-AngularReflectometryCoords::AngularReflectometryCoords(double wavelength, const IAxis& axis,
+AngularReflectometryCoords::AngularReflectometryCoords(double wavelength, const Scale& axis,
                                                        Coords axis_units)
     : CoordSystem1D(createAxisFrom(axis, axis_units, nameOfAxis0(axis_units), wavelength))
     , m_wavelength(wavelength)
@@ -183,7 +183,7 @@ std::function<double(double)> AngularReflectometryCoords::getTraslatorTo(Coords
 //  class WavenumberReflectometryCoords
 //  ************************************************************************************************
 
-WavenumberReflectometryCoords::WavenumberReflectometryCoords(const IAxis* axis)
+WavenumberReflectometryCoords::WavenumberReflectometryCoords(const Scale* axis)
     : CoordSystem1D(axis)
 {
 }
diff --git a/Device/Coord/CoordSystem1D.h b/Device/Coord/CoordSystem1D.h
index 07ef552b3a4..422d035ded6 100644
--- a/Device/Coord/CoordSystem1D.h
+++ b/Device/Coord/CoordSystem1D.h
@@ -26,13 +26,13 @@
 
 class CoordSystem1D : public ICoordSystem {
 public:
-    CoordSystem1D(const IAxis* axis); //!< Takes ownership of axis
+    CoordSystem1D(const Scale* axis); //!< Takes ownership of axis
     ~CoordSystem1D() override = default;
 
     CoordSystem1D* clone() const override = 0;
 
     //! Creates axis in converted units.
-    IAxis* convertedAxis(size_t i_axis, Coords units) const override;
+    Scale* convertedAxis(size_t i_axis, Coords units) const override;
 
     //! Calculates minimum on-axis value in given units.
     double calculateMin(size_t i_axis, Coords units) const override;
@@ -50,7 +50,7 @@ private:
 class AngularReflectometryCoords : public CoordSystem1D {
 public:
     //! Constructs the object for unit conversion.
-    AngularReflectometryCoords(double wavelength, const IAxis& axis,
+    AngularReflectometryCoords(double wavelength, const Scale& axis,
                                Coords axis_units = Coords::RADIANS);
     ~AngularReflectometryCoords() override;
 
@@ -80,7 +80,7 @@ private:
 //! Conversion of axis units for the case of q-defined reflectometry.
 class WavenumberReflectometryCoords : public CoordSystem1D {
 public:
-    WavenumberReflectometryCoords(const IAxis* axis);
+    WavenumberReflectometryCoords(const Scale* axis);
     ~WavenumberReflectometryCoords() override;
 
     WavenumberReflectometryCoords* clone() const override;
diff --git a/Device/Coord/CoordSystem2D.cpp b/Device/Coord/CoordSystem2D.cpp
index 32428e4c147..80133a7780d 100644
--- a/Device/Coord/CoordSystem2D.cpp
+++ b/Device/Coord/CoordSystem2D.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Device/Coord/CoordSystem2D.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Base/Const/Units.h"
 #include "Base/Pixel/RectangularPixel.h"
@@ -44,7 +44,7 @@ double axisAngle(size_t i_axis, R3 kf)
 //  class CoordSystem2D
 //  ************************************************************************************************
 
-CoordSystem2D::CoordSystem2D(std::vector<const IAxis*>&& axes)
+CoordSystem2D::CoordSystem2D(std::vector<const Scale*>&& axes)
     : ICoordSystem(std::move(axes))
 {
 }
@@ -77,7 +77,7 @@ std::vector<Coords> CoordSystem2D::availableUnits() const
     return {Coords::NBINS, Coords::RADIANS, Coords::DEGREES};
 }
 
-IAxis* CoordSystem2D::convertedAxis(size_t i_axis, Coords units) const
+Scale* CoordSystem2D::convertedAxis(size_t i_axis, Coords units) const
 {
     const double min = calculateMin(i_axis, units);
     const double max = calculateMax(i_axis, units);
@@ -90,7 +90,7 @@ IAxis* CoordSystem2D::convertedAxis(size_t i_axis, Coords units) const
 //  class SphericalCoords
 //  ************************************************************************************************
 
-SphericalCoords::SphericalCoords(std::vector<const IAxis*>&& axes, const R3& ki)
+SphericalCoords::SphericalCoords(std::vector<const Scale*>&& axes, const R3& ki)
     : CoordSystem2D(std::move(axes))
     , m_ki(ki)
 {
@@ -175,7 +175,7 @@ std::string SphericalCoords::nameOfAxis(size_t i_axis, const Coords units) const
 //  class ImageCoords
 //  ************************************************************************************************
 
-ImageCoords::ImageCoords(std::vector<const IAxis*>&& axes, const R3& ki,
+ImageCoords::ImageCoords(std::vector<const Scale*>&& axes, const R3& ki,
                          const RectangularPixel* regionOfInterestPixel)
     : CoordSystem2D(std::move(axes))
     , m_detector_pixel(regionOfInterestPixel)
@@ -278,7 +278,7 @@ std::string ImageCoords::nameOfAxis(size_t i_axis, const Coords units) const
 //  class OffspecCoords
 //  ************************************************************************************************
 
-OffspecCoords::OffspecCoords(std::vector<const IAxis*>&& axes)
+OffspecCoords::OffspecCoords(std::vector<const Scale*>&& axes)
     : CoordSystem2D(std::move(axes))
 {
 }
@@ -335,7 +335,7 @@ std::string OffspecCoords::nameOfAxis(size_t i_axis, const Coords units) const
 
 const std::string z_axis_name = "Position [nm]";
 
-DepthprobeCoords::DepthprobeCoords(std::vector<const IAxis*>&& axes, double ki0)
+DepthprobeCoords::DepthprobeCoords(std::vector<const Scale*>&& axes, double ki0)
     : CoordSystem2D(std::move(axes))
     , m_ki0(ki0)
 {
diff --git a/Device/Coord/CoordSystem2D.h b/Device/Coord/CoordSystem2D.h
index b5ea5e0400b..3aed42b1765 100644
--- a/Device/Coord/CoordSystem2D.h
+++ b/Device/Coord/CoordSystem2D.h
@@ -29,7 +29,7 @@ class RectangularPixel;
 
 class CoordSystem2D : public ICoordSystem {
 public:
-    CoordSystem2D(std::vector<const IAxis*>&& axes);
+    CoordSystem2D(std::vector<const Scale*>&& axes);
     ~CoordSystem2D() override = default;
 
     double calculateMin(size_t i_axis, Coords units) const override;
@@ -39,7 +39,7 @@ public:
     //! Further units may be added by child classes.
     std::vector<Coords> availableUnits() const override;
 
-    IAxis* convertedAxis(size_t i_axis, Coords units) const override;
+    Scale* convertedAxis(size_t i_axis, Coords units) const override;
 
 protected:
     CoordSystem2D(const CoordSystem2D& other);
@@ -54,7 +54,7 @@ private:
 
 class SphericalCoords : public CoordSystem2D {
 public:
-    SphericalCoords(std::vector<const IAxis*>&& axes, const R3& ki);
+    SphericalCoords(std::vector<const Scale*>&& axes, const R3& ki);
     ~SphericalCoords() override;
 
     SphericalCoords* clone() const override;
@@ -77,7 +77,7 @@ private:
 
 class ImageCoords : public CoordSystem2D {
 public:
-    ImageCoords(std::vector<const IAxis*>&& axes, const R3& ki,
+    ImageCoords(std::vector<const Scale*>&& axes, const R3& ki,
                 const RectangularPixel* regionOfInterestPixel);
     ~ImageCoords() override;
 
@@ -104,7 +104,7 @@ private:
 
 class OffspecCoords : public CoordSystem2D {
 public:
-    OffspecCoords(std::vector<const IAxis*>&& axes);
+    OffspecCoords(std::vector<const Scale*>&& axes);
 
     OffspecCoords* clone() const override;
 
@@ -123,7 +123,7 @@ private:
 
 class DepthprobeCoords : public CoordSystem2D {
 public:
-    DepthprobeCoords(std::vector<const IAxis*>&& axes, double ki0);
+    DepthprobeCoords(std::vector<const Scale*>&& axes, double ki0);
     ~DepthprobeCoords() override;
 
     DepthprobeCoords* clone() const override;
diff --git a/Device/Coord/ICoordSystem.cpp b/Device/Coord/ICoordSystem.cpp
index 93af0a64520..f252f343e8f 100644
--- a/Device/Coord/ICoordSystem.cpp
+++ b/Device/Coord/ICoordSystem.cpp
@@ -14,24 +14,24 @@
 
 #include "Device/Coord/ICoordSystem.h"
 #include "Base/Axis/FrameUtil.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Util/Assert.h"
 
-ICoordSystem::ICoordSystem(std::vector<const IAxis*>&& axes)
+ICoordSystem::ICoordSystem(std::vector<const Scale*>&& axes)
     : Frame(std::move(axes))
 {
 }
 
 ICoordSystem::~ICoordSystem() = default;
 
-std::vector<const IAxis*> ICoordSystem::defaultAxes() const
+std::vector<const Scale*> ICoordSystem::defaultAxes() const
 {
     return convertedAxes(defaultUnits());
 }
 
-std::vector<const IAxis*> ICoordSystem::convertedAxes(Coords units) const
+std::vector<const Scale*> ICoordSystem::convertedAxes(Coords units) const
 {
-    std::vector<const IAxis*> result;
+    std::vector<const Scale*> result;
     for (size_t i = 0; i < rank(); ++i)
         result.emplace_back(convertedAxis(i, units));
     return result;
diff --git a/Device/Coord/ICoordSystem.h b/Device/Coord/ICoordSystem.h
index 2d721cfd61f..1413374b91f 100644
--- a/Device/Coord/ICoordSystem.h
+++ b/Device/Coord/ICoordSystem.h
@@ -26,7 +26,7 @@
 
 class ICoordSystem : public Frame {
 public:
-    ICoordSystem(std::vector<const IAxis*>&& axes);
+    ICoordSystem(std::vector<const Scale*>&& axes);
     ~ICoordSystem() override;
 
     ICoordSystem* clone() const override = 0;
@@ -39,10 +39,10 @@ public:
     virtual std::vector<Coords> availableUnits() const = 0;
     virtual Coords defaultUnits() const = 0;
 
-    virtual IAxis* convertedAxis(size_t i_axis, Coords units) const = 0;
+    virtual Scale* convertedAxis(size_t i_axis, Coords units) const = 0;
 
-    std::vector<const IAxis*> defaultAxes() const;
-    std::vector<const IAxis*> convertedAxes(Coords units) const;
+    std::vector<const Scale*> defaultAxes() const;
+    std::vector<const Scale*> convertedAxes(Coords units) const;
 
 protected:
     Coords substituteDefaultUnits(Coords units) const;
diff --git a/Device/Data/ArrayUtil.cpp b/Device/Data/ArrayUtil.cpp
index 61b1d87fa7b..610957bbd56 100644
--- a/Device/Data/ArrayUtil.cpp
+++ b/Device/Data/ArrayUtil.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Device/Data/ArrayUtil.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Base/Util/Assert.h"
 #include "Device/Data/Datafield.h"
@@ -33,7 +33,7 @@ std::pair<size_t, size_t> DataUtil::Array::getShape(const std::vector<std::vecto
 std::unique_ptr<Datafield> DataUtil::Array::createPField1D(const std::vector<double>& vec)
 {
     const size_t N = vec.size();
-    std::vector<const IAxis*> axes{newFixedBinAxis("axis0", N, 0.0, (double)N)};
+    std::vector<const Scale*> axes{newFixedBinAxis("axis0", N, 0.0, (double)N)};
     return std::make_unique<Datafield>(std::move(axes), vec);
 }
 
@@ -47,7 +47,7 @@ DataUtil::Array::createPField2D(const std::vector<std::vector<double>>& vec)
     ASSERT(nrows > 0);
     ASSERT(ncols > 0);
 
-    std::vector<const IAxis*> axes{newFixedBinAxis("axis0", ncols, 0.0, (double)ncols),
+    std::vector<const Scale*> axes{newFixedBinAxis("axis0", ncols, 0.0, (double)ncols),
                                    newFixedBinAxis("axis1", nrows, 0.0, (double)nrows)};
 
     std::vector<double> out(nrows * ncols);
diff --git a/Device/Data/DataUtil.cpp b/Device/Data/DataUtil.cpp
index 219e8a04d8e..d98c6d33536 100644
--- a/Device/Data/DataUtil.cpp
+++ b/Device/Data/DataUtil.cpp
@@ -14,7 +14,7 @@
 
 #include "Device/Data/DataUtil.h"
 #include "Base/Axis/Frame.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Base/Math/FourierTransform.h"
 #include "Base/Util/Assert.h"
@@ -106,7 +106,7 @@ DataUtil::Data::vecvecToDatafield(const std::vector<std::vector<double>>& array_
     size_t nrows = array_2d.size();
     size_t ncols = array_2d[0].size();
 
-    std::vector<const IAxis*> axes{newFixedBinAxis("x", nrows, 0.0, double(nrows)),
+    std::vector<const Scale*> axes{newFixedBinAxis("x", nrows, 0.0, double(nrows)),
                                    newFixedBinAxis("y", ncols, 0.0, double(ncols))};
     std::vector<double> out;
     out.reserve(nrows * ncols);
diff --git a/Device/Data/Datafield.cpp b/Device/Data/Datafield.cpp
index e51d32c2f0b..aa03fee453c 100644
--- a/Device/Data/Datafield.cpp
+++ b/Device/Data/Datafield.cpp
@@ -14,7 +14,7 @@
 
 #include "Device/Data/Datafield.h"
 #include "Base/Axis/Frame.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Py/PyCore.h"
 #include "Base/Util/Assert.h"
 #include <algorithm>
@@ -32,7 +32,7 @@ Datafield::Datafield(const Frame* frame, const std::vector<double>& values,
     ASSERT(m_errSigmas.empty() || m_errSigmas.size() == m_values.size());
 }
 
-Datafield::Datafield(std::vector<const IAxis*>&& axes, const std::vector<double>& values,
+Datafield::Datafield(std::vector<const Scale*>&& axes, const std::vector<double>& values,
                      const std::vector<double>& errSigmas)
     : Datafield(new Frame(std::move(axes)), values, errSigmas)
 {
@@ -124,17 +124,17 @@ const Frame& Datafield::frame() const
     return *m_frame;
 }
 
-const IAxis& Datafield::axis(size_t k) const
+const Scale& Datafield::axis(size_t k) const
 {
     return frame().axis(k);
 }
 
-const IAxis& Datafield::xAxis() const
+const Scale& Datafield::xAxis() const
 {
     return frame().axis(0);
 }
 
-const IAxis& Datafield::yAxis() const
+const Scale& Datafield::yAxis() const
 {
     return frame().axis(1);
 }
@@ -176,8 +176,8 @@ double Datafield::minVal() const
 
 Datafield* Datafield::crop(double xmin, double ymin, double xmax, double ymax) const
 {
-    const auto xclipped = std::make_unique<IAxis>(xAxis().clipped(xmin, xmax));
-    const auto yclipped = std::make_unique<IAxis>(yAxis().clipped(ymin, ymax));
+    const auto xclipped = std::make_unique<Scale>(xAxis().clipped(xmin, xmax));
+    const auto yclipped = std::make_unique<Scale>(yAxis().clipped(ymin, ymax));
 
     std::vector<double> out(size());
     size_t iout = 0;
@@ -192,7 +192,7 @@ Datafield* Datafield::crop(double xmin, double ymin, double xmax, double ymax) c
 
 Datafield* Datafield::crop(double xmin, double xmax) const
 {
-    const auto xclipped = std::make_unique<IAxis>(xAxis().clipped(xmin, xmax));
+    const auto xclipped = std::make_unique<Scale>(xAxis().clipped(xmin, xmax));
 
     std::vector<double> out(size());
     size_t iout = 0;
diff --git a/Device/Data/Datafield.h b/Device/Data/Datafield.h
index 3b0d0c38652..a468739a3c1 100644
--- a/Device/Data/Datafield.h
+++ b/Device/Data/Datafield.h
@@ -21,7 +21,7 @@
 
 using std::size_t;
 
-class IAxis;
+class Scale;
 class Frame;
 
 //! Stores radiation power per bin.
@@ -34,7 +34,7 @@ public:
               const std::vector<double>& errSigmas = {});
 
     //! Constructor that takes ownership of supplied axes and initializes values and errorbars
-    Datafield(std::vector<const IAxis*>&& axes, const std::vector<double>& values = {},
+    Datafield(std::vector<const Scale*>&& axes, const std::vector<double>& values = {},
               const std::vector<double>& errSigmas = {});
 
     Datafield(const Datafield&);
@@ -54,9 +54,9 @@ public:
 
     const Frame& frame() const;
     size_t rank() const;
-    const IAxis& axis(size_t k) const;
-    const IAxis& xAxis() const;
-    const IAxis& yAxis() const;
+    const Scale& axis(size_t k) const;
+    const Scale& xAxis() const;
+    const Scale& yAxis() const;
 
     //! Returns total size of data buffer (product of bin number in every dimension).
     size_t size() const;
diff --git a/Device/Detector/IDetector.cpp b/Device/Detector/IDetector.cpp
index 76bfdcd0c81..86bae9206a0 100644
--- a/Device/Detector/IDetector.cpp
+++ b/Device/Detector/IDetector.cpp
@@ -14,7 +14,7 @@
 
 #include "Device/Detector/IDetector.h"
 #include "Base/Axis/Frame.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Util/Assert.h"
 #include "Device/Beam/Beam.h"
 #include "Device/Detector/SimulationAreaIterator.h"
@@ -43,7 +43,7 @@ std::pair<double, double> IDetector::RoiOfAxis::bounds() const
     return {lower, upper};
 }
 
-IDetector::IDetector(std::array<std::shared_ptr<IAxis>, 2> axes)
+IDetector::IDetector(std::array<std::shared_ptr<Scale>, 2> axes)
     : m_axes(axes)
     , m_mask(new DetectorMask(*m_axes[0], *m_axes[1]))
 {
@@ -62,7 +62,7 @@ IDetector::IDetector(const IDetector& other)
 
 IDetector::~IDetector() = default;
 
-const IAxis& IDetector::axis(size_t index) const
+const Scale& IDetector::axis(size_t index) const
 {
     ASSERT(index < 2);
     return *m_axes[index];
@@ -112,11 +112,11 @@ bool IDetector::hasExplicitRegionOfInterest() const
     return !m_axes.empty() && (m_explicitROI.size() == m_axes.size());
 }
 
-std::vector<const IAxis*> IDetector::axesClippedToRegionOfInterest() const
+std::vector<const Scale*> IDetector::axesClippedToRegionOfInterest() const
 {
-    std::vector<const IAxis*> result;
+    std::vector<const Scale*> result;
     for (size_t i = 0; i < m_axes.size(); ++i)
-        result.emplace_back(new IAxis(m_axes[i]->clipped(regionOfInterestBounds(i))));
+        result.emplace_back(new Scale(m_axes[i]->clipped(regionOfInterestBounds(i))));
     return result;
 }
 
@@ -161,9 +161,9 @@ void IDetector::applyDetectorResolution(Datafield* intensity_map) const
 
 Datafield IDetector::createDetectorMap() const
 {
-    std::vector<const IAxis*> axes;
+    std::vector<const Scale*> axes;
     for (size_t i = 0; i < 2; ++i)
-        axes.emplace_back(new IAxis(axis(i).clipped(regionOfInterestBounds(i))));
+        axes.emplace_back(new Scale(axis(i).clipped(regionOfInterestBounds(i))));
     return Datafield(std::move(axes));
 }
 
@@ -202,7 +202,7 @@ size_t IDetector::regionOfInterestIndexToDetectorIndex(const size_t regionOfInte
 
 /* -- IDetector::RoiOfAxis ----------------------------------------------------------- */
 
-IDetector::RoiOfAxis::RoiOfAxis(const IAxis& axis, double _lower, double _upper)
+IDetector::RoiOfAxis::RoiOfAxis(const Scale& axis, double _lower, double _upper)
     : lower(_lower)
     , upper(_upper)
     , lowerIndex(axis.closestIndex(lower))
diff --git a/Device/Detector/IDetector.h b/Device/Detector/IDetector.h
index 285ede35b8b..716f3e69840 100644
--- a/Device/Detector/IDetector.h
+++ b/Device/Detector/IDetector.h
@@ -25,7 +25,7 @@ class Beam;
 class CoordSystem2D;
 class Datafield;
 class DetectorMask;
-class IAxis;
+class Scale;
 class ICoordSystem;
 class IDetectorResolution;
 class IPixel;
@@ -51,7 +51,7 @@ class SimulationAreaIterator;
 class IDetector : public ICloneable, public INode {
 public:
     using const_iterator = const SimulationAreaIterator&;
-    IDetector(std::array<std::shared_ptr<IAxis>, 2> axes);
+    IDetector(std::array<std::shared_ptr<Scale>, 2> axes);
 
     IDetector* clone() const override = 0;
 
@@ -106,7 +106,7 @@ public:
 
     //! One axis of the complete detector.
     //! Any region of interest is not taken into account.
-    const IAxis& axis(size_t index) const;
+    const Scale& axis(size_t index) const;
 
     //! Calculate axis index for given global index
     size_t axisBinIndex(size_t index, size_t selected_axis) const;
@@ -124,7 +124,7 @@ public:
 
     //! Returns the axes clipped to the region of interest. If no region of interest is explicitly
     //! defined, then the whole detector is taken as "region of interest".
-    std::vector<const IAxis*> axesClippedToRegionOfInterest() const;
+    std::vector<const Scale*> axesClippedToRegionOfInterest() const;
 
     //! Convert an index of the region of interest to an index of the detector.
     //! If no region of interest is set, then the index stays unmodified (since ROI == detector
@@ -177,7 +177,7 @@ protected:
         size_t roiSize;      //!< number of bins on axis of ROI
         size_t detectorSize; //!< number of bins on axis of detector
 
-        RoiOfAxis(const IAxis& axis, double lower, double upper);
+        RoiOfAxis(const Scale& axis, double lower, double upper);
 
         std::pair<double, double> bounds() const;
     };
@@ -187,7 +187,7 @@ protected:
                                           //!< Vector index corresponds to axis index in m_axes
 
 private:
-    std::array<std::shared_ptr<IAxis>, 2> m_axes;
+    std::array<std::shared_ptr<Scale>, 2> m_axes;
     PolFilter m_polAnalyzer;
     std::shared_ptr<IDetectorResolution> m_resolution;
     std::shared_ptr<DetectorMask> m_mask;
diff --git a/Device/Detector/OffspecDetector.cpp b/Device/Detector/OffspecDetector.cpp
index 9eaaae9081e..8ee0725bb05 100644
--- a/Device/Detector/OffspecDetector.cpp
+++ b/Device/Detector/OffspecDetector.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Device/Detector/OffspecDetector.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Base/Pixel/SphericalPixel.h"
 #include "Base/Util/Assert.h"
@@ -37,7 +37,7 @@ void OffspecDetector::setAnalyzer(const R3 direction, double efficiency, double
     m_polAnalyzer = PolFilter(direction, efficiency, total_transmission);
 }
 
-const IAxis& OffspecDetector::axis(size_t index) const
+const Scale& OffspecDetector::axis(size_t index) const
 {
     ASSERT(index < 2);
     return *m_axes[index];
@@ -68,8 +68,8 @@ size_t OffspecDetector::totalSize() const
 
 IPixel* OffspecDetector::createPixel(size_t index) const
 {
-    const IAxis& phi_axis = axis(0);
-    const IAxis& alpha_axis = axis(1);
+    const Scale& phi_axis = axis(0);
+    const Scale& alpha_axis = axis(1);
     const size_t phi_index = axisBinIndex(index, 0);
     const size_t alpha_index = axisBinIndex(index, 1);
 
@@ -80,8 +80,8 @@ IPixel* OffspecDetector::createPixel(size_t index) const
 
 size_t OffspecDetector::indexOfSpecular(double alpha, double phi) const
 {
-    const IAxis& phi_axis = axis(0);
-    const IAxis& alpha_axis = axis(1);
+    const Scale& phi_axis = axis(0);
+    const Scale& alpha_axis = axis(1);
     if (phi_axis.rangeComprises(phi) && alpha_axis.rangeComprises(alpha))
         return getGlobalIndex(phi_axis.closestIndex(phi), alpha_axis.closestIndex(alpha));
     return totalSize();
diff --git a/Device/Detector/OffspecDetector.h b/Device/Detector/OffspecDetector.h
index 9b4629adf8f..9f551670f8a 100644
--- a/Device/Detector/OffspecDetector.h
+++ b/Device/Detector/OffspecDetector.h
@@ -20,7 +20,7 @@
 #include "Device/Pol/PolFilter.h"
 #include "Param/Node/INode.h"
 
-class IAxis;
+class Scale;
 class IDetectorResolution;
 class IPixel;
 
@@ -49,7 +49,7 @@ public:
 
     //! One axis of the complete detector.
     //! Any region of interest is not taken into account.
-    const IAxis& axis(size_t index) const;
+    const Scale& axis(size_t index) const;
 
     //! Calculate axis index for given global index
     size_t axisBinIndex(size_t index, size_t selected_axis) const;
@@ -76,7 +76,7 @@ private:
     //! Returns flattened index computed from two axis indices.
     size_t getGlobalIndex(size_t x, size_t y) const;
 
-    std::shared_ptr<IAxis> m_axes[2];
+    std::shared_ptr<Scale> m_axes[2];
     PolFilter m_polAnalyzer;
     std::shared_ptr<IDetectorResolution> m_resolution;
 };
diff --git a/Device/Detector/RectangularDetector.cpp b/Device/Detector/RectangularDetector.cpp
index 485c9e09e34..6a3a98fa51b 100644
--- a/Device/Detector/RectangularDetector.cpp
+++ b/Device/Detector/RectangularDetector.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Device/Detector/RectangularDetector.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Base/Const/Units.h"
 #include "Base/Pixel/RectangularPixel.h"
@@ -25,7 +25,7 @@
 
 using std::numbers::pi;
 
-RectangularDetector::RectangularDetector(std::array<std::shared_ptr<IAxis>, 2> axes)
+RectangularDetector::RectangularDetector(std::array<std::shared_ptr<Scale>, 2> axes)
     : IDetector(axes)
     , m_u0(0.0)
     , m_v0(0.0)
@@ -38,7 +38,7 @@ RectangularDetector::RectangularDetector(std::array<std::shared_ptr<IAxis>, 2> a
 }
 
 RectangularDetector::RectangularDetector(size_t nxbins, double width, size_t nybins, double height)
-    : RectangularDetector(std::array<std::shared_ptr<IAxis>, 2>{
+    : RectangularDetector(std::array<std::shared_ptr<Scale>, 2>{
         sharedFixedBinAxis("u", nxbins, 0.0, width), sharedFixedBinAxis("v", nybins, 0.0, height)})
 {
 }
@@ -166,8 +166,8 @@ const RectangularPixel* RectangularDetector::regionOfInterestPixel() const
 
 const IPixel* RectangularDetector::createPixel(size_t index) const
 {
-    const IAxis& u_axis = axis(0);
-    const IAxis& v_axis = axis(1);
+    const Scale& u_axis = axis(0);
+    const Scale& v_axis = axis(1);
     const size_t u_index = axisBinIndex(index, 0);
     const size_t v_index = axisBinIndex(index, 1);
 
@@ -192,8 +192,8 @@ size_t RectangularDetector::indexOfSpecular(const Beam& beam) const
     const R3 rpix = k_spec * (m_distance / kd);
     const double u = rpix.dot(m_u_unit) + m_u0;
     const double v = rpix.dot(m_v_unit) + m_v0;
-    const IAxis& u_axis = axis(0); // the x axis, GISAS only
-    const IAxis& v_axis = axis(1); // the y axis, in reflectometer plane
+    const Scale& u_axis = axis(0); // the x axis, GISAS only
+    const Scale& v_axis = axis(1); // the y axis, in reflectometer plane
     if (!u_axis.rangeComprises(u) || !v_axis.rangeComprises(v))
         return totalSize();
     return getGlobalIndex(u_axis.closestIndex(u), v_axis.closestIndex(v));
diff --git a/Device/Detector/RectangularDetector.h b/Device/Detector/RectangularDetector.h
index 6fba280c5c0..c763d562375 100644
--- a/Device/Detector/RectangularDetector.h
+++ b/Device/Detector/RectangularDetector.h
@@ -31,7 +31,7 @@ public:
         PERPENDICULAR_TO_REFLECTED_BEAM
     };
 
-    RectangularDetector(std::array<std::shared_ptr<IAxis>, 2> axes);
+    RectangularDetector(std::array<std::shared_ptr<Scale>, 2> axes);
 
     //! Rectangular detector constructor
     //! @param nxbins Number of bins (pixels) in x-direction
diff --git a/Device/Detector/SphericalDetector.cpp b/Device/Detector/SphericalDetector.cpp
index 35fbf57bb45..0ff0513ac79 100644
--- a/Device/Detector/SphericalDetector.cpp
+++ b/Device/Detector/SphericalDetector.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Device/Detector/SphericalDetector.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Base/Const/Units.h"
 #include "Base/Pixel/SphericalPixel.h"
@@ -25,14 +25,14 @@
 
 using std::numbers::pi;
 
-SphericalDetector::SphericalDetector(std::array<std::shared_ptr<IAxis>, 2> axes)
+SphericalDetector::SphericalDetector(std::array<std::shared_ptr<Scale>, 2> axes)
     : IDetector(axes)
 {
 }
 
 SphericalDetector::SphericalDetector(size_t n_phi, double phi_min, double phi_max, size_t n_alpha,
                                      double alpha_min, double alpha_max)
-    : SphericalDetector(std::array<std::shared_ptr<IAxis>, 2>{
+    : SphericalDetector(std::array<std::shared_ptr<Scale>, 2>{
         sharedFixedBinAxis("phi_f", n_phi, phi_min, phi_max),
         sharedFixedBinAxis("alpha_f", n_alpha, alpha_min, alpha_max)})
 {
@@ -53,8 +53,8 @@ SphericalDetector* SphericalDetector::clone() const
 
 IPixel* SphericalDetector::createPixel(size_t index) const
 {
-    const IAxis& phi_axis = axis(0);
-    const IAxis& alpha_axis = axis(1);
+    const Scale& phi_axis = axis(0);
+    const Scale& alpha_axis = axis(1);
     const size_t phi_index = axisBinIndex(index, 0);
     const size_t alpha_index = axisBinIndex(index, 1);
 
@@ -67,8 +67,8 @@ size_t SphericalDetector::indexOfSpecular(const Beam& beam) const
 {
     double alpha = beam.alpha_i();
     double phi = beam.phi_i();
-    const IAxis& phi_axis = axis(0);
-    const IAxis& alpha_axis = axis(1);
+    const Scale& phi_axis = axis(0);
+    const Scale& alpha_axis = axis(1);
     if (phi_axis.rangeComprises(phi) && alpha_axis.rangeComprises(alpha))
         return getGlobalIndex(phi_axis.closestIndex(phi), alpha_axis.closestIndex(alpha));
     return totalSize();
diff --git a/Device/Detector/SphericalDetector.h b/Device/Detector/SphericalDetector.h
index 4b64292f0b7..bfb3ee22458 100644
--- a/Device/Detector/SphericalDetector.h
+++ b/Device/Detector/SphericalDetector.h
@@ -23,7 +23,7 @@ class IPixel;
 
 class SphericalDetector : public IDetector {
 public:
-    SphericalDetector(std::array<std::shared_ptr<IAxis>, 2> axes);
+    SphericalDetector(std::array<std::shared_ptr<Scale>, 2> axes);
 
     //! Returns a detector with given phi and alpha axes.
     //! @param n_phi number of phi-axis bins
diff --git a/Device/Histo/DiffUtil.cpp b/Device/Histo/DiffUtil.cpp
index e539d53c8d6..a4c254dbf34 100644
--- a/Device/Histo/DiffUtil.cpp
+++ b/Device/Histo/DiffUtil.cpp
@@ -14,7 +14,7 @@
 
 #include "Device/Histo/DiffUtil.h"
 #include "Base/Axis/Frame.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Math/Numeric.h"
 #include "Base/Util/Assert.h"
 #include "Device/Data/Datafield.h"
diff --git a/Device/Histo/SimulationResult.cpp b/Device/Histo/SimulationResult.cpp
index 4f37a351246..a08581deb2f 100644
--- a/Device/Histo/SimulationResult.cpp
+++ b/Device/Histo/SimulationResult.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Device/Histo/SimulationResult.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Util/Assert.h"
 #include "Device/Coord/ICoordSystem.h"
 
diff --git a/Device/IO/DataFormatUtil.cpp b/Device/IO/DataFormatUtil.cpp
index 0cf6b3d24de..bdb3a9c9cb6 100644
--- a/Device/IO/DataFormatUtil.cpp
+++ b/Device/IO/DataFormatUtil.cpp
@@ -23,7 +23,7 @@
 
 namespace {
 
-using createAxisFun = std::function<IAxis*(std::istringstream iss)>;
+using createAxisFun = std::function<Scale*(std::istringstream iss)>;
 
 const std::string GzipExtension = ".gz";
 const std::string BzipExtension = ".bz2";
@@ -87,7 +87,7 @@ bool DataUtil::Format::isTiffFile(const std::string& file_name)
 }
 
 //! Creates axis of certain type from input stream
-IAxis* DataUtil::Format::createAxis(std::istream& input_stream)
+Scale* DataUtil::Format::createAxis(std::istream& input_stream)
 {
     auto iss = getAxisStringRepresentation(input_stream);
     std::string type;
diff --git a/Device/IO/DataFormatUtil.h b/Device/IO/DataFormatUtil.h
index 070e7cd79d2..2a265121706 100644
--- a/Device/IO/DataFormatUtil.h
+++ b/Device/IO/DataFormatUtil.h
@@ -21,7 +21,7 @@
 #include <string>
 #include <vector>
 
-class IAxis;
+class Scale;
 class Datafield;
 
 //! Utility functions for data input and output.
@@ -46,7 +46,7 @@ bool isNicosFile(const std::string& file_name);
 //! Returns true if file name corresponds to tiff file (can be also compressed)
 bool isTiffFile(const std::string& file_name);
 
-IAxis* createAxis(std::istream& input_stream);
+Scale* createAxis(std::istream& input_stream);
 
 void fillDatafield(Datafield* data, std::istream& input_stream);
 
diff --git a/Device/IO/ReadWriteINT.cpp b/Device/IO/ReadWriteINT.cpp
index 42eef28e3e9..897071e8abf 100644
--- a/Device/IO/ReadWriteINT.cpp
+++ b/Device/IO/ReadWriteINT.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Device/IO/ReadWriteINT.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Util/StringUtil.h"
 #include "Device/Data/ArrayUtil.h"
 #include "Device/Data/Datafield.h"
@@ -25,7 +25,7 @@ Datafield* ReadWriteINT::readDatafield(std::istream& input_stream)
 {
     std::string line;
 
-    std::vector<const IAxis*> axes;
+    std::vector<const Scale*> axes;
     while (std::getline(input_stream, line)) {
         line = BaseUtil::String::trim(line);
 
@@ -47,7 +47,7 @@ void ReadWriteINT::writeDatafield(const Datafield& data, std::ostream& output_st
 
     for (size_t i = 0; i < data.rank(); ++i) {
         std::string axis_name = std::string("axis") + std::to_string(i);
-        std::unique_ptr<IAxis> axis(data.axis(i).clone());
+        std::unique_ptr<Scale> axis(data.axis(i).clone());
         axis->setAxisName(axis_name);
         output_stream << std::endl;
         output_stream << "# axis-" << i << "\n";
diff --git a/Device/IO/ReadWriteNicos.cpp b/Device/IO/ReadWriteNicos.cpp
index 2286a9c1509..cbbbcc47d5a 100644
--- a/Device/IO/ReadWriteNicos.cpp
+++ b/Device/IO/ReadWriteNicos.cpp
@@ -101,7 +101,7 @@ Datafield* IO::readNicosData(std::istream& input_stream)
     if (height == 0)
         throw std::runtime_error("Could not find 'DataSizeY' value");
 
-    std::vector<const IAxis*> axes{newFixedBinAxis("x", width, 0.0, width),
+    std::vector<const Scale*> axes{newFixedBinAxis("x", width, 0.0, width),
                                    newFixedBinAxis("y", height, 0.0, height)};
     auto result = std::make_unique<Datafield>(std::move(axes));
 
diff --git a/Device/IO/ReadWriteNumpyTXT.cpp b/Device/IO/ReadWriteNumpyTXT.cpp
index 8ed1dbc6f40..797a8d9b882 100644
--- a/Device/IO/ReadWriteNumpyTXT.cpp
+++ b/Device/IO/ReadWriteNumpyTXT.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Device/IO/ReadWriteNumpyTXT.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Util/StringUtil.h"
 #include "Device/Data/ArrayUtil.h"
 #include "Device/Data/Datafield.h"
diff --git a/Device/IO/ReadWriteTiff.cpp b/Device/IO/ReadWriteTiff.cpp
index 7f7ad5a7f24..63656ba350c 100644
--- a/Device/IO/ReadWriteTiff.cpp
+++ b/Device/IO/ReadWriteTiff.cpp
@@ -16,7 +16,7 @@
 
 #include "Device/IO/ReadWriteTiff.h"
 #include "Base/Axis/Frame.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Base/Util/Assert.h"
 #include "Base/Util/SysUtil.h"
diff --git a/Device/Mask/DetectorMask.cpp b/Device/Mask/DetectorMask.cpp
index 0be28f31647..c0544dd11b5 100644
--- a/Device/Mask/DetectorMask.cpp
+++ b/Device/Mask/DetectorMask.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Device/Mask/DetectorMask.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Device/Data/Datafield.h"
 #include "Device/Mask/IShape2D.h"
 
@@ -31,7 +31,7 @@ MaskPattern* MaskPattern::clone() const
     return new MaskPattern(shape->clone(), doMask);
 }
 
-DetectorMask::DetectorMask(const IAxis& xAxis, const IAxis& yAxis)
+DetectorMask::DetectorMask(const Scale& xAxis, const Scale& yAxis)
     : m_xAxis(xAxis.clone())
     , m_yAxis(yAxis.clone())
     , m_masked(xAxis.size() * yAxis.size(), false)
diff --git a/Device/Mask/DetectorMask.h b/Device/Mask/DetectorMask.h
index fdbcc743908..01e53bb4398 100644
--- a/Device/Mask/DetectorMask.h
+++ b/Device/Mask/DetectorMask.h
@@ -21,7 +21,7 @@
 #include "Base/Types/CloneableVector.h"
 #endif
 
-class IAxis;
+class Scale;
 class IShape2D;
 
 class Datafield;
@@ -40,7 +40,7 @@ public:
 
 class DetectorMask {
 public:
-    DetectorMask(const IAxis& xAxis, const IAxis& yAxis);
+    DetectorMask(const Scale& xAxis, const Scale& yAxis);
     ~DetectorMask();
     DetectorMask(const DetectorMask& other);
 
@@ -66,8 +66,8 @@ private:
 
     // primary data:
 #ifndef SWIG
-    const IAxis* m_xAxis;
-    const IAxis* m_yAxis;
+    const Scale* m_xAxis;
+    const Scale* m_yAxis;
     CloneableVector<MaskPattern> m_stack;
 #endif
 
diff --git a/Device/Resolution/ConvolutionDetectorResolution.cpp b/Device/Resolution/ConvolutionDetectorResolution.cpp
index ef7df11830f..261dfdae701 100644
--- a/Device/Resolution/ConvolutionDetectorResolution.cpp
+++ b/Device/Resolution/ConvolutionDetectorResolution.cpp
@@ -14,7 +14,7 @@
 
 #include "Device/Resolution/ConvolutionDetectorResolution.h"
 #include "Base/Axis/Frame.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Util/Assert.h"
 #include "Device/Resolution/Convolve.h"
 #include <stdexcept>
@@ -87,7 +87,7 @@ void ConvolutionDetectorResolution::apply1dConvolution(Datafield* intensity_map)
         throw std::runtime_error(
             "ConvolutionDetectorResolution::apply1dConvolution -> Error! "
             "Number of axes for intensity map does not correspond to the dimension of the map.");
-    const IAxis& axis = intensity_map->axis(0);
+    const Scale& axis = intensity_map->axis(0);
     // Construct source vector from original intensity map
     std::vector<double> source_vector = intensity_map->flatVector();
     size_t data_size = source_vector.size();
@@ -121,8 +121,8 @@ void ConvolutionDetectorResolution::apply2dConvolution(Datafield* intensity_map)
         throw std::runtime_error(
             "ConvolutionDetectorResolution::apply2dConvolution -> Error! "
             "Number of axes for intensity map does not correspond to the dimension of the map.");
-    const IAxis& axis_1 = intensity_map->axis(0);
-    const IAxis& axis_2 = intensity_map->axis(1);
+    const Scale& axis_1 = intensity_map->axis(0);
+    const Scale& axis_2 = intensity_map->axis(1);
     size_t axis_size_1 = axis_1.size();
     size_t axis_size_2 = axis_2.size();
     if (axis_size_1 < 2 || axis_size_2 < 2)
diff --git a/GUI/Model/Axis/BasicAxisItem.cpp b/GUI/Model/Axis/BasicAxisItem.cpp
index c466a15239a..6dd43aa461c 100644
--- a/GUI/Model/Axis/BasicAxisItem.cpp
+++ b/GUI/Model/Axis/BasicAxisItem.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/Model/Axis/BasicAxisItem.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "GUI/Support/XML/UtilXML.h"
 
@@ -88,13 +88,13 @@ void BasicAxisItem::setTitle(const QString& title)
     emit axisTitleChanged();
 }
 
-std::unique_ptr<IAxis> BasicAxisItem::itemToRegularAxis(double scale) const
+std::unique_ptr<Scale> BasicAxisItem::itemToRegularAxis(double scale) const
 {
     return uniqueFixedBinAxis(title().toStdString(), binCount(), min() * scale, max() * scale);
 }
 
-std::unique_ptr<IAxis> BasicAxisItem::itemToAxis(double scale,
-                                                 const IAxis& /*converted_axis*/) const
+std::unique_ptr<Scale> BasicAxisItem::itemToAxis(double scale,
+                                                 const Scale& /*converted_axis*/) const
 {
     return itemToRegularAxis(scale);
 }
diff --git a/GUI/Model/Axis/BasicAxisItem.h b/GUI/Model/Axis/BasicAxisItem.h
index 800a2ab8140..2b68709f179 100644
--- a/GUI/Model/Axis/BasicAxisItem.h
+++ b/GUI/Model/Axis/BasicAxisItem.h
@@ -17,7 +17,7 @@
 
 #include <QObject>
 
-class IAxis;
+class Scale;
 class QXmlStreamReader;
 class QXmlStreamWriter;
 
@@ -32,8 +32,8 @@ public:
     virtual void readFrom(QXmlStreamReader* r);
 
 public:
-    virtual std::unique_ptr<IAxis> itemToAxis(double scale, const IAxis& converted_axis) const;
-    std::unique_ptr<IAxis> itemToRegularAxis(double scale) const;
+    virtual std::unique_ptr<Scale> itemToAxis(double scale, const Scale& converted_axis) const;
+    std::unique_ptr<Scale> itemToRegularAxis(double scale) const;
 
     int binCount() const;
     void setBinCount(size_t value);
diff --git a/GUI/Model/Axis/PointwiseAxisItem.cpp b/GUI/Model/Axis/PointwiseAxisItem.cpp
index bcde2a8d990..72470ef8e5d 100644
--- a/GUI/Model/Axis/PointwiseAxisItem.cpp
+++ b/GUI/Model/Axis/PointwiseAxisItem.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/Model/Axis/PointwiseAxisItem.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Device/Coord/ICoordSystem.h"
 #include "Device/Data/Datafield.h"
@@ -39,13 +39,13 @@ PointwiseAxisItem::PointwiseAxisItem(QObject* parent)
 
 PointwiseAxisItem::~PointwiseAxisItem() = default;
 
-void PointwiseAxisItem::setAxisAndUnit(const IAxis& axis, const QString& units_label)
+void PointwiseAxisItem::setAxisAndUnit(const Scale& axis, const QString& units_label)
 {
-    m_axis = std::unique_ptr<IAxis>(axis.clone());
+    m_axis = std::unique_ptr<Scale>(axis.clone());
     m_nativeAxisUnits = units_label;
 }
 
-const IAxis* PointwiseAxisItem::axis() const
+const Scale* PointwiseAxisItem::axis() const
 {
     return m_axis.get();
 }
@@ -55,8 +55,8 @@ QString PointwiseAxisItem::nativeAxisUnits() const
     return m_nativeAxisUnits;
 }
 
-std::unique_ptr<IAxis> PointwiseAxisItem::itemToAxis(double scale,
-                                                     const IAxis& converted_axis) const
+std::unique_ptr<Scale> PointwiseAxisItem::itemToAxis(double scale,
+                                                     const Scale& converted_axis) const
 {
     if (!m_axis || nativeAxisUnits() == "nbins")
         return nullptr;
@@ -66,7 +66,7 @@ std::unique_ptr<IAxis> PointwiseAxisItem::itemToAxis(double scale,
     for (double& e : centers)
         e *= scale;
 
-    return std::unique_ptr<IAxis>(newDiscreteAxis(converted_axis.axisName(), std::move(centers)));
+    return std::unique_ptr<Scale>(newDiscreteAxis(converted_axis.axisName(), std::move(centers)));
 }
 
 QByteArray PointwiseAxisItem::serializeBinaryData() const
@@ -87,7 +87,7 @@ void PointwiseAxisItem::deserializeBinaryData(const QByteArray& data)
 
     std::istringstream str(data.toStdString());
     std::unique_ptr<Datafield> d(ReadWriteINT().readDatafield(str));
-    m_axis = std::unique_ptr<IAxis>(d->axis(0).clone());
+    m_axis = std::unique_ptr<Scale>(d->axis(0).clone());
 }
 
 void PointwiseAxisItem::writeTo(QXmlStreamWriter* w) const
diff --git a/GUI/Model/Axis/PointwiseAxisItem.h b/GUI/Model/Axis/PointwiseAxisItem.h
index ea796197194..5670975a491 100644
--- a/GUI/Model/Axis/PointwiseAxisItem.h
+++ b/GUI/Model/Axis/PointwiseAxisItem.h
@@ -27,12 +27,12 @@ public:
     ~PointwiseAxisItem() override;
 
     // setters, getters
-    void setAxisAndUnit(const IAxis& axis, const QString& units_label);
+    void setAxisAndUnit(const Scale& axis, const QString& units_label);
 
-    const IAxis* axis() const;
+    const Scale* axis() const;
     QString nativeAxisUnits() const;
 
-    std::unique_ptr<IAxis> itemToAxis(double scale, const IAxis& converted_axis) const override;
+    std::unique_ptr<Scale> itemToAxis(double scale, const Scale& converted_axis) const override;
 
     void updateAxIndicators(const ICoordSystem& cs);
 
@@ -43,7 +43,7 @@ public:
     void readFrom(QXmlStreamReader* r) override;
 
 private:
-    std::unique_ptr<IAxis> m_axis;
+    std::unique_ptr<Scale> m_axis;
     QString m_nativeAxisUnits;
 };
 
diff --git a/GUI/Model/Beam/GrazingScanItem.cpp b/GUI/Model/Beam/GrazingScanItem.cpp
index 862bca1a9f3..81958663d26 100644
--- a/GUI/Model/Beam/GrazingScanItem.cpp
+++ b/GUI/Model/Beam/GrazingScanItem.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/Model/Beam/GrazingScanItem.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Const/Units.h"
 #include "Base/Util/Assert.h"
 #include "Device/Coord/ICoordSystem.h"
@@ -183,12 +183,12 @@ void GrazingScanItem::selectDiscreteAxis()
     m_currentAxisIsUniformAxis = false;
 }
 
-void GrazingScanItem::initUniformAxis(const IAxis& axis)
+void GrazingScanItem::initUniformAxis(const Scale& axis)
 {
     m_uniformAlphaAxis->setBinCount(static_cast<int>(axis.size()));
 }
 
-void GrazingScanItem::initDiscreteAxis(const IAxis& axis, QString units,
+void GrazingScanItem::initDiscreteAxis(const Scale& axis, QString units,
                                        const ICoordSystem& converter)
 {
     if (!m_pointwiseAlphaAxis) {
diff --git a/GUI/Model/Beam/GrazingScanItem.h b/GUI/Model/Beam/GrazingScanItem.h
index fb3ee628cc0..aea5a228fff 100644
--- a/GUI/Model/Beam/GrazingScanItem.h
+++ b/GUI/Model/Beam/GrazingScanItem.h
@@ -18,7 +18,7 @@
 #include "GUI/Model/Beam/BeamDistributionItem.h"
 
 class BasicAxisItem;
-class IAxis;
+class Scale;
 class ICoordSystem;
 class PointwiseAxisItem;
 
@@ -58,8 +58,8 @@ public:
     void selectUniformAxis();
     void selectDiscreteAxis();
 
-    void initUniformAxis(const IAxis& axis);
-    void initDiscreteAxis(const IAxis& axis, QString units, const ICoordSystem& converter);
+    void initUniformAxis(const Scale& axis);
+    void initDiscreteAxis(const Scale& axis, QString units, const ICoordSystem& converter);
 
 private:
     std::unique_ptr<BasicAxisItem> m_uniformAlphaAxis;
diff --git a/GUI/Model/Beam/SourceItems.cpp b/GUI/Model/Beam/SourceItems.cpp
index da8bf478460..7f70b3384b1 100644
--- a/GUI/Model/Beam/SourceItems.cpp
+++ b/GUI/Model/Beam/SourceItems.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/Model/Beam/SourceItems.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Const/Units.h"
 #include "Base/Util/Assert.h"
 #include "Device/Beam/Beam.h"
@@ -248,7 +248,7 @@ void ScanItem::setScan(const IBeamScan* scan)
     setAzimuthalAngle(0.0);
 
     auto* axis_item = inclinationAxisItem();
-    const IAxis* axis = scan->coordinateAxis();
+    const Scale* axis = scan->coordinateAxis();
     ASSERT(axis);
     // TODO do we need to check that axis is equidistant?
     axis_item->setBinCount(static_cast<int>(axis->size()));
@@ -347,7 +347,7 @@ void ScanItem::setSquareFootprint(double value)
     m_footprint.setCurrentItem(new FootprintSquareItem(value));
 }
 
-void ScanItem::updateToData(const IAxis& axis, QString units, const ICoordSystem& converter)
+void ScanItem::updateToData(const Scale& axis, QString units, const ICoordSystem& converter)
 {
     if (units == "nbins") {
         grazingScanItem()->initUniformAxis(axis);
diff --git a/GUI/Model/Beam/SourceItems.h b/GUI/Model/Beam/SourceItems.h
index ab62d584987..af80dab9bad 100644
--- a/GUI/Model/Beam/SourceItems.h
+++ b/GUI/Model/Beam/SourceItems.h
@@ -28,7 +28,7 @@ class BeamDistributionItem;
 class BeamWavelengthItem;
 class FootprintItem;
 class GrazingScanItem;
-class IAxis;
+class Scale;
 class IBeamScan;
 class ICoordSystem;
 
@@ -98,7 +98,7 @@ public:
     void setGaussianFootprint(double value);
     void setSquareFootprint(double value);
 
-    void updateToData(const IAxis& axis, QString units, const ICoordSystem& converter);
+    void updateToData(const Scale& axis, QString units, const ICoordSystem& converter);
 
     bool isExpandFootprint() const { return m_expandFootprint; }
     void setExpandFootprint(bool b) { m_expandFootprint = b; }
diff --git a/GUI/Model/Data/IntensityDataItem.cpp b/GUI/Model/Data/IntensityDataItem.cpp
index 3387827c12a..da2420ffa77 100644
--- a/GUI/Model/Data/IntensityDataItem.cpp
+++ b/GUI/Model/Data/IntensityDataItem.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/Model/Data/IntensityDataItem.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Util/Assert.h"
 #include "Device/Coord/ICoordSystem.h"
 #include "Device/Data/Datafield.h"
diff --git a/GUI/Model/Data/SpecularDataItem.cpp b/GUI/Model/Data/SpecularDataItem.cpp
index 822ae7beb6c..86b240c0d36 100644
--- a/GUI/Model/Data/SpecularDataItem.cpp
+++ b/GUI/Model/Data/SpecularDataItem.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/Model/Data/SpecularDataItem.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Util/Assert.h"
 #include "Device/Coord/ICoordSystem.h"
 #include "Device/Data/Datafield.h"
diff --git a/GUI/Model/Descriptor/AxisProperty.cpp b/GUI/Model/Descriptor/AxisProperty.cpp
index 66cc57ed1dd..066a71f0ed4 100644
--- a/GUI/Model/Descriptor/AxisProperty.cpp
+++ b/GUI/Model/Descriptor/AxisProperty.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/Model/Descriptor/AxisProperty.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "GUI/Support/XML/UtilXML.h"
 
 namespace {
@@ -45,7 +45,7 @@ void AxisProperty::initMax(const QString& label, const QString& tooltip, double
     m_max.init(label, tooltip, value, unit, decimals, limits, "max");
 }
 
-std::unique_ptr<IAxis> AxisProperty::createAxis(double scaleFactor) const
+std::unique_ptr<Scale> AxisProperty::createAxis(double scaleFactor) const
 {
     return uniqueFixedBinAxis(std::string(), m_nbins, m_min * scaleFactor, m_max * scaleFactor);
 }
diff --git a/GUI/Model/Descriptor/AxisProperty.h b/GUI/Model/Descriptor/AxisProperty.h
index 4665365f90b..488c411b458 100644
--- a/GUI/Model/Descriptor/AxisProperty.h
+++ b/GUI/Model/Descriptor/AxisProperty.h
@@ -52,7 +52,7 @@ public:
                  const RealLimits& limits = RealLimits::nonnegative(), uint decimals = 3);
 
     //! Creates an axis with empty title
-    std::unique_ptr<IAxis> createAxis(double scaleFactor) const;
+    std::unique_ptr<Scale> createAxis(double scaleFactor) const;
 
     uint nbins() const { return m_nbins; }
     void setNbins(uint v) { m_nbins = v; }
diff --git a/GUI/Model/Device/InstrumentItems.cpp b/GUI/Model/Device/InstrumentItems.cpp
index 35593613024..efbbc27225f 100644
--- a/GUI/Model/Device/InstrumentItems.cpp
+++ b/GUI/Model/Device/InstrumentItems.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/Model/Device/InstrumentItems.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Const/Units.h"
 #include "Device/Beam/Beam.h"
 #include "Device/Beam/IFootprintFactor.h"
@@ -290,7 +290,7 @@ ScanningFunctionality::ScanningFunctionality(double intensity)
 }
 
 //! Takes ownership of argument 'axis'.
-std::unique_ptr<IBeamScan> ScanningFunctionality::createScan(const IAxis& axis) const
+std::unique_ptr<IBeamScan> ScanningFunctionality::createScan(const Scale& axis) const
 {
     auto result = std::make_unique<AlphaScan>(axis);
 
@@ -426,7 +426,7 @@ std::unique_ptr<const ICoordSystem> SpecularInstrumentItem::createCoordSystem()
                                                             *pointwise_axis->axis(), native_units);
     }
 
-    IAxis axis = FixedBinAxis(axis_item->title().toStdString(), axis_item->binCount(),
+    Scale axis = FixedBinAxis(axis_item->title().toStdString(), axis_item->binCount(),
                               axis_item->min(), axis_item->max());
 
     return std::make_unique<AngularReflectometryCoords>(scanItem()->wavelength(), axis,
@@ -438,9 +438,9 @@ ISimulation* SpecularInstrumentItem::createSimulation(const MultiLayer& sample)
     BasicAxisItem* const axis_item = scanItem()->inclinationAxisItem();
 
     const auto converter = createCoordSystem();
-    std::unique_ptr<IAxis> converted_axis(converter->convertedAxis(0, Coords::DEGREES));
+    std::unique_ptr<Scale> converted_axis(converter->convertedAxis(0, Coords::DEGREES));
 
-    std::unique_ptr<IAxis> axis = axis_item->itemToAxis(Units::deg, *converted_axis);
+    std::unique_ptr<Scale> axis = axis_item->itemToAxis(Units::deg, *converted_axis);
     std::unique_ptr<IBeamScan> scan = createScan(*axis);
     return new SpecularSimulation(*scan, sample);
 }
@@ -518,16 +518,16 @@ std::unique_ptr<const ICoordSystem> DepthprobeInstrumentItem::createCoordSystem(
     // https://jugit.fz-juelich.de/mlz/bornagain/-/issues/505
 
     BasicAxisItem* const axis_item = scanItem()->inclinationAxisItem();
-    std::unique_ptr<IAxis> axis = axis_item->itemToRegularAxis(Units::deg);
+    std::unique_ptr<Scale> axis = axis_item->itemToRegularAxis(Units::deg);
 
-    std::vector<const IAxis*> axes({axis.release(), m_zAxis.createAxis(1.)->clone()});
+    std::vector<const Scale*> axes({axis.release(), m_zAxis.createAxis(1.)->clone()});
     return std::make_unique<DepthprobeCoords>(std::move(axes), (2 * pi) / scanItem()->wavelength());
 }
 
 ISimulation* DepthprobeInstrumentItem::createSimulation(const MultiLayer& sample) const
 {
     BasicAxisItem* const axis_item = scanItem()->inclinationAxisItem();
-    std::unique_ptr<IAxis> axis = axis_item->itemToRegularAxis(Units::deg);
+    std::unique_ptr<Scale> axis = axis_item->itemToRegularAxis(Units::deg);
     std::unique_ptr<IBeamScan> scan = createScan(*axis);
     return new DepthprobeSimulation(*scan, sample, *m_zAxis.createAxis(1.));
 }
@@ -614,8 +614,8 @@ void OffspecInstrumentItem::updateToRealData(const RealItem* dataItem)
 std::unique_ptr<const ICoordSystem> OffspecInstrumentItem::createCoordSystem() const
 {
     BasicAxisItem* const axis_item = scanItem()->inclinationAxisItem();
-    std::unique_ptr<IAxis> axis = axis_item->itemToRegularAxis(Units::deg);
-    return std::make_unique<OffspecCoords>(std::vector<const IAxis*>{
+    std::unique_ptr<Scale> axis = axis_item->itemToRegularAxis(Units::deg);
+    return std::make_unique<OffspecCoords>(std::vector<const Scale*>{
         axis.release(), detectorItem()->createOffspecDetector()->axis(1).clone()});
 }
 
@@ -625,7 +625,7 @@ ISimulation* OffspecInstrumentItem::createSimulation(const MultiLayer& sample) c
     detector->setAnalyzer(m_analyzerDirection, m_analyzerEfficiency, m_analyzerTotalTransmission);
 
     BasicAxisItem* const axis_item = scanItem()->inclinationAxisItem();
-    std::unique_ptr<IAxis> axis = axis_item->itemToRegularAxis(Units::deg);
+    std::unique_ptr<Scale> axis = axis_item->itemToRegularAxis(Units::deg);
     std::unique_ptr<IBeamScan> scan = createScan(*axis);
 
     auto* result = new OffspecSimulation(*scan, sample, *detector);
diff --git a/GUI/Model/Device/InstrumentItems.h b/GUI/Model/Device/InstrumentItems.h
index 985c3650064..977b0a2aa5f 100644
--- a/GUI/Model/Device/InstrumentItems.h
+++ b/GUI/Model/Device/InstrumentItems.h
@@ -28,7 +28,7 @@ class BackgroundItem;
 class BeamItem;
 class DataItem;
 class DepthprobeSimulation;
-class IAxis;
+class Scale;
 class IBeamScan;
 class ICoordSystem;
 class ISimulation;
@@ -146,7 +146,7 @@ public:
     ScanningFunctionality(double intensity);
     ScanItem* scanItem() const { return m_scanItem.get(); }
 
-    std::unique_ptr<IBeamScan> createScan(const IAxis& axis) const;
+    std::unique_ptr<IBeamScan> createScan(const Scale& axis) const;
 
     void writeScanTo(QXmlStreamWriter* w) const;
     void readScanFrom(QXmlStreamReader* r);
diff --git a/GUI/Model/FromCore/ItemizeSimulation.cpp b/GUI/Model/FromCore/ItemizeSimulation.cpp
index 640f0d89efe..8096b62a4ad 100644
--- a/GUI/Model/FromCore/ItemizeSimulation.cpp
+++ b/GUI/Model/FromCore/ItemizeSimulation.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/Model/FromCore/ItemizeSimulation.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Const/Units.h"
 #include "Device/Beam/Beam.h"
 #include "Device/Detector/OffspecDetector.h"
@@ -226,8 +226,8 @@ void setGISASBeamItem(BeamItem* beam_item, const ScatteringSimulation& simulatio
 void setSphericalDetector(SphericalDetectorItem* detectorItem, const SphericalDetector& detector)
 {
     // Axes
-    const IAxis& phi_axis = detector.axis(0);
-    const IAxis& alpha_axis = detector.axis(1);
+    const Scale& phi_axis = detector.axis(0);
+    const Scale& alpha_axis = detector.axis(1);
 
     auto& phiAxisItem = detectorItem->phiAxis();
     phiAxisItem.setNbins(phi_axis.size());
@@ -370,8 +370,8 @@ OffspecInstrumentItem* createOffspecInstrumentItem(const OffspecSimulation& simu
     const OffspecDetector& detector = simulation.detector();
     OffspecDetectorItem* detectorItem = result->detectorItem();
 
-    const IAxis& phi_axis = detector.axis(0);
-    const IAxis& alpha_axis = detector.axis(1);
+    const Scale& phi_axis = detector.axis(0);
+    const Scale& alpha_axis = detector.axis(1);
 
     auto& phiAxisItem = detectorItem->phiAxis();
     phiAxisItem.setNbins(phi_axis.size());
diff --git a/GUI/Support/IO/ImportDataInfo.cpp b/GUI/Support/IO/ImportDataInfo.cpp
index b7ac0fdec6f..9f9306fab85 100644
--- a/GUI/Support/IO/ImportDataInfo.cpp
+++ b/GUI/Support/IO/ImportDataInfo.cpp
@@ -14,7 +14,7 @@
 
 #include "GUI/Support/IO/ImportDataInfo.h"
 #include "Base/Axis/Frame.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Device/Coord/CoordSystem1D.h"
 #include "Device/Data/Datafield.h"
 #include "GUI/Support/Util/CoordName.h"
diff --git a/GUI/View/Projection/ProjectionsPlot.cpp b/GUI/View/Projection/ProjectionsPlot.cpp
index d2e1e98aba5..f634c823804 100644
--- a/GUI/View/Projection/ProjectionsPlot.cpp
+++ b/GUI/View/Projection/ProjectionsPlot.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/View/Projection/ProjectionsPlot.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Device/Data/Datafield.h"
 #include "GUI/Model/Axis/AmplitudeAxisItem.h"
 #include "GUI/Model/Axis/BasicAxisItem.h"
diff --git a/GUI/View/Projection/SaveProjectionsAssistant.cpp b/GUI/View/Projection/SaveProjectionsAssistant.cpp
index 727b23745ab..bb358ff627a 100644
--- a/GUI/View/Projection/SaveProjectionsAssistant.cpp
+++ b/GUI/View/Projection/SaveProjectionsAssistant.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/View/Projection/SaveProjectionsAssistant.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Py/PyFmt.h"
 #include "Device/Data/Datafield.h"
 #include "GUI/Application/ApplicationSettings.h"
diff --git a/Sim/Export/PyFmt2.cpp b/Sim/Export/PyFmt2.cpp
index 5200061ca84..536f7ac27b3 100644
--- a/Sim/Export/PyFmt2.cpp
+++ b/Sim/Export/PyFmt2.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Sim/Export/PyFmt2.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Base/Const/Units.h"
 #include "Base/Py/PyFmt.h"
@@ -90,7 +90,7 @@ std::string Py::Fmt2::representShape2D(const std::string& indent, const IShape2D
 }
 
 //! Prints an axis.
-std::string Py::Fmt2::printAxis(const IAxis* a, const std::string& unit)
+std::string Py::Fmt2::printAxis(const Scale* a, const std::string& unit)
 {
     std::ostringstream result;
     if (a->isEquidistantCoverage())
diff --git a/Sim/Export/PyFmt2.h b/Sim/Export/PyFmt2.h
index ea109532b4e..65981157466 100644
--- a/Sim/Export/PyFmt2.h
+++ b/Sim/Export/PyFmt2.h
@@ -21,7 +21,7 @@
 #include <functional>
 #include <string>
 
-class IAxis;
+class Scale;
 class IDistribution1D;
 class IShape2D;
 class ParameterDistribution;
@@ -33,7 +33,7 @@ namespace Py::Fmt2 {
 std::string representShape2D(const std::string& indent, const IShape2D* ishape, bool mask_value,
                              std::function<std::string(double)> printValueFunc);
 
-std::string printAxis(const IAxis* axis, const std::string& unit);
+std::string printAxis(const Scale* axis, const std::string& unit);
 
 std::string printParameterDistribution(const ParameterDistribution& par_distr,
                                        const std::string& distVarName);
diff --git a/Sim/Export/SimulationToPython.cpp b/Sim/Export/SimulationToPython.cpp
index 76ab922ea6c..c3350171226 100644
--- a/Sim/Export/SimulationToPython.cpp
+++ b/Sim/Export/SimulationToPython.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Sim/Export/SimulationToPython.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Py/PyFmt.h"
 #include "Base/Util/Assert.h"
 #include "Device/Beam/Beam.h"
diff --git a/Sim/Fitting/SimDataPair.cpp b/Sim/Fitting/SimDataPair.cpp
index 236979d8360..eb3c4e8865a 100644
--- a/Sim/Fitting/SimDataPair.cpp
+++ b/Sim/Fitting/SimDataPair.cpp
@@ -14,7 +14,7 @@
 
 #include "Sim/Fitting/SimDataPair.h"
 #include "Base/Axis/Frame.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Math/Numeric.h"
 #include "Base/Util/Assert.h"
 #include "Device/Coord/ICoordSystem.h"
diff --git a/Sim/Scan/AlphaScan.cpp b/Sim/Scan/AlphaScan.cpp
index 9cdfc68eb4f..fc63c6bbb6b 100644
--- a/Sim/Scan/AlphaScan.cpp
+++ b/Sim/Scan/AlphaScan.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Sim/Scan/AlphaScan.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Device/Beam/IFootprintFactor.h"
 #include "Device/Coord/CoordSystem1D.h"
@@ -43,7 +43,7 @@ std::vector<ParameterSample> drawDistribution(const IDistribution1D* distrib)
 } // namespace
 
 
-AlphaScan::AlphaScan(const IAxis& alpha_axis)
+AlphaScan::AlphaScan(const Scale& alpha_axis)
     : IBeamScan(alpha_axis.clone(), 0.0)
 {
     checkInitialization();
diff --git a/Sim/Scan/AlphaScan.h b/Sim/Scan/AlphaScan.h
index c1c384b8922..4a196483537 100644
--- a/Sim/Scan/AlphaScan.h
+++ b/Sim/Scan/AlphaScan.h
@@ -25,7 +25,7 @@ class IDistribution1D;
 //! Features footprint correction.
 class AlphaScan : public IBeamScan {
 public:
-    AlphaScan(const IAxis& alpha_axis);
+    AlphaScan(const Scale& alpha_axis);
     AlphaScan(int nbins, double alpha_i_min, double alpha_i_max);
     ~AlphaScan() override;
     AlphaScan* clone() const override;
diff --git a/Sim/Scan/IBeamScan.cpp b/Sim/Scan/IBeamScan.cpp
index 7759b4bd7b2..0c195211b86 100644
--- a/Sim/Scan/IBeamScan.cpp
+++ b/Sim/Scan/IBeamScan.cpp
@@ -13,13 +13,13 @@
 //  ************************************************************************************************
 
 #include "Sim/Scan/IBeamScan.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Spin/SpinMatrix.h"
 #include "Device/Beam/IFootprintFactor.h"
 #include "Device/Pol/PolFilter.h"
 #include "Resample/Element/SpecularElement.h"
 
-IBeamScan::IBeamScan(IAxis* axis, double lambda0)
+IBeamScan::IBeamScan(Scale* axis, double lambda0)
     : m_axis(axis)
     , m_lambda0(lambda0)
 {
diff --git a/Sim/Scan/IBeamScan.h b/Sim/Scan/IBeamScan.h
index 4f93a7acb08..943056b71c9 100644
--- a/Sim/Scan/IBeamScan.h
+++ b/Sim/Scan/IBeamScan.h
@@ -23,7 +23,7 @@
 #include <vector>
 
 class CoordSystem1D;
-class IAxis;
+class Scale;
 class IFootprintFactor;
 class PolFilter;
 class SpecularElement;
@@ -33,7 +33,7 @@ class SpinMatrix;
 
 class IBeamScan : public ICloneable, public INode {
 public:
-    IBeamScan(IAxis* axis, double lambda0);
+    IBeamScan(Scale* axis, double lambda0);
     ~IBeamScan() override;
 
     IBeamScan* clone() const override = 0;
@@ -75,7 +75,7 @@ public:
     virtual std::vector<SpecularElement> generateElements() const = 0;
 
     //! Returns coordinate axis assigned to the data holder
-    const IAxis* coordinateAxis() const
+    const Scale* coordinateAxis() const
     {
         return m_axis.get();
     }
@@ -96,7 +96,7 @@ public:
     }
 
 protected:
-    const std::unique_ptr<const IAxis> m_axis;
+    const std::unique_ptr<const Scale> m_axis;
     double m_lambda0;
     double m_intensity = 1; //!< Fudge factor to adjust for imperfect normalization of exp. data
     std::unique_ptr<R3> m_beamPolarization; //!< Bloch vector encoding the beam's polarization
diff --git a/Sim/Scan/QzScan.cpp b/Sim/Scan/QzScan.cpp
index 4b002deadfe..66949bdc073 100644
--- a/Sim/Scan/QzScan.cpp
+++ b/Sim/Scan/QzScan.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Sim/Scan/QzScan.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Base/Util/Assert.h"
 #include "Device/Coord/CoordSystem1D.h"
@@ -23,7 +23,7 @@
 #include "Resample/Element/SpecularElement.h"
 #include <algorithm>
 
-QzScan::QzScan(IAxis* qs_nm)
+QzScan::QzScan(Scale* qs_nm)
     : IBeamScan(qs_nm, std::nan(""))
 {
     std::vector<double> axis_values = m_axis->binCenters();
@@ -41,7 +41,7 @@ QzScan::QzScan(std::vector<double> qs_nm)
 {
 }
 
-QzScan::QzScan(const IAxis& qs_nm)
+QzScan::QzScan(const Scale& qs_nm)
     : QzScan(qs_nm.clone())
 {
 }
diff --git a/Sim/Scan/QzScan.h b/Sim/Scan/QzScan.h
index d65211ab173..521110f2ff3 100644
--- a/Sim/Scan/QzScan.h
+++ b/Sim/Scan/QzScan.h
@@ -27,9 +27,9 @@ class QzScan : public IBeamScan {
 public:
     //! Accepts qz-value vector (in inverse nm)
     QzScan(std::vector<double> qs_nm);
-    QzScan(const IAxis& qs_nm);
+    QzScan(const Scale& qs_nm);
     //! Sets q-defined specular scan. Accepts either numpy array of q-values sorted in ascending
-    //! order or an IAxis object with q-values. Alternatively an axis can be defined in-place, then
+    //! order or an Scale object with q-values. Alternatively an axis can be defined in-place, then
     //! the first passed parameter is the number of bins, second - minimum on-axis q-value,
     //! third - maximum on-axis q_value.
     QzScan(int nbins, double qz_min, double qz_max);
@@ -73,7 +73,7 @@ public:
     }
 
 private:
-    QzScan(IAxis* qs_nm);
+    QzScan(Scale* qs_nm);
     std::unique_ptr<const IDistribution1D> m_qz_distrib;
     std::vector<double> m_resol_width;
     bool m_relative_resolution{false};
diff --git a/Sim/Simulation/DepthprobeSimulation.cpp b/Sim/Simulation/DepthprobeSimulation.cpp
index f1afbdebcaf..cbc8466e77b 100644
--- a/Sim/Simulation/DepthprobeSimulation.cpp
+++ b/Sim/Simulation/DepthprobeSimulation.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Sim/Simulation/DepthprobeSimulation.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include <numbers>
 using std::numbers::pi;
 #include "Base/Progress/ProgressHandler.h"
@@ -40,7 +40,7 @@ const int WaveProperty_Modulus = 4;
 const int WaveProperty_Phase = 8;
 
 DepthprobeSimulation::DepthprobeSimulation(const IBeamScan& scan, const MultiLayer& sample,
-                                           const IAxis& zaxis, int flags)
+                                           const Scale& zaxis, int flags)
     : ISimulation(sample)
     , m_scan(dynamic_cast<AlphaScan*>(scan.clone()))
     , m_z_axis(zaxis.clone())
@@ -54,7 +54,7 @@ DepthprobeSimulation::~DepthprobeSimulation() = default;
 
 const ICoordSystem* DepthprobeSimulation::simCoordSystem() const
 {
-    std::vector<const IAxis*> axes({m_scan->coordinateAxis()->clone(), m_z_axis->clone()});
+    std::vector<const Scale*> axes({m_scan->coordinateAxis()->clone(), m_z_axis->clone()});
     return new DepthprobeCoords(std::move(axes), (2 * pi) / m_scan->wavelength());
 }
 
@@ -177,7 +177,7 @@ size_t DepthprobeSimulation::nOutChannels() const
 
 SimulationResult DepthprobeSimulation::packResult()
 {
-    std::vector<const IAxis*> axes{m_scan->coordinateAxis()->clone(), m_z_axis->clone()};
+    std::vector<const Scale*> axes{m_scan->coordinateAxis()->clone(), m_z_axis->clone()};
     auto data = std::make_unique<Datafield>(std::move(axes), m_cache);
 
     return {*data, simCoordSystem()};
diff --git a/Sim/Simulation/DepthprobeSimulation.h b/Sim/Simulation/DepthprobeSimulation.h
index 01e000ba703..62ddec98a07 100644
--- a/Sim/Simulation/DepthprobeSimulation.h
+++ b/Sim/Simulation/DepthprobeSimulation.h
@@ -18,7 +18,7 @@
 #include "Sim/Simulation/ISimulation.h"
 
 class AlphaScan;
-class IAxis;
+class Scale;
 class IBeamScan;
 class IFootprintFactor;
 
@@ -38,7 +38,7 @@ extern const int WaveProperty_Phase;
 
 class DepthprobeSimulation : public ISimulation {
 public:
-    DepthprobeSimulation(const IBeamScan& scan, const MultiLayer& sample, const IAxis& zaxis,
+    DepthprobeSimulation(const IBeamScan& scan, const MultiLayer& sample, const Scale& zaxis,
                          int flags = 0);
     ~DepthprobeSimulation() override;
 
@@ -78,7 +78,7 @@ private:
 
     //... Model components:
     std::unique_ptr<AlphaScan> m_scan;
-    std::unique_ptr<IAxis> m_z_axis;
+    std::unique_ptr<Scale> m_z_axis;
     const int m_flags;
 #endif // SWIG
 };
diff --git a/Sim/Simulation/OffspecSimulation.cpp b/Sim/Simulation/OffspecSimulation.cpp
index 6aa5566cbb3..80f83afb2f4 100644
--- a/Sim/Simulation/OffspecSimulation.cpp
+++ b/Sim/Simulation/OffspecSimulation.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Sim/Simulation/OffspecSimulation.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Pixel/IPixel.h"
 #include "Base/Util/Assert.h"
 #include "Device/Coord/CoordSystem2D.h"
@@ -56,7 +56,7 @@ void OffspecSimulation::prepareSimulation()
 const ICoordSystem* OffspecSimulation::simCoordSystem() const
 {
     return new OffspecCoords(
-        std::vector<const IAxis*>{m_scan->coordinateAxis()->clone(), m_detector->axis(1).clone()});
+        std::vector<const Scale*>{m_scan->coordinateAxis()->clone(), m_detector->axis(1).clone()});
 }
 
 //... Overridden executors:
diff --git a/Sim/Simulation/ScatteringSimulation.cpp b/Sim/Simulation/ScatteringSimulation.cpp
index 413ad59ff64..eef455e79ac 100644
--- a/Sim/Simulation/ScatteringSimulation.cpp
+++ b/Sim/Simulation/ScatteringSimulation.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Sim/Simulation/ScatteringSimulation.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Pixel/IPixel.h"
 #include "Base/Util/Assert.h"
 #include "Device/Beam/Beam.h"
diff --git a/Sim/Simulation/SpecularSimulation.cpp b/Sim/Simulation/SpecularSimulation.cpp
index 941529eed12..ac0b22087fc 100644
--- a/Sim/Simulation/SpecularSimulation.cpp
+++ b/Sim/Simulation/SpecularSimulation.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Sim/Simulation/SpecularSimulation.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Util/Assert.h"
 #include "Device/Beam/IFootprintFactor.h"
 #include "Device/Coord/CoordSystem1D.h"
diff --git a/Tests/Functional/Fitting/FitTests.cpp b/Tests/Functional/Fitting/FitTests.cpp
index badc2694908..619cc06ca59 100644
--- a/Tests/Functional/Fitting/FitTests.cpp
+++ b/Tests/Functional/Fitting/FitTests.cpp
@@ -12,7 +12,7 @@
 //
 //  ************************************************************************************************
 
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Const/Units.h"
 #include "Device/Beam/Beam.h"
 #include "Device/Data/Datafield.h"
diff --git a/Tests/SimFactory/MakeSimulations.cpp b/Tests/SimFactory/MakeSimulations.cpp
index 195056f828e..98ae91f2ee2 100644
--- a/Tests/SimFactory/MakeSimulations.cpp
+++ b/Tests/SimFactory/MakeSimulations.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Tests/SimFactory/MakeSimulations.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Base/Const/Units.h"
 #include "Device/Beam/Beam.h"
@@ -331,7 +331,7 @@ IBeamScan* test::makeSimulation::BasicSpecularScan(bool vsQ)
     const double max_angle = 5 * deg;
 
     if (vsQ) {
-        IAxis angle_axis = FixedBinAxis("axis", number_of_bins, min_angle, max_angle);
+        Scale angle_axis = FixedBinAxis("axis", number_of_bins, min_angle, max_angle);
         auto angles = angle_axis.binCenters();
         std::vector<double> qs(angle_axis.size(), 0.0);
         for (size_t i = 0, size = qs.size(); i < size; ++i)
@@ -419,7 +419,7 @@ test::makeSimulation::SpecularDivergentBeam(const MultiLayer& sample)
 std::unique_ptr<SpecularSimulation>
 test::makeSimulation::TOFRWithRelativeResolution(const MultiLayer& sample)
 {
-    IAxis qs = FixedBinAxis("axis", 500, 0.0, 1.0);
+    Scale qs = FixedBinAxis("axis", 500, 0.0, 1.0);
     QzScan scan(qs);
     scan.setRelativeQResolution(DistributionGaussian(0., 1., 20, 2.0), 0.03);
 
@@ -431,7 +431,7 @@ test::makeSimulation::TOFRWithRelativeResolution(const MultiLayer& sample)
 std::unique_ptr<SpecularSimulation>
 test::makeSimulation::TOFRWithPointwiseResolution(const MultiLayer& sample)
 {
-    IAxis qs = FixedBinAxis("axis", 500, 0.0, 1.0);
+    Scale qs = FixedBinAxis("axis", 500, 0.0, 1.0);
     QzScan scan(qs);
 
     std::vector<double> resolutions;
@@ -456,7 +456,7 @@ test::makeSimulation::BasicDepthprobe(const MultiLayer& sample)
     AlphaScan scan(20, 0.025 * deg, 0.975 * deg);
     scan.setWavelength(1.);
 
-    IAxis zaxis = FixedBinAxis("z", 20, -100., +100.);
+    Scale zaxis = FixedBinAxis("z", 20, -100., +100.);
 
     return std::make_unique<DepthprobeSimulation>(scan, sample, zaxis);
 }
diff --git a/Tests/Suite/Common/TestSuite.h b/Tests/Suite/Common/TestSuite.h
index b353e7be261..a95a70824a8 100644
--- a/Tests/Suite/Common/TestSuite.h
+++ b/Tests/Suite/Common/TestSuite.h
@@ -19,7 +19,7 @@
 #ifndef BORNAGAIN_TESTS_SUITE_COMMON_TESTSUITE_H
 #define BORNAGAIN_TESTS_SUITE_COMMON_TESTSUITE_H
 
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Sample/ComponentBuilder/FormFactorComponents.h"
 #include "Sample/ComponentBuilder/Profile2DComponents.h"
 #include "Sample/Multilayer/MultiLayer.h"
diff --git a/Tests/Unit/Device/ArrayUtilsTest.cpp b/Tests/Unit/Device/ArrayUtilsTest.cpp
index 45f3d8f30d2..249a4e2d57a 100644
--- a/Tests/Unit/Device/ArrayUtilsTest.cpp
+++ b/Tests/Unit/Device/ArrayUtilsTest.cpp
@@ -1,4 +1,4 @@
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Device/Data/ArrayUtil.h"
 #include "Device/Data/Datafield.h"
diff --git a/Tests/Unit/Device/DepthprobeConverterTest.cpp b/Tests/Unit/Device/DepthprobeConverterTest.cpp
index 64a7d9abd33..306dc0a18b9 100644
--- a/Tests/Unit/Device/DepthprobeConverterTest.cpp
+++ b/Tests/Unit/Device/DepthprobeConverterTest.cpp
@@ -1,4 +1,4 @@
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Base/Const/Units.h"
 #include "Device/Coord/CoordSystem2D.h"
@@ -20,7 +20,7 @@ protected:
     const double m_z_end = 10.0;
     const size_t m_nbins = 100;
     double m_wavenumber = (2 * pi) / 1.0;
-    std::vector<const IAxis*> m_axes;
+    std::vector<const Scale*> m_axes;
 };
 
 DepthprobeCoordsTest::DepthprobeCoordsTest()
@@ -66,7 +66,7 @@ void DepthprobeCoordsTest::checkMainFunctionality(const DepthprobeCoords& test_o
 
 void DepthprobeCoordsTest::checkAlphaAxis(Coords units, const DepthprobeCoords& test_object)
 {
-    std::unique_ptr<IAxis> axis(test_object.convertedAxis(0, units));
+    std::unique_ptr<Scale> axis(test_object.convertedAxis(0, units));
     EXPECT_EQ(axis->size(), m_nbins);
     EXPECT_EQ(axis->min(), test_object.calculateMin(0, units));
     EXPECT_EQ(axis->max(), test_object.calculateMax(0, units));
@@ -74,7 +74,7 @@ void DepthprobeCoordsTest::checkAlphaAxis(Coords units, const DepthprobeCoords&
 
 void DepthprobeCoordsTest::checkZAxis(Coords units, const DepthprobeCoords& test_object)
 {
-    std::unique_ptr<IAxis> axis(test_object.convertedAxis(1, units));
+    std::unique_ptr<Scale> axis(test_object.convertedAxis(1, units));
     EXPECT_EQ(axis->size(), m_nbins);
 
     EXPECT_EQ(axis->min(), test_object.calculateMin(1, units));
diff --git a/Tests/Unit/Device/FixedBinAxisTest.cpp b/Tests/Unit/Device/FixedBinAxisTest.cpp
index a87950d396d..1bf1b287dff 100644
--- a/Tests/Unit/Device/FixedBinAxisTest.cpp
+++ b/Tests/Unit/Device/FixedBinAxisTest.cpp
@@ -1,4 +1,4 @@
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Device/IO/DataFormatUtil.h"
 #include "Tests/GTestWrapper/google_test.h"
@@ -6,7 +6,7 @@
 
 TEST(FixedBinAxisTest, IndexedAccessor)
 {
-    IAxis a1 = FixedBinAxis("length", 100, 0.0, 10.0);
+    Scale a1 = FixedBinAxis("length", 100, 0.0, 10.0);
     EXPECT_EQ(100u, a1.size());
     EXPECT_EQ(0.0, a1.min());
     EXPECT_EQ(10.0, a1.max());
@@ -15,7 +15,7 @@ TEST(FixedBinAxisTest, IndexedAccessor)
     EXPECT_DOUBLE_EQ(6.55, a1.binCenter(65));
     EXPECT_DOUBLE_EQ(9.95, a1.binCenter(99));
 
-    IAxis a2 = FixedBinAxis("name", 3, -1.5, 1.5);
+    Scale a2 = FixedBinAxis("name", 3, -1.5, 1.5);
     EXPECT_DOUBLE_EQ(-1.0, a2.binCenter(0));
     EXPECT_DOUBLE_EQ(0.0, a2.binCenter(1));
     EXPECT_DOUBLE_EQ(1.0, a2.binCenter(2));
@@ -24,7 +24,7 @@ TEST(FixedBinAxisTest, IndexedAccessor)
 
 TEST(FixedBinAxisTest, VectorOfUnitLength)
 {
-    IAxis axis = FixedBinAxis("name", 1, 1.0, 2.0);
+    Scale axis = FixedBinAxis("name", 1, 1.0, 2.0);
     EXPECT_EQ(1u, axis.size());
     EXPECT_EQ(double(1.0), axis.min());
     EXPECT_EQ(double(2.0), axis.max());
@@ -33,7 +33,7 @@ TEST(FixedBinAxisTest, VectorOfUnitLength)
 
 TEST(FixedBinAxisTest, FindClosestIndex)
 {
-    IAxis v1 = FixedBinAxis("name", 2, 0.0, 1.0);
+    Scale v1 = FixedBinAxis("name", 2, 0.0, 1.0);
     EXPECT_EQ(size_t(2), v1.size());
     EXPECT_EQ(size_t(0), v1.closestIndex(0.0));
     EXPECT_EQ(size_t(0), v1.closestIndex(0.25));
@@ -42,7 +42,7 @@ TEST(FixedBinAxisTest, FindClosestIndex)
     //    EXPECT_THROW( v1.closestIndex(1.0), std::runtime_error);
     EXPECT_EQ(size_t(1), v1.closestIndex(1.0));
 
-    IAxis v2 = FixedBinAxis("name", 3, -1.5, 1.5);
+    Scale v2 = FixedBinAxis("name", 3, -1.5, 1.5);
     EXPECT_EQ(size_t(0), v2.closestIndex(-1.5));
     EXPECT_EQ(size_t(0), v2.closestIndex(-1.0));
     EXPECT_EQ(size_t(1), v2.closestIndex(-0.5));
@@ -55,7 +55,7 @@ TEST(FixedBinAxisTest, FindClosestIndex)
 
 TEST(FixedBinAxisTest, CheckBin)
 {
-    IAxis axis = FixedBinAxis("name", 20, 0, 10);
+    Scale axis = FixedBinAxis("name", 20, 0, 10);
 
     Bin1D bin0 = axis.bin(0);
     EXPECT_DOUBLE_EQ(0.25, bin0.center());
@@ -81,7 +81,7 @@ TEST(FixedBinAxisTest, CheckBin)
 
     EXPECT_THROW(axis.bin(20), std::out_of_range);
 
-    IAxis axis2 = FixedBinAxis("name", 3, -1, 2.0);
+    Scale axis2 = FixedBinAxis("name", 3, -1, 2.0);
     EXPECT_DOUBLE_EQ(-0.5, axis2.bin(0).center());
     EXPECT_DOUBLE_EQ(0.5, axis2.bin(1).center());
     EXPECT_DOUBLE_EQ(1.5, axis2.bin(2).center());
@@ -89,13 +89,13 @@ TEST(FixedBinAxisTest, CheckBin)
 
 TEST(FixedBinAxisTest, CheckEquality)
 {
-    IAxis b1 = FixedBinAxis("axis", 99, -1.01, 3.3);
-    IAxis b2 = FixedBinAxis("axis", 99, -1.01, 3.3);
+    Scale b1 = FixedBinAxis("axis", 99, -1.01, 3.3);
+    Scale b2 = FixedBinAxis("axis", 99, -1.01, 3.3);
     EXPECT_TRUE(b1 == b2);
-    IAxis b3 = FixedBinAxis("axissss", 99, -1.01, 3.3);
-    IAxis b4 = FixedBinAxis("axis", 99, -1.0, 3.3);
-    IAxis b5 = FixedBinAxis("axis", 99, -1.01, 3.29);
-    IAxis b6 = FixedBinAxis("axiss", 98, -1.01, 3.3);
+    Scale b3 = FixedBinAxis("axissss", 99, -1.01, 3.3);
+    Scale b4 = FixedBinAxis("axis", 99, -1.0, 3.3);
+    Scale b5 = FixedBinAxis("axis", 99, -1.01, 3.29);
+    Scale b6 = FixedBinAxis("axiss", 98, -1.01, 3.3);
     EXPECT_FALSE(b1 == b3);
     EXPECT_FALSE(b1 == b4);
     EXPECT_FALSE(b1 == b5);
@@ -104,27 +104,27 @@ TEST(FixedBinAxisTest, CheckEquality)
 
 TEST(FixedBinAxisTest, CheckClone)
 {
-    IAxis a1 = FixedBinAxis("axis", 99, -1.2, 5.4);
-    IAxis* clone = a1.clone();
+    Scale a1 = FixedBinAxis("axis", 99, -1.2, 5.4);
+    Scale* clone = a1.clone();
     EXPECT_TRUE(a1 == *clone);
     delete clone;
 }
 
 TEST(FixedBinAxisTest, IOStream)
 {
-    IAxis axis = FixedBinAxis("name", 99, -1.2, 5.4);
+    Scale axis = FixedBinAxis("name", 99, -1.2, 5.4);
 
     std::ostringstream oss;
     oss << axis;
     std::istringstream iss(oss.str());
 
-    std::unique_ptr<IAxis> result(DataUtil::Format::createAxis(iss));
+    std::unique_ptr<Scale> result(DataUtil::Format::createAxis(iss));
     EXPECT_TRUE(axis == *result);
 }
 
 TEST(FixedBinAxisTest, BinCenters)
 {
-    IAxis axis = FixedBinAxis("name", 3, -1.5, 1.5);
+    Scale axis = FixedBinAxis("name", 3, -1.5, 1.5);
     std::vector<double> centers = axis.binCenters();
     EXPECT_EQ(size_t(3), centers.size());
     EXPECT_DOUBLE_EQ(-1.0, centers[0]);
diff --git a/Tests/Unit/Device/IOReaderWriterTest.cpp b/Tests/Unit/Device/IOReaderWriterTest.cpp
index f5b967504a9..8866f56fc84 100644
--- a/Tests/Unit/Device/IOReaderWriterTest.cpp
+++ b/Tests/Unit/Device/IOReaderWriterTest.cpp
@@ -1,4 +1,4 @@
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Device/Data/Datafield.h"
 #include "Device/IO/ReadWriteINT.h"
diff --git a/Tests/Unit/Device/IntensityDataFunctionsTest.cpp b/Tests/Unit/Device/IntensityDataFunctionsTest.cpp
index 4a9017fd9b7..ed80585c9dd 100644
--- a/Tests/Unit/Device/IntensityDataFunctionsTest.cpp
+++ b/Tests/Unit/Device/IntensityDataFunctionsTest.cpp
@@ -1,6 +1,6 @@
 #include "Base/Axis/Frame.h"
 #include "Base/Axis/FrameUtil.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Device/Data/DataUtil.h"
 #include "Device/Data/Datafield.h"
@@ -51,7 +51,7 @@ TEST(DataUtilTest, createRearrangedDataSet)
 
 TEST(DataUtilTest, coordinateToFromBinf)
 {
-    IAxis axis = FixedBinAxis("axis", 8, -5.0, 3.0);
+    Scale axis = FixedBinAxis("axis", 8, -5.0, 3.0);
     EXPECT_EQ(0.5, FrameUtil::coordinateToBinf(-4.5, axis));
     EXPECT_EQ(-4.5, FrameUtil::coordinateFromBinf(0.5, axis));
 
diff --git a/Tests/Unit/Device/OffspecConverterTest.cpp b/Tests/Unit/Device/OffspecConverterTest.cpp
index 1abe3755dc5..d0994636712 100644
--- a/Tests/Unit/Device/OffspecConverterTest.cpp
+++ b/Tests/Unit/Device/OffspecConverterTest.cpp
@@ -1,4 +1,4 @@
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Base/Const/Units.h"
 #include "Device/Beam/Beam.h"
@@ -12,13 +12,13 @@ public:
     {
         const auto axes = m_detector.axesClippedToRegionOfInterest();
 
-        std::vector<const IAxis*> axes2({m_alpha_i_axis.clone(), axes[1]->clone()});
+        std::vector<const Scale*> axes2({m_alpha_i_axis.clone(), axes[1]->clone()});
         return new OffspecCoords(std::move(axes2));
     }
 
 protected:
     SphericalDetector m_detector{100, 0.0, 5.0 * Units::deg, 70, -2.0 * Units::deg, 1.5};
-    IAxis m_alpha_i_axis = FixedBinAxis("alpha_i", 51, 0.0, 7.0 * Units::deg);
+    Scale m_alpha_i_axis = FixedBinAxis("alpha_i", 51, 0.0, 7.0 * Units::deg);
     Beam m_beam{1, 1.0, 1.0 * Units::deg};
 };
 
@@ -60,11 +60,11 @@ TEST_F(OffspecCoordsTest, OffspecCoords)
     EXPECT_FAILED_ASSERT(coords->calculateMin(2, Coords::UNDEFINED));
     EXPECT_FAILED_ASSERT(coords->calculateMax(2, Coords::UNDEFINED));
 
-    std::unique_ptr<IAxis> axis(coords->convertedAxis(0, Coords::UNDEFINED));
+    std::unique_ptr<Scale> axis(coords->convertedAxis(0, Coords::UNDEFINED));
     EXPECT_EQ(axis->min(), coords->calculateMin(0, Coords::UNDEFINED));
     EXPECT_EQ(axis->max(), coords->calculateMax(0, Coords::UNDEFINED));
 
-    std::unique_ptr<IAxis> axis2(coords->convertedAxis(1, Coords::RADIANS));
+    std::unique_ptr<Scale> axis2(coords->convertedAxis(1, Coords::RADIANS));
     EXPECT_EQ(axis2->min(), coords->calculateMin(1, Coords::RADIANS));
     EXPECT_EQ(axis2->max(), coords->calculateMax(1, Coords::RADIANS));
 
diff --git a/Tests/Unit/Device/PointwiseAxisTest.cpp b/Tests/Unit/Device/PointwiseAxisTest.cpp
index ba888d1bde4..55088d65de4 100644
--- a/Tests/Unit/Device/PointwiseAxisTest.cpp
+++ b/Tests/Unit/Device/PointwiseAxisTest.cpp
@@ -1,4 +1,4 @@
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Device/IO/DataFormatUtil.h"
 #include "Tests/GTestWrapper/google_test.h"
@@ -9,16 +9,16 @@ TEST(PointwiseAxisTest, Construction)
     EXPECT_THROW(DiscreteAxis("length", std::vector<double>{1.0, 0.0}), std::runtime_error);
     EXPECT_THROW(DiscreteAxis("length", std::vector<double>{0.0, 1.0, 0.5}), std::runtime_error);
     EXPECT_THROW(DiscreteAxis("length", std::vector<double>{0.0, 1.0, 1.0}), std::runtime_error);
-    IAxis a1 = DiscreteAxis("length", std::vector<double>{0.0, 1.0});
+    Scale a1 = DiscreteAxis("length", std::vector<double>{0.0, 1.0});
     std::vector<double> coordinates{0.0, 1.0};
-    IAxis a2 = DiscreteAxis("length", coordinates);
+    Scale a2 = DiscreteAxis("length", coordinates);
     EXPECT_TRUE(a1 == a2);
 }
 
 TEST(PointwiseAxisTest, BasicProperties)
 {
     std::vector<double> coordinates{0.0, 1.0, 4.0, 8.0};
-    IAxis a1 = DiscreteAxis("length", coordinates);
+    Scale a1 = DiscreteAxis("length", coordinates);
     EXPECT_EQ(4u, a1.size());
     EXPECT_EQ(0.0, a1.min());
     EXPECT_EQ(8.0, a1.max());
@@ -37,7 +37,7 @@ TEST(PointwiseAxisTest, BasicProperties)
 
 TEST(PointwiseAxisTest, FindClosestIndex)
 {
-    IAxis v1 = DiscreteAxis("name", std::vector<double>{0.0, 1.0, 4.0, 8.0});
+    Scale v1 = DiscreteAxis("name", std::vector<double>{0.0, 1.0, 4.0, 8.0});
     EXPECT_EQ(4u, v1.size());
     EXPECT_EQ(v1.closestIndex(-1.0), 0u);
     EXPECT_EQ(v1.closestIndex(0.0), 0u);
@@ -49,7 +49,7 @@ TEST(PointwiseAxisTest, FindClosestIndex)
     EXPECT_EQ(3u, v1.closestIndex(8.0));
     EXPECT_EQ(3u, v1.closestIndex(11.0));
 
-    IAxis v2 = DiscreteAxis("name", std::vector<double>{-2.0, -1.0});
+    Scale v2 = DiscreteAxis("name", std::vector<double>{-2.0, -1.0});
     EXPECT_EQ(2u, v2.size());
     EXPECT_EQ(v2.closestIndex(-3.0), 0u);
     EXPECT_EQ(v2.closestIndex(-2.0), 0u);
@@ -61,12 +61,12 @@ TEST(PointwiseAxisTest, FindClosestIndex)
 
 TEST(PointwiseAxisTest, CheckEquality)
 {
-    IAxis b1 = DiscreteAxis("axis", std::vector<double>{1.0, 2.0, 5.0});
-    IAxis b2 = DiscreteAxis("axis", std::vector<double>{1.0, 2.0, 5.0});
+    Scale b1 = DiscreteAxis("axis", std::vector<double>{1.0, 2.0, 5.0});
+    Scale b2 = DiscreteAxis("axis", std::vector<double>{1.0, 2.0, 5.0});
     EXPECT_TRUE(b1 == b2);
-    IAxis b3 = DiscreteAxis("axissss", std::vector<double>{1.0, 2.0, 5.0});
-    IAxis b4 = DiscreteAxis("axis", std::vector<double>{1.0, 2.0, 6.0});
-    IAxis b6 = DiscreteAxis("axiss", std::vector<double>{1.5, 2.0, 5.0});
+    Scale b3 = DiscreteAxis("axissss", std::vector<double>{1.0, 2.0, 5.0});
+    Scale b4 = DiscreteAxis("axis", std::vector<double>{1.0, 2.0, 6.0});
+    Scale b6 = DiscreteAxis("axiss", std::vector<double>{1.5, 2.0, 5.0});
     EXPECT_FALSE(b1 == b3);
     EXPECT_FALSE(b1 == b4);
     EXPECT_FALSE(b1 == b6);
@@ -74,34 +74,34 @@ TEST(PointwiseAxisTest, CheckEquality)
 
 TEST(PointwiseAxisTest, CheckClone)
 {
-    IAxis a1 = DiscreteAxis("axis", std::vector<double>{1.0, 2.0, 5.0});
-    IAxis* clone = a1.clone();
+    Scale a1 = DiscreteAxis("axis", std::vector<double>{1.0, 2.0, 5.0});
+    Scale* clone = a1.clone();
     EXPECT_TRUE(a1 == *clone);
 }
 
 TEST(PointwiseAxisTest, IOStream)
 {
-    IAxis axis = DiscreteAxis("name", std::vector<double>{1.0, 2.0, 5.0});
+    Scale axis = DiscreteAxis("name", std::vector<double>{1.0, 2.0, 5.0});
 
     std::ostringstream oss;
     oss << axis;
     std::istringstream iss(oss.str());
 
-    std::unique_ptr<IAxis> result(DataUtil::Format::createAxis(iss));
+    std::unique_ptr<Scale> result(DataUtil::Format::createAxis(iss));
     EXPECT_TRUE(axis == *result);
 }
 
 TEST(PointwiseAxisTest, ClippedAxis)
 {
-    IAxis axis = DiscreteAxis("name", std::vector<double>{1.0, 2.0, 2.5, 2.7, 5.0});
+    Scale axis = DiscreteAxis("name", std::vector<double>{1.0, 2.0, 2.5, 2.7, 5.0});
 
-    IAxis clip1 = axis.clipped(0.99, 5.1);
+    Scale clip1 = axis.clipped(0.99, 5.1);
     EXPECT_TRUE(clip1 == axis);
 
-    IAxis clip2 = axis.clipped(1, 5.0);
+    Scale clip2 = axis.clipped(1, 5.0);
     EXPECT_TRUE(clip2 == axis);
 
-    IAxis clip3 = axis.clipped(1.5, 2.5);
+    Scale clip3 = axis.clipped(1.5, 2.5);
     EXPECT_TRUE(clip3 != axis);
     EXPECT_EQ(clip3.size(), 2u);
     EXPECT_EQ(clip3.binCenter(0), 2.0);
@@ -113,13 +113,13 @@ TEST(PointwiseAxisTest, ClippedAxis)
 
 TEST(PointwiseAxisTest, FixedBinAxisComparisonWithMask)
 {
-    IAxis axis = FixedBinAxis("reference", 10, 0.0, 10.0);
+    Scale axis = FixedBinAxis("reference", 10, 0.0, 10.0);
 
     const std::vector<size_t> mask{0u, 2u, 3u, 4u, 7u, 8u, 9u};
     std::vector<double> coordinates;
     for (auto index : mask)
         coordinates.push_back(axis.binCenter(index));
-    IAxis pointwise_axis = DiscreteAxis("pointwise", coordinates);
+    Scale pointwise_axis = DiscreteAxis("pointwise", coordinates);
 
     // comparing on-axis values
     for (size_t i = 0; i < mask.size(); ++i)
diff --git a/Tests/Unit/Device/RectangularConverterTest.cpp b/Tests/Unit/Device/RectangularConverterTest.cpp
index aa9f8245666..aa769984a9e 100644
--- a/Tests/Unit/Device/RectangularConverterTest.cpp
+++ b/Tests/Unit/Device/RectangularConverterTest.cpp
@@ -1,4 +1,4 @@
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Const/Units.h"
 #include "Base/Pixel/RectangularPixel.h"
 #include "Device/Beam/Beam.h"
@@ -90,11 +90,11 @@ TEST_F(RectangularConverterTest, ImageCoords)
     EXPECT_FAILED_ASSERT(converter.calculateMin(2, Coords::UNDEFINED));
     EXPECT_FAILED_ASSERT(converter.calculateMax(2, Coords::UNDEFINED));
 
-    std::unique_ptr<IAxis> axis(converter.convertedAxis(0, Coords::UNDEFINED));
+    std::unique_ptr<Scale> axis(converter.convertedAxis(0, Coords::UNDEFINED));
     EXPECT_EQ(axis->min(), converter.calculateMin(0, Coords::UNDEFINED));
     EXPECT_EQ(axis->max(), converter.calculateMax(0, Coords::UNDEFINED));
 
-    std::unique_ptr<IAxis> axis2(converter.convertedAxis(1, Coords::QSPACE));
+    std::unique_ptr<Scale> axis2(converter.convertedAxis(1, Coords::QSPACE));
     EXPECT_EQ(axis2->min(), converter.calculateMin(1, Coords::QSPACE));
     EXPECT_EQ(axis2->max(), converter.calculateMax(1, Coords::QSPACE));
 
diff --git a/Tests/Unit/Device/RegionOfInterestTest.cpp b/Tests/Unit/Device/RegionOfInterestTest.cpp
index 983246be1fe..08fad1dff11 100644
--- a/Tests/Unit/Device/RegionOfInterestTest.cpp
+++ b/Tests/Unit/Device/RegionOfInterestTest.cpp
@@ -7,7 +7,7 @@
 
 TEST(RegionOfInterestTest, constructor)
 {
-    SphericalDetector detector(std::array<std::shared_ptr<IAxis>, 2>{
+    SphericalDetector detector(std::array<std::shared_ptr<Scale>, 2>{
         sharedFixedBinAxis("axis0", 8, -3.0, 5.0), sharedFixedBinAxis("axis1", 4, 0.0, 4.0)});
 
     // creating region of interest
@@ -33,7 +33,7 @@ TEST(RegionOfInterestTest, constructor)
 
 TEST(RegionOfInterestTest, largeArea)
 {
-    SphericalDetector detector(std::array<std::shared_ptr<IAxis>, 2>{
+    SphericalDetector detector(std::array<std::shared_ptr<Scale>, 2>{
         sharedFixedBinAxis("axis0", 8, -3.0, 5.0), sharedFixedBinAxis("axis1", 4, 0.0, 4.0)});
 
     // creating region of interest
@@ -55,7 +55,7 @@ TEST(RegionOfInterestTest, largeArea)
 
 TEST(RegionOfInterestTest, clone)
 {
-    SphericalDetector detector(std::array<std::shared_ptr<IAxis>, 2>{
+    SphericalDetector detector(std::array<std::shared_ptr<Scale>, 2>{
         sharedFixedBinAxis("axis0", 8, -3.0, 5.0), sharedFixedBinAxis("axis1", 4, 0.0, 4.0)});
 
     // creating region of interest
diff --git a/Tests/Unit/Device/SphericalConverterTest.cpp b/Tests/Unit/Device/SphericalConverterTest.cpp
index 5d6761a7d4a..bf48448b84f 100644
--- a/Tests/Unit/Device/SphericalConverterTest.cpp
+++ b/Tests/Unit/Device/SphericalConverterTest.cpp
@@ -1,4 +1,4 @@
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Const/Units.h"
 #include "Device/Beam/Beam.h"
 #include "Device/Coord/CoordSystem2D.h"
@@ -63,11 +63,11 @@ TEST_F(SphericalConverterTest, SphericalCoords)
     EXPECT_FAILED_ASSERT(converter.calculateMin(2, Coords::UNDEFINED));
     EXPECT_FAILED_ASSERT(converter.calculateMax(2, Coords::UNDEFINED));
 
-    std::unique_ptr<IAxis> axis(converter.convertedAxis(0, Coords::UNDEFINED));
+    std::unique_ptr<Scale> axis(converter.convertedAxis(0, Coords::UNDEFINED));
     EXPECT_EQ(axis->min(), converter.calculateMin(0, Coords::UNDEFINED));
     EXPECT_EQ(axis->max(), converter.calculateMax(0, Coords::UNDEFINED));
 
-    std::unique_ptr<IAxis> axis2(converter.convertedAxis(1, Coords::QSPACE));
+    std::unique_ptr<Scale> axis2(converter.convertedAxis(1, Coords::QSPACE));
     EXPECT_EQ(axis2->min(), converter.calculateMin(1, Coords::QSPACE));
     EXPECT_EQ(axis2->max(), converter.calculateMax(1, Coords::QSPACE));
 
diff --git a/Tests/Unit/Device/SphericalDetectorTest.cpp b/Tests/Unit/Device/SphericalDetectorTest.cpp
index 16db4853e63..62d66f1543f 100644
--- a/Tests/Unit/Device/SphericalDetectorTest.cpp
+++ b/Tests/Unit/Device/SphericalDetectorTest.cpp
@@ -1,5 +1,5 @@
 #include "Device/Detector/SphericalDetector.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Base/Const/Units.h"
 #include "Device/Beam/Beam.h"
@@ -17,7 +17,7 @@ TEST(SphericalDetectorTest, constructionWithAxes)
 {
     auto axis0 = sharedFixedBinAxis("axis0", 10, 0.0, 10.0);
     auto axis1 = sharedFixedBinAxis("axis1", 20, 0.0, 20.0);
-    SphericalDetector detector(std::array<std::shared_ptr<IAxis>, 2>{axis0, axis1});
+    SphericalDetector detector(std::array<std::shared_ptr<Scale>, 2>{axis0, axis1});
 
     // checking dimension and axes
     EXPECT_EQ(axis0->min(), detector.axis(0).min());
@@ -57,7 +57,7 @@ TEST(SphericalDetectorTest, createDetectorMap)
 // Testing region of interest.
 TEST(SphericalDetectorTest, regionOfInterest)
 {
-    SphericalDetector detector(std::array<std::shared_ptr<IAxis>, 2>{
+    SphericalDetector detector(std::array<std::shared_ptr<Scale>, 2>{
         sharedFixedBinAxis("axis0", 8, -3.0, 5.0), sharedFixedBinAxis("axis1", 4, 0.0, 4.0)});
 
     // creating region of interest
diff --git a/Tests/Unit/GUI/Utils.cpp b/Tests/Unit/GUI/Utils.cpp
index c8ccb374b60..afbf202c6aa 100644
--- a/Tests/Unit/GUI/Utils.cpp
+++ b/Tests/Unit/GUI/Utils.cpp
@@ -41,7 +41,7 @@ void UTest::GUI::create_dir(const QString& dir_name)
 
 std::unique_ptr<Datafield> UTest::GUI::createData(double value, DIM n_dim)
 {
-    std::vector<const IAxis*> axes;
+    std::vector<const Scale*> axes;
     axes.emplace_back(newFixedBinAxis("x", nxsize, -1.0, 1.0));
     if (n_dim == DIM::D2)
         axes.emplace_back(newFixedBinAxis("y", nysize, 0.0, 2.0));
diff --git a/Tests/Unit/Sim/CoordSystem1DTest.cpp b/Tests/Unit/Sim/CoordSystem1DTest.cpp
index cdf623ff402..e40d6a64cc4 100644
--- a/Tests/Unit/Sim/CoordSystem1DTest.cpp
+++ b/Tests/Unit/Sim/CoordSystem1DTest.cpp
@@ -1,5 +1,5 @@
 #include "Device/Coord/CoordSystem1D.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Base/Const/Units.h"
 #include "Sim/Scan/QzScan.h"
@@ -16,8 +16,8 @@ public:
 protected:
     void checkConventionalConverter(const CoordSystem1D& test_object);
     void checkQSpecConverter(const CoordSystem1D& test_object);
-    IAxis m_axis = FixedBinAxis("Angles", 5, 0.5, 1.0);
-    IAxis m_q_axis = FixedBinAxis("Q values", 5, 0.0, 1.0);
+    Scale m_axis = FixedBinAxis("Angles", 5, 0.5, 1.0);
+    Scale m_q_axis = FixedBinAxis("Q values", 5, 0.0, 1.0);
     QzScan m_qscan{m_q_axis};
     double m_wavelength{1.};
 };
@@ -46,17 +46,17 @@ void CoordSystem1DTest::checkConventionalConverter(const CoordSystem1D& test_obj
                 getQ(expected_max) * 1e-10);
 
     // DEFAULT
-    std::unique_ptr<IAxis> axis_default(test_object.convertedAxis(0, Coords::UNDEFINED));
+    std::unique_ptr<Scale> axis_default(test_object.convertedAxis(0, Coords::UNDEFINED));
     EXPECT_EQ(axis_default->min(), test_object.calculateMin(0, Coords::UNDEFINED));
     EXPECT_EQ(axis_default->max(), test_object.calculateMax(0, Coords::UNDEFINED));
 
     // QSPACE
-    std::unique_ptr<const IAxis> axis_qspace(test_object.convertedAxis(0, Coords::QSPACE));
+    std::unique_ptr<const Scale> axis_qspace(test_object.convertedAxis(0, Coords::QSPACE));
     EXPECT_EQ(axis_qspace->min(), test_object.calculateMin(0, Coords::QSPACE));
     EXPECT_EQ(axis_qspace->max(), test_object.calculateMax(0, Coords::QSPACE));
 
     // NBINS
-    std::unique_ptr<IAxis> axis_nbins(test_object.convertedAxis(0, Coords::NBINS));
+    std::unique_ptr<Scale> axis_nbins(test_object.convertedAxis(0, Coords::NBINS));
     EXPECT_EQ(axis_nbins->min(), test_object.calculateMin(0, Coords::NBINS));
     EXPECT_EQ(axis_nbins->max(), test_object.calculateMax(0, Coords::NBINS));
 }
@@ -75,18 +75,18 @@ void CoordSystem1DTest::checkQSpecConverter(const CoordSystem1D& test_object)
     EXPECT_EQ(test_object.calculateMax(0, Coords::QSPACE), expected_max);
 
     // DEFAULT
-    std::unique_ptr<IAxis> axis_default(test_object.convertedAxis(0, Coords::UNDEFINED));
+    std::unique_ptr<Scale> axis_default(test_object.convertedAxis(0, Coords::UNDEFINED));
     EXPECT_EQ(axis_default->min(), test_object.calculateMin(0, Coords::UNDEFINED));
     EXPECT_EQ(axis_default->max(), test_object.calculateMax(0, Coords::UNDEFINED));
 
     // QSPACE
-    std::unique_ptr<IAxis> axis_qspace(test_object.convertedAxis(0, Coords::QSPACE));
+    std::unique_ptr<Scale> axis_qspace(test_object.convertedAxis(0, Coords::QSPACE));
     EXPECT_EQ(axis_qspace->min(), test_object.calculateMin(0, Coords::QSPACE));
     EXPECT_EQ(axis_qspace->max(), test_object.calculateMax(0, Coords::QSPACE));
     EXPECT_EQ(*axis_default, *axis_qspace);
 
     // NBINS
-    std::unique_ptr<IAxis> axis_nbins(test_object.convertedAxis(0, Coords::NBINS));
+    std::unique_ptr<Scale> axis_nbins(test_object.convertedAxis(0, Coords::NBINS));
     EXPECT_EQ(axis_nbins->min(), test_object.calculateMin(0, Coords::NBINS));
     EXPECT_EQ(axis_nbins->max(), test_object.calculateMax(0, Coords::NBINS));
 }
@@ -110,7 +110,7 @@ TEST_F(CoordSystem1DTest, Exceptions)
     EXPECT_FAILED_ASSERT(converter.convertedAxis(0, Coords::MM));
     EXPECT_FAILED_ASSERT(converter.convertedAxis(1, Coords::UNDEFINED));
 
-    IAxis axis = FixedBinAxis("Angles", 100, 0.0, (2 * pi));
+    Scale axis = FixedBinAxis("Angles", 100, 0.0, (2 * pi));
     EXPECT_FAILED_ASSERT(AngularReflectometryCoords converter2(m_wavelength, axis));
 
     WavenumberReflectometryCoords converter2(m_qscan.coordinateAxis()->clone());
@@ -141,7 +141,7 @@ TEST_F(CoordSystem1DTest, Clone)
 
 TEST_F(CoordSystem1DTest, NonDefaultUnitsInInput)
 {
-    IAxis axis = DiscreteAxis("x", std::vector<double>{0.0, 0.5, 1.0});
+    Scale axis = DiscreteAxis("x", std::vector<double>{0.0, 0.5, 1.0});
 
     {
         AngularReflectometryCoords converter(m_wavelength, axis, Coords::DEGREES);
@@ -154,7 +154,7 @@ TEST_F(CoordSystem1DTest, NonDefaultUnitsInInput)
 
     auto values = axis.binCenters();
     std::for_each(values.begin(), values.end(), [this](double& value) { value = getQ(value); });
-    IAxis q_axis = DiscreteAxis("q", values);
+    Scale q_axis = DiscreteAxis("q", values);
     {
         AngularReflectometryCoords converter(m_wavelength, q_axis, Coords::QSPACE);
         auto out = converter.convertedAxis(0, Coords::RADIANS);
diff --git a/Tests/Unit/Sim/SpecularScanTest.cpp b/Tests/Unit/Sim/SpecularScanTest.cpp
index 26a92e346f4..a9e5e4ebde2 100644
--- a/Tests/Unit/Sim/SpecularScanTest.cpp
+++ b/Tests/Unit/Sim/SpecularScanTest.cpp
@@ -1,4 +1,4 @@
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Param/Distrib/Distributions.h"
 #include "Param/Distrib/ParameterSample.h"
@@ -11,16 +11,16 @@
 
 TEST(SpecularScanTest, AngularScanInit)
 {
-    auto check = [](const AlphaScan& scan, const IAxis& axis) {
+    auto check = [](const AlphaScan& scan, const Scale& axis) {
         EXPECT_EQ(axis, *scan.coordinateAxis());
         EXPECT_EQ(scan.nScan(), axis.size());
     };
 
-    const IAxis pointwise_axis = DiscreteAxis("inc_angles", std::vector<double>{0.1, 0.2, 0.3});
+    const Scale pointwise_axis = DiscreteAxis("inc_angles", std::vector<double>{0.1, 0.2, 0.3});
     AlphaScan scan(pointwise_axis);
     check(scan, pointwise_axis);
 
-    const IAxis fixed_axis = FixedBinAxis("inc_angles", 3, 0.1, 0.3);
+    const Scale fixed_axis = FixedBinAxis("inc_angles", 3, 0.1, 0.3);
     AlphaScan scan3(fixed_axis);
     check(scan3, fixed_axis);
 }
diff --git a/Tests/Unit/Sim/SpecularSimulationTest.cpp b/Tests/Unit/Sim/SpecularSimulationTest.cpp
index 814193a62ac..28dbe5bdaed 100644
--- a/Tests/Unit/Sim/SpecularSimulationTest.cpp
+++ b/Tests/Unit/Sim/SpecularSimulationTest.cpp
@@ -1,5 +1,5 @@
 #include "Sim/Simulation/SpecularSimulation.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Base/Const/Units.h"
 #include "Device/Beam/Beam.h"
diff --git a/Wrap/Swig/fromBase.i b/Wrap/Swig/fromBase.i
index fd963752416..fe89a6f0d4a 100644
--- a/Wrap/Swig/fromBase.i
+++ b/Wrap/Swig/fromBase.i
@@ -3,7 +3,7 @@
 %import(module="libBornAgainBase") "Base/Types/ICloneable.h"
 %import(module="libBornAgainBase") "Base/Types/Span.h"
 %import(module="libBornAgainBase") "Base/Vector/RotMatrix.h"
-%import(module="libBornAgainBase") "Base/Axis/IAxis.h"
+%import(module="libBornAgainBase") "Base/Axis/Scale.h"
 %import(module="libBornAgainBase") "Base/Axis/Frame.h"
 
 %template(R3) Vec3<double>;
diff --git a/Wrap/Swig/libBornAgainBase.i b/Wrap/Swig/libBornAgainBase.i
index 9893a36a3f2..904130643b6 100644
--- a/Wrap/Swig/libBornAgainBase.i
+++ b/Wrap/Swig/libBornAgainBase.i
@@ -20,7 +20,7 @@
 #include <heinz/Complex.h>
 #include "Base/Axis/Bin.h"
 #include "Base/Axis/Frame.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Base/Const/Units.h"
 #include "Base/Types/ICloneable.h"
@@ -41,7 +41,7 @@
 %include "Base/Vector/RotMatrix.h"
 
 %include "Base/Axis/Bin.h"
-%include "Base/Axis/IAxis.h"
+%include "Base/Axis/Scale.h"
 %include "Base/Axis/MakeScale.h"
 %include "Base/Axis/Frame.h"
 
diff --git a/Wrap/Swig/libBornAgainDevice.i b/Wrap/Swig/libBornAgainDevice.i
index 31f6e6329cf..b06846ba1e3 100644
--- a/Wrap/Swig/libBornAgainDevice.i
+++ b/Wrap/Swig/libBornAgainDevice.i
@@ -20,7 +20,7 @@
 
 %{
 #include "Base/Axis/Frame.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Spin/SpinMatrix.h"
 #include "Device/Beam/Beam.h"
 #include "Device/Beam/FootprintGauss.h"
diff --git a/Wrap/Swig/libBornAgainSim.i b/Wrap/Swig/libBornAgainSim.i
index 0904f9659f1..9d5c3ef4305 100644
--- a/Wrap/Swig/libBornAgainSim.i
+++ b/Wrap/Swig/libBornAgainSim.i
@@ -51,7 +51,7 @@
 %{
 #include "BAVersion.h"
 
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/Frame.h"
 
 #include "Device/Histo/SimulationResult.h"
diff --git a/auto/Wrap/libBornAgainBase.py b/auto/Wrap/libBornAgainBase.py
index d414cc94ea0..4d65eb1a26f 100644
--- a/auto/Wrap/libBornAgainBase.py
+++ b/auto/Wrap/libBornAgainBase.py
@@ -1844,121 +1844,121 @@ deg = cvar.deg
 tesla = cvar.tesla
 gauss = cvar.gauss
 
-class IAxis(object):
-    r"""Proxy of C++ IAxis class."""
+class Scale(object):
+    r"""Proxy of C++ Scale class."""
 
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
     def __init__(self, name, bins):
-        r"""__init__(IAxis self, std::string name, std::vector< Bin1D,std::allocator< Bin1D > > const & bins) -> IAxis"""
-        _libBornAgainBase.IAxis_swiginit(self, _libBornAgainBase.new_IAxis(name, bins))
+        r"""__init__(Scale self, std::string name, std::vector< Bin1D,std::allocator< Bin1D > > const & bins) -> Scale"""
+        _libBornAgainBase.Scale_swiginit(self, _libBornAgainBase.new_Scale(name, bins))
 
     def clone(self):
-        r"""clone(IAxis self) -> IAxis"""
-        return _libBornAgainBase.IAxis_clone(self)
+        r"""clone(Scale self) -> Scale"""
+        return _libBornAgainBase.Scale_clone(self)
 
     def setAxisName(self, name):
-        r"""setAxisName(IAxis self, std::string name)"""
-        return _libBornAgainBase.IAxis_setAxisName(self, name)
+        r"""setAxisName(Scale self, std::string name)"""
+        return _libBornAgainBase.Scale_setAxisName(self, name)
 
     def axisName(self):
-        r"""axisName(IAxis self) -> std::string"""
-        return _libBornAgainBase.IAxis_axisName(self)
+        r"""axisName(Scale self) -> std::string"""
+        return _libBornAgainBase.Scale_axisName(self)
 
     def size(self):
-        r"""size(IAxis self) -> size_t"""
-        return _libBornAgainBase.IAxis_size(self)
+        r"""size(Scale self) -> size_t"""
+        return _libBornAgainBase.Scale_size(self)
 
     def min(self):
-        r"""min(IAxis self) -> double"""
-        return _libBornAgainBase.IAxis_min(self)
+        r"""min(Scale self) -> double"""
+        return _libBornAgainBase.Scale_min(self)
 
     def max(self):
-        r"""max(IAxis self) -> double"""
-        return _libBornAgainBase.IAxis_max(self)
+        r"""max(Scale self) -> double"""
+        return _libBornAgainBase.Scale_max(self)
 
     def bounds(self):
-        r"""bounds(IAxis self) -> pvacuum_double_t"""
-        return _libBornAgainBase.IAxis_bounds(self)
+        r"""bounds(Scale self) -> pvacuum_double_t"""
+        return _libBornAgainBase.Scale_bounds(self)
 
     def rangeComprises(self, value):
-        r"""rangeComprises(IAxis self, double value) -> bool"""
-        return _libBornAgainBase.IAxis_rangeComprises(self, value)
+        r"""rangeComprises(Scale self, double value) -> bool"""
+        return _libBornAgainBase.Scale_rangeComprises(self, value)
 
     def span(self):
-        r"""span(IAxis self) -> double"""
-        return _libBornAgainBase.IAxis_span(self)
+        r"""span(Scale self) -> double"""
+        return _libBornAgainBase.Scale_span(self)
 
     def center(self):
-        r"""center(IAxis self) -> double"""
-        return _libBornAgainBase.IAxis_center(self)
+        r"""center(Scale self) -> double"""
+        return _libBornAgainBase.Scale_center(self)
 
     def bin(self, i):
-        r"""bin(IAxis self, size_t i) -> Bin1D"""
-        return _libBornAgainBase.IAxis_bin(self, i)
+        r"""bin(Scale self, size_t i) -> Bin1D"""
+        return _libBornAgainBase.Scale_bin(self, i)
 
     def binCenter(self, i):
-        r"""binCenter(IAxis self, size_t i) -> double"""
-        return _libBornAgainBase.IAxis_binCenter(self, i)
+        r"""binCenter(Scale self, size_t i) -> double"""
+        return _libBornAgainBase.Scale_binCenter(self, i)
 
     def bins(self):
-        r"""bins(IAxis self) -> std::vector< Bin1D,std::allocator< Bin1D > > const &"""
-        return _libBornAgainBase.IAxis_bins(self)
+        r"""bins(Scale self) -> std::vector< Bin1D,std::allocator< Bin1D > > const &"""
+        return _libBornAgainBase.Scale_bins(self)
 
     def binCenters(self):
-        r"""binCenters(IAxis self) -> vdouble1d_t"""
-        return _libBornAgainBase.IAxis_binCenters(self)
+        r"""binCenters(Scale self) -> vdouble1d_t"""
+        return _libBornAgainBase.Scale_binCenters(self)
 
     def closestIndex(self, value):
-        r"""closestIndex(IAxis self, double value) -> size_t"""
-        return _libBornAgainBase.IAxis_closestIndex(self, value)
+        r"""closestIndex(Scale self, double value) -> size_t"""
+        return _libBornAgainBase.Scale_closestIndex(self, value)
 
     def isEquidistantCoverage(self):
-        r"""isEquidistantCoverage(IAxis self) -> bool"""
-        return _libBornAgainBase.IAxis_isEquidistantCoverage(self)
+        r"""isEquidistantCoverage(Scale self) -> bool"""
+        return _libBornAgainBase.Scale_isEquidistantCoverage(self)
 
     def isDiscrete(self):
-        r"""isDiscrete(IAxis self) -> bool"""
-        return _libBornAgainBase.IAxis_isDiscrete(self)
+        r"""isDiscrete(Scale self) -> bool"""
+        return _libBornAgainBase.Scale_isDiscrete(self)
 
     def clipped(self, *args):
         r"""
-        clipped(IAxis self, double lower, double upper) -> IAxis
-        clipped(IAxis self, pvacuum_double_t bounds) -> IAxis
+        clipped(Scale self, double lower, double upper) -> Scale
+        clipped(Scale self, pvacuum_double_t bounds) -> Scale
         """
-        return _libBornAgainBase.IAxis_clipped(self, *args)
+        return _libBornAgainBase.Scale_clipped(self, *args)
 
     def __eq__(self, right):
-        r"""__eq__(IAxis self, IAxis right) -> bool"""
-        return _libBornAgainBase.IAxis___eq__(self, right)
-    __swig_destroy__ = _libBornAgainBase.delete_IAxis
+        r"""__eq__(Scale self, Scale right) -> bool"""
+        return _libBornAgainBase.Scale___eq__(self, right)
+    __swig_destroy__ = _libBornAgainBase.delete_Scale
 
-# Register IAxis in _libBornAgainBase:
-_libBornAgainBase.IAxis_swigregister(IAxis)
+# Register Scale in _libBornAgainBase:
+_libBornAgainBase.Scale_swigregister(Scale)
 
 def DiscreteAxis(name, points):
-    r"""DiscreteAxis(std::string const & name, vdouble1d_t points) -> IAxis"""
+    r"""DiscreteAxis(std::string const & name, vdouble1d_t points) -> Scale"""
     return _libBornAgainBase.DiscreteAxis(name, points)
 
 def newDiscreteAxis(name, points):
-    r"""newDiscreteAxis(std::string const & name, vdouble1d_t points) -> IAxis"""
+    r"""newDiscreteAxis(std::string const & name, vdouble1d_t points) -> Scale"""
     return _libBornAgainBase.newDiscreteAxis(name, points)
 
 def FixedBinAxis(name, nbins, start, end):
-    r"""FixedBinAxis(std::string const & name, size_t nbins, double start, double end) -> IAxis"""
+    r"""FixedBinAxis(std::string const & name, size_t nbins, double start, double end) -> Scale"""
     return _libBornAgainBase.FixedBinAxis(name, nbins, start, end)
 
 def newFixedBinAxis(name, nbins, start, end):
-    r"""newFixedBinAxis(std::string const & name, size_t nbins, double start, double end) -> IAxis"""
+    r"""newFixedBinAxis(std::string const & name, size_t nbins, double start, double end) -> Scale"""
     return _libBornAgainBase.newFixedBinAxis(name, nbins, start, end)
 
 def sharedFixedBinAxis(name, nbins, start, end):
-    r"""sharedFixedBinAxis(std::string const & name, size_t nbins, double start, double end) -> std::shared_ptr< IAxis >"""
+    r"""sharedFixedBinAxis(std::string const & name, size_t nbins, double start, double end) -> std::shared_ptr< Scale >"""
     return _libBornAgainBase.sharedFixedBinAxis(name, nbins, start, end)
 
 def uniqueFixedBinAxis(name, nbins, start, end):
-    r"""uniqueFixedBinAxis(std::string const & name, size_t nbins, double start, double end) -> std::unique_ptr< IAxis >"""
+    r"""uniqueFixedBinAxis(std::string const & name, size_t nbins, double start, double end) -> std::unique_ptr< Scale >"""
     return _libBornAgainBase.uniqueFixedBinAxis(name, nbins, start, end)
 class Frame(ICloneable):
     r"""Proxy of C++ Frame class."""
@@ -1967,7 +1967,7 @@ class Frame(ICloneable):
     __repr__ = _swig_repr
 
     def __init__(self, axes):
-        r"""__init__(Frame self, std::vector< IAxis const *,std::allocator< IAxis const * > > && axes) -> Frame"""
+        r"""__init__(Frame self, std::vector< Scale const *,std::allocator< Scale const * > > && axes) -> Frame"""
         _libBornAgainBase.Frame_swiginit(self, _libBornAgainBase.new_Frame(axes))
     __swig_destroy__ = _libBornAgainBase.delete_Frame
 
@@ -1988,15 +1988,15 @@ class Frame(ICloneable):
         return _libBornAgainBase.Frame_projectedSize(self, k_axis)
 
     def axis(self, k_axis):
-        r"""axis(Frame self, size_t k_axis) -> IAxis"""
+        r"""axis(Frame self, size_t k_axis) -> Scale"""
         return _libBornAgainBase.Frame_axis(self, k_axis)
 
     def xAxis(self):
-        r"""xAxis(Frame self) -> IAxis"""
+        r"""xAxis(Frame self) -> Scale"""
         return _libBornAgainBase.Frame_xAxis(self)
 
     def yAxis(self):
-        r"""yAxis(Frame self) -> IAxis"""
+        r"""yAxis(Frame self) -> Scale"""
         return _libBornAgainBase.Frame_yAxis(self)
 
     def projectedCoord(self, i_flat, k_axis):
diff --git a/auto/Wrap/libBornAgainBase_wrap.cpp b/auto/Wrap/libBornAgainBase_wrap.cpp
index eeb096539b5..b8e82850c77 100644
--- a/auto/Wrap/libBornAgainBase_wrap.cpp
+++ b/auto/Wrap/libBornAgainBase_wrap.cpp
@@ -3388,9 +3388,9 @@ namespace Swig {
 
 #define SWIGTYPE_p_Bin1D swig_types[0]
 #define SWIGTYPE_p_Frame swig_types[1]
-#define SWIGTYPE_p_IAxis swig_types[2]
-#define SWIGTYPE_p_ICloneable swig_types[3]
-#define SWIGTYPE_p_Rotation3DT_double_t swig_types[4]
+#define SWIGTYPE_p_ICloneable swig_types[2]
+#define SWIGTYPE_p_Rotation3DT_double_t swig_types[3]
+#define SWIGTYPE_p_Scale swig_types[4]
 #define SWIGTYPE_p_Span swig_types[5]
 #define SWIGTYPE_p_ThreadInfo swig_types[6]
 #define SWIGTYPE_p_Vec3T_double_t swig_types[7]
@@ -3424,10 +3424,10 @@ namespace Swig {
 #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[35]
 #define SWIGTYPE_p_std__optionalT_Bin1D_t swig_types[36]
 #define SWIGTYPE_p_std__pairT_double_double_t swig_types[37]
-#define SWIGTYPE_p_std__shared_ptrT_IAxis_t swig_types[38]
-#define SWIGTYPE_p_std__unique_ptrT_IAxis_t swig_types[39]
+#define SWIGTYPE_p_std__shared_ptrT_Scale_t swig_types[38]
+#define SWIGTYPE_p_std__unique_ptrT_Scale_t swig_types[39]
 #define SWIGTYPE_p_std__vectorT_Bin1D_std__allocatorT_Bin1D_t_t swig_types[40]
-#define SWIGTYPE_p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t swig_types[41]
+#define SWIGTYPE_p_std__vectorT_Scale_const_p_std__allocatorT_Scale_const_p_t_t swig_types[41]
 #define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[42]
 #define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[43]
 #define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[44]
@@ -6984,7 +6984,7 @@ SWIGINTERN void std_vector_Sl_std_pair_Sl_double_Sc_double_Sg__Sg__insert__SWIG_
 #include <heinz/Complex.h>
 #include "Base/Axis/Bin.h"
 #include "Base/Axis/Frame.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/MakeScale.h"
 #include "Base/Const/Units.h"
 #include "Base/Types/ICloneable.h"
@@ -25291,83 +25291,83 @@ SWIGINTERN PyObject *Bin1D_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *_wrap_new_IAxis(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_Scale(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
   std::string arg1 ;
   std::vector< Bin1D,std::allocator< Bin1D > > *arg2 = 0 ;
   void *argp2 = 0 ;
   int res2 = 0 ;
   PyObject *swig_obj[2] ;
-  IAxis *result = 0 ;
+  Scale *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_IAxis", 2, 2, swig_obj)) SWIG_fail;
+  if (!SWIG_Python_UnpackTuple(args, "new_Scale", 2, 2, swig_obj)) SWIG_fail;
   {
     std::string *ptr = (std::string *)0;
     int res = SWIG_AsPtr_std_string(swig_obj[0], &ptr);
     if (!SWIG_IsOK(res) || !ptr) {
-      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_IAxis" "', argument " "1"" of type '" "std::string""'"); 
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_Scale" "', argument " "1"" of type '" "std::string""'"); 
     }
     arg1 = *ptr;
     if (SWIG_IsNewObj(res)) delete ptr;
   }
   res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_std__vectorT_Bin1D_std__allocatorT_Bin1D_t_t,  0  | 0);
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_IAxis" "', argument " "2"" of type '" "std::vector< Bin1D,std::allocator< Bin1D > > const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_Scale" "', argument " "2"" of type '" "std::vector< Bin1D,std::allocator< Bin1D > > const &""'"); 
   }
   if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IAxis" "', argument " "2"" of type '" "std::vector< Bin1D,std::allocator< Bin1D > > const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Scale" "', argument " "2"" of type '" "std::vector< Bin1D,std::allocator< Bin1D > > const &""'"); 
   }
   arg2 = reinterpret_cast< std::vector< Bin1D,std::allocator< Bin1D > > * >(argp2);
-  result = (IAxis *)new IAxis(arg1,(std::vector< Bin1D,std::allocator< Bin1D > > const &)*arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAxis, SWIG_POINTER_NEW |  0 );
+  result = (Scale *)new Scale(arg1,(std::vector< Bin1D,std::allocator< Bin1D > > const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Scale, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IAxis_clone(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_Scale_clone(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IAxis *arg1 = (IAxis *) 0 ;
+  Scale *arg1 = (Scale *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  IAxis *result = 0 ;
+  Scale *result = 0 ;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Scale, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_clone" "', argument " "1"" of type '" "IAxis const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Scale_clone" "', argument " "1"" of type '" "Scale const *""'"); 
   }
-  arg1 = reinterpret_cast< IAxis * >(argp1);
-  result = (IAxis *)((IAxis const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAxis, 0 |  0 );
+  arg1 = reinterpret_cast< Scale * >(argp1);
+  result = (Scale *)((Scale const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Scale, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IAxis_setAxisName(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_Scale_setAxisName(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IAxis *arg1 = (IAxis *) 0 ;
+  Scale *arg1 = (Scale *) 0 ;
   std::string arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[2] ;
   
-  if (!SWIG_Python_UnpackTuple(args, "IAxis_setAxisName", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "Scale_setAxisName", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Scale, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_setAxisName" "', argument " "1"" of type '" "IAxis *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Scale_setAxisName" "', argument " "1"" of type '" "Scale *""'"); 
   }
-  arg1 = reinterpret_cast< IAxis * >(argp1);
+  arg1 = reinterpret_cast< Scale * >(argp1);
   {
     std::string *ptr = (std::string *)0;
     int res = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
     if (!SWIG_IsOK(res) || !ptr) {
-      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "IAxis_setAxisName" "', argument " "2"" of type '" "std::string""'"); 
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Scale_setAxisName" "', argument " "2"" of type '" "std::string""'"); 
     }
     arg2 = *ptr;
     if (SWIG_IsNewObj(res)) delete ptr;
@@ -25380,9 +25380,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IAxis_axisName(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_Scale_axisName(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IAxis *arg1 = (IAxis *) 0 ;
+  Scale *arg1 = (Scale *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -25390,12 +25390,12 @@ SWIGINTERN PyObject *_wrap_IAxis_axisName(PyObject *self, PyObject *args) {
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Scale, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_axisName" "', argument " "1"" of type '" "IAxis const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Scale_axisName" "', argument " "1"" of type '" "Scale const *""'"); 
   }
-  arg1 = reinterpret_cast< IAxis * >(argp1);
-  result = ((IAxis const *)arg1)->axisName();
+  arg1 = reinterpret_cast< Scale * >(argp1);
+  result = ((Scale const *)arg1)->axisName();
   resultobj = SWIG_From_std_string(static_cast< std::string >(result));
   return resultobj;
 fail:
@@ -25403,9 +25403,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IAxis_size(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_Scale_size(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IAxis *arg1 = (IAxis *) 0 ;
+  Scale *arg1 = (Scale *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -25413,12 +25413,12 @@ SWIGINTERN PyObject *_wrap_IAxis_size(PyObject *self, PyObject *args) {
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Scale, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_size" "', argument " "1"" of type '" "IAxis const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Scale_size" "', argument " "1"" of type '" "Scale const *""'"); 
   }
-  arg1 = reinterpret_cast< IAxis * >(argp1);
-  result = ((IAxis const *)arg1)->size();
+  arg1 = reinterpret_cast< Scale * >(argp1);
+  result = ((Scale const *)arg1)->size();
   resultobj = SWIG_From_size_t(static_cast< size_t >(result));
   return resultobj;
 fail:
@@ -25426,9 +25426,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IAxis_min(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_Scale_min(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IAxis *arg1 = (IAxis *) 0 ;
+  Scale *arg1 = (Scale *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -25436,12 +25436,12 @@ SWIGINTERN PyObject *_wrap_IAxis_min(PyObject *self, PyObject *args) {
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Scale, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_min" "', argument " "1"" of type '" "IAxis const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Scale_min" "', argument " "1"" of type '" "Scale const *""'"); 
   }
-  arg1 = reinterpret_cast< IAxis * >(argp1);
-  result = (double)((IAxis const *)arg1)->min();
+  arg1 = reinterpret_cast< Scale * >(argp1);
+  result = (double)((Scale const *)arg1)->min();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -25449,9 +25449,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IAxis_max(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_Scale_max(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IAxis *arg1 = (IAxis *) 0 ;
+  Scale *arg1 = (Scale *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -25459,12 +25459,12 @@ SWIGINTERN PyObject *_wrap_IAxis_max(PyObject *self, PyObject *args) {
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Scale, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_max" "', argument " "1"" of type '" "IAxis const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Scale_max" "', argument " "1"" of type '" "Scale const *""'"); 
   }
-  arg1 = reinterpret_cast< IAxis * >(argp1);
-  result = (double)((IAxis const *)arg1)->max();
+  arg1 = reinterpret_cast< Scale * >(argp1);
+  result = (double)((Scale const *)arg1)->max();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -25472,9 +25472,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IAxis_bounds(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_Scale_bounds(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IAxis *arg1 = (IAxis *) 0 ;
+  Scale *arg1 = (Scale *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -25482,12 +25482,12 @@ SWIGINTERN PyObject *_wrap_IAxis_bounds(PyObject *self, PyObject *args) {
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Scale, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_bounds" "', argument " "1"" of type '" "IAxis const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Scale_bounds" "', argument " "1"" of type '" "Scale const *""'"); 
   }
-  arg1 = reinterpret_cast< IAxis * >(argp1);
-  result = ((IAxis const *)arg1)->bounds();
+  arg1 = reinterpret_cast< Scale * >(argp1);
+  result = ((Scale const *)arg1)->bounds();
   resultobj = swig::from(static_cast< std::pair< double,double > >(result));
   return resultobj;
 fail:
@@ -25495,9 +25495,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IAxis_rangeComprises(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_Scale_rangeComprises(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IAxis *arg1 = (IAxis *) 0 ;
+  Scale *arg1 = (Scale *) 0 ;
   double arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
@@ -25506,18 +25506,18 @@ SWIGINTERN PyObject *_wrap_IAxis_rangeComprises(PyObject *self, PyObject *args)
   PyObject *swig_obj[2] ;
   bool result;
   
-  if (!SWIG_Python_UnpackTuple(args, "IAxis_rangeComprises", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "Scale_rangeComprises", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Scale, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_rangeComprises" "', argument " "1"" of type '" "IAxis const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Scale_rangeComprises" "', argument " "1"" of type '" "Scale const *""'"); 
   }
-  arg1 = reinterpret_cast< IAxis * >(argp1);
+  arg1 = reinterpret_cast< Scale * >(argp1);
   ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IAxis_rangeComprises" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Scale_rangeComprises" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
-  result = (bool)((IAxis const *)arg1)->rangeComprises(arg2);
+  result = (bool)((Scale const *)arg1)->rangeComprises(arg2);
   resultobj = SWIG_From_bool(static_cast< bool >(result));
   return resultobj;
 fail:
@@ -25525,9 +25525,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IAxis_span(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_Scale_span(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IAxis *arg1 = (IAxis *) 0 ;
+  Scale *arg1 = (Scale *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -25535,12 +25535,12 @@ SWIGINTERN PyObject *_wrap_IAxis_span(PyObject *self, PyObject *args) {
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Scale, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_span" "', argument " "1"" of type '" "IAxis const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Scale_span" "', argument " "1"" of type '" "Scale const *""'"); 
   }
-  arg1 = reinterpret_cast< IAxis * >(argp1);
-  result = (double)((IAxis const *)arg1)->span();
+  arg1 = reinterpret_cast< Scale * >(argp1);
+  result = (double)((Scale const *)arg1)->span();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -25548,9 +25548,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IAxis_center(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_Scale_center(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IAxis *arg1 = (IAxis *) 0 ;
+  Scale *arg1 = (Scale *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -25558,12 +25558,12 @@ SWIGINTERN PyObject *_wrap_IAxis_center(PyObject *self, PyObject *args) {
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Scale, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_center" "', argument " "1"" of type '" "IAxis const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Scale_center" "', argument " "1"" of type '" "Scale const *""'"); 
   }
-  arg1 = reinterpret_cast< IAxis * >(argp1);
-  result = (double)((IAxis const *)arg1)->center();
+  arg1 = reinterpret_cast< Scale * >(argp1);
+  result = (double)((Scale const *)arg1)->center();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -25571,9 +25571,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IAxis_bin(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_Scale_bin(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IAxis *arg1 = (IAxis *) 0 ;
+  Scale *arg1 = (Scale *) 0 ;
   size_t arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
@@ -25582,18 +25582,18 @@ SWIGINTERN PyObject *_wrap_IAxis_bin(PyObject *self, PyObject *args) {
   PyObject *swig_obj[2] ;
   Bin1D *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "IAxis_bin", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "Scale_bin", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Scale, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_bin" "', argument " "1"" of type '" "IAxis const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Scale_bin" "', argument " "1"" of type '" "Scale const *""'"); 
   }
-  arg1 = reinterpret_cast< IAxis * >(argp1);
+  arg1 = reinterpret_cast< Scale * >(argp1);
   ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IAxis_bin" "', argument " "2"" of type '" "size_t""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Scale_bin" "', argument " "2"" of type '" "size_t""'");
   } 
   arg2 = static_cast< size_t >(val2);
-  result = (Bin1D *) &((IAxis const *)arg1)->bin(arg2);
+  result = (Bin1D *) &((Scale const *)arg1)->bin(arg2);
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Bin1D, 0 |  0 );
   return resultobj;
 fail:
@@ -25601,9 +25601,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IAxis_binCenter(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_Scale_binCenter(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IAxis *arg1 = (IAxis *) 0 ;
+  Scale *arg1 = (Scale *) 0 ;
   size_t arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
@@ -25612,18 +25612,18 @@ SWIGINTERN PyObject *_wrap_IAxis_binCenter(PyObject *self, PyObject *args) {
   PyObject *swig_obj[2] ;
   double result;
   
-  if (!SWIG_Python_UnpackTuple(args, "IAxis_binCenter", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "Scale_binCenter", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Scale, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_binCenter" "', argument " "1"" of type '" "IAxis const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Scale_binCenter" "', argument " "1"" of type '" "Scale const *""'"); 
   }
-  arg1 = reinterpret_cast< IAxis * >(argp1);
+  arg1 = reinterpret_cast< Scale * >(argp1);
   ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IAxis_binCenter" "', argument " "2"" of type '" "size_t""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Scale_binCenter" "', argument " "2"" of type '" "size_t""'");
   } 
   arg2 = static_cast< size_t >(val2);
-  result = (double)((IAxis const *)arg1)->binCenter(arg2);
+  result = (double)((Scale const *)arg1)->binCenter(arg2);
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -25631,9 +25631,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IAxis_bins(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_Scale_bins(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IAxis *arg1 = (IAxis *) 0 ;
+  Scale *arg1 = (Scale *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -25641,12 +25641,12 @@ SWIGINTERN PyObject *_wrap_IAxis_bins(PyObject *self, PyObject *args) {
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Scale, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_bins" "', argument " "1"" of type '" "IAxis const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Scale_bins" "', argument " "1"" of type '" "Scale const *""'"); 
   }
-  arg1 = reinterpret_cast< IAxis * >(argp1);
-  result = (std::vector< Bin1D,std::allocator< Bin1D > > *) &((IAxis const *)arg1)->bins();
+  arg1 = reinterpret_cast< Scale * >(argp1);
+  result = (std::vector< Bin1D,std::allocator< Bin1D > > *) &((Scale const *)arg1)->bins();
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_Bin1D_std__allocatorT_Bin1D_t_t, 0 |  0 );
   return resultobj;
 fail:
@@ -25654,9 +25654,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IAxis_binCenters(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_Scale_binCenters(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IAxis *arg1 = (IAxis *) 0 ;
+  Scale *arg1 = (Scale *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -25664,12 +25664,12 @@ SWIGINTERN PyObject *_wrap_IAxis_binCenters(PyObject *self, PyObject *args) {
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Scale, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_binCenters" "', argument " "1"" of type '" "IAxis const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Scale_binCenters" "', argument " "1"" of type '" "Scale const *""'"); 
   }
-  arg1 = reinterpret_cast< IAxis * >(argp1);
-  result = ((IAxis const *)arg1)->binCenters();
+  arg1 = reinterpret_cast< Scale * >(argp1);
+  result = ((Scale const *)arg1)->binCenters();
   resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
   return resultobj;
 fail:
@@ -25677,9 +25677,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IAxis_closestIndex(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_Scale_closestIndex(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IAxis *arg1 = (IAxis *) 0 ;
+  Scale *arg1 = (Scale *) 0 ;
   double arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
@@ -25688,18 +25688,18 @@ SWIGINTERN PyObject *_wrap_IAxis_closestIndex(PyObject *self, PyObject *args) {
   PyObject *swig_obj[2] ;
   size_t result;
   
-  if (!SWIG_Python_UnpackTuple(args, "IAxis_closestIndex", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "Scale_closestIndex", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Scale, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_closestIndex" "', argument " "1"" of type '" "IAxis const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Scale_closestIndex" "', argument " "1"" of type '" "Scale const *""'"); 
   }
-  arg1 = reinterpret_cast< IAxis * >(argp1);
+  arg1 = reinterpret_cast< Scale * >(argp1);
   ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IAxis_closestIndex" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Scale_closestIndex" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
-  result = ((IAxis const *)arg1)->closestIndex(arg2);
+  result = ((Scale const *)arg1)->closestIndex(arg2);
   resultobj = SWIG_From_size_t(static_cast< size_t >(result));
   return resultobj;
 fail:
@@ -25707,9 +25707,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IAxis_isEquidistantCoverage(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_Scale_isEquidistantCoverage(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IAxis *arg1 = (IAxis *) 0 ;
+  Scale *arg1 = (Scale *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -25717,12 +25717,12 @@ SWIGINTERN PyObject *_wrap_IAxis_isEquidistantCoverage(PyObject *self, PyObject
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Scale, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_isEquidistantCoverage" "', argument " "1"" of type '" "IAxis const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Scale_isEquidistantCoverage" "', argument " "1"" of type '" "Scale const *""'"); 
   }
-  arg1 = reinterpret_cast< IAxis * >(argp1);
-  result = (bool)((IAxis const *)arg1)->isEquidistantCoverage();
+  arg1 = reinterpret_cast< Scale * >(argp1);
+  result = (bool)((Scale const *)arg1)->isEquidistantCoverage();
   resultobj = SWIG_From_bool(static_cast< bool >(result));
   return resultobj;
 fail:
@@ -25730,9 +25730,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IAxis_isDiscrete(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_Scale_isDiscrete(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IAxis *arg1 = (IAxis *) 0 ;
+  Scale *arg1 = (Scale *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -25740,12 +25740,12 @@ SWIGINTERN PyObject *_wrap_IAxis_isDiscrete(PyObject *self, PyObject *args) {
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Scale, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_isDiscrete" "', argument " "1"" of type '" "IAxis const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Scale_isDiscrete" "', argument " "1"" of type '" "Scale const *""'"); 
   }
-  arg1 = reinterpret_cast< IAxis * >(argp1);
-  result = (bool)((IAxis const *)arg1)->isDiscrete();
+  arg1 = reinterpret_cast< Scale * >(argp1);
+  result = (bool)((Scale const *)arg1)->isDiscrete();
   resultobj = SWIG_From_bool(static_cast< bool >(result));
   return resultobj;
 fail:
@@ -25753,9 +25753,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IAxis_clipped__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_Scale_clipped__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  IAxis *arg1 = (IAxis *) 0 ;
+  Scale *arg1 = (Scale *) 0 ;
   double arg2 ;
   double arg3 ;
   void *argp1 = 0 ;
@@ -25764,88 +25764,88 @@ SWIGINTERN PyObject *_wrap_IAxis_clipped__SWIG_0(PyObject *self, Py_ssize_t nobj
   int ecode2 = 0 ;
   double val3 ;
   int ecode3 = 0 ;
-  SwigValueWrapper< IAxis > result;
+  SwigValueWrapper< Scale > result;
   
   if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Scale, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_clipped" "', argument " "1"" of type '" "IAxis const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Scale_clipped" "', argument " "1"" of type '" "Scale const *""'"); 
   }
-  arg1 = reinterpret_cast< IAxis * >(argp1);
+  arg1 = reinterpret_cast< Scale * >(argp1);
   ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IAxis_clipped" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Scale_clipped" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
   ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
   if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IAxis_clipped" "', argument " "3"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Scale_clipped" "', argument " "3"" of type '" "double""'");
   } 
   arg3 = static_cast< double >(val3);
-  result = ((IAxis const *)arg1)->clipped(arg2,arg3);
-  resultobj = SWIG_NewPointerObj((new IAxis(result)), SWIGTYPE_p_IAxis, SWIG_POINTER_OWN |  0 );
+  result = ((Scale const *)arg1)->clipped(arg2,arg3);
+  resultobj = SWIG_NewPointerObj((new Scale(result)), SWIGTYPE_p_Scale, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IAxis_clipped__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_Scale_clipped__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  IAxis *arg1 = (IAxis *) 0 ;
+  Scale *arg1 = (Scale *) 0 ;
   std::pair< double,double > arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  SwigValueWrapper< IAxis > result;
+  SwigValueWrapper< Scale > result;
   
   if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Scale, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_clipped" "', argument " "1"" of type '" "IAxis const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Scale_clipped" "', argument " "1"" of type '" "Scale const *""'"); 
   }
-  arg1 = reinterpret_cast< IAxis * >(argp1);
+  arg1 = reinterpret_cast< Scale * >(argp1);
   {
     std::pair< double,double > *ptr = (std::pair< double,double > *)0;
     int res = swig::asptr(swig_obj[1], &ptr);
     if (!SWIG_IsOK(res) || !ptr) {
-      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "IAxis_clipped" "', argument " "2"" of type '" "std::pair< double,double >""'"); 
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Scale_clipped" "', argument " "2"" of type '" "std::pair< double,double >""'"); 
     }
     arg2 = *ptr;
     if (SWIG_IsNewObj(res)) delete ptr;
   }
-  result = ((IAxis const *)arg1)->clipped(arg2);
-  resultobj = SWIG_NewPointerObj((new IAxis(result)), SWIGTYPE_p_IAxis, SWIG_POINTER_OWN |  0 );
+  result = ((Scale const *)arg1)->clipped(arg2);
+  resultobj = SWIG_NewPointerObj((new Scale(result)), SWIGTYPE_p_Scale, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_IAxis_clipped(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_Scale_clipped(PyObject *self, PyObject *args) {
   Py_ssize_t argc;
   PyObject *argv[4] = {
     0
   };
   
-  if (!(argc = SWIG_Python_UnpackTuple(args, "IAxis_clipped", 0, 3, argv))) SWIG_fail;
+  if (!(argc = SWIG_Python_UnpackTuple(args, "Scale_clipped", 0, 3, argv))) SWIG_fail;
   --argc;
   if (argc == 2) {
     int _v = 0;
     void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IAxis, 0);
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Scale, 0);
     _v = SWIG_CheckState(res);
     if (_v) {
       int res = swig::asptr(argv[1], (std::pair< double,double >**)(0));
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_IAxis_clipped__SWIG_1(self, argc, argv);
+        return _wrap_Scale_clipped__SWIG_1(self, argc, argv);
       }
     }
   }
   if (argc == 3) {
     int _v = 0;
     void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IAxis, 0);
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Scale, 0);
     _v = SWIG_CheckState(res);
     if (_v) {
       {
@@ -25858,25 +25858,25 @@ SWIGINTERN PyObject *_wrap_IAxis_clipped(PyObject *self, PyObject *args) {
           _v = SWIG_CheckState(res);
         }
         if (_v) {
-          return _wrap_IAxis_clipped__SWIG_0(self, argc, argv);
+          return _wrap_Scale_clipped__SWIG_0(self, argc, argv);
         }
       }
     }
   }
   
 fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'IAxis_clipped'.\n"
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'Scale_clipped'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    IAxis::clipped(double,double) const\n"
-    "    IAxis::clipped(std::pair< double,double >) const\n");
+    "    Scale::clipped(double,double) const\n"
+    "    Scale::clipped(std::pair< double,double >) const\n");
   return 0;
 }
 
 
-SWIGINTERN PyObject *_wrap_IAxis___eq__(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_Scale___eq__(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IAxis *arg1 = (IAxis *) 0 ;
-  IAxis *arg2 = 0 ;
+  Scale *arg1 = (Scale *) 0 ;
+  Scale *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   void *argp2 = 0 ;
@@ -25884,21 +25884,21 @@ SWIGINTERN PyObject *_wrap_IAxis___eq__(PyObject *self, PyObject *args) {
   PyObject *swig_obj[2] ;
   bool result;
   
-  if (!SWIG_Python_UnpackTuple(args, "IAxis___eq__", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "Scale___eq__", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Scale, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis___eq__" "', argument " "1"" of type '" "IAxis const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Scale___eq__" "', argument " "1"" of type '" "Scale const *""'"); 
   }
-  arg1 = reinterpret_cast< IAxis * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_IAxis,  0  | 0);
+  arg1 = reinterpret_cast< Scale * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Scale,  0  | 0);
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IAxis___eq__" "', argument " "2"" of type '" "IAxis const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Scale___eq__" "', argument " "2"" of type '" "Scale const &""'"); 
   }
   if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IAxis___eq__" "', argument " "2"" of type '" "IAxis const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Scale___eq__" "', argument " "2"" of type '" "Scale const &""'"); 
   }
-  arg2 = reinterpret_cast< IAxis * >(argp2);
-  result = (bool)((IAxis const *)arg1)->operator ==((IAxis const &)*arg2);
+  arg2 = reinterpret_cast< Scale * >(argp2);
+  result = (bool)((Scale const *)arg1)->operator ==((Scale const &)*arg2);
   resultobj = SWIG_From_bool(static_cast< bool >(result));
   return resultobj;
 fail:
@@ -25908,20 +25908,20 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_IAxis(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_Scale(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  IAxis *arg1 = (IAxis *) 0 ;
+  Scale *arg1 = (Scale *) 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_IAxis, SWIG_POINTER_DISOWN |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Scale, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IAxis" "', argument " "1"" of type '" "IAxis *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Scale" "', argument " "1"" of type '" "Scale *""'"); 
   }
-  arg1 = reinterpret_cast< IAxis * >(argp1);
+  arg1 = reinterpret_cast< Scale * >(argp1);
   delete arg1;
   resultobj = SWIG_Py_Void();
   return resultobj;
@@ -25930,14 +25930,14 @@ fail:
 }
 
 
-SWIGINTERN PyObject *IAxis_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *Scale_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_IAxis, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_Scale, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *IAxis_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *Scale_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   return SWIG_Python_InitShadowInstance(args);
 }
 
@@ -25948,7 +25948,7 @@ SWIGINTERN PyObject *_wrap_DiscreteAxis(PyObject *self, PyObject *args) {
   int res1 = SWIG_OLDOBJ ;
   int res2 = SWIG_OLDOBJ ;
   PyObject *swig_obj[2] ;
-  SwigValueWrapper< IAxis > result;
+  SwigValueWrapper< Scale > result;
   
   if (!SWIG_Python_UnpackTuple(args, "DiscreteAxis", 2, 2, swig_obj)) SWIG_fail;
   {
@@ -25974,7 +25974,7 @@ SWIGINTERN PyObject *_wrap_DiscreteAxis(PyObject *self, PyObject *args) {
     arg2 = ptr;
   }
   result = DiscreteAxis((std::string const &)*arg1,(std::vector< double,std::allocator< double > > const &)*arg2);
-  resultobj = SWIG_NewPointerObj((new IAxis(result)), SWIGTYPE_p_IAxis, SWIG_POINTER_OWN |  0 );
+  resultobj = SWIG_NewPointerObj((new Scale(result)), SWIGTYPE_p_Scale, SWIG_POINTER_OWN |  0 );
   if (SWIG_IsNewObj(res1)) delete arg1;
   if (SWIG_IsNewObj(res2)) delete arg2;
   return resultobj;
@@ -25992,7 +25992,7 @@ SWIGINTERN PyObject *_wrap_newDiscreteAxis(PyObject *self, PyObject *args) {
   int res1 = SWIG_OLDOBJ ;
   int res2 = SWIG_OLDOBJ ;
   PyObject *swig_obj[2] ;
-  IAxis *result = 0 ;
+  Scale *result = 0 ;
   
   if (!SWIG_Python_UnpackTuple(args, "newDiscreteAxis", 2, 2, swig_obj)) SWIG_fail;
   {
@@ -26017,8 +26017,8 @@ SWIGINTERN PyObject *_wrap_newDiscreteAxis(PyObject *self, PyObject *args) {
     }
     arg2 = ptr;
   }
-  result = (IAxis *)newDiscreteAxis((std::string const &)*arg1,(std::vector< double,std::allocator< double > > const &)*arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAxis, 0 |  0 );
+  result = (Scale *)newDiscreteAxis((std::string const &)*arg1,(std::vector< double,std::allocator< double > > const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Scale, 0 |  0 );
   if (SWIG_IsNewObj(res1)) delete arg1;
   if (SWIG_IsNewObj(res2)) delete arg2;
   return resultobj;
@@ -26043,7 +26043,7 @@ SWIGINTERN PyObject *_wrap_FixedBinAxis(PyObject *self, PyObject *args) {
   double val4 ;
   int ecode4 = 0 ;
   PyObject *swig_obj[4] ;
-  SwigValueWrapper< IAxis > result;
+  SwigValueWrapper< Scale > result;
   
   if (!SWIG_Python_UnpackTuple(args, "FixedBinAxis", 4, 4, swig_obj)) SWIG_fail;
   {
@@ -26073,7 +26073,7 @@ SWIGINTERN PyObject *_wrap_FixedBinAxis(PyObject *self, PyObject *args) {
   } 
   arg4 = static_cast< double >(val4);
   result = FixedBinAxis((std::string const &)*arg1,SWIG_STD_MOVE(arg2),arg3,arg4);
-  resultobj = SWIG_NewPointerObj((new IAxis(result)), SWIGTYPE_p_IAxis, SWIG_POINTER_OWN |  0 );
+  resultobj = SWIG_NewPointerObj((new Scale(result)), SWIGTYPE_p_Scale, SWIG_POINTER_OWN |  0 );
   if (SWIG_IsNewObj(res1)) delete arg1;
   return resultobj;
 fail:
@@ -26096,7 +26096,7 @@ SWIGINTERN PyObject *_wrap_newFixedBinAxis(PyObject *self, PyObject *args) {
   double val4 ;
   int ecode4 = 0 ;
   PyObject *swig_obj[4] ;
-  IAxis *result = 0 ;
+  Scale *result = 0 ;
   
   if (!SWIG_Python_UnpackTuple(args, "newFixedBinAxis", 4, 4, swig_obj)) SWIG_fail;
   {
@@ -26125,8 +26125,8 @@ SWIGINTERN PyObject *_wrap_newFixedBinAxis(PyObject *self, PyObject *args) {
     SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "newFixedBinAxis" "', argument " "4"" of type '" "double""'");
   } 
   arg4 = static_cast< double >(val4);
-  result = (IAxis *)newFixedBinAxis((std::string const &)*arg1,SWIG_STD_MOVE(arg2),arg3,arg4);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAxis, 0 |  0 );
+  result = (Scale *)newFixedBinAxis((std::string const &)*arg1,SWIG_STD_MOVE(arg2),arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Scale, 0 |  0 );
   if (SWIG_IsNewObj(res1)) delete arg1;
   return resultobj;
 fail:
@@ -26149,7 +26149,7 @@ SWIGINTERN PyObject *_wrap_sharedFixedBinAxis(PyObject *self, PyObject *args) {
   double val4 ;
   int ecode4 = 0 ;
   PyObject *swig_obj[4] ;
-  SwigValueWrapper< std::shared_ptr< IAxis > > result;
+  SwigValueWrapper< std::shared_ptr< Scale > > result;
   
   if (!SWIG_Python_UnpackTuple(args, "sharedFixedBinAxis", 4, 4, swig_obj)) SWIG_fail;
   {
@@ -26179,7 +26179,7 @@ SWIGINTERN PyObject *_wrap_sharedFixedBinAxis(PyObject *self, PyObject *args) {
   } 
   arg4 = static_cast< double >(val4);
   result = sharedFixedBinAxis((std::string const &)*arg1,SWIG_STD_MOVE(arg2),arg3,arg4);
-  resultobj = SWIG_NewPointerObj((new std::shared_ptr< IAxis >(result)), SWIGTYPE_p_std__shared_ptrT_IAxis_t, SWIG_POINTER_OWN |  0 );
+  resultobj = SWIG_NewPointerObj((new std::shared_ptr< Scale >(result)), SWIGTYPE_p_std__shared_ptrT_Scale_t, SWIG_POINTER_OWN |  0 );
   if (SWIG_IsNewObj(res1)) delete arg1;
   return resultobj;
 fail:
@@ -26202,7 +26202,7 @@ SWIGINTERN PyObject *_wrap_uniqueFixedBinAxis(PyObject *self, PyObject *args) {
   double val4 ;
   int ecode4 = 0 ;
   PyObject *swig_obj[4] ;
-  SwigValueWrapper< std::unique_ptr< IAxis > > result;
+  SwigValueWrapper< std::unique_ptr< Scale > > result;
   
   if (!SWIG_Python_UnpackTuple(args, "uniqueFixedBinAxis", 4, 4, swig_obj)) SWIG_fail;
   {
@@ -26232,7 +26232,7 @@ SWIGINTERN PyObject *_wrap_uniqueFixedBinAxis(PyObject *self, PyObject *args) {
   } 
   arg4 = static_cast< double >(val4);
   result = uniqueFixedBinAxis((std::string const &)*arg1,SWIG_STD_MOVE(arg2),arg3,arg4);
-  resultobj = SWIG_NewPointerObj((new std::unique_ptr< IAxis >(result)), SWIGTYPE_p_std__unique_ptrT_IAxis_t, SWIG_POINTER_OWN |  0 );
+  resultobj = SWIG_NewPointerObj((new std::unique_ptr< Scale >(result)), SWIGTYPE_p_std__unique_ptrT_Scale_t, SWIG_POINTER_OWN |  0 );
   if (SWIG_IsNewObj(res1)) delete arg1;
   return resultobj;
 fail:
@@ -26243,29 +26243,29 @@ fail:
 
 SWIGINTERN PyObject *_wrap_new_Frame(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  std::vector< IAxis const *,std::allocator< IAxis const * > > *arg1 = 0 ;
+  std::vector< Scale const *,std::allocator< Scale const * > > *arg1 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  std::unique_ptr< std::vector< IAxis const *,std::allocator< IAxis const * > > > rvrdeleter1 ;
+  std::unique_ptr< std::vector< Scale const *,std::allocator< Scale const * > > > rvrdeleter1 ;
   PyObject *swig_obj[1] ;
   Frame *result = 0 ;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t, SWIG_POINTER_RELEASE |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__vectorT_Scale_const_p_std__allocatorT_Scale_const_p_t_t, SWIG_POINTER_RELEASE |  0 );
   if (!SWIG_IsOK(res1)) {
     if (res1 == SWIG_ERROR_RELEASE_NOT_OWNED) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Frame" "', cannot release ownership as memory is not owned for argument " "1"" of type '" "std::vector< IAxis const *,std::allocator< IAxis const * > > &&""'");
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Frame" "', cannot release ownership as memory is not owned for argument " "1"" of type '" "std::vector< Scale const *,std::allocator< Scale const * > > &&""'");
     } else {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Frame" "', argument " "1"" of type '" "std::vector< IAxis const *,std::allocator< IAxis const * > > &&""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Frame" "', argument " "1"" of type '" "std::vector< Scale const *,std::allocator< Scale const * > > &&""'"); 
     }
   }
   if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Frame" "', argument " "1"" of type '" "std::vector< IAxis const *,std::allocator< IAxis const * > > &&""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Frame" "', argument " "1"" of type '" "std::vector< Scale const *,std::allocator< Scale const * > > &&""'"); 
   }
-  arg1 = reinterpret_cast< std::vector< IAxis const *,std::allocator< IAxis const * > > * >(argp1);
+  arg1 = reinterpret_cast< std::vector< Scale const *,std::allocator< Scale const * > > * >(argp1);
   rvrdeleter1.reset(arg1);
-  result = (Frame *)new Frame((std::vector< IAxis const *,std::allocator< IAxis const * > > &&)*arg1);
+  result = (Frame *)new Frame((std::vector< Scale const *,std::allocator< Scale const * > > &&)*arg1);
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Frame, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
@@ -26403,7 +26403,7 @@ SWIGINTERN PyObject *_wrap_Frame_axis(PyObject *self, PyObject *args) {
   size_t val2 ;
   int ecode2 = 0 ;
   PyObject *swig_obj[2] ;
-  IAxis *result = 0 ;
+  Scale *result = 0 ;
   
   if (!SWIG_Python_UnpackTuple(args, "Frame_axis", 2, 2, swig_obj)) SWIG_fail;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Frame, 0 |  0 );
@@ -26416,8 +26416,8 @@ SWIGINTERN PyObject *_wrap_Frame_axis(PyObject *self, PyObject *args) {
     SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Frame_axis" "', argument " "2"" of type '" "size_t""'");
   } 
   arg2 = static_cast< size_t >(val2);
-  result = (IAxis *) &((Frame const *)arg1)->axis(arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAxis, 0 |  0 );
+  result = (Scale *) &((Frame const *)arg1)->axis(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Scale, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -26430,7 +26430,7 @@ SWIGINTERN PyObject *_wrap_Frame_xAxis(PyObject *self, PyObject *args) {
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  IAxis *result = 0 ;
+  Scale *result = 0 ;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
@@ -26439,8 +26439,8 @@ SWIGINTERN PyObject *_wrap_Frame_xAxis(PyObject *self, PyObject *args) {
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Frame_xAxis" "', argument " "1"" of type '" "Frame const *""'"); 
   }
   arg1 = reinterpret_cast< Frame * >(argp1);
-  result = (IAxis *) &((Frame const *)arg1)->xAxis();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAxis, 0 |  0 );
+  result = (Scale *) &((Frame const *)arg1)->xAxis();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Scale, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -26453,7 +26453,7 @@ SWIGINTERN PyObject *_wrap_Frame_yAxis(PyObject *self, PyObject *args) {
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  IAxis *result = 0 ;
+  Scale *result = 0 ;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
@@ -26462,8 +26462,8 @@ SWIGINTERN PyObject *_wrap_Frame_yAxis(PyObject *self, PyObject *args) {
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Frame_yAxis" "', argument " "1"" of type '" "Frame const *""'"); 
   }
   arg1 = reinterpret_cast< Frame * >(argp1);
-  result = (IAxis *) &((Frame const *)arg1)->yAxis();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAxis, 0 |  0 );
+  result = (Scale *) &((Frame const *)arg1)->yAxis();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Scale, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -28694,47 +28694,47 @@ static PyMethodDef SwigMethods[] = {
 	 { "Bin1D_clipped_or_nil", _wrap_Bin1D_clipped_or_nil, METH_VARARGS, "Bin1D_clipped_or_nil(Bin1D self, double lower, double upper) -> std::optional< Bin1D >"},
 	 { "delete_Bin1D", _wrap_delete_Bin1D, METH_O, "delete_Bin1D(Bin1D self)"},
 	 { "Bin1D_swigregister", Bin1D_swigregister, METH_O, NULL},
-	 { "new_IAxis", _wrap_new_IAxis, METH_VARARGS, "new_IAxis(std::string name, std::vector< Bin1D,std::allocator< Bin1D > > const & bins) -> IAxis"},
-	 { "IAxis_clone", _wrap_IAxis_clone, METH_O, "IAxis_clone(IAxis self) -> IAxis"},
-	 { "IAxis_setAxisName", _wrap_IAxis_setAxisName, METH_VARARGS, "IAxis_setAxisName(IAxis self, std::string name)"},
-	 { "IAxis_axisName", _wrap_IAxis_axisName, METH_O, "IAxis_axisName(IAxis self) -> std::string"},
-	 { "IAxis_size", _wrap_IAxis_size, METH_O, "IAxis_size(IAxis self) -> size_t"},
-	 { "IAxis_min", _wrap_IAxis_min, METH_O, "IAxis_min(IAxis self) -> double"},
-	 { "IAxis_max", _wrap_IAxis_max, METH_O, "IAxis_max(IAxis self) -> double"},
-	 { "IAxis_bounds", _wrap_IAxis_bounds, METH_O, "IAxis_bounds(IAxis self) -> pvacuum_double_t"},
-	 { "IAxis_rangeComprises", _wrap_IAxis_rangeComprises, METH_VARARGS, "IAxis_rangeComprises(IAxis self, double value) -> bool"},
-	 { "IAxis_span", _wrap_IAxis_span, METH_O, "IAxis_span(IAxis self) -> double"},
-	 { "IAxis_center", _wrap_IAxis_center, METH_O, "IAxis_center(IAxis self) -> double"},
-	 { "IAxis_bin", _wrap_IAxis_bin, METH_VARARGS, "IAxis_bin(IAxis self, size_t i) -> Bin1D"},
-	 { "IAxis_binCenter", _wrap_IAxis_binCenter, METH_VARARGS, "IAxis_binCenter(IAxis self, size_t i) -> double"},
-	 { "IAxis_bins", _wrap_IAxis_bins, METH_O, "IAxis_bins(IAxis self) -> std::vector< Bin1D,std::allocator< Bin1D > > const &"},
-	 { "IAxis_binCenters", _wrap_IAxis_binCenters, METH_O, "IAxis_binCenters(IAxis self) -> vdouble1d_t"},
-	 { "IAxis_closestIndex", _wrap_IAxis_closestIndex, METH_VARARGS, "IAxis_closestIndex(IAxis self, double value) -> size_t"},
-	 { "IAxis_isEquidistantCoverage", _wrap_IAxis_isEquidistantCoverage, METH_O, "IAxis_isEquidistantCoverage(IAxis self) -> bool"},
-	 { "IAxis_isDiscrete", _wrap_IAxis_isDiscrete, METH_O, "IAxis_isDiscrete(IAxis self) -> bool"},
-	 { "IAxis_clipped", _wrap_IAxis_clipped, METH_VARARGS, "\n"
-		"IAxis_clipped(IAxis self, double lower, double upper) -> IAxis\n"
-		"IAxis_clipped(IAxis self, pvacuum_double_t bounds) -> IAxis\n"
+	 { "new_Scale", _wrap_new_Scale, METH_VARARGS, "new_Scale(std::string name, std::vector< Bin1D,std::allocator< Bin1D > > const & bins) -> Scale"},
+	 { "Scale_clone", _wrap_Scale_clone, METH_O, "Scale_clone(Scale self) -> Scale"},
+	 { "Scale_setAxisName", _wrap_Scale_setAxisName, METH_VARARGS, "Scale_setAxisName(Scale self, std::string name)"},
+	 { "Scale_axisName", _wrap_Scale_axisName, METH_O, "Scale_axisName(Scale self) -> std::string"},
+	 { "Scale_size", _wrap_Scale_size, METH_O, "Scale_size(Scale self) -> size_t"},
+	 { "Scale_min", _wrap_Scale_min, METH_O, "Scale_min(Scale self) -> double"},
+	 { "Scale_max", _wrap_Scale_max, METH_O, "Scale_max(Scale self) -> double"},
+	 { "Scale_bounds", _wrap_Scale_bounds, METH_O, "Scale_bounds(Scale self) -> pvacuum_double_t"},
+	 { "Scale_rangeComprises", _wrap_Scale_rangeComprises, METH_VARARGS, "Scale_rangeComprises(Scale self, double value) -> bool"},
+	 { "Scale_span", _wrap_Scale_span, METH_O, "Scale_span(Scale self) -> double"},
+	 { "Scale_center", _wrap_Scale_center, METH_O, "Scale_center(Scale self) -> double"},
+	 { "Scale_bin", _wrap_Scale_bin, METH_VARARGS, "Scale_bin(Scale self, size_t i) -> Bin1D"},
+	 { "Scale_binCenter", _wrap_Scale_binCenter, METH_VARARGS, "Scale_binCenter(Scale self, size_t i) -> double"},
+	 { "Scale_bins", _wrap_Scale_bins, METH_O, "Scale_bins(Scale self) -> std::vector< Bin1D,std::allocator< Bin1D > > const &"},
+	 { "Scale_binCenters", _wrap_Scale_binCenters, METH_O, "Scale_binCenters(Scale self) -> vdouble1d_t"},
+	 { "Scale_closestIndex", _wrap_Scale_closestIndex, METH_VARARGS, "Scale_closestIndex(Scale self, double value) -> size_t"},
+	 { "Scale_isEquidistantCoverage", _wrap_Scale_isEquidistantCoverage, METH_O, "Scale_isEquidistantCoverage(Scale self) -> bool"},
+	 { "Scale_isDiscrete", _wrap_Scale_isDiscrete, METH_O, "Scale_isDiscrete(Scale self) -> bool"},
+	 { "Scale_clipped", _wrap_Scale_clipped, METH_VARARGS, "\n"
+		"Scale_clipped(Scale self, double lower, double upper) -> Scale\n"
+		"Scale_clipped(Scale self, pvacuum_double_t bounds) -> Scale\n"
 		""},
-	 { "IAxis___eq__", _wrap_IAxis___eq__, METH_VARARGS, "IAxis___eq__(IAxis self, IAxis right) -> bool"},
-	 { "delete_IAxis", _wrap_delete_IAxis, METH_O, "delete_IAxis(IAxis self)"},
-	 { "IAxis_swigregister", IAxis_swigregister, METH_O, NULL},
-	 { "IAxis_swiginit", IAxis_swiginit, METH_VARARGS, NULL},
-	 { "DiscreteAxis", _wrap_DiscreteAxis, METH_VARARGS, "DiscreteAxis(std::string const & name, vdouble1d_t points) -> IAxis"},
-	 { "newDiscreteAxis", _wrap_newDiscreteAxis, METH_VARARGS, "newDiscreteAxis(std::string const & name, vdouble1d_t points) -> IAxis"},
-	 { "FixedBinAxis", _wrap_FixedBinAxis, METH_VARARGS, "FixedBinAxis(std::string const & name, size_t nbins, double start, double end) -> IAxis"},
-	 { "newFixedBinAxis", _wrap_newFixedBinAxis, METH_VARARGS, "newFixedBinAxis(std::string const & name, size_t nbins, double start, double end) -> IAxis"},
-	 { "sharedFixedBinAxis", _wrap_sharedFixedBinAxis, METH_VARARGS, "sharedFixedBinAxis(std::string const & name, size_t nbins, double start, double end) -> std::shared_ptr< IAxis >"},
-	 { "uniqueFixedBinAxis", _wrap_uniqueFixedBinAxis, METH_VARARGS, "uniqueFixedBinAxis(std::string const & name, size_t nbins, double start, double end) -> std::unique_ptr< IAxis >"},
-	 { "new_Frame", _wrap_new_Frame, METH_O, "new_Frame(std::vector< IAxis const *,std::allocator< IAxis const * > > && axes) -> Frame"},
+	 { "Scale___eq__", _wrap_Scale___eq__, METH_VARARGS, "Scale___eq__(Scale self, Scale right) -> bool"},
+	 { "delete_Scale", _wrap_delete_Scale, METH_O, "delete_Scale(Scale self)"},
+	 { "Scale_swigregister", Scale_swigregister, METH_O, NULL},
+	 { "Scale_swiginit", Scale_swiginit, METH_VARARGS, NULL},
+	 { "DiscreteAxis", _wrap_DiscreteAxis, METH_VARARGS, "DiscreteAxis(std::string const & name, vdouble1d_t points) -> Scale"},
+	 { "newDiscreteAxis", _wrap_newDiscreteAxis, METH_VARARGS, "newDiscreteAxis(std::string const & name, vdouble1d_t points) -> Scale"},
+	 { "FixedBinAxis", _wrap_FixedBinAxis, METH_VARARGS, "FixedBinAxis(std::string const & name, size_t nbins, double start, double end) -> Scale"},
+	 { "newFixedBinAxis", _wrap_newFixedBinAxis, METH_VARARGS, "newFixedBinAxis(std::string const & name, size_t nbins, double start, double end) -> Scale"},
+	 { "sharedFixedBinAxis", _wrap_sharedFixedBinAxis, METH_VARARGS, "sharedFixedBinAxis(std::string const & name, size_t nbins, double start, double end) -> std::shared_ptr< Scale >"},
+	 { "uniqueFixedBinAxis", _wrap_uniqueFixedBinAxis, METH_VARARGS, "uniqueFixedBinAxis(std::string const & name, size_t nbins, double start, double end) -> std::unique_ptr< Scale >"},
+	 { "new_Frame", _wrap_new_Frame, METH_O, "new_Frame(std::vector< Scale const *,std::allocator< Scale const * > > && axes) -> Frame"},
 	 { "delete_Frame", _wrap_delete_Frame, METH_O, "delete_Frame(Frame self)"},
 	 { "Frame_clone", _wrap_Frame_clone, METH_O, "Frame_clone(Frame self) -> Frame"},
 	 { "Frame_rank", _wrap_Frame_rank, METH_O, "Frame_rank(Frame self) -> size_t"},
 	 { "Frame_size", _wrap_Frame_size, METH_O, "Frame_size(Frame self) -> size_t"},
 	 { "Frame_projectedSize", _wrap_Frame_projectedSize, METH_VARARGS, "Frame_projectedSize(Frame self, size_t k_axis) -> size_t"},
-	 { "Frame_axis", _wrap_Frame_axis, METH_VARARGS, "Frame_axis(Frame self, size_t k_axis) -> IAxis"},
-	 { "Frame_xAxis", _wrap_Frame_xAxis, METH_O, "Frame_xAxis(Frame self) -> IAxis"},
-	 { "Frame_yAxis", _wrap_Frame_yAxis, METH_O, "Frame_yAxis(Frame self) -> IAxis"},
+	 { "Frame_axis", _wrap_Frame_axis, METH_VARARGS, "Frame_axis(Frame self, size_t k_axis) -> Scale"},
+	 { "Frame_xAxis", _wrap_Frame_xAxis, METH_O, "Frame_xAxis(Frame self) -> Scale"},
+	 { "Frame_yAxis", _wrap_Frame_yAxis, METH_O, "Frame_yAxis(Frame self) -> Scale"},
 	 { "Frame_projectedCoord", _wrap_Frame_projectedCoord, METH_VARARGS, "Frame_projectedCoord(Frame self, size_t i_flat, size_t k_axis) -> double"},
 	 { "Frame_allIndices", _wrap_Frame_allIndices, METH_VARARGS, "Frame_allIndices(Frame self, size_t i_flat) -> vector_integer_t"},
 	 { "Frame_projectedIndex", _wrap_Frame_projectedIndex, METH_VARARGS, "Frame_projectedIndex(Frame self, size_t i_flat, size_t k_axis) -> size_t"},
@@ -28810,9 +28810,9 @@ static void *_p_FrameTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
 }
 static swig_type_info _swigt__p_Bin1D = {"_p_Bin1D", "Bin1D *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Frame = {"_p_Frame", "Frame *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_IAxis = {"_p_IAxis", "IAxis *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ICloneable = {"_p_ICloneable", "ICloneable *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Rotation3DT_double_t = {"_p_Rotation3DT_double_t", "RotMatrix *|Rotation3D< double > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Scale = {"_p_Scale", "Scale *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Span = {"_p_Span", "Span *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ThreadInfo = {"_p_ThreadInfo", "ThreadInfo *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Vec3T_double_t = {"_p_Vec3T_double_t", "R3 *|Vec3< double > *", 0, 0, (void*)0, 0};
@@ -28846,10 +28846,10 @@ static swig_type_info _swigt__p_std__lessT_std__string_t = {"_p_std__lessT_std__
 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__optionalT_Bin1D_t = {"_p_std__optionalT_Bin1D_t", "std::optional< Bin1D > *", 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__shared_ptrT_IAxis_t = {"_p_std__shared_ptrT_IAxis_t", "std::shared_ptr< IAxis > *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_std__unique_ptrT_IAxis_t = {"_p_std__unique_ptrT_IAxis_t", "std::unique_ptr< IAxis > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__shared_ptrT_Scale_t = {"_p_std__shared_ptrT_Scale_t", "std::shared_ptr< Scale > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__unique_ptrT_Scale_t = {"_p_std__unique_ptrT_Scale_t", "std::unique_ptr< Scale > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_Bin1D_std__allocatorT_Bin1D_t_t = {"_p_std__vectorT_Bin1D_std__allocatorT_Bin1D_t_t", "std::vector< Bin1D,std::allocator< Bin1D > > *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t = {"_p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t", "std::vector< IAxis const *,std::allocator< IAxis const * > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_Scale_const_p_std__allocatorT_Scale_const_p_t_t = {"_p_std__vectorT_Scale_const_p_std__allocatorT_Scale_const_p_t_t", "std::vector< Scale const *,std::allocator< Scale const * > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_double_std__allocatorT_double_t_t = {"_p_std__vectorT_double_std__allocatorT_double_t_t", "std::vector< double,std::allocator< double > > *|std::vector< double > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_int_std__allocatorT_int_t_t = {"_p_std__vectorT_int_std__allocatorT_int_t_t", "std::vector< int,std::allocator< int > > *|std::vector< int > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t = {"_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t", "std::vector< std::complex< double >,std::allocator< std::complex< double > > > *|std::vector< std::complex< double > > *", 0, 0, (void*)0, 0};
@@ -28869,9 +28869,9 @@ static swig_type_info _swigt__p_value_type = {"_p_value_type", "value_type *", 0
 static swig_type_info *swig_type_initial[] = {
   &_swigt__p_Bin1D,
   &_swigt__p_Frame,
-  &_swigt__p_IAxis,
   &_swigt__p_ICloneable,
   &_swigt__p_Rotation3DT_double_t,
+  &_swigt__p_Scale,
   &_swigt__p_Span,
   &_swigt__p_ThreadInfo,
   &_swigt__p_Vec3T_double_t,
@@ -28905,10 +28905,10 @@ static swig_type_info *swig_type_initial[] = {
   &_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__optionalT_Bin1D_t,
   &_swigt__p_std__pairT_double_double_t,
-  &_swigt__p_std__shared_ptrT_IAxis_t,
-  &_swigt__p_std__unique_ptrT_IAxis_t,
+  &_swigt__p_std__shared_ptrT_Scale_t,
+  &_swigt__p_std__unique_ptrT_Scale_t,
   &_swigt__p_std__vectorT_Bin1D_std__allocatorT_Bin1D_t_t,
-  &_swigt__p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t,
+  &_swigt__p_std__vectorT_Scale_const_p_std__allocatorT_Scale_const_p_t_t,
   &_swigt__p_std__vectorT_double_std__allocatorT_double_t_t,
   &_swigt__p_std__vectorT_int_std__allocatorT_int_t_t,
   &_swigt__p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t,
@@ -28928,9 +28928,9 @@ static swig_type_info *swig_type_initial[] = {
 
 static swig_cast_info _swigc__p_Bin1D[] = {  {&_swigt__p_Bin1D, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Frame[] = {  {&_swigt__p_Frame, 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_ICloneable[] = {  {&_swigt__p_ICloneable, 0, 0, 0},  {&_swigt__p_Frame, _p_FrameTo_p_ICloneable, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Rotation3DT_double_t[] = {  {&_swigt__p_Rotation3DT_double_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Scale[] = {  {&_swigt__p_Scale, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Span[] = {  {&_swigt__p_Span, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ThreadInfo[] = {  {&_swigt__p_ThreadInfo, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Vec3T_double_t[] = {  {&_swigt__p_Vec3T_double_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -28964,10 +28964,10 @@ static swig_cast_info _swigc__p_std__lessT_std__string_t[] = {  {&_swigt__p_std_
 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__optionalT_Bin1D_t[] = {  {&_swigt__p_std__optionalT_Bin1D_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__shared_ptrT_IAxis_t[] = {  {&_swigt__p_std__shared_ptrT_IAxis_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_std__unique_ptrT_IAxis_t[] = {  {&_swigt__p_std__unique_ptrT_IAxis_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__shared_ptrT_Scale_t[] = {  {&_swigt__p_std__shared_ptrT_Scale_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__unique_ptrT_Scale_t[] = {  {&_swigt__p_std__unique_ptrT_Scale_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_Bin1D_std__allocatorT_Bin1D_t_t[] = {  {&_swigt__p_std__vectorT_Bin1D_std__allocatorT_Bin1D_t_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t[] = {  {&_swigt__p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_Scale_const_p_std__allocatorT_Scale_const_p_t_t[] = {  {&_swigt__p_std__vectorT_Scale_const_p_std__allocatorT_Scale_const_p_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_double_std__allocatorT_double_t_t[] = {  {&_swigt__p_std__vectorT_double_std__allocatorT_double_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_int_std__allocatorT_int_t_t[] = {  {&_swigt__p_std__vectorT_int_std__allocatorT_int_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t[] = {  {&_swigt__p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -28987,9 +28987,9 @@ static swig_cast_info _swigc__p_value_type[] = {  {&_swigt__p_value_type, 0, 0,
 static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_Bin1D,
   _swigc__p_Frame,
-  _swigc__p_IAxis,
   _swigc__p_ICloneable,
   _swigc__p_Rotation3DT_double_t,
+  _swigc__p_Scale,
   _swigc__p_Span,
   _swigc__p_ThreadInfo,
   _swigc__p_Vec3T_double_t,
@@ -29023,10 +29023,10 @@ static swig_cast_info *swig_cast_initial[] = {
   _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__optionalT_Bin1D_t,
   _swigc__p_std__pairT_double_double_t,
-  _swigc__p_std__shared_ptrT_IAxis_t,
-  _swigc__p_std__unique_ptrT_IAxis_t,
+  _swigc__p_std__shared_ptrT_Scale_t,
+  _swigc__p_std__unique_ptrT_Scale_t,
   _swigc__p_std__vectorT_Bin1D_std__allocatorT_Bin1D_t_t,
-  _swigc__p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t,
+  _swigc__p_std__vectorT_Scale_const_p_std__allocatorT_Scale_const_p_t_t,
   _swigc__p_std__vectorT_double_std__allocatorT_double_t_t,
   _swigc__p_std__vectorT_int_std__allocatorT_int_t_t,
   _swigc__p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t,
diff --git a/auto/Wrap/libBornAgainDevice.py b/auto/Wrap/libBornAgainDevice.py
index 5857e8b4598..5386b9da906 100644
--- a/auto/Wrap/libBornAgainDevice.py
+++ b/auto/Wrap/libBornAgainDevice.py
@@ -2043,7 +2043,7 @@ class Datafield(object):
         r"""
         __init__(Datafield self) -> Datafield
         __init__(Datafield self, Frame frame, vdouble1d_t values={}, vdouble1d_t errSigmas={}) -> Datafield
-        __init__(Datafield self, std::vector< IAxis const *,std::allocator< IAxis const * > > && axes, vdouble1d_t values={}, vdouble1d_t errSigmas={}) -> Datafield
+        __init__(Datafield self, std::vector< Scale const *,std::allocator< Scale const * > > && axes, vdouble1d_t values={}, vdouble1d_t errSigmas={}) -> Datafield
         __init__(Datafield self, Datafield arg2) -> Datafield
         __init__(Datafield self, Datafield arg2) -> Datafield
         """
@@ -2071,15 +2071,15 @@ class Datafield(object):
         return _libBornAgainDevice.Datafield_rank(self)
 
     def axis(self, k):
-        r"""axis(Datafield self, size_t k) -> IAxis"""
+        r"""axis(Datafield self, size_t k) -> Scale"""
         return _libBornAgainDevice.Datafield_axis(self, k)
 
     def xAxis(self):
-        r"""xAxis(Datafield self) -> IAxis"""
+        r"""xAxis(Datafield self) -> Scale"""
         return _libBornAgainDevice.Datafield_xAxis(self)
 
     def yAxis(self):
-        r"""yAxis(Datafield self) -> IAxis"""
+        r"""yAxis(Datafield self) -> Scale"""
         return _libBornAgainDevice.Datafield_yAxis(self)
 
     def size(self):
@@ -2631,7 +2631,7 @@ class DetectorMask(object):
 
     def __init__(self, *args):
         r"""
-        __init__(DetectorMask self, IAxis xAxis, IAxis yAxis) -> DetectorMask
+        __init__(DetectorMask self, Scale xAxis, Scale yAxis) -> DetectorMask
         __init__(DetectorMask self, DetectorMask other) -> DetectorMask
         """
         _libBornAgainDevice.DetectorMask_swiginit(self, _libBornAgainDevice.new_DetectorMask(*args))
@@ -2737,7 +2737,7 @@ class IDetector(libBornAgainBase.ICloneable, libBornAgainParam.INode):
         return _libBornAgainDevice.IDetector_indexOfSpecular(self, beam)
 
     def axis(self, index):
-        r"""axis(IDetector self, size_t index) -> IAxis"""
+        r"""axis(IDetector self, size_t index) -> Scale"""
         return _libBornAgainDevice.IDetector_axis(self, index)
 
     def axisBinIndex(self, index, selected_axis):
@@ -2757,7 +2757,7 @@ class IDetector(libBornAgainBase.ICloneable, libBornAgainParam.INode):
         return _libBornAgainDevice.IDetector_hasExplicitRegionOfInterest(self)
 
     def axesClippedToRegionOfInterest(self):
-        r"""axesClippedToRegionOfInterest(IDetector self) -> std::vector< IAxis const *,std::allocator< IAxis const * > >"""
+        r"""axesClippedToRegionOfInterest(IDetector self) -> std::vector< Scale const *,std::allocator< Scale const * > >"""
         return _libBornAgainDevice.IDetector_axesClippedToRegionOfInterest(self)
 
     def regionOfInterestIndexToDetectorIndex(self, regionOfInterestIndex):
@@ -2798,7 +2798,7 @@ class RectangularDetector(IDetector):
 
     def __init__(self, *args):
         r"""
-        __init__(RectangularDetector self, std::array< std::shared_ptr< IAxis >,2 > axes) -> RectangularDetector
+        __init__(RectangularDetector self, std::array< std::shared_ptr< Scale >,2 > axes) -> RectangularDetector
         __init__(RectangularDetector self, size_t nxbins, double width, size_t nybins, double height) -> RectangularDetector
         __init__(RectangularDetector self, RectangularDetector other) -> RectangularDetector
         """
@@ -2922,7 +2922,7 @@ class OffspecDetector(libBornAgainParam.INode):
         return _libBornAgainDevice.OffspecDetector_setAnalyzer(self, direction, efficiency, total_transmission)
 
     def axis(self, index):
-        r"""axis(OffspecDetector self, size_t index) -> IAxis"""
+        r"""axis(OffspecDetector self, size_t index) -> Scale"""
         return _libBornAgainDevice.OffspecDetector_axis(self, index)
 
     def axisBinIndex(self, index, selected_axis):
@@ -2959,7 +2959,7 @@ class SphericalDetector(IDetector):
 
     def __init__(self, *args):
         r"""
-        __init__(SphericalDetector self, std::array< std::shared_ptr< IAxis >,2 > axes) -> SphericalDetector
+        __init__(SphericalDetector self, std::array< std::shared_ptr< Scale >,2 > axes) -> SphericalDetector
         __init__(SphericalDetector self, size_t n_phi, double phi_min, double phi_max, size_t n_alpha, double alpha_min, double alpha_max) -> SphericalDetector
         __init__(SphericalDetector self, size_t n_bin, double width, double phi, double alpha) -> SphericalDetector
         __init__(SphericalDetector self, SphericalDetector other) -> SphericalDetector
diff --git a/auto/Wrap/libBornAgainDevice_wrap.cpp b/auto/Wrap/libBornAgainDevice_wrap.cpp
index e9d62d01702..8a5b26d9710 100644
--- a/auto/Wrap/libBornAgainDevice_wrap.cpp
+++ b/auto/Wrap/libBornAgainDevice_wrap.cpp
@@ -3396,28 +3396,28 @@ namespace Swig {
 #define SWIGTYPE_p_FootprintSquare swig_types[7]
 #define SWIGTYPE_p_Frame swig_types[8]
 #define SWIGTYPE_p_HorizontalLine swig_types[9]
-#define SWIGTYPE_p_IAxis swig_types[10]
-#define SWIGTYPE_p_ICloneable swig_types[11]
-#define SWIGTYPE_p_ICoordSystem swig_types[12]
-#define SWIGTYPE_p_IDetector swig_types[13]
-#define SWIGTYPE_p_IDetectorResolution swig_types[14]
-#define SWIGTYPE_p_IFootprintFactor swig_types[15]
-#define SWIGTYPE_p_INode swig_types[16]
-#define SWIGTYPE_p_IOFactory swig_types[17]
-#define SWIGTYPE_p_IPixel swig_types[18]
-#define SWIGTYPE_p_IResolutionFunction2D swig_types[19]
-#define SWIGTYPE_p_IShape2D swig_types[20]
-#define SWIGTYPE_p_Line swig_types[21]
-#define SWIGTYPE_p_MaskPattern swig_types[22]
-#define SWIGTYPE_p_OffspecDetector swig_types[23]
-#define SWIGTYPE_p_PolFilter swig_types[24]
-#define SWIGTYPE_p_Polygon swig_types[25]
-#define SWIGTYPE_p_PolygonPrivate swig_types[26]
-#define SWIGTYPE_p_Rectangle swig_types[27]
-#define SWIGTYPE_p_RectangularDetector swig_types[28]
-#define SWIGTYPE_p_RectangularPixel swig_types[29]
-#define SWIGTYPE_p_ResolutionFunction2DGaussian swig_types[30]
-#define SWIGTYPE_p_Rotation3DT_double_t swig_types[31]
+#define SWIGTYPE_p_ICloneable swig_types[10]
+#define SWIGTYPE_p_ICoordSystem swig_types[11]
+#define SWIGTYPE_p_IDetector swig_types[12]
+#define SWIGTYPE_p_IDetectorResolution swig_types[13]
+#define SWIGTYPE_p_IFootprintFactor swig_types[14]
+#define SWIGTYPE_p_INode swig_types[15]
+#define SWIGTYPE_p_IOFactory swig_types[16]
+#define SWIGTYPE_p_IPixel swig_types[17]
+#define SWIGTYPE_p_IResolutionFunction2D swig_types[18]
+#define SWIGTYPE_p_IShape2D swig_types[19]
+#define SWIGTYPE_p_Line swig_types[20]
+#define SWIGTYPE_p_MaskPattern swig_types[21]
+#define SWIGTYPE_p_OffspecDetector swig_types[22]
+#define SWIGTYPE_p_PolFilter swig_types[23]
+#define SWIGTYPE_p_Polygon swig_types[24]
+#define SWIGTYPE_p_PolygonPrivate swig_types[25]
+#define SWIGTYPE_p_Rectangle swig_types[26]
+#define SWIGTYPE_p_RectangularDetector swig_types[27]
+#define SWIGTYPE_p_RectangularPixel swig_types[28]
+#define SWIGTYPE_p_ResolutionFunction2DGaussian swig_types[29]
+#define SWIGTYPE_p_Rotation3DT_double_t swig_types[30]
+#define SWIGTYPE_p_Scale swig_types[31]
 #define SWIGTYPE_p_SimulationResult swig_types[32]
 #define SWIGTYPE_p_SphericalDetector swig_types[33]
 #define SWIGTYPE_p_Vec3T_double_t swig_types[34]
@@ -3451,16 +3451,16 @@ namespace Swig {
 #define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[62]
 #define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[63]
 #define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[64]
-#define SWIGTYPE_p_std__arrayT_std__shared_ptrT_IAxis_t_2_t swig_types[65]
+#define SWIGTYPE_p_std__arrayT_std__shared_ptrT_Scale_t_2_t swig_types[65]
 #define SWIGTYPE_p_std__complexT_double_t swig_types[66]
 #define SWIGTYPE_p_std__functionT_void_fSimulationAreaIterator_const_RF_t swig_types[67]
 #define SWIGTYPE_p_std__invalid_argument swig_types[68]
 #define SWIGTYPE_p_std__lessT_std__string_t swig_types[69]
 #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[70]
 #define SWIGTYPE_p_std__pairT_double_double_t swig_types[71]
-#define SWIGTYPE_p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t swig_types[72]
-#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[73]
-#define SWIGTYPE_p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t swig_types[74]
+#define SWIGTYPE_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t swig_types[72]
+#define SWIGTYPE_p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t swig_types[73]
+#define SWIGTYPE_p_std__vectorT_Scale_const_p_std__allocatorT_Scale_const_p_t_t swig_types[74]
 #define SWIGTYPE_p_std__vectorT_Vec3T_double_t_std__allocatorT_Vec3T_double_t_t_t swig_types[75]
 #define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[76]
 #define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[77]
@@ -7016,7 +7016,7 @@ SWIGINTERN std::vector< std::pair< double,double > >::iterator std_vector_Sl_std
 SWIGINTERN void std_vector_Sl_std_pair_Sl_double_Sc_double_Sg__Sg__insert__SWIG_1(std::vector< std::pair< double,double > > *self,std::vector< std::pair< double,double > >::iterator pos,std::vector< std::pair< double,double > >::size_type n,std::vector< std::pair< double,double > >::value_type const &x){ self->insert(pos, n, x); }
 
 #include "Base/Axis/Frame.h"
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Spin/SpinMatrix.h"
 #include "Device/Beam/Beam.h"
 #include "Device/Beam/FootprintGauss.h"
@@ -27481,29 +27481,29 @@ fail:
 
 SWIGINTERN PyObject *_wrap_new_Datafield__SWIG_4(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  std::vector< IAxis const *,std::allocator< IAxis const * > > *arg1 = 0 ;
+  std::vector< Scale const *,std::allocator< Scale const * > > *arg1 = 0 ;
   std::vector< double,std::allocator< double > > *arg2 = 0 ;
   std::vector< double,std::allocator< double > > *arg3 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  std::unique_ptr< std::vector< IAxis const *,std::allocator< IAxis const * > > > rvrdeleter1 ;
+  std::unique_ptr< std::vector< Scale const *,std::allocator< Scale const * > > > rvrdeleter1 ;
   int res2 = SWIG_OLDOBJ ;
   int res3 = SWIG_OLDOBJ ;
   Datafield *result = 0 ;
   
   if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t, SWIG_POINTER_RELEASE |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__vectorT_Scale_const_p_std__allocatorT_Scale_const_p_t_t, SWIG_POINTER_RELEASE |  0 );
   if (!SWIG_IsOK(res1)) {
     if (res1 == SWIG_ERROR_RELEASE_NOT_OWNED) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Datafield" "', cannot release ownership as memory is not owned for argument " "1"" of type '" "std::vector< IAxis const *,std::allocator< IAxis const * > > &&""'");
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Datafield" "', cannot release ownership as memory is not owned for argument " "1"" of type '" "std::vector< Scale const *,std::allocator< Scale const * > > &&""'");
     } else {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Datafield" "', argument " "1"" of type '" "std::vector< IAxis const *,std::allocator< IAxis const * > > &&""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Datafield" "', argument " "1"" of type '" "std::vector< Scale const *,std::allocator< Scale const * > > &&""'"); 
     }
   }
   if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Datafield" "', argument " "1"" of type '" "std::vector< IAxis const *,std::allocator< IAxis const * > > &&""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Datafield" "', argument " "1"" of type '" "std::vector< Scale const *,std::allocator< Scale const * > > &&""'"); 
   }
-  arg1 = reinterpret_cast< std::vector< IAxis const *,std::allocator< IAxis const * > > * >(argp1);
+  arg1 = reinterpret_cast< std::vector< Scale const *,std::allocator< Scale const * > > * >(argp1);
   rvrdeleter1.reset(arg1);
   {
     std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
@@ -27527,7 +27527,7 @@ SWIGINTERN PyObject *_wrap_new_Datafield__SWIG_4(PyObject *self, Py_ssize_t nobj
     }
     arg3 = ptr;
   }
-  result = (Datafield *)new Datafield((std::vector< IAxis const *,std::allocator< IAxis const * > > &&)*arg1,(std::vector< double,std::allocator< double > > const &)*arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
+  result = (Datafield *)new Datafield((std::vector< Scale const *,std::allocator< Scale const * > > &&)*arg1,(std::vector< double,std::allocator< double > > const &)*arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Datafield, SWIG_POINTER_NEW |  0 );
   if (SWIG_IsNewObj(res2)) delete arg2;
   if (SWIG_IsNewObj(res3)) delete arg3;
@@ -27541,27 +27541,27 @@ fail:
 
 SWIGINTERN PyObject *_wrap_new_Datafield__SWIG_5(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  std::vector< IAxis const *,std::allocator< IAxis const * > > *arg1 = 0 ;
+  std::vector< Scale const *,std::allocator< Scale const * > > *arg1 = 0 ;
   std::vector< double,std::allocator< double > > *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  std::unique_ptr< std::vector< IAxis const *,std::allocator< IAxis const * > > > rvrdeleter1 ;
+  std::unique_ptr< std::vector< Scale const *,std::allocator< Scale const * > > > rvrdeleter1 ;
   int res2 = SWIG_OLDOBJ ;
   Datafield *result = 0 ;
   
   if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t, SWIG_POINTER_RELEASE |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__vectorT_Scale_const_p_std__allocatorT_Scale_const_p_t_t, SWIG_POINTER_RELEASE |  0 );
   if (!SWIG_IsOK(res1)) {
     if (res1 == SWIG_ERROR_RELEASE_NOT_OWNED) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Datafield" "', cannot release ownership as memory is not owned for argument " "1"" of type '" "std::vector< IAxis const *,std::allocator< IAxis const * > > &&""'");
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Datafield" "', cannot release ownership as memory is not owned for argument " "1"" of type '" "std::vector< Scale const *,std::allocator< Scale const * > > &&""'");
     } else {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Datafield" "', argument " "1"" of type '" "std::vector< IAxis const *,std::allocator< IAxis const * > > &&""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Datafield" "', argument " "1"" of type '" "std::vector< Scale const *,std::allocator< Scale const * > > &&""'"); 
     }
   }
   if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Datafield" "', argument " "1"" of type '" "std::vector< IAxis const *,std::allocator< IAxis const * > > &&""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Datafield" "', argument " "1"" of type '" "std::vector< Scale const *,std::allocator< Scale const * > > &&""'"); 
   }
-  arg1 = reinterpret_cast< std::vector< IAxis const *,std::allocator< IAxis const * > > * >(argp1);
+  arg1 = reinterpret_cast< std::vector< Scale const *,std::allocator< Scale const * > > * >(argp1);
   rvrdeleter1.reset(arg1);
   {
     std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
@@ -27574,7 +27574,7 @@ SWIGINTERN PyObject *_wrap_new_Datafield__SWIG_5(PyObject *self, Py_ssize_t nobj
     }
     arg2 = ptr;
   }
-  result = (Datafield *)new Datafield((std::vector< IAxis const *,std::allocator< IAxis const * > > &&)*arg1,(std::vector< double,std::allocator< double > > const &)*arg2);
+  result = (Datafield *)new Datafield((std::vector< Scale const *,std::allocator< Scale const * > > &&)*arg1,(std::vector< double,std::allocator< double > > const &)*arg2);
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Datafield, SWIG_POINTER_NEW |  0 );
   if (SWIG_IsNewObj(res2)) delete arg2;
   return resultobj;
@@ -27586,27 +27586,27 @@ fail:
 
 SWIGINTERN PyObject *_wrap_new_Datafield__SWIG_6(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  std::vector< IAxis const *,std::allocator< IAxis const * > > *arg1 = 0 ;
+  std::vector< Scale const *,std::allocator< Scale const * > > *arg1 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  std::unique_ptr< std::vector< IAxis const *,std::allocator< IAxis const * > > > rvrdeleter1 ;
+  std::unique_ptr< std::vector< Scale const *,std::allocator< Scale const * > > > rvrdeleter1 ;
   Datafield *result = 0 ;
   
   if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t, SWIG_POINTER_RELEASE |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__vectorT_Scale_const_p_std__allocatorT_Scale_const_p_t_t, SWIG_POINTER_RELEASE |  0 );
   if (!SWIG_IsOK(res1)) {
     if (res1 == SWIG_ERROR_RELEASE_NOT_OWNED) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Datafield" "', cannot release ownership as memory is not owned for argument " "1"" of type '" "std::vector< IAxis const *,std::allocator< IAxis const * > > &&""'");
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Datafield" "', cannot release ownership as memory is not owned for argument " "1"" of type '" "std::vector< Scale const *,std::allocator< Scale const * > > &&""'");
     } else {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Datafield" "', argument " "1"" of type '" "std::vector< IAxis const *,std::allocator< IAxis const * > > &&""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Datafield" "', argument " "1"" of type '" "std::vector< Scale const *,std::allocator< Scale const * > > &&""'"); 
     }
   }
   if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Datafield" "', argument " "1"" of type '" "std::vector< IAxis const *,std::allocator< IAxis const * > > &&""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Datafield" "', argument " "1"" of type '" "std::vector< Scale const *,std::allocator< Scale const * > > &&""'"); 
   }
-  arg1 = reinterpret_cast< std::vector< IAxis const *,std::allocator< IAxis const * > > * >(argp1);
+  arg1 = reinterpret_cast< std::vector< Scale const *,std::allocator< Scale const * > > * >(argp1);
   rvrdeleter1.reset(arg1);
-  result = (Datafield *)new Datafield((std::vector< IAxis const *,std::allocator< IAxis const * > > &&)*arg1);
+  result = (Datafield *)new Datafield((std::vector< Scale const *,std::allocator< Scale const * > > &&)*arg1);
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Datafield, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
@@ -27691,7 +27691,7 @@ SWIGINTERN PyObject *_wrap_new_Datafield(PyObject *self, PyObject *args) {
   if (argc == 1) {
     int _v = 0;
     void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t, SWIG_POINTER_NO_NULL);
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_std__vectorT_Scale_const_p_std__allocatorT_Scale_const_p_t_t, SWIG_POINTER_NO_NULL);
     _v = SWIG_CheckState(res);
     if (_v) {
       return _wrap_new_Datafield__SWIG_6(self, argc, argv);
@@ -27717,7 +27717,7 @@ SWIGINTERN PyObject *_wrap_new_Datafield(PyObject *self, PyObject *args) {
   if (argc == 2) {
     int _v = 0;
     void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t, SWIG_POINTER_NO_NULL);
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_std__vectorT_Scale_const_p_std__allocatorT_Scale_const_p_t_t, SWIG_POINTER_NO_NULL);
     _v = SWIG_CheckState(res);
     if (_v) {
       int res = swig::asptr(argv[1], (std::vector< double,std::allocator< double > >**)(0));
@@ -27760,7 +27760,7 @@ SWIGINTERN PyObject *_wrap_new_Datafield(PyObject *self, PyObject *args) {
   if (argc == 3) {
     int _v = 0;
     void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t, SWIG_POINTER_NO_NULL);
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_std__vectorT_Scale_const_p_std__allocatorT_Scale_const_p_t_t, SWIG_POINTER_NO_NULL);
     _v = SWIG_CheckState(res);
     if (_v) {
       int res = swig::asptr(argv[1], (std::vector< double,std::allocator< double > >**)(0));
@@ -27782,9 +27782,9 @@ fail:
     "    Datafield::Datafield(Frame const *,std::vector< double,std::allocator< double > > const &,std::vector< double,std::allocator< double > > const &)\n"
     "    Datafield::Datafield(Frame const *,std::vector< double,std::allocator< double > > const &)\n"
     "    Datafield::Datafield(Frame const *)\n"
-    "    Datafield::Datafield(std::vector< IAxis const *,std::allocator< IAxis const * > > &&,std::vector< double,std::allocator< double > > const &,std::vector< double,std::allocator< double > > const &)\n"
-    "    Datafield::Datafield(std::vector< IAxis const *,std::allocator< IAxis const * > > &&,std::vector< double,std::allocator< double > > const &)\n"
-    "    Datafield::Datafield(std::vector< IAxis const *,std::allocator< IAxis const * > > &&)\n"
+    "    Datafield::Datafield(std::vector< Scale const *,std::allocator< Scale const * > > &&,std::vector< double,std::allocator< double > > const &,std::vector< double,std::allocator< double > > const &)\n"
+    "    Datafield::Datafield(std::vector< Scale const *,std::allocator< Scale const * > > &&,std::vector< double,std::allocator< double > > const &)\n"
+    "    Datafield::Datafield(std::vector< Scale const *,std::allocator< Scale const * > > &&)\n"
     "    Datafield::Datafield(Datafield const &)\n"
     "    Datafield::Datafield(Datafield &&)\n");
   return 0;
@@ -27958,7 +27958,7 @@ SWIGINTERN PyObject *_wrap_Datafield_axis(PyObject *self, PyObject *args) {
   size_t val2 ;
   int ecode2 = 0 ;
   PyObject *swig_obj[2] ;
-  IAxis *result = 0 ;
+  Scale *result = 0 ;
   
   if (!SWIG_Python_UnpackTuple(args, "Datafield_axis", 2, 2, swig_obj)) SWIG_fail;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Datafield, 0 |  0 );
@@ -27971,8 +27971,8 @@ SWIGINTERN PyObject *_wrap_Datafield_axis(PyObject *self, PyObject *args) {
     SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Datafield_axis" "', argument " "2"" of type '" "size_t""'");
   } 
   arg2 = static_cast< size_t >(val2);
-  result = (IAxis *) &((Datafield const *)arg1)->axis(arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAxis, 0 |  0 );
+  result = (Scale *) &((Datafield const *)arg1)->axis(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Scale, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -27985,7 +27985,7 @@ SWIGINTERN PyObject *_wrap_Datafield_xAxis(PyObject *self, PyObject *args) {
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  IAxis *result = 0 ;
+  Scale *result = 0 ;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
@@ -27994,8 +27994,8 @@ SWIGINTERN PyObject *_wrap_Datafield_xAxis(PyObject *self, PyObject *args) {
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Datafield_xAxis" "', argument " "1"" of type '" "Datafield const *""'"); 
   }
   arg1 = reinterpret_cast< Datafield * >(argp1);
-  result = (IAxis *) &((Datafield const *)arg1)->xAxis();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAxis, 0 |  0 );
+  result = (Scale *) &((Datafield const *)arg1)->xAxis();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Scale, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -28008,7 +28008,7 @@ SWIGINTERN PyObject *_wrap_Datafield_yAxis(PyObject *self, PyObject *args) {
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  IAxis *result = 0 ;
+  Scale *result = 0 ;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
@@ -28017,8 +28017,8 @@ SWIGINTERN PyObject *_wrap_Datafield_yAxis(PyObject *self, PyObject *args) {
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Datafield_yAxis" "', argument " "1"" of type '" "Datafield const *""'"); 
   }
   arg1 = reinterpret_cast< Datafield * >(argp1);
-  result = (IAxis *) &((Datafield const *)arg1)->yAxis();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAxis, 0 |  0 );
+  result = (Scale *) &((Datafield const *)arg1)->yAxis();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Scale, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -32945,8 +32945,8 @@ SWIGINTERN PyObject *MaskPattern_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObje
 
 SWIGINTERN PyObject *_wrap_new_DetectorMask__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  IAxis *arg1 = 0 ;
-  IAxis *arg2 = 0 ;
+  Scale *arg1 = 0 ;
+  Scale *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   void *argp2 = 0 ;
@@ -32954,23 +32954,23 @@ SWIGINTERN PyObject *_wrap_new_DetectorMask__SWIG_0(PyObject *self, Py_ssize_t n
   DetectorMask *result = 0 ;
   
   if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_IAxis,  0  | 0);
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_Scale,  0  | 0);
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_DetectorMask" "', argument " "1"" of type '" "IAxis const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_DetectorMask" "', argument " "1"" of type '" "Scale const &""'"); 
   }
   if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_DetectorMask" "', argument " "1"" of type '" "IAxis const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_DetectorMask" "', argument " "1"" of type '" "Scale const &""'"); 
   }
-  arg1 = reinterpret_cast< IAxis * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_IAxis,  0  | 0);
+  arg1 = reinterpret_cast< Scale * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Scale,  0  | 0);
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_DetectorMask" "', argument " "2"" of type '" "IAxis const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_DetectorMask" "', argument " "2"" of type '" "Scale const &""'"); 
   }
   if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_DetectorMask" "', argument " "2"" of type '" "IAxis const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_DetectorMask" "', argument " "2"" of type '" "Scale const &""'"); 
   }
-  arg2 = reinterpret_cast< IAxis * >(argp2);
-  result = (DetectorMask *)new DetectorMask((IAxis const &)*arg1,(IAxis const &)*arg2);
+  arg2 = reinterpret_cast< Scale * >(argp2);
+  result = (DetectorMask *)new DetectorMask((Scale const &)*arg1,(Scale const &)*arg2);
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DetectorMask, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
@@ -33042,10 +33042,10 @@ SWIGINTERN PyObject *_wrap_new_DetectorMask(PyObject *self, PyObject *args) {
   }
   if (argc == 2) {
     int _v = 0;
-    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IAxis, SWIG_POINTER_NO_NULL | 0);
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_Scale, SWIG_POINTER_NO_NULL | 0);
     _v = SWIG_CheckState(res);
     if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IAxis, SWIG_POINTER_NO_NULL | 0);
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_Scale, SWIG_POINTER_NO_NULL | 0);
       _v = SWIG_CheckState(res);
       if (_v) {
         return _wrap_new_DetectorMask__SWIG_0(self, argc, argv);
@@ -33056,7 +33056,7 @@ SWIGINTERN PyObject *_wrap_new_DetectorMask(PyObject *self, PyObject *args) {
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_DetectorMask'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    DetectorMask::DetectorMask(IAxis const &,IAxis const &)\n"
+    "    DetectorMask::DetectorMask(Scale const &,Scale const &)\n"
     "    DetectorMask::DetectorMask(DetectorMask const &)\n");
   return 0;
 }
@@ -33864,7 +33864,7 @@ SWIGINTERN PyObject *_wrap_IDetector_axis(PyObject *self, PyObject *args) {
   size_t val2 ;
   int ecode2 = 0 ;
   PyObject *swig_obj[2] ;
-  IAxis *result = 0 ;
+  Scale *result = 0 ;
   
   if (!SWIG_Python_UnpackTuple(args, "IDetector_axis", 2, 2, swig_obj)) SWIG_fail;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IDetector, 0 |  0 );
@@ -33877,8 +33877,8 @@ SWIGINTERN PyObject *_wrap_IDetector_axis(PyObject *self, PyObject *args) {
     SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IDetector_axis" "', argument " "2"" of type '" "size_t""'");
   } 
   arg2 = static_cast< size_t >(val2);
-  result = (IAxis *) &((IDetector const *)arg1)->axis(arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAxis, 0 |  0 );
+  result = (Scale *) &((IDetector const *)arg1)->axis(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Scale, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -33998,7 +33998,7 @@ SWIGINTERN PyObject *_wrap_IDetector_axesClippedToRegionOfInterest(PyObject *sel
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  SwigValueWrapper< std::vector< IAxis const *,std::allocator< IAxis const * > > > result;
+  SwigValueWrapper< std::vector< Scale const *,std::allocator< Scale const * > > > result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
@@ -34008,7 +34008,7 @@ SWIGINTERN PyObject *_wrap_IDetector_axesClippedToRegionOfInterest(PyObject *sel
   }
   arg1 = reinterpret_cast< IDetector * >(argp1);
   result = ((IDetector const *)arg1)->axesClippedToRegionOfInterest();
-  resultobj = SWIG_NewPointerObj((new std::vector< IAxis const *,std::allocator< IAxis const * > >(result)), SWIGTYPE_p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t, SWIG_POINTER_OWN |  0 );
+  resultobj = SWIG_NewPointerObj((new std::vector< Scale const *,std::allocator< Scale const * > >(result)), SWIGTYPE_p_std__vectorT_Scale_const_p_std__allocatorT_Scale_const_p_t_t, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -34159,21 +34159,21 @@ SWIGINTERN PyObject *IDetector_swigregister(PyObject *SWIGUNUSEDPARM(self), PyOb
 
 SWIGINTERN PyObject *_wrap_new_RectangularDetector__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  std::array< std::shared_ptr< IAxis >,2 > arg1 ;
+  std::array< std::shared_ptr< Scale >,2 > arg1 ;
   void *argp1 ;
   int res1 = 0 ;
   RectangularDetector *result = 0 ;
   
   if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
   {
-    res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__arrayT_std__shared_ptrT_IAxis_t_2_t,  0  | 0);
+    res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__arrayT_std__shared_ptrT_Scale_t_2_t,  0  | 0);
     if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_RectangularDetector" "', argument " "1"" of type '" "std::array< std::shared_ptr< IAxis >,2 >""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_RectangularDetector" "', argument " "1"" of type '" "std::array< std::shared_ptr< Scale >,2 >""'"); 
     }  
     if (!argp1) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_RectangularDetector" "', argument " "1"" of type '" "std::array< std::shared_ptr< IAxis >,2 >""'");
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_RectangularDetector" "', argument " "1"" of type '" "std::array< std::shared_ptr< Scale >,2 >""'");
     } else {
-      std::array< std::shared_ptr< IAxis >,2 > * temp = reinterpret_cast< std::array< std::shared_ptr< IAxis >,2 > * >(argp1);
+      std::array< std::shared_ptr< Scale >,2 > * temp = reinterpret_cast< std::array< std::shared_ptr< Scale >,2 > * >(argp1);
       arg1 = *temp;
       if (SWIG_IsNewObj(res1)) delete temp;
     }
@@ -34265,7 +34265,7 @@ SWIGINTERN PyObject *_wrap_new_RectangularDetector(PyObject *self, PyObject *arg
   --argc;
   if (argc == 1) {
     int _v = 0;
-    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__arrayT_std__shared_ptrT_IAxis_t_2_t, SWIG_POINTER_NO_NULL | 0);
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__arrayT_std__shared_ptrT_Scale_t_2_t, SWIG_POINTER_NO_NULL | 0);
     _v = SWIG_CheckState(res);
     if (_v) {
       return _wrap_new_RectangularDetector__SWIG_0(self, argc, argv);
@@ -34311,7 +34311,7 @@ SWIGINTERN PyObject *_wrap_new_RectangularDetector(PyObject *self, PyObject *arg
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_RectangularDetector'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    RectangularDetector::RectangularDetector(std::array< std::shared_ptr< IAxis >,2 >)\n"
+    "    RectangularDetector::RectangularDetector(std::array< std::shared_ptr< Scale >,2 >)\n"
     "    RectangularDetector::RectangularDetector(size_t,double,size_t,double)\n"
     "    RectangularDetector::RectangularDetector(RectangularDetector const &)\n");
   return 0;
@@ -35537,7 +35537,7 @@ SWIGINTERN PyObject *_wrap_OffspecDetector_axis(PyObject *self, PyObject *args)
   size_t val2 ;
   int ecode2 = 0 ;
   PyObject *swig_obj[2] ;
-  IAxis *result = 0 ;
+  Scale *result = 0 ;
   
   if (!SWIG_Python_UnpackTuple(args, "OffspecDetector_axis", 2, 2, swig_obj)) SWIG_fail;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_OffspecDetector, 0 |  0 );
@@ -35550,8 +35550,8 @@ SWIGINTERN PyObject *_wrap_OffspecDetector_axis(PyObject *self, PyObject *args)
     SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OffspecDetector_axis" "', argument " "2"" of type '" "size_t""'");
   } 
   arg2 = static_cast< size_t >(val2);
-  result = (IAxis *) &((OffspecDetector const *)arg1)->axis(arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAxis, 0 |  0 );
+  result = (Scale *) &((OffspecDetector const *)arg1)->axis(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Scale, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -35746,21 +35746,21 @@ SWIGINTERN PyObject *OffspecDetector_swiginit(PyObject *SWIGUNUSEDPARM(self), Py
 
 SWIGINTERN PyObject *_wrap_new_SphericalDetector__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  std::array< std::shared_ptr< IAxis >,2 > arg1 ;
+  std::array< std::shared_ptr< Scale >,2 > arg1 ;
   void *argp1 ;
   int res1 = 0 ;
   SphericalDetector *result = 0 ;
   
   if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
   {
-    res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__arrayT_std__shared_ptrT_IAxis_t_2_t,  0  | 0);
+    res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__arrayT_std__shared_ptrT_Scale_t_2_t,  0  | 0);
     if (!SWIG_IsOK(res1)) {
-      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SphericalDetector" "', argument " "1"" of type '" "std::array< std::shared_ptr< IAxis >,2 >""'"); 
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SphericalDetector" "', argument " "1"" of type '" "std::array< std::shared_ptr< Scale >,2 >""'"); 
     }  
     if (!argp1) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SphericalDetector" "', argument " "1"" of type '" "std::array< std::shared_ptr< IAxis >,2 >""'");
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SphericalDetector" "', argument " "1"" of type '" "std::array< std::shared_ptr< Scale >,2 >""'");
     } else {
-      std::array< std::shared_ptr< IAxis >,2 > * temp = reinterpret_cast< std::array< std::shared_ptr< IAxis >,2 > * >(argp1);
+      std::array< std::shared_ptr< Scale >,2 > * temp = reinterpret_cast< std::array< std::shared_ptr< Scale >,2 > * >(argp1);
       arg1 = *temp;
       if (SWIG_IsNewObj(res1)) delete temp;
     }
@@ -35913,7 +35913,7 @@ SWIGINTERN PyObject *_wrap_new_SphericalDetector(PyObject *self, PyObject *args)
   --argc;
   if (argc == 1) {
     int _v = 0;
-    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__arrayT_std__shared_ptrT_IAxis_t_2_t, SWIG_POINTER_NO_NULL | 0);
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__arrayT_std__shared_ptrT_Scale_t_2_t, SWIG_POINTER_NO_NULL | 0);
     _v = SWIG_CheckState(res);
     if (_v) {
       return _wrap_new_SphericalDetector__SWIG_0(self, argc, argv);
@@ -35999,7 +35999,7 @@ SWIGINTERN PyObject *_wrap_new_SphericalDetector(PyObject *self, PyObject *args)
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_SphericalDetector'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    SphericalDetector::SphericalDetector(std::array< std::shared_ptr< IAxis >,2 >)\n"
+    "    SphericalDetector::SphericalDetector(std::array< std::shared_ptr< Scale >,2 >)\n"
     "    SphericalDetector::SphericalDetector(size_t,double,double,size_t,double,double)\n"
     "    SphericalDetector::SphericalDetector(size_t,double,double,double)\n"
     "    SphericalDetector::SphericalDetector(SphericalDetector const &)\n");
@@ -37966,7 +37966,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "new_Datafield", _wrap_new_Datafield, METH_VARARGS, "\n"
 		"Datafield()\n"
 		"Datafield(Frame frame, vdouble1d_t values={}, vdouble1d_t errSigmas={})\n"
-		"Datafield(std::vector< IAxis const *,std::allocator< IAxis const * > > && axes, vdouble1d_t values={}, vdouble1d_t errSigmas={})\n"
+		"Datafield(std::vector< Scale const *,std::allocator< Scale const * > > && axes, vdouble1d_t values={}, vdouble1d_t errSigmas={})\n"
 		"Datafield(Datafield arg1)\n"
 		"new_Datafield(Datafield arg1) -> Datafield\n"
 		""},
@@ -37976,9 +37976,9 @@ static PyMethodDef SwigMethods[] = {
 	 { "Datafield_valAt", _wrap_Datafield_valAt, METH_VARARGS, "Datafield_valAt(Datafield self, size_t i) -> double"},
 	 { "Datafield_frame", _wrap_Datafield_frame, METH_O, "Datafield_frame(Datafield self) -> Frame"},
 	 { "Datafield_rank", _wrap_Datafield_rank, METH_O, "Datafield_rank(Datafield self) -> size_t"},
-	 { "Datafield_axis", _wrap_Datafield_axis, METH_VARARGS, "Datafield_axis(Datafield self, size_t k) -> IAxis"},
-	 { "Datafield_xAxis", _wrap_Datafield_xAxis, METH_O, "Datafield_xAxis(Datafield self) -> IAxis"},
-	 { "Datafield_yAxis", _wrap_Datafield_yAxis, METH_O, "Datafield_yAxis(Datafield self) -> IAxis"},
+	 { "Datafield_axis", _wrap_Datafield_axis, METH_VARARGS, "Datafield_axis(Datafield self, size_t k) -> Scale"},
+	 { "Datafield_xAxis", _wrap_Datafield_xAxis, METH_O, "Datafield_xAxis(Datafield self) -> Scale"},
+	 { "Datafield_yAxis", _wrap_Datafield_yAxis, METH_O, "Datafield_yAxis(Datafield self) -> Scale"},
 	 { "Datafield_size", _wrap_Datafield_size, METH_O, "Datafield_size(Datafield self) -> size_t"},
 	 { "Datafield_empty", _wrap_Datafield_empty, METH_O, "Datafield_empty(Datafield self) -> bool"},
 	 { "Datafield_flatVector", _wrap_Datafield_flatVector, METH_O, "Datafield_flatVector(Datafield self) -> vdouble1d_t"},
@@ -38156,7 +38156,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "MaskPattern_swiginit", MaskPattern_swiginit, METH_VARARGS, NULL},
 	 { "delete_DetectorMask", _wrap_delete_DetectorMask, METH_O, "delete_DetectorMask(DetectorMask self)"},
 	 { "new_DetectorMask", _wrap_new_DetectorMask, METH_VARARGS, "\n"
-		"DetectorMask(IAxis xAxis, IAxis yAxis)\n"
+		"DetectorMask(Scale xAxis, Scale yAxis)\n"
 		"new_DetectorMask(DetectorMask other) -> DetectorMask\n"
 		""},
 	 { "DetectorMask_addMask", _wrap_DetectorMask_addMask, METH_VARARGS, "DetectorMask_addMask(DetectorMask self, IShape2D shape, bool mask_value)"},
@@ -38184,12 +38184,12 @@ static PyMethodDef SwigMethods[] = {
 	 { "IDetector_active_indices", _wrap_IDetector_active_indices, METH_O, "IDetector_active_indices(IDetector self) -> std::vector< size_t,std::allocator< size_t > >"},
 	 { "IDetector_createPixel", _wrap_IDetector_createPixel, METH_VARARGS, "IDetector_createPixel(IDetector self, size_t index) -> IPixel const *"},
 	 { "IDetector_indexOfSpecular", _wrap_IDetector_indexOfSpecular, METH_VARARGS, "IDetector_indexOfSpecular(IDetector self, Beam beam) -> size_t"},
-	 { "IDetector_axis", _wrap_IDetector_axis, METH_VARARGS, "IDetector_axis(IDetector self, size_t index) -> IAxis"},
+	 { "IDetector_axis", _wrap_IDetector_axis, METH_VARARGS, "IDetector_axis(IDetector self, size_t index) -> Scale"},
 	 { "IDetector_axisBinIndex", _wrap_IDetector_axisBinIndex, METH_VARARGS, "IDetector_axisBinIndex(IDetector self, size_t index, size_t selected_axis) -> size_t"},
 	 { "IDetector_totalSize", _wrap_IDetector_totalSize, METH_O, "IDetector_totalSize(IDetector self) -> size_t"},
 	 { "IDetector_sizeOfRegionOfInterest", _wrap_IDetector_sizeOfRegionOfInterest, METH_O, "IDetector_sizeOfRegionOfInterest(IDetector self) -> size_t"},
 	 { "IDetector_hasExplicitRegionOfInterest", _wrap_IDetector_hasExplicitRegionOfInterest, METH_O, "IDetector_hasExplicitRegionOfInterest(IDetector self) -> bool"},
-	 { "IDetector_axesClippedToRegionOfInterest", _wrap_IDetector_axesClippedToRegionOfInterest, METH_O, "IDetector_axesClippedToRegionOfInterest(IDetector self) -> std::vector< IAxis const *,std::allocator< IAxis const * > >"},
+	 { "IDetector_axesClippedToRegionOfInterest", _wrap_IDetector_axesClippedToRegionOfInterest, METH_O, "IDetector_axesClippedToRegionOfInterest(IDetector self) -> std::vector< Scale const *,std::allocator< Scale const * > >"},
 	 { "IDetector_regionOfInterestIndexToDetectorIndex", _wrap_IDetector_regionOfInterestIndexToDetectorIndex, METH_VARARGS, "IDetector_regionOfInterestIndexToDetectorIndex(IDetector self, size_t regionOfInterestIndex) -> size_t"},
 	 { "IDetector_applyDetectorResolution", _wrap_IDetector_applyDetectorResolution, METH_VARARGS, "IDetector_applyDetectorResolution(IDetector self, Datafield intensity_map)"},
 	 { "IDetector_detectorResolution", _wrap_IDetector_detectorResolution, METH_O, "IDetector_detectorResolution(IDetector self) -> IDetectorResolution"},
@@ -38197,7 +38197,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "IDetector_regionOfInterestBounds", _wrap_IDetector_regionOfInterestBounds, METH_VARARGS, "IDetector_regionOfInterestBounds(IDetector self, size_t iAxis) -> pvacuum_double_t"},
 	 { "IDetector_swigregister", IDetector_swigregister, METH_O, NULL},
 	 { "new_RectangularDetector", _wrap_new_RectangularDetector, METH_VARARGS, "\n"
-		"RectangularDetector(std::array< std::shared_ptr< IAxis >,2 > axes)\n"
+		"RectangularDetector(std::array< std::shared_ptr< Scale >,2 > axes)\n"
 		"RectangularDetector(size_t nxbins, double width, size_t nybins, double height)\n"
 		"new_RectangularDetector(RectangularDetector other) -> RectangularDetector\n"
 		""},
@@ -38234,7 +38234,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "OffspecDetector_clone", _wrap_OffspecDetector_clone, METH_O, "OffspecDetector_clone(OffspecDetector self) -> OffspecDetector"},
 	 { "OffspecDetector_className", _wrap_OffspecDetector_className, METH_O, "OffspecDetector_className(OffspecDetector self) -> std::string"},
 	 { "OffspecDetector_setAnalyzer", _wrap_OffspecDetector_setAnalyzer, METH_VARARGS, "OffspecDetector_setAnalyzer(OffspecDetector self, R3 direction, double efficiency, double total_transmission)"},
-	 { "OffspecDetector_axis", _wrap_OffspecDetector_axis, METH_VARARGS, "OffspecDetector_axis(OffspecDetector self, size_t index) -> IAxis"},
+	 { "OffspecDetector_axis", _wrap_OffspecDetector_axis, METH_VARARGS, "OffspecDetector_axis(OffspecDetector self, size_t index) -> Scale"},
 	 { "OffspecDetector_axisBinIndex", _wrap_OffspecDetector_axisBinIndex, METH_VARARGS, "OffspecDetector_axisBinIndex(OffspecDetector self, size_t index, size_t selected_axis) -> size_t"},
 	 { "OffspecDetector_totalSize", _wrap_OffspecDetector_totalSize, METH_O, "OffspecDetector_totalSize(OffspecDetector self) -> size_t"},
 	 { "OffspecDetector_defaultCoords", _wrap_OffspecDetector_defaultCoords, METH_O, "OffspecDetector_defaultCoords(OffspecDetector self) -> Coords"},
@@ -38244,7 +38244,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "OffspecDetector_swigregister", OffspecDetector_swigregister, METH_O, NULL},
 	 { "OffspecDetector_swiginit", OffspecDetector_swiginit, METH_VARARGS, NULL},
 	 { "new_SphericalDetector", _wrap_new_SphericalDetector, METH_VARARGS, "\n"
-		"SphericalDetector(std::array< std::shared_ptr< IAxis >,2 > axes)\n"
+		"SphericalDetector(std::array< std::shared_ptr< Scale >,2 > axes)\n"
 		"SphericalDetector(size_t n_phi, double phi_min, double phi_max, size_t n_alpha, double alpha_min, double alpha_max)\n"
 		"SphericalDetector(size_t n_bin, double width, double phi, double alpha)\n"
 		"new_SphericalDetector(SphericalDetector other) -> SphericalDetector\n"
@@ -38421,7 +38421,6 @@ static swig_type_info _swigt__p_FootprintGauss = {"_p_FootprintGauss", "Footprin
 static swig_type_info _swigt__p_FootprintSquare = {"_p_FootprintSquare", "FootprintSquare *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Frame = {"_p_Frame", "Frame *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_HorizontalLine = {"_p_HorizontalLine", "HorizontalLine *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_IAxis = {"_p_IAxis", "IAxis *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ICloneable = {"_p_ICloneable", "ICloneable *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ICoordSystem = {"_p_ICoordSystem", "ICoordSystem *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IDetector = {"_p_IDetector", "IDetector *", 0, 0, (void*)0, 0};
@@ -38443,6 +38442,7 @@ static swig_type_info _swigt__p_RectangularDetector = {"_p_RectangularDetector",
 static swig_type_info _swigt__p_RectangularPixel = {"_p_RectangularPixel", "RectangularPixel *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ResolutionFunction2DGaussian = {"_p_ResolutionFunction2DGaussian", "ResolutionFunction2DGaussian *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Rotation3DT_double_t = {"_p_Rotation3DT_double_t", "RotMatrix *|Rotation3D< double > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Scale = {"_p_Scale", "Scale *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_SimulationResult = {"_p_SimulationResult", "SimulationResult *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_SphericalDetector = {"_p_SphericalDetector", "SphericalDetector *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Vec3T_double_t = {"_p_Vec3T_double_t", "R3 *|std::vector< Vec3< double > >::value_type *|Vec3< double > *", 0, 0, (void*)0, 0};
@@ -38476,16 +38476,16 @@ static swig_type_info _swigt__p_std__allocatorT_std__string_t = {"_p_std__alloca
 static swig_type_info _swigt__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t = {"_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t", "std::vector< std::vector< double > >::allocator_type *|std::allocator< std::vector< double,std::allocator< double > > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t = {"_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t", "std::vector< std::vector< int > >::allocator_type *|std::allocator< std::vector< int,std::allocator< int > > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__allocatorT_unsigned_long_t = {"_p_std__allocatorT_unsigned_long_t", "std::vector< unsigned long >::allocator_type *|std::allocator< unsigned long > *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_std__arrayT_std__shared_ptrT_IAxis_t_2_t = {"_p_std__arrayT_std__shared_ptrT_IAxis_t_2_t", "std::array< std::shared_ptr< IAxis >,2 > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__arrayT_std__shared_ptrT_Scale_t_2_t = {"_p_std__arrayT_std__shared_ptrT_Scale_t_2_t", "std::array< std::shared_ptr< Scale >,2 > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__complexT_double_t = {"_p_std__complexT_double_t", "complex_t *|std::complex< double > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__functionT_void_fSimulationAreaIterator_const_RF_t = {"_p_std__functionT_void_fSimulationAreaIterator_const_RF_t", "std::function< void (IDetector::const_iterator) > *|std::function< void (SimulationAreaIterator const &) > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__invalid_argument = {"_p_std__invalid_argument", "std::invalid_argument *", 0, 0, (void*)0, 0};
 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_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t = {"_p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t", "std::vector< IAxis const *,std::allocator< IAxis const * > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t = {"_p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t", "std::vector< INode const *,std::allocator< INode const * > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t = {"_p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t", "std::vector< ParaMeta,std::allocator< ParaMeta > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_Scale_const_p_std__allocatorT_Scale_const_p_t_t = {"_p_std__vectorT_Scale_const_p_std__allocatorT_Scale_const_p_t_t", "std::vector< Scale const *,std::allocator< Scale const * > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_Vec3T_double_t_std__allocatorT_Vec3T_double_t_t_t = {"_p_std__vectorT_Vec3T_double_t_std__allocatorT_Vec3T_double_t_t_t", "std::vector< Vec3< double >,std::allocator< Vec3< double > > > *|std::vector< Vec3< double > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_double_std__allocatorT_double_t_t = {"_p_std__vectorT_double_std__allocatorT_double_t_t", "std::vector< double,std::allocator< double > > *|std::vector< double > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_int_std__allocatorT_int_t_t = {"_p_std__vectorT_int_std__allocatorT_int_t_t", "std::vector< int,std::allocator< int > > *|std::vector< int > *", 0, 0, (void*)0, 0};
@@ -38514,7 +38514,6 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_FootprintSquare,
   &_swigt__p_Frame,
   &_swigt__p_HorizontalLine,
-  &_swigt__p_IAxis,
   &_swigt__p_ICloneable,
   &_swigt__p_ICoordSystem,
   &_swigt__p_IDetector,
@@ -38536,6 +38535,7 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_RectangularPixel,
   &_swigt__p_ResolutionFunction2DGaussian,
   &_swigt__p_Rotation3DT_double_t,
+  &_swigt__p_Scale,
   &_swigt__p_SimulationResult,
   &_swigt__p_SphericalDetector,
   &_swigt__p_Vec3T_double_t,
@@ -38569,16 +38569,16 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t,
   &_swigt__p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t,
   &_swigt__p_std__allocatorT_unsigned_long_t,
-  &_swigt__p_std__arrayT_std__shared_ptrT_IAxis_t_2_t,
+  &_swigt__p_std__arrayT_std__shared_ptrT_Scale_t_2_t,
   &_swigt__p_std__complexT_double_t,
   &_swigt__p_std__functionT_void_fSimulationAreaIterator_const_RF_t,
   &_swigt__p_std__invalid_argument,
   &_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_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t,
   &_swigt__p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t,
   &_swigt__p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t,
+  &_swigt__p_std__vectorT_Scale_const_p_std__allocatorT_Scale_const_p_t_t,
   &_swigt__p_std__vectorT_Vec3T_double_t_std__allocatorT_Vec3T_double_t_t_t,
   &_swigt__p_std__vectorT_double_std__allocatorT_double_t_t,
   &_swigt__p_std__vectorT_int_std__allocatorT_int_t_t,
@@ -38607,7 +38607,6 @@ static swig_cast_info _swigc__p_FootprintGauss[] = {  {&_swigt__p_FootprintGauss
 static swig_cast_info _swigc__p_FootprintSquare[] = {  {&_swigt__p_FootprintSquare, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Frame[] = {  {&_swigt__p_Frame, 0, 0, 0},{0, 0, 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_ICloneable[] = {  {&_swigt__p_ICloneable, 0, 0, 0},  {&_swigt__p_Ellipse, _p_EllipseTo_p_ICloneable, 0, 0},  {&_swigt__p_FootprintGauss, _p_FootprintGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FootprintSquare, _p_FootprintSquareTo_p_ICloneable, 0, 0},  {&_swigt__p_Frame, _p_FrameTo_p_ICloneable, 0, 0},  {&_swigt__p_HorizontalLine, _p_HorizontalLineTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetector, _p_IDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_IDetectorResolution, _p_IDetectorResolutionTo_p_ICloneable, 0, 0},  {&_swigt__p_IFootprintFactor, _p_IFootprintFactorTo_p_ICloneable, 0, 0},  {&_swigt__p_IResolutionFunction2D, _p_IResolutionFunction2DTo_p_ICloneable, 0, 0},  {&_swigt__p_IShape2D, _p_IShape2DTo_p_ICloneable, 0, 0},  {&_swigt__p_Line, _p_LineTo_p_ICloneable, 0, 0},  {&_swigt__p_Polygon, _p_PolygonTo_p_ICloneable, 0, 0},  {&_swigt__p_Rectangle, _p_RectangleTo_p_ICloneable, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_ICloneable, 0, 0},  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_ICloneable, 0, 0},  {&_swigt__p_VerticalLine, _p_VerticalLineTo_p_ICloneable, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ICoordSystem[] = {  {&_swigt__p_ICoordSystem, 0, 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},{0, 0, 0, 0}};
@@ -38629,6 +38628,7 @@ static swig_cast_info _swigc__p_RectangularDetector[] = {  {&_swigt__p_Rectangul
 static swig_cast_info _swigc__p_RectangularPixel[] = {  {&_swigt__p_RectangularPixel, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ResolutionFunction2DGaussian[] = {  {&_swigt__p_ResolutionFunction2DGaussian, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Rotation3DT_double_t[] = {  {&_swigt__p_Rotation3DT_double_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Scale[] = {  {&_swigt__p_Scale, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_SimulationResult[] = {  {&_swigt__p_SimulationResult, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_SphericalDetector[] = {  {&_swigt__p_SphericalDetector, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Vec3T_double_t[] = {  {&_swigt__p_Vec3T_double_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -38662,16 +38662,16 @@ static swig_cast_info _swigc__p_std__allocatorT_std__string_t[] = {  {&_swigt__p
 static swig_cast_info _swigc__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t[] = {  {&_swigt__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t[] = {  {&_swigt__p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__allocatorT_unsigned_long_t[] = {  {&_swigt__p_std__allocatorT_unsigned_long_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_std__arrayT_std__shared_ptrT_IAxis_t_2_t[] = {  {&_swigt__p_std__arrayT_std__shared_ptrT_IAxis_t_2_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__arrayT_std__shared_ptrT_Scale_t_2_t[] = {  {&_swigt__p_std__arrayT_std__shared_ptrT_Scale_t_2_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__complexT_double_t[] = {  {&_swigt__p_std__complexT_double_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__functionT_void_fSimulationAreaIterator_const_RF_t[] = {  {&_swigt__p_std__functionT_void_fSimulationAreaIterator_const_RF_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__invalid_argument[] = {  {&_swigt__p_std__invalid_argument, 0, 0, 0},{0, 0, 0, 0}};
 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_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t[] = {  {&_swigt__p_std__vectorT_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t[] = {  {&_swigt__p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t[] = {  {&_swigt__p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_Scale_const_p_std__allocatorT_Scale_const_p_t_t[] = {  {&_swigt__p_std__vectorT_Scale_const_p_std__allocatorT_Scale_const_p_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_Vec3T_double_t_std__allocatorT_Vec3T_double_t_t_t[] = {  {&_swigt__p_std__vectorT_Vec3T_double_t_std__allocatorT_Vec3T_double_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_double_std__allocatorT_double_t_t[] = {  {&_swigt__p_std__vectorT_double_std__allocatorT_double_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_int_std__allocatorT_int_t_t[] = {  {&_swigt__p_std__vectorT_int_std__allocatorT_int_t_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -38700,7 +38700,6 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_FootprintSquare,
   _swigc__p_Frame,
   _swigc__p_HorizontalLine,
-  _swigc__p_IAxis,
   _swigc__p_ICloneable,
   _swigc__p_ICoordSystem,
   _swigc__p_IDetector,
@@ -38722,6 +38721,7 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_RectangularPixel,
   _swigc__p_ResolutionFunction2DGaussian,
   _swigc__p_Rotation3DT_double_t,
+  _swigc__p_Scale,
   _swigc__p_SimulationResult,
   _swigc__p_SphericalDetector,
   _swigc__p_Vec3T_double_t,
@@ -38755,16 +38755,16 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t,
   _swigc__p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t,
   _swigc__p_std__allocatorT_unsigned_long_t,
-  _swigc__p_std__arrayT_std__shared_ptrT_IAxis_t_2_t,
+  _swigc__p_std__arrayT_std__shared_ptrT_Scale_t_2_t,
   _swigc__p_std__complexT_double_t,
   _swigc__p_std__functionT_void_fSimulationAreaIterator_const_RF_t,
   _swigc__p_std__invalid_argument,
   _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_IAxis_const_p_std__allocatorT_IAxis_const_p_t_t,
   _swigc__p_std__vectorT_INode_const_p_std__allocatorT_INode_const_p_t_t,
   _swigc__p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t,
+  _swigc__p_std__vectorT_Scale_const_p_std__allocatorT_Scale_const_p_t_t,
   _swigc__p_std__vectorT_Vec3T_double_t_std__allocatorT_Vec3T_double_t_t_t,
   _swigc__p_std__vectorT_double_std__allocatorT_double_t_t,
   _swigc__p_std__vectorT_int_std__allocatorT_int_t_t,
diff --git a/auto/Wrap/libBornAgainSim.py b/auto/Wrap/libBornAgainSim.py
index d54590e296d..a68ad4db256 100644
--- a/auto/Wrap/libBornAgainSim.py
+++ b/auto/Wrap/libBornAgainSim.py
@@ -2573,7 +2573,7 @@ class AlphaScan(IBeamScan):
 
     def __init__(self, *args):
         r"""
-        __init__(AlphaScan self, IAxis alpha_axis) -> AlphaScan
+        __init__(AlphaScan self, Scale alpha_axis) -> AlphaScan
         __init__(AlphaScan self, int nbins, double alpha_i_min, double alpha_i_max) -> AlphaScan
         """
         _libBornAgainSim.AlphaScan_swiginit(self, _libBornAgainSim.new_AlphaScan(*args))
@@ -2618,7 +2618,7 @@ class QzScan(IBeamScan):
     def __init__(self, *args):
         r"""
         __init__(QzScan self, vdouble1d_t qs_nm) -> QzScan
-        __init__(QzScan self, IAxis qs_nm) -> QzScan
+        __init__(QzScan self, Scale qs_nm) -> QzScan
         __init__(QzScan self, int nbins, double qz_min, double qz_max) -> QzScan
         """
         _libBornAgainSim.QzScan_swiginit(self, _libBornAgainSim.new_QzScan(*args))
@@ -2722,7 +2722,7 @@ class DepthprobeSimulation(ISimulation):
     __repr__ = _swig_repr
 
     def __init__(self, scan, sample, zaxis, flags=0):
-        r"""__init__(DepthprobeSimulation self, IBeamScan scan, MultiLayer const & sample, IAxis zaxis, int flags=0) -> DepthprobeSimulation"""
+        r"""__init__(DepthprobeSimulation self, IBeamScan scan, MultiLayer const & sample, Scale zaxis, int flags=0) -> DepthprobeSimulation"""
         _libBornAgainSim.DepthprobeSimulation_swiginit(self, _libBornAgainSim.new_DepthprobeSimulation(scan, sample, zaxis, flags))
     __swig_destroy__ = _libBornAgainSim.delete_DepthprobeSimulation
 
diff --git a/auto/Wrap/libBornAgainSim_wrap.cpp b/auto/Wrap/libBornAgainSim_wrap.cpp
index 7e680b55513..d9924e7b0be 100644
--- a/auto/Wrap/libBornAgainSim_wrap.cpp
+++ b/auto/Wrap/libBornAgainSim_wrap.cpp
@@ -3393,30 +3393,30 @@ namespace Swig {
 #define SWIGTYPE_p_DepthprobeSimulation swig_types[4]
 #define SWIGTYPE_p_FitObjective swig_types[5]
 #define SWIGTYPE_p_Frame swig_types[6]
-#define SWIGTYPE_p_IAxis swig_types[7]
-#define SWIGTYPE_p_IBackground swig_types[8]
-#define SWIGTYPE_p_IBeamScan swig_types[9]
-#define SWIGTYPE_p_IChiSquaredModule swig_types[10]
-#define SWIGTYPE_p_ICloneable swig_types[11]
-#define SWIGTYPE_p_IDetector swig_types[12]
-#define SWIGTYPE_p_IDistribution1D swig_types[13]
-#define SWIGTYPE_p_IFootprintFactor swig_types[14]
-#define SWIGTYPE_p_IIntensityFunction swig_types[15]
-#define SWIGTYPE_p_INode swig_types[16]
-#define SWIGTYPE_p_ISampleNode swig_types[17]
-#define SWIGTYPE_p_ISimulation swig_types[18]
-#define SWIGTYPE_p_IVarianceFunction swig_types[19]
-#define SWIGTYPE_p_IntensityFunctionLog swig_types[20]
-#define SWIGTYPE_p_IntensityFunctionSqrt swig_types[21]
-#define SWIGTYPE_p_IterationInfo swig_types[22]
-#define SWIGTYPE_p_MultiLayer swig_types[23]
-#define SWIGTYPE_p_OffspecDetector swig_types[24]
-#define SWIGTYPE_p_OffspecSimulation swig_types[25]
-#define SWIGTYPE_p_PoissonBackground swig_types[26]
-#define SWIGTYPE_p_PyBuilderCallback swig_types[27]
-#define SWIGTYPE_p_PyObserverCallback swig_types[28]
-#define SWIGTYPE_p_QzScan swig_types[29]
-#define SWIGTYPE_p_Rotation3DT_double_t swig_types[30]
+#define SWIGTYPE_p_IBackground swig_types[7]
+#define SWIGTYPE_p_IBeamScan swig_types[8]
+#define SWIGTYPE_p_IChiSquaredModule swig_types[9]
+#define SWIGTYPE_p_ICloneable swig_types[10]
+#define SWIGTYPE_p_IDetector swig_types[11]
+#define SWIGTYPE_p_IDistribution1D swig_types[12]
+#define SWIGTYPE_p_IFootprintFactor swig_types[13]
+#define SWIGTYPE_p_IIntensityFunction swig_types[14]
+#define SWIGTYPE_p_INode swig_types[15]
+#define SWIGTYPE_p_ISampleNode swig_types[16]
+#define SWIGTYPE_p_ISimulation swig_types[17]
+#define SWIGTYPE_p_IVarianceFunction swig_types[18]
+#define SWIGTYPE_p_IntensityFunctionLog swig_types[19]
+#define SWIGTYPE_p_IntensityFunctionSqrt swig_types[20]
+#define SWIGTYPE_p_IterationInfo swig_types[21]
+#define SWIGTYPE_p_MultiLayer swig_types[22]
+#define SWIGTYPE_p_OffspecDetector swig_types[23]
+#define SWIGTYPE_p_OffspecSimulation swig_types[24]
+#define SWIGTYPE_p_PoissonBackground swig_types[25]
+#define SWIGTYPE_p_PyBuilderCallback swig_types[26]
+#define SWIGTYPE_p_PyObserverCallback swig_types[27]
+#define SWIGTYPE_p_QzScan swig_types[28]
+#define SWIGTYPE_p_Rotation3DT_double_t swig_types[29]
+#define SWIGTYPE_p_Scale swig_types[30]
 #define SWIGTYPE_p_ScatteringSimulation swig_types[31]
 #define SWIGTYPE_p_SimulationOptions swig_types[32]
 #define SWIGTYPE_p_SimulationResult swig_types[33]
@@ -7014,7 +7014,7 @@ SWIGINTERN void std_vector_Sl_std_pair_Sl_double_Sc_double_Sg__Sg__insert__SWIG_
 
 #include "BAVersion.h"
 
-#include "Base/Axis/IAxis.h"
+#include "Base/Axis/Scale.h"
 #include "Base/Axis/Frame.h"
 
 #include "Device/Histo/SimulationResult.h"
@@ -32157,21 +32157,21 @@ SWIGINTERN PyObject *IBeamScan_swigregister(PyObject *SWIGUNUSEDPARM(self), PyOb
 
 SWIGINTERN PyObject *_wrap_new_AlphaScan__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  IAxis *arg1 = 0 ;
+  Scale *arg1 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   AlphaScan *result = 0 ;
   
   if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_IAxis,  0  | 0);
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_Scale,  0  | 0);
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_AlphaScan" "', argument " "1"" of type '" "IAxis const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_AlphaScan" "', argument " "1"" of type '" "Scale const &""'"); 
   }
   if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_AlphaScan" "', argument " "1"" of type '" "IAxis const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_AlphaScan" "', argument " "1"" of type '" "Scale const &""'"); 
   }
-  arg1 = reinterpret_cast< IAxis * >(argp1);
-  result = (AlphaScan *)new AlphaScan((IAxis const &)*arg1);
+  arg1 = reinterpret_cast< Scale * >(argp1);
+  result = (AlphaScan *)new AlphaScan((Scale const &)*arg1);
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AlphaScan, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
@@ -32226,7 +32226,7 @@ SWIGINTERN PyObject *_wrap_new_AlphaScan(PyObject *self, PyObject *args) {
   --argc;
   if (argc == 1) {
     int _v = 0;
-    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IAxis, SWIG_POINTER_NO_NULL | 0);
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_Scale, SWIG_POINTER_NO_NULL | 0);
     _v = SWIG_CheckState(res);
     if (_v) {
       return _wrap_new_AlphaScan__SWIG_0(self, argc, argv);
@@ -32258,7 +32258,7 @@ SWIGINTERN PyObject *_wrap_new_AlphaScan(PyObject *self, PyObject *args) {
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_AlphaScan'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    AlphaScan::AlphaScan(IAxis const &)\n"
+    "    AlphaScan::AlphaScan(Scale const &)\n"
     "    AlphaScan::AlphaScan(int,double,double)\n");
   return 0;
 }
@@ -32513,21 +32513,21 @@ fail:
 
 SWIGINTERN PyObject *_wrap_new_QzScan__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
-  IAxis *arg1 = 0 ;
+  Scale *arg1 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   QzScan *result = 0 ;
   
   if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_IAxis,  0  | 0);
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_Scale,  0  | 0);
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_QzScan" "', argument " "1"" of type '" "IAxis const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_QzScan" "', argument " "1"" of type '" "Scale const &""'"); 
   }
   if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_QzScan" "', argument " "1"" of type '" "IAxis const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_QzScan" "', argument " "1"" of type '" "Scale const &""'"); 
   }
-  arg1 = reinterpret_cast< IAxis * >(argp1);
-  result = (QzScan *)new QzScan((IAxis const &)*arg1);
+  arg1 = reinterpret_cast< Scale * >(argp1);
+  result = (QzScan *)new QzScan((Scale const &)*arg1);
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_QzScan, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
@@ -32582,7 +32582,7 @@ SWIGINTERN PyObject *_wrap_new_QzScan(PyObject *self, PyObject *args) {
   --argc;
   if (argc == 1) {
     int _v = 0;
-    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IAxis, SWIG_POINTER_NO_NULL | 0);
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_Scale, SWIG_POINTER_NO_NULL | 0);
     _v = SWIG_CheckState(res);
     if (_v) {
       return _wrap_new_QzScan__SWIG_1(self, argc, argv);
@@ -32623,7 +32623,7 @@ fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_QzScan'.\n"
     "  Possible C/C++ prototypes are:\n"
     "    QzScan::QzScan(std::vector< double,std::allocator< double > >)\n"
-    "    QzScan::QzScan(IAxis const &)\n"
+    "    QzScan::QzScan(Scale const &)\n"
     "    QzScan::QzScan(int,double,double)\n");
   return 0;
 }
@@ -33322,7 +33322,7 @@ SWIGINTERN PyObject *_wrap_new_DepthprobeSimulation__SWIG_0(PyObject *self, Py_s
   PyObject *resultobj = 0;
   IBeamScan *arg1 = 0 ;
   MultiLayer *arg2 = 0 ;
-  IAxis *arg3 = 0 ;
+  Scale *arg3 = 0 ;
   int arg4 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
@@ -33351,20 +33351,20 @@ SWIGINTERN PyObject *_wrap_new_DepthprobeSimulation__SWIG_0(PyObject *self, Py_s
     SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_DepthprobeSimulation" "', argument " "2"" of type '" "MultiLayer const &""'"); 
   }
   arg2 = reinterpret_cast< MultiLayer * >(argp2);
-  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_IAxis,  0  | 0);
+  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_Scale,  0  | 0);
   if (!SWIG_IsOK(res3)) {
-    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_DepthprobeSimulation" "', argument " "3"" of type '" "IAxis const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_DepthprobeSimulation" "', argument " "3"" of type '" "Scale const &""'"); 
   }
   if (!argp3) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_DepthprobeSimulation" "', argument " "3"" of type '" "IAxis const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_DepthprobeSimulation" "', argument " "3"" of type '" "Scale const &""'"); 
   }
-  arg3 = reinterpret_cast< IAxis * >(argp3);
+  arg3 = reinterpret_cast< Scale * >(argp3);
   ecode4 = SWIG_AsVal_int(swig_obj[3], &val4);
   if (!SWIG_IsOK(ecode4)) {
     SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_DepthprobeSimulation" "', argument " "4"" of type '" "int""'");
   } 
   arg4 = static_cast< int >(val4);
-  result = (DepthprobeSimulation *)new DepthprobeSimulation((IBeamScan const &)*arg1,(MultiLayer const &)*arg2,(IAxis const &)*arg3,arg4);
+  result = (DepthprobeSimulation *)new DepthprobeSimulation((IBeamScan const &)*arg1,(MultiLayer const &)*arg2,(Scale const &)*arg3,arg4);
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DepthprobeSimulation, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
@@ -33376,7 +33376,7 @@ SWIGINTERN PyObject *_wrap_new_DepthprobeSimulation__SWIG_1(PyObject *self, Py_s
   PyObject *resultobj = 0;
   IBeamScan *arg1 = 0 ;
   MultiLayer *arg2 = 0 ;
-  IAxis *arg3 = 0 ;
+  Scale *arg3 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   void *argp2 = 0 ;
@@ -33402,15 +33402,15 @@ SWIGINTERN PyObject *_wrap_new_DepthprobeSimulation__SWIG_1(PyObject *self, Py_s
     SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_DepthprobeSimulation" "', argument " "2"" of type '" "MultiLayer const &""'"); 
   }
   arg2 = reinterpret_cast< MultiLayer * >(argp2);
-  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_IAxis,  0  | 0);
+  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_Scale,  0  | 0);
   if (!SWIG_IsOK(res3)) {
-    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_DepthprobeSimulation" "', argument " "3"" of type '" "IAxis const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_DepthprobeSimulation" "', argument " "3"" of type '" "Scale const &""'"); 
   }
   if (!argp3) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_DepthprobeSimulation" "', argument " "3"" of type '" "IAxis const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_DepthprobeSimulation" "', argument " "3"" of type '" "Scale const &""'"); 
   }
-  arg3 = reinterpret_cast< IAxis * >(argp3);
-  result = (DepthprobeSimulation *)new DepthprobeSimulation((IBeamScan const &)*arg1,(MultiLayer const &)*arg2,(IAxis const &)*arg3);
+  arg3 = reinterpret_cast< Scale * >(argp3);
+  result = (DepthprobeSimulation *)new DepthprobeSimulation((IBeamScan const &)*arg1,(MultiLayer const &)*arg2,(Scale const &)*arg3);
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DepthprobeSimulation, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
@@ -33434,7 +33434,7 @@ SWIGINTERN PyObject *_wrap_new_DepthprobeSimulation(PyObject *self, PyObject *ar
       int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_MultiLayer, SWIG_POINTER_NO_NULL | 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_IAxis, SWIG_POINTER_NO_NULL | 0);
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_Scale, SWIG_POINTER_NO_NULL | 0);
         _v = SWIG_CheckState(res);
         if (_v) {
           return _wrap_new_DepthprobeSimulation__SWIG_1(self, argc, argv);
@@ -33450,7 +33450,7 @@ SWIGINTERN PyObject *_wrap_new_DepthprobeSimulation(PyObject *self, PyObject *ar
       int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_MultiLayer, SWIG_POINTER_NO_NULL | 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_IAxis, SWIG_POINTER_NO_NULL | 0);
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_Scale, SWIG_POINTER_NO_NULL | 0);
         _v = SWIG_CheckState(res);
         if (_v) {
           {
@@ -33468,8 +33468,8 @@ SWIGINTERN PyObject *_wrap_new_DepthprobeSimulation(PyObject *self, PyObject *ar
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_DepthprobeSimulation'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    DepthprobeSimulation::DepthprobeSimulation(IBeamScan const &,MultiLayer const &,IAxis const &,int)\n"
-    "    DepthprobeSimulation::DepthprobeSimulation(IBeamScan const &,MultiLayer const &,IAxis const &)\n");
+    "    DepthprobeSimulation::DepthprobeSimulation(IBeamScan const &,MultiLayer const &,Scale const &,int)\n"
+    "    DepthprobeSimulation::DepthprobeSimulation(IBeamScan const &,MultiLayer const &,Scale const &)\n");
   return 0;
 }
 
@@ -36121,7 +36121,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "IBeamScan_setFootprint", _wrap_IBeamScan_setFootprint, METH_VARARGS, "IBeamScan_setFootprint(IBeamScan self, IFootprintFactor const * footprint)"},
 	 { "IBeamScan_swigregister", IBeamScan_swigregister, METH_O, NULL},
 	 { "new_AlphaScan", _wrap_new_AlphaScan, METH_VARARGS, "\n"
-		"AlphaScan(IAxis alpha_axis)\n"
+		"AlphaScan(Scale alpha_axis)\n"
 		"new_AlphaScan(int nbins, double alpha_i_min, double alpha_i_max) -> AlphaScan\n"
 		""},
 	 { "delete_AlphaScan", _wrap_delete_AlphaScan, METH_O, "delete_AlphaScan(AlphaScan self)"},
@@ -36136,7 +36136,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "AlphaScan_swiginit", AlphaScan_swiginit, METH_VARARGS, NULL},
 	 { "new_QzScan", _wrap_new_QzScan, METH_VARARGS, "\n"
 		"QzScan(vdouble1d_t qs_nm)\n"
-		"QzScan(IAxis qs_nm)\n"
+		"QzScan(Scale qs_nm)\n"
 		"new_QzScan(int nbins, double qz_min, double qz_max) -> QzScan\n"
 		""},
 	 { "delete_QzScan", _wrap_delete_QzScan, METH_O, "delete_QzScan(QzScan self)"},
@@ -36164,7 +36164,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "ScatteringSimulation_detector", _wrap_ScatteringSimulation_detector, METH_O, "ScatteringSimulation_detector(ScatteringSimulation self) -> IDetector &"},
 	 { "ScatteringSimulation_swigregister", ScatteringSimulation_swigregister, METH_O, NULL},
 	 { "ScatteringSimulation_swiginit", ScatteringSimulation_swiginit, METH_VARARGS, NULL},
-	 { "new_DepthprobeSimulation", _wrap_new_DepthprobeSimulation, METH_VARARGS, "DepthprobeSimulation(IBeamScan scan, MultiLayer const & sample, IAxis zaxis, int flags=0)"},
+	 { "new_DepthprobeSimulation", _wrap_new_DepthprobeSimulation, METH_VARARGS, "DepthprobeSimulation(IBeamScan scan, MultiLayer const & sample, Scale zaxis, int flags=0)"},
 	 { "delete_DepthprobeSimulation", _wrap_delete_DepthprobeSimulation, METH_O, "delete_DepthprobeSimulation(DepthprobeSimulation self)"},
 	 { "DepthprobeSimulation_className", _wrap_DepthprobeSimulation_className, METH_O, "DepthprobeSimulation_className(DepthprobeSimulation self) -> std::string"},
 	 { "DepthprobeSimulation_swigregister", DepthprobeSimulation_swigregister, METH_O, NULL},
@@ -36372,7 +36372,6 @@ static swig_type_info _swigt__p_ChiSquaredModule = {"_p_ChiSquaredModule", "ChiS
 static swig_type_info _swigt__p_ConstantBackground = {"_p_ConstantBackground", "ConstantBackground *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_DepthprobeSimulation = {"_p_DepthprobeSimulation", "DepthprobeSimulation *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_FitObjective = {"_p_FitObjective", "FitObjective *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_IAxis = {"_p_IAxis", "IAxis *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IBackground = {"_p_IBackground", "IBackground *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IBeamScan = {"_p_IBeamScan", "IBeamScan *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IChiSquaredModule = {"_p_IChiSquaredModule", "IChiSquaredModule *", 0, 0, (void*)0, 0};
@@ -36397,6 +36396,7 @@ static swig_type_info _swigt__p_PyBuilderCallback = {"_p_PyBuilderCallback", "Py
 static swig_type_info _swigt__p_PyObserverCallback = {"_p_PyObserverCallback", "PyObserverCallback *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_QzScan = {"_p_QzScan", "QzScan *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Rotation3DT_double_t = {"_p_Rotation3DT_double_t", "RotMatrix *|Rotation3D< double > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Scale = {"_p_Scale", "Scale *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ScatteringSimulation = {"_p_ScatteringSimulation", "ScatteringSimulation *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_SimulationOptions = {"_p_SimulationOptions", "SimulationOptions *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_SimulationResult = {"_p_SimulationResult", "SimulationResult *", 0, 0, (void*)0, 0};
@@ -36463,7 +36463,6 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_DepthprobeSimulation,
   &_swigt__p_FitObjective,
   &_swigt__p_Frame,
-  &_swigt__p_IAxis,
   &_swigt__p_IBackground,
   &_swigt__p_IBeamScan,
   &_swigt__p_IChiSquaredModule,
@@ -36487,6 +36486,7 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_PyObserverCallback,
   &_swigt__p_QzScan,
   &_swigt__p_Rotation3DT_double_t,
+  &_swigt__p_Scale,
   &_swigt__p_ScatteringSimulation,
   &_swigt__p_SimulationOptions,
   &_swigt__p_SimulationResult,
@@ -36552,7 +36552,6 @@ static swig_cast_info _swigc__p_ChiSquaredModule[] = {  {&_swigt__p_ChiSquaredMo
 static swig_cast_info _swigc__p_ConstantBackground[] = {  {&_swigt__p_ConstantBackground, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_DepthprobeSimulation[] = {  {&_swigt__p_DepthprobeSimulation, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_FitObjective[] = {  {&_swigt__p_FitObjective, 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_IBackground[] = {  {&_swigt__p_IBackground, 0, 0, 0},  {&_swigt__p_ConstantBackground, _p_ConstantBackgroundTo_p_IBackground, 0, 0},  {&_swigt__p_PoissonBackground, _p_PoissonBackgroundTo_p_IBackground, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IBeamScan[] = {  {&_swigt__p_IBeamScan, 0, 0, 0},  {&_swigt__p_AlphaScan, _p_AlphaScanTo_p_IBeamScan, 0, 0},  {&_swigt__p_QzScan, _p_QzScanTo_p_IBeamScan, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IChiSquaredModule[] = {  {&_swigt__p_IChiSquaredModule, 0, 0, 0},  {&_swigt__p_ChiSquaredModule, _p_ChiSquaredModuleTo_p_IChiSquaredModule, 0, 0},{0, 0, 0, 0}};
@@ -36577,6 +36576,7 @@ static swig_cast_info _swigc__p_PyBuilderCallback[] = {  {&_swigt__p_PyBuilderCa
 static swig_cast_info _swigc__p_PyObserverCallback[] = {  {&_swigt__p_PyObserverCallback, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_QzScan[] = {  {&_swigt__p_QzScan, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Rotation3DT_double_t[] = {  {&_swigt__p_Rotation3DT_double_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Scale[] = {  {&_swigt__p_Scale, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ScatteringSimulation[] = {  {&_swigt__p_ScatteringSimulation, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_SimulationOptions[] = {  {&_swigt__p_SimulationOptions, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_SimulationResult[] = {  {&_swigt__p_SimulationResult, 0, 0, 0},{0, 0, 0, 0}};
@@ -36643,7 +36643,6 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_DepthprobeSimulation,
   _swigc__p_FitObjective,
   _swigc__p_Frame,
-  _swigc__p_IAxis,
   _swigc__p_IBackground,
   _swigc__p_IBeamScan,
   _swigc__p_IChiSquaredModule,
@@ -36667,6 +36666,7 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_PyObserverCallback,
   _swigc__p_QzScan,
   _swigc__p_Rotation3DT_double_t,
+  _swigc__p_Scale,
   _swigc__p_ScatteringSimulation,
   _swigc__p_SimulationOptions,
   _swigc__p_SimulationResult,
-- 
GitLab