diff --git a/.clang-tidy b/.clang-tidy
new file mode 100644
index 0000000000000000000000000000000000000000..a3426563812b0145ab655b25c2b42431e4fb91da
--- /dev/null
+++ b/.clang-tidy
@@ -0,0 +1,106 @@
+---
+Checks: '*,
+-*-braces-around-statements,
+-*-convert-member-functions-to-static,
+-*-implicit-bool-conversion,
+-*-magic-numbers,
+-*-named-parameter,
+-*-trailing-return*,
+-clang-analyzer-alpha*,
+-cert-err58-cpp,
+-cert-err61-cpp,
+-clang-analyzer-alpha.deadcode.UnreachableCode,
+-clang-analyzer-security.insecureAPI.strcpy,
+-cppcoreguidelines-non-private-member-variables-in-classes,
+-cppcoreguidelines-pro-bounds-constant-array-index,
+-cppcoreguidelines-pro-bounds-pointer-arithmetic,
+-cppcoreguidelines-pro-type-member-init,
+-cppcoreguidelines-pro-type-reinterpret-cast,
+-cppcoreguidelines-pro-type-vararg,
+-fuchsia-default-arguments-calls,
+-fuchsia-overloaded-operator,
+-google-build-using-namespace,
+-google-default-arguments,
+-google-readability-todo,
+-google-runtime-int,
+-hicpp-vararg,
+-misc-throw-by-value-catch-by-reference,
+-performance-unnecessary-value-param,
+
+-*-avoid-c-arrays,
+-*-avoid-goto,
+-*-container-size-empty,
+-*-isolate-declaration,
+-*-member-init,
+-*-namespace-comment,
+-*-narrowing-conversions,
+-*-owning-memory,
+-*-pro-bounds-array-to-pointer-decay,
+-*-simplify-boolean-expr,
+-*-special-member-function*,
+-*-static-definition-in-anonymous-namespace,
+-*-statically-constructed-objects,
+-*-use-auto,
+-*-use-emplace,
+-bugprone-copy-constructor-init,
+-bugprone-exception-escape,
+-bugprone-misplaced-widening-cast,
+-bugprone-narrowing-conversions,
+-bugprone-unhandled-self-assignment,
+-bugprone-unused-return-value,
+-bugprone-use-after-move,
+-bugprone-parent-virtual-call,
+-cert-dcl21-cpp,
+-cert-msc30-c,
+-cert-msc50-cpp,
+-cert-oop54-cpp,
+-clang-analyzer-core.CallAndMessage,
+-clang-analyzer-cplusplus.NewDeleteLeaks,
+-cppcoreguidelines-explicit-virtual-functions,
+-cppcoreguidelines-macro-usage,
+-cppcoreguidelines-pro-type-const-cast,
+-cppcoreguidelines-pro-type-cstyle-cast,
+-cppcoreguidelines-pro-type-static-cast-downcast,
+-fuchsia-default-arguments-declarations,
+-google-explicit-constructor,
+-google-readability-avoid-underscore-in-googletest-name,
+-google-readability-casting,
+-google-runtime-references,
+-hicpp-move-const-arg,
+-hicpp-multiway-paths-covered,
+-hicpp-no-array-decay,
+-hicpp-noexcept-move,
+-hicpp-signed-bitwise,
+-hicpp-uppercase-literal-suffix,
+-hicpp-use-equals-default,
+-hicpp-use-nullptr,
+-misc-non-private-member-variables-in-classes,
+-misc-uniqueptr-reset-release,
+-modernize-loop-convert,
+-modernize-loop-convert,
+-modernize-make-shared,
+-modernize-make-unique,
+-modernize-pass-by-value,
+-modernize-raw-string-literal,
+-modernize-return-braced-init-list,
+-modernize-use-equals-default,
+-modernize-use-nullptr,
+-modernize-use-using,
+-performance-for-range-copy,
+-performance-inefficient-vector-operation,
+-performance-move-const-arg,
+-performance-noexcept-move-constructor,
+-performance-unnecessary-value-param,
+-performance-unnecessary-copy-initialization,
+-readability-avoid-const-params-in-decls,
+-readability-const-return-type,
+-readability-delete-null-pointer,
+-readability-else-after-return,
+-readability-inconsistent-declaration-parameter-name,
+-readability-non-const-parameter,
+-readability-redundant-control-flow,
+-readability-redundant-string-cstr,
+-readability-uppercase-literal-suffix,
+
+-clang-analyzer-core.NonNullParamChecker,
+'
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 96655bb55f821fc2474ae0f934bf3a0f5f117325..2dbffac6a97aa025f22c14995c1c6b6b1f9d9f5e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -52,6 +52,10 @@ option(BORNAGAIN_COVERAGE "Build with test coverage information" OFF)
 option(BORNAGAIN_DEBUG_OPTIMIZATION "Build with debug optimization (gcc only)" OFF)
 option(BORNAGAIN_TIDY "Invokes clang-tidy" OFF)
 
+if(BORNAGAIN_TIDY AND BORNAGAIN_PYTHON)
+    message(FATAL_ERROR "BORNAGAIN_TIDY is incompatible with BORNAGAIN_PYTHON")
+endif()
+
 if(ALLCONFIG)
     set(CONFIGURE_MANPAGE ON)
     set(CONFIGURE_PYTHON_DOCS ON)
@@ -99,17 +103,24 @@ endif()
 
 add_subdirectory(ThirdParty/common)
 add_subdirectory(ThirdParty/Fit)
+add_subdirectory(ThirdParty/Core)
+if(BORNAGAIN_GUI)
+    add_subdirectory(ThirdParty/GUI)
+endif()
+
+if(BORNAGAIN_TIDY)
+    set(CMAKE_CXX_CLANG_TIDY "clang-tidy") # has effect only if compiler is clang; uses .clang-tidy
+endif()
+
 add_subdirectory(Fit)
 add_subdirectory(Tests/UnitTests/Fit)
 
-add_subdirectory(ThirdParty/Core)
 add_subdirectory(Core)
 add_subdirectory(Tests/UnitTests/Core)
 add_subdirectory(Tests/UnitTests/Numeric)
 add_subdirectory(Tests/Performance/Core)
 
 if(BORNAGAIN_GUI)
-    add_subdirectory(ThirdParty/GUI)
     add_subdirectory(GUI)
     add_subdirectory(Tests/UnitTests/GUI)
     add_subdirectory(Tests/Performance/GUI)
diff --git a/Core/Aggregate/InterferenceFunction1DLattice.cpp b/Core/Aggregate/InterferenceFunction1DLattice.cpp
index 39d73cc8c3af1627b6f508c6041efb95d3412efb..0cf83e4daae88317ff1ea43dea77a18bfaa1005b 100644
--- a/Core/Aggregate/InterferenceFunction1DLattice.cpp
+++ b/Core/Aggregate/InterferenceFunction1DLattice.cpp
@@ -24,9 +24,9 @@
 namespace
 {
 // maximum value for qx*Lambdax
-static const int nmax = 20;
+const int nmax = 20;
 // minimum number of neighboring reciprocal lattice points to use
-static const int min_points = 4;
+const int min_points = 4;
 } // namespace
 
 //! Constructor of interference function of one-dimensional lattice.
@@ -40,7 +40,7 @@ InterferenceFunction1DLattice::InterferenceFunction1DLattice(double length, doub
     registerParameter("Xi", &m_xi).setUnit("rad");
 }
 
-InterferenceFunction1DLattice::~InterferenceFunction1DLattice() {}
+InterferenceFunction1DLattice::~InterferenceFunction1DLattice() = default;
 
 InterferenceFunction1DLattice* InterferenceFunction1DLattice::clone() const
 {
diff --git a/Core/Aggregate/InterferenceFunction2DLattice.cpp b/Core/Aggregate/InterferenceFunction2DLattice.cpp
index 1c16d41a6f0b05a1d8b31914ea99def7c5563113..8922720bb6f529d878e1e05abe3fe7237c4c4b4a 100644
--- a/Core/Aggregate/InterferenceFunction2DLattice.cpp
+++ b/Core/Aggregate/InterferenceFunction2DLattice.cpp
@@ -22,9 +22,9 @@
 namespace
 {
 // maximum value for qx*Lambdax and qy*lambday
-static const int nmax = 20;
+const int nmax = 20;
 // minimum number of neighboring reciprocal lattice points to use
-static const int min_points = 4;
+const int min_points = 4;
 } // namespace
 
 InterferenceFunction2DLattice::InterferenceFunction2DLattice(const Lattice2D& lattice)
diff --git a/Core/Aggregate/InterferenceFunctionFinite3DLattice.cpp b/Core/Aggregate/InterferenceFunctionFinite3DLattice.cpp
index 37b792fe59a6d1b8073d64c595fb861076ecdc90..bfa948c5675f10ecfdeff922a50c4d19b5fd9508 100644
--- a/Core/Aggregate/InterferenceFunctionFinite3DLattice.cpp
+++ b/Core/Aggregate/InterferenceFunctionFinite3DLattice.cpp
@@ -67,6 +67,6 @@ double InterferenceFunctionFinite3DLattice::iff_without_dw(const kvector_t q) co
 
 void InterferenceFunctionFinite3DLattice::setLattice(const Lattice& lattice)
 {
-    mP_lattice.reset(new Lattice(lattice));
+    mP_lattice = std::make_unique<Lattice>(lattice);
     registerChild(mP_lattice.get());
 }
diff --git a/Core/Aggregate/InterferenceFunctionHardDisk.cpp b/Core/Aggregate/InterferenceFunctionHardDisk.cpp
index 56948d53d45590707f63f7b486140400b31199d8..1b12abbddb94e547b359882e0fd8751309142fa0 100644
--- a/Core/Aggregate/InterferenceFunctionHardDisk.cpp
+++ b/Core/Aggregate/InterferenceFunctionHardDisk.cpp
@@ -20,7 +20,7 @@
 
 namespace
 {
-static const double p = 7.0 / 3.0 - 4.0 * std::sqrt(3.0) / M_PI;
+const double p = 7.0 / 3.0 - 4.0 * std::sqrt(3.0) / M_PI;
 double Czero(double packing); // TODO ASAP why these variables?
 double S2(double packing);
 double W2(double x);
diff --git a/Core/includeIncludes/InterferenceFunctions.h b/Core/Aggregate/InterferenceFunctions.h
similarity index 95%
rename from Core/includeIncludes/InterferenceFunctions.h
rename to Core/Aggregate/InterferenceFunctions.h
index 6d22bf282d38c6c49a65fa2d87cc8fdddd9cd219..e3a164961d9a04dfe73142e959d402cb65752ddf 100644
--- a/Core/includeIncludes/InterferenceFunctions.h
+++ b/Core/Aggregate/InterferenceFunctions.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/includeIncludes/InterferenceFunctions.h
+//! @file      Core/Aggregate/InterferenceFunctions.h
 //! @brief     Includes all interference function definitions.
 //!
 //! @homepage  http://www.bornagainproject.org
diff --git a/Core/Aggregate/ParticleLayout.cpp b/Core/Aggregate/ParticleLayout.cpp
index 46ecfd7ad8215400ce4f901072bc4abd40e88051..fffc87d0725ab9b4a88b1f80ac3d54ad35f78721 100644
--- a/Core/Aggregate/ParticleLayout.cpp
+++ b/Core/Aggregate/ParticleLayout.cpp
@@ -28,12 +28,10 @@ namespace
 //! which is the case for 2D functions.
 bool particleDensityIsProvidedByInterference(const IInterferenceFunction& iff)
 {
-    if (iff.getName() == "Interference2DLattice" || iff.getName() == "Interference2DParaCrystal"
-        || iff.getName() == "Interference2DSuperLattice"
-        || iff.getName() == "InterferenceFinite2DLattice"
-        || iff.getName() == "InterferenceHardDisk")
-        return true;
-    return false;
+    return iff.getName() == "Interference2DLattice" || iff.getName() == "Interference2DParaCrystal"
+           || iff.getName() == "Interference2DSuperLattice"
+           || iff.getName() == "InterferenceFinite2DLattice"
+           || iff.getName() == "InterferenceHardDisk";
 }
 } // namespace
 
@@ -53,7 +51,7 @@ ParticleLayout::ParticleLayout(const IAbstractParticle& particle, double abundan
     registerWeight();
 }
 
-ParticleLayout::~ParticleLayout() {} // needs member class definitions => don't move to .h
+ParticleLayout::~ParticleLayout() = default; // needs member class definitions => don't move to .h
 
 ParticleLayout* ParticleLayout::clone() const
 {
diff --git a/Core/CMakeLists.txt b/Core/CMakeLists.txt
index 4959aa704149e392dcaaa2c39b827e9c701e442f..81ce7618023d4004b0092d83d1c5c212a5c95931 100644
--- a/Core/CMakeLists.txt
+++ b/Core/CMakeLists.txt
@@ -1,41 +1,40 @@
 ############################################################################
-# CMakeLists.txt file for building libBornAgainCore library
+# CMakeLists.txt file for building libBornAgainCore
 ############################################################################
 
-message(STATUS "Configuring BornAgain GUI")
+set(name Core)
+set(lib BornAgain${name})
 
-set(library_name BornAgainCore)
+# --- source and include files ---
 
-if(BORNAGAIN_TIDY)
-    set(CMAKE_CXX_CLANG_TIDY "clang-tidy;-checks=-*,clang-analyzer-*,\
-readability-*,-readability-braces-around-statements,modernize-*")
-endif()
+file(GLOB source_files */*.cpp)
+file(GLOB include_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} */*.h)
 
-# --- source and include files ---------
-file(GLOB source_files "*/*.cpp" )
 if((NOT Cerf_IS_CPP) AND (NOT WIN32)) # TEMPORARY
     list(APPEND source_files ${CMAKE_SOURCE_DIR}/ThirdParty/Core/cerf_wrapper/cerf_ptr.c)
 endif()
-file(GLOB include_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/*.h")
+if(${Cerf_IS_CPP})
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DCERF_AS_CPP=ON")
+endif()
+
 
 if(BORNAGAIN_PYTHON)
 
     set(WRAP_DIR ${CMAKE_SOURCE_DIR}/Wrap)
     set(AUTO_DIR ${CMAKE_SOURCE_DIR}/auto/Wrap)
     file(MAKE_DIRECTORY ${AUTO_DIR})
-    include_directories(${AUTO_DIR})
 
     if(CONFIGURE_BINDINGS)
 
         set(TMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/Wrap)
         file(MAKE_DIRECTORY ${TMP_DIR})
 
-        GeneratePythonDocs(${AUTO_DIR}/doxygen_core.i ${WRAP_DIR}/swig)
+        GeneratePythonDocs(${AUTO_DIR}/doxygen${name}.i ${WRAP_DIR}/swig)
 
         set(swig_dependencies
-            ${WRAP_DIR}/swig/libBornAgainCore.i
+            ${WRAP_DIR}/swig/lib${lib}.i
             ${WRAP_DIR}/swig/directors.i
-            ${WRAP_DIR}/swig/extendCore.i
+            ${WRAP_DIR}/swig/extend${name}.i
             ${WRAP_DIR}/swig/ignores.i
             ${WRAP_DIR}/swig/shared_pointers.i
             ${WRAP_DIR}/swig/warnings.i
@@ -45,56 +44,78 @@ if(BORNAGAIN_PYTHON)
                 message(FATAL_ERROR "Could NOT find SWIG input ${FNAM}")
             endif()
         endforeach()
-        set(swig_dependencies ${swig_dependencies} ${AUTO_DIR}/doxygen_core.i)
+        list(APPEND swig_dependencies ${AUTO_DIR}/doxygen${name}.i)
 
-        set(SWIG_FLAGS "-c++;-python;-o;${AUTO_DIR}/libBornAgainCore_wrap.cpp;-outdir;${TMP_DIR}"
+        set(SWIG_FLAGS "-c++;-python;-o;${AUTO_DIR}/lib${lib}_wrap.cpp;-outdir;${TMP_DIR}"
                                ";-I${CMAKE_SOURCE_DIR};-I${CMAKE_BINARY_DIR}/inc")
-        set(SWIG_RUNTIME_FLAGS "-c++;-python;-external-runtime;${AUTO_DIR}/swig_runtime.h")
 
         add_custom_command(
-            OUTPUT ${AUTO_DIR}/libBornAgainCore.py
+            OUTPUT ${AUTO_DIR}/lib${lib}.py
             COMMAND ${Python3_EXECUTABLE} ${WRAP_DIR}/swig/tweaks.py
-                   ${TMP_DIR}/libBornAgainCore.py
-                   ${AUTO_DIR}/libBornAgainCore.py
-            DEPENDS ${TMP_DIR}/libBornAgainCore.py
+                   ${TMP_DIR}/lib${lib}.py
+                   ${AUTO_DIR}/lib${lib}.py
+            DEPENDS ${TMP_DIR}/lib${lib}.py
             )
         add_custom_command(
-            OUTPUT ${TMP_DIR}/libBornAgainCore.py
-                   ${AUTO_DIR}/libBornAgainCore_wrap.h
-                   ${AUTO_DIR}/libBornAgainCore_wrap.cpp
-            COMMAND ${SWIG_EXECUTABLE} ${SWIG_FLAGS} ${WRAP_DIR}/swig/libBornAgainCore.i
-            DEPENDS ${swig_dependencies} ${include_files}
-            )
-
-        add_custom_command(
-            OUTPUT ${AUTO_DIR}/swig_runtime.h
-            COMMAND ${SWIG_EXECUTABLE} ${SWIG_RUNTIME_FLAGS}
+            OUTPUT ${TMP_DIR}/lib${lib}.py
+                   ${AUTO_DIR}/lib${lib}_wrap.h
+                   ${AUTO_DIR}/lib${lib}_wrap.cpp
+            COMMAND ${SWIG_EXECUTABLE} ${SWIG_FLAGS} ${WRAP_DIR}/swig/lib${lib}.i
             DEPENDS ${swig_dependencies} ${include_files}
             )
 
     endif(CONFIGURE_BINDINGS)
 
     add_custom_target(
-        ${library_name}_python
-        COMMAND ${CMAKE_COMMAND} -E copy
-            ${AUTO_DIR}/libBornAgainCore.py ${CMAKE_BINARY_DIR}/lib/libBornAgainCore.py
-        COMMAND ${CMAKE_COMMAND} -E copy
-            ${AUTO_DIR}/libBornAgainCore.py ${CMAKE_BINARY_DIR}/lib/bornagain/libBornAgainCore.py
-        DEPENDS ${AUTO_DIR}/libBornAgainCore.py
+        ${lib}_python
+        COMMAND ${CMAKE_COMMAND}
+            -E copy ${AUTO_DIR}/lib${lib}.py ${CMAKE_BINARY_DIR}/lib/lib${lib}.py
+        COMMAND ${CMAKE_COMMAND}
+            -E copy ${AUTO_DIR}/lib${lib}.py ${CMAKE_BINARY_DIR}/lib/bornagain/lib${lib}.py
+        DEPENDS ${AUTO_DIR}/lib${lib}.py
         )
 
-    add_custom_target(${library_name}_runtime DEPENDS ${AUTO_DIR}/swig_runtime.h)
-
     if((CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
             OR (CMAKE_CXX_COMPILER_ID STREQUAL "GNU"))
         # suppress warnings from auto-generated code (last updated for Swig 4.0.1)
-        set_source_files_properties(${AUTO_DIR}/libBornAgainCore_wrap.cpp
+        set_source_files_properties(${AUTO_DIR}/lib${lib}_wrap.cpp
             PROPERTIES COMPILE_OPTIONS
             "-Wno-unused-parameter;-Wno-missing-field-initializers;-Wno-sometimes-uninitialized;\
 -Wno-deprecated-declarations")
     endif()
 
-    list(APPEND source_files "${AUTO_DIR}/libBornAgainCore_wrap.cpp")
+    list(APPEND source_files "${AUTO_DIR}/lib${lib}_wrap.cpp")
+
+endif(BORNAGAIN_PYTHON)
+
+# --- making library ---
+
+if(WIN32)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBA_CORE_BUILD_DLL")
+endif()
+
+add_library(${lib} SHARED ${source_files})
+set_target_properties(${lib} PROPERTIES PREFIX ${libprefix} SUFFIX ${libsuffix})
+set(${lib}_LIBRARY_TYPE SHARED)
+
+if(BORNAGAIN_PYTHON)
+    add_dependencies(${lib} ${lib}_python)
+endif()
+
+# exposing library name and list of include directories outside
+set(${lib}_LIBRARY ${lib} PARENT_SCOPE)
+
+
+if(BORNAGAIN_PYTHON)
+    if(CONFIGURE_BINDINGS)
+        add_custom_command(
+            OUTPUT ${AUTO_DIR}/swig_runtime.h
+            COMMAND ${SWIG_EXECUTABLE} -c++;-python;-external-runtime;${AUTO_DIR}/swig_runtime.h
+            DEPENDS ${swig_dependencies} ${include_files}
+            )
+    endif()
+    add_custom_target(${lib}_runtime DEPENDS ${AUTO_DIR}/swig_runtime.h)
+    add_dependencies(${lib} ${lib}_runtime)
 
     configure_file(${WRAP_DIR}/python/plot_utils.py
                    ${CMAKE_BINARY_DIR}/lib/bornagain/plot_utils.py COPYONLY)
@@ -113,41 +134,18 @@ if(BORNAGAIN_PYTHON)
 endif()
 
 
-if(WIN32)
-    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBA_CORE_BUILD_DLL")
-endif()
-
-
-# --- making library ---------
-if(${Cerf_IS_CPP})
-    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DCERF_AS_CPP=ON")
-endif()
-add_library(${library_name} SHARED ${source_files})
-
-set_target_properties(${library_name} PROPERTIES PREFIX ${libprefix} SUFFIX ${libsuffix})
-set(${library_name}_LIBRARY_TYPE SHARED)
-
-
-if(BORNAGAIN_PYTHON)
-    add_dependencies(${library_name} ${library_name}_python ${library_name}_runtime)
-endif()
-
-# exposing library name and list of include directories outside
-set(${library_name}_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} PARENT_SCOPE)
-set(${library_name}_LIBRARY ${library_name} PARENT_SCOPE)
-
 
-# --- external dependencies ---------
+# --- external dependencies ---
 
-target_link_libraries(${library_name} ${BornAgainFit_LIBRARY} ${CMAKE_THREAD_LIBS_INIT})
+target_link_libraries(${lib} ${BornAgainFit_LIBRARY} ${CMAKE_THREAD_LIBS_INIT})
 
 if(BORNAGAIN_TIFF_SUPPORT)
-    target_compile_definitions(${library_name} PUBLIC -DBORNAGAIN_TIFF_SUPPORT)
-    target_include_directories(${library_name} PUBLIC ${TIFF_INCLUDE_DIR})
-    target_link_libraries(${library_name} ${TIFF_LIBRARIES})
+    target_compile_definitions(${lib} PUBLIC -DBORNAGAIN_TIFF_SUPPORT)
+    target_include_directories(${lib} PUBLIC ${TIFF_INCLUDE_DIR})
+    target_link_libraries(${lib} ${TIFF_LIBRARIES})
 endif()
 
-target_include_directories(${library_name}
+target_include_directories(${lib}
     PUBLIC ${CMAKE_SOURCE_DIR} ${Boost_INCLUDE_DIRS} ${FFTW3_INCLUDE_DIR} ${GSL_INCLUDE_DIR}
     ${tspectrum_INCLUDE_DIR}
     ${Cerf_INCLUDE_DIR}
@@ -155,35 +153,40 @@ target_include_directories(${library_name}
     SYSTEM PUBLIC ${EIGEN3_INCLUDE_DIRS}
     )
 if(BORNAGAIN_GUI)
-    target_include_directories(${library_name} PUBLIC ${Qt5Core_INCLUDE_DIRS})
-    target_link_libraries(${library_name} ${Qt5Core_LIBRARIES})
+    target_include_directories(${lib} PUBLIC ${Qt5Core_INCLUDE_DIRS})
+    target_link_libraries(${lib} ${Qt5Core_LIBRARIES})
 endif()
 
-target_link_libraries(${library_name} ${Boost_LIBRARIES} ${FFTW3_LIBRARIES} ${GSL_LIBRARIES}
+target_link_libraries(${lib} ${Boost_LIBRARIES} ${FFTW3_LIBRARIES} ${GSL_LIBRARIES}
     ${tspectrum_LIBRARY} ${Cerf_LIBRARIES})
 
 if(BORNAGAIN_MPI)
     add_definitions(-DBORNAGAIN_MPI)
     include_directories(${MPI_INCLUDE_PATH})
-    target_link_libraries(${library_name} ${MPI_LIBRARIES})
+    target_link_libraries(${lib} ${MPI_LIBRARIES})
 endif()
 
 if(BORNAGAIN_PYTHON)
-    target_compile_definitions(${library_name} PUBLIC -DBORNAGAIN_PYTHON)
-    include_directories(${Python3_INCLUDE_DIRS} ${Python3_NumPy_INCLUDE_DIRS})
-    target_link_libraries(${library_name} ${Python3_LIBRARIES})
+    target_compile_definitions(${lib} PUBLIC -DBORNAGAIN_PYTHON)
+    target_include_directories(${lib} PUBLIC ${Python3_INCLUDE_DIRS} ${Python3_NumPy_INCLUDE_DIRS})
+    target_link_libraries(${lib} ${Python3_LIBRARIES})
 endif()
 
 if(APPLE AND BORNAGAIN_APPLE_BUNDLE)
     set(link_flags "-Wl,-rpath,@loader_path/../../Frameworks")
-    set_target_properties(${library_name}
-        PROPERTIES
-        LINK_FLAGS ${link_flags}
-        )
+    set_target_properties(${lib} PROPERTIES LINK_FLAGS ${link_flags})
 endif()
 
+# --- installation ---
 
-# --- installation ---------
+install(TARGETS ${lib} DESTINATION ${destination_lib} COMPONENT Libraries)
+install(FILES ${CMAKE_BINARY_DIR}/lib/lib${lib}.py
+    DESTINATION ${destination_lib} COMPONENT Libraries) # required by swig
+
+foreach(file ${include_files})
+    get_filename_component(dir ${file} DIRECTORY)
+    install(FILES ${file} DESTINATION ${destination_include}/${name}/${dir})
+endforeach()
 
 install(DIRECTORY ${CMAKE_SOURCE_DIR}/Examples/
     DESTINATION ${destination_examples} COMPONENT Examples FILES_MATCHING PATTERN "*.py" )
@@ -195,39 +198,29 @@ install(DIRECTORY ${CMAKE_SOURCE_DIR}/Examples/
     DESTINATION ${destination_examples} COMPONENT Examples FILES_MATCHING PATTERN "*.png")
 install(DIRECTORY ${CMAKE_SOURCE_DIR}/Examples/cpp
     DESTINATION ${destination_examples} COMPONENT Examples)
-install(TARGETS ${library_name}
-    DESTINATION ${destination_lib} COMPONENT Libraries)
-install(FILES ${CMAKE_BINARY_DIR}/lib/lib${library_name}.py
-    DESTINATION ${destination_lib} COMPONENT Libraries) # required by swig
-
-foreach(file ${include_files})
-    get_filename_component(dir ${file} DIRECTORY)
-    install(FILES ${file} DESTINATION ${destination_include}/Core/${dir})
-endforeach()
 install(FILES "${AUTO_DIR}/swig_runtime.h"
     DESTINATION ${destination_include}/Wrap COMPONENT Headers)
-
 install(FILES ${CMAKE_SOURCE_DIR}/Wrap/WinDllMacros.h
     DESTINATION ${destination_include}/Wrap COMPONENT Headers)
 
 if(WIN32)
-    # python in windows required .pyd extention for the library name
+    # python in windows required .pyd extension for the library name
     if(BORNAGAIN_PYTHON)
         add_custom_command(
-            TARGET ${library_name}
+            TARGET ${lib}
             POST_BUILD
             COMMAND ${CMAKE_COMMAND} -E copy
-            ${CMAKE_BINARY_DIR}/bin/${libprefix}${library_name}${libsuffix}
-            ${CMAKE_BINARY_DIR}/lib/${libprefix}${library_name}".pyd"
+            ${CMAKE_BINARY_DIR}/bin/${libprefix}${lib}${libsuffix}
+            ${CMAKE_BINARY_DIR}/lib/${libprefix}${lib}".pyd"
             )
-        install(FILES ${CMAKE_BINARY_DIR}/lib/${libprefix}${library_name}.pyd
+        install(FILES ${CMAKE_BINARY_DIR}/lib/${libprefix}${lib}.pyd
             DESTINATION ${destination_lib} COMPONENT Libraries)
         add_custom_command(
-            TARGET ${library_name}
+            TARGET ${lib}
             POST_BUILD
             COMMAND ${CMAKE_COMMAND} -E copy
-            ${CMAKE_BINARY_DIR}/bin/${libprefix}${library_name}${libsuffix}
-            ${CMAKE_BINARY_DIR}/lib/${libprefix}${library_name}${libsuffix}
+            ${CMAKE_BINARY_DIR}/bin/${libprefix}${lib}${libsuffix}
+            ${CMAKE_BINARY_DIR}/lib/${libprefix}${lib}${libsuffix}
             )
     endif()
 
diff --git a/Core/Computation/DWBASingleComputation.cpp b/Core/Computation/DWBASingleComputation.cpp
index bd7da053e1c8486dbf8f401f1ed4b8d7765ff436..a6d3b2c177dcdae2abb2bf0c8318a25bc70d3bbe 100644
--- a/Core/Computation/DWBASingleComputation.cpp
+++ b/Core/Computation/DWBASingleComputation.cpp
@@ -26,7 +26,7 @@ DWBASingleComputation::DWBASingleComputation(DWBASingleComputation&&) = default;
 
 void DWBASingleComputation::setProgressHandler(ProgressHandler* p_progress)
 {
-    mP_progress_counter.reset(new DelayedProgressCounter(p_progress, 100));
+    mP_progress_counter = std::make_unique<DelayedProgressCounter>(p_progress, 100);
 }
 
 void DWBASingleComputation::addLayoutComputation(ParticleLayoutComputation* p_layout_comp)
diff --git a/Core/Computation/DepthProbeComputationTerm.cpp b/Core/Computation/DepthProbeComputationTerm.cpp
index 3a4f0fa4dfd0e1c83427e9c14bc0a18ff16ad682..4e0e0ce2d419d84a0d29b1c057340025106d5ea9 100644
--- a/Core/Computation/DepthProbeComputationTerm.cpp
+++ b/Core/Computation/DepthProbeComputationTerm.cpp
@@ -29,7 +29,7 @@ DepthProbeComputationTerm::~DepthProbeComputationTerm() = default;
 
 void DepthProbeComputationTerm::setProgressHandler(ProgressHandler* p_progress)
 {
-    mP_progress_counter.reset(new DelayedProgressCounter(p_progress, 100));
+    mP_progress_counter = std::make_unique<DelayedProgressCounter>(p_progress, 100);
 }
 
 void DepthProbeComputationTerm::compute(DepthProbeElement& elem) const
diff --git a/Core/Computation/LayoutStrategyBuilder.cpp b/Core/Computation/LayoutStrategyBuilder.cpp
index d688edeab9dd025d5b2629e52a79c13eff6c04d6..be8e8c9ae662f734d7cf2899a21715d1fd6f0115 100644
--- a/Core/Computation/LayoutStrategyBuilder.cpp
+++ b/Core/Computation/LayoutStrategyBuilder.cpp
@@ -27,7 +27,7 @@ LayoutStrategyBuilder::LayoutStrategyBuilder(const ProcessedLayout* p_layout,
 }
 
 // needs class definitions => don't move to .h
-LayoutStrategyBuilder::~LayoutStrategyBuilder() {}
+LayoutStrategyBuilder::~LayoutStrategyBuilder() = default;
 
 IInterferenceFunctionStrategy* LayoutStrategyBuilder::releaseStrategy()
 {
@@ -43,14 +43,13 @@ void LayoutStrategyBuilder::createStrategy()
     auto p_radial_para = dynamic_cast<const InterferenceFunctionRadialParaCrystal*>(p_iff);
     if (p_radial_para && p_radial_para->kappa() > 0.0) {
         double kappa = p_radial_para->kappa();
-        mP_strategy.reset(new SSCApproximationStrategy(m_sim_params, kappa, m_polarized));
+        mP_strategy = std::make_unique<SSCApproximationStrategy>(m_sim_params, kappa, m_polarized);
     } else {
-        mP_strategy.reset(new DecouplingApproximationStrategy(m_sim_params, m_polarized));
+        mP_strategy = std::make_unique<DecouplingApproximationStrategy>(m_sim_params, m_polarized);
     }
     if (!mP_strategy)
         throw Exceptions::ClassInitializationException("Could not create appropriate strategy");
     mP_strategy->init(mp_layout->formFactorList(), p_iff);
-    return;
 }
 
 void LayoutStrategyBuilder::checkInterferenceFunction(const IInterferenceFunction* p_iff)
diff --git a/Core/Computation/ProcessedLayout.cpp b/Core/Computation/ProcessedLayout.cpp
index 62f448ce5a94833a4f842be8ad66f6077555c758..345104559c22d4dc66e085b754efe9f8dbfd4411 100644
--- a/Core/Computation/ProcessedLayout.cpp
+++ b/Core/Computation/ProcessedLayout.cpp
@@ -106,12 +106,12 @@ FormFactorCoherentSum ProcessedLayout::ProcessParticle(const IParticle& particle
         std::unique_ptr<IFormFactor> P_ff_framework;
         if (slices.size() > 1) {
             if (m_polarized)
-                P_ff_framework.reset(new FormFactorDWBAPol(*ff_pair.first));
+                P_ff_framework = std::make_unique<FormFactorDWBAPol>(*ff_pair.first);
             else
-                P_ff_framework.reset(new FormFactorDWBA(*ff_pair.first));
+                P_ff_framework = std::make_unique<FormFactorDWBA>(*ff_pair.first);
         } else {
             if (m_polarized)
-                P_ff_framework.reset(new FormFactorBAPol(*ff_pair.first));
+                P_ff_framework = std::make_unique<FormFactorBAPol>(*ff_pair.first);
             else
                 P_ff_framework.reset(ff_pair.first->clone());
         }
diff --git a/Core/Computation/ProcessedSample.cpp b/Core/Computation/ProcessedSample.cpp
index b86dc778b0fcb51944604acb73e4b411be8e5aa3..1625fc6b5f1095371061ddcd016c5f579f09e3a5 100644
--- a/Core/Computation/ProcessedSample.cpp
+++ b/Core/Computation/ProcessedSample.cpp
@@ -248,7 +248,7 @@ void ProcessedSample::addNSlices(size_t n, double thickness, const Material& mat
 
 void ProcessedSample::initBFields()
 {
-    if (m_slices.size() == 0)
+    if (m_slices.empty())
         return;
     double m_z0 = m_slices[0].material().magnetization().z();
     double b_z = Slice::Magnetic_Permeability * (m_ext_field.z() + m_z0);
@@ -284,9 +284,10 @@ std::unique_ptr<IFresnelMap> CreateFresnelMap(const MultiLayer& sample,
 {
     std::unique_ptr<IFresnelMap> P_result;
     if (ContainsMagneticSlice(slices))
-        P_result.reset(new MatrixFresnelMap(SpecularStrategyBuilder::build(sample, true)));
+        P_result = std::make_unique<MatrixFresnelMap>(SpecularStrategyBuilder::build(sample, true));
     else
-        P_result.reset(new ScalarFresnelMap(SpecularStrategyBuilder::build(sample, false)));
+        P_result =
+            std::make_unique<ScalarFresnelMap>(SpecularStrategyBuilder::build(sample, false));
     if (options.isIntegrate())
         P_result->disableCaching();
     return P_result;
diff --git a/Core/Computation/SpecularComputationTerm.cpp b/Core/Computation/SpecularComputationTerm.cpp
index 2c5a6ed658c70481f357d7016566d883beb5b266..220b512e0dff5dbb2b96fe531b2cca68c46f7759 100644
--- a/Core/Computation/SpecularComputationTerm.cpp
+++ b/Core/Computation/SpecularComputationTerm.cpp
@@ -30,7 +30,7 @@ SpecularComputationTerm::~SpecularComputationTerm() = default;
 
 void SpecularComputationTerm::setProgressHandler(ProgressHandler* p_progress)
 {
-    mP_progress_counter.reset(new DelayedProgressCounter(p_progress, 100));
+    mP_progress_counter = std::make_unique<DelayedProgressCounter>(p_progress, 100);
 }
 
 void SpecularComputationTerm::compute(SpecularSimulationElement& elem,
diff --git a/Core/Correlations/FTDecay1D.cpp b/Core/Correlations/FTDecay1D.cpp
index 58f1ace4bd71e457182650bdbe21de64d38577af..5ee54fe5d10888c5f389e8e170d39bbc2b44a101 100644
--- a/Core/Correlations/FTDecay1D.cpp
+++ b/Core/Correlations/FTDecay1D.cpp
@@ -108,8 +108,8 @@ double FTDecayFunction1DTriangle::evaluate(double q) const
 
 FTDecayFunction1DVoigt::FTDecayFunction1DVoigt(const std::vector<double> P)
     : IFTDecayFunction1D(
-          {"FTDecayFunction1DVoigt", "class_tooltip", {{"Eta", "", "para_tooltip", -INF, +INF, 0}}},
-          P),
+        {"FTDecayFunction1DVoigt", "class_tooltip", {{"Eta", "", "para_tooltip", -INF, +INF, 0}}},
+        P),
       m_eta(m_P[0])
 {
 }
diff --git a/Core/Correlations/FTDecay2D.cpp b/Core/Correlations/FTDecay2D.cpp
index e64b2d0e4451a21c556b725aa9194b543c471c72..912746b825b52a54c8591ad316d50b8d05979ad3 100644
--- a/Core/Correlations/FTDecay2D.cpp
+++ b/Core/Correlations/FTDecay2D.cpp
@@ -120,8 +120,8 @@ double FTDecayFunction2DGauss::evaluate(double qx, double qy) const
 
 FTDecayFunction2DVoigt::FTDecayFunction2DVoigt(const std::vector<double> P)
     : IFTDecayFunction2D(
-          {"FTDecayFunction2DVoigt", "class_tooltip", {{"Eta", "", "para_tooltip", -INF, +INF, 0}}},
-          P),
+        {"FTDecayFunction2DVoigt", "class_tooltip", {{"Eta", "", "para_tooltip", -INF, +INF, 0}}},
+        P),
       m_eta(m_P[0])
 {
 }
diff --git a/Core/Correlations/FTDistributions1D.cpp b/Core/Correlations/FTDistributions1D.cpp
index 365823e105a0c4fe4a11a64df5621fcb0b2bea14..bfc4d918a58530b663fc6ab222003a098a413d6e 100644
--- a/Core/Correlations/FTDistributions1D.cpp
+++ b/Core/Correlations/FTDistributions1D.cpp
@@ -215,8 +215,8 @@ std::unique_ptr<IDistribution1DSampler> FTDistribution1DCosine::createSampler()
 
 FTDistribution1DVoigt::FTDistribution1DVoigt(const std::vector<double> P)
     : IFTDistribution1D(
-          {"FTDistribution1DVoigt", "class_tooltip", {{"Eta", "", "para_tooltip", -INF, +INF, 0}}},
-          P),
+        {"FTDistribution1DVoigt", "class_tooltip", {{"Eta", "", "para_tooltip", -INF, +INF, 0}}},
+        P),
       m_eta(m_P[1])
 {
 }
diff --git a/Core/Correlations/FTDistributions2D.cpp b/Core/Correlations/FTDistributions2D.cpp
index 7dc5f3ba3523dcde6dabcbdae2f851ea4d7c459c..a6c95206db6ba961c6b76c0572911647facd6c4a 100644
--- a/Core/Correlations/FTDistributions2D.cpp
+++ b/Core/Correlations/FTDistributions2D.cpp
@@ -13,15 +13,12 @@
 // ************************************************************************** //
 
 #include "Core/Correlations/FTDistributions2D.h"
-#include "Core/Basics/Algorithms.h"
 #include "Core/Basics/Exceptions.h"
 #include "Core/Basics/MathConstants.h"
 #include "Core/Tools/Integrator.h"
 #include "Core/Tools/MathFunctions.h"
 #include <limits>
 
-using algo::concat;
-
 // ************************************************************************** //
 // interface IFTDistribution1D
 // ************************************************************************** //
@@ -179,8 +176,8 @@ std::unique_ptr<IDistribution2DSampler> FTDistribution2DCone::createSampler() co
 
 FTDistribution2DVoigt::FTDistribution2DVoigt(const std::vector<double> P)
     : IFTDistribution2D(
-          {"FTDistribution2DVoigt", "class_tooltip", {{"Eta", "", "para_tooltip", -INF, +INF, 0}}},
-          P),
+        {"FTDistribution2DVoigt", "class_tooltip", {{"Eta", "", "para_tooltip", -INF, +INF, 0}}},
+        P),
       m_eta(m_P[3])
 {
 }
diff --git a/Core/Detector/ConvolutionDetectorResolution.cpp b/Core/Detector/ConvolutionDetectorResolution.cpp
index 23dc6c0223e34eedb7545b3a3f4f32aa2eef77a5..ba092d6ef38dbc5a47b0bbe546a580b752fb03f8 100644
--- a/Core/Detector/ConvolutionDetectorResolution.cpp
+++ b/Core/Detector/ConvolutionDetectorResolution.cpp
@@ -29,7 +29,7 @@ ConvolutionDetectorResolution::ConvolutionDetectorResolution(
     setResolutionFunction(p_res_function_2d);
 }
 
-ConvolutionDetectorResolution::~ConvolutionDetectorResolution() {}
+ConvolutionDetectorResolution::~ConvolutionDetectorResolution() = default;
 
 ConvolutionDetectorResolution::ConvolutionDetectorResolution(
     const ConvolutionDetectorResolution& other)
diff --git a/Core/Detector/Convolve.cpp b/Core/Detector/Convolve.cpp
index 6b451fad297a1c2047d1c4b901534bcf9103efd9..4e15a34278c2fab4e7c1a5dae96ec53f739ae913 100644
--- a/Core/Detector/Convolve.cpp
+++ b/Core/Detector/Convolve.cpp
@@ -204,6 +204,7 @@ void Convolve::init(int h_src, int w_src, int h_kernel, int w_kernel)
         ws.w_offset = ws.w_kernel - 1;
         break;
     case FFTW_CIRCULAR_SAME:
+    case FFTW_CIRCULAR_SAME_SHIFTED:
         // Circular convolution, modulo N
         // We don't padd with zeros because if we do, we need to padd with at least h_kernel/2;
         // w_kernel/2 elements plus the wrapp around, which in facts leads to too much
@@ -216,20 +217,6 @@ void Convolve::init(int h_src, int w_src, int h_kernel, int w_kernel)
         ws.h_offset = 0;
         ws.w_offset = 0;
         break;
-    case FFTW_CIRCULAR_SAME_SHIFTED:
-        // Circular convolution, modulo N, shifted by M/2
-        // We don't padd with zeros because if we do, we need to padd with at least h_kernel/2;
-        // w_kernel/2 elements plus the wrapp around, which in facts leads to too much
-        // computations compared to the gain obtained with the optimal size
-        ws.h_fftw = h_src;
-        ws.w_fftw = w_src;
-        ws.h_dst = h_src;
-        ws.w_dst = w_src;
-        // We copy the [h_kernel/2:h_kernel/2+h_dst-1 ; w_kernel/2:w_kernel/2+w_dst-1]
-        // real part elements of out_src
-        ws.h_offset = 0;
-        ws.w_offset = 0;
-        break;
     default:
         std::cout
             << "Unrecognized convolution mode, possible modes are "
diff --git a/Core/Detector/DetectorMask.cpp b/Core/Detector/DetectorMask.cpp
index ed415dfe4200a0114402b06bf4fc23ade04776b2..3b6979d5c2b5aba5106a7213feb5d84f0325cbab 100644
--- a/Core/Detector/DetectorMask.cpp
+++ b/Core/Detector/DetectorMask.cpp
@@ -111,7 +111,7 @@ const IShape2D* DetectorMask::getMaskShape(size_t mask_index, bool& mask_value)
 void DetectorMask::process_masks()
 {
     m_mask_data.setAllTo(false);
-    if (!m_shapes.size())
+    if (!!m_shapes.empty())
         return;
 
     m_number_of_masked_channels = 0;
diff --git a/Core/Detector/IDetector.cpp b/Core/Detector/IDetector.cpp
index 38a5dcb4a96857ecaed8f9fabc8668722c1cf2c4..c2d6a7b068b1b8cb79b799dc25115ce1da21844c 100644
--- a/Core/Detector/IDetector.cpp
+++ b/Core/Detector/IDetector.cpp
@@ -13,6 +13,7 @@
 // ************************************************************************** //
 
 #include "Core/Detector/IDetector.h"
+#include "Core/Binning/IAxis.h"
 #include "Core/Detector/ConvolutionDetectorResolution.h"
 #include "Core/Detector/DetectorMask.h"
 #include "Core/Detector/IDetectorResolution.h"
@@ -43,6 +44,16 @@ void IDetector::addAxis(const IAxis& axis)
     m_axes.push_back(axis.clone());
 }
 
+size_t IDetector::dimension() const
+{
+    return m_axes.size();
+}
+
+void IDetector::clear()
+{
+    m_axes.clear();
+}
+
 const IAxis& IDetector::getAxis(size_t index) const
 {
     if (index < dimension())
diff --git a/Core/Detector/IDetector.h b/Core/Detector/IDetector.h
index d5a08c34ca8da8f5508a41bec5b84e82dea374e3..eb98997a22e7c82a7c19c79332f88dcd386a84f5 100644
--- a/Core/Detector/IDetector.h
+++ b/Core/Detector/IDetector.h
@@ -16,15 +16,15 @@
 #define BORNAGAIN_CORE_DETECTOR_IDETECTOR_H
 
 #include "Core/Basics/ICloneable.h"
-#include "Core/Binning/IAxis.h"
 #include "Core/Detector/DetectionProperties.h"
 #include "Core/Detector/SimulationAreaIterator.h"
 #include "Core/Intensity/IUnitConverter.h"
 #include "Core/Parametrization/INode.h"
-#include "Core/Tools/SafePointerVector.h"
+#include "Core/Tools/CloneableVector.h"
 
 class Beam;
 class DetectorMask;
+class IAxis;
 class IDetectorResolution;
 class IResolutionFunction2D;
 template <class T> class OutputData;
@@ -47,14 +47,12 @@ public:
     //! Inits detector with the beam settings
     virtual void init(const Beam&) {}
 
-    void clear() { m_axes.clear(); }
-
     void addAxis(const IAxis& axis);
 
     const IAxis& getAxis(size_t index) const;
 
     //! Returns actual dimensionality of the detector (number of defined axes)
-    size_t dimension() const { return m_axes.size(); }
+    size_t dimension() const;
 
     //! Calculate axis index for given global index
     size_t axisBinIndex(size_t index, size_t selected_axis) const;
@@ -102,7 +100,7 @@ public:
     createDetectorIntensity(const std::vector<SimulationElement>& elements) const;
 
     //! Return default axes units
-    virtual AxesUnits defaultAxesUnits() const { return AxesUnits::DEFAULT; }
+    virtual Axes::Units defaultAxesUnits() const { return Axes::Units::DEFAULT; }
 
     //! Returns number of simulation elements.
     size_t numberOfSimulationElements() const;
@@ -114,6 +112,8 @@ public:
 protected:
     IDetector(const IDetector& other);
 
+    void clear();
+
     //! Returns the name for the axis with given index
     virtual std::string axisName(size_t index) const = 0;
 
@@ -125,7 +125,7 @@ private:
     void setDataToDetectorMap(OutputData<double>& detectorMap,
                               const std::vector<SimulationElement>& elements) const;
 
-    SafePointerVector<IAxis> m_axes;
+    CloneableVector<IAxis> m_axes;
     DetectionProperties m_detection_properties;
     std::unique_ptr<IDetectorResolution> mP_detector_resolution;
 };
diff --git a/Core/Detector/IDetector2D.cpp b/Core/Detector/IDetector2D.cpp
index e8fd4d7502c022936b34fd1eb1987061f7d07e7f..df32bf4999c717123c4650a44940609035599168 100644
--- a/Core/Detector/IDetector2D.cpp
+++ b/Core/Detector/IDetector2D.cpp
@@ -41,13 +41,6 @@ void IDetector2D::setDetectorParameters(size_t n_x, double x_min, double x_max,
     addAxis(*createAxis(1, n_y, y_min, y_max));
 }
 
-void IDetector2D::setDetectorAxes(const IAxis& axis0, const IAxis& axis1)
-{
-    clear();
-    addAxis(axis0);
-    addAxis(axis1);
-}
-
 const RegionOfInterest* IDetector2D::regionOfInterest() const
 {
     return m_region_of_interest.get();
@@ -55,7 +48,7 @@ const RegionOfInterest* IDetector2D::regionOfInterest() const
 
 void IDetector2D::setRegionOfInterest(double xlow, double ylow, double xup, double yup)
 {
-    m_region_of_interest.reset(new RegionOfInterest(*this, xlow, ylow, xup, yup));
+    m_region_of_interest = std::make_unique<RegionOfInterest>(*this, xlow, ylow, xup, yup);
     m_detector_mask.initMaskData(*this);
 }
 
diff --git a/Core/Detector/IDetector2D.h b/Core/Detector/IDetector2D.h
index d64eea7eb1ff69778897a235f6db33fc48e28382..822e472a9eb1a0898aa6ae59ca1712c8e3417ba8 100644
--- a/Core/Detector/IDetector2D.h
+++ b/Core/Detector/IDetector2D.h
@@ -40,9 +40,6 @@ public:
     void setDetectorParameters(size_t n_x, double x_min, double x_max, size_t n_y, double y_min,
                                double y_max);
 
-    //! Sets detector parameters using axes
-    void setDetectorAxes(const IAxis& axis0, const IAxis& axis1);
-
     //! Removes all masks from the detector
     void removeMasks();
 
diff --git a/Core/Detector/RectangularDetector.cpp b/Core/Detector/RectangularDetector.cpp
index 8449474ae3585cd7dedda5ffe2a634b6c0d17f1f..985b9ad9efec3496cd5c3e62ef9f389dabde0109 100644
--- a/Core/Detector/RectangularDetector.cpp
+++ b/Core/Detector/RectangularDetector.cpp
@@ -39,7 +39,7 @@ RectangularDetector::RectangularDetector(const RectangularDetector& other)
     setName("RectangularDetector");
 }
 
-RectangularDetector::~RectangularDetector() {}
+RectangularDetector::~RectangularDetector() = default;
 
 RectangularDetector* RectangularDetector::clone() const
 {
@@ -152,9 +152,9 @@ RectangularDetector::EDetectorArrangement RectangularDetector::getDetectorArrang
     return m_detector_arrangement;
 }
 
-AxesUnits RectangularDetector::defaultAxesUnits() const
+Axes::Units RectangularDetector::defaultAxesUnits() const
 {
-    return AxesUnits::MM;
+    return Axes::Units::MM;
 }
 
 RectangularPixel* RectangularDetector::regionOfInterestPixel() const
@@ -261,12 +261,8 @@ void RectangularDetector::initNormalVector(const kvector_t central_k)
         m_normal_to_detector = m_distance * central_k_unit;
     }
 
-    else if (m_detector_arrangement == PERPENDICULAR_TO_REFLECTED_BEAM) {
-        m_normal_to_detector = m_distance * central_k_unit;
-        m_normal_to_detector.setZ(-m_normal_to_detector.z());
-    }
-
-    else if (m_detector_arrangement == PERPENDICULAR_TO_REFLECTED_BEAM_DPOS) {
+    else if (m_detector_arrangement == PERPENDICULAR_TO_REFLECTED_BEAM ||
+             m_detector_arrangement == PERPENDICULAR_TO_REFLECTED_BEAM_DPOS) {
         m_normal_to_detector = m_distance * central_k_unit;
         m_normal_to_detector.setZ(-m_normal_to_detector.z());
     }
diff --git a/Core/Detector/RectangularDetector.h b/Core/Detector/RectangularDetector.h
index d5e2b9cf91c8c0bc6fd22fe09bc1b5433ca7087c..5455a011b679c2abd64c3d8292ae85b2994d8f2d 100644
--- a/Core/Detector/RectangularDetector.h
+++ b/Core/Detector/RectangularDetector.h
@@ -74,7 +74,7 @@ public:
     EDetectorArrangement getDetectorArrangment() const;
 
     //! return default axes units
-    AxesUnits defaultAxesUnits() const override;
+    Axes::Units defaultAxesUnits() const override;
 
     RectangularPixel* regionOfInterestPixel() const;
 
diff --git a/Core/Detector/RegionOfInterest.cpp b/Core/Detector/RegionOfInterest.cpp
index 4810384c41c934be5c6ce71d44b27d3bc9cfb3f8..9d6febd3838083f823a85faa03bd2335b41f9940 100644
--- a/Core/Detector/RegionOfInterest.cpp
+++ b/Core/Detector/RegionOfInterest.cpp
@@ -46,7 +46,7 @@ RegionOfInterest* RegionOfInterest::clone() const
     return new RegionOfInterest(*this);
 }
 
-RegionOfInterest::~RegionOfInterest() {}
+RegionOfInterest::~RegionOfInterest() = default;
 
 RegionOfInterest::RegionOfInterest(const RegionOfInterest& other)
     : ICloneable(), m_rectangle(other.m_rectangle->clone()), m_ax1(other.m_ax1), m_ay1(other.m_ay1),
diff --git a/Core/Detector/ScanResolution.cpp b/Core/Detector/ScanResolution.cpp
index 8f3a66d27b55b04cc0f3fe8716c57523f3ef549c..755b5844ef72283d67ef8a17e96a98d62e5505f6 100644
--- a/Core/Detector/ScanResolution.cpp
+++ b/Core/Detector/ScanResolution.cpp
@@ -206,7 +206,7 @@ std::string ScanResolution::print() const
     return result.str();
 }
 
-ScanResolution::ScanResolution() {}
+ScanResolution::ScanResolution() = default;
 
 ScanResolution::ScanResolution(const RangedDistribution& distr) : m_distr(distr.clone()) {}
 
diff --git a/Core/Detector/SpecularDetector1D.cpp b/Core/Detector/SpecularDetector1D.cpp
index d32b0c7f026410f658357f95a0f3556a96dc5ee5..7f8063a86e5ebe955444f1d5502585110f1b3799 100644
--- a/Core/Detector/SpecularDetector1D.cpp
+++ b/Core/Detector/SpecularDetector1D.cpp
@@ -32,9 +32,9 @@ SpecularDetector1D* SpecularDetector1D::clone() const
     return new SpecularDetector1D(*this);
 }
 
-AxesUnits SpecularDetector1D::defaultAxesUnits() const
+Axes::Units SpecularDetector1D::defaultAxesUnits() const
 {
-    return AxesUnits::RADIANS;
+    return Axes::Units::RADIANS;
 }
 
 std::string SpecularDetector1D::axisName(size_t index) const
diff --git a/Core/Detector/SpecularDetector1D.h b/Core/Detector/SpecularDetector1D.h
index b774c0518169a1f149fae5d90c3aba5125be2cbd..8054bdc92911610a0218c463742e7452e46f4368 100644
--- a/Core/Detector/SpecularDetector1D.h
+++ b/Core/Detector/SpecularDetector1D.h
@@ -41,7 +41,7 @@ public:
     void resetRegionOfInterest() override {}
 
     //! Return default axes units
-    AxesUnits defaultAxesUnits() const override;
+    Axes::Units defaultAxesUnits() const override;
 
 protected:
     SpecularDetector1D(const SpecularDetector1D& other);
diff --git a/Core/Detector/SphericalDetector.cpp b/Core/Detector/SphericalDetector.cpp
index feeae3ddb3e5e82429b378faa7d9ddfd6c0759f9..f0d8d2e68f052dca84ced4ed762b483726a0af12 100644
--- a/Core/Detector/SphericalDetector.cpp
+++ b/Core/Detector/SphericalDetector.cpp
@@ -43,9 +43,9 @@ SphericalDetector* SphericalDetector::clone() const
     return new SphericalDetector(*this);
 }
 
-AxesUnits SphericalDetector::defaultAxesUnits() const
+Axes::Units SphericalDetector::defaultAxesUnits() const
 {
-    return AxesUnits::RADIANS;
+    return Axes::Units::RADIANS;
 }
 
 IPixel* SphericalDetector::createPixel(size_t index) const
diff --git a/Core/Detector/SphericalDetector.h b/Core/Detector/SphericalDetector.h
index 41d7b25b3f2b72906b8838790bceb81c7b929001..757249b860a6cf9ae261246d0dc3ee224a2acc63 100644
--- a/Core/Detector/SphericalDetector.h
+++ b/Core/Detector/SphericalDetector.h
@@ -47,7 +47,7 @@ public:
     ~SphericalDetector() override {}
 
     //! return default axes units
-    AxesUnits defaultAxesUnits() const override;
+    Axes::Units defaultAxesUnits() const override;
 
 protected:
     //! Creates an IPixel for the given OutputData object and index
diff --git a/Core/Export/OrderedMap.h b/Core/Export/OrderedMap.h
index 616a930c708e4a1693d08a2df0a67ff0f1cb49bf..7f3c2e4ab12dd1bdd748d573f626ab519afdffe0 100644
--- a/Core/Export/OrderedMap.h
+++ b/Core/Export/OrderedMap.h
@@ -48,11 +48,12 @@ public:
     iterator begin() { return m_list.begin(); }
     iterator end() { return m_list.end(); }
 
-    size_t size()
+    size_t size() const
     {
         ASSERT(m_list.size() == m_map.size());
         return m_list.size();
     }
+    bool empty() const { return size() == 0; }
 
     // if such key exists, pair will be deleted, and new pair appended to the end
     void insert(const Key& key, const Object& object)
@@ -91,7 +92,7 @@ public:
         return 1;
     }
 
-    const Object& value(const Key& key)
+    const Object& value(const Key& key) const
     {
         typename map_t::const_iterator mit = m_map.find(key);
         if (mit == m_map.end()) {
diff --git a/Core/Export/SampleToPython.cpp b/Core/Export/SampleToPython.cpp
index 6844f9d9827ca31621b045e0c68a21fcaabbec4f..77d98fcb9fd40b98cb1d736d67aa71a01f1ec8b5 100644
--- a/Core/Export/SampleToPython.cpp
+++ b/Core/Export/SampleToPython.cpp
@@ -13,6 +13,7 @@
 // ************************************************************************** //
 
 #include "Core/Export/SampleToPython.h"
+#include "Core/Aggregate/InterferenceFunctions.h"
 #include "Core/Aggregate/ParticleLayout.h"
 #include "Core/Export/INodeUtils.h"
 #include "Core/Export/SampleLabelHandler.h"
@@ -33,7 +34,6 @@
 #include "Core/Scattering/IFormFactor.h"
 #include "Core/Tools/PyFmt.h"
 #include "Core/Vector/Transform3D.h"
-#include "Core/includeIncludes/InterferenceFunctions.h"
 #include <iomanip>
 #include <map>
 #include <set>
@@ -100,8 +100,8 @@ const std::map<MATERIAL_TYPES, std::string> factory_names{
 
 std::string SampleToPython::defineMaterials() const
 {
-    const auto themap = m_label->materialMap();
-    if (themap->size() == 0)
+    const LabelMap<const Material*>* themap = m_label->materialMap();
+    if (themap->empty())
         return "# No Materials.\n\n";
     std::ostringstream result;
     result << std::setprecision(12);
@@ -139,7 +139,7 @@ std::string SampleToPython::defineMaterials() const
 std::string SampleToPython::defineLayers() const
 {
     const auto themap = m_label->layerMap();
-    if (themap->size() == 0)
+    if (themap->empty())
         return "# No Layers.\n\n";
     std::ostringstream result;
     result << std::setprecision(12);
@@ -161,7 +161,7 @@ std::string SampleToPython::defineLayers() const
 std::string SampleToPython::defineFormFactors() const
 {
     const auto themap = m_label->formFactorMap();
-    if (themap->size() == 0)
+    if (themap->empty())
         return "";
     std::ostringstream result;
     result << std::setprecision(12);
@@ -177,7 +177,7 @@ std::string SampleToPython::defineFormFactors() const
 std::string SampleToPython::defineParticles() const
 {
     const auto themap = m_label->particleMap();
-    if (themap->size() == 0)
+    if (themap->empty())
         return "";
     std::ostringstream result;
     result << std::setprecision(12);
@@ -200,7 +200,7 @@ std::string SampleToPython::defineParticles() const
 std::string SampleToPython::defineCoreShellParticles() const
 {
     const auto themap = m_label->particleCoreShellMap();
-    if (themap->size() == 0)
+    if (themap->empty())
         return "";
     std::ostringstream result;
     result << std::setprecision(12);
@@ -221,7 +221,7 @@ std::string SampleToPython::defineCoreShellParticles() const
 std::string SampleToPython::defineParticleDistributions() const
 {
     const auto themap = m_label->particleDistributionsMap();
-    if (themap->size() == 0)
+    if (themap->empty())
         return "";
 
     std::ostringstream result;
@@ -249,7 +249,7 @@ std::string SampleToPython::defineParticleDistributions() const
 
         // linked parameters
         std::vector<std::string> linked_pars = par_distr.getLinkedParameterNames();
-        if (linked_pars.size()) {
+        if (!linked_pars.empty()) {
             result << indent() << s_par_distr;
             for (size_t i = 0; i < linked_pars.size(); ++i)
                 result << ".linkParameter(\"" << linked_pars[i] << "\")";
@@ -269,7 +269,7 @@ std::string SampleToPython::defineParticleDistributions() const
 std::string SampleToPython::defineParticleCompositions() const
 {
     const auto themap = m_label->particleCompositionMap();
-    if (themap->size() == 0)
+    if (themap->empty())
         return "";
     std::ostringstream result;
     result << std::setprecision(12);
@@ -292,7 +292,7 @@ std::string SampleToPython::defineParticleCompositions() const
 std::string SampleToPython::defineLattices() const
 {
     const auto themap = m_label->latticeMap();
-    if (themap->size() == 0)
+    if (themap->empty())
         return "";
     std::ostringstream result;
     result << std::setprecision(12);
@@ -317,7 +317,7 @@ std::string SampleToPython::defineLattices() const
 std::string SampleToPython::defineCrystals() const
 {
     const auto themap = m_label->crystalMap();
-    if (themap->size() == 0)
+    if (themap->empty())
         return "";
     std::ostringstream result;
     result << std::setprecision(12);
@@ -339,7 +339,7 @@ std::string SampleToPython::defineCrystals() const
 std::string SampleToPython::defineMesoCrystals() const
 {
     const auto themap = m_label->mesocrystalMap();
-    if (themap->size() == 0)
+    if (themap->empty())
         return "";
     std::ostringstream result;
     result << std::setprecision(12);
@@ -363,7 +363,7 @@ std::string SampleToPython::defineMesoCrystals() const
 std::string SampleToPython::defineInterferenceFunctions() const
 {
     const auto themap = m_label->interferenceFunctionMap();
-    if (themap->size() == 0)
+    if (themap->empty())
         return "";
     std::ostringstream result;
     result << std::setprecision(12);
@@ -486,7 +486,7 @@ std::string SampleToPython::defineInterferenceFunctions() const
 std::string SampleToPython::defineParticleLayouts() const
 {
     const auto themap = m_label->particleLayoutMap();
-    if (themap->size() == 0)
+    if (themap->empty())
         return "";
     std::ostringstream result;
     result << std::setprecision(12);
@@ -517,7 +517,7 @@ std::string SampleToPython::defineParticleLayouts() const
 std::string SampleToPython::defineRoughnesses() const
 {
     const auto themap = m_label->layerRoughnessMap();
-    if (themap->size() == 0)
+    if (themap->empty())
         return "";
     std::ostringstream result;
     result << std::setprecision(12);
@@ -530,7 +530,7 @@ std::string SampleToPython::defineRoughnesses() const
 
 std::string SampleToPython::addLayoutsToLayers() const
 {
-    if (m_label->particleLayoutMap()->size() == 0)
+    if (m_label->particleLayoutMap()->empty())
         return "";
     std::ostringstream result;
     result << std::setprecision(12);
@@ -549,7 +549,7 @@ std::string SampleToPython::addLayoutsToLayers() const
 std::string SampleToPython::defineMultiLayers() const
 {
     const auto themap = m_label->multiLayerMap();
-    if (themap->size() == 0)
+    if (themap->empty())
         return "# No MultiLayers.\n\n";
     std::ostringstream result;
     result << std::setprecision(12);
diff --git a/Core/Export/SimulationToPython.cpp b/Core/Export/SimulationToPython.cpp
index bbb10bc648787ef5d4d93be7de4620092b6a224e..98bdd9500650e4cc342b6bc8583e815ebe68012d 100644
--- a/Core/Export/SimulationToPython.cpp
+++ b/Core/Export/SimulationToPython.cpp
@@ -31,6 +31,7 @@
 #include "Core/Simulation/OffSpecSimulation.h"
 #include "Core/Simulation/SpecularSimulation.h"
 #include "Core/Tools/PyFmt.h"
+#include "Fit/TestEngine/Numeric.h"
 #include <iomanip>
 
 namespace
@@ -48,13 +49,22 @@ const std::string defineSimulate = "def run_simulation():\n"
 //! Returns a function that converts a coordinate to a Python code snippet with appropiate unit
 std::function<std::string(double)> printFunc(const IDetector* detector)
 {
-    if (detector->defaultAxesUnits() == AxesUnits::MM)
+    if (detector->defaultAxesUnits() == Axes::Units::MM)
         return pyfmt::printDouble;
-    if (detector->defaultAxesUnits() == AxesUnits::RADIANS)
+    if (detector->defaultAxesUnits() == Axes::Units::RADIANS)
         return pyfmt::printDegrees;
     throw Exceptions::RuntimeErrorException(
         "SimulationToPython::defineMasks() -> Error. Unknown detector units.");
 }
+
+//! returns true if it is (0, -1, 0) vector
+bool isDefaultDirection(const kvector_t direction)
+{
+    return Numeric::AreAlmostEqual(direction.x(), 0.0)
+           && Numeric::AreAlmostEqual(direction.y(), -1.0)
+           && Numeric::AreAlmostEqual(direction.z(), 0.0);
+}
+
 } // namespace
 
 //! Returns a Python script that sets up a simulation and runs it if invoked as main program.
@@ -161,7 +171,7 @@ std::string SimulationToPython::defineDetector(const Simulation* simulation) con
             result << pyfmt::indent() << "detector.setPosition("
                    << pyfmt::printKvector(det->getNormalVector()) << ", "
                    << pyfmt::printDouble(det->getU0()) << ", " << pyfmt::printDouble(det->getV0());
-            if (!pyfmt::isDefaultDirection(det->getDirectionVector()))
+            if (!isDefaultDirection(det->getDirectionVector()))
                 result << ", " << pyfmt::printKvector(det->getDirectionVector());
             result << ")\n";
         } else if (det->getDetectorArrangment() == RectangularDetector::PERPENDICULAR_TO_SAMPLE) {
@@ -333,7 +343,7 @@ std::string SimulationToPython::defineParameterDistributions(const Simulation* s
     std::ostringstream result;
     const std::vector<ParameterDistribution>& distributions =
         simulation->getDistributionHandler().getDistributions();
-    if (distributions.size() == 0)
+    if (distributions.empty())
         return "";
     for (size_t i = 0; i < distributions.size(); ++i) {
         std::string main_par_name = distributions[i].getMainParameterName();
diff --git a/Core/Fitting/FitObjective.cpp b/Core/Fitting/FitObjective.cpp
index 87c0eff52d9faf2aaf9797b61dc56b8b31a53d65..ea011148717e4a124c50aafed7aa543f3cf13363 100644
--- a/Core/Fitting/FitObjective.cpp
+++ b/Core/Fitting/FitObjective.cpp
@@ -35,7 +35,7 @@ public:
 class ChiModuleWrapper : public IMetricWrapper
 {
 public:
-    ChiModuleWrapper(std::unique_ptr<IChiSquaredModule> module);
+    explicit ChiModuleWrapper(std::unique_ptr<IChiSquaredModule> module);
     double compute(const std::vector<SimDataPair>& fit_objects, size_t n_pars) const override;
 
 private:
@@ -45,7 +45,7 @@ private:
 class ObjectiveMetricWrapper : public IMetricWrapper
 {
 public:
-    ObjectiveMetricWrapper(std::unique_ptr<ObjectiveMetric> module);
+    explicit ObjectiveMetricWrapper(std::unique_ptr<ObjectiveMetric> module);
     double compute(const std::vector<SimDataPair>& fit_objects, size_t n_pars) const override;
 
 private:
@@ -64,7 +64,7 @@ simulation_builder_t FitObjective::simulationBuilder(PyBuilderCallback& callback
 
 FitObjective::FitObjective()
     : m_metric_module(
-          std::make_unique<ObjectiveMetricWrapper>(std::make_unique<PoissonLikeMetric>())),
+        std::make_unique<ObjectiveMetricWrapper>(std::make_unique<PoissonLikeMetric>())),
       m_fit_status(std::make_unique<FitStatus>(this))
 {
 }
diff --git a/Core/Fitting/FitObserver.h b/Core/Fitting/FitObserver.h
index 7c56ec59c5eba9d1a0777521ab62b580f573ce0d..82c15e89d705d11184afb1d2bef55830300f6800 100644
--- a/Core/Fitting/FitObserver.h
+++ b/Core/Fitting/FitObserver.h
@@ -86,7 +86,7 @@ template <class T> void FitObserver<T>::notify_all(const T& data)
 
 template <class T> bool FitObserver<T>::need_notify(int every_nth)
 {
-    return m_notify_count == 0 || m_notify_count % every_nth == 0 ? true : false;
+    return m_notify_count == 0 || m_notify_count % every_nth == 0;
 }
 
 #endif // BORNAGAIN_CORE_FITTING_FITOBSERVER_H
diff --git a/Core/Fitting/ObjectiveMetric.cpp b/Core/Fitting/ObjectiveMetric.cpp
index b4062e48dd5bb921b832bdca1ce3f2d938a55d58..30c85677022488cb98b5a4cc90f48669711898db 100644
--- a/Core/Fitting/ObjectiveMetric.cpp
+++ b/Core/Fitting/ObjectiveMetric.cpp
@@ -234,8 +234,8 @@ double RQ4Metric::compute(const SimDataPair& data_pair, bool use_weights) const
         return Chi2Metric::compute(data_pair, use_weights);
 
     // fetching data in RQ4 form
-    auto sim_data = data_pair.simulationResult().data(AxesUnits::RQ4);
-    auto exp_data = data_pair.experimentalData().data(AxesUnits::RQ4);
+    auto sim_data = data_pair.simulationResult().data(Axes::Units::RQ4);
+    auto exp_data = data_pair.experimentalData().data(Axes::Units::RQ4);
 
     return computeFromArrays(sim_data->getRawDataVector(), exp_data->getRawDataVector(),
                              data_pair.user_weights_array());
diff --git a/Core/Fitting/SimDataPair.cpp b/Core/Fitting/SimDataPair.cpp
index ed6738ca6b73cfe3dab4f1d89d696635551ee549..395b1151a227479d2eb8f06e1ff3a3323ed4a53b 100644
--- a/Core/Fitting/SimDataPair.cpp
+++ b/Core/Fitting/SimDataPair.cpp
@@ -91,21 +91,21 @@ size_t SimDataPair::numberOfFitElements() const
 
 SimulationResult SimDataPair::simulationResult() const
 {
-    if (m_sim_data.size() == 0)
+    if (m_sim_data.empty())
         throwInitializationException("simulationResult");
     return m_sim_data;
 }
 
 SimulationResult SimDataPair::experimentalData() const
 {
-    if (m_exp_data.size() == 0)
+    if (m_exp_data.empty())
         throwInitializationException("experimentalData");
     return m_exp_data;
 }
 
 SimulationResult SimDataPair::uncertainties() const
 {
-    if (m_uncertainties.size() == 0)
+    if (m_uncertainties.empty())
         throwInitializationException("uncertainties");
     return m_uncertainties;
 }
@@ -113,7 +113,7 @@ SimulationResult SimDataPair::uncertainties() const
 //! Returns the user uncertainties cut to the ROI area.
 SimulationResult SimDataPair::userWeights() const
 {
-    if (m_user_weights.size() == 0)
+    if (m_user_weights.empty())
         throwInitializationException("userWeights");
     return m_user_weights;
 }
@@ -146,28 +146,28 @@ SimulationResult SimDataPair::absoluteDifference() const
 
 std::vector<double> SimDataPair::experimental_array() const
 {
-    if (m_exp_data.size() == 0)
+    if (m_exp_data.empty())
         throwInitializationException("experimental_array");
     return m_exp_data.data()->getRawDataVector();
 }
 
 std::vector<double> SimDataPair::simulation_array() const
 {
-    if (m_sim_data.size() == 0)
+    if (m_sim_data.empty())
         throwInitializationException("simulation_array");
     return m_sim_data.data()->getRawDataVector();
 }
 
 std::vector<double> SimDataPair::uncertainties_array() const
 {
-    if (m_uncertainties.size() == 0)
+    if (m_uncertainties.empty())
         throwInitializationException("uncertainties_array");
     return m_uncertainties.data()->getRawDataVector();
 }
 
 std::vector<double> SimDataPair::user_weights_array() const
 {
-    if (m_user_weights.size() == 0)
+    if (m_user_weights.empty())
         throwInitializationException("user_weights_array");
     return m_user_weights.data()->getRawDataVector();
 }
diff --git a/Core/HardParticle/FormFactorCone.cpp b/Core/HardParticle/FormFactorCone.cpp
index 832d542356201a6128638a8b5e616e2e8c7e8311..0c03df1fa4f166663d8649dcd9a7655132a44b6a 100644
--- a/Core/HardParticle/FormFactorCone.cpp
+++ b/Core/HardParticle/FormFactorCone.cpp
@@ -93,5 +93,5 @@ void FormFactorCone::onChange()
 {
     m_cot_alpha = MathFunctions::cot(m_alpha);
     double radius2 = m_radius - m_height * m_cot_alpha;
-    mP_shape.reset(new DoubleEllipse(m_radius, m_radius, m_height, radius2, radius2));
+    mP_shape = std::make_unique<DoubleEllipse>(m_radius, m_radius, m_height, radius2, radius2);
 }
diff --git a/Core/HardParticle/FormFactorCylinder.cpp b/Core/HardParticle/FormFactorCylinder.cpp
index 9f07ba3992052c7cf534189048ebc29d476c67b6..9ceead80f11de0bdcba5f92afc17feb5235374cd 100644
--- a/Core/HardParticle/FormFactorCylinder.cpp
+++ b/Core/HardParticle/FormFactorCylinder.cpp
@@ -60,5 +60,5 @@ IFormFactor* FormFactorCylinder::sliceFormFactor(ZLimits limits, const IRotation
 
 void FormFactorCylinder::onChange()
 {
-    mP_shape.reset(new DoubleEllipse(m_radius, m_radius, m_height, m_radius, m_radius));
+    mP_shape = std::make_unique<DoubleEllipse>(m_radius, m_radius, m_height, m_radius, m_radius);
 }
diff --git a/Core/HardParticle/FormFactorDodecahedron.cpp b/Core/HardParticle/FormFactorDodecahedron.cpp
index e0473f19203a314141f47ed15a6ea0d250d7356d..df8a23115068a888483f488baec5ab1f573c706e 100644
--- a/Core/HardParticle/FormFactorDodecahedron.cpp
+++ b/Core/HardParticle/FormFactorDodecahedron.cpp
@@ -36,7 +36,7 @@ const PolyhedralTopology FormFactorDodecahedron::topology = {{// bottom:
 //! @param edge: length of the edge in nanometers
 FormFactorDodecahedron::FormFactorDodecahedron(const std::vector<double> P)
     : IFormFactorPolyhedron(
-          {"Dodecahedron", "class_tooltip", {{"Edge", "nm", "para_tooltip", 0, +INF, 0}}}, P),
+        {"Dodecahedron", "class_tooltip", {{"Edge", "nm", "para_tooltip", 0, +INF, 0}}}, P),
       m_edge(m_P[0])
 {
     onChange();
diff --git a/Core/HardParticle/FormFactorEllipsoidalCylinder.cpp b/Core/HardParticle/FormFactorEllipsoidalCylinder.cpp
index 753563bac09894f69f49ade31c7fafae1d847a1c..cded89c4ee5d8e442d4cd6f6bb6661015210a0fd 100644
--- a/Core/HardParticle/FormFactorEllipsoidalCylinder.cpp
+++ b/Core/HardParticle/FormFactorEllipsoidalCylinder.cpp
@@ -68,5 +68,6 @@ IFormFactor* FormFactorEllipsoidalCylinder::sliceFormFactor(ZLimits limits, cons
 
 void FormFactorEllipsoidalCylinder::onChange()
 {
-    mP_shape.reset(new DoubleEllipse(m_radius_x, m_radius_y, m_height, m_radius_x, m_radius_y));
+    mP_shape =
+        std::make_unique<DoubleEllipse>(m_radius_x, m_radius_y, m_height, m_radius_x, m_radius_y);
 }
diff --git a/Core/HardParticle/FormFactorFullSphere.cpp b/Core/HardParticle/FormFactorFullSphere.cpp
index 32e2fbca90c24ba105dba78703e6bc5ac535b098..789d758d22c2559f4e9ae77b79b37fa609f3e283 100644
--- a/Core/HardParticle/FormFactorFullSphere.cpp
+++ b/Core/HardParticle/FormFactorFullSphere.cpp
@@ -23,7 +23,7 @@
 //! @param radius: radius of the sphere in nanometers
 FormFactorFullSphere::FormFactorFullSphere(const std::vector<double> P, bool position_at_center)
     : IFormFactorBorn(
-          {"FullSphere", "class_tooltip", {{"Radius", "nm", "para_tooltip", 0, +INF, 0}}}, P),
+        {"FullSphere", "class_tooltip", {{"Radius", "nm", "para_tooltip", 0, +INF, 0}}}, P),
       m_radius(m_P[0]), m_position_at_center(position_at_center)
 {
     onChange();
diff --git a/Core/HardParticle/FormFactorFullSpheroid.cpp b/Core/HardParticle/FormFactorFullSpheroid.cpp
index 80eba59ee6a5a68787cc14baffddbf7c0263d667..e6dc0f48adc21516971a605ddae18067c8574f80 100644
--- a/Core/HardParticle/FormFactorFullSpheroid.cpp
+++ b/Core/HardParticle/FormFactorFullSpheroid.cpp
@@ -68,5 +68,6 @@ IFormFactor* FormFactorFullSpheroid::sliceFormFactor(ZLimits limits, const IRota
 
 void FormFactorFullSpheroid::onChange()
 {
-    mP_shape.reset(new TruncatedEllipsoid(m_radius, m_radius, m_height / 2.0, m_height, 0.0));
+    mP_shape =
+        std::make_unique<TruncatedEllipsoid>(m_radius, m_radius, m_height / 2.0, m_height, 0.0);
 }
diff --git a/Core/HardParticle/FormFactorHemiEllipsoid.cpp b/Core/HardParticle/FormFactorHemiEllipsoid.cpp
index ee73ec817ff6627ba6cd075118aa202216fca58f..1cac04558eba94df068c22de8fb2002e3dabe7b2 100644
--- a/Core/HardParticle/FormFactorHemiEllipsoid.cpp
+++ b/Core/HardParticle/FormFactorHemiEllipsoid.cpp
@@ -78,5 +78,6 @@ complex_t FormFactorHemiEllipsoid::evaluate_for_q(cvector_t q) const
 
 void FormFactorHemiEllipsoid::onChange()
 {
-    mP_shape.reset(new TruncatedEllipsoid(m_radius_x, m_radius_x, m_height, m_height, 0.0));
+    mP_shape =
+        std::make_unique<TruncatedEllipsoid>(m_radius_x, m_radius_x, m_height, m_height, 0.0);
 }
diff --git a/Core/HardParticle/FormFactorHollowSphere.cpp b/Core/HardParticle/FormFactorHollowSphere.cpp
index 0ecb1c8c14b2b436e7271bbd4ea1b1d8b50ee438..f9ab1169ec9f0e4a7c271ca89588a4972f5e3a9b 100644
--- a/Core/HardParticle/FormFactorHollowSphere.cpp
+++ b/Core/HardParticle/FormFactorHollowSphere.cpp
@@ -57,7 +57,7 @@ complex_t FormFactorHollowSphere::evaluate_for_q(cvector_t q) const
 
 void FormFactorHollowSphere::onChange()
 {
-    mP_shape.reset(new TruncatedEllipsoid(m_mean, m_mean, m_mean, 2.0 * m_mean, 0.0));
+    mP_shape = std::make_unique<TruncatedEllipsoid>(m_mean, m_mean, m_mean, 2.0 * m_mean, 0.0);
 }
 
 bool FormFactorHollowSphere::checkParameters() const
diff --git a/Core/HardParticle/FormFactorIcosahedron.cpp b/Core/HardParticle/FormFactorIcosahedron.cpp
index f8d3893881be24d5b617afdf0b58e87d4603223d..cc7df3aad810d759cca3d45be1f3131669fa9171 100644
--- a/Core/HardParticle/FormFactorIcosahedron.cpp
+++ b/Core/HardParticle/FormFactorIcosahedron.cpp
@@ -46,7 +46,7 @@ const PolyhedralTopology FormFactorIcosahedron::topology = {{// bottom:
 //! @param edge: length of the edge in nanometers
 FormFactorIcosahedron::FormFactorIcosahedron(const std::vector<double> P)
     : IFormFactorPolyhedron(
-          {"Icosahedron", "class_tooltip", {{"Edge", "nm", "para_tooltip", 0, +INF, 0}}}, P),
+        {"Icosahedron", "class_tooltip", {{"Edge", "nm", "para_tooltip", 0, +INF, 0}}}, P),
       m_edge(m_P[0])
 {
     onChange();
diff --git a/Core/HardParticle/FormFactorLongBoxGauss.cpp b/Core/HardParticle/FormFactorLongBoxGauss.cpp
index 427d8304318c54fa35b9f5dd6c9b025213e83d6c..61b95d01f38f4a340ddab622496b233667a19b4b 100644
--- a/Core/HardParticle/FormFactorLongBoxGauss.cpp
+++ b/Core/HardParticle/FormFactorLongBoxGauss.cpp
@@ -54,5 +54,5 @@ IFormFactor* FormFactorLongBoxGauss::sliceFormFactor(ZLimits limits, const IRota
 
 void FormFactorLongBoxGauss::onChange()
 {
-    mP_shape.reset(new Box(m_length, m_width, m_height));
+    mP_shape = std::make_unique<Box>(m_length, m_width, m_height);
 }
diff --git a/Core/HardParticle/FormFactorLongBoxLorentz.cpp b/Core/HardParticle/FormFactorLongBoxLorentz.cpp
index 4691a262064f92c1141028a8c08763249a019bf4..00fc3657a4ade64867c7fc9d75f2195044d31812 100644
--- a/Core/HardParticle/FormFactorLongBoxLorentz.cpp
+++ b/Core/HardParticle/FormFactorLongBoxLorentz.cpp
@@ -54,5 +54,5 @@ IFormFactor* FormFactorLongBoxLorentz::sliceFormFactor(ZLimits limits, const IRo
 
 void FormFactorLongBoxLorentz::onChange()
 {
-    mP_shape.reset(new Box(m_length, m_width, m_height));
+    mP_shape = std::make_unique<Box>(m_length, m_width, m_height);
 }
diff --git a/Core/HardParticle/FormFactorTruncatedSphere.cpp b/Core/HardParticle/FormFactorTruncatedSphere.cpp
index 9d6c62c8e448a3a6bdcde883a90ba662787ff50e..4f3f8312c426b4b7ed6e395284766d6f7ec02bfd 100644
--- a/Core/HardParticle/FormFactorTruncatedSphere.cpp
+++ b/Core/HardParticle/FormFactorTruncatedSphere.cpp
@@ -94,5 +94,5 @@ IFormFactor* FormFactorTruncatedSphere::sliceFormFactor(ZLimits limits, const IR
 
 void FormFactorTruncatedSphere::onChange()
 {
-    mP_shape.reset(new TruncatedEllipsoid(m_radius, m_radius, m_radius, m_height, m_dh));
+    mP_shape = std::make_unique<TruncatedEllipsoid>(m_radius, m_radius, m_radius, m_height, m_dh);
 }
diff --git a/Core/includeIncludes/HardParticles.h b/Core/HardParticle/HardParticles.h
similarity index 97%
rename from Core/includeIncludes/HardParticles.h
rename to Core/HardParticle/HardParticles.h
index 5b25fa17641a40880aa10b74a46f364f7eacb11b..c19444fbb7260710f7a3fc609bab52cdb84c73c9 100644
--- a/Core/includeIncludes/HardParticles.h
+++ b/Core/HardParticle/HardParticles.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/includeIncludes/HardParticles.h
+//! @file      Core/HardParticle/HardParticles.h
 //! @brief     Includes all particle-shape form-factor definitions.
 //!
 //! @homepage  http://www.bornagainproject.org
diff --git a/Core/HardParticle/IProfileRipple.cpp b/Core/HardParticle/IProfileRipple.cpp
index 9e80716cce8c7e12da361a0a48b01f2ae032f863..29534dd9b94a03015188d3b6d67799f72587ec81 100644
--- a/Core/HardParticle/IProfileRipple.cpp
+++ b/Core/HardParticle/IProfileRipple.cpp
@@ -61,7 +61,7 @@ complex_t IProfileRectangularRipple::factor_yz(complex_t qy, complex_t qz) const
 
 void IProfileRectangularRipple::onChange()
 {
-    mP_shape.reset(new Box(m_length, m_width, m_height));
+    mP_shape = std::make_unique<Box>(m_length, m_width, m_height);
 }
 
 // ************************************************************************** //
@@ -82,7 +82,7 @@ complex_t ICosineRipple::factor_yz(complex_t qy, complex_t qz) const
 
 void ICosineRipple::onChange()
 {
-    mP_shape.reset(new RippleCosine(m_length, m_width, m_height));
+    mP_shape = std::make_unique<RippleCosine>(m_length, m_width, m_height);
 }
 
 // ************************************************************************** //
@@ -91,8 +91,8 @@ void ICosineRipple::onChange()
 
 ISawtoothRipple::ISawtoothRipple(const NodeMeta& meta, const std::vector<double>& PValues)
     : IProfileRipple(
-          nodeMetaUnion({{"AsymmetryLength", "nm", "Asymmetry of width", -INF, INF, 0.}}, meta),
-          PValues),
+        nodeMetaUnion({{"AsymmetryLength", "nm", "Asymmetry of width", -INF, INF, 0.}}, meta),
+        PValues),
       m_asymmetry(m_P[3])
 {
     onChange();
@@ -106,5 +106,5 @@ complex_t ISawtoothRipple::factor_yz(complex_t qy, complex_t qz) const
 
 void ISawtoothRipple::onChange()
 {
-    mP_shape.reset(new RippleSawtooth(m_length, m_width, m_height, m_asymmetry));
+    mP_shape = std::make_unique<RippleSawtooth>(m_length, m_width, m_height, m_asymmetry);
 }
diff --git a/Core/HardParticle/Prism.cpp b/Core/HardParticle/Prism.cpp
index 1ef1278b29bc6ce0191ce0681269d7c3aafb69fb..8f46827f5f2afed5cde7ed266a44014f2566e850 100644
--- a/Core/HardParticle/Prism.cpp
+++ b/Core/HardParticle/Prism.cpp
@@ -20,11 +20,6 @@
 #include "Core/Tools/MathFunctions.h"
 #include <stdexcept> // need overlooked by g++ 5.4
 
-namespace
-{
-const double eps = 2e-16;
-} // namespace
-
 Prism::Prism(bool symmetry_Ci, double height, const std::vector<kvector_t>& vertices)
 {
     m_height = height;
diff --git a/Core/Instrument/FourierTransform.cpp b/Core/Instrument/FourierTransform.cpp
index e08e5c32451453723fef8c28b529db5ce53eb56b..fde8f99463aeb3635778d06b963b109016b98b40 100644
--- a/Core/Instrument/FourierTransform.cpp
+++ b/Core/Instrument/FourierTransform.cpp
@@ -16,8 +16,8 @@
 #include "Core/Instrument/FourierTransform.h"
 #include "Core/Basics/Exceptions.h"
 #include <algorithm>
+#include <cmath>
 #include <iostream>
-#include <math.h>
 #include <sstream>
 #include <stdexcept>
 
diff --git a/Core/Instrument/SimulationResult.cpp b/Core/Instrument/SimulationResult.cpp
index 24552555ffe798cb65e89959d68c8b7b8e46cd4e..88df3f7a17fd9993591eefe9036f77199d755369 100644
--- a/Core/Instrument/SimulationResult.cpp
+++ b/Core/Instrument/SimulationResult.cpp
@@ -56,7 +56,7 @@ SimulationResult& SimulationResult::operator=(SimulationResult&& other)
     return *this;
 }
 
-std::unique_ptr<OutputData<double>> SimulationResult::data(AxesUnits units) const
+std::unique_ptr<OutputData<double>> SimulationResult::data(Axes::Units units) const
 {
     if (!mP_data)
         throw std::runtime_error(
@@ -64,7 +64,7 @@ std::unique_ptr<OutputData<double>> SimulationResult::data(AxesUnits units) cons
     return mP_unit_converter->createConvertedData(*mP_data, units);
 }
 
-Histogram2D* SimulationResult::histogram2d(AxesUnits units) const
+Histogram2D* SimulationResult::histogram2d(Axes::Units units) const
 {
     if (mP_data->getRank() != 2 || mP_unit_converter->dimension() != 2)
         throw std::runtime_error("Error in SimulationResult::histogram2d: "
@@ -74,7 +74,7 @@ Histogram2D* SimulationResult::histogram2d(AxesUnits units) const
     return new Histogram2D(*P_data);
 }
 
-std::vector<AxisInfo> SimulationResult::axisInfo(AxesUnits units) const
+std::vector<AxisInfo> SimulationResult::axisInfo(Axes::Units units) const
 {
     if (!mP_unit_converter)
         return {};
@@ -119,7 +119,7 @@ size_t SimulationResult::size() const
 }
 
 #ifdef BORNAGAIN_PYTHON
-PyObject* SimulationResult::array(AxesUnits units) const
+PyObject* SimulationResult::array(Axes::Units units) const
 {
     if (!mP_data || !mP_unit_converter)
         throw std::runtime_error(
@@ -128,12 +128,12 @@ PyObject* SimulationResult::array(AxesUnits units) const
 }
 #endif
 
-std::vector<double> SimulationResult::axis(AxesUnits units) const
+std::vector<double> SimulationResult::axis(Axes::Units units) const
 {
     return axis(0, units);
 }
 
-std::vector<double> SimulationResult::axis(size_t i_axis, AxesUnits units) const
+std::vector<double> SimulationResult::axis(size_t i_axis, Axes::Units units) const
 {
     if (i_axis >= mP_unit_converter->dimension())
         throw std::runtime_error(
@@ -147,5 +147,4 @@ void SimulationResult::checkDimensions() const
     if (mP_data->getRank() != mP_unit_converter->dimension())
         throw std::runtime_error("Error in SimulationResults::checkDimensions(): "
                                  "dimensions of data and unit converter don't match");
-    return;
 }
diff --git a/Core/Instrument/SimulationResult.h b/Core/Instrument/SimulationResult.h
index a1322ff1db251119271013d56f63c6b53463910e..2177126729f8dd411bebeca36728ea08c3bb0eff 100644
--- a/Core/Instrument/SimulationResult.h
+++ b/Core/Instrument/SimulationResult.h
@@ -49,13 +49,13 @@ public:
     SimulationResult& operator=(SimulationResult&& other);
 
 #ifndef SWIG
-    std::unique_ptr<OutputData<double>> data(AxesUnits units = AxesUnits::DEFAULT) const;
+    std::unique_ptr<OutputData<double>> data(Axes::Units units = Axes::Units::DEFAULT) const;
 #endif
 
-    Histogram2D* histogram2d(AxesUnits units = AxesUnits::DEFAULT) const;
+    Histogram2D* histogram2d(Axes::Units units = Axes::Units::DEFAULT) const;
 
     //! Provide AxisInfo for each axis and the given units
-    std::vector<AxisInfo> axisInfo(AxesUnits units = AxesUnits::DEFAULT) const;
+    std::vector<AxisInfo> axisInfo(Axes::Units units = Axes::Units::DEFAULT) const;
 
     //! Returns underlying unit converter
     const IUnitConverter& converter() const;
@@ -64,17 +64,18 @@ public:
     double& operator[](size_t i);
     const double& operator[](size_t i) const;
     size_t size() const;
+    bool empty() const { return size() == 0; }
 
     //! returns intensity data as Python numpy array
 #ifdef BORNAGAIN_PYTHON
-    PyObject* array(AxesUnits units = AxesUnits::DEFAULT) const;
+    PyObject* array(Axes::Units units = Axes::Units::DEFAULT) const;
 #endif
 
-    std::vector<double> axis(AxesUnits units = AxesUnits::DEFAULT) const;
+    std::vector<double> axis(Axes::Units units = Axes::Units::DEFAULT) const;
 
     //! Returns axis coordinates as a numpy array. With no parameters given
     //! returns coordinates of x-axis in default units.
-    std::vector<double> axis(size_t i_axis, AxesUnits units = AxesUnits::DEFAULT) const;
+    std::vector<double> axis(size_t i_axis, Axes::Units units = Axes::Units::DEFAULT) const;
 
 private:
     void checkDimensions() const;
diff --git a/Core/Intensity/AxisNames.cpp b/Core/Intensity/AxisNames.cpp
index 1c6603359d97df5afe6d8ae67cf69074cdbad611..c2fd5595b50c0713fb835d562e0555fbd78dff61 100644
--- a/Core/Intensity/AxisNames.cpp
+++ b/Core/Intensity/AxisNames.cpp
@@ -18,85 +18,85 @@
 namespace AxisNames
 {
 // For spherical detectors in GISAS simulations
-std::map<AxesUnits, std::string> InitSphericalAxis0()
+std::map<Axes::Units, std::string> InitSphericalAxis0()
 {
-    std::map<AxesUnits, std::string> result;
-    result[AxesUnits::NBINS] = "X [nbins]";
-    result[AxesUnits::RADIANS] = "phi_f [rad]";
-    result[AxesUnits::DEGREES] = "phi_f [deg]";
-    result[AxesUnits::QSPACE] = "Qy [1/nm]";
-    result[AxesUnits::QXQY] = "Qx [1/nm]";
+    std::map<Axes::Units, std::string> result;
+    result[Axes::Units::NBINS] = "X [nbins]";
+    result[Axes::Units::RADIANS] = "phi_f [rad]";
+    result[Axes::Units::DEGREES] = "phi_f [deg]";
+    result[Axes::Units::QSPACE] = "Qy [1/nm]";
+    result[Axes::Units::QXQY] = "Qx [1/nm]";
     return result;
 }
-std::map<AxesUnits, std::string> InitSphericalAxis1()
+std::map<Axes::Units, std::string> InitSphericalAxis1()
 {
-    std::map<AxesUnits, std::string> result;
-    result[AxesUnits::NBINS] = "Y [nbins]";
-    result[AxesUnits::RADIANS] = "alpha_f [rad]";
-    result[AxesUnits::DEGREES] = "alpha_f [deg]";
-    result[AxesUnits::QSPACE] = "Qz [1/nm]";
-    result[AxesUnits::QXQY] = "Qy [1/nm]";
+    std::map<Axes::Units, std::string> result;
+    result[Axes::Units::NBINS] = "Y [nbins]";
+    result[Axes::Units::RADIANS] = "alpha_f [rad]";
+    result[Axes::Units::DEGREES] = "alpha_f [deg]";
+    result[Axes::Units::QSPACE] = "Qz [1/nm]";
+    result[Axes::Units::QXQY] = "Qy [1/nm]";
     return result;
 }
 // For rectangular detectors in GISAS simulations
-std::map<AxesUnits, std::string> InitRectangularAxis0()
+std::map<Axes::Units, std::string> InitRectangularAxis0()
 {
-    std::map<AxesUnits, std::string> result;
-    result[AxesUnits::NBINS] = "X [nbins]";
-    result[AxesUnits::RADIANS] = "phi_f [rad]";
-    result[AxesUnits::DEGREES] = "phi_f [deg]";
-    result[AxesUnits::MM] = "X [mm]";
-    result[AxesUnits::QSPACE] = "Qy [1/nm]";
-    result[AxesUnits::QXQY] = "Qx [1/nm]";
+    std::map<Axes::Units, std::string> result;
+    result[Axes::Units::NBINS] = "X [nbins]";
+    result[Axes::Units::RADIANS] = "phi_f [rad]";
+    result[Axes::Units::DEGREES] = "phi_f [deg]";
+    result[Axes::Units::MM] = "X [mm]";
+    result[Axes::Units::QSPACE] = "Qy [1/nm]";
+    result[Axes::Units::QXQY] = "Qx [1/nm]";
     return result;
 }
-std::map<AxesUnits, std::string> InitRectangularAxis1()
+std::map<Axes::Units, std::string> InitRectangularAxis1()
 {
-    std::map<AxesUnits, std::string> result;
-    result[AxesUnits::NBINS] = "Y [nbins]";
-    result[AxesUnits::RADIANS] = "alpha_f [rad]";
-    result[AxesUnits::DEGREES] = "alpha_f [deg]";
-    result[AxesUnits::MM] = "Y [mm]";
-    result[AxesUnits::QSPACE] = "Qz [1/nm]";
-    result[AxesUnits::QXQY] = "Qy [1/nm]";
+    std::map<Axes::Units, std::string> result;
+    result[Axes::Units::NBINS] = "Y [nbins]";
+    result[Axes::Units::RADIANS] = "alpha_f [rad]";
+    result[Axes::Units::DEGREES] = "alpha_f [deg]";
+    result[Axes::Units::MM] = "Y [mm]";
+    result[Axes::Units::QSPACE] = "Qz [1/nm]";
+    result[Axes::Units::QXQY] = "Qy [1/nm]";
     return result;
 }
 // For off-specular simulations (both spherical and rectangular detectors)
 // Currently 'mm' is not supported for the y-axis
-std::map<AxesUnits, std::string> InitOffSpecAxis0()
+std::map<Axes::Units, std::string> InitOffSpecAxis0()
 {
-    std::map<AxesUnits, std::string> result;
-    result[AxesUnits::NBINS] = "X [nbins]";
-    result[AxesUnits::RADIANS] = "alpha_i [rad]";
-    result[AxesUnits::DEGREES] = "alpha_i [deg]";
+    std::map<Axes::Units, std::string> result;
+    result[Axes::Units::NBINS] = "X [nbins]";
+    result[Axes::Units::RADIANS] = "alpha_i [rad]";
+    result[Axes::Units::DEGREES] = "alpha_i [deg]";
     return result;
 }
-std::map<AxesUnits, std::string> InitOffSpecAxis1()
+std::map<Axes::Units, std::string> InitOffSpecAxis1()
 {
-    std::map<AxesUnits, std::string> result;
-    result[AxesUnits::NBINS] = "Y [nbins]";
-    result[AxesUnits::RADIANS] = "alpha_f [rad]";
-    result[AxesUnits::DEGREES] = "alpha_f [deg]";
+    std::map<Axes::Units, std::string> result;
+    result[Axes::Units::NBINS] = "Y [nbins]";
+    result[Axes::Units::RADIANS] = "alpha_f [rad]";
+    result[Axes::Units::DEGREES] = "alpha_f [deg]";
     return result;
 }
 
-std::map<AxesUnits, std::string> InitSpecAxis()
+std::map<Axes::Units, std::string> InitSpecAxis()
 {
-    std::map<AxesUnits, std::string> result;
-    result[AxesUnits::NBINS] = "X [nbins]";
-    result[AxesUnits::RADIANS] = "alpha_i [rad]";
-    result[AxesUnits::DEGREES] = "alpha_i [deg]";
-    result[AxesUnits::QSPACE] = "Q [1/nm]";
-    result[AxesUnits::RQ4] = "Q [1/nm]";
+    std::map<Axes::Units, std::string> result;
+    result[Axes::Units::NBINS] = "X [nbins]";
+    result[Axes::Units::RADIANS] = "alpha_i [rad]";
+    result[Axes::Units::DEGREES] = "alpha_i [deg]";
+    result[Axes::Units::QSPACE] = "Q [1/nm]";
+    result[Axes::Units::RQ4] = "Q [1/nm]";
     return result;
 }
 
-std::map<AxesUnits, std::string> InitSpecAxisQ()
+std::map<Axes::Units, std::string> InitSpecAxisQ()
 {
-    std::map<AxesUnits, std::string> result;
-    result[AxesUnits::NBINS] = "X [nbins]";
-    result[AxesUnits::QSPACE] = "Q [1/nm]";
-    result[AxesUnits::RQ4] = "Q [1/nm]";
+    std::map<Axes::Units, std::string> result;
+    result[Axes::Units::NBINS] = "X [nbins]";
+    result[Axes::Units::QSPACE] = "Q [1/nm]";
+    result[Axes::Units::RQ4] = "Q [1/nm]";
     return result;
 }
 
@@ -106,13 +106,13 @@ std::map<AxesUnits, std::string> InitSpecAxisQ()
 // converter correspond to inclination angular axis.
 // For this reason depth axis map returns always
 // nanometers except for bins.
-std::map<AxesUnits, std::string> InitSampleDepthAxis()
+std::map<Axes::Units, std::string> InitSampleDepthAxis()
 {
-    std::map<AxesUnits, std::string> result;
-    result[AxesUnits::NBINS] = "Y [nbins]";
-    result[AxesUnits::RADIANS] = "Position [nm]";
-    result[AxesUnits::DEGREES] = "Position [nm]";
-    result[AxesUnits::QSPACE] = "Position [nm]";
+    std::map<Axes::Units, std::string> result;
+    result[Axes::Units::NBINS] = "Y [nbins]";
+    result[Axes::Units::RADIANS] = "Position [nm]";
+    result[Axes::Units::DEGREES] = "Position [nm]";
+    result[Axes::Units::QSPACE] = "Position [nm]";
     return result;
 }
 
diff --git a/Core/Intensity/AxisNames.h b/Core/Intensity/AxisNames.h
index 997e8d2a07e43c9924a8e91db1a9d99f21e199ae..5ffa0c705d6af362a25b9f1dbe086a51a6e27ae6 100644
--- a/Core/Intensity/AxisNames.h
+++ b/Core/Intensity/AxisNames.h
@@ -24,15 +24,15 @@
 
 namespace AxisNames
 {
-std::map<AxesUnits, std::string> InitSphericalAxis0();
-std::map<AxesUnits, std::string> InitSphericalAxis1();
-std::map<AxesUnits, std::string> InitRectangularAxis0();
-std::map<AxesUnits, std::string> InitRectangularAxis1();
-std::map<AxesUnits, std::string> InitOffSpecAxis0();
-std::map<AxesUnits, std::string> InitOffSpecAxis1();
-std::map<AxesUnits, std::string> InitSpecAxis();
-std::map<AxesUnits, std::string> InitSpecAxisQ();
-std::map<AxesUnits, std::string> InitSampleDepthAxis();
+std::map<Axes::Units, std::string> InitSphericalAxis0();
+std::map<Axes::Units, std::string> InitSphericalAxis1();
+std::map<Axes::Units, std::string> InitRectangularAxis0();
+std::map<Axes::Units, std::string> InitRectangularAxis1();
+std::map<Axes::Units, std::string> InitOffSpecAxis0();
+std::map<Axes::Units, std::string> InitOffSpecAxis1();
+std::map<Axes::Units, std::string> InitSpecAxis();
+std::map<Axes::Units, std::string> InitSpecAxisQ();
+std::map<Axes::Units, std::string> InitSampleDepthAxis();
 } // namespace AxisNames
 
 #endif // BORNAGAIN_CORE_INTENSITY_AXISNAMES_H
diff --git a/Core/Intensity/IHistogram.cpp b/Core/Intensity/IHistogram.cpp
index 0c2db2e61017d514bf4855a01c319914bc92e972..51c91e7126190247b20bf964803a273f1e560780 100644
--- a/Core/Intensity/IHistogram.cpp
+++ b/Core/Intensity/IHistogram.cpp
@@ -18,7 +18,7 @@
 #include "Fit/TestEngine/Numeric.h"
 #include <memory>
 
-IHistogram::IHistogram() {}
+IHistogram::IHistogram() = default;
 
 IHistogram::IHistogram(const IHistogram& other)
 {
diff --git a/Core/Intensity/IUnitConverter.cpp b/Core/Intensity/IUnitConverter.cpp
index 75b6f3cd92b35374c06aaed75eefedb76ca78926..4a50d6803cad4d129a0989f14fcc6ecf5e3a1988 100644
--- a/Core/Intensity/IUnitConverter.cpp
+++ b/Core/Intensity/IUnitConverter.cpp
@@ -15,26 +15,9 @@
 #include "Core/Intensity/IUnitConverter.h"
 #include "Core/Intensity/OutputData.h"
 
-namespace
-{
-const std::map<AxesUnits, std::string> unit_names = {
-    {AxesUnits::NBINS, "AxesUnits::NBINS"},     {AxesUnits::RADIANS, "AxesUnits::RADIANS"},
-    {AxesUnits::DEGREES, "AxesUnits::DEGREES"}, {AxesUnits::MM, "AxesUnits::MM"},
-    {AxesUnits::QSPACE, "AxesUnits::QSPACE"},   {AxesUnits::QXQY, "AxesUnits::QXQY"},
-    {AxesUnits::RQ4, "AxesUnits::RQ4"}};
-}
-
-std::string AxesUnitsWrap::unitName(AxesUnits unit)
-{
-    auto iter = unit_names.find(unit);
-    if (iter != unit_names.end())
-        return iter->second;
-    return "Unknown units";
-}
-
 IUnitConverter::~IUnitConverter() = default;
 
-std::string IUnitConverter::axisName(size_t i_axis, AxesUnits units_type) const
+std::string IUnitConverter::axisName(size_t i_axis, Axes::Units units_type) const
 {
     const auto& name_maps = createNameMaps();
     if (name_maps.size() <= i_axis)
@@ -50,7 +33,7 @@ std::string IUnitConverter::axisName(size_t i_axis, AxesUnits units_type) const
 }
 
 std::unique_ptr<OutputData<double>>
-IUnitConverter::createConvertedData(const OutputData<double>& data, AxesUnits units) const
+IUnitConverter::createConvertedData(const OutputData<double>& data, Axes::Units units) const
 {
     const size_t dim = data.getRank();
     std::unique_ptr<OutputData<double>> result(new OutputData<double>);
@@ -68,18 +51,18 @@ void IUnitConverter::checkIndex(size_t i_axis) const
                              + std::to_string(static_cast<int>(i_axis)));
 }
 
-void IUnitConverter::throwUnitsError(std::string method, std::vector<AxesUnits> available) const
+void IUnitConverter::throwUnitsError(std::string method, std::vector<Axes::Units> available) const
 {
     std::stringstream ss;
     ss << "Unit type error in " << method
        << ": unknown or unsupported unit type. Available units "
           "are:\n";
     for (auto unit : available)
-        ss << AxesUnitsWrap::unitName(unit) << "\n";
+        ss << axisUnitName.at(unit) << "\n";
     throw std::runtime_error(ss.str());
 }
 
-AxesUnits IUnitConverter::substituteDefaultUnits(AxesUnits units) const
+Axes::Units IUnitConverter::substituteDefaultUnits(Axes::Units units) const
 {
-    return units == AxesUnits::DEFAULT ? defaultUnits() : units;
+    return units == Axes::Units::DEFAULT ? defaultUnits() : units;
 }
diff --git a/Core/Intensity/IUnitConverter.h b/Core/Intensity/IUnitConverter.h
index 9a3a72d35596b6cc485f25afbd0a1fa10ddcce0e..3b7f38873212a85eee756bc91a81a4d61bc1b756 100644
--- a/Core/Intensity/IUnitConverter.h
+++ b/Core/Intensity/IUnitConverter.h
@@ -28,16 +28,22 @@ template <class T> class OutputData;
 //! detector axes units in python
 //! @ingroup detector
 
-// workaround for SWIG (instead of just writing enum class AxesUnits...)
-struct AxesUnitsWrap {
-    enum AxesUnits { DEFAULT, NBINS, RADIANS, DEGREES, MM, QSPACE, QXQY, RQ4 };
-#ifndef SWIG
-    // TODO: to automatize enum to string convertion, one can possibly use this solution
-    // https://stackoverflow.com/questions/147267/easy-way-to-use-variables-of-enum-types-as-string-in-c#202511
-    static std::string unitName(AxesUnits unit);
-#endif
+class Axes
+{
+public:
+    enum Units { DEFAULT, NBINS, RADIANS, DEGREES, MM, QSPACE, QXQY, RQ4 };
 };
-typedef AxesUnitsWrap::AxesUnits AxesUnits;
+
+const std::map<Axes::Units, const char*> axisUnitName = {
+    {Axes::Units::NBINS, "Axes::Units::UNDEFINED"}, {Axes::Units::NBINS, "Axes::Units::NBINS"},
+    {Axes::Units::RADIANS, "Axes::Units::RADIANS"}, {Axes::Units::DEGREES, "Axes::Units::DEGREES"},
+    {Axes::Units::MM, "Axes::Units::MM"},           {Axes::Units::QSPACE, "Axes::Units::QSPACE"},
+    {Axes::Units::QXQY, "Axes::Units::QXQY"},       {Axes::Units::RQ4, "Axes::Units::RQ4"}};
+
+const std::map<Axes::Units, const char*> axisUnitLabel = {
+    {Axes::Units::NBINS, "undefined"}, {Axes::Units::NBINS, "bin"}, {Axes::Units::RADIANS, "rad"},
+    {Axes::Units::DEGREES, "deg"},     {Axes::Units::MM, "mm"},     {Axes::Units::QSPACE, "1/nm"},
+    {Axes::Units::QXQY, "1/nm"},       {Axes::Units::RQ4, "nm^-4?"}};
 
 //! Interface to provide axis translations to different units for simulation output
 //! @ingroup simulation_internal
@@ -51,32 +57,32 @@ public:
 
     virtual size_t dimension() const = 0;
 
-    virtual double calculateMin(size_t i_axis, AxesUnits units_type) const = 0;
-    virtual double calculateMax(size_t i_axis, AxesUnits units_type) const = 0;
+    virtual double calculateMin(size_t i_axis, Axes::Units units_type) const = 0;
+    virtual double calculateMax(size_t i_axis, Axes::Units units_type) const = 0;
     virtual size_t axisSize(size_t i_axis) const = 0;
 
-    std::string axisName(size_t i_axis, AxesUnits units_type = AxesUnits::DEFAULT) const;
+    std::string axisName(size_t i_axis, Axes::Units units_type = Axes::Units::DEFAULT) const;
 
-    virtual std::vector<AxesUnits> availableUnits() const = 0;
-    virtual AxesUnits defaultUnits() const = 0;
-    AxesUnits substituteDefaultUnits(AxesUnits units) const;
+    virtual std::vector<Axes::Units> availableUnits() const = 0;
+    virtual Axes::Units defaultUnits() const = 0;
+    Axes::Units substituteDefaultUnits(Axes::Units units) const;
 
 #ifndef SWIG
-    virtual std::unique_ptr<IAxis> createConvertedAxis(size_t i_axis, AxesUnits units) const = 0;
+    virtual std::unique_ptr<IAxis> createConvertedAxis(size_t i_axis, Axes::Units units) const = 0;
 
     //! Creates OutputData array in converter units.
     virtual std::unique_ptr<OutputData<double>> createConvertedData(const OutputData<double>& data,
-                                                                    AxesUnits units) const;
+                                                                    Axes::Units units) const;
 #endif // SWIG
 
 protected:
     void checkIndex(size_t i_axis) const;
 #ifndef SWIG
-    [[noreturn]] void throwUnitsError(std::string method, std::vector<AxesUnits> available) const;
+    [[noreturn]] void throwUnitsError(std::string method, std::vector<Axes::Units> available) const;
 #endif // SWIG
 
 private:
-    virtual std::vector<std::map<AxesUnits, std::string>> createNameMaps() const = 0;
+    virtual std::vector<std::map<Axes::Units, std::string>> createNameMaps() const = 0;
 };
 
 #endif // BORNAGAIN_CORE_INTENSITY_IUNITCONVERTER_H
diff --git a/Core/Intensity/IntensityDataFunctions.cpp b/Core/Intensity/IntensityDataFunctions.cpp
index 79e8583cf2f4a872083ebac177d970f84e781b9e..6f4d3acfa8f81ec6e3b1ef5e1bb4dde546cbf7c3 100644
--- a/Core/Intensity/IntensityDataFunctions.cpp
+++ b/Core/Intensity/IntensityDataFunctions.cpp
@@ -21,8 +21,8 @@
 #include "Core/Intensity/ArrayUtils.h"
 #include "Core/Intensity/IHistogram.h"
 #include "Fit/TestEngine/Numeric.h"
+#include <cmath>
 #include <iostream>
-#include <math.h>
 
 //! Returns sum of relative differences between each pair of elements:
 //! (a, b) -> 2*abs(a - b)/(|a| + |b|)      ( and zero if  a=b=0 within epsilon )
@@ -32,7 +32,7 @@ double IntensityDataFunctions::RelativeDifference(const SimulationResult& dat,
     if (dat.size() != ref.size())
         throw std::runtime_error("Error in IntensityDataFunctions::RelativeDifference: "
                                  "different number of elements");
-    if (dat.size() == 0)
+    if (dat.empty())
         return 0.0;
     double sum_of_diff = 0.0;
     for (size_t i = 0; i < dat.size(); ++i) {
diff --git a/Core/Intensity/OutputDataIterator.h b/Core/Intensity/OutputDataIterator.h
index 64e21e1e2c01a14c776b94dd23f20c1b577a78b2..2d809708cb11cef650d0b5f21ae3bd62100d37af 100644
--- a/Core/Intensity/OutputDataIterator.h
+++ b/Core/Intensity/OutputDataIterator.h
@@ -137,8 +137,8 @@ OutputDataIterator<TValue, TContainer>::OutputDataIterator(
 
 template <class TValue, class TContainer>
 template <class TValue2, class TContainer2>
-OutputDataIterator<TValue, TContainer>& OutputDataIterator<TValue, TContainer>::
-operator=(const OutputDataIterator<TValue2, TContainer2>& right)
+OutputDataIterator<TValue, TContainer>& OutputDataIterator<TValue, TContainer>::operator=(
+    const OutputDataIterator<TValue2, TContainer2>& right)
 {
     OutputDataIterator<TValue, TContainer> copy(right);
     swap(copy);
@@ -146,8 +146,8 @@ operator=(const OutputDataIterator<TValue2, TContainer2>& right)
 }
 
 template <class TValue, class TContainer>
-OutputDataIterator<TValue, TContainer>& OutputDataIterator<TValue, TContainer>::
-operator=(const OutputDataIterator<TValue, TContainer>& right)
+OutputDataIterator<TValue, TContainer>& OutputDataIterator<TValue, TContainer>::operator=(
+    const OutputDataIterator<TValue, TContainer>& right)
 {
     OutputDataIterator<TValue, TContainer> copy(right);
     swap(copy);
diff --git a/Core/Intensity/SimpleUnitConverters.cpp b/Core/Intensity/SimpleUnitConverters.cpp
index e3238c2d5f0f71d27fb0ccb78af8f9520a3f2620..39fcfa43dbe717e4a68f6ea4982474d40e14fecc 100644
--- a/Core/Intensity/SimpleUnitConverters.cpp
+++ b/Core/Intensity/SimpleUnitConverters.cpp
@@ -44,29 +44,29 @@ size_t UnitConverterSimple::dimension() const
 }
 
 void UnitConverterSimple::addAxisData(std::string name, double min, double max,
-                                      AxesUnits default_units, size_t nbins)
+                                      Axes::Units default_units, size_t nbins)
 {
     AxisData axis_data{name, min, max, default_units, nbins};
     m_axis_data_table.push_back(axis_data);
 }
 
-double UnitConverterSimple::calculateMin(size_t i_axis, AxesUnits units_type) const
+double UnitConverterSimple::calculateMin(size_t i_axis, Axes::Units units_type) const
 {
     checkIndex(i_axis);
     units_type = substituteDefaultUnits(units_type);
     const auto& axis_data = m_axis_data_table[i_axis];
-    if (units_type == AxesUnits::NBINS) {
+    if (units_type == Axes::Units::NBINS) {
         return 0.0;
     }
     return calculateValue(i_axis, units_type, axis_data.min);
 }
 
-double UnitConverterSimple::calculateMax(size_t i_axis, AxesUnits units_type) const
+double UnitConverterSimple::calculateMax(size_t i_axis, Axes::Units units_type) const
 {
     checkIndex(i_axis);
     units_type = substituteDefaultUnits(units_type);
     const auto& axis_data = m_axis_data_table[i_axis];
-    if (units_type == AxesUnits::NBINS) {
+    if (units_type == Axes::Units::NBINS) {
         return static_cast<double>(axis_data.nbins);
     }
     return calculateValue(i_axis, units_type, axis_data.max);
@@ -78,13 +78,13 @@ size_t UnitConverterSimple::axisSize(size_t i_axis) const
     return m_axis_data_table[i_axis].nbins;
 }
 
-std::vector<AxesUnits> UnitConverterSimple::availableUnits() const
+std::vector<Axes::Units> UnitConverterSimple::availableUnits() const
 {
-    return {AxesUnits::NBINS, AxesUnits::RADIANS, AxesUnits::DEGREES};
+    return {Axes::Units::NBINS, Axes::Units::RADIANS, Axes::Units::DEGREES};
 }
 
 std::unique_ptr<IAxis> UnitConverterSimple::createConvertedAxis(size_t i_axis,
-                                                                AxesUnits units) const
+                                                                Axes::Units units) const
 {
     const double min = calculateMin(i_axis, units);
     const double max = calculateMax(i_axis, units);
@@ -133,30 +133,30 @@ SphericalConverter* SphericalConverter::clone() const
     return new SphericalConverter(*this);
 }
 
-std::vector<AxesUnits> SphericalConverter::availableUnits() const
+std::vector<Axes::Units> SphericalConverter::availableUnits() const
 {
     auto result = UnitConverterSimple::availableUnits();
-    result.push_back(AxesUnits::QSPACE);
+    result.push_back(Axes::Units::QSPACE);
     return result;
 }
 
-AxesUnits SphericalConverter::defaultUnits() const
+Axes::Units SphericalConverter::defaultUnits() const
 {
-    return AxesUnits::DEGREES;
+    return Axes::Units::DEGREES;
 }
 
 SphericalConverter::SphericalConverter(const SphericalConverter& other) : UnitConverterSimple(other)
 {
 }
 
-double SphericalConverter::calculateValue(size_t i_axis, AxesUnits units_type, double value) const
+double SphericalConverter::calculateValue(size_t i_axis, Axes::Units units_type, double value) const
 {
     switch (units_type) {
-    case AxesUnits::RADIANS:
+    case Axes::Units::RADIANS:
         return value;
-    case AxesUnits::DEGREES:
+    case Axes::Units::DEGREES:
         return Units::rad2deg(value);
-    case AxesUnits::QSPACE: {
+    case Axes::Units::QSPACE: {
         const auto k_i = vecOfLambdaAlphaPhi(m_wavelength, m_alpha_i, m_phi_i);
         if (i_axis == 0) {
             const auto k_f = vecOfLambdaAlphaPhi(m_wavelength, 0.0, value);
@@ -169,7 +169,7 @@ double SphericalConverter::calculateValue(size_t i_axis, AxesUnits units_type, d
                                  "incorrect axis index: "
                                  + std::to_string(static_cast<int>(i_axis)));
     }
-    case AxesUnits::QXQY: {
+    case Axes::Units::QXQY: {
         const auto k_i = vecOfLambdaAlphaPhi(m_wavelength, m_alpha_i, m_phi_i);
         if (i_axis == 0) {
             const auto k_f = vecOfLambdaAlphaPhi(m_wavelength, 0.0, value);
@@ -187,9 +187,9 @@ double SphericalConverter::calculateValue(size_t i_axis, AxesUnits units_type, d
     }
 }
 
-std::vector<std::map<AxesUnits, std::string>> SphericalConverter::createNameMaps() const
+std::vector<std::map<Axes::Units, std::string>> SphericalConverter::createNameMaps() const
 {
-    std::vector<std::map<AxesUnits, std::string>> result;
+    std::vector<std::map<Axes::Units, std::string>> result;
     result.push_back(AxisNames::InitSphericalAxis0());
     result.push_back(AxisNames::InitSphericalAxis1());
     return result;
@@ -216,17 +216,17 @@ RectangularConverter* RectangularConverter::clone() const
     return new RectangularConverter(*this);
 }
 
-std::vector<AxesUnits> RectangularConverter::availableUnits() const
+std::vector<Axes::Units> RectangularConverter::availableUnits() const
 {
     auto result = UnitConverterSimple::availableUnits();
-    result.push_back(AxesUnits::QSPACE);
-    result.push_back(AxesUnits::MM);
+    result.push_back(Axes::Units::QSPACE);
+    result.push_back(Axes::Units::MM);
     return result;
 }
 
-AxesUnits RectangularConverter::defaultUnits() const
+Axes::Units RectangularConverter::defaultUnits() const
 {
-    return AxesUnits::MM;
+    return Axes::Units::MM;
 }
 
 RectangularConverter::RectangularConverter(const RectangularConverter& other)
@@ -234,9 +234,10 @@ RectangularConverter::RectangularConverter(const RectangularConverter& other)
 {
 }
 
-double RectangularConverter::calculateValue(size_t i_axis, AxesUnits units_type, double value) const
+double RectangularConverter::calculateValue(size_t i_axis, Axes::Units units_type,
+                                            double value) const
 {
-    if (units_type == AxesUnits::MM)
+    if (units_type == Axes::Units::MM)
         return value;
     const auto k00 = mP_detector_pixel->getPosition(0.0, 0.0);
     const auto k01 = mP_detector_pixel->getPosition(0.0, 1.0);
@@ -245,11 +246,11 @@ double RectangularConverter::calculateValue(size_t i_axis, AxesUnits units_type,
     const double shift = value - m_axis_data_table[i_axis].min;
     const auto k_f = normalizeToWavelength(k00 + shift * (max_pos - k00).unit());
     switch (units_type) {
-    case AxesUnits::RADIANS:
+    case Axes::Units::RADIANS:
         return axisAngle(i_axis, k_f);
-    case AxesUnits::DEGREES:
+    case Axes::Units::DEGREES:
         return Units::rad2deg(axisAngle(i_axis, k_f));
-    case AxesUnits::QSPACE: {
+    case Axes::Units::QSPACE: {
         const auto k_i = vecOfLambdaAlphaPhi(m_wavelength, m_alpha_i, m_phi_i);
         if (i_axis == 0) {
             return (k_i - k_f).y();
@@ -260,7 +261,7 @@ double RectangularConverter::calculateValue(size_t i_axis, AxesUnits units_type,
                                  "incorrect axis index: "
                                  + std::to_string(static_cast<int>(i_axis)));
     }
-    case AxesUnits::QXQY: {
+    case Axes::Units::QXQY: {
         const auto k_i = vecOfLambdaAlphaPhi(m_wavelength, m_alpha_i, m_phi_i);
         if (i_axis == 0) {
             return (k_i - k_f).y();
@@ -276,9 +277,9 @@ double RectangularConverter::calculateValue(size_t i_axis, AxesUnits units_type,
     }
 }
 
-std::vector<std::map<AxesUnits, std::string>> RectangularConverter::createNameMaps() const
+std::vector<std::map<Axes::Units, std::string>> RectangularConverter::createNameMaps() const
 {
-    std::vector<std::map<AxesUnits, std::string>> result;
+    std::vector<std::map<Axes::Units, std::string>> result;
     result.push_back(AxisNames::InitRectangularAxis0());
     result.push_back(AxisNames::InitRectangularAxis1());
     return result;
@@ -327,9 +328,9 @@ OffSpecularConverter* OffSpecularConverter::clone() const
     return new OffSpecularConverter(*this);
 }
 
-AxesUnits OffSpecularConverter::defaultUnits() const
+Axes::Units OffSpecularConverter::defaultUnits() const
 {
-    return AxesUnits::DEGREES;
+    return Axes::Units::DEGREES;
 }
 
 OffSpecularConverter::OffSpecularConverter(const OffSpecularConverter& other)
@@ -337,21 +338,21 @@ OffSpecularConverter::OffSpecularConverter(const OffSpecularConverter& other)
 {
 }
 
-double OffSpecularConverter::calculateValue(size_t, AxesUnits units_type, double value) const
+double OffSpecularConverter::calculateValue(size_t, Axes::Units units_type, double value) const
 {
     switch (units_type) {
-    case AxesUnits::RADIANS:
+    case Axes::Units::RADIANS:
         return value;
-    case AxesUnits::DEGREES:
+    case Axes::Units::DEGREES:
         return Units::rad2deg(value);
     default:
         throwUnitsError("OffSpecularConverter::calculateValue", availableUnits());
     }
 }
 
-std::vector<std::map<AxesUnits, std::string>> OffSpecularConverter::createNameMaps() const
+std::vector<std::map<Axes::Units, std::string>> OffSpecularConverter::createNameMaps() const
 {
-    std::vector<std::map<AxesUnits, std::string>> result;
+    std::vector<std::map<Axes::Units, std::string>> result;
     result.push_back(AxisNames::InitOffSpecAxis0());
     result.push_back(AxisNames::InitOffSpecAxis1());
     return result;
@@ -410,10 +411,10 @@ DepthProbeConverter* DepthProbeConverter::clone() const
     return new DepthProbeConverter(*this);
 }
 
-std::vector<AxesUnits> DepthProbeConverter::availableUnits() const
+std::vector<Axes::Units> DepthProbeConverter::availableUnits() const
 {
     auto result = UnitConverterSimple::availableUnits();
-    result.push_back(AxesUnits::QSPACE);
+    result.push_back(Axes::Units::QSPACE);
     return result;
 }
 
@@ -422,30 +423,31 @@ DepthProbeConverter::DepthProbeConverter(const DepthProbeConverter& other)
 {
 }
 
-double DepthProbeConverter::calculateValue(size_t i_axis, AxesUnits units_type, double value) const
+double DepthProbeConverter::calculateValue(size_t i_axis, Axes::Units units_type,
+                                           double value) const
 {
     checkUnits(units_type);
     if (i_axis == 1)
         return value; // unit conversions are not applied to sample position axis
     switch (units_type) {
-    case AxesUnits::DEGREES:
+    case Axes::Units::DEGREES:
         return Units::rad2deg(value);
-    case AxesUnits::QSPACE:
+    case Axes::Units::QSPACE:
         return getQ(m_wavelength, value);
     default:
         return value;
     }
 }
 
-std::vector<std::map<AxesUnits, std::string>> DepthProbeConverter::createNameMaps() const
+std::vector<std::map<Axes::Units, std::string>> DepthProbeConverter::createNameMaps() const
 {
-    std::vector<std::map<AxesUnits, std::string>> result;
+    std::vector<std::map<Axes::Units, std::string>> result;
     result.push_back(AxisNames::InitSpecAxis());
     result.push_back(AxisNames::InitSampleDepthAxis());
     return result;
 }
 
-void DepthProbeConverter::checkUnits(AxesUnits units_type) const
+void DepthProbeConverter::checkUnits(Axes::Units units_type) const
 {
     const auto& available_units = availableUnits();
     if (std::find(available_units.begin(), available_units.end(), units_type)
diff --git a/Core/Intensity/SimpleUnitConverters.h b/Core/Intensity/SimpleUnitConverters.h
index efed715448f252e3d0c0711f0e7fdb3ea3b5e02f..1057cc515f9072ed5a83bdd4bd9effb39f9da6a8 100644
--- a/Core/Intensity/SimpleUnitConverters.h
+++ b/Core/Intensity/SimpleUnitConverters.h
@@ -36,27 +36,27 @@ public:
 
     virtual size_t dimension() const final;
 
-    double calculateMin(size_t i_axis, AxesUnits units_type) const final;
-    double calculateMax(size_t i_axis, AxesUnits units_type) const final;
+    double calculateMin(size_t i_axis, Axes::Units units_type) const final;
+    double calculateMax(size_t i_axis, Axes::Units units_type) const final;
     size_t axisSize(size_t i_axis) const final;
 
     //! Returns the list of all available units
-    std::vector<AxesUnits> availableUnits() const override;
+    std::vector<Axes::Units> availableUnits() const override;
 
-    std::unique_ptr<IAxis> createConvertedAxis(size_t i_axis, AxesUnits units) const final;
+    std::unique_ptr<IAxis> createConvertedAxis(size_t i_axis, Axes::Units units) const final;
 
 protected:
     UnitConverterSimple(const UnitConverterSimple& other);
     void addDetectorAxis(const IDetector& detector, size_t i_axis);
 
-    void addAxisData(std::string name, double min, double max, AxesUnits default_units,
+    void addAxisData(std::string name, double min, double max, Axes::Units default_units,
                      size_t nbins);
 
 #ifndef SWIG
     struct AxisData {
         std::string name;
         double min, max;
-        AxesUnits default_units;
+        Axes::Units default_units;
         size_t nbins;
     };
     std::vector<AxisData> m_axis_data_table;
@@ -66,7 +66,7 @@ protected:
     double m_phi_i;
 
 private:
-    virtual double calculateValue(size_t i_axis, AxesUnits units_type, double value) const = 0;
+    virtual double calculateValue(size_t i_axis, Axes::Units units_type, double value) const = 0;
 };
 
 //! IUnitConverter class that handles the unit translations for spherical detectors
@@ -83,14 +83,14 @@ public:
     SphericalConverter* clone() const final;
 
     //! Returns the list of all available units
-    std::vector<AxesUnits> availableUnits() const final;
+    std::vector<Axes::Units> availableUnits() const final;
 
-    AxesUnits defaultUnits() const final;
+    Axes::Units defaultUnits() const final;
 
 private:
     SphericalConverter(const SphericalConverter& other);
-    double calculateValue(size_t i_axis, AxesUnits units_type, double value) const final;
-    std::vector<std::map<AxesUnits, std::string>> createNameMaps() const final;
+    double calculateValue(size_t i_axis, Axes::Units units_type, double value) const final;
+    std::vector<std::map<Axes::Units, std::string>> createNameMaps() const final;
 };
 
 //! IUnitConverter class that handles the unit translations for rectangular detectors
@@ -106,14 +106,14 @@ public:
     RectangularConverter* clone() const final;
 
     //! Returns the list of all available units
-    std::vector<AxesUnits> availableUnits() const final;
+    std::vector<Axes::Units> availableUnits() const final;
 
-    AxesUnits defaultUnits() const final;
+    Axes::Units defaultUnits() const final;
 
 private:
     RectangularConverter(const RectangularConverter& other);
-    double calculateValue(size_t i_axis, AxesUnits units_type, double value) const final;
-    std::vector<std::map<AxesUnits, std::string>> createNameMaps() const final;
+    double calculateValue(size_t i_axis, Axes::Units units_type, double value) const final;
+    std::vector<std::map<Axes::Units, std::string>> createNameMaps() const final;
     kvector_t normalizeToWavelength(kvector_t vector) const;
     double axisAngle(size_t i_axis, kvector_t k_f) const;
     std::unique_ptr<RectangularPixel> mP_detector_pixel;
@@ -132,12 +132,12 @@ public:
 
     OffSpecularConverter* clone() const final;
 
-    AxesUnits defaultUnits() const final;
+    Axes::Units defaultUnits() const final;
 
 private:
     OffSpecularConverter(const OffSpecularConverter& other);
-    double calculateValue(size_t i_axis, AxesUnits units_type, double value) const final;
-    std::vector<std::map<AxesUnits, std::string>> createNameMaps() const final;
+    double calculateValue(size_t i_axis, Axes::Units units_type, double value) const final;
+    std::vector<std::map<Axes::Units, std::string>> createNameMaps() const final;
     void addDetectorYAxis(const IDetector2D& detector);
 };
 
@@ -154,15 +154,15 @@ public:
     DepthProbeConverter* clone() const final;
 
     //! Returns the list of all available units
-    std::vector<AxesUnits> availableUnits() const final;
+    std::vector<Axes::Units> availableUnits() const final;
 
-    AxesUnits defaultUnits() const final { return AxesUnits::DEGREES; }
+    Axes::Units defaultUnits() const final { return Axes::Units::DEGREES; }
 
 private:
     DepthProbeConverter(const DepthProbeConverter& other);
-    double calculateValue(size_t, AxesUnits units_type, double value) const final;
-    std::vector<std::map<AxesUnits, std::string>> createNameMaps() const final;
-    void checkUnits(AxesUnits units_type) const;
+    double calculateValue(size_t, Axes::Units units_type, double value) const final;
+    std::vector<std::map<Axes::Units, std::string>> createNameMaps() const final;
+    void checkUnits(Axes::Units units_type) const;
 };
 
 #endif // BORNAGAIN_CORE_INTENSITY_SIMPLEUNITCONVERTERS_H
diff --git a/Core/Intensity/UnitConverter1D.cpp b/Core/Intensity/UnitConverter1D.cpp
index 6470d7d99f133044ded2e69635b02ab59a42ec60..fed57c1d44c4b7c72817e5210b5974ccf9a27d82 100644
--- a/Core/Intensity/UnitConverter1D.cpp
+++ b/Core/Intensity/UnitConverter1D.cpp
@@ -50,39 +50,39 @@ size_t UnitConverter1D::dimension() const
     return 1u;
 }
 
-double UnitConverter1D::calculateMin(size_t i_axis, AxesUnits units_type) const
+double UnitConverter1D::calculateMin(size_t i_axis, Axes::Units units_type) const
 {
     checkIndex(i_axis);
     units_type = substituteDefaultUnits(units_type);
-    if (units_type == AxesUnits::NBINS)
+    if (units_type == Axes::Units::NBINS)
         return 0.0;
     auto translator = getTraslatorTo(units_type);
     return translator(coordinateAxis()->getBinCenter(0));
 }
 
-double UnitConverter1D::calculateMax(size_t i_axis, AxesUnits units_type) const
+double UnitConverter1D::calculateMax(size_t i_axis, Axes::Units units_type) const
 {
     checkIndex(i_axis);
     units_type = substituteDefaultUnits(units_type);
     auto coordinate_axis = coordinateAxis();
-    if (units_type == AxesUnits::NBINS)
+    if (units_type == Axes::Units::NBINS)
         return static_cast<double>(coordinate_axis->size());
     auto translator = getTraslatorTo(units_type);
     return translator(coordinate_axis->getBinCenter(coordinate_axis->size() - 1));
 }
 
-std::unique_ptr<IAxis> UnitConverter1D::createConvertedAxis(size_t i_axis, AxesUnits units) const
+std::unique_ptr<IAxis> UnitConverter1D::createConvertedAxis(size_t i_axis, Axes::Units units) const
 {
     checkIndex(i_axis);
     units = substituteDefaultUnits(units);
-    if (units == AxesUnits::NBINS)
+    if (units == Axes::Units::NBINS)
         return std::make_unique<FixedBinAxis>(axisName(0, units), coordinateAxis()->size(),
                                               calculateMin(0, units), calculateMax(0, units));
     return createTranslatedAxis(*coordinateAxis(), getTraslatorTo(units), axisName(0, units));
 }
 
 std::unique_ptr<OutputData<double>>
-UnitConverter1D::createConvertedData(const OutputData<double>& data, AxesUnits units) const
+UnitConverter1D::createConvertedData(const OutputData<double>& data, Axes::Units units) const
 {
     if (data.getRank() != 1)
         throw std::runtime_error("Error in UnitConverter1D::createConvertedData: unexpected "
@@ -92,7 +92,7 @@ UnitConverter1D::createConvertedData(const OutputData<double>& data, AxesUnits u
     auto q_axis = createConvertedAxis(0, units);
     result->addAxis(*q_axis);
 
-    if (units != AxesUnits::RQ4) {
+    if (units != Axes::Units::RQ4) {
         result->setRawDataVector(data.getRawDataVector());
         return result;
     }
@@ -103,7 +103,7 @@ UnitConverter1D::createConvertedData(const OutputData<double>& data, AxesUnits u
 }
 
 UnitConverterConvSpec::UnitConverterConvSpec(const Beam& beam, const IAxis& axis,
-                                             AxesUnits axis_units)
+                                             Axes::Units axis_units)
     : m_wavelength(beam.getWavelength())
 {
     m_axis = createTranslatedAxis(axis, getTraslatorFrom(axis_units), axisName(0, axis_units));
@@ -129,15 +129,15 @@ size_t UnitConverterConvSpec::axisSize(size_t i_axis) const
     return m_axis->size();
 }
 
-std::vector<AxesUnits> UnitConverterConvSpec::availableUnits() const
+std::vector<Axes::Units> UnitConverterConvSpec::availableUnits() const
 {
-    return {AxesUnits::NBINS, AxesUnits::RADIANS, AxesUnits::DEGREES, AxesUnits::QSPACE,
-            AxesUnits::RQ4};
+    return {Axes::Units::NBINS, Axes::Units::RADIANS, Axes::Units::DEGREES, Axes::Units::QSPACE,
+            Axes::Units::RQ4};
 }
 
-AxesUnits UnitConverterConvSpec::defaultUnits() const
+Axes::Units UnitConverterConvSpec::defaultUnits() const
 {
-    return AxesUnits::DEGREES;
+    return Axes::Units::DEGREES;
 }
 
 UnitConverterConvSpec::UnitConverterConvSpec(const UnitConverterConvSpec& other)
@@ -145,38 +145,38 @@ UnitConverterConvSpec::UnitConverterConvSpec(const UnitConverterConvSpec& other)
 {
 }
 
-std::vector<std::map<AxesUnits, std::string>> UnitConverterConvSpec::createNameMaps() const
+std::vector<std::map<Axes::Units, std::string>> UnitConverterConvSpec::createNameMaps() const
 {
-    std::vector<std::map<AxesUnits, std::string>> result;
+    std::vector<std::map<Axes::Units, std::string>> result;
     result.push_back(AxisNames::InitSpecAxis());
     return result;
 }
 
-std::function<double(double)> UnitConverterConvSpec::getTraslatorFrom(AxesUnits units_type) const
+std::function<double(double)> UnitConverterConvSpec::getTraslatorFrom(Axes::Units units_type) const
 {
     switch (units_type) {
-    case AxesUnits::RADIANS:
+    case Axes::Units::RADIANS:
         return [](double value) { return value; };
-    case AxesUnits::DEGREES:
+    case Axes::Units::DEGREES:
         return [](double value) { return Units::deg2rad(value); };
-    case AxesUnits::QSPACE:
+    case Axes::Units::QSPACE:
         return [this](double value) { return getInvQ(m_wavelength, value); };
     default:
         throwUnitsError("UnitConverterConvSpec::getTraslatorFrom",
-                        {AxesUnits::RADIANS, AxesUnits::DEGREES, AxesUnits::QSPACE});
+                        {Axes::Units::RADIANS, Axes::Units::DEGREES, Axes::Units::QSPACE});
     }
 }
 
-std::function<double(double)> UnitConverterConvSpec::getTraslatorTo(AxesUnits units_type) const
+std::function<double(double)> UnitConverterConvSpec::getTraslatorTo(Axes::Units units_type) const
 {
     switch (units_type) {
-    case AxesUnits::RADIANS:
+    case Axes::Units::RADIANS:
         return [](double value) { return value; };
-    case AxesUnits::DEGREES:
+    case Axes::Units::DEGREES:
         return [](double value) { return Units::rad2deg(value); };
-    case AxesUnits::QSPACE:
+    case Axes::Units::QSPACE:
         return [wl = m_wavelength](double value) { return getQ(wl, value); };
-    case AxesUnits::RQ4:
+    case Axes::Units::RQ4:
         return [wl = m_wavelength](double value) { return getQ(wl, value); };
     default:
         throwUnitsError("UnitConverterConvSpec::getTraslatorTo", availableUnits());
@@ -203,15 +203,15 @@ size_t UnitConverterQSpec::axisSize(size_t i_axis) const
 }
 
 //! Returns the list of all available units
-std::vector<AxesUnits> UnitConverterQSpec::availableUnits() const
+std::vector<Axes::Units> UnitConverterQSpec::availableUnits() const
 {
-    return {AxesUnits::NBINS, AxesUnits::QSPACE, AxesUnits::RQ4};
+    return {Axes::Units::NBINS, Axes::Units::QSPACE, Axes::Units::RQ4};
 }
 
 //! Returns default units to convert to.
-AxesUnits UnitConverterQSpec::defaultUnits() const
+Axes::Units UnitConverterQSpec::defaultUnits() const
 {
-    return AxesUnits::QSPACE;
+    return Axes::Units::QSPACE;
 }
 
 UnitConverterQSpec::UnitConverterQSpec(const UnitConverterQSpec& other)
@@ -220,20 +220,20 @@ UnitConverterQSpec::UnitConverterQSpec(const UnitConverterQSpec& other)
 }
 
 //! Creates name map for axis in various units
-std::vector<std::map<AxesUnits, std::string>> UnitConverterQSpec::createNameMaps() const
+std::vector<std::map<Axes::Units, std::string>> UnitConverterQSpec::createNameMaps() const
 {
-    std::vector<std::map<AxesUnits, std::string>> result;
+    std::vector<std::map<Axes::Units, std::string>> result;
     result.push_back(AxisNames::InitSpecAxisQ());
     return result;
 }
 
 //! Returns translating functional (inv. nm --> desired units)
-std::function<double(double)> UnitConverterQSpec::getTraslatorTo(AxesUnits units_type) const
+std::function<double(double)> UnitConverterQSpec::getTraslatorTo(Axes::Units units_type) const
 {
     switch (units_type) {
-    case AxesUnits::QSPACE:
+    case Axes::Units::QSPACE:
         return [](double value) { return value; };
-    case AxesUnits::RQ4:
+    case Axes::Units::RQ4:
         return [](double value) { return value; };
     default:
         throwUnitsError("UnitConverterQSpec::getTraslatorTo", availableUnits());
diff --git a/Core/Intensity/UnitConverter1D.h b/Core/Intensity/UnitConverter1D.h
index 7f70d36b72c5906842fd6e4212e0557d57f192f9..663e7a543d6933891dee3d1e1697632269be479c 100644
--- a/Core/Intensity/UnitConverter1D.h
+++ b/Core/Intensity/UnitConverter1D.h
@@ -40,21 +40,21 @@ public:
     size_t dimension() const override;
 
     //! Calculates minimum on-axis value in given units.
-    double calculateMin(size_t i_axis, AxesUnits units_type) const override;
+    double calculateMin(size_t i_axis, Axes::Units units_type) const override;
 
     //! Calculates maximum on-axis value in given units.
-    double calculateMax(size_t i_axis, AxesUnits units_type) const override;
+    double calculateMax(size_t i_axis, Axes::Units units_type) const override;
 
     //! Creates axis in converted units.
-    std::unique_ptr<IAxis> createConvertedAxis(size_t i_axis, AxesUnits units) const override;
+    std::unique_ptr<IAxis> createConvertedAxis(size_t i_axis, Axes::Units units) const override;
 
     //! Creates OutputData array in converter units.
     std::unique_ptr<OutputData<double>> createConvertedData(const OutputData<double>& data,
-                                                            AxesUnits units) const override;
+                                                            Axes::Units units) const override;
 
 protected:
     //! Returns translating functional (rads --> output units)
-    virtual std::function<double(double)> getTraslatorTo(AxesUnits units_type) const = 0;
+    virtual std::function<double(double)> getTraslatorTo(Axes::Units units_type) const = 0;
 
     virtual const IAxis* coordinateAxis() const = 0;
 };
@@ -65,7 +65,7 @@ class UnitConverterConvSpec : public UnitConverter1D
 public:
     //! Constructs the object for unit conversion.
     UnitConverterConvSpec(const Beam& beam, const IAxis& axis,
-                          AxesUnits axis_units = AxesUnits::RADIANS);
+                          Axes::Units axis_units = Axes::Units::RADIANS);
     UnitConverterConvSpec(const AngularSpecScan& handler);
     ~UnitConverterConvSpec() override;
 
@@ -75,22 +75,22 @@ public:
     size_t axisSize(size_t i_axis) const override;
 
     //! Returns the list of all available units
-    std::vector<AxesUnits> availableUnits() const override;
+    std::vector<Axes::Units> availableUnits() const override;
 
     //! Returns default units to convert to.
-    AxesUnits defaultUnits() const override;
+    Axes::Units defaultUnits() const override;
 
 protected:
     UnitConverterConvSpec(const UnitConverterConvSpec& other);
 
     //! Creates name map for axis in various units
-    std::vector<std::map<AxesUnits, std::string>> createNameMaps() const override;
+    std::vector<std::map<Axes::Units, std::string>> createNameMaps() const override;
 
     //! Returns translating functional (input units --> rads)
-    std::function<double(double)> getTraslatorFrom(AxesUnits units_type) const;
+    std::function<double(double)> getTraslatorFrom(Axes::Units units_type) const;
 
     //! Returns translating functional (rads --> desired units)
-    std::function<double(double)> getTraslatorTo(AxesUnits units_type) const override;
+    std::function<double(double)> getTraslatorTo(Axes::Units units_type) const override;
 
     const IAxis* coordinateAxis() const override { return m_axis.get(); }
 
@@ -111,19 +111,19 @@ public:
     size_t axisSize(size_t i_axis) const override;
 
     //! Returns the list of all available units
-    std::vector<AxesUnits> availableUnits() const override;
+    std::vector<Axes::Units> availableUnits() const override;
 
     //! Returns default units to convert to.
-    AxesUnits defaultUnits() const override;
+    Axes::Units defaultUnits() const override;
 
 protected:
     UnitConverterQSpec(const UnitConverterQSpec& other);
 
     //! Creates name map for axis in various units
-    std::vector<std::map<AxesUnits, std::string>> createNameMaps() const override;
+    std::vector<std::map<Axes::Units, std::string>> createNameMaps() const override;
 
     //! Returns translating functional (inv. nm --> desired units)
-    std::function<double(double)> getTraslatorTo(AxesUnits units_type) const override;
+    std::function<double(double)> getTraslatorTo(Axes::Units units_type) const override;
 
     const IAxis* coordinateAxis() const override { return m_axis.get(); }
 
diff --git a/Core/Material/MaterialBySLDImpl.cpp b/Core/Material/MaterialBySLDImpl.cpp
index 586d78b04baa0158cdf341d2d5e2336ad84f6079..32961d316cfae264ac8d935756fc094625f93d93 100644
--- a/Core/Material/MaterialBySLDImpl.cpp
+++ b/Core/Material/MaterialBySLDImpl.cpp
@@ -30,7 +30,7 @@ MaterialBySLDImpl::MaterialBySLDImpl(const std::string& name, double sld_real, d
                                      kvector_t magnetization)
     : MagneticMaterialImpl(name, magnetization), m_sld_real(sld_real),
       m_sld_imag(sld_imag < 0. ? throw std::runtime_error(
-                                     "The imaginary part of the SLD must be greater or equal zero")
+                     "The imaginary part of the SLD must be greater or equal zero")
                                : sld_imag)
 {
 }
diff --git a/Core/Material/RefractiveMaterialImpl.cpp b/Core/Material/RefractiveMaterialImpl.cpp
index 9709fea4a3ef9bc2a0c822928ca0810fcc86d1f9..eae8b95d44f1bce0f1e1cfdcb8206366c7d9c492 100644
--- a/Core/Material/RefractiveMaterialImpl.cpp
+++ b/Core/Material/RefractiveMaterialImpl.cpp
@@ -18,10 +18,9 @@
 RefractiveMaterialImpl::RefractiveMaterialImpl(const std::string& name, double delta, double beta,
                                                kvector_t magnetization)
     : MagneticMaterialImpl(name, magnetization), m_delta(delta),
-      m_beta(beta < 0.
-                 ? throw std::runtime_error(
-                       "The imaginary part of the refractive index must be greater or equal zero")
-                 : beta)
+      m_beta(beta < 0. ? throw std::runtime_error(
+                 "The imaginary part of the refractive index must be greater or equal zero")
+                       : beta)
 {
 }
 
diff --git a/Core/Multilayer/FormFactorDWBA.cpp b/Core/Multilayer/FormFactorDWBA.cpp
index 91c817e20975a909020727c188dbe7d3dbc95c2d..da838a4dc28da2def9bb3de5de7597ac57bc3620 100644
--- a/Core/Multilayer/FormFactorDWBA.cpp
+++ b/Core/Multilayer/FormFactorDWBA.cpp
@@ -21,7 +21,7 @@ FormFactorDWBA::FormFactorDWBA(const IFormFactor& form_factor) : mP_form_factor(
     setName("FormFactorDWBA");
 }
 
-FormFactorDWBA::~FormFactorDWBA() {}
+FormFactorDWBA::~FormFactorDWBA() = default;
 
 FormFactorDWBA* FormFactorDWBA::clone() const
 {
diff --git a/Core/Multilayer/FormFactorDWBAPol.cpp b/Core/Multilayer/FormFactorDWBAPol.cpp
index b0ad6cfdee67b97ef92970951ff78b876b4eb35b..8ac9694656844f4397ea9e5bcfb0d7550e3d11fd 100644
--- a/Core/Multilayer/FormFactorDWBAPol.cpp
+++ b/Core/Multilayer/FormFactorDWBAPol.cpp
@@ -31,7 +31,7 @@ FormFactorDWBAPol::FormFactorDWBAPol(const IFormFactor& form_factor)
     setName("FormFactorDWBAPol");
 }
 
-FormFactorDWBAPol::~FormFactorDWBAPol() {}
+FormFactorDWBAPol::~FormFactorDWBAPol() = default;
 
 FormFactorDWBAPol* FormFactorDWBAPol::clone() const
 {
diff --git a/Core/Multilayer/IInterferenceFunctionStrategy.cpp b/Core/Multilayer/IInterferenceFunctionStrategy.cpp
index 96277e44db91c178de3830300026ef968824eeae..704419b984b408f9636e10d05ae18dadbf4a5365 100644
--- a/Core/Multilayer/IInterferenceFunctionStrategy.cpp
+++ b/Core/Multilayer/IInterferenceFunctionStrategy.cpp
@@ -33,7 +33,7 @@ void IInterferenceFunctionStrategy::init(
     const std::vector<FormFactorCoherentSum>& weighted_formfactors,
     const IInterferenceFunction* p_iff)
 {
-    if (weighted_formfactors.size() == 0)
+    if (weighted_formfactors.empty())
         throw Exceptions::ClassInitializationException(
             "IInterferenceFunctionStrategy::init: strategy gets no form factors.");
     m_formfactor_wrappers = weighted_formfactors;
diff --git a/Core/Multilayer/KzComputation.cpp b/Core/Multilayer/KzComputation.cpp
index f998cac554e53ec13a73e83a4d379a1ff081db1c..4fa78bf44c51b813842caab05dbb7eb54c8b464a 100644
--- a/Core/Multilayer/KzComputation.cpp
+++ b/Core/Multilayer/KzComputation.cpp
@@ -14,8 +14,6 @@
 
 #include "Core/Multilayer/KzComputation.h"
 #include "Core/Basics/Units.h"
-#include "Core/Multilayer/Layer.h"
-#include "Core/Multilayer/MultiLayer.h"
 #include "Core/Multilayer/Slice.h"
 
 namespace
diff --git a/Core/Multilayer/Layer.cpp b/Core/Multilayer/Layer.cpp
index 76e5d3097415f6ffabd9d0a178092833df652608..4d351d19be9ca1e9627da9361264f665064e5bd0 100644
--- a/Core/Multilayer/Layer.cpp
+++ b/Core/Multilayer/Layer.cpp
@@ -28,7 +28,7 @@ Layer::Layer(Material material, double thickness)
     registerThickness();
 }
 
-Layer::~Layer() {}
+Layer::~Layer() = default;
 
 Layer* Layer::clone() const
 {
diff --git a/Core/Multilayer/LayerInterface.cpp b/Core/Multilayer/LayerInterface.cpp
index 7b426a0c0ee7af93afd205a238b3808de48710b4..2fff35fd2b51e670a903ec29000ac0a419dc41e3 100644
--- a/Core/Multilayer/LayerInterface.cpp
+++ b/Core/Multilayer/LayerInterface.cpp
@@ -21,7 +21,7 @@ LayerInterface::LayerInterface() : m_topLayer(nullptr), m_bottomLayer(nullptr)
     setName("LayerInterface");
 }
 
-LayerInterface::~LayerInterface() {}
+LayerInterface::~LayerInterface() = default;
 
 LayerInterface* LayerInterface::clone() const
 {
diff --git a/Core/Multilayer/MultiLayer.cpp b/Core/Multilayer/MultiLayer.cpp
index f819e4334da45bb5ca7d79697311d7839b6ecf0b..284769d2408148b211ef0e9b844d565ca535c2ae 100644
--- a/Core/Multilayer/MultiLayer.cpp
+++ b/Core/Multilayer/MultiLayer.cpp
@@ -144,7 +144,7 @@ void MultiLayer::handleLayerThicknessRegistration()
 {
     size_t n_layers = numberOfLayers();
     for (size_t i = 0; i < numberOfLayers(); ++i)
-        m_layers[i]->registerThickness(i>0 && i<n_layers - 1);
+        m_layers[i]->registerThickness(i > 0 && i < n_layers - 1);
 }
 
 size_t MultiLayer::check_layer_index(size_t i_layer) const
diff --git a/Core/Multilayer/SpecularSimulationElement.cpp b/Core/Multilayer/SpecularSimulationElement.cpp
index bce595d48c8af95fbcca448d1b08c973769909e1..0489fdb21441eb4c4961421d86670f3f1fcbc326 100644
--- a/Core/Multilayer/SpecularSimulationElement.cpp
+++ b/Core/Multilayer/SpecularSimulationElement.cpp
@@ -14,8 +14,6 @@
 
 #include "Core/Multilayer/SpecularSimulationElement.h"
 #include "Core/Multilayer/KzComputation.h"
-#include "Core/Multilayer/Layer.h"
-#include "Core/Multilayer/MultiLayer.h"
 
 SpecularSimulationElement::SpecularSimulationElement(double kz)
     : m_intensity(0.0), m_calculation_flag(true),
@@ -49,8 +47,8 @@ SpecularSimulationElement::SpecularSimulationElement(SpecularSimulationElement&&
 
 SpecularSimulationElement::~SpecularSimulationElement() = default;
 
-SpecularSimulationElement& SpecularSimulationElement::
-operator=(const SpecularSimulationElement& other)
+SpecularSimulationElement&
+SpecularSimulationElement::operator=(const SpecularSimulationElement& other)
 {
     if (this != &other) {
         SpecularSimulationElement tmp(other);
diff --git a/Core/Parametrization/DistributionHandler.cpp b/Core/Parametrization/DistributionHandler.cpp
index 26a52ccdb234b8de01125b94b1580f7059835b18..3011e1314cbf18bc2cf882f44cc3f3d24337c0c2 100644
--- a/Core/Parametrization/DistributionHandler.cpp
+++ b/Core/Parametrization/DistributionHandler.cpp
@@ -23,7 +23,7 @@ DistributionHandler::DistributionHandler() : m_nbr_combinations(1)
     setName("DistributionHandler");
 }
 
-DistributionHandler::~DistributionHandler() {}
+DistributionHandler::~DistributionHandler() = default;
 
 void DistributionHandler::addParameterDistribution(const ParameterDistribution& par_distr)
 {
diff --git a/Core/Parametrization/Distributions.cpp b/Core/Parametrization/Distributions.cpp
index bfafd06bd2cb6e1060f4c3349badd94aa9571add..9b2debaad75a76720029b4ffe55088a399576044 100644
--- a/Core/Parametrization/Distributions.cpp
+++ b/Core/Parametrization/Distributions.cpp
@@ -125,11 +125,11 @@ IDistribution1D::generateSamplesFromValues(const std::vector<double>& sample_val
 // ************************************************************************** //
 
 DistributionGate::DistributionGate(const std::vector<double> P)
-    : IDistribution1D({"DistributionGate",
-                       "class_tooltip",
-                       {{"Min", "", "para_tooltip", -INF, +INF, 0},
-                        {"Max", "", "para_tooltip", -INF, +INF, 0}}},
-                      P),
+    : IDistribution1D(
+        {"DistributionGate",
+         "class_tooltip",
+         {{"Min", "", "para_tooltip", -INF, +INF, 0}, {"Max", "", "para_tooltip", -INF, +INF, 0}}},
+        P),
       m_min(m_P[0]), m_max(m_P[1])
 {
     if (m_max < m_min)
diff --git a/Core/Parametrization/IParameterized.cpp b/Core/Parametrization/IParameterized.cpp
index 82e67b66b502a89783a8f9f8ecd767bbb9f154ca..f0a034ae8a39d583f87a1b23ebe30b8bec90d176 100644
--- a/Core/Parametrization/IParameterized.cpp
+++ b/Core/Parametrization/IParameterized.cpp
@@ -25,7 +25,7 @@ IParameterized::IParameterized(const std::string& name) : m_name{name}, m_pool{n
 
 IParameterized::IParameterized(const IParameterized& other) : IParameterized(other.getName())
 {
-    if (other.parameterPool()->size())
+    if (!other.parameterPool()->empty())
         throw std::runtime_error("BUG: not prepared to copy parameters of " + getName());
 }
 
diff --git a/Core/Parametrization/IterationStrategy.cpp b/Core/Parametrization/IterationStrategy.cpp
index 48aeb7793ea78a8c61c5d61e365a776ffcf5cd85..399908577f6d6ae8a9776f6f1ecc8da82377ca28 100644
--- a/Core/Parametrization/IterationStrategy.cpp
+++ b/Core/Parametrization/IterationStrategy.cpp
@@ -17,7 +17,7 @@
 #include "Core/Parametrization/INode.h"
 #include "Core/Parametrization/NodeIterator.h"
 
-PreorderStrategy::PreorderStrategy() {}
+PreorderStrategy::PreorderStrategy() = default;
 
 PreorderStrategy* PreorderStrategy::clone() const
 {
@@ -53,7 +53,7 @@ bool PreorderStrategy::isDone(IteratorMemento& iterator_stack) const
     return iterator_stack.empty();
 }
 
-PostorderStrategy::PostorderStrategy() {}
+PostorderStrategy::PostorderStrategy() = default;
 
 PostorderStrategy* PostorderStrategy::clone() const
 {
diff --git a/Core/Parametrization/ParameterDistribution.cpp b/Core/Parametrization/ParameterDistribution.cpp
index ea429334efecda8fe76ec45e1db9173b79d5c056..0e84f67364110b2a3ad21f343aa8a40d4dd464ce 100644
--- a/Core/Parametrization/ParameterDistribution.cpp
+++ b/Core/Parametrization/ParameterDistribution.cpp
@@ -68,7 +68,7 @@ ParameterDistribution::ParameterDistribution(const ParameterDistribution& other)
     mP_distribution.reset(other.mP_distribution->clone());
 }
 
-ParameterDistribution::~ParameterDistribution() {}
+ParameterDistribution::~ParameterDistribution() = default;
 
 ParameterDistribution& ParameterDistribution::operator=(const ParameterDistribution& other)
 {
diff --git a/Core/Parametrization/ParameterPool.cpp b/Core/Parametrization/ParameterPool.cpp
index 88610abcb1bc81ba0cbc4e47113d7c63a14085ae..99cbaf84bd019abbec09ad221e2a8e025449a50b 100644
--- a/Core/Parametrization/ParameterPool.cpp
+++ b/Core/Parametrization/ParameterPool.cpp
@@ -25,7 +25,7 @@
 
 //! Constructs an empty parameter pool.
 
-ParameterPool::ParameterPool() {}
+ParameterPool::ParameterPool() = default;
 
 ParameterPool::~ParameterPool()
 {
diff --git a/Core/Parametrization/ParameterPool.h b/Core/Parametrization/ParameterPool.h
index 97988e29b5462e3545903c080f3f7a94d700bcf9..0ffc380d9b33edfc38109d1f4a0021a71e46eb4a 100644
--- a/Core/Parametrization/ParameterPool.h
+++ b/Core/Parametrization/ParameterPool.h
@@ -40,6 +40,7 @@ public:
 
     //! Returns number of parameters in the pool.
     size_t size() const { return m_params.size(); }
+    bool empty() const { return size() == 0; }
 
     RealParameter& addParameter(RealParameter* newPar);
 
diff --git a/Core/Particle/Crystal.cpp b/Core/Particle/Crystal.cpp
index 17e06f3bc1597a0b3bd1d601ab7119b049ad1811..e4b17a82febd9c57937722bc545459641bc5a59b 100644
--- a/Core/Particle/Crystal.cpp
+++ b/Core/Particle/Crystal.cpp
@@ -27,7 +27,7 @@ Crystal::Crystal(const IParticle& lattice_basis, const Lattice& lattice)
     registerChild(&m_lattice);
 }
 
-Crystal::~Crystal() {}
+Crystal::~Crystal() = default;
 
 Crystal* Crystal::clone() const
 {
diff --git a/Core/Particle/FormFactorCoreShell.cpp b/Core/Particle/FormFactorCoreShell.cpp
index 6d14bd774fb4cb4f534dced9f79f07ab458484d3..73d26288ce04fa8cb221a9d57d6131579c24df4b 100644
--- a/Core/Particle/FormFactorCoreShell.cpp
+++ b/Core/Particle/FormFactorCoreShell.cpp
@@ -20,7 +20,7 @@ FormFactorCoreShell::FormFactorCoreShell(IFormFactor* core, IFormFactor* shell)
     setName("FormFactorCoreShell");
 }
 
-FormFactorCoreShell::~FormFactorCoreShell() {}
+FormFactorCoreShell::~FormFactorCoreShell() = default;
 
 FormFactorCoreShell* FormFactorCoreShell::clone() const
 {
diff --git a/Core/Particle/FormFactorWeighted.cpp b/Core/Particle/FormFactorWeighted.cpp
index 71c192bffc1195e118cfdc73a7eb1961b8e34463..defc4782d302d136e4ddcced748713031c1ee2ce 100644
--- a/Core/Particle/FormFactorWeighted.cpp
+++ b/Core/Particle/FormFactorWeighted.cpp
@@ -44,7 +44,7 @@ double FormFactorWeighted::radialExtension() const
 
 double FormFactorWeighted::bottomZ(const IRotation& rotation) const
 {
-    if (m_form_factors.size() == 0)
+    if (m_form_factors.empty())
         throw std::runtime_error("FormFactorWeighted::bottomZ() -> Error: "
                                  "'this' contains no form factors.");
     return algo::min_value(m_form_factors.begin(), m_form_factors.end(),
@@ -53,7 +53,7 @@ double FormFactorWeighted::bottomZ(const IRotation& rotation) const
 
 double FormFactorWeighted::topZ(const IRotation& rotation) const
 {
-    if (m_form_factors.size() == 0)
+    if (m_form_factors.empty())
         throw std::runtime_error("FormFactorWeighted::topZ() -> Error: "
                                  "'this' contains no form factors.");
     return algo::max_value(m_form_factors.begin(), m_form_factors.end(),
diff --git a/Core/Particle/MesoCrystal.cpp b/Core/Particle/MesoCrystal.cpp
index ad583abd77561aaa30d7eb38ef1ef1108d874583..a6184eac39a5e1f330122756b67641e08a747509 100644
--- a/Core/Particle/MesoCrystal.cpp
+++ b/Core/Particle/MesoCrystal.cpp
@@ -24,7 +24,7 @@ MesoCrystal::MesoCrystal(const IClusteredParticles& particle_structure,
     initialize();
 }
 
-MesoCrystal::~MesoCrystal() {}
+MesoCrystal::~MesoCrystal() = default;
 
 MesoCrystal* MesoCrystal::clone() const
 {
diff --git a/Core/Particle/ParticleComposition.cpp b/Core/Particle/ParticleComposition.cpp
index e104cf0e208215fd6cfff3b97e8c99fdc3106f39..053ee5dfe97b7abb80d23349dc1a725f875e36f8 100644
--- a/Core/Particle/ParticleComposition.cpp
+++ b/Core/Particle/ParticleComposition.cpp
@@ -29,7 +29,7 @@ ParticleComposition::ParticleComposition(const IParticle& particle,
     addParticles(particle, positions);
 }
 
-ParticleComposition::~ParticleComposition() {}
+ParticleComposition::~ParticleComposition() = default;
 
 ParticleComposition* ParticleComposition::clone() const
 {
@@ -45,7 +45,7 @@ ParticleComposition* ParticleComposition::clone() const
 
 IFormFactor* ParticleComposition::createFormFactor() const
 {
-    if (m_particles.size() == 0)
+    if (m_particles.empty())
         return {};
     std::unique_ptr<FormFactorWeighted> P_result{new FormFactorWeighted()};
     auto particles = decompose();
@@ -119,7 +119,7 @@ size_t ParticleComposition::check_index(size_t index) const
     return index < m_particles.size()
                ? index
                : throw Exceptions::OutOfBoundsException(
-                     "ParticleComposition::check_index() -> Index is out of bounds");
+                   "ParticleComposition::check_index() -> Index is out of bounds");
 }
 
 void ParticleComposition::addParticlePointer(IParticle* p_particle)
diff --git a/Core/Particle/ParticleCoreShell.cpp b/Core/Particle/ParticleCoreShell.cpp
index 50e910fa326be88928cb2a2bbe9bd497f5676ece..f425e8ae444231979609865fb20d9a3ceab54472 100644
--- a/Core/Particle/ParticleCoreShell.cpp
+++ b/Core/Particle/ParticleCoreShell.cpp
@@ -25,13 +25,13 @@ ParticleCoreShell::ParticleCoreShell(const Particle& shell, const Particle& core
     addAndRegisterShell(shell);
 }
 
-ParticleCoreShell::~ParticleCoreShell() {}
+ParticleCoreShell::~ParticleCoreShell() = default;
 
 ParticleCoreShell* ParticleCoreShell::clone() const
 {
     ParticleCoreShell* p_result = new ParticleCoreShell(*mp_shell, *mp_core);
     p_result->setAbundance(m_abundance);
-    if (mP_rotation.get())
+    if (mP_rotation)
         p_result->setRotation(*mP_rotation);
     p_result->setPosition(m_position);
     return p_result;
diff --git a/Core/PyIO/PyEmbeddedUtils.cpp b/Core/PyIO/PyEmbeddedUtils.cpp
index 4fa52fb62c8ebda82d1ed168dfa15360c5c50f26..b1164ac30432821ab98f82fbe042c3349b452393 100644
--- a/Core/PyIO/PyEmbeddedUtils.cpp
+++ b/Core/PyIO/PyEmbeddedUtils.cpp
@@ -15,11 +15,11 @@
 #ifdef BORNAGAIN_PYTHON
 
 #include "Core/PyIO/PyEmbeddedUtils.h"
-#include "Core/Multilayer/MultiLayer.h"
 #include "Core/PyIO/PythonFormatting.h"
 #include "Core/Tools/PythonCore.h"
 #include "Core/Tools/SysUtils.h"
 #include <iostream>
+#include <sstream>
 #include <stdexcept>
 
 std::string PyEmbeddedUtils::toString(PyObject* obj)
diff --git a/Core/SampleBuilderEngine/FixedBuilder.cpp b/Core/SampleBuilderEngine/FixedBuilder.cpp
index 786dc4df6679e8be7840210672ce08a802986f0b..b6e49805b41667dcb0b94987e49e3f8845414ca6 100644
--- a/Core/SampleBuilderEngine/FixedBuilder.cpp
+++ b/Core/SampleBuilderEngine/FixedBuilder.cpp
@@ -15,10 +15,7 @@
 #include "Core/SampleBuilderEngine/FixedBuilder.h"
 #include "Core/Multilayer/MultiLayer.h"
 
-FixedBuilder::FixedBuilder(const MultiLayer& sample)
-    : m_sample(sample.clone())
-{
-}
+FixedBuilder::FixedBuilder(const MultiLayer& sample) : m_sample(sample.clone()) {}
 
 MultiLayer* FixedBuilder::buildSample() const
 {
diff --git a/Core/SampleBuilderEngine/FixedBuilder.h b/Core/SampleBuilderEngine/FixedBuilder.h
index fd5576fc149a913b4639065a66b02e669951c7a4..c529cb07147e8ce5002ae393e28860ec4748f043 100644
--- a/Core/SampleBuilderEngine/FixedBuilder.h
+++ b/Core/SampleBuilderEngine/FixedBuilder.h
@@ -28,6 +28,7 @@ public:
     FixedBuilder() = delete;
     FixedBuilder(const MultiLayer&);
     MultiLayer* buildSample() const;
+
 private:
     std::unique_ptr<const MultiLayer> m_sample;
 };
diff --git a/Core/SampleBuilderEngine/SampleBuilderNode.h b/Core/SampleBuilderEngine/SampleBuilderNode.h
index a71d2c464880257ea71ed46b9d60bc1c974e6a89..07f93bb77b385c99e630f4b1ce6ace8ea1c67e9d 100644
--- a/Core/SampleBuilderEngine/SampleBuilderNode.h
+++ b/Core/SampleBuilderEngine/SampleBuilderNode.h
@@ -27,7 +27,6 @@ class ISampleBuilder;
 class SampleBuilderNode : public INode
 {
 public:
-
     SampleBuilderNode();
     SampleBuilderNode(const SampleBuilderNode& other);
     SampleBuilderNode& operator=(const SampleBuilderNode& other);
diff --git a/Core/SampleBuilderEngine/SampleComponents.cpp b/Core/SampleBuilderEngine/SampleComponents.cpp
index b90803bf005ba94479d921891aea52189b5dbb9f..55027af001272a0c37a1d03b256b6b68425d4c6c 100644
--- a/Core/SampleBuilderEngine/SampleComponents.cpp
+++ b/Core/SampleBuilderEngine/SampleComponents.cpp
@@ -14,7 +14,7 @@
 
 #include "Core/SampleBuilderEngine/SampleComponents.h"
 #include "Core/Basics/Units.h"
-#include "Core/includeIncludes/HardParticles.h"
+#include "Core/HardParticle/HardParticles.h"
 
 // ************************************************************************** //
 FTDistribution2DComponents::FTDistribution2DComponents()
diff --git a/Core/SampleBuilderEngine/SampleProvider.cpp b/Core/SampleBuilderEngine/SampleProvider.cpp
index f975fe2073c56bdf2a59b0ff9614ce06a194ae05..fcf27e366e647d1b36a23d9c195fb7774b973616 100644
--- a/Core/SampleBuilderEngine/SampleProvider.cpp
+++ b/Core/SampleBuilderEngine/SampleProvider.cpp
@@ -15,7 +15,7 @@
 #include "Core/SampleBuilderEngine/SampleProvider.h"
 #include "Core/Multilayer/MultiLayer.h"
 
-SampleProvider::SampleProvider() {}
+SampleProvider::SampleProvider() = default;
 
 SampleProvider::SampleProvider(const SampleProvider& other) : INode()
 {
@@ -36,7 +36,7 @@ SampleProvider& SampleProvider::operator=(const SampleProvider& other)
     return *this;
 }
 
-SampleProvider::~SampleProvider() {}
+SampleProvider::~SampleProvider() = default;
 
 void SampleProvider::setSample(const MultiLayer& multilayer)
 {
diff --git a/Core/Scattering/FormFactorDecoratorMaterial.cpp b/Core/Scattering/FormFactorDecoratorMaterial.cpp
index 003010b9a515c71e72b0b8b0197154c29ea4e0e5..635058a976fe83c6ce925e6d01354808358b5399 100644
--- a/Core/Scattering/FormFactorDecoratorMaterial.cpp
+++ b/Core/Scattering/FormFactorDecoratorMaterial.cpp
@@ -24,7 +24,7 @@ FormFactorDecoratorMaterial::FormFactorDecoratorMaterial(const IFormFactor& form
     setName("FormFactorDecoratorMaterial");
 }
 
-FormFactorDecoratorMaterial::~FormFactorDecoratorMaterial() {}
+FormFactorDecoratorMaterial::~FormFactorDecoratorMaterial() = default;
 
 FormFactorDecoratorMaterial* FormFactorDecoratorMaterial::clone() const
 {
diff --git a/Core/Scattering/IFormFactor.cpp b/Core/Scattering/IFormFactor.cpp
index 4a3d42d2d99119245103bfae0119493332dba9a1..522e249eaefc8f23f48b02b205c9e0dc523eb626 100644
--- a/Core/Scattering/IFormFactor.cpp
+++ b/Core/Scattering/IFormFactor.cpp
@@ -82,11 +82,11 @@ IFormFactor* createTransformedFormFactor(const IFormFactor& formfactor, const IR
 {
     std::unique_ptr<IFormFactor> P_fftemp, P_result;
     if (!rot.isIdentity())
-        P_fftemp.reset(new FormFactorDecoratorRotation(formfactor, rot));
+        P_fftemp = std::make_unique<FormFactorDecoratorRotation>(formfactor, rot);
     else
         P_fftemp.reset(formfactor.clone());
     if (translation != kvector_t())
-        P_result.reset(new FormFactorDecoratorPositionFactor(*P_fftemp, translation));
+        P_result = std::make_unique<FormFactorDecoratorPositionFactor>(*P_fftemp, translation);
     else
         std::swap(P_fftemp, P_result);
     return P_result.release();
diff --git a/Core/Scattering/Rotations.cpp b/Core/Scattering/Rotations.cpp
index cb4388133056accdcaf12f461f313e91ab7c63d4..fb499db3e0c13fcb671ffbe54cd33f103b583696 100644
--- a/Core/Scattering/Rotations.cpp
+++ b/Core/Scattering/Rotations.cpp
@@ -102,8 +102,8 @@ Transform3D IdentityRotation::getTransform3D() const
 //! @param angle: rotation angle around x-axis in radians
 RotationX::RotationX(const std::vector<double> P)
     : IRotation(
-          {"XRotation", "class_tooltip", {{"Angle", "rad", "Angle around x axis", -INF, +INF, 0}}},
-          P),
+        {"XRotation", "class_tooltip", {{"Angle", "rad", "Angle around x axis", -INF, +INF, 0}}},
+        P),
       m_angle(m_P[0])
 {
 }
@@ -123,8 +123,8 @@ Transform3D RotationX::getTransform3D() const
 //! @param angle: rotation angle around y-axis in radians
 RotationY::RotationY(const std::vector<double> P)
     : IRotation(
-          {"YRotation", "class_tooltip", {{"Angle", "rad", "Angle around y axis", -INF, +INF, 0}}},
-          P),
+        {"YRotation", "class_tooltip", {{"Angle", "rad", "Angle around y axis", -INF, +INF, 0}}},
+        P),
       m_angle(m_P[0])
 {
 }
@@ -146,8 +146,8 @@ Transform3D RotationY::getTransform3D() const
 //! @param angle: rotation angle around z-axis in radians
 RotationZ::RotationZ(const std::vector<double> P)
     : IRotation(
-          {"ZRotation", "class_tooltip", {{"Angle", "rad", "Angle around z axis", -INF, +INF, 0}}},
-          P),
+        {"ZRotation", "class_tooltip", {{"Angle", "rad", "Angle around z axis", -INF, +INF, 0}}},
+        P),
       m_angle(m_P[0])
 {
 }
diff --git a/Core/Shapes/Box.cpp b/Core/Shapes/Box.cpp
index c12373bb8b170d2227c4ebc82b1dd53e6bee5722..1c727b1d31c85363bcfddd5e60aa782a8d9fffae 100644
--- a/Core/Shapes/Box.cpp
+++ b/Core/Shapes/Box.cpp
@@ -25,4 +25,4 @@ Box::Box(double length, double width, double height)
     std::move(top_face.begin(), top_face.end(), m_vertices.begin() + 4);
 }
 
-Box::~Box() {}
+Box::~Box() = default;
diff --git a/Core/Shapes/DoubleEllipse.cpp b/Core/Shapes/DoubleEllipse.cpp
index 541c26b79b86606fd16fb8979f70ac5b3ad7b007..9604456d7e3b45523bbefed3e8ddd1fbce5d0d55 100644
--- a/Core/Shapes/DoubleEllipse.cpp
+++ b/Core/Shapes/DoubleEllipse.cpp
@@ -26,4 +26,4 @@ DoubleEllipse::DoubleEllipse(double r0_x, double r0_y, double z, double rz_x, do
     std::move(top_face.begin(), top_face.end(), m_vertices.begin() + n_bottom);
 }
 
-DoubleEllipse::~DoubleEllipse() {}
+DoubleEllipse::~DoubleEllipse() = default;
diff --git a/Core/Shapes/RippleCosine.cpp b/Core/Shapes/RippleCosine.cpp
index 4e70795c551cd92497ca16a0fcb4094154418b56..80e11b4719c6d8643ae831ff499341d141c6c4c2 100644
--- a/Core/Shapes/RippleCosine.cpp
+++ b/Core/Shapes/RippleCosine.cpp
@@ -29,4 +29,4 @@ RippleCosine::RippleCosine(double length, double width, double height)
     }
 }
 
-RippleCosine::~RippleCosine() {}
+RippleCosine::~RippleCosine() = default;
diff --git a/Core/Shapes/RippleSawtooth.cpp b/Core/Shapes/RippleSawtooth.cpp
index d67cd1139a5768a0ed4e883ff2a7ecd0ce9470e3..69cd09bf998c6363f7c72fc10ec657f0d95fef75 100644
--- a/Core/Shapes/RippleSawtooth.cpp
+++ b/Core/Shapes/RippleSawtooth.cpp
@@ -27,4 +27,4 @@ RippleSawtooth::RippleSawtooth(double length, double width, double height, doubl
     m_vertices[5] = kvector_t(-length / 2.0, 0.0, height);
 }
 
-RippleSawtooth::~RippleSawtooth() {}
+RippleSawtooth::~RippleSawtooth() = default;
diff --git a/Core/Shapes/TruncatedEllipsoid.cpp b/Core/Shapes/TruncatedEllipsoid.cpp
index c56f9be2951cf08db5c830bd746257ded179ec65..9bf57a7cff37633312f6cb36e4e490b91ccaefeb 100644
--- a/Core/Shapes/TruncatedEllipsoid.cpp
+++ b/Core/Shapes/TruncatedEllipsoid.cpp
@@ -34,4 +34,4 @@ TruncatedEllipsoid::TruncatedEllipsoid(double r_x, double r_y, double r_z, doubl
     }
 }
 
-TruncatedEllipsoid::~TruncatedEllipsoid() {}
+TruncatedEllipsoid::~TruncatedEllipsoid() = default;
diff --git a/Core/Simulation/DepthProbeSimulation.cpp b/Core/Simulation/DepthProbeSimulation.cpp
index b65d7e4de0d6c68348b10d5c9d4b07d92be6f41e..8db4b184642fbf296489fd637b5c4c16e1e4d44a 100644
--- a/Core/Simulation/DepthProbeSimulation.cpp
+++ b/Core/Simulation/DepthProbeSimulation.cpp
@@ -13,6 +13,7 @@
 // ************************************************************************** //
 
 #include "Core/Simulation/DepthProbeSimulation.h"
+#include "Core/Basics/Assert.h"
 #include "Core/Basics/MathConstants.h"
 #include "Core/Beam/IFootprintFactor.h"
 #include "Core/Computation/DepthProbeComputation.h"
@@ -55,7 +56,7 @@ SimulationResult DepthProbeSimulation::result() const
 {
     validityCheck();
     auto data = createIntensityData();
-    return SimulationResult(*data, *createUnitConverter().get());
+    return SimulationResult(*data, *createUnitConverter());
 }
 
 void DepthProbeSimulation::setBeamParameters(double lambda, int nbins, double alpha_i_min,
@@ -109,9 +110,8 @@ DepthProbeSimulation::DepthProbeSimulation(const DepthProbeSimulation& other)
         m_alpha_axis.reset(other.m_alpha_axis->clone());
     if (other.m_z_axis)
         m_z_axis.reset(other.m_z_axis->clone());
-    if (!m_sim_elements.empty())
-        for (auto iter = m_sim_elements.begin(); iter != m_sim_elements.end(); ++iter)
-            iter->setZPositions(m_alpha_axis.get());
+    for (auto iter = m_sim_elements.begin(); iter != m_sim_elements.end(); ++iter)
+        iter->setZPositions(m_alpha_axis.get());
     initialize();
 }
 
diff --git a/Core/Simulation/Simulation.cpp b/Core/Simulation/Simulation.cpp
index 198a9f095164fb9b9cf895f7afe8a52c31674f38..c8c3360ed7d8d4b6bccc1557e8235c6263a37665 100644
--- a/Core/Simulation/Simulation.cpp
+++ b/Core/Simulation/Simulation.cpp
@@ -93,7 +93,7 @@ void runComputations(std::vector<std::unique_ptr<IComputation>> computations)
         if (!comp->isCompleted())
             failure_messages.push_back(comp->errorMessage());
 
-    if (failure_messages.size() == 0)
+    if (failure_messages.empty())
         return;
     throw Exceptions::RuntimeErrorException(
         "Error in runComputations: "
@@ -309,8 +309,7 @@ SimulationResult Simulation::convertData(const OutputData<double>& data,
                                          bool put_masked_areas_to_zero)
 {
     auto converter = UnitConverterUtils::createConverter(*this);
-    auto roi_data =
-        UnitConverterUtils::createOutputData(*converter.get(), converter->defaultUnits());
+    auto roi_data = UnitConverterUtils::createOutputData(*converter, converter->defaultUnits());
 
     const IDetector& detector = getInstrument().detector();
 
diff --git a/Core/Simulation/UnitConverterUtils.cpp b/Core/Simulation/UnitConverterUtils.cpp
index bddc3647ce78c655ec7a47cf018239f001807e65..47fe726dfadc301b66f5758550cdc28d3bb7d79f 100644
--- a/Core/Simulation/UnitConverterUtils.cpp
+++ b/Core/Simulation/UnitConverterUtils.cpp
@@ -25,7 +25,7 @@
 #include "Core/Simulation/SpecularSimulation.h"
 
 std::unique_ptr<OutputData<double>>
-UnitConverterUtils::createOutputData(const IUnitConverter& converter, AxesUnits units)
+UnitConverterUtils::createOutputData(const IUnitConverter& converter, Axes::Units units)
 {
     std::unique_ptr<OutputData<double>> result = std::make_unique<OutputData<double>>();
     for (size_t i = 0; i < converter.dimension(); ++i)
diff --git a/Core/Simulation/UnitConverterUtils.h b/Core/Simulation/UnitConverterUtils.h
index 3a2252bebb7a0d95eb34e4ba17ca780c27f436cd..a32aea45d8bbdab1293dcb1aadfa139397721c89 100644
--- a/Core/Simulation/UnitConverterUtils.h
+++ b/Core/Simulation/UnitConverterUtils.h
@@ -28,7 +28,7 @@ namespace UnitConverterUtils
 
 //! Returns zero-valued output data array in specified units
 std::unique_ptr<OutputData<double>> createOutputData(const IUnitConverter& converter,
-                                                     AxesUnits units);
+                                                     Axes::Units units);
 
 //! Helper factory function to use in GISASSimulation. Depending on the type of detector,
 //! returns either RectangularConverter or SphericalConverter.
diff --git a/Core/SoftParticle/FormFactorSphereGaussianRadius.cpp b/Core/SoftParticle/FormFactorSphereGaussianRadius.cpp
index cb128553f7358a280a72dff9c200d29cbfc5fad1..e6483e89224c3ea476ddcf10d6dcd9cf696c1bed 100644
--- a/Core/SoftParticle/FormFactorSphereGaussianRadius.cpp
+++ b/Core/SoftParticle/FormFactorSphereGaussianRadius.cpp
@@ -44,7 +44,7 @@ complex_t FormFactorSphereGaussianRadius::evaluate_for_q(cvector_t q) const
 
 void FormFactorSphereGaussianRadius::onChange()
 {
-    mP_shape.reset(new TruncatedEllipsoid(m_mean, m_mean, m_mean, 2.0 * m_mean, 0.0));
+    mP_shape = std::make_unique<TruncatedEllipsoid>(m_mean, m_mean, m_mean, 2.0 * m_mean, 0.0);
 }
 
 double FormFactorSphereGaussianRadius::calculateMeanR3() const
diff --git a/Core/SoftParticle/FormFactorSphereLogNormalRadius.cpp b/Core/SoftParticle/FormFactorSphereLogNormalRadius.cpp
index dc1c459a57a84f7481b52fb1359d8a5b8f6f0a51..fa7bf279c7d0b4d5a9334b3d87a1e4f5ec75aeac 100644
--- a/Core/SoftParticle/FormFactorSphereLogNormalRadius.cpp
+++ b/Core/SoftParticle/FormFactorSphereLogNormalRadius.cpp
@@ -60,5 +60,5 @@ complex_t FormFactorSphereLogNormalRadius::evaluate_for_q(cvector_t q) const
 
 void FormFactorSphereLogNormalRadius::onChange()
 {
-    mP_shape.reset(new TruncatedEllipsoid(m_mean, m_mean, m_mean, 2.0 * m_mean, 0.0));
+    mP_shape = std::make_unique<TruncatedEllipsoid>(m_mean, m_mean, m_mean, 2.0 * m_mean, 0.0);
 }
diff --git a/Core/includeIncludes/SoftParticles.h b/Core/SoftParticle/SoftParticles.h
similarity index 94%
rename from Core/includeIncludes/SoftParticles.h
rename to Core/SoftParticle/SoftParticles.h
index c3a2eb0b62c3499b5e08b55d9108d233f8851a1d..5fc53b773df79dd87a4f46a559a1b853132325b9 100644
--- a/Core/includeIncludes/SoftParticles.h
+++ b/Core/SoftParticle/SoftParticles.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/includeIncludes/SoftParticles.h
+//! @file      Core/SoftParticle/SoftParticles.h
 //! @brief     Includes all soft-particle form-factor definitions.
 //!
 //! @homepage  http://www.bornagainproject.org
diff --git a/Core/StandardSamples/LayersWithAbsorptionBySLDBuilder.cpp b/Core/StandardSamples/LayersWithAbsorptionBySLDBuilder.cpp
index b5800890a83d8001975f14161c96d3c84914d0dc..3db0b871f1dcffc4dc3758aee7790e6d684dc012 100644
--- a/Core/StandardSamples/LayersWithAbsorptionBySLDBuilder.cpp
+++ b/Core/StandardSamples/LayersWithAbsorptionBySLDBuilder.cpp
@@ -15,11 +15,11 @@
 #include "Core/StandardSamples/LayersWithAbsorptionBySLDBuilder.h"
 #include "Core/Aggregate/ParticleLayout.h"
 #include "Core/Basics/Units.h"
+#include "Core/HardParticle/FormFactorFullSphere.h"
 #include "Core/Material/MaterialFactoryFuncs.h"
 #include "Core/Multilayer/Layer.h"
 #include "Core/Multilayer/MultiLayer.h"
 #include "Core/Particle/Particle.h"
-#include "Core/includeIncludes/FormFactors.h"
 
 const double middle_layer_thickness(60.0 * Units::nanometer);
 
diff --git a/Core/StandardSamples/ParticleInVacuumBuilder.cpp b/Core/StandardSamples/ParticleInVacuumBuilder.cpp
index 7acfdb4a0b611143927c7861634505064d2c9db0..700b7514a165d375a2b650ebddac8c816db65c29 100644
--- a/Core/StandardSamples/ParticleInVacuumBuilder.cpp
+++ b/Core/StandardSamples/ParticleInVacuumBuilder.cpp
@@ -16,12 +16,12 @@
 #include "Core/Aggregate/ParticleLayout.h"
 #include "Core/Basics/Exceptions.h"
 #include "Core/Basics/Units.h"
+#include "Core/HardParticle/FormFactorFullSphere.h"
 #include "Core/Multilayer/Layer.h"
 #include "Core/Multilayer/MultiLayer.h"
 #include "Core/Particle/Particle.h"
 #include "Core/SampleBuilderEngine/SampleComponents.h"
 #include "Core/StandardSamples/ReferenceMaterials.h"
-#include "Core/includeIncludes/FormFactors.h"
 
 namespace
 {
diff --git a/Core/Tools/CloneableVector.h b/Core/Tools/CloneableVector.h
new file mode 100644
index 0000000000000000000000000000000000000000..0bc60c3657b0844444dae542cf50bc4c9a58051f
--- /dev/null
+++ b/Core/Tools/CloneableVector.h
@@ -0,0 +1,46 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Tools/CloneableVector.h
+//! @brief     Defines and implements templated class CloneableVector.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2018
+//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
+//
+// ************************************************************************** //
+
+#ifndef BORNAGAIN_CORE_TOOLS_CLONEABLEVECTOR_H
+#define BORNAGAIN_CORE_TOOLS_CLONEABLEVECTOR_H
+
+#include <memory>
+#include <vector>
+
+//! A vector of unique pointers to objects that are cloneable.
+//!
+//! Equips vector<unique_ptr<T>> with copy constructor.
+//! For use with polymorphic objects, or in pimpl idiom.
+//!
+//! @ingroup tools_internal
+
+//! The objects pointed to must posses a clone() function.
+
+template <class T> class CloneableVector : public std::vector<std::unique_ptr<T>>
+{
+    using super = std::vector<std::unique_ptr<T>>;
+
+public:
+    CloneableVector() : super() {}
+    CloneableVector(const CloneableVector& other) : super()
+    {
+        super::reserve(other.size());
+        for (const std::unique_ptr<T>& t : other)
+            super::emplace_back(t->clone());
+    }
+    void push_back(T* t) { super::emplace_back(std::unique_ptr<T>(t)); }
+    void emplace_back(std::unique_ptr<T>&& t) { super::emplace_back(t); }
+};
+
+#endif // BORNAGAIN_CORE_TOOLS_CLONEABLEVECTOR_H
diff --git a/Core/Tools/PyFmt.cpp b/Core/Tools/PyFmt.cpp
index c284d50d488577f7e9020126891f98252af69f1a..3a56b7498224c0a219daaa662e2db895d66cd8d4 100644
--- a/Core/Tools/PyFmt.cpp
+++ b/Core/Tools/PyFmt.cpp
@@ -188,14 +188,6 @@ std::string printKvector(const kvector_t value)
     return result.str();
 }
 
-//! returns true if it is (0, -1, 0) vector
-bool isDefaultDirection(const kvector_t direction)
-{
-    return Numeric::AreAlmostEqual(direction.x(), 0.0)
-           && Numeric::AreAlmostEqual(direction.y(), -1.0)
-           && Numeric::AreAlmostEqual(direction.z(), 0.0);
-}
-
 std::string indent(size_t width)
 {
     return std::string(width, ' ');
diff --git a/Core/Tools/PythonCore.h b/Core/Tools/PythonCore.h
index edb50d32cfe5e2889bb170c14edc6fa4ee35a408..52a79e4cbede38131acc7ec450d25df728f5c4ea 100644
--- a/Core/Tools/PythonCore.h
+++ b/Core/Tools/PythonCore.h
@@ -33,7 +33,7 @@
 #define NO_IMPORT_ARRAY
 #include <numpy/arrayobject.h>
 
-#include "swig_runtime.h"
+#include "auto/Wrap/swig_runtime.h"
 
 #ifdef __GNUC__
 #pragma GCC diagnostic pop
diff --git a/Core/includeIncludes/FormFactors.h b/Core/includeIncludes/FormFactors.h
deleted file mode 100644
index 9026de0cb335fe59177bae3301dc4c579428e9ad..0000000000000000000000000000000000000000
--- a/Core/includeIncludes/FormFactors.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// ************************************************************************** //
-//
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      Core/includeIncludes/FormFactors.h
-//! @brief     Includes form-factor related include files.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-// ************************************************************************** //
-
-#ifndef BORNAGAIN_CORE_INCLUDEINCLUDES_FORMFACTORS_H
-#define BORNAGAIN_CORE_INCLUDEINCLUDES_FORMFACTORS_H
-
-#include "Core/Particle/FormFactorWeighted.h"
-#include "Core/Scattering/FormFactorDecoratorMaterial.h"
-#include "Core/Scattering/FormFactorDecoratorPositionFactor.h"
-#include "Core/Scattering/FormFactorDecoratorRotation.h"
-#include "Core/includeIncludes/HardParticles.h"
-#include "Core/includeIncludes/SoftParticles.h"
-
-#endif // BORNAGAIN_CORE_INCLUDEINCLUDES_FORMFACTORS_H
diff --git a/Examples/python/fitting/ex03_ExtendedExamples/specular/FitWithUncertainties.py b/Examples/python/fitting/ex03_ExtendedExamples/specular/FitWithUncertainties.py
index e0033ae3dd8b8187fa35a430bd5ff84ec9c347c8..a03e63688548dac9cedcfab75d6e051d80f7136e 100644
--- a/Examples/python/fitting/ex03_ExtendedExamples/specular/FitWithUncertainties.py
+++ b/Examples/python/fitting/ex03_ExtendedExamples/specular/FitWithUncertainties.py
@@ -118,7 +118,7 @@ def run_fitting():
     fit_objective = ba.FitObjective()
     fit_objective.addSimulationAndData(get_simulation, real_data, uncertainties)
 
-    plot_observer = ba.PlotterSpecular(units=ba.AxesUnits.RQ4)
+    plot_observer = ba.PlotterSpecular(units=ba.Axes.RQ4)
     fit_objective.initPrint(10)
     fit_objective.initPlot(10, plot_observer)
     fit_objective.setObjectiveMetric("Chi2", "L1")
diff --git a/Examples/python/fitting/ex03_ExtendedExamples/specular/RealLifeReflectometryFitting.py b/Examples/python/fitting/ex03_ExtendedExamples/specular/RealLifeReflectometryFitting.py
index 9400dfb9af3c1ea21a3c3bf503603090a58d6f2c..5ac85e84fd6f10383fa96e01117f031c0f58b436 100644
--- a/Examples/python/fitting/ex03_ExtendedExamples/specular/RealLifeReflectometryFitting.py
+++ b/Examples/python/fitting/ex03_ExtendedExamples/specular/RealLifeReflectometryFitting.py
@@ -253,7 +253,7 @@ def plot_result(sim_result, ref_result, bin_start=0, bin_end=-1):
                  sim_result.axis(), sim_data,
                  ref_result.axis(), ref_data)
 
-    xlabel = ba.get_axes_labels(sim_result, ba.AxesUnits.DEFAULT)[0]
+    xlabel = ba.get_axes_labels(sim_result, ba.Axes.DEFAULT)[0]
     ylabel = "Intensity"
     plt.xlabel(xlabel, fontsize=16)
     plt.ylabel(ylabel, fontsize=16)
diff --git a/Examples/python/simulation/ex07_Miscellaneous/AxesInDifferentUnits.py b/Examples/python/simulation/ex07_Miscellaneous/AxesInDifferentUnits.py
index 0b9c24c381efd039a1e3ea9480675f5769dc49de..9c23535da866b402bd0d70df66ea077ab108b05d 100644
--- a/Examples/python/simulation/ex07_Miscellaneous/AxesInDifferentUnits.py
+++ b/Examples/python/simulation/ex07_Miscellaneous/AxesInDifferentUnits.py
@@ -90,16 +90,16 @@ def plot(result):
                      xlabel=r'$X_{mm}$', ylabel=r'$Y_{mm}$', zlabel=None)
 
     plt.subplot(2, 2, 2)
-    ba.plot_colormap(result, units=ba.AxesUnits.NBINS, title="In number of bins",
+    ba.plot_colormap(result, units=ba.Axes.NBINS, title="In number of bins",
                      xlabel=r'$X_{nbins}$', ylabel=r'$Y_{nbins}$', zlabel=None)
 
     plt.subplot(2, 2, 3)
-    ba.plot_colormap(result, units=ba.AxesUnits.DEGREES, title="In degs",
+    ba.plot_colormap(result, units=ba.Axes.DEGREES, title="In degs",
                      xlabel=r'$\phi_f ^{\circ}$', ylabel=r'$\alpha_f ^{\circ}$',
                      zlabel=None)
 
     plt.subplot(2, 2, 4)
-    ba.plot_colormap(result, units=ba.AxesUnits.QSPACE, title="Q-space",
+    ba.plot_colormap(result, units=ba.Axes.QSPACE, title="Q-space",
                      xlabel=r'$Q_{y} [1/nm]$', ylabel=r'$Q_{z} [1/nm]$', zlabel=None)
 
     plt.subplots_adjust(left=0.07, right=0.97, top=0.9, bottom=0.1, hspace=0.25)
diff --git a/Examples/python/simulation/ex07_Miscellaneous/PolarizedSANS.py b/Examples/python/simulation/ex07_Miscellaneous/PolarizedSANS.py
index 2f8e4bdbe7c1c56ada277ac09a3ce0525a3e0a35..ce4f30ebc72f482284c6dd61f2c16f00f47ec93f 100644
--- a/Examples/python/simulation/ex07_Miscellaneous/PolarizedSANS.py
+++ b/Examples/python/simulation/ex07_Miscellaneous/PolarizedSANS.py
@@ -76,5 +76,5 @@ def run_simulation():
 
 if __name__ == '__main__': 
     result = run_simulation()
-    ba.plot_simulation_result(result, cmap='jet', units=ba.AxesUnits.QSPACE,
+    ba.plot_simulation_result(result, cmap='jet', units=ba.Axes.QSPACE,
                               aspect='auto')
diff --git a/Fit/CMakeLists.txt b/Fit/CMakeLists.txt
index 548f48b5f967824961c0384f5ff229315d427a20..f46b075435f0ff9a5a64b4b90d78e0761dfb2abc 100644
--- a/Fit/CMakeLists.txt
+++ b/Fit/CMakeLists.txt
@@ -1,30 +1,32 @@
 ############################################################################
-# CMakeLists.txt file for building libBornAgainFit library
+# CMakeLists.txt file for building libBornAgainFit
 ############################################################################
 
-set(lib BornAgainFit)
+set(name Fit)
+set(lib BornAgain${name})
+
+# --- source and include files ---
 
-# --- source and include files ------
 file(GLOB source_files */*.cpp)
 file(GLOB include_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} */*.h)
 
 if(BORNAGAIN_PYTHON)
 
+    set(WRAP_DIR ${CMAKE_SOURCE_DIR}/Wrap)
     set(AUTO_DIR ${CMAKE_SOURCE_DIR}/auto/Wrap)
     file(MAKE_DIRECTORY ${AUTO_DIR})
 
     if(CONFIGURE_BINDINGS)
 
-        set(WRAP_DIR ${CMAKE_SOURCE_DIR}/Wrap)
         set(TMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/Wrap)
         file(MAKE_DIRECTORY ${TMP_DIR})
 
-        GeneratePythonDocs(${AUTO_DIR}/doxygen_fit.i ${WRAP_DIR}/swig)
+        GeneratePythonDocs(${AUTO_DIR}/doxygen${name}.i ${WRAP_DIR}/swig)
 
         set(swig_dependencies
-            ${WRAP_DIR}/swig/libBornAgainFit.i
+            ${WRAP_DIR}/swig/lib${lib}.i
             ${WRAP_DIR}/swig/directors.i
-            ${WRAP_DIR}/swig/extendFit.i
+            ${WRAP_DIR}/swig/extend${name}.i
             ${WRAP_DIR}/swig/ignores.i
             ${WRAP_DIR}/swig/shared_pointers.i
             ${WRAP_DIR}/swig/warnings.i
@@ -34,23 +36,23 @@ if(BORNAGAIN_PYTHON)
                 message(FATAL_ERROR "Could NOT find SWIG input ${FNAM}")
             endif()
         endforeach()
-        list(APPEND swig_dependencies ${AUTO_DIR}/doxygen_fit.i)
+        list(APPEND swig_dependencies ${AUTO_DIR}/doxygen${name}.i)
 
-        set(SWIG_FLAGS "-c++;-python;-o;${AUTO_DIR}/libBornAgainFit_wrap.cpp;-outdir;${TMP_DIR}"
-            ";-I${CMAKE_SOURCE_DIR}")
+        set(SWIG_FLAGS "-c++;-python;-o;${AUTO_DIR}/lib${lib}_wrap.cpp;-outdir;${TMP_DIR}"
+                               ";-I${CMAKE_SOURCE_DIR};-I${CMAKE_BINARY_DIR}/inc")
 
         add_custom_command(
-            OUTPUT ${AUTO_DIR}/libBornAgainFit.py
+            OUTPUT ${AUTO_DIR}/lib${lib}.py
             COMMAND ${Python3_EXECUTABLE} ${WRAP_DIR}/swig/tweaks.py
-                   ${TMP_DIR}/libBornAgainFit.py
-                   ${AUTO_DIR}/libBornAgainFit.py
-            DEPENDS ${TMP_DIR}/libBornAgainFit.py
+                   ${TMP_DIR}/lib${lib}.py
+                   ${AUTO_DIR}/lib${lib}.py
+            DEPENDS ${TMP_DIR}/lib${lib}.py
             )
         add_custom_command(
-            OUTPUT ${TMP_DIR}/libBornAgainFit.py
-                   ${AUTO_DIR}/libBornAgainFit_wrap.h
-                   ${AUTO_DIR}/libBornAgainFit_wrap.cpp
-            COMMAND ${SWIG_EXECUTABLE} ${SWIG_FLAGS} ${WRAP_DIR}/swig/libBornAgainFit.i
+            OUTPUT ${TMP_DIR}/lib${lib}.py
+                   ${AUTO_DIR}/lib${lib}_wrap.h
+                   ${AUTO_DIR}/lib${lib}_wrap.cpp
+            COMMAND ${SWIG_EXECUTABLE} ${SWIG_FLAGS} ${WRAP_DIR}/swig/lib${lib}.i
             DEPENDS ${swig_dependencies} ${include_files}
             )
 
@@ -58,31 +60,32 @@ if(BORNAGAIN_PYTHON)
 
     add_custom_target(
         ${lib}_python
-        COMMAND ${CMAKE_COMMAND} -E copy ${AUTO_DIR}/libBornAgainFit.py
-             ${CMAKE_BINARY_DIR}/lib/libBornAgainFit.py
-        COMMAND ${CMAKE_COMMAND} -E copy ${AUTO_DIR}/libBornAgainFit.py
-             ${CMAKE_BINARY_DIR}/lib/bornagain/libBornAgainFit.py
-        DEPENDS ${AUTO_DIR}/libBornAgainFit.py
+        COMMAND ${CMAKE_COMMAND}
+            -E copy ${AUTO_DIR}/lib${lib}.py ${CMAKE_BINARY_DIR}/lib/lib${lib}.py
+        COMMAND ${CMAKE_COMMAND}
+            -E copy ${AUTO_DIR}/lib${lib}.py ${CMAKE_BINARY_DIR}/lib/bornagain/lib${lib}.py
+        DEPENDS ${AUTO_DIR}/lib${lib}.py
         )
 
     if((CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
             OR (CMAKE_CXX_COMPILER_ID STREQUAL "GNU"))
         # suppress warnings from auto-generated code (last updated for Swig 4.0.1)
-        set_source_files_properties(${AUTO_DIR}/libBornAgainFit_wrap.cpp
+        set_source_files_properties(${AUTO_DIR}/lib${lib}_wrap.cpp
             PROPERTIES COMPILE_OPTIONS
-            "-Wno-unused-parameter;-Wno-missing-field-initializers;-Wno-deprecated-declarations")
+            "-Wno-unused-parameter;-Wno-missing-field-initializers;-Wno-sometimes-uninitialized;\
+-Wno-deprecated-declarations")
     endif()
 
-    list(APPEND source_files "${AUTO_DIR}/libBornAgainFit_wrap.cpp")
+    list(APPEND source_files "${AUTO_DIR}/lib${lib}_wrap.cpp")
 
-endif()
+endif(BORNAGAIN_PYTHON)
+
+# --- making library ---
 
-# --- definitions ---------
 if(WIN32)
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBA_CORE_BUILD_DLL")
 endif()
 
-# --- making library ---------
 add_library(${lib} SHARED ${source_files})
 set_target_properties(${lib} PROPERTIES PREFIX ${libprefix} SUFFIX ${libsuffix})
 set(${lib}_LIBRARY_TYPE SHARED)
@@ -92,60 +95,39 @@ if(BORNAGAIN_PYTHON)
 endif()
 
 # exposing library name and list of include directories outside
-set(${lib}_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} ${WRAP_DIR} PARENT_SCOPE)
 set(${lib}_LIBRARY ${lib} PARENT_SCOPE)
 
-# --- dependencies ---------
+# --- external dependencies ---
+
 target_include_directories(${lib}
     PUBLIC ${RootMinimizers_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR})
 target_link_libraries(${lib} ${RootMinimizers_LIBRARY} ${Boost_LIBRARIES})
 
+
 if(BORNAGAIN_PYTHON)
-    target_include_directories(${lib}
-        PUBLIC ${Python3_INCLUDE_DIRS} ${Python3_NumPy_INCLUDE_DIRS})
+    target_compile_definitions(${lib} PUBLIC -DBORNAGAIN_PYTHON)
+    target_include_directories(${lib} PUBLIC ${Python3_INCLUDE_DIRS} ${Python3_NumPy_INCLUDE_DIRS})
     target_link_libraries(${lib} ${Python3_LIBRARIES})
 endif()
 
-# --- custom actions
-# python in windows required .pyd extention for the library name
-if(WIN32 AND BORNAGAIN_PYTHON)
-    add_custom_command(
-        TARGET ${lib}
-        POST_BUILD
-        COMMAND ${CMAKE_COMMAND} -E copy
-        ${CMAKE_BINARY_DIR}/bin/${libprefix}${lib}${libsuffix}
-        ${CMAKE_BINARY_DIR}/lib/${libprefix}${lib}".pyd"
-        )
-    # for functional tests
-    add_custom_command(
-        TARGET ${lib}
-        POST_BUILD
-        COMMAND ${CMAKE_COMMAND} -E copy
-        ${CMAKE_BINARY_DIR}/bin/${libprefix}${lib}${libsuffix}
-        ${CMAKE_BINARY_DIR}/lib/${libprefix}${lib}${libsuffix}
-        )
-
-endif()
-
 if(APPLE AND BORNAGAIN_APPLE_BUNDLE)
-    #    set(link_flags "-Wl,-rpath,@loader_path/../..")
     set(link_flags "-Wl,-rpath,@loader_path/../../Frameworks")
     set_target_properties(${lib} PROPERTIES LINK_FLAGS ${link_flags})
 endif()
 
-# -----------------------------------------------
-# installation
-# -----------------------------------------------
+# --- installation ---
+
 install(TARGETS ${lib} DESTINATION ${destination_lib} COMPONENT Libraries)
 install(FILES ${CMAKE_BINARY_DIR}/lib/lib${lib}.py
-    DESTINATION ${destination_lib} COMPONENT Libraries) # required by SWIG
+    DESTINATION ${destination_lib} COMPONENT Libraries) # required by swig
 
 foreach(file ${include_files})
     get_filename_component(dir ${file} DIRECTORY)
-    install(FILES ${file} DESTINATION ${destination_include}/Fit/${dir})
+    install(FILES ${file} DESTINATION ${destination_include}/${name}/${dir})
 endforeach()
 
 if(WIN32)
+    # python in windows required .pyd extension for the library name
     if(BORNAGAIN_PYTHON)
         add_custom_command(
             TARGET ${lib}
@@ -154,8 +136,14 @@ if(WIN32)
             ${CMAKE_BINARY_DIR}/bin/${libprefix}${lib}${libsuffix}
             ${CMAKE_BINARY_DIR}/lib/${libprefix}${lib}".pyd"
             )
-
         install(FILES ${CMAKE_BINARY_DIR}/lib/${libprefix}${lib}.pyd
             DESTINATION ${destination_lib} COMPONENT Libraries)
+        add_custom_command(
+            TARGET ${lib}
+            POST_BUILD
+            COMMAND ${CMAKE_COMMAND} -E copy
+            ${CMAKE_BINARY_DIR}/bin/${libprefix}${lib}${libsuffix}
+            ${CMAKE_BINARY_DIR}/lib/${libprefix}${lib}${libsuffix}
+            )
     endif()
 endif()
diff --git a/Fit/Minimizer/MinimizerOptions.cpp b/Fit/Minimizer/MinimizerOptions.cpp
index 769b849fa8e66950324c83850bdda9b843f2ac3b..97348b4cefe932b7227f9c438a06a8732ebf64d9 100644
--- a/Fit/Minimizer/MinimizerOptions.cpp
+++ b/Fit/Minimizer/MinimizerOptions.cpp
@@ -38,7 +38,7 @@ void MinimizerOptions::setOptionString(const std::string& options)
     std::vector<std::string> tokens = StringUtils::split(options, delimeter);
     try {
         for (std::string opt : tokens)
-            if (opt.size())
+            if (!opt.empty())
                 processCommand(opt);
     } catch (std::exception& ex) {
         std::ostringstream ostr;
diff --git a/Fit/Minimizer/TestMinimizer.cpp b/Fit/Minimizer/TestMinimizer.cpp
index 63f226e62e62ef183e1efd7a722a7b7491ee67e6..41429f7a1fe5ed3c0b018620f17d28b76cbb50c0 100644
--- a/Fit/Minimizer/TestMinimizer.cpp
+++ b/Fit/Minimizer/TestMinimizer.cpp
@@ -18,7 +18,7 @@
 
 using namespace Fit;
 
-TestMinimizer::TestMinimizer() {}
+TestMinimizer::TestMinimizer() = default;
 
 TestMinimizer::~TestMinimizer() = default;
 
diff --git a/Fit/RootAdapter/MinimizerResultUtils.cpp b/Fit/RootAdapter/MinimizerResultUtils.cpp
index bf89141dc5bcfa7735b6d345b6d0eb1d71aad567..a1c9110b6102aea2da463c18e62603da99b717ea 100644
--- a/Fit/RootAdapter/MinimizerResultUtils.cpp
+++ b/Fit/RootAdapter/MinimizerResultUtils.cpp
@@ -67,7 +67,7 @@ std::string MinimizerResultUtils::reportParameters(const Fit::Parameters& parame
     }
 
     Fit::Parameters::corr_matrix_t matrix = parameters.correlationMatrix();
-    if (matrix.size()) {
+    if (!matrix.empty()) {
         result << MinimizerUtils::sectionString("Correlations");
         for (size_t i = 0; i < matrix.size(); ++i) {
             result << boost::format("#%-2d       ") % i;
@@ -93,7 +93,7 @@ std::string reportDescription(const RootMinimizerAdapter& minimizer)
 
 std::string reportOption(const RootMinimizerAdapter& minimizer)
 {
-    if (minimizer.options().size() == 0)
+    if (minimizer.options().empty())
         return "";
 
     std::ostringstream result;
diff --git a/Fit/RootAdapter/ResidualFunctionAdapter.cpp b/Fit/RootAdapter/ResidualFunctionAdapter.cpp
index a20266b132f8d15b24f2e5cbef4aa2c4b23e7288..39f411737a7b770efc0b3ba45fd125104f7c267d 100644
--- a/Fit/RootAdapter/ResidualFunctionAdapter.cpp
+++ b/Fit/RootAdapter/ResidualFunctionAdapter.cpp
@@ -104,7 +104,7 @@ double ResidualFunctionAdapter::element_residual(const std::vector<double>& pars
         m_residuals = get_residuals(pars);
     }
 
-    if (gradients.size()) {
+    if (!gradients.empty()) {
         // Non zero size means that minimizer wants to know gradients.
         if (pars.size() != gradients.size())
             throw std::runtime_error("ResidualFunctionAdapter::element_residual() -> Error. "
diff --git a/Fit/RootAdapter/ScalarFunctionAdapter.cpp b/Fit/RootAdapter/ScalarFunctionAdapter.cpp
index 098567fb3602226eefdcd9ff56aa7106df75bed5..3891fe16c9079833bd79e790ed353cb4142b285f 100644
--- a/Fit/RootAdapter/ScalarFunctionAdapter.cpp
+++ b/Fit/RootAdapter/ScalarFunctionAdapter.cpp
@@ -34,6 +34,7 @@ const RootScalarFunction* ScalarFunctionAdapter::rootObjectiveFunction()
         return m_fcn(m_parameters);
     };
 
-    m_root_objective.reset(new RootScalarFunction(rootfun, static_cast<int>(m_parameters.size())));
+    m_root_objective =
+        std::make_unique<RootScalarFunction>(rootfun, static_cast<int>(m_parameters.size()));
     return m_root_objective.get();
 }
diff --git a/Fit/Tools/OptionContainer.h b/Fit/Tools/OptionContainer.h
index 424ff4fe63db25dda98f0bde45ca9978c8b74c97..828d103179659aeec80cd8826720f7edb48107f4 100644
--- a/Fit/Tools/OptionContainer.h
+++ b/Fit/Tools/OptionContainer.h
@@ -54,6 +54,7 @@ public:
     const_iterator end() const { return m_options.end(); }
 
     size_t size() const { return m_options.size(); }
+    bool empty() const { return size() == 0; }
 
 protected:
     bool exists(const std::string& name);
diff --git a/GUI/ba3d/model/particles.cpp b/GUI/ba3d/model/particles.cpp
index db0773cb93504ba7b1c515fcbefe91e7a15bcc98..80733fcde1c7c2a8a2f72a058899adc9fb723a68 100644
--- a/GUI/ba3d/model/particles.cpp
+++ b/GUI/ba3d/model/particles.cpp
@@ -350,8 +350,8 @@ TruncatedSphere::TruncatedSphere(float R, float H, float deltaH)
 }
 
 TruncatedSpheroid::TruncatedSpheroid(float R, float H, float fp, float deltaH)
-    : Particle(Key(BaseShape::Sphere, 1 - H / fp / R / 2, (H - fp * R) / fp / R / 2,
-                   deltaH / fp / R / 2))
+    : Particle(
+        Key(BaseShape::Sphere, 1 - H / fp / R / 2, (H - fp * R) / fp / R / 2, deltaH / fp / R / 2))
 {
     isNull = (R <= 0 || H <= 0 || fp <= 0);
     scale = Vector3D(R * 2, R * 2, fp * R * 2);
diff --git a/GUI/ba3d/widget.cpp b/GUI/ba3d/widget.cpp
index a5ea61f40e05cee7fcbdc6159d00862cf1a59c94..4ee21dfb533d3d04e714df3a3752d4d2c9f48d98 100644
--- a/GUI/ba3d/widget.cpp
+++ b/GUI/ba3d/widget.cpp
@@ -32,7 +32,7 @@ Widget3D::Widget3D() : canvas(nullptr)
     box->addWidget((canvas = new Canvas));
 }
 
-Widget3D::~Widget3D() {}
+Widget3D::~Widget3D() = default;
 
 Camera& Widget3D::cam()
 {
diff --git a/GUI/coregui/Models/ApplicationModels.cpp b/GUI/coregui/Models/ApplicationModels.cpp
index b37818417c084a1eaed7498391a5e264b49ef1af..8ffb4fb2551627bf705ca3bf5bf11b1c84db5f53 100644
--- a/GUI/coregui/Models/ApplicationModels.cpp
+++ b/GUI/coregui/Models/ApplicationModels.cpp
@@ -45,7 +45,7 @@ ApplicationModels::ApplicationModels(QObject* parent)
     // createTestJob();
 }
 
-ApplicationModels::~ApplicationModels() {}
+ApplicationModels::~ApplicationModels() = default;
 
 DocumentModel* ApplicationModels::documentModel()
 {
diff --git a/GUI/coregui/Models/AxesItems.cpp b/GUI/coregui/Models/AxesItems.cpp
index de727517aa5a3686b9baebe90055f714c78086a4..9ba6d00dcf8d1caccd3bfc16bc90dbfdd1f8c499 100644
--- a/GUI/coregui/Models/AxesItems.cpp
+++ b/GUI/coregui/Models/AxesItems.cpp
@@ -22,7 +22,7 @@ const QString BasicAxisItem::P_MAX_DEG = "Max [deg]";
 const QString BasicAxisItem::P_TITLE = "Title";
 const QString BasicAxisItem::P_TITLE_IS_VISIBLE = "Title Visibility";
 
-static const int max_detector_pixels = 65536;
+const int max_detector_pixels = 65536;
 
 BasicAxisItem::BasicAxisItem(const QString& type) : SessionItem(type)
 {
diff --git a/GUI/coregui/Models/ComboProperty.cpp b/GUI/coregui/Models/ComboProperty.cpp
index 7af2c87483f6a8de79d75fdcf4b243910bcfafcc..cdba924253a1a989697cb8204e64199ec7f9f031 100644
--- a/GUI/coregui/Models/ComboProperty.cpp
+++ b/GUI/coregui/Models/ComboProperty.cpp
@@ -93,7 +93,7 @@ void ComboProperty::setCurrentIndex(int index)
 ComboProperty& ComboProperty::operator<<(const QString& str)
 {
     m_values.append(str);
-    if (m_values.size())
+    if (!m_values.empty())
         setCurrentIndex(0);
     return *this;
 }
@@ -101,7 +101,7 @@ ComboProperty& ComboProperty::operator<<(const QString& str)
 ComboProperty& ComboProperty::operator<<(const QStringList& str)
 {
     m_values.append(str);
-    if (m_values.size())
+    if (!m_values.empty())
         setCurrentIndex(0);
     return *this;
 }
diff --git a/GUI/coregui/Models/ComponentProxyStrategy.cpp b/GUI/coregui/Models/ComponentProxyStrategy.cpp
index b5c3c4436b47bc1981948e8ca704b5afe1a4679e..26419c78b642666025787371de42c3bdb6af0572 100644
--- a/GUI/coregui/Models/ComponentProxyStrategy.cpp
+++ b/GUI/coregui/Models/ComponentProxyStrategy.cpp
@@ -65,7 +65,7 @@ bool ComponentProxyStrategy::isPropertyRelated(SessionItem* item)
 
     if (m_sourceRootIndex.isValid() && item->parent()->index() == m_sourceRootIndex
         && item->parent()->modelType() != "GroupProperty")
-        return propertyRelated.contains(item->modelType()) ? true : false;
+        return propertyRelated.contains(item->modelType());
 
     return true;
 }
diff --git a/GUI/coregui/Models/DataViewUtils.cpp b/GUI/coregui/Models/DataViewUtils.cpp
index 261bb7a235fe62ea00f955b44252c98073829bd9..7049696dbd3df73ebf2c5a28aabfc910150be4a4 100644
--- a/GUI/coregui/Models/DataViewUtils.cpp
+++ b/GUI/coregui/Models/DataViewUtils.cpp
@@ -31,7 +31,7 @@ std::unique_ptr<IUnitConverter> getConverter(Data1DViewItem* view_item)
     return DomainObjectBuilder::createUnitConverter(job_item->instrumentItem());
 }
 
-AxesUnits selectedUnits(Data1DViewItem* view_item)
+Axes::Units selectedUnits(Data1DViewItem* view_item)
 {
     auto current_unit_name =
         view_item->getItemValue(Data1DViewItem::P_AXES_UNITS).value<ComboProperty>().getValue();
diff --git a/GUI/coregui/Models/DomainObjectBuilder.cpp b/GUI/coregui/Models/DomainObjectBuilder.cpp
index 9a35e8f74bbeb0aa7da620c775a5e5a48419d011..5bfa534db6f6c4d668426863d3d6213bbd449f91 100644
--- a/GUI/coregui/Models/DomainObjectBuilder.cpp
+++ b/GUI/coregui/Models/DomainObjectBuilder.cpp
@@ -85,7 +85,7 @@ std::unique_ptr<ParticleLayout> DomainObjectBuilder::buildParticleLayout(const S
             QString par_name = prop.getValue();
             if (par_name == ParticleDistributionItem::NO_SELECTION) {
                 auto grandchildren = children[i]->getItems();
-                if (grandchildren.size() == 0) {
+                if (grandchildren.empty()) {
                     continue;
                 }
                 if (grandchildren.size() > 1) {
diff --git a/GUI/coregui/Models/DomainSimulationBuilder.cpp b/GUI/coregui/Models/DomainSimulationBuilder.cpp
index c962d3e8c437506df24e9bb2d9856ca0d93fd789..0e52a4f51a087aae90ed6ae0c87de470bf75d60e 100644
--- a/GUI/coregui/Models/DomainSimulationBuilder.cpp
+++ b/GUI/coregui/Models/DomainSimulationBuilder.cpp
@@ -115,10 +115,9 @@ std::unique_ptr<GISASSimulation> createGISASSimulation(std::unique_ptr<MultiLaye
     return ret;
 }
 
-std::unique_ptr<OffSpecSimulation>
-createOffSpecSimulation(std::unique_ptr<MultiLayer> P_multilayer,
-                        const OffSpecInstrumentItem* instrument,
-                        const SimulationOptionsItem* optionsItem)
+std::unique_ptr<OffSpecSimulation> createOffSpecSimulation(std::unique_ptr<MultiLayer> P_multilayer,
+                                                           const OffSpecInstrumentItem* instrument,
+                                                           const SimulationOptionsItem* optionsItem)
 {
     std::unique_ptr<OffSpecSimulation> ret(new OffSpecSimulation);
     auto P_instrument = DomainObjectBuilder::buildInstrument(*instrument);
@@ -126,10 +125,10 @@ createOffSpecSimulation(std::unique_ptr<MultiLayer> P_multilayer,
     ret->setInstrument(*P_instrument);
 
     auto beamItem = instrument->beamItem();
-    auto axisItem = dynamic_cast<BasicAxisItem*>(
-        instrument->getItem(OffSpecInstrumentItem::P_ALPHA_AXIS));
+    auto axisItem =
+        dynamic_cast<BasicAxisItem*>(instrument->getItem(OffSpecInstrumentItem::P_ALPHA_AXIS));
     ret->setBeamParameters(beamItem->getWavelength(), *axisItem->createAxis(Units::degree),
-                               beamItem->getAzimuthalAngle());
+                           beamItem->getAzimuthalAngle());
 
     // TODO Take care about distributions
     // TransformToDomain::addDistributionParametersToSimulation(*gisasInstrument->beamItem(),
diff --git a/GUI/coregui/Models/FitParameterItems.cpp b/GUI/coregui/Models/FitParameterItems.cpp
index 8db8b1e303ff58397f2cb207a69b6b919ed1cd36..ae45fe4253a46fd81e4a7f258323e6a058081a02 100644
--- a/GUI/coregui/Models/FitParameterItems.cpp
+++ b/GUI/coregui/Models/FitParameterItems.cpp
@@ -283,7 +283,7 @@ void FitParameterContainerItem::setValuesInParameterContainer(
     int index(0);
     for (int i = 0; i < fitPars.size(); ++i) {
         auto link_list = fitPars[i]->getItems(FitParameterItem::T_LINK);
-        if (link_list.size() == 0)
+        if (link_list.empty())
             continue;
         for (auto linkItem : link_list) {
             QString parPath = linkItem->getItemValue(FitParameterLinkItem::P_LINK).toString();
diff --git a/GUI/coregui/Models/FormFactorItems.cpp b/GUI/coregui/Models/FormFactorItems.cpp
index b458f23d44c36ff24cccb187d375c5ee2d3a39d7..85dd874fd152786b0ec81814410421e98b954c20 100644
--- a/GUI/coregui/Models/FormFactorItems.cpp
+++ b/GUI/coregui/Models/FormFactorItems.cpp
@@ -14,7 +14,8 @@
 
 #include "GUI/coregui/Models/FormFactorItems.h"
 #include "Core/Basics/Units.h"
-#include "Core/includeIncludes/FormFactors.h"
+#include "Core/HardParticle/HardParticles.h"
+#include "Core/SoftParticle/SoftParticles.h"
 
 /* ------------------------------------------------ */
 
diff --git a/GUI/coregui/Models/GUIDomainSampleVisitor.cpp b/GUI/coregui/Models/GUIDomainSampleVisitor.cpp
index 348b65fd5bb3dd96d623965aabc342e3e5166336..b81b2eefcbaa17233e601cc81cb067ded58cc44d 100644
--- a/GUI/coregui/Models/GUIDomainSampleVisitor.cpp
+++ b/GUI/coregui/Models/GUIDomainSampleVisitor.cpp
@@ -15,6 +15,7 @@
 #include "GUI/coregui/Models/GUIDomainSampleVisitor.h"
 #include "Core/Aggregate/ParticleLayout.h"
 #include "Core/Basics/Units.h"
+#include "Core/HardParticle/HardParticles.h"
 #include "Core/Material/Material.h"
 #include "Core/Multilayer/Layer.h"
 #include "Core/Multilayer/MultiLayer.h"
@@ -25,7 +26,7 @@
 #include "Core/Particle/ParticleComposition.h"
 #include "Core/Particle/ParticleCoreShell.h"
 #include "Core/Particle/ParticleDistribution.h"
-#include "Core/includeIncludes/FormFactors.h"
+#include "Core/SoftParticle/SoftParticles.h"
 #include "GUI/coregui/Models/ComboProperty.h"
 #include "GUI/coregui/Models/FormFactorItems.h"
 #include "GUI/coregui/Models/LayerItem.h"
diff --git a/GUI/coregui/Models/InstrumentItems.cpp b/GUI/coregui/Models/InstrumentItems.cpp
index 0429b857404a501b89bcd5ba2412ad470db1088c..39ae110f68c9f8f3ed93f61bd5959e8c20c96c5d 100644
--- a/GUI/coregui/Models/InstrumentItems.cpp
+++ b/GUI/coregui/Models/InstrumentItems.cpp
@@ -170,12 +170,12 @@ std::unique_ptr<IUnitConverter> SpecularInstrumentItem::createUnitConverter() co
     if (auto pointwise_axis = dynamic_cast<PointwiseAxisItem*>(axis_item)) {
         if (!pointwise_axis->containsNonXMLData()) // workaround for loading project
             return nullptr;
-        AxesUnits native_units = JobItemUtils::axesUnitsFromName(pointwise_axis->getUnitsLabel());
+        Axes::Units native_units = JobItemUtils::axesUnitsFromName(pointwise_axis->getUnitsLabel());
         return std::make_unique<UnitConverterConvSpec>(instrument->getBeam(),
                                                        *pointwise_axis->getAxis(), native_units);
     } else
         return std::make_unique<UnitConverterConvSpec>(
-            instrument->getBeam(), *axis_item->createAxis(1.0), AxesUnits::DEGREES);
+            instrument->getBeam(), *axis_item->createAxis(1.0), Axes::Units::DEGREES);
 }
 
 const QString Instrument2DItem::P_DETECTOR = "Detector";
diff --git a/GUI/coregui/Models/InterferenceFunctionItems.cpp b/GUI/coregui/Models/InterferenceFunctionItems.cpp
index 1a567be9c542fe22e3e0cfac77f87a2cdf30ac3d..eb05ce5bfd81eb22ffc82c6a45c3121439849e37 100644
--- a/GUI/coregui/Models/InterferenceFunctionItems.cpp
+++ b/GUI/coregui/Models/InterferenceFunctionItems.cpp
@@ -13,11 +13,11 @@
 // ************************************************************************** //
 
 #include "GUI/coregui/Models/InterferenceFunctionItems.h"
+#include "Core/Aggregate/InterferenceFunctions.h"
 #include "Core/Basics/Units.h"
 #include "Core/Correlations/FTDecay1D.h"
 #include "Core/Correlations/FTDecay2D.h"
 #include "Core/Correlations/FTDistributions2D.h"
-#include "Core/includeIncludes/InterferenceFunctions.h"
 #include "GUI/coregui/Models/FTDecayFunctionItems.h"
 #include "GUI/coregui/Models/FTDistributionItems.h"
 #include "GUI/coregui/Models/GroupItem.h"
@@ -43,7 +43,7 @@ InterferenceFunctionItem::InterferenceFunctionItem(const QString& modelType)
         ->setToolTip("Variance of the position in each dimension (nm^2)");
 }
 
-InterferenceFunctionItem::~InterferenceFunctionItem() {}
+InterferenceFunctionItem::~InterferenceFunctionItem() = default;
 
 void InterferenceFunctionItem::setPositionVariance(IInterferenceFunction* p_iff) const
 {
diff --git a/GUI/coregui/Models/JobItem.cpp b/GUI/coregui/Models/JobItem.cpp
index 6d624d30df641a4255005db101586aff2a856c36..854750eedaee26f7f8b6679b63694d5397906194 100644
--- a/GUI/coregui/Models/JobItem.cpp
+++ b/GUI/coregui/Models/JobItem.cpp
@@ -165,7 +165,7 @@ bool JobItem::isFailed() const
 
 bool JobItem::isValidForFitting()
 {
-    return isTag(T_REALDATA) && getItem(T_REALDATA) ? true : false;
+    return isTag(T_REALDATA) && getItem(T_REALDATA);
 }
 
 void JobItem::setBeginTime(const QString& begin_time)
diff --git a/GUI/coregui/Models/JobItemUtils.cpp b/GUI/coregui/Models/JobItemUtils.cpp
index 06ae6877b7232daa51e4002815a13b2e281e5ce9..8b86f62f8ed03132ed888db7bc8d8dec3c61dc04 100644
--- a/GUI/coregui/Models/JobItemUtils.cpp
+++ b/GUI/coregui/Models/JobItemUtils.cpp
@@ -27,20 +27,20 @@
 
 namespace
 {
-const std::map<QString, AxesUnits> units_from_names{{"nbins", AxesUnits::NBINS},
-                                                    {"Radians", AxesUnits::RADIANS},
-                                                    {"Degrees", AxesUnits::DEGREES},
-                                                    {"mm", AxesUnits::MM},
-                                                    {"q-space", AxesUnits::QSPACE}};
-
-const std::map<AxesUnits, QString> names_from_units{{AxesUnits::NBINS, "nbins"},
-                                                    {AxesUnits::RADIANS, "Radians"},
-                                                    {AxesUnits::MM, "mm"},
-                                                    {AxesUnits::QSPACE, "q-space"},
-                                                    {AxesUnits::DEGREES, "Degrees"}};
+const std::map<QString, Axes::Units> units_from_names{{"nbins", Axes::Units::NBINS},
+                                                      {"Radians", Axes::Units::RADIANS},
+                                                      {"Degrees", Axes::Units::DEGREES},
+                                                      {"mm", Axes::Units::MM},
+                                                      {"q-space", Axes::Units::QSPACE}};
+
+const std::map<Axes::Units, QString> names_from_units{{Axes::Units::NBINS, "nbins"},
+                                                      {Axes::Units::RADIANS, "Radians"},
+                                                      {Axes::Units::MM, "mm"},
+                                                      {Axes::Units::QSPACE, "q-space"},
+                                                      {Axes::Units::DEGREES, "Degrees"}};
 
 //! Updates axes' titles
-void updateAxesTitle(DataItem* intensityItem, const IUnitConverter& converter, AxesUnits units);
+void updateAxesTitle(DataItem* intensityItem, const IUnitConverter& converter, Axes::Units units);
 } // namespace
 
 //! Updates axes of OutputData in IntensityData item to correspond with ::P_AXES_UNITS selection.
@@ -60,7 +60,7 @@ void JobItemUtils::updateDataAxes(DataItem* intensityItem, const InstrumentItem*
     if (!intensityItem->getOutputData())
         return;
 
-    AxesUnits requested_units = axesUnitsFromName(intensityItem->selectedAxesUnits());
+    Axes::Units requested_units = axesUnitsFromName(intensityItem->selectedAxesUnits());
 
     const auto converter = DomainObjectBuilder::createUnitConverter(instrumentItem);
     auto newData = UnitConverterUtils::createOutputData(*converter.get(), requested_units);
@@ -73,7 +73,7 @@ void JobItemUtils::updateDataAxes(DataItem* intensityItem, const InstrumentItem*
 
 //! Correspondance of domain detector axes types to their gui counterpart.
 
-QString JobItemUtils::nameFromAxesUnits(AxesUnits units)
+QString JobItemUtils::nameFromAxesUnits(Axes::Units units)
 {
     return names_from_units.find(units) != names_from_units.end() ? names_from_units.at(units)
                                                                   : QString();
@@ -81,7 +81,7 @@ QString JobItemUtils::nameFromAxesUnits(AxesUnits units)
 
 //! Correspondance of GUI axes units names to their domain counterpart.
 
-AxesUnits JobItemUtils::axesUnitsFromName(const QString& name)
+Axes::Units JobItemUtils::axesUnitsFromName(const QString& name)
 {
     return units_from_names.at(name);
 }
@@ -142,7 +142,7 @@ ComboProperty JobItemUtils::availableUnits(const IUnitConverter& converter)
 
 namespace
 {
-void updateAxesTitle(DataItem* intensityItem, const IUnitConverter& converter, AxesUnits units)
+void updateAxesTitle(DataItem* intensityItem, const IUnitConverter& converter, Axes::Units units)
 {
     intensityItem->setXaxisTitle(QString::fromStdString(converter.axisName(0, units)));
     if (converter.dimension() > 1)
diff --git a/GUI/coregui/Models/JobItemUtils.h b/GUI/coregui/Models/JobItemUtils.h
index 5aa2494bcdc5a0dc253cd642ac1fb793245040d4..a68f94abbd9e9a1cb311433d339ff84fe8fa321b 100644
--- a/GUI/coregui/Models/JobItemUtils.h
+++ b/GUI/coregui/Models/JobItemUtils.h
@@ -33,10 +33,10 @@ namespace JobItemUtils
 void updateDataAxes(DataItem* intensityItem, const InstrumentItem* instrumentItem);
 
 //! returns axes units names from their domain counterpart
-QString nameFromAxesUnits(AxesUnits units);
+QString nameFromAxesUnits(Axes::Units units);
 
 //! returns domain axes units type from their GUI name
-AxesUnits axesUnitsFromName(const QString& name);
+Axes::Units axesUnitsFromName(const QString& name);
 
 void setIntensityItemAxesUnits(DataItem* intensityItem, const InstrumentItem* instrumentItem);
 
diff --git a/GUI/coregui/Models/JobModelFunctions.cpp b/GUI/coregui/Models/JobModelFunctions.cpp
index 552c0cc3046af5f3bab72f33f05cbcf9c4b54a3a..bdb2cc71ae9199fdc95856053736fd513591064f 100644
--- a/GUI/coregui/Models/JobModelFunctions.cpp
+++ b/GUI/coregui/Models/JobModelFunctions.cpp
@@ -281,7 +281,7 @@ void createFitContainers(JobItem* jobItem)
                                 "a second FitParameterContainer.");
     }
 
-    parsContainerItem = model->insertNewItem("FitParameterContainer", fitSuiteItem->index(), -1,
+    model->insertNewItem("FitParameterContainer", fitSuiteItem->index(), -1,
                                              FitSuiteItem::T_FIT_PARAMETERS_CONTAINER);
 
     // Minimizer settings
@@ -291,7 +291,7 @@ void createFitContainers(JobItem* jobItem)
                                 "a second MinimizerContainer.");
     }
 
-    minimizerContainerItem = model->insertNewItem("MinimizerContainer", fitSuiteItem->index(), -1,
+    model->insertNewItem("MinimizerContainer", fitSuiteItem->index(), -1,
                                                   FitSuiteItem::T_MINIMIZER);
 }
 
diff --git a/GUI/coregui/Models/ModelMapper.h b/GUI/coregui/Models/ModelMapper.h
index 84d62ddcc1fd2af65690b22de74567f1681b715d..082601c55d53cfb9e1dc2edb19788f9194f55bdc 100644
--- a/GUI/coregui/Models/ModelMapper.h
+++ b/GUI/coregui/Models/ModelMapper.h
@@ -107,10 +107,9 @@ private:
 
 template <class U> inline void ModelMapper::clean_container(U& v, const void* caller)
 {
-    v.erase(std::remove_if(v.begin(), v.end(),
-                           [caller](typename U::value_type const& x) -> bool {
-                               return (x.second == caller ? true : false);
-                           }),
+    v.erase(std::remove_if(
+                v.begin(), v.end(),
+                [caller](typename U::value_type const& x) -> bool { return (x.second == caller); }),
             v.end());
 }
 
diff --git a/GUI/coregui/Models/ParameterTranslators.cpp b/GUI/coregui/Models/ParameterTranslators.cpp
index f028ec598ececbf89eed7aee3da436c0464e083c..3588f1354b4aa057aecc51c5cda9665329c85587 100644
--- a/GUI/coregui/Models/ParameterTranslators.cpp
+++ b/GUI/coregui/Models/ParameterTranslators.cpp
@@ -25,7 +25,7 @@ const QStringList expectedRoughnessPars =
                   << QString::fromStdString("CorrelationLength");
 }
 
-IPathTranslator::~IPathTranslator() {}
+IPathTranslator::~IPathTranslator() = default;
 
 ModelTypeTranslator::ModelTypeTranslator(QString gui_model_type, QString domain_name)
     : m_gui_model_type{std::move(gui_model_type)}, m_domain_name{std::move(domain_name)}
diff --git a/GUI/coregui/Models/ParticleDistributionItem.cpp b/GUI/coregui/Models/ParticleDistributionItem.cpp
index 131cf152a4cdf924b080fc2adcd3f5cd5660dea3..2f8a70c5de6bfe0f4c4a45296b6878d0e1fd7c4a 100644
--- a/GUI/coregui/Models/ParticleDistributionItem.cpp
+++ b/GUI/coregui/Models/ParticleDistributionItem.cpp
@@ -81,7 +81,7 @@ ParticleDistributionItem::ParticleDistributionItem() : SessionGraphicsItem("Part
 
 std::unique_ptr<ParticleDistribution> ParticleDistributionItem::createParticleDistribution() const
 {
-    if (children().size() == 0)
+    if (children().empty())
         return nullptr;
     std::unique_ptr<IParticle> P_particle = TransformToDomain::createIParticle(*getItem());
     if (!P_particle)
@@ -199,7 +199,7 @@ QString ParticleDistributionItem::translateParameterNameToGUI(const QString& dom
 
 const SessionItem* ParticleDistributionItem::childParticle() const
 {
-    if (getItems(T_PARTICLES).size() == 0)
+    if (getItems(T_PARTICLES).empty())
         return nullptr;
 
     ASSERT(getItems(T_PARTICLES).size() == 1);
diff --git a/GUI/coregui/Models/ParticleLayoutItem.cpp b/GUI/coregui/Models/ParticleLayoutItem.cpp
index 6a895b7c5d95af547fddd3aa14ce4024c342adb1..c31ebeadb9996dd7d8383c1d5b41035068754696 100644
--- a/GUI/coregui/Models/ParticleLayoutItem.cpp
+++ b/GUI/coregui/Models/ParticleLayoutItem.cpp
@@ -33,7 +33,7 @@ bool isInterference2D(const QString& name)
 //! Returns true if name is related to 2D interference functions.
 bool isLattice2D(SessionItem* item)
 {
-    return dynamic_cast<Lattice2DItem*>(item) ? true : false;
+    return dynamic_cast<Lattice2DItem*>(item);
 }
 
 const QString density_tooltip =
diff --git a/GUI/coregui/Models/PointwiseAxisItem.cpp b/GUI/coregui/Models/PointwiseAxisItem.cpp
index 697801bca17bd3e7cd74ceeffd8deca5386cc53d..565a8620667a9616db466bbe9dcec3fff08ef645 100644
--- a/GUI/coregui/Models/PointwiseAxisItem.cpp
+++ b/GUI/coregui/Models/PointwiseAxisItem.cpp
@@ -68,7 +68,7 @@ std::unique_ptr<IAxis> PointwiseAxisItem::createAxis(double scale) const
         return nullptr;
 
     const auto converter = m_instrument->createUnitConverter();
-    const auto converted_axis = converter->createConvertedAxis(0, AxesUnits::DEGREES);
+    const auto converted_axis = converter->createConvertedAxis(0, Axes::Units::DEGREES);
 
     // applying scaling
     std::vector<double> centers = converted_axis->getBinCenters();
@@ -139,8 +139,8 @@ void PointwiseAxisItem::updateIndicators()
         return;
 
     const auto converter = m_instrument->createUnitConverter();
-    getItem(P_MIN_DEG)->setValue(converter->calculateMin(0, AxesUnits::DEGREES));
-    getItem(P_MAX_DEG)->setValue(converter->calculateMax(0, AxesUnits::DEGREES));
+    getItem(P_MIN_DEG)->setValue(converter->calculateMin(0, Axes::Units::DEGREES));
+    getItem(P_MAX_DEG)->setValue(converter->calculateMax(0, Axes::Units::DEGREES));
     getItem(P_NBINS)->setValue(static_cast<int>(m_axis->size()));
 
     emitDataChanged();
diff --git a/GUI/coregui/Models/TransformFromDomain.cpp b/GUI/coregui/Models/TransformFromDomain.cpp
index 19e26fd6fc579eb18381e7a000664a746ab63f12..7d4ddc4d4b946e9872628ca33395f4a65e8a4cc1 100644
--- a/GUI/coregui/Models/TransformFromDomain.cpp
+++ b/GUI/coregui/Models/TransformFromDomain.cpp
@@ -13,6 +13,7 @@
 // ************************************************************************** //
 
 #include "GUI/coregui/Models/TransformFromDomain.h"
+#include "Core/Aggregate/InterferenceFunctions.h"
 #include "Core/Basics/Units.h"
 #include "Core/Beam/Beam.h"
 #include "Core/Beam/FootprintGauss.h"
@@ -46,7 +47,6 @@
 #include "Core/Simulation/GISASSimulation.h"
 #include "Core/Simulation/OffSpecSimulation.h"
 #include "Core/Simulation/SpecularSimulation.h"
-#include "Core/includeIncludes/InterferenceFunctions.h"
 #include "GUI/coregui/Models/AxesItems.h"
 #include "GUI/coregui/Models/BackgroundItems.h"
 #include "GUI/coregui/Models/BeamAngleItems.h"
diff --git a/GUI/coregui/Models/TransformToDomain.cpp b/GUI/coregui/Models/TransformToDomain.cpp
index 7ec3667d43cb222ca27302eba8d8412eff719951..0a383e76272eb7b52d1b28ed40db0198ddd5a022 100644
--- a/GUI/coregui/Models/TransformToDomain.cpp
+++ b/GUI/coregui/Models/TransformToDomain.cpp
@@ -13,6 +13,7 @@
 // ************************************************************************** //
 
 #include "GUI/coregui/Models/TransformToDomain.h"
+#include "Core/Aggregate/InterferenceFunctions.h"
 #include "Core/Basics/Units.h"
 #include "Core/Detector/ScanResolution.h"
 #include "Core/Instrument/AngularSpecScan.h"
@@ -23,7 +24,6 @@
 #include "Core/Particle/Particle.h"
 #include "Core/Particle/ParticleCoreShell.h"
 #include "Core/Simulation/GISASSimulation.h"
-#include "Core/includeIncludes/InterferenceFunctions.h"
 #include "GUI/coregui/Models/BeamAngleItems.h"
 #include "GUI/coregui/Models/BeamItems.h"
 #include "GUI/coregui/Models/BeamWavelengthItem.h"
diff --git a/GUI/coregui/Views/CommonWidgets/ItemSelectorWidget.cpp b/GUI/coregui/Views/CommonWidgets/ItemSelectorWidget.cpp
index 0f24b34cd83c4bfc9c6f21406a9dc8af9c71b707..c467479df555af1e61f1fccd5e51e2bb20590566 100644
--- a/GUI/coregui/Views/CommonWidgets/ItemSelectorWidget.cpp
+++ b/GUI/coregui/Views/CommonWidgets/ItemSelectorWidget.cpp
@@ -38,7 +38,7 @@ ItemSelectorWidget::ItemSelectorWidget(QWidget* parent)
             SLOT(onCustomContextMenuRequested(const QPoint&)));
 }
 
-ItemSelectorWidget::~ItemSelectorWidget() {}
+ItemSelectorWidget::~ItemSelectorWidget() = default;
 
 QSize ItemSelectorWidget::sizeHint() const
 {
@@ -100,7 +100,7 @@ void ItemSelectorWidget::onSelectionChanged(const QItemSelection& selected, cons
     QModelIndexList indexes = selected.indexes();
     SessionItem* selectedItem(0);
 
-    if (indexes.size())
+    if (!indexes.empty())
         selectedItem = m_model->itemForIndex(indexes.back());
 
     emit selectionChanged(selectedItem);
@@ -116,7 +116,7 @@ void ItemSelectorWidget::connectModel()
     if (!m_model)
         return;
 
-    m_decorationModel.reset(new SessionDecorationModel(nullptr, m_model));
+    m_decorationModel = std::make_unique<SessionDecorationModel>(nullptr, m_model);
     m_listView->setModel(m_decorationModel.get());
 
     connect(m_listView->selectionModel(),
diff --git a/GUI/coregui/Views/CommonWidgets/ItemStackPresenter.h b/GUI/coregui/Views/CommonWidgets/ItemStackPresenter.h
index 9d26e2f6764666ace89925fb9c5d4370b05c29c2..8d603615f79da76e6ae4280192cae1d6486c682f 100644
--- a/GUI/coregui/Views/CommonWidgets/ItemStackPresenter.h
+++ b/GUI/coregui/Views/CommonWidgets/ItemStackPresenter.h
@@ -85,7 +85,7 @@ template <class T> T* ItemStackPresenter<T>::currentWidget()
 template <class T> T* ItemStackPresenter<T>::itemWidget(SessionItem* item)
 {
     if (m_single_widget) {
-        if (m_itemToWidget.size())
+        if (!m_itemToWidget.empty())
             return m_itemToWidget.first();
     } else {
         return m_itemToWidget[item];
diff --git a/GUI/coregui/Views/CommonWidgets/detailswidget.cpp b/GUI/coregui/Views/CommonWidgets/detailswidget.cpp
index d79f5a26fec3f1a21dc637e9dabc89b351b06349..db12c1c523b418a11e6f17cb8ee3ba9080449640 100644
--- a/GUI/coregui/Views/CommonWidgets/detailswidget.cpp
+++ b/GUI/coregui/Views/CommonWidgets/detailswidget.cpp
@@ -63,7 +63,7 @@ const bool FlatProjectsMode(false);
 namespace Utils
 {
 
-static const int MARGIN = 8;
+const int MARGIN = 8;
 
 class DetailsWidgetPrivate
 {
diff --git a/GUI/coregui/Views/FitWidgets/FitObjectiveBuilder.cpp b/GUI/coregui/Views/FitWidgets/FitObjectiveBuilder.cpp
index dae3735aef4cd4ee89a2383238aa06039451bb67..29bdda82258599a0d3231b5474083aef9fe59574 100644
--- a/GUI/coregui/Views/FitWidgets/FitObjectiveBuilder.cpp
+++ b/GUI/coregui/Views/FitWidgets/FitObjectiveBuilder.cpp
@@ -59,13 +59,13 @@ void FitObjectiveBuilder::runFit()
     auto result =
         requires_residuals
             ? minimizer.minimize(
-                  [&](const Fit::Parameters& params) {
-                      return m_fit_objective->evaluate_residuals(params);
-                  },
-                  createParameters())
+                [&](const Fit::Parameters& params) {
+                    return m_fit_objective->evaluate_residuals(params);
+                },
+                createParameters())
             : minimizer.minimize(
-                  [&](const Fit::Parameters& params) { return m_fit_objective->evaluate(params); },
-                  createParameters());
+                [&](const Fit::Parameters& params) { return m_fit_objective->evaluate(params); },
+                createParameters());
     m_fit_objective->finalize(result);
 }
 
diff --git a/GUI/coregui/Views/FitWidgets/FitSessionController.cpp b/GUI/coregui/Views/FitWidgets/FitSessionController.cpp
index dd3e82b56460cfa08ee79c6db98a37100baab6fc..378816dfd10b2a5525b60f1ea8b362dded06e703 100644
--- a/GUI/coregui/Views/FitWidgets/FitSessionController.cpp
+++ b/GUI/coregui/Views/FitWidgets/FitSessionController.cpp
@@ -75,7 +75,7 @@ void FitSessionController::onStartFittingRequest()
         return;
 
     try {
-        m_objectiveBuilder.reset(new FitObjectiveBuilder(m_jobItem));
+        m_objectiveBuilder = std::make_unique<FitObjectiveBuilder>(m_jobItem);
         m_observer->setInterval(
             m_jobItem->fitSuiteItem()->getItemValue(FitSuiteItem::P_UPDATE_INTERVAL).toInt());
         m_objectiveBuilder->attachObserver(m_observer);
@@ -177,7 +177,7 @@ void FitSessionController::updateLog(const FitProgressInfo& info)
     int index(0);
     QVector<double> values = GUIHelpers::fromStdVector(info.parValues());
     for (auto item : fitParContainer->getItems(FitParameterContainerItem::T_FIT_PARAMETERS)) {
-        if (item->getItems(FitParameterItem::T_LINK).size() == 0)
+        if (item->getItems(FitParameterItem::T_LINK).empty())
             continue;
         QString parinfo = QString("      %1 %2\n").arg(item->displayName()).arg(values[index++]);
         message.append(parinfo);
diff --git a/GUI/coregui/Views/FitWidgets/GUIFitObserver.cpp b/GUI/coregui/Views/FitWidgets/GUIFitObserver.cpp
index cd2b2fb0dfdb5643b664ebf206db4231ed0aa827..ff06be296ba7102befa3f26a64ea4c90ee87087a 100644
--- a/GUI/coregui/Views/FitWidgets/GUIFitObserver.cpp
+++ b/GUI/coregui/Views/FitWidgets/GUIFitObserver.cpp
@@ -24,7 +24,7 @@ GUIFitObserver::GUIFitObserver(QObject* parent)
 {
 }
 
-GUIFitObserver::~GUIFitObserver() {}
+GUIFitObserver::~GUIFitObserver() = default;
 
 void GUIFitObserver::update(const FitObjective* subject)
 {
diff --git a/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/CsvDataColumn.cpp b/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/CsvDataColumn.cpp
index 609eac4705dc4b7ba5be0d0e020ebfa7e633907d..6450abe95388302f5de854c9f422d91717ef8679 100644
--- a/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/CsvDataColumn.cpp
+++ b/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/CsvDataColumn.cpp
@@ -66,7 +66,7 @@ void CsvIntensityColumn::resetColumn(int colNum, double multiplier, csv::DataCol
 /*Csv Coordinate Column*/
 
 // Constructors:
-CsvCoordinateColumn::CsvCoordinateColumn() : CsvIntensityColumn(), m_units(AxesUnits::NBINS) {}
+CsvCoordinateColumn::CsvCoordinateColumn() : CsvIntensityColumn(), m_units(Axes::Units::NBINS) {}
 
 CsvCoordinateColumn::CsvCoordinateColumn(const CsvCoordinateColumn& toCopy)
     : CsvIntensityColumn(toCopy), m_units(toCopy.units())
@@ -74,18 +74,18 @@ CsvCoordinateColumn::CsvCoordinateColumn(const CsvCoordinateColumn& toCopy)
 }
 
 CsvCoordinateColumn::CsvCoordinateColumn(int colNum, double multiplier, csv::DataColumn values,
-                                         AxesUnits units)
+                                         Axes::Units units)
 
     : CsvIntensityColumn(colNum, multiplier, values), m_units(units)
 {
 }
 // Getters:
-AxesUnits CsvCoordinateColumn::units() const
+Axes::Units CsvCoordinateColumn::units() const
 {
     return m_units;
 }
 // Setters:
-void CsvCoordinateColumn::setUnits(AxesUnits const units)
+void CsvCoordinateColumn::setUnits(Axes::Units const units)
 {
     m_units = units;
 }
@@ -94,7 +94,7 @@ void CsvCoordinateColumn::setName(csv::ColumnType const name)
     m_name = name;
 }
 void CsvCoordinateColumn::resetColumn(int colNum, double multiplier, csv::DataColumn values,
-                                      AxesUnits units, csv::ColumnType name)
+                                      Axes::Units units, csv::ColumnType name)
 {
     CsvIntensityColumn::resetColumn(colNum, multiplier, values);
     m_units = units;
diff --git a/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/CsvDataColumn.h b/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/CsvDataColumn.h
index 0fd9f3de8bfa029959578bc13444e848740ff39e..c105ac459dc8fd5812b8ae149cb6e2e56a85a570 100644
--- a/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/CsvDataColumn.h
+++ b/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/CsvDataColumn.h
@@ -49,20 +49,21 @@ public:
     // Constructors:
     CsvCoordinateColumn();
     CsvCoordinateColumn(const CsvCoordinateColumn& toCopy);
-    CsvCoordinateColumn(int colNum, double multiplier, csv::DataColumn values, AxesUnits units);
+    CsvCoordinateColumn(int colNum, double multiplier, csv::DataColumn values, Axes::Units units);
 
     // Getters:
-    AxesUnits units() const;
+    Axes::Units units() const;
     csv::ColumnType name() const { return m_name; }
 
     // Setters:
-    void setUnits(AxesUnits const units);
+    void setUnits(Axes::Units const units);
     void setName(csv::ColumnType const name);
     void resetColumn(int colNum = -1, double multiplier = 1., csv::DataColumn values = {},
-                     AxesUnits units = AxesUnits::NBINS, csv::ColumnType name = csv::_intensity_);
+                     Axes::Units units = Axes::Units::NBINS,
+                     csv::ColumnType name = csv::_intensity_);
 
 private:
-    AxesUnits m_units;
+    Axes::Units m_units;
     csv::ColumnType m_name;
 };
 
diff --git a/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/CsvImportAssistant.cpp b/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/CsvImportAssistant.cpp
index 6c3b29620c17d8b4099a44a0ef8f64b8146ee2f9..e800a123415fdada6b188005f6d79bddb32ad0b5 100644
--- a/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/CsvImportAssistant.cpp
+++ b/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/CsvImportAssistant.cpp
@@ -32,7 +32,7 @@
 CsvImportAssistant::CsvImportAssistant(const QString& file, const bool useGUI, QWidget* parent)
     : m_fileName(file), m_csvFile(nullptr), m_csvArray(), m_separator('\0'), m_intensityColNum(-1),
       m_intensityMultiplier(1.0), m_coordinateColNum(-1), m_coordinateMultiplier(1.0),
-      m_firstRow(-1), m_lastRow(-1), m_units(AxesUnits::NBINS), m_dataAvailable(false)
+      m_firstRow(-1), m_lastRow(-1), m_units(Axes::Units::NBINS), m_dataAvailable(false)
 {
     if (!loadCsvFile()) {
         return;
@@ -43,7 +43,7 @@ CsvImportAssistant::CsvImportAssistant(const QString& file, const bool useGUI, Q
     } else {
         m_intensityColNum = 0;
         m_coordinateColNum = -1;
-        m_units = AxesUnits::NBINS;
+        m_units = Axes::Units::NBINS;
         m_firstRow = 0;
         m_lastRow = int(m_csvFile->NumberOfRows() - 1);
         m_dataAvailable = true;
@@ -87,7 +87,7 @@ void CsvImportAssistant::setIntensityColumn(int iCol, double multiplier)
     m_intensityColNum = iCol - 1;
     m_intensityMultiplier = multiplier;
 }
-void CsvImportAssistant::setCoordinateColumn(int iCol, AxesUnits units, double multiplier)
+void CsvImportAssistant::setCoordinateColumn(int iCol, Axes::Units units, double multiplier)
 {
     m_coordinateColNum = iCol - 1;
     m_units = units;
@@ -167,7 +167,7 @@ ImportDataInfo CsvImportAssistant::fillData()
 
     getValuesFromColumns(intensityValues, coordinateValues);
 
-    auto axisName = csv::UnitsLabels[m_units].toStdString();
+    const auto axisName = axisUnitLabel.at(m_units);
     PointwiseAxis coordAxis(axisName, coordinateValues);
     resultOutputData->addAxis(coordAxis);
     resultOutputData->setRawDataVector(intensityValues);
@@ -377,6 +377,6 @@ void CsvImportAssistant::resetSelection()
     m_coordinateColNum = -1;
     m_firstRow = -1;
     m_lastRow = -1;
-    m_units = AxesUnits::NBINS;
+    m_units = Axes::Units::NBINS;
     m_dataAvailable = false;
 }
diff --git a/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/CsvImportAssistant.h b/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/CsvImportAssistant.h
index 8f34d3effe9ab54528ac414e8385a7b3e3bb7bf9..e2d29fe36cac4afc1dbf95a9d3e6501ef3095203 100644
--- a/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/CsvImportAssistant.h
+++ b/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/CsvImportAssistant.h
@@ -29,7 +29,7 @@ class csvSelectionState
 public:
     csvSelectionState()
         : m_intensityColNum(-1), m_intensityMultiplier(1.), m_coordinateColNum(-1),
-          m_coordinateMultiplier(1.), m_firstRow(-1), m_lastRow(-1), m_units(AxesUnits::NBINS)
+          m_coordinateMultiplier(1.), m_firstRow(-1), m_lastRow(-1), m_units(Axes::Units::NBINS)
     {
     }
 
@@ -39,7 +39,7 @@ public:
     double m_coordinateMultiplier;
     int m_firstRow;
     int m_lastRow;
-    AxesUnits m_units;
+    Axes::Units m_units;
 
     bool availableData() { return m_intensityColNum > -1; }
 };
@@ -53,7 +53,7 @@ public:
     ImportDataInfo getData() { return m_dataAvailable ? fillData() : ImportDataInfo(); }
     static void showErrorMessage(std::string message);
     void setIntensityColumn(int iCol, double multiplier = 1.0);
-    void setCoordinateColumn(int iCol, AxesUnits units, double multiplier = 1.0);
+    void setCoordinateColumn(int iCol, Axes::Units units, double multiplier = 1.0);
     void setFirstRow(int iRow);
     void setLastRow(int iRow);
     size_t columnCount() { return m_csvArray[0].size(); }
@@ -82,7 +82,7 @@ private:
     int m_firstRow;
     int m_lastRow;
     std::set<int> m_rowsToDiscard;
-    AxesUnits m_units;
+    Axes::Units m_units;
     bool m_dataAvailable;
 };
 #endif // BORNAGAIN_GUI_COREGUI_VIEWS_IMPORTDATAWIDGETS_CSVIMPORTASSISTANT_CSVIMPORTASSISTANT_H
diff --git a/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/CsvImportTable.cpp b/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/CsvImportTable.cpp
index 28a71e3a4f81577e8bef071ce27703a8c21c4491..a56a631a70389c41367d74fcb6e0b3e9249ad6cd 100644
--- a/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/CsvImportTable.cpp
+++ b/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/CsvImportTable.cpp
@@ -168,14 +168,14 @@ QString CsvImportData::columnLabel(CsvImportData::DATA_TYPE type) const
 QList<QString> CsvImportData::availableCoordinateUnits() const
 {
     if (column(Coordinate) < 0)
-        return {csv::UnitsLabels[AxesUnits::NBINS]};
+        return {axisUnitLabel.at(Axes::Units::NBINS)};
 
     auto coordinate_type = m_selected_cols.at(Coordinate).name();
     if (coordinate_type == csv::_q_)
-        return {csv::UnitsLabels[AxesUnits::QSPACE]};
+        return {axisUnitLabel.at(Axes::Units::QSPACE)};
     else if (coordinate_type == csv::_theta_)
-        return {{csv::UnitsLabels[AxesUnits::DEGREES]}, {csv::UnitsLabels[AxesUnits::RADIANS]}};
-    return {csv::UnitsLabels[AxesUnits::NBINS]};
+        return {{axisUnitLabel.at(Axes::Units::DEGREES)}, {axisUnitLabel.at(Axes::Units::RADIANS)}};
+    return {axisUnitLabel.at(Axes::Units::NBINS)};
 }
 
 size_t CsvImportData::nCols() const
diff --git a/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/DataSelector.cpp b/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/DataSelector.cpp
index d87e4295c13bbd6bd3796b3dc1b5bc4e034a285a..ae5f267114f546b38056932c09035a97dc931161 100644
--- a/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/DataSelector.cpp
+++ b/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/DataSelector.cpp
@@ -139,7 +139,7 @@ void DataSelector::updateSelection()
         m_coordinateUnitsComboBox->setEnabled(true);
     } else {
         m_coordinateUnitsComboBox->clear();
-        m_coordinateUnitsComboBox->addItem(csv::UnitsLabels[AxesUnits::NBINS]);
+        m_coordinateUnitsComboBox->addItem(axisUnitLabel.at(Axes::Units::NBINS));
     }
 }
 
@@ -223,13 +223,14 @@ size_t DataSelector::maxLines() const
     return size_t(m_lastDataRowSpinBox->maximum());
 }
 
-AxesUnits DataSelector::units() const
+Axes::Units DataSelector::units() const
 {
-    AxesUnits defaultUnits = AxesUnits::NBINS;
-    for (int i = 0; i < csv::UnitsLabels.size(); i++)
-        if (m_coordinateUnitsComboBox->currentText() == csv::UnitsLabels[i])
-            return AxesUnits(i);
-    return defaultUnits;
+    for (int i = 0; i < csv::UnitsLabels.size(); i++) {
+        const Axes::Units u = static_cast<Axes::Units>(i);
+        if (m_coordinateUnitsComboBox->currentText() == QString(axisUnitLabel.at(u)))
+            return u;
+    }
+    return Axes::Units::NBINS; // default
 }
 
 char DataSelector::separator() const
@@ -322,7 +323,7 @@ QBoxLayout* DataSelector::createLayout()
     m_coordinateUnitsComboBox = new QComboBox();
     m_coordinateUnitsComboBox->setMaximumWidth(70);
     m_coordinateUnitsComboBox->setMinimumWidth(70);
-    m_coordinateUnitsComboBox->addItem(csv::UnitsLabels[AxesUnits::NBINS]);
+    m_coordinateUnitsComboBox->addItem(axisUnitLabel.at(Axes::Units::NBINS));
 
     auto layout = new QVBoxLayout;
     layout->setContentsMargins(0, 0, 0, 0);
diff --git a/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/DataSelector.h b/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/DataSelector.h
index aa41d17a7935a30c05185f8de2525a6b1186fed0..12a5b3d7bf64a8c65fcc420a598c5b4f7d901b47 100644
--- a/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/DataSelector.h
+++ b/GUI/coregui/Views/ImportDataWidgets/CsvImportAssistant/DataSelector.h
@@ -44,7 +44,7 @@ public:
     double intensityMultiplier() const { return m_tableWidget->intensityMultiplier(); }
     double coordinateMultiplier() const { return m_tableWidget->coordinateMultiplier(); }
     std::set<int> rowsToDiscard() const { return m_tableWidget->rowsToDiscard(); }
-    AxesUnits units() const;
+    Axes::Units units() const;
     void setDataArray(csv::DataArray csvArray)
     {
         m_data = std::move(csvArray);
diff --git a/GUI/coregui/Views/ImportDataWidgets/ImportDataUtils.cpp b/GUI/coregui/Views/ImportDataWidgets/ImportDataUtils.cpp
index 4c69e96955a1b87732db555146d2e8eec186227b..5bf848948210920770b72a9da25c5b8d2238804d 100644
--- a/GUI/coregui/Views/ImportDataWidgets/ImportDataUtils.cpp
+++ b/GUI/coregui/Views/ImportDataWidgets/ImportDataUtils.cpp
@@ -89,13 +89,13 @@ ImportDataInfo ImportDataUtils::Import1dData(QString& fileName)
         || DataFormatUtils::isIntFile(fileName.toStdString())
         || DataFormatUtils::isTiffFile(fileName.toStdString())) {
         try {
-            return ImportDataInfo(ImportKnownData(fileName), AxesUnits::QSPACE);
+            return ImportDataInfo(ImportKnownData(fileName), Axes::Units::QSPACE);
         } catch (...) {
             return getFromImportAssistant(fileName);
         }
     } else {
         try {
-            return ImportDataInfo(ImportReflectometryData(fileName), AxesUnits::QSPACE);
+            return ImportDataInfo(ImportReflectometryData(fileName), Axes::Units::QSPACE);
         } catch (...) {
             QString message =
                 QString("There was a problem while trying to import data from "
diff --git a/GUI/coregui/Views/IntensityDataWidgets/ProjectionsPlot.cpp b/GUI/coregui/Views/IntensityDataWidgets/ProjectionsPlot.cpp
index 3d79534afdb596d5b2cf38da5631cd03b1015b05..c2861b4b7715a98bf9610bce8136edfba59a0ed5 100644
--- a/GUI/coregui/Views/IntensityDataWidgets/ProjectionsPlot.cpp
+++ b/GUI/coregui/Views/IntensityDataWidgets/ProjectionsPlot.cpp
@@ -169,7 +169,7 @@ void ProjectionsPlot::unsubscribeFromChildren()
 
 void ProjectionsPlot::updateProjectionsData()
 {
-    m_hist2d.reset(new Histogram2D(*intensityItem()->getOutputData()));
+    m_hist2d = std::make_unique<Histogram2D>(*intensityItem()->getOutputData());
     updateAxesRange();
     updateAxesTitle();
     setLogz(intensityItem()->isLogz());
diff --git a/GUI/coregui/Views/IntensityDataWidgets/SaveProjectionsAssistant.cpp b/GUI/coregui/Views/IntensityDataWidgets/SaveProjectionsAssistant.cpp
index 495d6185a00c83f7fe9d94f5f39bfa09365df65b..67b54da97c59aba3b6fa7754799159de219f23fe 100644
--- a/GUI/coregui/Views/IntensityDataWidgets/SaveProjectionsAssistant.cpp
+++ b/GUI/coregui/Views/IntensityDataWidgets/SaveProjectionsAssistant.cpp
@@ -62,7 +62,7 @@ void SaveProjectionsAssistant::saveProjections(QWidget* parent, IntensityDataIte
         throw GUIHelpers::Error("TestProjectUtils::createTestFile() -> Error. "
                                 "Can't create file");
 
-    m_hist2d.reset(new Histogram2D(*intensityItem->getOutputData()));
+    m_hist2d = std::make_unique<Histogram2D>(*intensityItem->getOutputData());
 
     QTextStream out(&file);
 
diff --git a/GUI/coregui/Views/JobWidgets/JobSelectorActions.cpp b/GUI/coregui/Views/JobWidgets/JobSelectorActions.cpp
index 5e144ee0138e0f75aa20d604dc3e507662757665..eed5b59a6293f7021652e4c50e7a1ecfe33f3808 100644
--- a/GUI/coregui/Views/JobWidgets/JobSelectorActions.cpp
+++ b/GUI/coregui/Views/JobWidgets/JobSelectorActions.cpp
@@ -115,7 +115,7 @@ void JobSelectorActions::initItemContextMenu(QMenu& menu, const QModelIndex& ind
     QModelIndex targetIndex = indexAtPoint;
     if (!targetIndex.isValid()) {
         QModelIndexList indexList = m_selectionModel->selectedIndexes();
-        if (indexList.size())
+        if (!indexList.empty())
             targetIndex = indexList.first();
     }
     m_runJobAction->setEnabled(canRunJob(targetIndex));
diff --git a/GUI/coregui/Views/JobWidgets/ParameterTuningDelegate.cpp b/GUI/coregui/Views/JobWidgets/ParameterTuningDelegate.cpp
index d50b00da3f26444f5308b72d51162289c01727b5..07efb7fad8fb80b6d5d33dfe2c937f9d5d631af9 100644
--- a/GUI/coregui/Views/JobWidgets/ParameterTuningDelegate.cpp
+++ b/GUI/coregui/Views/JobWidgets/ParameterTuningDelegate.cpp
@@ -92,7 +92,7 @@ ParameterTuningDelegate::ParameterTuningDelegate(QObject* parent)
 {
 }
 
-ParameterTuningDelegate::~ParameterTuningDelegate() {}
+ParameterTuningDelegate::~ParameterTuningDelegate() = default;
 
 void ParameterTuningDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option,
                                     const QModelIndex& index) const
diff --git a/GUI/coregui/Views/MaskWidgets/EllipseView.cpp b/GUI/coregui/Views/MaskWidgets/EllipseView.cpp
index 2d7748a35071460698160b4fd61e230ee66b9ae5..5606a2f7781a9780fd2e720d9da56510de6fa8e3 100644
--- a/GUI/coregui/Views/MaskWidgets/EllipseView.cpp
+++ b/GUI/coregui/Views/MaskWidgets/EllipseView.cpp
@@ -18,7 +18,7 @@
 #include <QGraphicsSceneMouseEvent>
 #include <QPainter>
 
-EllipseView::EllipseView() {}
+EllipseView::EllipseView() = default;
 
 void EllipseView::onChangedX()
 {
diff --git a/GUI/coregui/Views/MaskWidgets/MaskEditorPropertyPanel.cpp b/GUI/coregui/Views/MaskWidgets/MaskEditorPropertyPanel.cpp
index ee403d40ec00ed3e3f6c7c333840bbe38e58c7c3..47af7004027e533a9ab59da68fb6644edc4d20dd 100644
--- a/GUI/coregui/Views/MaskWidgets/MaskEditorPropertyPanel.cpp
+++ b/GUI/coregui/Views/MaskWidgets/MaskEditorPropertyPanel.cpp
@@ -123,7 +123,7 @@ void MaskEditorPropertyPanel::setPanelHidden(bool value)
         m_plotPropertyEditor->setItem(nullptr);
     } else {
         QModelIndexList indexes = selectionModel()->selectedIndexes();
-        if (indexes.size())
+        if (!indexes.empty())
             m_maskPropertyEditor->setItem(m_maskModel->itemForIndex(indexes.front()));
 
         m_plotPropertyEditor->setItem(m_intensityDataItem);
@@ -133,7 +133,7 @@ void MaskEditorPropertyPanel::setPanelHidden(bool value)
 void MaskEditorPropertyPanel::onSelectionChanged(const QItemSelection& selected,
                                                  const QItemSelection&)
 {
-    if (selected.size())
+    if (!selected.empty())
         m_maskPropertyEditor->setItem(m_maskModel->itemForIndex(selected.indexes().front()));
     else
         m_maskPropertyEditor->setItem(nullptr);
diff --git a/GUI/coregui/Views/MaskWidgets/RectangleView.cpp b/GUI/coregui/Views/MaskWidgets/RectangleView.cpp
index 879b27853444488d5379fd294370b4fe33c32a13..a08c5d4b953519dd21edba38843f3d0898e669bb 100644
--- a/GUI/coregui/Views/MaskWidgets/RectangleView.cpp
+++ b/GUI/coregui/Views/MaskWidgets/RectangleView.cpp
@@ -17,7 +17,7 @@
 #include <QGraphicsSceneMouseEvent>
 #include <QPainter>
 
-RectangleView::RectangleView() {}
+RectangleView::RectangleView() = default;
 
 void RectangleView::onChangedX()
 {
diff --git a/GUI/coregui/Views/MaterialEditor/ExternalProperty.cpp b/GUI/coregui/Views/MaterialEditor/ExternalProperty.cpp
index fff77a123707db07874133aef216b3eb48eb0c41..fce9a49c5ef0356da5aa7dba8403189115e52377 100644
--- a/GUI/coregui/Views/MaterialEditor/ExternalProperty.cpp
+++ b/GUI/coregui/Views/MaterialEditor/ExternalProperty.cpp
@@ -16,7 +16,7 @@
 #include "GUI/coregui/Models/MaterialItem.h"
 #include "GUI/coregui/Models/MaterialModel.h"
 
-ExternalProperty::ExternalProperty() {}
+ExternalProperty::ExternalProperty() = default;
 
 QString ExternalProperty::text() const
 {
diff --git a/GUI/coregui/Views/PropertyEditor/MultiComboPropertyEditor.cpp b/GUI/coregui/Views/PropertyEditor/MultiComboPropertyEditor.cpp
index 675567f7fd3c79f3816f1757d333cdd04429c8b1..9f4248ee7fd6b2c81c8411474a7cb392ca9d9ef6 100644
--- a/GUI/coregui/Views/PropertyEditor/MultiComboPropertyEditor.cpp
+++ b/GUI/coregui/Views/PropertyEditor/MultiComboPropertyEditor.cpp
@@ -96,7 +96,7 @@ void MultiComboPropertyEditor::onModelDataChanged(const QModelIndex& topLeft, co
         return;
 
     ComboProperty comboProperty = m_data.value<ComboProperty>();
-    auto state = item->checkState() == Qt::Checked ? true : false;
+    auto state = item->checkState() == Qt::Checked;
     comboProperty.setSelected(topLeft.row(), state);
 
     updateBoxLabel();
diff --git a/GUI/coregui/Views/PropertyEditor/TestComponentView.cpp b/GUI/coregui/Views/PropertyEditor/TestComponentView.cpp
index bfd5971d6dfb51f5e715f25117a92ca25656eea9..3f2c1aa2f35bc0723311cfefaf4185cb3db55cf3 100644
--- a/GUI/coregui/Views/PropertyEditor/TestComponentView.cpp
+++ b/GUI/coregui/Views/PropertyEditor/TestComponentView.cpp
@@ -130,7 +130,7 @@ void TestComponentView::onSelectionChanged(const QItemSelection& selected, const
 {
     QModelIndexList indices = selected.indexes();
 
-    if (indices.size()) {
+    if (!indices.empty()) {
         //        QModelIndex selectedIndex = indices.front();
         //        m_componentTree->setRootIndex(selectedIndex);
         //        m_componentTree->treeView()->expandAll();
diff --git a/GUI/coregui/Views/RealSpaceWidgets/IPositionBuilder.cpp b/GUI/coregui/Views/RealSpaceWidgets/IPositionBuilder.cpp
index 77cca438bc717e5ec60024a86d64daad48009e8a..7f53720907d95f6515462132b85d23d2e90f2dbe 100644
--- a/GUI/coregui/Views/RealSpaceWidgets/IPositionBuilder.cpp
+++ b/GUI/coregui/Views/RealSpaceWidgets/IPositionBuilder.cpp
@@ -13,8 +13,8 @@
 // ************************************************************************** //
 
 #include "GUI/coregui/Views/RealSpaceWidgets/IPositionBuilder.h"
+#include "Core/Aggregate/InterferenceFunctions.h"
 #include "Core/Lattice/Lattice2D.h"
-#include "Core/includeIncludes/InterferenceFunctions.h"
 #include "GUI/coregui/Views/RealSpaceWidgets/RealSpace2DParacrystalUtils.h"
 #include <cmath>
 #include <random>
diff --git a/GUI/coregui/Views/RealSpaceWidgets/RealSpaceBuilder.cpp b/GUI/coregui/Views/RealSpaceWidgets/RealSpaceBuilder.cpp
index ca86d502f29ac2606be2607b4bc0da943569c8b1..2b5867480a0331d0ea77ad557e1f6bb5f7b49538 100644
--- a/GUI/coregui/Views/RealSpaceWidgets/RealSpaceBuilder.cpp
+++ b/GUI/coregui/Views/RealSpaceWidgets/RealSpaceBuilder.cpp
@@ -13,10 +13,10 @@
 // ************************************************************************** //
 
 #include "GUI/coregui/Views/RealSpaceWidgets/RealSpaceBuilder.h"
+#include "Core/Aggregate/InterferenceFunctions.h"
 #include "Core/Basics/Units.h"
 #include "Core/Particle/Particle.h"
 #include "Core/Particle/ParticleCoreShell.h"
-#include "Core/includeIncludes/InterferenceFunctions.h"
 #include "GUI/ba3d/model/layer.h"
 #include "GUI/coregui/Models/InterferenceFunctionItems.h"
 #include "GUI/coregui/Models/Lattice2DItems.h"
@@ -46,7 +46,7 @@ std::unique_ptr<IInterferenceFunction> GetInterferenceFunction(const SessionItem
 
 RealSpaceBuilder::RealSpaceBuilder(QWidget* parent) : QWidget(parent) {}
 
-RealSpaceBuilder::~RealSpaceBuilder() {}
+RealSpaceBuilder::~RealSpaceBuilder() = default;
 
 void RealSpaceBuilder::populate(RealSpaceModel* model, const SessionItem& item,
                                 const SceneGeometry& sceneGeometry,
@@ -88,7 +88,7 @@ void RealSpaceBuilder::populateMultiLayer(RealSpaceModel* model, const SessionIt
     int index(0);
     for (auto layer : item.getItems(MultiLayerItem::T_LAYERS)) {
 
-        bool isTopLayer = index == 0 ? true : false;
+        bool isTopLayer = index == 0;
         populateLayer(model, *layer, sceneGeometry,
                       QVector3D(0, 0, static_cast<float>(-total_height)), isTopLayer);
 
diff --git a/GUI/coregui/Views/RealSpaceWidgets/RealSpaceBuilderUtils.cpp b/GUI/coregui/Views/RealSpaceWidgets/RealSpaceBuilderUtils.cpp
index b45578044abd7a2ca95fe2cc2b6ded248b517fec..af9ddc8e13e37c0f98e86578fec4c6f38f4563f4 100644
--- a/GUI/coregui/Views/RealSpaceWidgets/RealSpaceBuilderUtils.cpp
+++ b/GUI/coregui/Views/RealSpaceWidgets/RealSpaceBuilderUtils.cpp
@@ -13,6 +13,7 @@
 // ************************************************************************** //
 
 #include "GUI/coregui/Views/RealSpaceWidgets/RealSpaceBuilderUtils.h"
+#include "Core/Aggregate/InterferenceFunctions.h"
 #include "Core/Basics/Exceptions.h"
 #include "Core/Basics/Units.h"
 #include "Core/Particle/FormFactorCrystal.h"
@@ -23,7 +24,6 @@
 #include "Core/Particle/ParticleDistribution.h"
 #include "Core/Scattering/IFormFactorDecorator.h"
 #include "Core/Scattering/Rotations.h"
-#include "Core/includeIncludes/InterferenceFunctions.h"
 #include "GUI/coregui/Models/InterferenceFunctionItems.h"
 #include "GUI/coregui/Models/Lattice2DItems.h"
 #include "GUI/coregui/Models/LayerItem.h"
diff --git a/GUI/coregui/Views/RealSpaceWidgets/RealSpaceCanvas.cpp b/GUI/coregui/Views/RealSpaceWidgets/RealSpaceCanvas.cpp
index eb61ad7ba9244a69b1afcf153b29f94dd3a8aea0..adcd229f925363c531865e3832d5d7ea290c06dc 100644
--- a/GUI/coregui/Views/RealSpaceWidgets/RealSpaceCanvas.cpp
+++ b/GUI/coregui/Views/RealSpaceWidgets/RealSpaceCanvas.cpp
@@ -81,7 +81,7 @@ void RealSpaceCanvas::updateToSelection()
     if (!m_view_locked) {
         QModelIndexList indices = m_selectionModel->selection().indexes();
 
-        if (indices.size())
+        if (!indices.empty())
             m_currentSelection = FilterPropertyProxy::toSourceIndex(indices.back());
         else
             m_currentSelection = {};
@@ -242,8 +242,9 @@ void RealSpaceCanvas::setConnected(SampleModel* model, bool makeConnected)
                 Qt::UniqueConnection);
         connect(model, &SampleModel::modelReset, this, &RealSpaceCanvas::resetScene,
                 Qt::UniqueConnection);
-        connect(model, &SampleModel::modelAboutToBeReset, this, [&]() { m_currentSelection = {}; },
-                Qt::UniqueConnection);
+        connect(
+            model, &SampleModel::modelAboutToBeReset, this, [&]() { m_currentSelection = {}; },
+            Qt::UniqueConnection);
 
     } else {
         disconnect(model, &SampleModel::rowsInserted, this, &RealSpaceCanvas::updateScene);
diff --git a/GUI/coregui/Views/RealSpaceWidgets/RealSpaceMesoCrystalUtils.cpp b/GUI/coregui/Views/RealSpaceWidgets/RealSpaceMesoCrystalUtils.cpp
index be67cebf8d62bf8f54967e8350b926321bdadfce..d2bb7af2accdd2bb1c08981fb6b7b9fbe6236745 100644
--- a/GUI/coregui/Views/RealSpaceWidgets/RealSpaceMesoCrystalUtils.cpp
+++ b/GUI/coregui/Views/RealSpaceWidgets/RealSpaceMesoCrystalUtils.cpp
@@ -15,13 +15,13 @@
 #include "GUI/coregui/Views/RealSpaceWidgets/RealSpaceMesoCrystalUtils.h"
 #include "Core/Basics/Exceptions.h"
 #include "Core/Basics/Units.h"
+#include "Core/HardParticle/HardParticles.h"
 #include "Core/Particle/IParticle.h"
 #include "Core/Particle/MesoCrystal.h"
 #include "Core/Particle/Particle.h"
 #include "Core/Particle/ParticleCoreShell.h"
 #include "Core/Particle/ParticleDistribution.h"
 #include "Core/Scattering/IFormFactor.h"
-#include "Core/includeIncludes/HardParticles.h"
 #include "GUI/ba3d/model/particles.h"
 #include "GUI/coregui/Models/Lattice2DItems.h"
 #include "GUI/coregui/Models/MesoCrystalItem.h"
@@ -348,7 +348,7 @@ bool isPositionInsideMesoCrystal(const IFormFactor* outerShape, kvector_t positi
 }
 } // namespace
 
-RealSpaceMesoCrystal::~RealSpaceMesoCrystal() {}
+RealSpaceMesoCrystal::~RealSpaceMesoCrystal() = default;
 
 RealSpaceMesoCrystal::RealSpaceMesoCrystal(const MesoCrystalItem* mesoCrystalItem,
                                            double total_abundance, const QVector3D& origin)
diff --git a/GUI/coregui/Views/RealSpaceWidgets/RealSpacePositionBuilder.cpp b/GUI/coregui/Views/RealSpaceWidgets/RealSpacePositionBuilder.cpp
index 164490fe6fa5afe5046577aa9c3e162f8c5b4575..d650ccc1c57c13477f08f92b5e4de2a76c502a6b 100644
--- a/GUI/coregui/Views/RealSpaceWidgets/RealSpacePositionBuilder.cpp
+++ b/GUI/coregui/Views/RealSpaceWidgets/RealSpacePositionBuilder.cpp
@@ -23,27 +23,27 @@ RealSpacePositionBuilder::~RealSpacePositionBuilder() = default;
 
 void RealSpacePositionBuilder::visit(const InterferenceFunction1DLattice* p_iff)
 {
-    mP_pos_builder.reset(new Lattice1DPositionBuilder(p_iff));
+    mP_pos_builder = std::make_unique<Lattice1DPositionBuilder>(p_iff);
 }
 
 void RealSpacePositionBuilder::visit(const InterferenceFunction2DLattice* p_iff)
 {
-    mP_pos_builder.reset(new Lattice2DPositionBuilder(p_iff));
+    mP_pos_builder = std::make_unique<Lattice2DPositionBuilder>(p_iff);
 }
 
 void RealSpacePositionBuilder::visit(const InterferenceFunction2DParaCrystal* p_iff)
 {
-    mP_pos_builder.reset(new ParaCrystal2DPositionBuilder(p_iff));
+    mP_pos_builder = std::make_unique<ParaCrystal2DPositionBuilder>(p_iff);
 }
 
 void RealSpacePositionBuilder::visit(const InterferenceFunctionFinite2DLattice* p_iff)
 {
-    mP_pos_builder.reset(new Finite2DLatticePositionBuilder(p_iff));
+    mP_pos_builder = std::make_unique<Finite2DLatticePositionBuilder>(p_iff);
 }
 
 void RealSpacePositionBuilder::visit(const InterferenceFunctionRadialParaCrystal* p_iff)
 {
-    mP_pos_builder.reset(new RadialParacrystalPositionBuilder(p_iff));
+    mP_pos_builder = std::make_unique<RadialParacrystalPositionBuilder>(p_iff);
 }
 
 void RealSpacePositionBuilder::visit(const InterferenceFunctionNone*)
diff --git a/GUI/coregui/Views/RealSpaceWidgets/TransformTo3D.cpp b/GUI/coregui/Views/RealSpaceWidgets/TransformTo3D.cpp
index 0867a3c98d2d7be969e3c5d8636bff1e929523b6..33c2694cbd5a69437ea9959cc7e62d5493b27cb3 100644
--- a/GUI/coregui/Views/RealSpaceWidgets/TransformTo3D.cpp
+++ b/GUI/coregui/Views/RealSpaceWidgets/TransformTo3D.cpp
@@ -14,8 +14,8 @@
 
 #include "GUI/coregui/Views/RealSpaceWidgets/TransformTo3D.h"
 #include "Core/Basics/Units.h"
+#include "Core/HardParticle/HardParticles.h"
 #include "Core/Particle/ParticleComposition.h"
-#include "Core/includeIncludes/HardParticles.h"
 #include "GUI/coregui/Models/FormFactorItems.h"
 #include "GUI/coregui/Models/GUIDomainSampleVisitor.h"
 #include "GUI/coregui/Models/LayerItem.h"
diff --git a/GUI/coregui/Views/SampleDesigner/DesignerMimeData.cpp b/GUI/coregui/Views/SampleDesigner/DesignerMimeData.cpp
index 279302d0deaa72c8f765a48e0f7d2fb796782de3..5ca043437596f55b46c24a6cd66fe214ca55badd 100644
--- a/GUI/coregui/Views/SampleDesigner/DesignerMimeData.cpp
+++ b/GUI/coregui/Views/SampleDesigner/DesignerMimeData.cpp
@@ -91,7 +91,7 @@ void DesignerMimeData::read_widget(QXmlStreamReader& reader)
 Qt::DropAction DesignerMimeData::execDrag(const QString& name, const QString& xmldescr,
                                           QWidget* dragSource)
 {
-    if (!xmldescr.size())
+    if (xmldescr.size() == 0)
         return Qt::IgnoreAction;
 
     QDrag* drag = new QDrag(dragSource);
diff --git a/GUI/coregui/Views/SampleDesigner/ILayerView.cpp b/GUI/coregui/Views/SampleDesigner/ILayerView.cpp
index c1f2da5f1c1712dc882b8dde2ad2780f762e08b3..55094908a307ac79c611d1805e161a834a895f3a 100644
--- a/GUI/coregui/Views/SampleDesigner/ILayerView.cpp
+++ b/GUI/coregui/Views/SampleDesigner/ILayerView.cpp
@@ -246,7 +246,7 @@ MultiLayerCandidate ILayerView::getMultiLayerCandidate()
         }
     }
     // sorting MultiLayerView candidates to find one whose drop area is closer
-    if (candidates.size()) {
+    if (!candidates.empty()) {
         std::sort(candidates.begin(), candidates.end());
         return candidates.back();
     }
diff --git a/GUI/coregui/Views/SampleDesigner/ItemTreeView.cpp b/GUI/coregui/Views/SampleDesigner/ItemTreeView.cpp
index 76ab8314d37b1bf6d5402c018e0101ad42b75d32..ef8fcd7b457b353a55cd150771e4959572456d86 100644
--- a/GUI/coregui/Views/SampleDesigner/ItemTreeView.cpp
+++ b/GUI/coregui/Views/SampleDesigner/ItemTreeView.cpp
@@ -28,7 +28,7 @@ ItemTreeView::ItemTreeView(QWidget* parent) : QTreeView(parent)
     setDragDropMode(QAbstractItemView::InternalMove);
 }
 
-ItemTreeView::~ItemTreeView() {}
+ItemTreeView::~ItemTreeView() = default;
 
 void ItemTreeView::dragMoveEvent(QDragMoveEvent* event)
 {
diff --git a/GUI/coregui/Views/SampleDesigner/MultiLayerView.cpp b/GUI/coregui/Views/SampleDesigner/MultiLayerView.cpp
index b3cc843b84da2b23919c3778a3a6f511bd920b51..3445d7e3935cd2c9e9d23cd1c5b70f62cd3b9857 100644
--- a/GUI/coregui/Views/SampleDesigner/MultiLayerView.cpp
+++ b/GUI/coregui/Views/SampleDesigner/MultiLayerView.cpp
@@ -37,7 +37,7 @@ MultiLayerView::MultiLayerView(QGraphicsItem* parent) : ILayerView(parent)
 QRectF MultiLayerView::boundingRect() const
 {
     QRectF result = m_rect;
-    if (m_layers.size()) {
+    if (!m_layers.empty()) {
         qreal toplayer_height = m_layers.front()->boundingRect().height();
         qreal bottomlayer_height = m_layers.back()->boundingRect().height();
         result.setTop(-toplayer_height / 2.);
@@ -118,7 +118,7 @@ void MultiLayerView::updateHeight()
     m_interfaces.clear();
 
     int total_height = 0;
-    if (m_layers.size()) {
+    if (!m_layers.empty()) {
         for (ILayerView* layer : m_layers) {
             layer->setY(total_height);
             layer->update();
diff --git a/GUI/coregui/Views/SampleDesigner/NodeEditorPort.cpp b/GUI/coregui/Views/SampleDesigner/NodeEditorPort.cpp
index 8134b849aa339c524593805a7063c730ced548a5..6c13f9572e04b7a2081e009e45ecb354b5b4e9ce 100644
--- a/GUI/coregui/Views/SampleDesigner/NodeEditorPort.cpp
+++ b/GUI/coregui/Views/SampleDesigner/NodeEditorPort.cpp
@@ -55,7 +55,7 @@ NodeEditorPort::~NodeEditorPort()
 
 bool NodeEditorPort::isOutput()
 {
-    return (m_direction == OUTPUT ? true : false);
+    return (m_direction == OUTPUT);
 }
 
 bool NodeEditorPort::isInput()
diff --git a/GUI/coregui/Views/SampleDesigner/SampleDesigner.cpp b/GUI/coregui/Views/SampleDesigner/SampleDesigner.cpp
index 02b85a8c02d40db829a1c5937f8ef1f2284f267e..b6e2744a0842fd1e12fe39063f6b030b53175396 100644
--- a/GUI/coregui/Views/SampleDesigner/SampleDesigner.cpp
+++ b/GUI/coregui/Views/SampleDesigner/SampleDesigner.cpp
@@ -27,7 +27,7 @@ SampleDesigner::SampleDesigner(QWidget* parent)
     m_designerView = new DesignerView(m_designerScene, parent);
 }
 
-SampleDesigner::~SampleDesigner() {}
+SampleDesigner::~SampleDesigner() = default;
 
 void SampleDesigner::setModels(ApplicationModels* models)
 {
diff --git a/GUI/coregui/Views/SampleDesigner/SamplePropertyWidget.cpp b/GUI/coregui/Views/SampleDesigner/SamplePropertyWidget.cpp
index 808e423f2cd1371f3d1a2f8b9f8a18f92272047b..0af33132b727130525b86230798ed8c1d0880501 100644
--- a/GUI/coregui/Views/SampleDesigner/SamplePropertyWidget.cpp
+++ b/GUI/coregui/Views/SampleDesigner/SamplePropertyWidget.cpp
@@ -72,7 +72,7 @@ void SamplePropertyWidget::selectionChanged(const QItemSelection& selected, cons
 {
     QModelIndexList indices = selected.indexes();
 
-    if (indices.size()) {
+    if (!indices.empty()) {
         QModelIndex index = indices.back();
 
         if (auto proxy = dynamic_cast<QSortFilterProxyModel*>(
diff --git a/GUI/coregui/Views/widgetbox/widgetbox.cpp b/GUI/coregui/Views/widgetbox/widgetbox.cpp
index 68aa0e58ce9e4c850ca170c47b5fe8bb9187e2ec..bf5794e113948663c7cfa9ac3ec8a75c706f95cf 100644
--- a/GUI/coregui/Views/widgetbox/widgetbox.cpp
+++ b/GUI/coregui/Views/widgetbox/widgetbox.cpp
@@ -157,7 +157,7 @@ WidgetBox::WidgetBox(SampleDesignerInterface* core, QWidget* parent, Qt::WindowF
     //    setAcceptDrops (true);
 }
 
-WidgetBox::~WidgetBox() {}
+WidgetBox::~WidgetBox() = default;
 
 // QDesignerFormEditorInterface *WidgetBox::core() const
 //{
diff --git a/GUI/coregui/mainwindow/SaveService.cpp b/GUI/coregui/mainwindow/SaveService.cpp
index 5b7b63f916042a02d5f30acb5aec3d5c02fe46d1..d9274daa179937a09155526e6297593ba65d7a54 100644
--- a/GUI/coregui/mainwindow/SaveService.cpp
+++ b/GUI/coregui/mainwindow/SaveService.cpp
@@ -63,7 +63,7 @@ void SaveService::setAutosaveEnabled(bool value)
 
 bool SaveService::isAutosaveEnabled() const
 {
-    return m_autosave ? true : false;
+    return m_autosave;
 }
 
 void SaveService::setAutosaveTime(int timerInterval)
diff --git a/GUI/coregui/utils/ImportDataInfo.cpp b/GUI/coregui/utils/ImportDataInfo.cpp
index afa8c63f124b7ed07689150aa53b234c5dd45d02..ba22e3d0ad81ab8f8ab7f06383ef1b2a8db1bbb2 100644
--- a/GUI/coregui/utils/ImportDataInfo.cpp
+++ b/GUI/coregui/utils/ImportDataInfo.cpp
@@ -21,9 +21,9 @@
 
 namespace
 {
-std::vector<AxesUnits> specularUnits()
+std::vector<Axes::Units> specularUnits()
 {
-    std::vector<AxesUnits> result;
+    std::vector<Axes::Units> result;
     const auto units_map = AxisNames::InitSpecAxis();
     for (auto& pair : units_map)
         result.push_back(pair.first);
@@ -31,20 +31,21 @@ std::vector<AxesUnits> specularUnits()
 }
 
 // map: data rank --> available units
-std::map<size_t, std::vector<AxesUnits>> available_units = {{1u, specularUnits()},
-                                                            {2u, {AxesUnits::NBINS}}};
+std::map<size_t, std::vector<Axes::Units>> available_units = {{1u, specularUnits()},
+                                                              {2u, {Axes::Units::NBINS}}};
 } // namespace
 
-ImportDataInfo::ImportDataInfo() {}
+ImportDataInfo::ImportDataInfo() = default;
 
 ImportDataInfo::ImportDataInfo(ImportDataInfo&& other)
     : m_data(std::move(other.m_data)), m_units(other.m_units)
 {
 }
 
-ImportDataInfo::ImportDataInfo(std::unique_ptr<OutputData<double>> data, AxesUnits units)
-    : m_data(units == AxesUnits::NBINS && data ? ImportDataUtils::CreateSimplifiedOutputData(*data)
-                                               : std::move(data)),
+ImportDataInfo::ImportDataInfo(std::unique_ptr<OutputData<double>> data, Axes::Units units)
+    : m_data(units == Axes::Units::NBINS && data
+                 ? ImportDataUtils::CreateSimplifiedOutputData(*data)
+                 : std::move(data)),
       m_units(units)
 {
     checkValidity();
diff --git a/GUI/coregui/utils/ImportDataInfo.h b/GUI/coregui/utils/ImportDataInfo.h
index 9718f34f24cbe1e4600607740edd6ab2607013db..2925df549972765c8c11696bb4358b084799dca2 100644
--- a/GUI/coregui/utils/ImportDataInfo.h
+++ b/GUI/coregui/utils/ImportDataInfo.h
@@ -28,7 +28,7 @@ class ImportDataInfo
 public:
     ImportDataInfo();
     ImportDataInfo(ImportDataInfo&& other);
-    ImportDataInfo(std::unique_ptr<OutputData<double>> data, AxesUnits units);
+    ImportDataInfo(std::unique_ptr<OutputData<double>> data, Axes::Units units);
     ImportDataInfo(std::unique_ptr<OutputData<double>> data, const QString& units);
     ~ImportDataInfo();
 
@@ -43,7 +43,7 @@ public:
 private:
     void checkValidity();
     std::unique_ptr<OutputData<double>> m_data;
-    AxesUnits m_units;
+    Axes::Units m_units;
 };
 
 #endif // BORNAGAIN_GUI_COREGUI_UTILS_IMPORTDATAINFO_H
diff --git a/GUI/main/MessageHandler.cpp b/GUI/main/MessageHandler.cpp
index b2086165c99486bd7a5f63a12865e5c6c7e27913..99a18d5309639a02002527a2ec41d7114dbdf0ab 100644
--- a/GUI/main/MessageHandler.cpp
+++ b/GUI/main/MessageHandler.cpp
@@ -21,7 +21,7 @@ void MessageHandler(QtMsgType type, const QMessageLogContext&, const QString& ms
 {
     switch (type) {
     case QtDebugMsg:
-        if (!msg.size()) // KDE will pass a zero-length msg qstring
+        if (msg.size() == 0) // KDE will pass a zero-length msg qstring
             break;
         std::cerr << "DEBUG: " << msg.toStdString() << std::endl;
         break;
diff --git a/GUI/main/appoptions.cpp b/GUI/main/appoptions.cpp
index 7cb7c7b18dd03a4d0eecd3d2eaad607ad8186a92..b4310b20b8934b728d35be636ab3618f3c5e6f2b 100644
--- a/GUI/main/appoptions.cpp
+++ b/GUI/main/appoptions.cpp
@@ -70,7 +70,7 @@ const bpo::variable_value& ApplicationOptions::operator[](const std::string& s)
 
 bool ApplicationOptions::find(std::string name) const
 {
-    return (m_variables_map.count(name.c_str()) ? true : false);
+    return (m_variables_map.count(name.c_str()));
 }
 
 bool ApplicationOptions::isConsistent() const
diff --git a/GUI/main/main.cpp b/GUI/main/main.cpp
index a1fa6610b1c49188fc6f4cce3bbcb9f3daf98fb1..8272b1aa8c814126f3afc0cb628c2fe814c52c0b 100644
--- a/GUI/main/main.cpp
+++ b/GUI/main/main.cpp
@@ -54,5 +54,5 @@ int main(int argc, char* argv[])
     if (splash)
         splash->finish(&win);
 
-    return app.exec();
+    return QApplication::exec();
 }
diff --git a/Tests/Functional/Core/CoreSpecial/BatchSimulation.cpp b/Tests/Functional/Core/CoreSpecial/BatchSimulation.cpp
index f2154dad3b309c63c44c40515075aca962a48b8f..2a992a0b460ee80b12ace996bd7b9123367624e0 100644
--- a/Tests/Functional/Core/CoreSpecial/BatchSimulation.cpp
+++ b/Tests/Functional/Core/CoreSpecial/BatchSimulation.cpp
@@ -50,7 +50,7 @@ TEST_F(BatchSimulation, BatchSimulation)
         batch->runSimulation();
         auto batch_result = batch->result();
         std::unique_ptr<OutputData<double>> batchResult(batch_result.data());
-        *result += *batchResult.get();
+        *result += *batchResult;
     }
 
     double diff = IntensityDataFunctions::getRelativeDifference(*result, *reference);
diff --git a/Tests/Functional/GUI/Other/SaveLoadProject.cpp b/Tests/Functional/GUI/Other/SaveLoadProject.cpp
index f785d40b6a738924899ac9068a2436d230dc538b..d03b7a86e91c1182fee025b6604a06d7592c5589 100644
--- a/Tests/Functional/GUI/Other/SaveLoadProject.cpp
+++ b/Tests/Functional/GUI/Other/SaveLoadProject.cpp
@@ -75,7 +75,7 @@ bool GUISaveLoadProject::runTest()
     // analyze difference
     nerr += check_difference(projectName1, projectName2);
 
-    return nerr == 0 ? true : false;
+    return nerr == 0;
 }
 
 int GUISaveLoadProject::run_job()
diff --git a/Tests/Functional/GUI/Translate/GUITranslationTest.cpp b/Tests/Functional/GUI/Translate/GUITranslationTest.cpp
index 6af5b06f4427c8ce4e2d45c83e9dc7e69bec8b95..dd1da306d8bbdb76e4575723d9ddab33297d1fc6 100644
--- a/Tests/Functional/GUI/Translate/GUITranslationTest.cpp
+++ b/Tests/Functional/GUI/Translate/GUITranslationTest.cpp
@@ -120,7 +120,7 @@ GUITranslationTest::GUITranslationTest(const std::string& simName, const std::st
     m_simulation->setSample(*sampleFactory.createSampleByName(m_sampleName));
 }
 
-GUITranslationTest::~GUITranslationTest() {}
+GUITranslationTest::~GUITranslationTest() = default;
 
 bool GUITranslationTest::runTest()
 {
@@ -258,7 +258,7 @@ bool GUITranslationTest::checkExistingTranslations()
     }
     std::cout << ostr.str();
 
-    bool isSuccess = (wrong_translations.empty() ? true : false);
+    bool isSuccess = (wrong_translations.empty());
     return isSuccess;
 }
 
@@ -288,7 +288,7 @@ bool GUITranslationTest::checkMissedTranslations()
         }
     }
 
-    if (missedNames.size()) {
+    if (!missedNames.empty()) {
         std::cout << header() << std::endl;
         std::cout << "Translation doesn't exist:" << std::endl;
         std::cout << header() << std::endl;
@@ -296,6 +296,6 @@ bool GUITranslationTest::checkMissedTranslations()
             std::cout << "domain : " << name << std::endl;
     }
 
-    bool isSuccess = (missedNames.empty() ? true : false);
+    bool isSuccess = (missedNames.empty());
     return isSuccess;
 }
diff --git a/Tests/Performance/Core/CoreIO.cpp b/Tests/Performance/Core/CoreIO.cpp
index 1971c84bc833563d612f875faac36556635c0a8f..52eabeb56d0a4c9464505faed87275c4732f025a 100644
--- a/Tests/Performance/Core/CoreIO.cpp
+++ b/Tests/Performance/Core/CoreIO.cpp
@@ -118,7 +118,7 @@ bool test_io(int nx, int ny, bool random_data, const std::string& ext)
 
     results.push_back(result);
 
-    bool success = result.m_biggest_diff < 1e-10 ? true : false;
+    bool success = result.m_biggest_diff < 1e-10;
     return success;
 }
 
diff --git a/Tests/Performance/Core/Mesocrystal.cpp b/Tests/Performance/Core/Mesocrystal.cpp
index babad9965f3776a7c82cf153cb2c954e9c9daf97..1d40be16472d0585aec431e33379ed9cb64b5d59 100644
--- a/Tests/Performance/Core/Mesocrystal.cpp
+++ b/Tests/Performance/Core/Mesocrystal.cpp
@@ -75,7 +75,7 @@ public:
     ~MesoCrystalPerformanceBuilder();
 
 protected:
-    MultiLayer* buildSample() const;
+    MultiLayer* buildSample() const override;
 
 private:
     std::unique_ptr<MesoCrystal> createMeso(Material material,
@@ -146,7 +146,7 @@ MultiLayer* MesoCrystalPerformanceBuilder::buildSample() const
             RotationX rotX(tilt);
             mesocrystal->setRotation(rotZ);
             mesocrystal->rotate(rotX);
-            particle_decoration.addParticle(*mesocrystal.get(), 1.0,
+            particle_decoration.addParticle(*mesocrystal, 1.0,
                                             kvector_t(0, 0, -m_meso_height));
         }
     }
@@ -198,7 +198,7 @@ int main()
 
     auto detector = create_detector();
 
-    simulation.setDetector(*detector.get());
+    simulation.setDetector(*detector);
 
     simulation.setBeamParameters(1.77 * Units::angstrom, 0.4 * Units::deg, 0.0);
     simulation.setBeamIntensity(6.1e+12);
diff --git a/Tests/Performance/GUI/CsvImportAssistantPerformanceTest.cpp b/Tests/Performance/GUI/CsvImportAssistantPerformanceTest.cpp
index 8123d3b8847143fb8f7b58e7cf5590d7cf75d523..20cfac7d95f624d2d4c0848ab474dba53926b1d3 100644
--- a/Tests/Performance/GUI/CsvImportAssistantPerformanceTest.cpp
+++ b/Tests/Performance/GUI/CsvImportAssistantPerformanceTest.cpp
@@ -67,7 +67,7 @@ bool CsvImportAssistantPerformanceTest::runTest()
             // Reading and setting data to import:
             CsvImportAssistant assistant(testFilename());
             assistant.setIntensityColumn(1);
-            assistant.setCoordinateColumn(9, AxesUnits::DEGREES);
+            assistant.setCoordinateColumn(9, Axes::Units::DEGREES);
             assistant.setFirstRow(1);
             assistant.setLastRow(int(nRows));
 
diff --git a/Tests/Performance/GUI/GUIPerformanceTest.cpp b/Tests/Performance/GUI/GUIPerformanceTest.cpp
index fe132bf0a1b24deb4abafecd4d484a16237e8b43..458cc568cb075a9fa5b19026107ac1d3c00bac69 100644
--- a/Tests/Performance/GUI/GUIPerformanceTest.cpp
+++ b/Tests/Performance/GUI/GUIPerformanceTest.cpp
@@ -61,9 +61,12 @@ bool GUIPerformanceTest::runTest()
     std::cout << "GUIPerformanceTest -> Running ..." << mult << std::endl;
     Benchmark bench;
 
-    bench.test_method("domain2gui", [this]() { test_domain_to_gui(); }, 300 * mult);
-    bench.test_method("gui2domain", [this]() { test_gui_to_domain(); }, 100 * mult);
-    bench.test_method("realTime", [this]() { test_real_time(); }, 2 * mult);
+    bench.test_method(
+        "domain2gui", [this]() { test_domain_to_gui(); }, 300 * mult);
+    bench.test_method(
+        "gui2domain", [this]() { test_gui_to_domain(); }, 100 * mult);
+    bench.test_method(
+        "realTime", [this]() { test_real_time(); }, 2 * mult);
 
     std::cout << bench.report() << std::endl;
     return true;
diff --git a/Tests/UnitTests/Core/Axes/DepthProbeConverterTest.cpp b/Tests/UnitTests/Core/Axes/DepthProbeConverterTest.cpp
index a16eafeea67d898cc9ec2c5b2369b35987856930..0b44d96c59bd4c04cba32bce106a1a910853d530 100644
--- a/Tests/UnitTests/Core/Axes/DepthProbeConverterTest.cpp
+++ b/Tests/UnitTests/Core/Axes/DepthProbeConverterTest.cpp
@@ -11,8 +11,8 @@ protected:
     DepthProbeConverterTest();
 
     void checkMainFunctionality(const DepthProbeConverter& test_object);
-    void checkAlphaAxis(AxesUnits units, const DepthProbeConverter& test_object);
-    void checkZAxis(AxesUnits units, const DepthProbeConverter& test_object);
+    void checkAlphaAxis(Axes::Units units, const DepthProbeConverter& test_object);
+    void checkZAxis(Axes::Units units, const DepthProbeConverter& test_object);
     const double m_alpha_start = 0.5; // first axis value in rads
     const double m_alpha_end = 1.0;   // last axis value in rads
     const double m_z_start = -30.0;
@@ -36,38 +36,39 @@ void DepthProbeConverterTest::checkMainFunctionality(const DepthProbeConverter&
 {
     EXPECT_EQ(test_object.dimension(), 2u);
 
-    EXPECT_NEAR(test_object.calculateMin(0, AxesUnits::DEFAULT), 2.8647889757e+1,
+    EXPECT_NEAR(test_object.calculateMin(0, Axes::Units::DEFAULT), 2.8647889757e+1,
                 2.8647889757e+1 * 1e-10);
-    EXPECT_NEAR(test_object.calculateMin(0, AxesUnits::DEGREES), 2.8647889757e+1,
+    EXPECT_NEAR(test_object.calculateMin(0, Axes::Units::DEGREES), 2.8647889757e+1,
                 2.8647889757e+1 * 1e-10);
-    EXPECT_NEAR(test_object.calculateMin(0, AxesUnits::QSPACE), 6.0246390001, 6.0246390001 * 1e-10);
-    EXPECT_EQ(test_object.calculateMin(0, AxesUnits::RADIANS), m_alpha_start);
-    EXPECT_EQ(test_object.calculateMin(0, AxesUnits::NBINS), 0.0);
+    EXPECT_NEAR(test_object.calculateMin(0, Axes::Units::QSPACE), 6.0246390001,
+                6.0246390001 * 1e-10);
+    EXPECT_EQ(test_object.calculateMin(0, Axes::Units::RADIANS), m_alpha_start);
+    EXPECT_EQ(test_object.calculateMin(0, Axes::Units::NBINS), 0.0);
 
-    EXPECT_NEAR(test_object.calculateMax(0, AxesUnits::DEFAULT), 5.7295779513e+1,
+    EXPECT_NEAR(test_object.calculateMax(0, Axes::Units::DEFAULT), 5.7295779513e+1,
                 5.7295779513e+1 * 1e-10);
-    EXPECT_NEAR(test_object.calculateMax(0, AxesUnits::DEGREES), 5.7295779513e+1,
+    EXPECT_NEAR(test_object.calculateMax(0, Axes::Units::DEGREES), 5.7295779513e+1,
                 5.7295779513e+1 * 1e-10);
-    EXPECT_NEAR(test_object.calculateMax(0, AxesUnits::QSPACE), 1.0574236256e+1,
+    EXPECT_NEAR(test_object.calculateMax(0, Axes::Units::QSPACE), 1.0574236256e+1,
                 1.0574236256e+1 * 1e-10);
-    EXPECT_EQ(test_object.calculateMax(0, AxesUnits::RADIANS), m_alpha_end);
+    EXPECT_EQ(test_object.calculateMax(0, Axes::Units::RADIANS), m_alpha_end);
     const double n_bins = static_cast<double>(m_nbins);
-    EXPECT_NEAR(test_object.calculateMax(0, AxesUnits::NBINS), n_bins, n_bins * 1e-10);
-
-    checkAlphaAxis(AxesUnits::DEFAULT, test_object);
-    checkAlphaAxis(AxesUnits::DEGREES, test_object);
-    checkAlphaAxis(AxesUnits::RADIANS, test_object);
-    checkAlphaAxis(AxesUnits::QSPACE, test_object);
-    checkAlphaAxis(AxesUnits::NBINS, test_object);
-
-    checkZAxis(AxesUnits::DEFAULT, test_object);
-    checkZAxis(AxesUnits::DEGREES, test_object);
-    checkZAxis(AxesUnits::RADIANS, test_object);
-    checkZAxis(AxesUnits::QSPACE, test_object);
-    checkZAxis(AxesUnits::NBINS, test_object);
+    EXPECT_NEAR(test_object.calculateMax(0, Axes::Units::NBINS), n_bins, n_bins * 1e-10);
+
+    checkAlphaAxis(Axes::Units::DEFAULT, test_object);
+    checkAlphaAxis(Axes::Units::DEGREES, test_object);
+    checkAlphaAxis(Axes::Units::RADIANS, test_object);
+    checkAlphaAxis(Axes::Units::QSPACE, test_object);
+    checkAlphaAxis(Axes::Units::NBINS, test_object);
+
+    checkZAxis(Axes::Units::DEFAULT, test_object);
+    checkZAxis(Axes::Units::DEGREES, test_object);
+    checkZAxis(Axes::Units::RADIANS, test_object);
+    checkZAxis(Axes::Units::QSPACE, test_object);
+    checkZAxis(Axes::Units::NBINS, test_object);
 }
 
-void DepthProbeConverterTest::checkAlphaAxis(AxesUnits units,
+void DepthProbeConverterTest::checkAlphaAxis(Axes::Units units,
                                              const DepthProbeConverter& test_object)
 {
     auto axis = test_object.createConvertedAxis(0, units);
@@ -78,7 +79,7 @@ void DepthProbeConverterTest::checkAlphaAxis(AxesUnits units,
     EXPECT_EQ(axis->getMax(), test_object.calculateMax(0, units));
 }
 
-void DepthProbeConverterTest::checkZAxis(AxesUnits units, const DepthProbeConverter& test_object)
+void DepthProbeConverterTest::checkZAxis(Axes::Units units, const DepthProbeConverter& test_object)
 {
     auto axis = test_object.createConvertedAxis(1, units);
     EXPECT_TRUE(dynamic_cast<FixedBinAxis*>(axis.get()));
@@ -86,11 +87,11 @@ void DepthProbeConverterTest::checkZAxis(AxesUnits units, const DepthProbeConver
     EXPECT_EQ(axis->size(), m_nbins);
 
     EXPECT_EQ(axis->getMin(), test_object.calculateMin(1, units));
-    const double test_min = units == AxesUnits::NBINS ? 0 : m_z_start;
+    const double test_min = units == Axes::Units::NBINS ? 0 : m_z_start;
     EXPECT_NEAR(axis->getMin(), test_min, std::abs(test_min) * 1e-10);
 
     EXPECT_EQ(axis->getMax(), test_object.calculateMax(1, units));
-    const double test_max = units == AxesUnits::NBINS ? m_nbins : m_z_end;
+    const double test_max = units == Axes::Units::NBINS ? m_nbins : m_z_end;
     EXPECT_NEAR(axis->getMax(), test_max, std::abs(test_max) * 1e-10);
 }
 
@@ -104,21 +105,21 @@ TEST_F(DepthProbeConverterTest, DepthProbeConverterExceptions)
 {
     DepthProbeConverter converter(m_beam, m_inclination_axis, m_z_axis);
 
-    EXPECT_THROW(converter.axisName(0, AxesUnits::MM), std::runtime_error);
-    EXPECT_THROW(converter.axisName(1, AxesUnits::MM), std::runtime_error);
-    EXPECT_THROW(converter.axisName(2, AxesUnits::DEFAULT), std::runtime_error);
+    EXPECT_THROW(converter.axisName(0, Axes::Units::MM), std::runtime_error);
+    EXPECT_THROW(converter.axisName(1, Axes::Units::MM), std::runtime_error);
+    EXPECT_THROW(converter.axisName(2, Axes::Units::DEFAULT), std::runtime_error);
 
-    EXPECT_THROW(converter.calculateMin(0, AxesUnits::MM), std::runtime_error);
-    EXPECT_THROW(converter.calculateMin(1, AxesUnits::MM), std::runtime_error);
-    EXPECT_THROW(converter.calculateMin(2, AxesUnits::DEFAULT), std::runtime_error);
+    EXPECT_THROW(converter.calculateMin(0, Axes::Units::MM), std::runtime_error);
+    EXPECT_THROW(converter.calculateMin(1, Axes::Units::MM), std::runtime_error);
+    EXPECT_THROW(converter.calculateMin(2, Axes::Units::DEFAULT), std::runtime_error);
 
-    EXPECT_THROW(converter.calculateMax(0, AxesUnits::MM), std::runtime_error);
-    EXPECT_THROW(converter.calculateMax(1, AxesUnits::MM), std::runtime_error);
-    EXPECT_THROW(converter.calculateMax(2, AxesUnits::RADIANS), std::runtime_error);
+    EXPECT_THROW(converter.calculateMax(0, Axes::Units::MM), std::runtime_error);
+    EXPECT_THROW(converter.calculateMax(1, Axes::Units::MM), std::runtime_error);
+    EXPECT_THROW(converter.calculateMax(2, Axes::Units::RADIANS), std::runtime_error);
 
-    EXPECT_THROW(converter.createConvertedAxis(0, AxesUnits::MM), std::runtime_error);
-    EXPECT_THROW(converter.createConvertedAxis(1, AxesUnits::MM), std::runtime_error);
-    EXPECT_THROW(converter.createConvertedAxis(2, AxesUnits::DEFAULT), std::runtime_error);
+    EXPECT_THROW(converter.createConvertedAxis(0, Axes::Units::MM), std::runtime_error);
+    EXPECT_THROW(converter.createConvertedAxis(1, Axes::Units::MM), std::runtime_error);
+    EXPECT_THROW(converter.createConvertedAxis(2, Axes::Units::DEFAULT), std::runtime_error);
 }
 
 TEST_F(DepthProbeConverterTest, DepthProbeConverterClone)
diff --git a/Tests/UnitTests/Core/Axes/UnitConverter1DTest.cpp b/Tests/UnitTests/Core/Axes/UnitConverter1DTest.cpp
index fc5084e9f132e76087b13caa0524915530f60848..7bb3af973ff1fa50b5e26df90e9e0438a2484aaf 100644
--- a/Tests/UnitTests/Core/Axes/UnitConverter1DTest.cpp
+++ b/Tests/UnitTests/Core/Axes/UnitConverter1DTest.cpp
@@ -37,59 +37,59 @@ UnitConverter1DTest::UnitConverter1DTest()
 void UnitConverter1DTest::checkConventionalConverter(const UnitConverter1D& test_object)
 {
     double expected_min = m_axis.getBinCenter(0);
-    EXPECT_NEAR(test_object.calculateMin(0, AxesUnits::DEFAULT), Units::rad2deg(expected_min),
+    EXPECT_NEAR(test_object.calculateMin(0, Axes::Units::DEFAULT), Units::rad2deg(expected_min),
                 Units::rad2deg(expected_min) * 1e-10);
-    EXPECT_NEAR(test_object.calculateMin(0, AxesUnits::NBINS), 0.0, 1e-10);
-    EXPECT_NEAR(test_object.calculateMin(0, AxesUnits::RADIANS), expected_min,
+    EXPECT_NEAR(test_object.calculateMin(0, Axes::Units::NBINS), 0.0, 1e-10);
+    EXPECT_NEAR(test_object.calculateMin(0, Axes::Units::RADIANS), expected_min,
                 expected_min * 1e-10);
-    EXPECT_NEAR(test_object.calculateMin(0, AxesUnits::DEGREES), Units::rad2deg(expected_min),
+    EXPECT_NEAR(test_object.calculateMin(0, Axes::Units::DEGREES), Units::rad2deg(expected_min),
                 Units::rad2deg(expected_min) * 1e-10);
-    EXPECT_NEAR(test_object.calculateMin(0, AxesUnits::QSPACE), getQ(expected_min),
+    EXPECT_NEAR(test_object.calculateMin(0, Axes::Units::QSPACE), getQ(expected_min),
                 getQ(expected_min) * 1e-10);
-    EXPECT_NEAR(test_object.calculateMin(0, AxesUnits::RQ4), getQ(expected_min),
+    EXPECT_NEAR(test_object.calculateMin(0, Axes::Units::RQ4), getQ(expected_min),
                 getQ(expected_min) * 1e-10);
 
     double expected_max = m_axis.getBinCenters().back();
-    EXPECT_NEAR(test_object.calculateMax(0, AxesUnits::DEFAULT), Units::rad2deg(expected_max),
+    EXPECT_NEAR(test_object.calculateMax(0, Axes::Units::DEFAULT), Units::rad2deg(expected_max),
                 Units::rad2deg(expected_max) * 1e-10);
-    EXPECT_NEAR(test_object.calculateMax(0, AxesUnits::NBINS), static_cast<double>(m_axis.size()),
+    EXPECT_NEAR(test_object.calculateMax(0, Axes::Units::NBINS), static_cast<double>(m_axis.size()),
                 1e-10);
-    EXPECT_NEAR(test_object.calculateMax(0, AxesUnits::RADIANS), expected_max,
+    EXPECT_NEAR(test_object.calculateMax(0, Axes::Units::RADIANS), expected_max,
                 expected_max * 1e-10);
-    EXPECT_NEAR(test_object.calculateMax(0, AxesUnits::DEGREES), Units::rad2deg(expected_max),
+    EXPECT_NEAR(test_object.calculateMax(0, Axes::Units::DEGREES), Units::rad2deg(expected_max),
                 Units::rad2deg(expected_max) * 1e-10);
-    EXPECT_NEAR(test_object.calculateMax(0, AxesUnits::QSPACE), getQ(expected_max),
+    EXPECT_NEAR(test_object.calculateMax(0, Axes::Units::QSPACE), getQ(expected_max),
                 getQ(expected_max) * 1e-10);
-    EXPECT_NEAR(test_object.calculateMax(0, AxesUnits::RQ4), getQ(expected_max),
+    EXPECT_NEAR(test_object.calculateMax(0, Axes::Units::RQ4), getQ(expected_max),
                 getQ(expected_max) * 1e-10);
 
     // DEFAULT
-    auto axis_default = test_object.createConvertedAxis(0, AxesUnits::DEFAULT);
+    auto axis_default = test_object.createConvertedAxis(0, Axes::Units::DEFAULT);
     EXPECT_TRUE(dynamic_cast<PointwiseAxis*>(axis_default.get()));
     EXPECT_EQ(axis_default->size(), test_object.axisSize(0));
-    EXPECT_EQ(axis_default->getMin(), test_object.calculateMin(0, AxesUnits::DEFAULT));
-    EXPECT_EQ(axis_default->getMax(), test_object.calculateMax(0, AxesUnits::DEFAULT));
+    EXPECT_EQ(axis_default->getMin(), test_object.calculateMin(0, Axes::Units::DEFAULT));
+    EXPECT_EQ(axis_default->getMax(), test_object.calculateMax(0, Axes::Units::DEFAULT));
 
     // QSPACE
-    auto axis_qspace = test_object.createConvertedAxis(0, AxesUnits::QSPACE);
+    auto axis_qspace = test_object.createConvertedAxis(0, Axes::Units::QSPACE);
     EXPECT_TRUE(dynamic_cast<PointwiseAxis*>(axis_qspace.get()));
     EXPECT_EQ(axis_qspace->size(), test_object.axisSize(0));
-    EXPECT_EQ(axis_qspace->getMin(), test_object.calculateMin(0, AxesUnits::QSPACE));
-    EXPECT_EQ(axis_qspace->getMax(), test_object.calculateMax(0, AxesUnits::QSPACE));
+    EXPECT_EQ(axis_qspace->getMin(), test_object.calculateMin(0, Axes::Units::QSPACE));
+    EXPECT_EQ(axis_qspace->getMax(), test_object.calculateMax(0, Axes::Units::QSPACE));
 
     // NBINS
-    auto axis_nbins = test_object.createConvertedAxis(0, AxesUnits::NBINS);
+    auto axis_nbins = test_object.createConvertedAxis(0, Axes::Units::NBINS);
     EXPECT_TRUE(dynamic_cast<FixedBinAxis*>(axis_nbins.get()));
     EXPECT_EQ(axis_nbins->size(), test_object.axisSize(0));
-    EXPECT_EQ(axis_nbins->getMin(), test_object.calculateMin(0, AxesUnits::NBINS));
-    EXPECT_EQ(axis_nbins->getMax(), test_object.calculateMax(0, AxesUnits::NBINS));
+    EXPECT_EQ(axis_nbins->getMin(), test_object.calculateMin(0, Axes::Units::NBINS));
+    EXPECT_EQ(axis_nbins->getMax(), test_object.calculateMax(0, Axes::Units::NBINS));
 
     // RQ4
-    auto axis_rq4 = test_object.createConvertedAxis(0, AxesUnits::RQ4);
+    auto axis_rq4 = test_object.createConvertedAxis(0, Axes::Units::RQ4);
     EXPECT_TRUE(dynamic_cast<PointwiseAxis*>(axis_rq4.get()));
     EXPECT_EQ(axis_rq4->size(), test_object.axisSize(0));
-    EXPECT_EQ(axis_rq4->getMin(), test_object.calculateMin(0, AxesUnits::RQ4));
-    EXPECT_EQ(axis_rq4->getMax(), test_object.calculateMax(0, AxesUnits::RQ4));
+    EXPECT_EQ(axis_rq4->getMin(), test_object.calculateMin(0, Axes::Units::RQ4));
+    EXPECT_EQ(axis_rq4->getMax(), test_object.calculateMax(0, Axes::Units::RQ4));
     EXPECT_TRUE(*axis_rq4 == *axis_qspace);
 
     OutputData<double> fake_data;
@@ -98,13 +98,13 @@ void UnitConverter1DTest::checkConventionalConverter(const UnitConverter1D& test
     fake_data.setRawDataVector(raw_fake);
 
     // NBINS
-    auto data_nbins = test_object.createConvertedData(fake_data, AxesUnits::NBINS);
+    auto data_nbins = test_object.createConvertedData(fake_data, Axes::Units::NBINS);
     EXPECT_EQ(data_nbins->getAxis(0), *axis_nbins);
     EXPECT_EQ(data_nbins->getAllocatedSize(), axis_nbins->size());
     EXPECT_EQ(raw_fake, data_nbins->getRawDataVector());
 
     // RQ4
-    auto data_rq4 = test_object.createConvertedData(fake_data, AxesUnits::RQ4);
+    auto data_rq4 = test_object.createConvertedData(fake_data, Axes::Units::RQ4);
     EXPECT_EQ(data_rq4->getAxis(0), *axis_rq4);
     auto raw_data_rq4 = data_rq4->getRawDataVector();
     EXPECT_EQ(raw_data_rq4.size(), raw_fake.size());
@@ -118,46 +118,46 @@ void UnitConverter1DTest::checkConventionalConverter(const UnitConverter1D& test
 void UnitConverter1DTest::checkQSpecConverter(const UnitConverter1D& test_object)
 {
     double expected_min = m_q_axis.getBinCenter(0);
-    EXPECT_EQ(test_object.calculateMin(0, AxesUnits::DEFAULT), expected_min);
-    EXPECT_NEAR(test_object.calculateMin(0, AxesUnits::NBINS), 0.0, 1e-10);
-    EXPECT_EQ(test_object.calculateMin(0, AxesUnits::QSPACE), expected_min);
-    EXPECT_EQ(test_object.calculateMin(0, AxesUnits::RQ4), expected_min);
+    EXPECT_EQ(test_object.calculateMin(0, Axes::Units::DEFAULT), expected_min);
+    EXPECT_NEAR(test_object.calculateMin(0, Axes::Units::NBINS), 0.0, 1e-10);
+    EXPECT_EQ(test_object.calculateMin(0, Axes::Units::QSPACE), expected_min);
+    EXPECT_EQ(test_object.calculateMin(0, Axes::Units::RQ4), expected_min);
 
     double expected_max = m_q_axis.getBinCenters().back();
-    EXPECT_EQ(test_object.calculateMax(0, AxesUnits::DEFAULT), expected_max);
-    EXPECT_NEAR(test_object.calculateMax(0, AxesUnits::NBINS), static_cast<double>(m_q_axis.size()),
-                1e-10);
-    EXPECT_EQ(test_object.calculateMax(0, AxesUnits::QSPACE), expected_max);
-    EXPECT_EQ(test_object.calculateMax(0, AxesUnits::RQ4), expected_max);
+    EXPECT_EQ(test_object.calculateMax(0, Axes::Units::DEFAULT), expected_max);
+    EXPECT_NEAR(test_object.calculateMax(0, Axes::Units::NBINS),
+                static_cast<double>(m_q_axis.size()), 1e-10);
+    EXPECT_EQ(test_object.calculateMax(0, Axes::Units::QSPACE), expected_max);
+    EXPECT_EQ(test_object.calculateMax(0, Axes::Units::RQ4), expected_max);
 
     // DEFAULT
-    auto axis_default = test_object.createConvertedAxis(0, AxesUnits::DEFAULT);
+    auto axis_default = test_object.createConvertedAxis(0, Axes::Units::DEFAULT);
     EXPECT_TRUE(dynamic_cast<PointwiseAxis*>(axis_default.get()));
     EXPECT_EQ(axis_default->size(), test_object.axisSize(0));
-    EXPECT_EQ(axis_default->getMin(), test_object.calculateMin(0, AxesUnits::DEFAULT));
-    EXPECT_EQ(axis_default->getMax(), test_object.calculateMax(0, AxesUnits::DEFAULT));
+    EXPECT_EQ(axis_default->getMin(), test_object.calculateMin(0, Axes::Units::DEFAULT));
+    EXPECT_EQ(axis_default->getMax(), test_object.calculateMax(0, Axes::Units::DEFAULT));
 
     // QSPACE
-    auto axis_qspace = test_object.createConvertedAxis(0, AxesUnits::QSPACE);
+    auto axis_qspace = test_object.createConvertedAxis(0, Axes::Units::QSPACE);
     EXPECT_TRUE(dynamic_cast<PointwiseAxis*>(axis_qspace.get()));
     EXPECT_EQ(axis_qspace->size(), test_object.axisSize(0));
-    EXPECT_EQ(axis_qspace->getMin(), test_object.calculateMin(0, AxesUnits::QSPACE));
-    EXPECT_EQ(axis_qspace->getMax(), test_object.calculateMax(0, AxesUnits::QSPACE));
+    EXPECT_EQ(axis_qspace->getMin(), test_object.calculateMin(0, Axes::Units::QSPACE));
+    EXPECT_EQ(axis_qspace->getMax(), test_object.calculateMax(0, Axes::Units::QSPACE));
     EXPECT_EQ(*axis_default, *axis_qspace);
 
     // NBINS
-    auto axis_nbins = test_object.createConvertedAxis(0, AxesUnits::NBINS);
+    auto axis_nbins = test_object.createConvertedAxis(0, Axes::Units::NBINS);
     EXPECT_TRUE(dynamic_cast<FixedBinAxis*>(axis_nbins.get()));
     EXPECT_EQ(axis_nbins->size(), test_object.axisSize(0));
-    EXPECT_EQ(axis_nbins->getMin(), test_object.calculateMin(0, AxesUnits::NBINS));
-    EXPECT_EQ(axis_nbins->getMax(), test_object.calculateMax(0, AxesUnits::NBINS));
+    EXPECT_EQ(axis_nbins->getMin(), test_object.calculateMin(0, Axes::Units::NBINS));
+    EXPECT_EQ(axis_nbins->getMax(), test_object.calculateMax(0, Axes::Units::NBINS));
 
     // RQ4
-    auto axis_rq4 = test_object.createConvertedAxis(0, AxesUnits::RQ4);
+    auto axis_rq4 = test_object.createConvertedAxis(0, Axes::Units::RQ4);
     EXPECT_TRUE(dynamic_cast<PointwiseAxis*>(axis_rq4.get()));
     EXPECT_EQ(axis_rq4->size(), test_object.axisSize(0));
-    EXPECT_EQ(axis_rq4->getMin(), test_object.calculateMin(0, AxesUnits::RQ4));
-    EXPECT_EQ(axis_rq4->getMax(), test_object.calculateMax(0, AxesUnits::RQ4));
+    EXPECT_EQ(axis_rq4->getMin(), test_object.calculateMin(0, Axes::Units::RQ4));
+    EXPECT_EQ(axis_rq4->getMax(), test_object.calculateMax(0, Axes::Units::RQ4));
     EXPECT_TRUE(*axis_rq4 == *axis_qspace);
 
     OutputData<double> fake_data;
@@ -166,13 +166,13 @@ void UnitConverter1DTest::checkQSpecConverter(const UnitConverter1D& test_object
     fake_data.setRawDataVector(raw_fake);
 
     // NBINS
-    auto data_nbins = test_object.createConvertedData(fake_data, AxesUnits::NBINS);
+    auto data_nbins = test_object.createConvertedData(fake_data, Axes::Units::NBINS);
     EXPECT_EQ(data_nbins->getAxis(0), *axis_nbins);
     EXPECT_EQ(data_nbins->getAllocatedSize(), axis_nbins->size());
     EXPECT_EQ(raw_fake, data_nbins->getRawDataVector());
 
     // RQ4
-    auto data_rq4 = test_object.createConvertedData(fake_data, AxesUnits::RQ4);
+    auto data_rq4 = test_object.createConvertedData(fake_data, Axes::Units::RQ4);
     EXPECT_EQ(data_rq4->getAxis(0), *axis_rq4);
     auto raw_data_rq4 = data_rq4->getRawDataVector();
     EXPECT_EQ(raw_data_rq4.size(), raw_fake.size());
@@ -193,32 +193,32 @@ TEST_F(UnitConverter1DTest, Exceptions)
 {
     UnitConverterConvSpec converter(m_beam, m_axis);
 
-    EXPECT_THROW(converter.calculateMin(0, AxesUnits::MM), std::runtime_error);
-    EXPECT_THROW(converter.calculateMin(1, AxesUnits::RADIANS), std::runtime_error);
+    EXPECT_THROW(converter.calculateMin(0, Axes::Units::MM), std::runtime_error);
+    EXPECT_THROW(converter.calculateMin(1, Axes::Units::RADIANS), std::runtime_error);
 
-    EXPECT_THROW(converter.calculateMax(0, AxesUnits::MM), std::runtime_error);
-    EXPECT_THROW(converter.calculateMax(1, AxesUnits::RADIANS), std::runtime_error);
+    EXPECT_THROW(converter.calculateMax(0, Axes::Units::MM), std::runtime_error);
+    EXPECT_THROW(converter.calculateMax(1, Axes::Units::RADIANS), std::runtime_error);
 
-    EXPECT_THROW(converter.createConvertedAxis(0, AxesUnits::MM), std::runtime_error);
-    EXPECT_THROW(converter.createConvertedAxis(1, AxesUnits::DEFAULT), std::runtime_error);
+    EXPECT_THROW(converter.createConvertedAxis(0, Axes::Units::MM), std::runtime_error);
+    EXPECT_THROW(converter.createConvertedAxis(1, Axes::Units::DEFAULT), std::runtime_error);
 
     FixedBinAxis axis("Angles", 100, 0.0, 2.0 * M_PI);
     EXPECT_THROW(UnitConverterConvSpec converter2(m_beam, axis), std::runtime_error);
 
     UnitConverterQSpec converter2(m_qscan);
     // wrong units
-    EXPECT_THROW(converter2.calculateMin(0, AxesUnits::MM), std::runtime_error);
-    EXPECT_THROW(converter2.calculateMin(0, AxesUnits::RADIANS), std::runtime_error);
-    EXPECT_THROW(converter2.calculateMin(0, AxesUnits::DEGREES), std::runtime_error);
-    EXPECT_THROW(converter2.calculateMax(0, AxesUnits::MM), std::runtime_error);
-    EXPECT_THROW(converter2.calculateMax(0, AxesUnits::RADIANS), std::runtime_error);
-    EXPECT_THROW(converter2.calculateMax(0, AxesUnits::DEGREES), std::runtime_error);
-    EXPECT_THROW(converter2.createConvertedAxis(0, AxesUnits::MM), std::runtime_error);
+    EXPECT_THROW(converter2.calculateMin(0, Axes::Units::MM), std::runtime_error);
+    EXPECT_THROW(converter2.calculateMin(0, Axes::Units::RADIANS), std::runtime_error);
+    EXPECT_THROW(converter2.calculateMin(0, Axes::Units::DEGREES), std::runtime_error);
+    EXPECT_THROW(converter2.calculateMax(0, Axes::Units::MM), std::runtime_error);
+    EXPECT_THROW(converter2.calculateMax(0, Axes::Units::RADIANS), std::runtime_error);
+    EXPECT_THROW(converter2.calculateMax(0, Axes::Units::DEGREES), std::runtime_error);
+    EXPECT_THROW(converter2.createConvertedAxis(0, Axes::Units::MM), std::runtime_error);
 
     // wrong axis index
-    EXPECT_THROW(converter2.calculateMin(1, AxesUnits::QSPACE), std::runtime_error);
-    EXPECT_THROW(converter2.calculateMax(1, AxesUnits::RQ4), std::runtime_error);
-    EXPECT_THROW(converter2.createConvertedAxis(1, AxesUnits::DEFAULT), std::runtime_error);
+    EXPECT_THROW(converter2.calculateMin(1, Axes::Units::QSPACE), std::runtime_error);
+    EXPECT_THROW(converter2.calculateMax(1, Axes::Units::RQ4), std::runtime_error);
+    EXPECT_THROW(converter2.createConvertedAxis(1, Axes::Units::DEFAULT), std::runtime_error);
 }
 
 TEST_F(UnitConverter1DTest, Clone)
@@ -236,10 +236,10 @@ TEST_F(UnitConverter1DTest, NonDefaultUnitsInInput)
 {
     PointwiseAxis axis("x", std::vector<double>{0.0, 0.5, 1.0});
 
-    EXPECT_THROW(UnitConverterConvSpec(m_beam, axis, AxesUnits::NBINS), std::runtime_error);
+    EXPECT_THROW(UnitConverterConvSpec(m_beam, axis, Axes::Units::NBINS), std::runtime_error);
 
-    UnitConverterConvSpec converter(m_beam, axis, AxesUnits::DEGREES);
-    auto axis_deg_output = converter.createConvertedAxis(0, AxesUnits::DEGREES);
+    UnitConverterConvSpec converter(m_beam, axis, Axes::Units::DEGREES);
+    auto axis_deg_output = converter.createConvertedAxis(0, Axes::Units::DEGREES);
     EXPECT_TRUE(axis.size() == axis_deg_output->size());
     EXPECT_DOUBLE_EQ(axis[0], (*axis_deg_output)[0]);
     EXPECT_DOUBLE_EQ(axis[1], (*axis_deg_output)[1]);
@@ -248,12 +248,12 @@ TEST_F(UnitConverter1DTest, NonDefaultUnitsInInput)
     auto values = axis.getBinCenters();
     std::for_each(values.begin(), values.end(), [this](double& value) { value = getQ(value); });
     PointwiseAxis q_axis("q", values);
-    UnitConverterConvSpec converter2(m_beam, q_axis, AxesUnits::QSPACE);
-    auto axis_rad_output = converter2.createConvertedAxis(0, AxesUnits::RADIANS);
+    UnitConverterConvSpec converter2(m_beam, q_axis, Axes::Units::QSPACE);
+    auto axis_rad_output = converter2.createConvertedAxis(0, Axes::Units::RADIANS);
     EXPECT_TRUE(axis.size() == axis_rad_output->size());
     EXPECT_DOUBLE_EQ(axis[0], (*axis_rad_output)[0]);
     EXPECT_DOUBLE_EQ(axis[1], (*axis_rad_output)[1]);
     EXPECT_DOUBLE_EQ(axis[2], (*axis_rad_output)[2]);
 
-    EXPECT_THROW(UnitConverterConvSpec(m_beam, q_axis, AxesUnits::RQ4), std::runtime_error);
+    EXPECT_THROW(UnitConverterConvSpec(m_beam, q_axis, Axes::Units::RQ4), std::runtime_error);
 }
diff --git a/Tests/UnitTests/Core/Detector/OffSpecularConverterTest.cpp b/Tests/UnitTests/Core/Detector/OffSpecularConverterTest.cpp
index cbcd0e175f2e2fd9334578aa20c5ec0fdc439c51..95e98755e56499310e9c6d27dbdc7fa6dae0c97b 100644
--- a/Tests/UnitTests/Core/Detector/OffSpecularConverterTest.cpp
+++ b/Tests/UnitTests/Core/Detector/OffSpecularConverterTest.cpp
@@ -28,51 +28,51 @@ TEST_F(OffSpecularConverterTest, OffSpecularConverter)
 
     EXPECT_EQ(converter.dimension(), 2u);
 
-    EXPECT_DOUBLE_EQ(converter.calculateMin(0, AxesUnits::DEFAULT), 0.0);
-    EXPECT_DOUBLE_EQ(converter.calculateMin(0, AxesUnits::NBINS), 0.0);
-    EXPECT_DOUBLE_EQ(converter.calculateMin(0, AxesUnits::RADIANS), 0.0);
-    EXPECT_DOUBLE_EQ(converter.calculateMin(0, AxesUnits::DEGREES), 0.0);
-    EXPECT_THROW(converter.calculateMin(0, AxesUnits::QSPACE), std::runtime_error);
-    EXPECT_THROW(converter.calculateMin(0, AxesUnits::MM), std::runtime_error);
-
-    EXPECT_DOUBLE_EQ(converter.calculateMax(0, AxesUnits::DEFAULT), 7.0);
-    EXPECT_DOUBLE_EQ(converter.calculateMax(0, AxesUnits::NBINS), 51.0);
-    EXPECT_DOUBLE_EQ(converter.calculateMax(0, AxesUnits::RADIANS), Units::deg2rad(7.0));
-    EXPECT_DOUBLE_EQ(converter.calculateMax(0, AxesUnits::DEGREES), 7.0);
-    EXPECT_THROW(converter.calculateMax(0, AxesUnits::QSPACE), std::runtime_error);
-    EXPECT_THROW(converter.calculateMax(0, AxesUnits::MM), std::runtime_error);
-
-    EXPECT_DOUBLE_EQ(converter.calculateMin(1, AxesUnits::DEFAULT), -2.0);
-    EXPECT_DOUBLE_EQ(converter.calculateMin(1, AxesUnits::NBINS), 0.0);
-    EXPECT_DOUBLE_EQ(converter.calculateMin(1, AxesUnits::RADIANS), Units::deg2rad(-2.0));
-    EXPECT_DOUBLE_EQ(converter.calculateMin(1, AxesUnits::DEGREES), -2.0);
-    EXPECT_THROW(converter.calculateMin(1, AxesUnits::QSPACE), std::runtime_error);
-    EXPECT_THROW(converter.calculateMin(1, AxesUnits::MM), std::runtime_error);
-
-    EXPECT_DOUBLE_EQ(converter.calculateMax(1, AxesUnits::DEFAULT), Units::rad2deg(1.5));
-    EXPECT_DOUBLE_EQ(converter.calculateMax(1, AxesUnits::NBINS), 70.0);
-    EXPECT_DOUBLE_EQ(converter.calculateMax(1, AxesUnits::RADIANS), 1.5);
-    EXPECT_DOUBLE_EQ(converter.calculateMax(1, AxesUnits::DEGREES), Units::rad2deg(1.5));
-    EXPECT_THROW(converter.calculateMax(1, AxesUnits::QSPACE), std::runtime_error);
-    EXPECT_THROW(converter.calculateMax(1, AxesUnits::MM), std::runtime_error);
-
-    EXPECT_THROW(converter.calculateMin(2, AxesUnits::DEFAULT), std::runtime_error);
-    EXPECT_THROW(converter.calculateMax(2, AxesUnits::DEFAULT), std::runtime_error);
-
-    auto axis = converter.createConvertedAxis(0, AxesUnits::DEFAULT);
+    EXPECT_DOUBLE_EQ(converter.calculateMin(0, Axes::Units::DEFAULT), 0.0);
+    EXPECT_DOUBLE_EQ(converter.calculateMin(0, Axes::Units::NBINS), 0.0);
+    EXPECT_DOUBLE_EQ(converter.calculateMin(0, Axes::Units::RADIANS), 0.0);
+    EXPECT_DOUBLE_EQ(converter.calculateMin(0, Axes::Units::DEGREES), 0.0);
+    EXPECT_THROW(converter.calculateMin(0, Axes::Units::QSPACE), std::runtime_error);
+    EXPECT_THROW(converter.calculateMin(0, Axes::Units::MM), std::runtime_error);
+
+    EXPECT_DOUBLE_EQ(converter.calculateMax(0, Axes::Units::DEFAULT), 7.0);
+    EXPECT_DOUBLE_EQ(converter.calculateMax(0, Axes::Units::NBINS), 51.0);
+    EXPECT_DOUBLE_EQ(converter.calculateMax(0, Axes::Units::RADIANS), Units::deg2rad(7.0));
+    EXPECT_DOUBLE_EQ(converter.calculateMax(0, Axes::Units::DEGREES), 7.0);
+    EXPECT_THROW(converter.calculateMax(0, Axes::Units::QSPACE), std::runtime_error);
+    EXPECT_THROW(converter.calculateMax(0, Axes::Units::MM), std::runtime_error);
+
+    EXPECT_DOUBLE_EQ(converter.calculateMin(1, Axes::Units::DEFAULT), -2.0);
+    EXPECT_DOUBLE_EQ(converter.calculateMin(1, Axes::Units::NBINS), 0.0);
+    EXPECT_DOUBLE_EQ(converter.calculateMin(1, Axes::Units::RADIANS), Units::deg2rad(-2.0));
+    EXPECT_DOUBLE_EQ(converter.calculateMin(1, Axes::Units::DEGREES), -2.0);
+    EXPECT_THROW(converter.calculateMin(1, Axes::Units::QSPACE), std::runtime_error);
+    EXPECT_THROW(converter.calculateMin(1, Axes::Units::MM), std::runtime_error);
+
+    EXPECT_DOUBLE_EQ(converter.calculateMax(1, Axes::Units::DEFAULT), Units::rad2deg(1.5));
+    EXPECT_DOUBLE_EQ(converter.calculateMax(1, Axes::Units::NBINS), 70.0);
+    EXPECT_DOUBLE_EQ(converter.calculateMax(1, Axes::Units::RADIANS), 1.5);
+    EXPECT_DOUBLE_EQ(converter.calculateMax(1, Axes::Units::DEGREES), Units::rad2deg(1.5));
+    EXPECT_THROW(converter.calculateMax(1, Axes::Units::QSPACE), std::runtime_error);
+    EXPECT_THROW(converter.calculateMax(1, Axes::Units::MM), std::runtime_error);
+
+    EXPECT_THROW(converter.calculateMin(2, Axes::Units::DEFAULT), std::runtime_error);
+    EXPECT_THROW(converter.calculateMax(2, Axes::Units::DEFAULT), std::runtime_error);
+
+    auto axis = converter.createConvertedAxis(0, Axes::Units::DEFAULT);
     EXPECT_TRUE(dynamic_cast<FixedBinAxis*>(axis.get()));
     EXPECT_EQ(axis->size(), converter.axisSize(0));
-    EXPECT_EQ(axis->getMin(), converter.calculateMin(0, AxesUnits::DEFAULT));
-    EXPECT_EQ(axis->getMax(), converter.calculateMax(0, AxesUnits::DEFAULT));
+    EXPECT_EQ(axis->getMin(), converter.calculateMin(0, Axes::Units::DEFAULT));
+    EXPECT_EQ(axis->getMax(), converter.calculateMax(0, Axes::Units::DEFAULT));
 
-    auto axis2 = converter.createConvertedAxis(1, AxesUnits::RADIANS);
+    auto axis2 = converter.createConvertedAxis(1, Axes::Units::RADIANS);
     EXPECT_TRUE(dynamic_cast<FixedBinAxis*>(axis2.get()));
     EXPECT_EQ(axis2->size(), converter.axisSize(1));
-    EXPECT_EQ(axis2->getMin(), converter.calculateMin(1, AxesUnits::RADIANS));
-    EXPECT_EQ(axis2->getMax(), converter.calculateMax(1, AxesUnits::RADIANS));
+    EXPECT_EQ(axis2->getMin(), converter.calculateMin(1, Axes::Units::RADIANS));
+    EXPECT_EQ(axis2->getMax(), converter.calculateMax(1, Axes::Units::RADIANS));
 
-    EXPECT_THROW(converter.createConvertedAxis(2, AxesUnits::DEFAULT), std::runtime_error);
-    EXPECT_THROW(converter.createConvertedAxis(1, AxesUnits::QSPACE), std::runtime_error);
+    EXPECT_THROW(converter.createConvertedAxis(2, Axes::Units::DEFAULT), std::runtime_error);
+    EXPECT_THROW(converter.createConvertedAxis(1, Axes::Units::QSPACE), std::runtime_error);
 }
 
 TEST_F(OffSpecularConverterTest, OffSpecularConverterClone)
@@ -82,34 +82,34 @@ TEST_F(OffSpecularConverterTest, OffSpecularConverterClone)
 
     EXPECT_EQ(P_clone->dimension(), 2u);
 
-    EXPECT_DOUBLE_EQ(P_clone->calculateMin(0, AxesUnits::DEFAULT), 0.0);
-    EXPECT_DOUBLE_EQ(P_clone->calculateMin(0, AxesUnits::NBINS), 0.0);
-    EXPECT_DOUBLE_EQ(P_clone->calculateMin(0, AxesUnits::RADIANS), 0.0);
-    EXPECT_DOUBLE_EQ(P_clone->calculateMin(0, AxesUnits::DEGREES), 0.0);
-    EXPECT_THROW(P_clone->calculateMin(0, AxesUnits::QSPACE), std::runtime_error);
-    EXPECT_THROW(P_clone->calculateMin(0, AxesUnits::MM), std::runtime_error);
-
-    EXPECT_DOUBLE_EQ(P_clone->calculateMax(0, AxesUnits::DEFAULT), 7.0);
-    EXPECT_DOUBLE_EQ(P_clone->calculateMax(0, AxesUnits::NBINS), 51.0);
-    EXPECT_DOUBLE_EQ(P_clone->calculateMax(0, AxesUnits::RADIANS), Units::deg2rad(7.0));
-    EXPECT_DOUBLE_EQ(P_clone->calculateMax(0, AxesUnits::DEGREES), 7.0);
-    EXPECT_THROW(P_clone->calculateMax(0, AxesUnits::QSPACE), std::runtime_error);
-    EXPECT_THROW(P_clone->calculateMax(0, AxesUnits::MM), std::runtime_error);
-
-    EXPECT_DOUBLE_EQ(P_clone->calculateMin(1, AxesUnits::DEFAULT), -2.0);
-    EXPECT_DOUBLE_EQ(P_clone->calculateMin(1, AxesUnits::NBINS), 0.0);
-    EXPECT_DOUBLE_EQ(P_clone->calculateMin(1, AxesUnits::RADIANS), Units::deg2rad(-2.0));
-    EXPECT_DOUBLE_EQ(P_clone->calculateMin(1, AxesUnits::DEGREES), -2.0);
-    EXPECT_THROW(P_clone->calculateMin(1, AxesUnits::QSPACE), std::runtime_error);
-    EXPECT_THROW(P_clone->calculateMin(1, AxesUnits::MM), std::runtime_error);
-
-    EXPECT_DOUBLE_EQ(P_clone->calculateMax(1, AxesUnits::DEFAULT), Units::rad2deg(1.5));
-    EXPECT_DOUBLE_EQ(P_clone->calculateMax(1, AxesUnits::NBINS), 70.0);
-    EXPECT_DOUBLE_EQ(P_clone->calculateMax(1, AxesUnits::RADIANS), 1.5);
-    EXPECT_DOUBLE_EQ(P_clone->calculateMax(1, AxesUnits::DEGREES), Units::rad2deg(1.5));
-    EXPECT_THROW(P_clone->calculateMax(1, AxesUnits::QSPACE), std::runtime_error);
-    EXPECT_THROW(P_clone->calculateMax(1, AxesUnits::MM), std::runtime_error);
-
-    EXPECT_THROW(P_clone->calculateMin(2, AxesUnits::DEFAULT), std::runtime_error);
-    EXPECT_THROW(P_clone->calculateMax(2, AxesUnits::DEFAULT), std::runtime_error);
+    EXPECT_DOUBLE_EQ(P_clone->calculateMin(0, Axes::Units::DEFAULT), 0.0);
+    EXPECT_DOUBLE_EQ(P_clone->calculateMin(0, Axes::Units::NBINS), 0.0);
+    EXPECT_DOUBLE_EQ(P_clone->calculateMin(0, Axes::Units::RADIANS), 0.0);
+    EXPECT_DOUBLE_EQ(P_clone->calculateMin(0, Axes::Units::DEGREES), 0.0);
+    EXPECT_THROW(P_clone->calculateMin(0, Axes::Units::QSPACE), std::runtime_error);
+    EXPECT_THROW(P_clone->calculateMin(0, Axes::Units::MM), std::runtime_error);
+
+    EXPECT_DOUBLE_EQ(P_clone->calculateMax(0, Axes::Units::DEFAULT), 7.0);
+    EXPECT_DOUBLE_EQ(P_clone->calculateMax(0, Axes::Units::NBINS), 51.0);
+    EXPECT_DOUBLE_EQ(P_clone->calculateMax(0, Axes::Units::RADIANS), Units::deg2rad(7.0));
+    EXPECT_DOUBLE_EQ(P_clone->calculateMax(0, Axes::Units::DEGREES), 7.0);
+    EXPECT_THROW(P_clone->calculateMax(0, Axes::Units::QSPACE), std::runtime_error);
+    EXPECT_THROW(P_clone->calculateMax(0, Axes::Units::MM), std::runtime_error);
+
+    EXPECT_DOUBLE_EQ(P_clone->calculateMin(1, Axes::Units::DEFAULT), -2.0);
+    EXPECT_DOUBLE_EQ(P_clone->calculateMin(1, Axes::Units::NBINS), 0.0);
+    EXPECT_DOUBLE_EQ(P_clone->calculateMin(1, Axes::Units::RADIANS), Units::deg2rad(-2.0));
+    EXPECT_DOUBLE_EQ(P_clone->calculateMin(1, Axes::Units::DEGREES), -2.0);
+    EXPECT_THROW(P_clone->calculateMin(1, Axes::Units::QSPACE), std::runtime_error);
+    EXPECT_THROW(P_clone->calculateMin(1, Axes::Units::MM), std::runtime_error);
+
+    EXPECT_DOUBLE_EQ(P_clone->calculateMax(1, Axes::Units::DEFAULT), Units::rad2deg(1.5));
+    EXPECT_DOUBLE_EQ(P_clone->calculateMax(1, Axes::Units::NBINS), 70.0);
+    EXPECT_DOUBLE_EQ(P_clone->calculateMax(1, Axes::Units::RADIANS), 1.5);
+    EXPECT_DOUBLE_EQ(P_clone->calculateMax(1, Axes::Units::DEGREES), Units::rad2deg(1.5));
+    EXPECT_THROW(P_clone->calculateMax(1, Axes::Units::QSPACE), std::runtime_error);
+    EXPECT_THROW(P_clone->calculateMax(1, Axes::Units::MM), std::runtime_error);
+
+    EXPECT_THROW(P_clone->calculateMin(2, Axes::Units::DEFAULT), std::runtime_error);
+    EXPECT_THROW(P_clone->calculateMax(2, Axes::Units::DEFAULT), std::runtime_error);
 }
diff --git a/Tests/UnitTests/Core/Detector/RectangularConverterTest.cpp b/Tests/UnitTests/Core/Detector/RectangularConverterTest.cpp
index 57059659223e261e293955c7c331df15f43bb784..fc6f57d34c87d824821581a3e1d0ff984f83c0cd 100644
--- a/Tests/UnitTests/Core/Detector/RectangularConverterTest.cpp
+++ b/Tests/UnitTests/Core/Detector/RectangularConverterTest.cpp
@@ -47,56 +47,56 @@ TEST_F(RectangularConverterTest, RectangularConverter)
 
     EXPECT_EQ(converter.dimension(), 2u);
 
-    EXPECT_NEAR(converter.calculateMin(0, AxesUnits::DEFAULT), 0.0, 1e-12);
-    EXPECT_NEAR(converter.calculateMin(0, AxesUnits::NBINS), 0.0, 1e-12);
-    EXPECT_NEAR(converter.calculateMin(0, AxesUnits::MM), 0.0, 1e-12);
-    EXPECT_NEAR(converter.calculateMin(0, AxesUnits::RADIANS), -m_phi, m_phi * 1e-10);
-    EXPECT_NEAR(converter.calculateMin(0, AxesUnits::DEGREES), Units::rad2deg(-m_phi),
+    EXPECT_NEAR(converter.calculateMin(0, Axes::Units::DEFAULT), 0.0, 1e-12);
+    EXPECT_NEAR(converter.calculateMin(0, Axes::Units::NBINS), 0.0, 1e-12);
+    EXPECT_NEAR(converter.calculateMin(0, Axes::Units::MM), 0.0, 1e-12);
+    EXPECT_NEAR(converter.calculateMin(0, Axes::Units::RADIANS), -m_phi, m_phi * 1e-10);
+    EXPECT_NEAR(converter.calculateMin(0, Axes::Units::DEGREES), Units::rad2deg(-m_phi),
                 Units::rad2deg(m_phi) * 1e-10);
-    EXPECT_NEAR(converter.calculateMin(0, AxesUnits::QSPACE), -m_kfy, m_kfy * 1e-10);
+    EXPECT_NEAR(converter.calculateMin(0, Axes::Units::QSPACE), -m_kfy, m_kfy * 1e-10);
 
-    EXPECT_NEAR(converter.calculateMax(0, AxesUnits::DEFAULT), det_width, det_width * 1e-10);
-    EXPECT_NEAR(converter.calculateMax(0, AxesUnits::NBINS), static_cast<double>(det_nx),
+    EXPECT_NEAR(converter.calculateMax(0, Axes::Units::DEFAULT), det_width, det_width * 1e-10);
+    EXPECT_NEAR(converter.calculateMax(0, Axes::Units::NBINS), static_cast<double>(det_nx),
                 det_nx * 1e-10);
-    EXPECT_NEAR(converter.calculateMax(0, AxesUnits::MM), det_width, det_width * 1e-10);
-    EXPECT_NEAR(converter.calculateMax(0, AxesUnits::RADIANS), m_phi, m_phi * 1e-10);
-    EXPECT_NEAR(converter.calculateMax(0, AxesUnits::DEGREES), Units::rad2deg(m_phi),
+    EXPECT_NEAR(converter.calculateMax(0, Axes::Units::MM), det_width, det_width * 1e-10);
+    EXPECT_NEAR(converter.calculateMax(0, Axes::Units::RADIANS), m_phi, m_phi * 1e-10);
+    EXPECT_NEAR(converter.calculateMax(0, Axes::Units::DEGREES), Units::rad2deg(m_phi),
                 Units::rad2deg(m_phi) * 1e-10);
-    EXPECT_NEAR(converter.calculateMax(0, AxesUnits::QSPACE), m_kfy, m_kfy * 1e-10);
+    EXPECT_NEAR(converter.calculateMax(0, Axes::Units::QSPACE), m_kfy, m_kfy * 1e-10);
 
-    EXPECT_NEAR(converter.calculateMin(1, AxesUnits::DEFAULT), 0.0, 1e-12);
-    EXPECT_NEAR(converter.calculateMin(1, AxesUnits::NBINS), 0.0, 1e-12);
-    EXPECT_NEAR(converter.calculateMin(1, AxesUnits::MM), 0.0, 1e-12);
-    EXPECT_NEAR(converter.calculateMin(1, AxesUnits::RADIANS), 0.0, 1e-12);
-    EXPECT_NEAR(converter.calculateMin(1, AxesUnits::DEGREES), 0.0, 1e-12);
-    EXPECT_NEAR(converter.calculateMin(1, AxesUnits::QSPACE), -m_kiz, std::abs(m_kiz) * 1e-10);
+    EXPECT_NEAR(converter.calculateMin(1, Axes::Units::DEFAULT), 0.0, 1e-12);
+    EXPECT_NEAR(converter.calculateMin(1, Axes::Units::NBINS), 0.0, 1e-12);
+    EXPECT_NEAR(converter.calculateMin(1, Axes::Units::MM), 0.0, 1e-12);
+    EXPECT_NEAR(converter.calculateMin(1, Axes::Units::RADIANS), 0.0, 1e-12);
+    EXPECT_NEAR(converter.calculateMin(1, Axes::Units::DEGREES), 0.0, 1e-12);
+    EXPECT_NEAR(converter.calculateMin(1, Axes::Units::QSPACE), -m_kiz, std::abs(m_kiz) * 1e-10);
 
-    EXPECT_NEAR(converter.calculateMax(1, AxesUnits::DEFAULT), det_height, det_height * 1e-10);
-    EXPECT_NEAR(converter.calculateMax(1, AxesUnits::NBINS), static_cast<double>(det_ny),
+    EXPECT_NEAR(converter.calculateMax(1, Axes::Units::DEFAULT), det_height, det_height * 1e-10);
+    EXPECT_NEAR(converter.calculateMax(1, Axes::Units::NBINS), static_cast<double>(det_ny),
                 det_ny * 1e-10);
-    EXPECT_NEAR(converter.calculateMax(1, AxesUnits::MM), det_height, det_height * 1e-10);
-    EXPECT_NEAR(converter.calculateMax(1, AxesUnits::RADIANS), m_alpha, m_alpha * 1e-10);
-    EXPECT_NEAR(converter.calculateMax(1, AxesUnits::DEGREES), Units::rad2deg(m_alpha),
+    EXPECT_NEAR(converter.calculateMax(1, Axes::Units::MM), det_height, det_height * 1e-10);
+    EXPECT_NEAR(converter.calculateMax(1, Axes::Units::RADIANS), m_alpha, m_alpha * 1e-10);
+    EXPECT_NEAR(converter.calculateMax(1, Axes::Units::DEGREES), Units::rad2deg(m_alpha),
                 Units::rad2deg(m_alpha) * 1e-10);
-    EXPECT_NEAR(converter.calculateMax(1, AxesUnits::QSPACE), m_kfz - m_kiz,
+    EXPECT_NEAR(converter.calculateMax(1, Axes::Units::QSPACE), m_kfz - m_kiz,
                 std::abs(m_kfz - m_kiz) * 1e-10);
 
-    EXPECT_THROW(converter.calculateMin(2, AxesUnits::DEFAULT), std::runtime_error);
-    EXPECT_THROW(converter.calculateMax(2, AxesUnits::DEFAULT), std::runtime_error);
+    EXPECT_THROW(converter.calculateMin(2, Axes::Units::DEFAULT), std::runtime_error);
+    EXPECT_THROW(converter.calculateMax(2, Axes::Units::DEFAULT), std::runtime_error);
 
-    auto axis = converter.createConvertedAxis(0, AxesUnits::DEFAULT);
+    auto axis = converter.createConvertedAxis(0, Axes::Units::DEFAULT);
     EXPECT_TRUE(dynamic_cast<FixedBinAxis*>(axis.get()));
     EXPECT_EQ(axis->size(), converter.axisSize(0));
-    EXPECT_EQ(axis->getMin(), converter.calculateMin(0, AxesUnits::DEFAULT));
-    EXPECT_EQ(axis->getMax(), converter.calculateMax(0, AxesUnits::DEFAULT));
+    EXPECT_EQ(axis->getMin(), converter.calculateMin(0, Axes::Units::DEFAULT));
+    EXPECT_EQ(axis->getMax(), converter.calculateMax(0, Axes::Units::DEFAULT));
 
-    auto axis2 = converter.createConvertedAxis(1, AxesUnits::QSPACE);
+    auto axis2 = converter.createConvertedAxis(1, Axes::Units::QSPACE);
     EXPECT_TRUE(dynamic_cast<FixedBinAxis*>(axis2.get()));
     EXPECT_EQ(axis2->size(), converter.axisSize(1));
-    EXPECT_EQ(axis2->getMin(), converter.calculateMin(1, AxesUnits::QSPACE));
-    EXPECT_EQ(axis2->getMax(), converter.calculateMax(1, AxesUnits::QSPACE));
+    EXPECT_EQ(axis2->getMin(), converter.calculateMin(1, Axes::Units::QSPACE));
+    EXPECT_EQ(axis2->getMax(), converter.calculateMax(1, Axes::Units::QSPACE));
 
-    EXPECT_THROW(converter.createConvertedAxis(2, AxesUnits::DEFAULT), std::runtime_error);
+    EXPECT_THROW(converter.createConvertedAxis(2, Axes::Units::DEFAULT), std::runtime_error);
 }
 
 TEST_F(RectangularConverterTest, RectangularConverterClone)
@@ -106,42 +106,42 @@ TEST_F(RectangularConverterTest, RectangularConverterClone)
 
     EXPECT_EQ(P_clone->dimension(), 2u);
 
-    EXPECT_NEAR(P_clone->calculateMin(0, AxesUnits::DEFAULT), 0.0, 1e-12);
-    EXPECT_NEAR(P_clone->calculateMin(0, AxesUnits::NBINS), 0.0, 1e-12);
-    EXPECT_NEAR(P_clone->calculateMin(0, AxesUnits::MM), 0.0, 1e-12);
-    EXPECT_NEAR(P_clone->calculateMin(0, AxesUnits::RADIANS), -m_phi, m_phi * 1e-10);
-    EXPECT_NEAR(P_clone->calculateMin(0, AxesUnits::DEGREES), Units::rad2deg(-m_phi),
+    EXPECT_NEAR(P_clone->calculateMin(0, Axes::Units::DEFAULT), 0.0, 1e-12);
+    EXPECT_NEAR(P_clone->calculateMin(0, Axes::Units::NBINS), 0.0, 1e-12);
+    EXPECT_NEAR(P_clone->calculateMin(0, Axes::Units::MM), 0.0, 1e-12);
+    EXPECT_NEAR(P_clone->calculateMin(0, Axes::Units::RADIANS), -m_phi, m_phi * 1e-10);
+    EXPECT_NEAR(P_clone->calculateMin(0, Axes::Units::DEGREES), Units::rad2deg(-m_phi),
                 Units::rad2deg(m_phi) * 1e-10);
-    EXPECT_NEAR(P_clone->calculateMin(0, AxesUnits::QSPACE), -m_kfy, m_kfy * 1e-10);
+    EXPECT_NEAR(P_clone->calculateMin(0, Axes::Units::QSPACE), -m_kfy, m_kfy * 1e-10);
 
-    EXPECT_NEAR(P_clone->calculateMax(0, AxesUnits::DEFAULT), det_width, det_width * 1e-10);
-    EXPECT_NEAR(P_clone->calculateMax(0, AxesUnits::NBINS), static_cast<double>(det_nx),
+    EXPECT_NEAR(P_clone->calculateMax(0, Axes::Units::DEFAULT), det_width, det_width * 1e-10);
+    EXPECT_NEAR(P_clone->calculateMax(0, Axes::Units::NBINS), static_cast<double>(det_nx),
                 det_nx * 1e-10);
-    EXPECT_NEAR(P_clone->calculateMax(0, AxesUnits::MM), det_width, det_width * 1e-10);
-    EXPECT_NEAR(P_clone->calculateMax(0, AxesUnits::RADIANS), m_phi, m_phi * 1e-10);
-    EXPECT_NEAR(P_clone->calculateMax(0, AxesUnits::DEGREES), Units::rad2deg(m_phi),
+    EXPECT_NEAR(P_clone->calculateMax(0, Axes::Units::MM), det_width, det_width * 1e-10);
+    EXPECT_NEAR(P_clone->calculateMax(0, Axes::Units::RADIANS), m_phi, m_phi * 1e-10);
+    EXPECT_NEAR(P_clone->calculateMax(0, Axes::Units::DEGREES), Units::rad2deg(m_phi),
                 Units::rad2deg(m_phi) * 1e-10);
-    EXPECT_NEAR(P_clone->calculateMax(0, AxesUnits::QSPACE), m_kfy, m_kfy * 1e-10);
+    EXPECT_NEAR(P_clone->calculateMax(0, Axes::Units::QSPACE), m_kfy, m_kfy * 1e-10);
 
-    EXPECT_NEAR(P_clone->calculateMin(1, AxesUnits::DEFAULT), 0.0, 1e-12);
-    EXPECT_NEAR(P_clone->calculateMin(1, AxesUnits::NBINS), 0.0, 1e-12);
-    EXPECT_NEAR(P_clone->calculateMin(1, AxesUnits::MM), 0.0, 1e-12);
-    EXPECT_NEAR(P_clone->calculateMin(1, AxesUnits::RADIANS), 0.0, 1e-12);
-    EXPECT_NEAR(P_clone->calculateMin(1, AxesUnits::DEGREES), 0.0, 1e-12);
-    EXPECT_NEAR(P_clone->calculateMin(1, AxesUnits::QSPACE), -m_kiz, std::abs(m_kiz) * 1e-10);
+    EXPECT_NEAR(P_clone->calculateMin(1, Axes::Units::DEFAULT), 0.0, 1e-12);
+    EXPECT_NEAR(P_clone->calculateMin(1, Axes::Units::NBINS), 0.0, 1e-12);
+    EXPECT_NEAR(P_clone->calculateMin(1, Axes::Units::MM), 0.0, 1e-12);
+    EXPECT_NEAR(P_clone->calculateMin(1, Axes::Units::RADIANS), 0.0, 1e-12);
+    EXPECT_NEAR(P_clone->calculateMin(1, Axes::Units::DEGREES), 0.0, 1e-12);
+    EXPECT_NEAR(P_clone->calculateMin(1, Axes::Units::QSPACE), -m_kiz, std::abs(m_kiz) * 1e-10);
 
-    EXPECT_NEAR(P_clone->calculateMax(1, AxesUnits::DEFAULT), det_height, det_height * 1e-10);
-    EXPECT_NEAR(P_clone->calculateMax(1, AxesUnits::NBINS), static_cast<double>(det_ny),
+    EXPECT_NEAR(P_clone->calculateMax(1, Axes::Units::DEFAULT), det_height, det_height * 1e-10);
+    EXPECT_NEAR(P_clone->calculateMax(1, Axes::Units::NBINS), static_cast<double>(det_ny),
                 det_ny * 1e-10);
-    EXPECT_NEAR(P_clone->calculateMax(1, AxesUnits::MM), det_height, det_height * 1e-10);
-    EXPECT_NEAR(P_clone->calculateMax(1, AxesUnits::RADIANS), m_alpha, m_alpha * 1e-10);
-    EXPECT_NEAR(P_clone->calculateMax(1, AxesUnits::DEGREES), Units::rad2deg(m_alpha),
+    EXPECT_NEAR(P_clone->calculateMax(1, Axes::Units::MM), det_height, det_height * 1e-10);
+    EXPECT_NEAR(P_clone->calculateMax(1, Axes::Units::RADIANS), m_alpha, m_alpha * 1e-10);
+    EXPECT_NEAR(P_clone->calculateMax(1, Axes::Units::DEGREES), Units::rad2deg(m_alpha),
                 Units::rad2deg(m_alpha) * 1e-10);
-    EXPECT_NEAR(P_clone->calculateMax(1, AxesUnits::QSPACE), m_kfz - m_kiz,
+    EXPECT_NEAR(P_clone->calculateMax(1, Axes::Units::QSPACE), m_kfz - m_kiz,
                 std::abs(m_kfz - m_kiz) * 1e-10);
 
-    EXPECT_THROW(P_clone->calculateMin(2, AxesUnits::DEFAULT), std::runtime_error);
-    EXPECT_THROW(P_clone->calculateMax(2, AxesUnits::DEFAULT), std::runtime_error);
+    EXPECT_THROW(P_clone->calculateMin(2, Axes::Units::DEFAULT), std::runtime_error);
+    EXPECT_THROW(P_clone->calculateMax(2, Axes::Units::DEFAULT), std::runtime_error);
 }
 
 TEST_F(RectangularConverterTest, RectangularConverterWithROI)
@@ -154,13 +154,13 @@ TEST_F(RectangularConverterTest, RectangularConverterWithROI)
     m_detector.setRegionOfInterest(roi_xmin, roi_ymin, roi_xmax, roi_ymax);
     RectangularConverter converter(m_detector, m_beam);
 
-    EXPECT_EQ(converter.calculateMin(0, AxesUnits::DEFAULT), 100);
-    EXPECT_EQ(converter.calculateMax(0, AxesUnits::DEFAULT), 152);
-    EXPECT_EQ(converter.calculateMin(1, AxesUnits::DEFAULT), 50);
-    EXPECT_EQ(converter.calculateMax(1, AxesUnits::DEFAULT), 102);
+    EXPECT_EQ(converter.calculateMin(0, Axes::Units::DEFAULT), 100);
+    EXPECT_EQ(converter.calculateMax(0, Axes::Units::DEFAULT), 152);
+    EXPECT_EQ(converter.calculateMin(1, Axes::Units::DEFAULT), 50);
+    EXPECT_EQ(converter.calculateMax(1, Axes::Units::DEFAULT), 102);
 
-    EXPECT_NEAR(converter.calculateMin(0, AxesUnits::DEGREES), 0.0, 1e-10);
-    EXPECT_NEAR(converter.calculateMax(0, AxesUnits::DEGREES), 2.97669946811, 1e-10);
-    EXPECT_NEAR(converter.calculateMin(1, AxesUnits::DEGREES), 2.86240522611, 1e-10);
-    EXPECT_NEAR(converter.calculateMax(1, AxesUnits::DEGREES), 5.82402751615, 1e-10);
+    EXPECT_NEAR(converter.calculateMin(0, Axes::Units::DEGREES), 0.0, 1e-10);
+    EXPECT_NEAR(converter.calculateMax(0, Axes::Units::DEGREES), 2.97669946811, 1e-10);
+    EXPECT_NEAR(converter.calculateMin(1, Axes::Units::DEGREES), 2.86240522611, 1e-10);
+    EXPECT_NEAR(converter.calculateMax(1, Axes::Units::DEGREES), 5.82402751615, 1e-10);
 }
diff --git a/Tests/UnitTests/Core/Detector/SpecularDetector1DTest.cpp b/Tests/UnitTests/Core/Detector/SpecularDetector1DTest.cpp
index 454809a9a0718f5e8de8a278f376f47cd8290c78..4af0427b7d2f4c95d7fdeb1feef354a550dc9571 100644
--- a/Tests/UnitTests/Core/Detector/SpecularDetector1DTest.cpp
+++ b/Tests/UnitTests/Core/Detector/SpecularDetector1DTest.cpp
@@ -30,11 +30,6 @@ TEST_F(SpecularDetectorTest, basicBehaviour)
     // throwing exceptions
     OutputData<double>* p_intensity_map(nullptr);
     ASSERT_THROW(detector.applyDetectorResolution(p_intensity_map), std::runtime_error);
-
-    // clearing detector
-    detector.clear();
-    EXPECT_EQ(0u, detector.dimension());
-    ASSERT_THROW(detector.getAxis(0), std::runtime_error);
 }
 
 // Creation of the detector map with axes in given units
diff --git a/Tests/UnitTests/Core/Detector/SphericalConverterTest.cpp b/Tests/UnitTests/Core/Detector/SphericalConverterTest.cpp
index c81c30c1eeef4d9ee789d9d284c937e9b22562ba..e7bae2f415a641e8b72e5952e93801eb0d18e90c 100644
--- a/Tests/UnitTests/Core/Detector/SphericalConverterTest.cpp
+++ b/Tests/UnitTests/Core/Detector/SphericalConverterTest.cpp
@@ -34,50 +34,50 @@ TEST_F(SphericalConverterTest, SphericalConverter)
 
     EXPECT_EQ(converter.dimension(), 2u);
 
-    EXPECT_DOUBLE_EQ(converter.calculateMin(0, AxesUnits::DEFAULT), 0.0);
-    EXPECT_DOUBLE_EQ(converter.calculateMin(0, AxesUnits::NBINS), 0.0);
-    EXPECT_DOUBLE_EQ(converter.calculateMin(0, AxesUnits::RADIANS), 0.0);
-    EXPECT_DOUBLE_EQ(converter.calculateMin(0, AxesUnits::DEGREES), 0.0);
-    EXPECT_DOUBLE_EQ(converter.calculateMin(0, AxesUnits::QSPACE), 0.0);
-    EXPECT_THROW(converter.calculateMin(0, AxesUnits::MM), std::runtime_error);
-
-    EXPECT_DOUBLE_EQ(converter.calculateMax(0, AxesUnits::DEFAULT), 5.0);
-    EXPECT_DOUBLE_EQ(converter.calculateMax(0, AxesUnits::NBINS), 100.0);
-    EXPECT_DOUBLE_EQ(converter.calculateMax(0, AxesUnits::RADIANS), Units::deg2rad(5.0));
-    EXPECT_DOUBLE_EQ(converter.calculateMax(0, AxesUnits::DEGREES), 5.0);
-    EXPECT_DOUBLE_EQ(converter.calculateMax(0, AxesUnits::QSPACE), m_kfy);
-    EXPECT_THROW(converter.calculateMax(0, AxesUnits::MM), std::runtime_error);
-
-    EXPECT_DOUBLE_EQ(converter.calculateMin(1, AxesUnits::DEFAULT), -2.0);
-    EXPECT_DOUBLE_EQ(converter.calculateMin(1, AxesUnits::NBINS), 0.0);
-    EXPECT_DOUBLE_EQ(converter.calculateMin(1, AxesUnits::RADIANS), Units::deg2rad(-2.0));
-    EXPECT_DOUBLE_EQ(converter.calculateMin(1, AxesUnits::DEGREES), -2.0);
-    EXPECT_DOUBLE_EQ(converter.calculateMin(1, AxesUnits::QSPACE), m_kfz1 - m_kiz);
-    EXPECT_THROW(converter.calculateMin(1, AxesUnits::MM), std::runtime_error);
-
-    EXPECT_DOUBLE_EQ(converter.calculateMax(1, AxesUnits::DEFAULT), Units::rad2deg(1.5));
-    EXPECT_DOUBLE_EQ(converter.calculateMax(1, AxesUnits::NBINS), 70.0);
-    EXPECT_DOUBLE_EQ(converter.calculateMax(1, AxesUnits::RADIANS), 1.5);
-    EXPECT_DOUBLE_EQ(converter.calculateMax(1, AxesUnits::DEGREES), Units::rad2deg(1.5));
-    EXPECT_DOUBLE_EQ(converter.calculateMax(1, AxesUnits::QSPACE), m_kfz2 - m_kiz);
-    EXPECT_THROW(converter.calculateMax(1, AxesUnits::MM), std::runtime_error);
-
-    EXPECT_THROW(converter.calculateMin(2, AxesUnits::DEFAULT), std::runtime_error);
-    EXPECT_THROW(converter.calculateMax(2, AxesUnits::DEFAULT), std::runtime_error);
-
-    auto axis = converter.createConvertedAxis(0, AxesUnits::DEFAULT);
+    EXPECT_DOUBLE_EQ(converter.calculateMin(0, Axes::Units::DEFAULT), 0.0);
+    EXPECT_DOUBLE_EQ(converter.calculateMin(0, Axes::Units::NBINS), 0.0);
+    EXPECT_DOUBLE_EQ(converter.calculateMin(0, Axes::Units::RADIANS), 0.0);
+    EXPECT_DOUBLE_EQ(converter.calculateMin(0, Axes::Units::DEGREES), 0.0);
+    EXPECT_DOUBLE_EQ(converter.calculateMin(0, Axes::Units::QSPACE), 0.0);
+    EXPECT_THROW(converter.calculateMin(0, Axes::Units::MM), std::runtime_error);
+
+    EXPECT_DOUBLE_EQ(converter.calculateMax(0, Axes::Units::DEFAULT), 5.0);
+    EXPECT_DOUBLE_EQ(converter.calculateMax(0, Axes::Units::NBINS), 100.0);
+    EXPECT_DOUBLE_EQ(converter.calculateMax(0, Axes::Units::RADIANS), Units::deg2rad(5.0));
+    EXPECT_DOUBLE_EQ(converter.calculateMax(0, Axes::Units::DEGREES), 5.0);
+    EXPECT_DOUBLE_EQ(converter.calculateMax(0, Axes::Units::QSPACE), m_kfy);
+    EXPECT_THROW(converter.calculateMax(0, Axes::Units::MM), std::runtime_error);
+
+    EXPECT_DOUBLE_EQ(converter.calculateMin(1, Axes::Units::DEFAULT), -2.0);
+    EXPECT_DOUBLE_EQ(converter.calculateMin(1, Axes::Units::NBINS), 0.0);
+    EXPECT_DOUBLE_EQ(converter.calculateMin(1, Axes::Units::RADIANS), Units::deg2rad(-2.0));
+    EXPECT_DOUBLE_EQ(converter.calculateMin(1, Axes::Units::DEGREES), -2.0);
+    EXPECT_DOUBLE_EQ(converter.calculateMin(1, Axes::Units::QSPACE), m_kfz1 - m_kiz);
+    EXPECT_THROW(converter.calculateMin(1, Axes::Units::MM), std::runtime_error);
+
+    EXPECT_DOUBLE_EQ(converter.calculateMax(1, Axes::Units::DEFAULT), Units::rad2deg(1.5));
+    EXPECT_DOUBLE_EQ(converter.calculateMax(1, Axes::Units::NBINS), 70.0);
+    EXPECT_DOUBLE_EQ(converter.calculateMax(1, Axes::Units::RADIANS), 1.5);
+    EXPECT_DOUBLE_EQ(converter.calculateMax(1, Axes::Units::DEGREES), Units::rad2deg(1.5));
+    EXPECT_DOUBLE_EQ(converter.calculateMax(1, Axes::Units::QSPACE), m_kfz2 - m_kiz);
+    EXPECT_THROW(converter.calculateMax(1, Axes::Units::MM), std::runtime_error);
+
+    EXPECT_THROW(converter.calculateMin(2, Axes::Units::DEFAULT), std::runtime_error);
+    EXPECT_THROW(converter.calculateMax(2, Axes::Units::DEFAULT), std::runtime_error);
+
+    auto axis = converter.createConvertedAxis(0, Axes::Units::DEFAULT);
     EXPECT_TRUE(dynamic_cast<FixedBinAxis*>(axis.get()));
     EXPECT_EQ(axis->size(), converter.axisSize(0));
-    EXPECT_EQ(axis->getMin(), converter.calculateMin(0, AxesUnits::DEFAULT));
-    EXPECT_EQ(axis->getMax(), converter.calculateMax(0, AxesUnits::DEFAULT));
+    EXPECT_EQ(axis->getMin(), converter.calculateMin(0, Axes::Units::DEFAULT));
+    EXPECT_EQ(axis->getMax(), converter.calculateMax(0, Axes::Units::DEFAULT));
 
-    auto axis2 = converter.createConvertedAxis(1, AxesUnits::QSPACE);
+    auto axis2 = converter.createConvertedAxis(1, Axes::Units::QSPACE);
     EXPECT_TRUE(dynamic_cast<FixedBinAxis*>(axis2.get()));
     EXPECT_EQ(axis2->size(), converter.axisSize(1));
-    EXPECT_EQ(axis2->getMin(), converter.calculateMin(1, AxesUnits::QSPACE));
-    EXPECT_EQ(axis2->getMax(), converter.calculateMax(1, AxesUnits::QSPACE));
+    EXPECT_EQ(axis2->getMin(), converter.calculateMin(1, Axes::Units::QSPACE));
+    EXPECT_EQ(axis2->getMax(), converter.calculateMax(1, Axes::Units::QSPACE));
 
-    EXPECT_THROW(converter.createConvertedAxis(2, AxesUnits::DEFAULT), std::runtime_error);
+    EXPECT_THROW(converter.createConvertedAxis(2, Axes::Units::DEFAULT), std::runtime_error);
 }
 
 TEST_F(SphericalConverterTest, SphericalConverterClone)
@@ -87,34 +87,34 @@ TEST_F(SphericalConverterTest, SphericalConverterClone)
 
     EXPECT_EQ(P_clone->dimension(), 2u);
 
-    EXPECT_DOUBLE_EQ(P_clone->calculateMin(0, AxesUnits::DEFAULT), 0.0);
-    EXPECT_DOUBLE_EQ(P_clone->calculateMin(0, AxesUnits::NBINS), 0.0);
-    EXPECT_DOUBLE_EQ(P_clone->calculateMin(0, AxesUnits::RADIANS), 0.0);
-    EXPECT_DOUBLE_EQ(P_clone->calculateMin(0, AxesUnits::DEGREES), 0.0);
-    EXPECT_DOUBLE_EQ(P_clone->calculateMin(0, AxesUnits::QSPACE), 0.0);
-    EXPECT_THROW(P_clone->calculateMin(0, AxesUnits::MM), std::runtime_error);
-
-    EXPECT_DOUBLE_EQ(P_clone->calculateMax(0, AxesUnits::DEFAULT), 5.0);
-    EXPECT_DOUBLE_EQ(P_clone->calculateMax(0, AxesUnits::NBINS), 100.0);
-    EXPECT_DOUBLE_EQ(P_clone->calculateMax(0, AxesUnits::RADIANS), Units::deg2rad(5.0));
-    EXPECT_DOUBLE_EQ(P_clone->calculateMax(0, AxesUnits::DEGREES), 5.0);
-    EXPECT_DOUBLE_EQ(P_clone->calculateMax(0, AxesUnits::QSPACE), m_kfy);
-    EXPECT_THROW(P_clone->calculateMax(0, AxesUnits::MM), std::runtime_error);
-
-    EXPECT_DOUBLE_EQ(P_clone->calculateMin(1, AxesUnits::DEFAULT), -2.0);
-    EXPECT_DOUBLE_EQ(P_clone->calculateMin(1, AxesUnits::NBINS), 0.0);
-    EXPECT_DOUBLE_EQ(P_clone->calculateMin(1, AxesUnits::RADIANS), Units::deg2rad(-2.0));
-    EXPECT_DOUBLE_EQ(P_clone->calculateMin(1, AxesUnits::DEGREES), -2.0);
-    EXPECT_DOUBLE_EQ(P_clone->calculateMin(1, AxesUnits::QSPACE), m_kfz1 - m_kiz);
-    EXPECT_THROW(P_clone->calculateMin(1, AxesUnits::MM), std::runtime_error);
-
-    EXPECT_DOUBLE_EQ(P_clone->calculateMax(1, AxesUnits::DEFAULT), Units::rad2deg(1.5));
-    EXPECT_DOUBLE_EQ(P_clone->calculateMax(1, AxesUnits::NBINS), 70.0);
-    EXPECT_DOUBLE_EQ(P_clone->calculateMax(1, AxesUnits::RADIANS), 1.5);
-    EXPECT_DOUBLE_EQ(P_clone->calculateMax(1, AxesUnits::DEGREES), Units::rad2deg(1.5));
-    EXPECT_DOUBLE_EQ(P_clone->calculateMax(1, AxesUnits::QSPACE), m_kfz2 - m_kiz);
-    EXPECT_THROW(P_clone->calculateMax(1, AxesUnits::MM), std::runtime_error);
-
-    EXPECT_THROW(P_clone->calculateMin(2, AxesUnits::DEFAULT), std::runtime_error);
-    EXPECT_THROW(P_clone->calculateMax(2, AxesUnits::DEFAULT), std::runtime_error);
+    EXPECT_DOUBLE_EQ(P_clone->calculateMin(0, Axes::Units::DEFAULT), 0.0);
+    EXPECT_DOUBLE_EQ(P_clone->calculateMin(0, Axes::Units::NBINS), 0.0);
+    EXPECT_DOUBLE_EQ(P_clone->calculateMin(0, Axes::Units::RADIANS), 0.0);
+    EXPECT_DOUBLE_EQ(P_clone->calculateMin(0, Axes::Units::DEGREES), 0.0);
+    EXPECT_DOUBLE_EQ(P_clone->calculateMin(0, Axes::Units::QSPACE), 0.0);
+    EXPECT_THROW(P_clone->calculateMin(0, Axes::Units::MM), std::runtime_error);
+
+    EXPECT_DOUBLE_EQ(P_clone->calculateMax(0, Axes::Units::DEFAULT), 5.0);
+    EXPECT_DOUBLE_EQ(P_clone->calculateMax(0, Axes::Units::NBINS), 100.0);
+    EXPECT_DOUBLE_EQ(P_clone->calculateMax(0, Axes::Units::RADIANS), Units::deg2rad(5.0));
+    EXPECT_DOUBLE_EQ(P_clone->calculateMax(0, Axes::Units::DEGREES), 5.0);
+    EXPECT_DOUBLE_EQ(P_clone->calculateMax(0, Axes::Units::QSPACE), m_kfy);
+    EXPECT_THROW(P_clone->calculateMax(0, Axes::Units::MM), std::runtime_error);
+
+    EXPECT_DOUBLE_EQ(P_clone->calculateMin(1, Axes::Units::DEFAULT), -2.0);
+    EXPECT_DOUBLE_EQ(P_clone->calculateMin(1, Axes::Units::NBINS), 0.0);
+    EXPECT_DOUBLE_EQ(P_clone->calculateMin(1, Axes::Units::RADIANS), Units::deg2rad(-2.0));
+    EXPECT_DOUBLE_EQ(P_clone->calculateMin(1, Axes::Units::DEGREES), -2.0);
+    EXPECT_DOUBLE_EQ(P_clone->calculateMin(1, Axes::Units::QSPACE), m_kfz1 - m_kiz);
+    EXPECT_THROW(P_clone->calculateMin(1, Axes::Units::MM), std::runtime_error);
+
+    EXPECT_DOUBLE_EQ(P_clone->calculateMax(1, Axes::Units::DEFAULT), Units::rad2deg(1.5));
+    EXPECT_DOUBLE_EQ(P_clone->calculateMax(1, Axes::Units::NBINS), 70.0);
+    EXPECT_DOUBLE_EQ(P_clone->calculateMax(1, Axes::Units::RADIANS), 1.5);
+    EXPECT_DOUBLE_EQ(P_clone->calculateMax(1, Axes::Units::DEGREES), Units::rad2deg(1.5));
+    EXPECT_DOUBLE_EQ(P_clone->calculateMax(1, Axes::Units::QSPACE), m_kfz2 - m_kiz);
+    EXPECT_THROW(P_clone->calculateMax(1, Axes::Units::MM), std::runtime_error);
+
+    EXPECT_THROW(P_clone->calculateMin(2, Axes::Units::DEFAULT), std::runtime_error);
+    EXPECT_THROW(P_clone->calculateMax(2, Axes::Units::DEFAULT), std::runtime_error);
 }
diff --git a/Tests/UnitTests/Core/Detector/SphericalDetectorTest.cpp b/Tests/UnitTests/Core/Detector/SphericalDetectorTest.cpp
index 9245c1f1b194b93ddb1afd66133318f1bfef6488..ee18ccd39d99ccdc893831b29f6753996195710f 100644
--- a/Tests/UnitTests/Core/Detector/SphericalDetectorTest.cpp
+++ b/Tests/UnitTests/Core/Detector/SphericalDetectorTest.cpp
@@ -25,7 +25,7 @@ TEST_F(SphericalDetectorTest, initialState)
 
     // checking size
     EXPECT_EQ(0u, detector.dimension());
-    EXPECT_EQ(AxesUnits::RADIANS, detector.defaultAxesUnits());
+    EXPECT_EQ(Axes::Units::RADIANS, detector.defaultAxesUnits());
 
     // masks
     EXPECT_FALSE(detector.detectorMask()->hasMasks());
@@ -58,10 +58,6 @@ TEST_F(SphericalDetectorTest, constructionWithAxes)
     EXPECT_EQ(axis0.getMax(), detector.getAxis(0).getMax());
     EXPECT_EQ(axis1.getMin(), detector.getAxis(1).getMin());
     EXPECT_EQ(axis1.getMax(), detector.getAxis(1).getMax());
-
-    // clearing detector
-    detector.clear();
-    EXPECT_EQ(0u, detector.dimension());
 }
 
 // Construction of the detector via classical constructor.
diff --git a/Tests/UnitTests/Core/Fresnel/DepthProbeSimulationTest.cpp b/Tests/UnitTests/Core/Fresnel/DepthProbeSimulationTest.cpp
index 353700915d797f99767a671a57a61dd2ff688b6e..f69d0f6d839aab92d2a13720ea4fe2b7de084d0f 100644
--- a/Tests/UnitTests/Core/Fresnel/DepthProbeSimulationTest.cpp
+++ b/Tests/UnitTests/Core/Fresnel/DepthProbeSimulationTest.cpp
@@ -147,7 +147,7 @@ TEST_F(DepthProbeSimulationTest, ResultAquisition)
     sim->runSimulation();
     SimulationResult sim_result = sim->result();
 
-    EXPECT_THROW(sim_result.histogram2d(AxesUnits::MM), std::runtime_error);
+    EXPECT_THROW(sim_result.histogram2d(Axes::Units::MM), std::runtime_error);
 
     const std::unique_ptr<Histogram2D> depth_map(sim_result.histogram2d());
     EXPECT_EQ(10u * 12u, depth_map->getTotalNumberOfBins());
@@ -157,7 +157,7 @@ TEST_F(DepthProbeSimulationTest, ResultAquisition)
     EXPECT_EQ(-30.0, depth_map->getYaxis().getMin());
     EXPECT_EQ(10.0, depth_map->getYaxis().getMax());
 
-    EXPECT_THROW(sim_result.data(AxesUnits::MM), std::runtime_error);
+    EXPECT_THROW(sim_result.data(Axes::Units::MM), std::runtime_error);
 
     const auto output = sim_result.data();
     EXPECT_EQ(depth_map->getTotalNumberOfBins(), output->getAllocatedSize());
diff --git a/Tests/UnitTests/Core/Fresnel/SpecularSimulationTest.cpp b/Tests/UnitTests/Core/Fresnel/SpecularSimulationTest.cpp
index f0b3c5ab939fe2750d6e1fd74653edc8c7e5687f..8fd4851401278fbef57e84f7c7514278c349b7b8 100644
--- a/Tests/UnitTests/Core/Fresnel/SpecularSimulationTest.cpp
+++ b/Tests/UnitTests/Core/Fresnel/SpecularSimulationTest.cpp
@@ -183,9 +183,9 @@ TEST_F(SpecularSimulationTest, ConstructSimulation)
     EXPECT_EQ(data->getAllocatedSize(), 10u);
     EXPECT_EQ(data->getRank(), 1u);
 
-    EXPECT_NEAR(0.1 * Units::degree, sim_result.axis(AxesUnits::RADIANS).front(),
+    EXPECT_NEAR(0.1 * Units::degree, sim_result.axis(Axes::Units::RADIANS).front(),
                 Units::degree * 1e-11);
-    EXPECT_NEAR(1.9 * Units::degree, sim_result.axis(AxesUnits::RADIANS).back(),
+    EXPECT_NEAR(1.9 * Units::degree, sim_result.axis(Axes::Units::RADIANS).back(),
                 Units::degree * 1e-10);
 
     checkBeamState(*sim);
diff --git a/Tests/UnitTests/Core/Other/GISASSimulationTest.cpp b/Tests/UnitTests/Core/Other/GISASSimulationTest.cpp
index e32f0460bcd11b79aadbca11f523666c01cb6523..505c55bd6ceeb7391c269058aff4f6ae375dbafd 100644
--- a/Tests/UnitTests/Core/Other/GISASSimulationTest.cpp
+++ b/Tests/UnitTests/Core/Other/GISASSimulationTest.cpp
@@ -4,7 +4,9 @@
 #include "Core/SampleBuilderEngine/ISampleBuilder.h"
 #include "Tests/GTestWrapper/google_test.h"
 
-class GISASSimulationTest : public ::testing::Test {};
+class GISASSimulationTest : public ::testing::Test
+{
+};
 
 TEST_F(GISASSimulationTest, SimulationInitialState)
 {
diff --git a/Tests/UnitTests/Core/Parameters/RealParameterTest.cpp b/Tests/UnitTests/Core/Parameters/RealParameterTest.cpp
index e017ee6fd955ec20ede1647d321938d223e0ec7f..eeec3ff54ebd911565d0b2e2abd5ec2bec7407fc 100644
--- a/Tests/UnitTests/Core/Parameters/RealParameterTest.cpp
+++ b/Tests/UnitTests/Core/Parameters/RealParameterTest.cpp
@@ -37,8 +37,9 @@ TEST_F(RealParameterTest, extendedConstructor)
 {
     double value(42.0);
     bool is_changed(false);
-    RealParameter par("name", &value, "parent_name", [&]() { is_changed = true; },
-                      RealLimits::limited(1.0, 43.0), Attributes::free());
+    RealParameter par(
+        "name", &value, "parent_name", [&]() { is_changed = true; }, RealLimits::limited(1.0, 43.0),
+        Attributes::free());
     EXPECT_EQ(par.value(), value);
     EXPECT_EQ(par.limits(), RealLimits::limited(1.0, 43.0));
 
@@ -54,9 +55,9 @@ TEST_F(RealParameterTest, clone)
 {
     double value(42.0);
     bool is_changed(false);
-    std::unique_ptr<RealParameter> par(
-        new RealParameter("name", &value, "parent_name", [&]() { is_changed = true; },
-                          RealLimits::limited(1.0, 43.0), Attributes::free()));
+    std::unique_ptr<RealParameter> par(new RealParameter(
+        "name", &value, "parent_name", [&]() { is_changed = true; }, RealLimits::limited(1.0, 43.0),
+        Attributes::free()));
 
     // cloning and deleting original
     std::unique_ptr<RealParameter> clone(par->clone());
diff --git a/Tests/UnitTests/Core/Sample/FormFactorBasicTest.cpp b/Tests/UnitTests/Core/Sample/FormFactorBasicTest.cpp
index ae176e8ef0b9a655083f8e469f7b9d402c078e64..bc00a2695cc564d0e1134962ca05733528c9c414 100644
--- a/Tests/UnitTests/Core/Sample/FormFactorBasicTest.cpp
+++ b/Tests/UnitTests/Core/Sample/FormFactorBasicTest.cpp
@@ -1,8 +1,8 @@
 #include "Core/Basics/MathConstants.h"
 #include "Core/Basics/Units.h"
+#include "Core/HardParticle/HardParticles.h"
 #include "Core/Scattering/IFormFactorBorn.h"
 #include "Core/Scattering/Rotations.h"
-#include "Core/includeIncludes/HardParticles.h"
 #include "Tests/GTestWrapper/google_test.h"
 
 class FormFactorBasicTest : public ::testing::Test
diff --git a/Tests/UnitTests/Core/Sample/ParticleCoreShellTest.cpp b/Tests/UnitTests/Core/Sample/ParticleCoreShellTest.cpp
index 359a2b2168f93b04e7c7f097fc067a0a5e716e8c..66be06c48e6f3d04dcfa2a0475f308017fe18e38 100644
--- a/Tests/UnitTests/Core/Sample/ParticleCoreShellTest.cpp
+++ b/Tests/UnitTests/Core/Sample/ParticleCoreShellTest.cpp
@@ -1,10 +1,10 @@
 #include "Core/Particle/ParticleCoreShell.h"
 #include "Core/Basics/MathConstants.h"
 #include "Core/Basics/Units.h"
+#include "Core/HardParticle/HardParticles.h"
 #include "Core/Material/MaterialFactoryFuncs.h"
 #include "Core/Particle/Particle.h"
 #include "Core/Scattering/Rotations.h"
-#include "Core/includeIncludes/HardParticles.h"
 #include "Tests/GTestWrapper/google_test.h"
 
 class ParticleCoreShellTest : public ::testing::Test
diff --git a/Tests/UnitTests/Core/Sample/ParticleDistributionTest.cpp b/Tests/UnitTests/Core/Sample/ParticleDistributionTest.cpp
index 9b92e0fa43e8127a3d679eadede0aabd80cbb99b..76182eed5c61c07eacf56bbaa1d092a0ca98db72 100644
--- a/Tests/UnitTests/Core/Sample/ParticleDistributionTest.cpp
+++ b/Tests/UnitTests/Core/Sample/ParticleDistributionTest.cpp
@@ -1,9 +1,10 @@
 #include "Core/Particle/ParticleDistribution.h"
 #include "Core/Basics/Units.h"
+#include "Core/HardParticle/FormFactorCone.h"
+#include "Core/HardParticle/FormFactorFullSphere.h"
 #include "Core/Material/MaterialFactoryFuncs.h"
 #include "Core/Parametrization/Distributions.h"
 #include "Core/Particle/Particle.h"
-#include "Core/includeIncludes/FormFactors.h"
 #include "Tests/GTestWrapper/google_test.h"
 
 class ParticleDistributionTest : public ::testing::Test
diff --git a/Tests/UnitTests/Core/Sample/ParticleTest.cpp b/Tests/UnitTests/Core/Sample/ParticleTest.cpp
index 7121acf447272051595f94bd69e63dd9c29adb57..94d8c06a6e72892ed5e2b0f141e62d8c496f8300 100644
--- a/Tests/UnitTests/Core/Sample/ParticleTest.cpp
+++ b/Tests/UnitTests/Core/Sample/ParticleTest.cpp
@@ -7,12 +7,8 @@
 
 class ParticleTest : public ::testing::Test
 {
-protected:
-    ~ParticleTest();
 };
 
-ParticleTest::~ParticleTest() = default;
-
 TEST_F(ParticleTest, InitialState)
 {
     Particle particle;
@@ -84,7 +80,7 @@ TEST_F(ParticleTest, getChildren)
     EXPECT_EQ(children.size(), 1u);
 
     // Checking children of particle (with rotation)
-    particle.reset(new Particle(mat, sphere, RotationY(45.)));
+    particle = std::make_unique<Particle>(mat, sphere, RotationY(45.));
     children = particle->getChildren();
     EXPECT_EQ(children.size(), 2u);
 }
diff --git a/Tests/UnitTests/Core/Sample/RTTest.cpp b/Tests/UnitTests/Core/Sample/RTTest.cpp
index f0a51e328700e11ad735dab853992b74356c084f..1f8eee908c04648f67e370b80f235c6232ea1923 100644
--- a/Tests/UnitTests/Core/Sample/RTTest.cpp
+++ b/Tests/UnitTests/Core/Sample/RTTest.cpp
@@ -13,7 +13,6 @@
 class RTTest : public ::testing::Test
 {
 protected:
-    ~RTTest();
     void printCoeffs(const std::vector<ScalarRTCoefficients>& coeffs)
     { // for debug phases
         for (size_t i = 0; i < coeffs.size(); ++i) {
@@ -49,8 +48,6 @@ protected:
     std::vector<ScalarRTCoefficients> coeffs1, coeffs2;
 };
 
-RTTest::~RTTest() = default;
-
 TEST_F(RTTest, SplitLayer)
 {
     const int n = 40;
diff --git a/Tests/UnitTests/GUI/TestComponentProxyModel.cpp b/Tests/UnitTests/GUI/TestComponentProxyModel.cpp
index 1b46b9c724257e518778f18af619d735d58b70df..9d720346b3fbfebc416e00c799bf0c77981180da 100644
--- a/Tests/UnitTests/GUI/TestComponentProxyModel.cpp
+++ b/Tests/UnitTests/GUI/TestComponentProxyModel.cpp
@@ -222,8 +222,8 @@ TEST_F(TestComponentProxyModel, test_insertRows)
     ComponentProxyModel proxy;
     proxy.setSessionModel(&model);
 
-    EXPECT_TRUE(model.hasChildren(QModelIndex()) == false);
-    EXPECT_TRUE(proxy.hasChildren(QModelIndex()) == false);
+    EXPECT_FALSE(model.hasChildren(QModelIndex()));
+    EXPECT_FALSE(proxy.hasChildren(QModelIndex()));
 
     QSignalSpy spyProxy(&proxy, &ComponentProxyModel::layoutChanged);
 
@@ -270,10 +270,10 @@ TEST_F(TestComponentProxyModel, test_componentStrategy)
 
     // CylinderItem shouldn't exist anymore in proxy
     QModelIndex ffProxyIndex = proxy.mapFromSource(ffIndex);
-    EXPECT_TRUE(ffProxyIndex.isValid() == false);
+    EXPECT_FALSE(ffProxyIndex.isValid());
 
     QModelIndex radiusProxyIndex = proxy.mapFromSource(radiusIndex);
-    EXPECT_TRUE(radiusProxyIndex.isValid() == true);
+    EXPECT_TRUE(radiusProxyIndex.isValid());
     EXPECT_TRUE(radiusProxyIndex.parent() == groupProxyIndex);
 }
 
@@ -370,7 +370,7 @@ TEST_F(TestComponentProxyModel, test_setRootIndexLayer)
     EXPECT_EQ(proxy.columnCount(QModelIndex()), 2);
 
     QModelIndex multilayerProxyIndex = proxy.mapFromSource(model.indexOfItem(multilayer));
-    EXPECT_TRUE(multilayerProxyIndex.isValid() == false);
+    EXPECT_FALSE(multilayerProxyIndex.isValid());
 
     QModelIndex layerProxyIndex = proxy.mapFromSource(model.indexOfItem(layer1));
     EXPECT_EQ(proxy.rowCount(layerProxyIndex), 4); // thickness, material, slices, roughness
@@ -380,5 +380,5 @@ TEST_F(TestComponentProxyModel, test_setRootIndexLayer)
 
     // ParticleLayout should be excluded from proxy tree
     QModelIndex layoutProxyIndex = proxy.mapFromSource(model.indexOfItem(layout));
-    EXPECT_TRUE(layoutProxyIndex.isValid() == false);
+    EXPECT_FALSE(layoutProxyIndex.isValid());
 }
diff --git a/Tests/UnitTests/GUI/TestCsvImportAssistant.cpp b/Tests/UnitTests/GUI/TestCsvImportAssistant.cpp
index 817bf8d917722b0c458db036478388798413adbe..2a570a430c9cc75e368edf643290853e9f644970 100644
--- a/Tests/UnitTests/GUI/TestCsvImportAssistant.cpp
+++ b/Tests/UnitTests/GUI/TestCsvImportAssistant.cpp
@@ -79,7 +79,7 @@ TEST_F(TestCsvImportAssistant, test_readFile)
     CsvImportAssistant assistant(testFilename());
 
     assistant.setIntensityColumn(1);
-    assistant.setCoordinateColumn(3, AxesUnits::DEGREES);
+    assistant.setCoordinateColumn(3, Axes::Units::DEGREES);
     assistant.setFirstRow(5);
     assistant.setLastRow(7);
 
@@ -95,7 +95,7 @@ TEST_F(TestCsvImportAssistant, test_readFile)
     EXPECT_EQ(DataRank, 1u);
     EXPECT_EQ(AllocSize, 3u);
     EXPECT_EQ(RawDataVec, expected);
-    EXPECT_EQ(UnitsLabel, JobItemUtils::nameFromAxesUnits(AxesUnits::DEGREES));
-    EXPECT_EQ(AxisLabel0, QString::fromStdString(AxisNames::InitSpecAxis()[AxesUnits::DEGREES]));
+    EXPECT_EQ(UnitsLabel, JobItemUtils::nameFromAxesUnits(Axes::Units::DEGREES));
+    EXPECT_EQ(AxisLabel0, QString::fromStdString(AxisNames::InitSpecAxis()[Axes::Units::DEGREES]));
     EXPECT_EQ(AxisLabel1, SpecularDataAxesNames::y_axis_default_name);
 }
diff --git a/Tests/UnitTests/GUI/TestExternalProperty.cpp b/Tests/UnitTests/GUI/TestExternalProperty.cpp
index 698c236011853db41aee60f73232a71c9e03e9d0..f9b3133261342d5c68613d85783ecf6d7e87147a 100644
--- a/Tests/UnitTests/GUI/TestExternalProperty.cpp
+++ b/Tests/UnitTests/GUI/TestExternalProperty.cpp
@@ -15,22 +15,22 @@ public:
 TEST_F(TestExternalProperty, test_initialState)
 {
     ExternalProperty property;
-    EXPECT_TRUE(property.isValid() == false);
-    EXPECT_TRUE(property.color().isValid() == false);
-    EXPECT_TRUE(property.identifier().isEmpty() == true);
-    EXPECT_TRUE(property.text().isEmpty() == true);
+    EXPECT_FALSE(property.isValid());
+    EXPECT_FALSE(property.color().isValid());
+    EXPECT_TRUE(property.identifier().isEmpty());
+    EXPECT_TRUE(property.text().isEmpty());
 
     // changing any property should change state to valid
     property.setColor(QColor(Qt::red));
     EXPECT_TRUE(property.color() == QColor(Qt::red));
-    EXPECT_TRUE(property.isValid() == true);
+    EXPECT_TRUE(property.isValid());
     property.setColor(QColor());
-    EXPECT_TRUE(property.isValid() == false);
+    EXPECT_FALSE(property.isValid());
     property.setText("aaa");
     EXPECT_TRUE(property.text() == "aaa");
-    EXPECT_TRUE(property.isValid() == true);
+    EXPECT_TRUE(property.isValid());
     property.setText(QString());
-    EXPECT_TRUE(property.isValid() == false);
+    EXPECT_FALSE(property.isValid());
 }
 
 //! Testing equality operators.
diff --git a/Tests/UnitTests/GUI/TestFormFactorItems.cpp b/Tests/UnitTests/GUI/TestFormFactorItems.cpp
index 37f6b56933857b95cb3476fbc316aee13372d527..20398a18e4e0e74d9dd261c0cdb3ef3272de81ed 100644
--- a/Tests/UnitTests/GUI/TestFormFactorItems.cpp
+++ b/Tests/UnitTests/GUI/TestFormFactorItems.cpp
@@ -1,5 +1,5 @@
 #include "Core/Basics/Units.h"
-#include "Core/includeIncludes/FormFactors.h"
+#include "Core/HardParticle/FormFactorAnisoPyramid.h"
 #include "Fit/TestEngine/Numeric.h"
 #include "GUI/coregui/Models/FormFactorItems.h"
 #include "Tests/GTestWrapper/google_test.h"
diff --git a/Tests/UnitTests/GUI/TestGUICoreObjectCorrespondence.cpp b/Tests/UnitTests/GUI/TestGUICoreObjectCorrespondence.cpp
index e1a97876d949eebc8c074663ba76e6dac228b3c0..9b054c6c96a43c9ef36ea083789f0f78922dd971 100644
--- a/Tests/UnitTests/GUI/TestGUICoreObjectCorrespondence.cpp
+++ b/Tests/UnitTests/GUI/TestGUICoreObjectCorrespondence.cpp
@@ -1,7 +1,7 @@
+#include "Core/Aggregate/InterferenceFunctions.h"
 #include "Core/Basics/Units.h"
+#include "Core/HardParticle/HardParticles.h"
 #include "Core/Parametrization/ParameterPool.h"
-#include "Core/includeIncludes/FormFactors.h"
-#include "Core/includeIncludes/InterferenceFunctions.h"
 #include "GUI/coregui/Models/FormFactorItems.h"
 #include "GUI/coregui/Models/InterferenceFunctionItems.h"
 #include "Tests/GTestWrapper/google_test.h"
diff --git a/Tests/UnitTests/GUI/TestGroupItem.cpp b/Tests/UnitTests/GUI/TestGroupItem.cpp
index 99f76f900dd6305254a0dbe112351b682b89ce49..86b837fa42ba23ce4245adcea77def25d67eb0a4 100644
--- a/Tests/UnitTests/GUI/TestGroupItem.cpp
+++ b/Tests/UnitTests/GUI/TestGroupItem.cpp
@@ -76,7 +76,7 @@ TEST_F(TestGroupItem, test_CreateGroup)
 
     // checking current variant
     QVariant value = groupItem->value();
-    EXPECT_TRUE(value.canConvert<ComboProperty>() == true);
+    EXPECT_TRUE(value.canConvert<ComboProperty>());
     ComboProperty combo = value.value<ComboProperty>();
     EXPECT_EQ(combo.getValues(), groupInfo.itemLabels());
     int index = groupInfo.itemTypes().indexOf(groupInfo.defaultType());
diff --git a/Tests/UnitTests/GUI/TestMapperCases.cpp b/Tests/UnitTests/GUI/TestMapperCases.cpp
index 2c841c6f4481638cf42f43e6a452010da2b7576b..c0436e1343bc80f993623aab7b7cafbba2396148 100644
--- a/Tests/UnitTests/GUI/TestMapperCases.cpp
+++ b/Tests/UnitTests/GUI/TestMapperCases.cpp
@@ -28,7 +28,7 @@ TEST_F(TestMapperCases, test_ParticeleCompositionUpdate)
     // composition added to distribution should have abundance disabled
     SessionItem* distribution = model.insertNewItem("ParticleDistribution", layout->index());
     SessionItem* composition = model.insertNewItem("ParticleComposition", distribution->index());
-    EXPECT_TRUE(composition->getItem(ParticleItem::P_ABUNDANCE)->isEnabled() == false);
+    EXPECT_FALSE(composition->getItem(ParticleItem::P_ABUNDANCE)->isEnabled());
 
     composition = distribution->takeRow(ParentRow(*composition));
     EXPECT_TRUE(composition->getItem(ParticleItem::P_ABUNDANCE)->isEnabled());
@@ -45,9 +45,9 @@ TEST_F(TestMapperCases, test_SimulationOptionsComputationToggle)
     ComboProperty combo =
         item->getItemValue(SimulationOptionsItem::P_COMPUTATION_METHOD).value<ComboProperty>();
     EXPECT_EQ(combo.getValue(), "Analytical");
-    EXPECT_TRUE(item->getItem(SimulationOptionsItem::P_MC_POINTS)->isEnabled() == false);
+    EXPECT_FALSE(item->getItem(SimulationOptionsItem::P_MC_POINTS)->isEnabled());
 
     combo.setValue("Monte-Carlo Integration");
     item->setItemValue(SimulationOptionsItem::P_COMPUTATION_METHOD, combo.variant());
-    EXPECT_TRUE(item->getItem(SimulationOptionsItem::P_MC_POINTS)->isEnabled() == true);
+    EXPECT_TRUE(item->getItem(SimulationOptionsItem::P_MC_POINTS)->isEnabled());
 }
diff --git a/Tests/UnitTests/GUI/TestMapperForItem.cpp b/Tests/UnitTests/GUI/TestMapperForItem.cpp
index 7b9d844c8b7a083bfa2299f52444a55f6e3a42bb..f4549c7e2688ada7a7b2de8272789e32214cd70a 100644
--- a/Tests/UnitTests/GUI/TestMapperForItem.cpp
+++ b/Tests/UnitTests/GUI/TestMapperForItem.cpp
@@ -96,7 +96,6 @@ class TestMapperForItem : public ::testing::Test
 {
 public:
     TestMapperForItem() : m_mapped_item(0) {}
-    ~TestMapperForItem();
 
     void setItem(SessionItem* item, Widget* widget = 0, bool with_subscription = false)
     {
@@ -111,8 +110,6 @@ public:
     std::unique_ptr<ModelMapper> m_mapper;
 };
 
-TestMapperForItem::~TestMapperForItem() = default;
-
 TEST_F(TestMapperForItem, test_initialCondition)
 {
     Widget w;
diff --git a/Tests/UnitTests/GUI/TestMaterialModel.cpp b/Tests/UnitTests/GUI/TestMaterialModel.cpp
index 8befb501a23d53a15e4d596e2547c5862547f0f1..82215a56f8320c9343b7b87eb3df95085d2c9175 100644
--- a/Tests/UnitTests/GUI/TestMaterialModel.cpp
+++ b/Tests/UnitTests/GUI/TestMaterialModel.cpp
@@ -123,7 +123,7 @@ TEST_F(TestMaterialModel, defaultMaterialProperty)
     // testing default material property from MaterialItemUtils
     // in the absence of any materials, property should be in invalid state
     ExternalProperty property = MaterialItemUtils::defaultMaterialProperty();
-    EXPECT_TRUE(property.isValid() == false);
+    EXPECT_FALSE(property.isValid());
 
     // adding materials to the model, default property should refer to first material in a model
     auto mat1 = model.addRefractiveMaterial("Something1", 1.0, 2.0);
diff --git a/Tests/UnitTests/GUI/TestMaterialPropertyController.cpp b/Tests/UnitTests/GUI/TestMaterialPropertyController.cpp
index 7e5616e5b355c05bb27440da7f4c1a7472c457fe..ec7acd982dc5a9551c6647c862a00f3297ad8dee 100644
--- a/Tests/UnitTests/GUI/TestMaterialPropertyController.cpp
+++ b/Tests/UnitTests/GUI/TestMaterialPropertyController.cpp
@@ -56,7 +56,7 @@ class TestMaterialPropertyController : public ::testing::Test
 //    materialModel.removeRows(0, 1, QModelIndex());
 //    EXPECT_EQ(property_changed, 3);
 //    property = layer->getItemValue(LayerItem::P_MATERIAL).value<ExternalProperty>();
-//    EXPECT_TRUE(property.isValid() == false);
+//    EXPECT_FALSE(property.isValid() );
 //}
 
 //! Test MaterialProperty update in sample items when working on model clone.
@@ -122,7 +122,7 @@ TEST_F(TestMaterialPropertyController, test_ControllerInEditorContext)
     // layer2 should have undefined material property
     ExternalProperty property =
         layer2->getItemValue(LayerItem::P_MATERIAL).value<ExternalProperty>();
-    EXPECT_TRUE(property.isValid() == false);
+    EXPECT_FALSE(property.isValid());
 
     // layer3 should have different MaterialProperty name
     property = layer3->getItemValue(LayerItem::P_MATERIAL).value<ExternalProperty>();
diff --git a/Tests/UnitTests/GUI/TestMessageService.cpp b/Tests/UnitTests/GUI/TestMessageService.cpp
index b3089712decfe11de2dcc9fb3a8d679ebdf347e3..3ed72f0fb48b708d569484f1f350f17d827ebf96 100644
--- a/Tests/UnitTests/GUI/TestMessageService.cpp
+++ b/Tests/UnitTests/GUI/TestMessageService.cpp
@@ -26,7 +26,7 @@ public:
     class Sender : public QObject
     {
     public:
-        Sender(const QString& name) { setObjectName(name); }
+        explicit Sender(const QString& name) { setObjectName(name); }
     };
 };
 
diff --git a/Tests/UnitTests/GUI/TestModelUtils.cpp b/Tests/UnitTests/GUI/TestModelUtils.cpp
index cfaadcfa4e19c5dd3039f23b4343872ebaff3c12..4735e92a07707920638d289acb6357cc45175269 100644
--- a/Tests/UnitTests/GUI/TestModelUtils.cpp
+++ b/Tests/UnitTests/GUI/TestModelUtils.cpp
@@ -34,7 +34,7 @@ TEST_F(TestModelUtils, test_topItemNames)
     // inserting three top items
     auto item = model.insertNewItem("MultiLayer");
     item->setItemName("name1");
-    item = model.insertNewItem("Layer");
+    model.insertNewItem("Layer");
     item = model.insertNewItem("MultiLayer");
     item->setItemName("name2");
 
diff --git a/Tests/UnitTests/GUI/TestOutputDataIOService.cpp b/Tests/UnitTests/GUI/TestOutputDataIOService.cpp
index 93fef24291a10ed3c4372fbe3ba2c24ddd3045f4..43eefcbb7e413f039792f35a5e49f035fa1771eb 100644
--- a/Tests/UnitTests/GUI/TestOutputDataIOService.cpp
+++ b/Tests/UnitTests/GUI/TestOutputDataIOService.cpp
@@ -99,11 +99,11 @@ TEST_F(TestOutputDataIOService, test_OutputDataSaveInfo)
     QTest::qSleep(nap_time);
 
     OutputDataSaveInfo info = OutputDataSaveInfo::createSaved(item);
-    EXPECT_TRUE(info.wasModifiedSinceLastSave() == false);
+    EXPECT_FALSE(info.wasModifiedSinceLastSave());
 
     QTest::qSleep(nap_time);
     item->setLastModified(QDateTime::currentDateTime());
-    EXPECT_TRUE(info.wasModifiedSinceLastSave() == true);
+    EXPECT_TRUE(info.wasModifiedSinceLastSave());
 }
 
 //! Tests OutputDataDirHistory class intended for storing save history of several
@@ -121,18 +121,18 @@ TEST_F(TestOutputDataIOService, test_OutputDataDirHistory)
 
     // empty history
     OutputDataDirHistory history;
-    EXPECT_TRUE(history.contains(item1) == false);
+    EXPECT_FALSE(history.contains(item1));
     // non-existing item is treated as modified
-    EXPECT_TRUE(history.wasModifiedSinceLastSave(item1) == true);
+    EXPECT_TRUE(history.wasModifiedSinceLastSave(item1));
 
     // Saving item in a history
     history.markAsSaved(item1);
     history.markAsSaved(item2);
 
-    EXPECT_TRUE(history.contains(item1) == true);
+    EXPECT_TRUE(history.contains(item1));
     // Empty DataItems are not added to history:
-    EXPECT_TRUE(history.contains(item2) == false);
-    EXPECT_TRUE(history.wasModifiedSinceLastSave(item1) == false);
+    EXPECT_FALSE(history.contains(item2));
+    EXPECT_FALSE(history.wasModifiedSinceLastSave(item1));
 
     // Attempt to save same item second time
     EXPECT_THROW(history.markAsSaved(item1), GUIHelpers::Error);
@@ -141,7 +141,7 @@ TEST_F(TestOutputDataIOService, test_OutputDataDirHistory)
     QTest::qSleep(10);
     item1->setLastModified(QDateTime::currentDateTime());
 
-    EXPECT_TRUE(history.wasModifiedSinceLastSave(item1) == true);
+    EXPECT_TRUE(history.wasModifiedSinceLastSave(item1));
 }
 
 //! Tests OutputDataIOHistory class (save info for several independent directories).
@@ -174,10 +174,10 @@ TEST_F(TestOutputDataIOService, test_OutputDataIOHistory)
     history.setHistory("dir1", dirHistory1);
     history.setHistory("dir2", dirHistory2);
 
-    EXPECT_TRUE(history.wasModifiedSinceLastSave("dir1", item1) == true);
-    EXPECT_TRUE(history.wasModifiedSinceLastSave("dir2", item1) == true);
+    EXPECT_TRUE(history.wasModifiedSinceLastSave("dir1", item1));
+    EXPECT_TRUE(history.wasModifiedSinceLastSave("dir2", item1));
 
-    EXPECT_TRUE(history.wasModifiedSinceLastSave("dir1", item2) == false);
+    EXPECT_FALSE(history.wasModifiedSinceLastSave("dir1", item2));
     EXPECT_TRUE(history.wasModifiedSinceLastSave("dir2", item2)
                 == true); // since item2 doesn't exist
 
@@ -241,7 +241,7 @@ TEST_F(TestOutputDataIOService, test_OutputDataIOService)
     EXPECT_TRUE(GuiUnittestUtils::isTheSame(fname2new, *realData2->dataItem()->getOutputData()));
 
     // Check that file with old name was removed.
-    EXPECT_TRUE(ProjectUtils::exists(fname2) == false);
+    EXPECT_FALSE(ProjectUtils::exists(fname2));
 }
 
 TEST_F(TestOutputDataIOService, test_RealDataItemWithNativeData)
diff --git a/Tests/UnitTests/GUI/TestParticleCoreShell.cpp b/Tests/UnitTests/GUI/TestParticleCoreShell.cpp
index 24f01488f01cf6ce2a6da57f16a01345da5b02bd..1496ca23b72641f4ac510520bddb0d2b759aa883 100644
--- a/Tests/UnitTests/GUI/TestParticleCoreShell.cpp
+++ b/Tests/UnitTests/GUI/TestParticleCoreShell.cpp
@@ -106,7 +106,7 @@ TEST_F(TestParticleCoreShell, test_distributionContext)
     // coreshell particle
     SessionItem* coreshell = model.insertNewItem("ParticleCoreShell");
     coreshell->setItemValue(ParticleItem::P_ABUNDANCE, 0.2);
-    EXPECT_TRUE(coreshell->getItem(ParticleItem::P_ABUNDANCE)->isEnabled() == true);
+    EXPECT_TRUE(coreshell->getItem(ParticleItem::P_ABUNDANCE)->isEnabled());
     EXPECT_EQ(coreshell->getItemValue(ParticleItem::P_ABUNDANCE).toDouble(), 0.2);
 
     // create distribution, adding coreshell to it
diff --git a/Tests/UnitTests/GUI/TestParticleDistributionItem.cpp b/Tests/UnitTests/GUI/TestParticleDistributionItem.cpp
index 52bf817015bccec54e87e544083f4ed4df8fc7d2..e28003664601315bf2c114799fa1d233633f7669 100644
--- a/Tests/UnitTests/GUI/TestParticleDistributionItem.cpp
+++ b/Tests/UnitTests/GUI/TestParticleDistributionItem.cpp
@@ -1,8 +1,8 @@
+#include "Core/HardParticle/HardParticles.h"
 #include "Core/Material/MaterialFactoryFuncs.h"
 #include "Core/Parametrization/Distributions.h"
 #include "Core/Particle/Particle.h"
 #include "Core/Particle/ParticleDistribution.h"
-#include "Core/includeIncludes/FormFactors.h"
 #include "GUI/coregui/Models/ComboProperty.h"
 #include "GUI/coregui/Models/DistributionItems.h"
 #include "GUI/coregui/Models/MaterialModel.h"
diff --git a/Tests/UnitTests/GUI/TestParticleItem.cpp b/Tests/UnitTests/GUI/TestParticleItem.cpp
index 59210203b7ed46d99a99ab56bc4e4058a26270d5..9160d060b02bb4baf6652123702d11a2d18fd61b 100644
--- a/Tests/UnitTests/GUI/TestParticleItem.cpp
+++ b/Tests/UnitTests/GUI/TestParticleItem.cpp
@@ -54,17 +54,17 @@ TEST_F(TestParticleItem, test_distributionContext)
     SampleModel model;
     SessionItem* particle = model.insertNewItem("Particle");
     particle->setItemValue(ParticleItem::P_ABUNDANCE, 0.2);
-    EXPECT_TRUE(particle->getItem(ParticleItem::P_ABUNDANCE)->isEnabled() == true);
+    EXPECT_TRUE(particle->getItem(ParticleItem::P_ABUNDANCE)->isEnabled());
     EXPECT_EQ(particle->getItemValue(ParticleItem::P_ABUNDANCE).toDouble(), 0.2);
 
     // adding particle to distribution, checking that abundance is default
     SessionItem* distribution = model.insertNewItem("ParticleDistribution");
     model.moveItem(particle, distribution, -1, ParticleDistributionItem::T_PARTICLES);
-    EXPECT_TRUE(particle->getItem(ParticleItem::P_ABUNDANCE)->isEnabled() == false);
+    EXPECT_FALSE(particle->getItem(ParticleItem::P_ABUNDANCE)->isEnabled());
     EXPECT_EQ(particle->getItemValue(ParticleItem::P_ABUNDANCE).toDouble(), 1.0);
 
     // removing particle, checking that abundance is enabled again
     distribution->takeRow(ParentRow(*particle));
-    EXPECT_TRUE(particle->getItem(ParticleItem::P_ABUNDANCE)->isEnabled() == true);
+    EXPECT_TRUE(particle->getItem(ParticleItem::P_ABUNDANCE)->isEnabled());
     delete particle;
 }
diff --git a/Tests/UnitTests/GUI/TestProjectDocument.cpp b/Tests/UnitTests/GUI/TestProjectDocument.cpp
index fd740fcfb17d98ea70a8db96cfdfa77610d62423..c7a482f9102d6e695428d408cc1771465802188b 100644
--- a/Tests/UnitTests/GUI/TestProjectDocument.cpp
+++ b/Tests/UnitTests/GUI/TestProjectDocument.cpp
@@ -65,8 +65,8 @@ TEST_F(TestProjectDocument, test_projectDocument)
     document.setApplicationModels(&models);
 
     // Checking initial document status
-    EXPECT_TRUE(document.isModified() == false);
-    EXPECT_TRUE(document.hasValidNameAndPath() == false);
+    EXPECT_FALSE(document.isModified());
+    EXPECT_FALSE(document.hasValidNameAndPath());
     EXPECT_EQ(document.projectDir(), QString());
     EXPECT_EQ(document.projectName(), QString());
     EXPECT_EQ(document.projectFileName(), QString());
diff --git a/Tests/UnitTests/GUI/TestProjectUtils.cpp b/Tests/UnitTests/GUI/TestProjectUtils.cpp
index 1bc38497f6fd9d32ece1afaa6dbe70578cff8b68..8dd95ad3f44643e22557a0f621effcffee27bbe1 100644
--- a/Tests/UnitTests/GUI/TestProjectUtils.cpp
+++ b/Tests/UnitTests/GUI/TestProjectUtils.cpp
@@ -31,8 +31,8 @@ TEST_F(TestProjectUtils, test_nonXMLDataInDir)
 
     QDir dir(projectDir);
     if (dir.exists()) {
-        EXPECT_TRUE(ProjectUtils::removeRecursively(projectDir) == true);
-        EXPECT_TRUE(dir.exists() == false);
+        EXPECT_TRUE(ProjectUtils::removeRecursively(projectDir));
+        EXPECT_FALSE(dir.exists());
     }
 
     GUIHelpers::createSubdir(".", projectDir);
@@ -61,7 +61,7 @@ TEST_F(TestProjectUtils, test_nonXMLDataInDir)
     EXPECT_EQ(test_nonxml_files, nonxml);
 
     std::cout << "remove nonxml files ..." << std::endl;
-    EXPECT_TRUE(ProjectUtils::removeFiles(projectDir, nonxml) == true);
+    EXPECT_TRUE(ProjectUtils::removeFiles(projectDir, nonxml));
 
     std::cout << "check that no files left ..." << std::endl;
     nonxml = ProjectUtils::nonXMLDataInDir(projectDir);
diff --git a/Tests/UnitTests/GUI/TestProxyModelStrategy.cpp b/Tests/UnitTests/GUI/TestProxyModelStrategy.cpp
index 800ae4f79a89053be95c6264434188c0ddf73af0..15e7746b136a7563818c1e9c6bfa83b55b2a393d 100644
--- a/Tests/UnitTests/GUI/TestProxyModelStrategy.cpp
+++ b/Tests/UnitTests/GUI/TestProxyModelStrategy.cpp
@@ -123,7 +123,7 @@ TEST_F(TestProxyModelStrategy, test_componentStrategyParticle)
     QModelIndex radiusProxyIndex = strategy.sourceToProxy().value(radiusIndex);
     EXPECT_TRUE(particleProxyIndex.isValid());
     EXPECT_TRUE(groupProxyIndex.isValid());
-    EXPECT_TRUE(ffProxyIndex.isValid() == false); // ff is excluded from hierarchy
+    EXPECT_FALSE(ffProxyIndex.isValid()); // ff is excluded from hierarchy
     EXPECT_TRUE(radiusProxyIndex.isValid());
 
     // Checking "real" parents of indices
@@ -159,12 +159,12 @@ TEST_F(TestProxyModelStrategy, test_setRootIndex)
     QModelIndex groupProxyIndex = strategy.sourceToProxy().value(groupIndex);
     QModelIndex ffProxyIndex = strategy.sourceToProxy().value(ffIndex);
     QModelIndex radiusProxyIndex = strategy.sourceToProxy().value(radiusIndex);
-    EXPECT_TRUE(particleProxyIndex.isValid() == false); // particle is not in a tree
+    EXPECT_FALSE(particleProxyIndex.isValid()); // particle is not in a tree
     EXPECT_TRUE(groupProxyIndex.isValid());
     EXPECT_EQ(groupProxyIndex.row(), 0);
     EXPECT_EQ(groupProxyIndex.column(), 0);
     EXPECT_TRUE(groupProxyIndex.parent() == QModelIndex());
-    EXPECT_TRUE(ffProxyIndex.isValid() == false); // ff is excluded from hierarchy
+    EXPECT_FALSE(ffProxyIndex.isValid()); // ff is excluded from hierarchy
     EXPECT_TRUE(radiusProxyIndex.isValid());
 
     // checking that new parent of groupItem is root
diff --git a/Tests/UnitTests/GUI/TestSavingSpecularData.cpp b/Tests/UnitTests/GUI/TestSavingSpecularData.cpp
index b5e6666bab93340737d4c61872d04189a979d9b7..c6c650ad1c6cb1da385090c63b1bc4c39173bc1b 100644
--- a/Tests/UnitTests/GUI/TestSavingSpecularData.cpp
+++ b/Tests/UnitTests/GUI/TestSavingSpecularData.cpp
@@ -150,7 +150,7 @@ TEST_F(TestSavingSpecularData, test_setLastModified)
     EXPECT_FALSE(info.wasModifiedSinceLastSave());
 
     QTest::qSleep(nap_time);
-    item->init(*m_axis.get(), "Degrees");
+    item->init(*m_axis, "Degrees");
     EXPECT_TRUE(info.wasModifiedSinceLastSave());
 
     info = OutputDataSaveInfo::createSaved(item);
diff --git a/Tests/UnitTests/GUI/TestSessionItem.cpp b/Tests/UnitTests/GUI/TestSessionItem.cpp
index 1ebb4c9cfa22e4f44823d70cc299e68df92fed70..cb2d30975fab10a1718580a1431daf0285d1246f 100644
--- a/Tests/UnitTests/GUI/TestSessionItem.cpp
+++ b/Tests/UnitTests/GUI/TestSessionItem.cpp
@@ -231,7 +231,7 @@ TEST_F(TestSessionItem, dataRoles)
     EXPECT_TRUE(item->roleProperty(Qt::DisplayRole) == 5432);
     EXPECT_TRUE(item->roleProperty(Qt::EditRole) == 5432);
     for (int i = 0; i < 10; i++) {
-        EXPECT_TRUE(item->roleProperty(SessionFlags::EndSessionRoles + i).isValid() == false);
+        EXPECT_FALSE(item->roleProperty(SessionFlags::EndSessionRoles + i).isValid());
         item->setRoleProperty(SessionFlags::EndSessionRoles + i, i);
         EXPECT_TRUE(item->roleProperty(SessionFlags::EndSessionRoles + i) == i);
     }
diff --git a/Tests/UnitTests/Numeric/FormFactorSpecializationTest.cpp b/Tests/UnitTests/Numeric/FormFactorSpecializationTest.cpp
index 98a821d9cfa00be7aa205fedd72361f536d230da..7dc43e9b7e48ec0053eef660a5cc00881ae63b52 100644
--- a/Tests/UnitTests/Numeric/FormFactorSpecializationTest.cpp
+++ b/Tests/UnitTests/Numeric/FormFactorSpecializationTest.cpp
@@ -1,4 +1,4 @@
-#include "Core/includeIncludes/HardParticles.h"
+#include "Core/HardParticle/HardParticles.h"
 #include "Tests/GTestWrapper/google_test.h"
 #include "Tests/UnitTests/Numeric/FormFactorTest.h"
 
diff --git a/Tests/UnitTests/Numeric/FormFactorSymmetryTest.cpp b/Tests/UnitTests/Numeric/FormFactorSymmetryTest.cpp
index f217197c906563b987a6254974931ca3521fa5e4..b799434eda8115cb3bd639ab6f78a467a36ec4ea 100644
--- a/Tests/UnitTests/Numeric/FormFactorSymmetryTest.cpp
+++ b/Tests/UnitTests/Numeric/FormFactorSymmetryTest.cpp
@@ -1,5 +1,5 @@
 #include "Core/Basics/MathConstants.h"
-#include "Core/includeIncludes/HardParticles.h"
+#include "Core/HardParticle/HardParticles.h"
 #include "Tests/GTestWrapper/google_test.h"
 #include "Tests/UnitTests/Numeric/FormFactorTest.h"
 
@@ -32,24 +32,27 @@ protected:
 TEST_F(FFSymmetryTest, Prism3)
 {
     FormFactorPrism3 p(.83, .45);
-    run_test(&p, [](const cvector_t& q) -> cvector_t { return q.rotatedZ(M_TWOPI / 3); }, 1e-12,
-             1e-99, 2e2);
+    run_test(
+        &p, [](const cvector_t& q) -> cvector_t { return q.rotatedZ(M_TWOPI / 3); }, 1e-12, 1e-99,
+        2e2);
 }
 
 TEST_F(FFSymmetryTest, Prism6)
 {
     FormFactorPrism6 p(1.33, .42);
-    run_test(&p, [](const cvector_t& q) -> cvector_t { return q.rotatedZ(M_PI / 3); }, 1e-12, 1e-99,
-             50);
-    run_test(&p, [](const cvector_t& q) -> cvector_t { return q.rotatedZ(-M_TWOPI / 3); }, 3.8e-12,
-             1e-99, 50);
+    run_test(
+        &p, [](const cvector_t& q) -> cvector_t { return q.rotatedZ(M_PI / 3); }, 1e-12, 1e-99, 50);
+    run_test(
+        &p, [](const cvector_t& q) -> cvector_t { return q.rotatedZ(-M_TWOPI / 3); }, 3.8e-12,
+        1e-99, 50);
 }
 
 TEST_F(FFSymmetryTest, Tetrahedron)
 {
     FormFactorTetrahedron p(8.43, .25, .53);
-    run_test(&p, [](const cvector_t& q) -> cvector_t { return q.rotatedZ(M_TWOPI / 3); }, 6e-12,
-             1e-99, 2e2);
+    run_test(
+        &p, [](const cvector_t& q) -> cvector_t { return q.rotatedZ(M_TWOPI / 3); }, 6e-12, 1e-99,
+        2e2);
     // Linux: 3e-12, relaxed for Mac
 }
 
@@ -57,15 +60,17 @@ TEST_F(FFSymmetryTest, Cone6_flat)
 {
     // TODO for larger q, imag(ff) is nan
     FormFactorCone6 p(4.3, .09, .1);
-    run_test(&p, [](const cvector_t& q) -> cvector_t { return q.rotatedZ(-M_PI / 3); }, 1e-11,
-             1e-99, 50);
+    run_test(
+        &p, [](const cvector_t& q) -> cvector_t { return q.rotatedZ(-M_PI / 3); }, 1e-11, 1e-99,
+        50);
 }
 
 TEST_F(FFSymmetryTest, Cone6_steep)
 {
     FormFactorCone6 p(.23, 3.5, .999 * M_PI / 2);
-    run_test(&p, [](const cvector_t& q) -> cvector_t { return q.rotatedZ(-M_PI / 3); }, 1e-11,
-             1e-99, 50);
+    run_test(
+        &p, [](const cvector_t& q) -> cvector_t { return q.rotatedZ(-M_PI / 3); }, 1e-11, 1e-99,
+        50);
 }
 
 //*********** spheroids ***************
@@ -73,24 +78,27 @@ TEST_F(FFSymmetryTest, Cone6_steep)
 TEST_F(FFSymmetryTest, HemiEllipsoid)
 {
     FormFactorHemiEllipsoid p(.53, .78, 1.3);
-    run_test(&p, [](const cvector_t& q) -> cvector_t { return cvector_t(-q.x(), q.y(), q.z()); },
-             1e-12, 1e-99, 2e2);
-    run_test(&p, [](const cvector_t& q) -> cvector_t { return cvector_t(q.x(), -q.y(), q.z()); },
-             1e-12, 1e-99, 2e2);
+    run_test(
+        &p, [](const cvector_t& q) -> cvector_t { return cvector_t(-q.x(), q.y(), q.z()); }, 1e-12,
+        1e-99, 2e2);
+    run_test(
+        &p, [](const cvector_t& q) -> cvector_t { return cvector_t(q.x(), -q.y(), q.z()); }, 1e-12,
+        1e-99, 2e2);
 }
 
 TEST_F(FFSymmetryTest, TruncatedSphere)
 {
     FormFactorTruncatedSphere p(.79, .34, 0);
-    run_test(&p, [](const cvector_t& q) -> cvector_t { return q.rotatedZ(M_PI / 3.13698); }, 1e-10,
-             1e-99, 2e2);
+    run_test(
+        &p, [](const cvector_t& q) -> cvector_t { return q.rotatedZ(M_PI / 3.13698); }, 1e-10,
+        1e-99, 2e2);
 }
 
 TEST_F(FFSymmetryTest, FullSpheroid)
 {
     FormFactorFullSpheroid p(.73, .36);
-    run_test(&p, [](const cvector_t& q) -> cvector_t { return q.rotatedZ(.123); }, 1e-12, 1e-99,
-             2e2);
+    run_test(
+        &p, [](const cvector_t& q) -> cvector_t { return q.rotatedZ(.123); }, 1e-12, 1e-99, 2e2);
 }
 
 // ****** TODO: tests that do not pass for the full q range *********
diff --git a/Wrap/python/plot_utils.py b/Wrap/python/plot_utils.py
index 9ba1ff18f6d16806ffc7bfbb3ed444f408009423..82dd6ed698374cfcfa384759f43412d6229748a8 100644
--- a/Wrap/python/plot_utils.py
+++ b/Wrap/python/plot_utils.py
@@ -137,7 +137,7 @@ def plot_histogram(hist, zmin=None, zmax=None, xlabel=None, ylabel=None, zlabel=
                zlabel=zlabel, title=title, axes_limits=axes_limits, **kwargs)
 
 
-def plot_colormap(result, zmin=None, zmax=None, units=ba.AxesUnits.DEFAULT,
+def plot_colormap(result, zmin=None, zmax=None, units=ba.Axes.DEFAULT,
                   xlabel=None, ylabel=None, zlabel=None,
                   title=None, **kwargs):
     """
@@ -156,7 +156,7 @@ def plot_colormap(result, zmin=None, zmax=None, units=ba.AxesUnits.DEFAULT,
                zlabel=zlabel, title=title, axes_limits=axes_limits, **kwargs)
 
 
-def plot_specular_simulation_result(result, ymin=None, ymax=None, units=ba.AxesUnits.DEFAULT,
+def plot_specular_simulation_result(result, ymin=None, ymax=None, units=ba.Axes.DEFAULT,
               xlabel=None, ylabel=None, title=None, **kwargs):
     """
     Plots intensity data for specular simulation result
@@ -188,7 +188,7 @@ def plot_specular_simulation_result(result, ymin=None, ymax=None, units=ba.AxesU
         plt.title(title)
 
 
-def plot_simulation_result(result, intensity_min=None, intensity_max=None, units=ba.AxesUnits.DEFAULT,
+def plot_simulation_result(result, intensity_min=None, intensity_max=None, units=ba.Axes.DEFAULT,
                            xlabel=None, ylabel=None, postpone_show=False, title=None, **kwargs):
     """
     Draws simulation result and (optionally) shows the plot.
@@ -210,7 +210,7 @@ def plot_simulation_result(result, intensity_min=None, intensity_max=None, units
 
 class Plotter:
     def __init__(self, zmin=None, zmax=None, xlabel=None, ylabel=None,
-                 units=ba.AxesUnits.DEFAULT, aspect=None):
+                 units=ba.Axes.DEFAULT, aspect=None):
 
         self._fig = plt.figure(figsize=(10.25, 7.69))
         self._fig.canvas.draw()
@@ -231,7 +231,7 @@ class Plotter:
 
 class PlotterGISAS(Plotter):
     def __init__(self, zmin=None, zmax=None, xlabel=None, ylabel=None,
-                 units=ba.AxesUnits.DEFAULT, aspect=None):
+                 units=ba.Axes.DEFAULT, aspect=None):
         Plotter.__init__(self, zmin, zmax, xlabel, ylabel, units, aspect)
 
     @staticmethod
@@ -291,7 +291,7 @@ class PlotterSpecular(Plotter):
     specular data fit.
     """
 
-    def __init__(self, units=ba.AxesUnits.DEFAULT):
+    def __init__(self, units=ba.Axes.DEFAULT):
         Plotter.__init__(self)
         self.gs = gridspec.GridSpec(1, 2, width_ratios=[2.5, 1], wspace=0)
         self.units = units
diff --git a/Wrap/swig/libBornAgainCore.i b/Wrap/swig/libBornAgainCore.i
index 7b516e93b835c289a6d83c8b89e9204d28681c28..fbd0f658fcc40d0f1e6c91e161f6edad13770e88 100644
--- a/Wrap/swig/libBornAgainCore.i
+++ b/Wrap/swig/libBornAgainCore.i
@@ -28,7 +28,7 @@
 %include "std_shared_ptr.i"
 
 // TODO CLARIFY WHY THIS IS INCLUDED
-%include "../../auto/Wrap/doxygen_core.i"
+%include "../../auto/Wrap/doxygenCore.i"
 
 // include the list of smart pointers (common between Core and Fit)
 %include "shared_pointers.i"
@@ -232,7 +232,7 @@
 %newobject ScanResolution::scanRelativeResolution;
 %newobject ScanResolution::scanAbsoluteResolution;
 
-%newobject SimulationResult::histogram2d(AxesUnits units_type = AxesUnits::DEFAULT) const;
+%newobject SimulationResult::histogram2d(Axes::Units units_type = Axes::Units::DEFAULT) const;
 
 %newobject IntensityDataIOFactory::readOutputData(const std::string& file_name);
 %newobject IntensityDataIOFactory::readIntensityData(const std::string& file_name);
@@ -267,7 +267,6 @@
 %import(module="libBornAgainFit") "Fit/Kernel/Parameters.h"
 %import(module="libBornAgainFit") "Fit/Kernel/Parameter.h"
 
-%rename(AxesUnits) AxesUnitsWrap;
 %template(swig_dummy_type_axisinfo_vector) std::vector<AxisInfo>;
 
 %template(swig_dummy_type_inode_vector) std::vector<INode*>;
@@ -304,7 +303,6 @@
 %include "Core/Binning/IPixel.h"
 %include "Core/Binning/IAxis.h"
 %include "Core/Binning/VariableBinAxis.h"
-
 %include "Core/Binning/ConstKBinAxis.h"
 %include "Core/Binning/CustomBinAxis.h"
 %include "Core/Binning/FixedBinAxis.h"
diff --git a/Wrap/swig/libBornAgainFit.i b/Wrap/swig/libBornAgainFit.i
index 84c611010a78f8da1ee8046814857befe2b5de1b..c69b6fdffb98413f3d36078f562f1de263deaf58 100644
--- a/Wrap/swig/libBornAgainFit.i
+++ b/Wrap/swig/libBornAgainFit.i
@@ -32,7 +32,7 @@
 %include "renameFit.i"
 %include "directors.i"
 
-%include "auto/Wrap/doxygen_fit.i"
+%include "auto/Wrap/doxygenFit.i"
 
 %template(vdouble1d_t) std::vector<double>;
 %template(vdouble2d_t) std::vector< std::vector<double> >;
diff --git a/auto/Wrap/doxygen_core.i b/auto/Wrap/doxygenCore.i
similarity index 98%
rename from auto/Wrap/doxygen_core.i
rename to auto/Wrap/doxygenCore.i
index f35591954aac5501f373df67d03b4a5e1dfc7752..dc219de1a5ff776a831399fb93d623979970d954 100644
--- a/auto/Wrap/doxygen_core.i
+++ b/auto/Wrap/doxygenCore.i
@@ -137,8 +137,8 @@ C++ includes: SlicedCylindersBuilder.h
 ";
 
 
-// File: structAxesUnitsWrap.xml
-%feature("docstring") AxesUnitsWrap "
+// File: classAxes.xml
+%feature("docstring") Axes "
 
 Wrapper for detector axes units, required for a better representation of detector axes units in python
 
@@ -826,6 +826,31 @@ clone method
 ";
 
 
+// File: classCloneableVector.xml
+%feature("docstring") CloneableVector "
+
+The objects pointed to must posses a clone() function.
+
+A vector of unique pointers to objects that are cloneable.
+
+Equips vector<unique_ptr<T>> with copy constructor. For use with polymorphic objects, or in pimpl idiom.
+
+C++ includes: CloneableVector.h
+";
+
+%feature("docstring")  CloneableVector::CloneableVector "CloneableVector< T >::CloneableVector()
+";
+
+%feature("docstring")  CloneableVector::CloneableVector "CloneableVector< T >::CloneableVector(const CloneableVector &other)
+";
+
+%feature("docstring")  CloneableVector::push_back "void CloneableVector< T >::push_back(T *t)
+";
+
+%feature("docstring")  CloneableVector::emplace_back "void CloneableVector< T >::emplace_back(std::unique_ptr< T > &&t)
+";
+
+
 // File: classComplexIntegrator.xml
 %feature("docstring") ComplexIntegrator "
 
@@ -1364,12 +1389,12 @@ C++ includes: SimpleUnitConverters.h
 %feature("docstring")  DepthProbeConverter::clone "DepthProbeConverter * DepthProbeConverter::clone() const final
 ";
 
-%feature("docstring")  DepthProbeConverter::availableUnits "std::vector< AxesUnits > DepthProbeConverter::availableUnits() const final
+%feature("docstring")  DepthProbeConverter::availableUnits "std::vector< Axes::Units > DepthProbeConverter::availableUnits() const final
 
 Returns the list of all available units. 
 ";
 
-%feature("docstring")  DepthProbeConverter::defaultUnits "AxesUnits DepthProbeConverter::defaultUnits() const final
+%feature("docstring")  DepthProbeConverter::defaultUnits "Axes::Units DepthProbeConverter::defaultUnits() const final
 ";
 
 
@@ -1427,12 +1452,6 @@ Set calculation flag (if it's false, zero intensity is assigned to the element)
 %feature("docstring")  DepthProbeSimulation::DepthProbeSimulation "DepthProbeSimulation::DepthProbeSimulation()
 ";
 
-%feature("docstring")  DepthProbeSimulation::DepthProbeSimulation "DepthProbeSimulation::DepthProbeSimulation(const MultiLayer &sample)
-";
-
-%feature("docstring")  DepthProbeSimulation::DepthProbeSimulation "DepthProbeSimulation::DepthProbeSimulation(const std::shared_ptr< ISampleBuilder > sample_builder)
-";
-
 %feature("docstring")  DepthProbeSimulation::~DepthProbeSimulation "DepthProbeSimulation::~DepthProbeSimulation() override
 ";
 
@@ -2667,6 +2686,24 @@ Creates a new clipped axis.
 ";
 
 
+// File: classFixedBuilder.xml
+%feature("docstring") FixedBuilder "
+
+A trivial sample builder class that builds a fixed sample.
+
+C++ includes: FixedBuilder.h
+";
+
+%feature("docstring")  FixedBuilder::FixedBuilder "FixedBuilder::FixedBuilder()=delete
+";
+
+%feature("docstring")  FixedBuilder::FixedBuilder "FixedBuilder::FixedBuilder(const MultiLayer &)
+";
+
+%feature("docstring")  FixedBuilder::buildSample "MultiLayer * FixedBuilder::buildSample() const
+";
+
+
 // File: classFootprintGauss.xml
 %feature("docstring") FootprintGauss "
 
@@ -5562,12 +5599,6 @@ C++ includes: GISASSimulation.h
 %feature("docstring")  GISASSimulation::GISASSimulation "GISASSimulation::GISASSimulation()
 ";
 
-%feature("docstring")  GISASSimulation::GISASSimulation "GISASSimulation::GISASSimulation(const MultiLayer &p_sample)
-";
-
-%feature("docstring")  GISASSimulation::GISASSimulation "GISASSimulation::GISASSimulation(const std::shared_ptr< ISampleBuilder > p_sample_builder)
-";
-
 %feature("docstring")  GISASSimulation::~GISASSimulation "GISASSimulation::~GISASSimulation()
 ";
 
@@ -6327,9 +6358,6 @@ C++ includes: IDetector.h
 Inits detector with the beam settings. 
 ";
 
-%feature("docstring")  IDetector::clear "void IDetector::clear()
-";
-
 %feature("docstring")  IDetector::addAxis "void IDetector::addAxis(const IAxis &axis)
 ";
 
@@ -6409,7 +6437,7 @@ Returns detection properties.
 Returns new intensity map with detector resolution applied. Map will be cropped to ROI if ROI is present. 
 ";
 
-%feature("docstring")  IDetector::defaultAxesUnits "virtual AxesUnits IDetector::defaultAxesUnits() const
+%feature("docstring")  IDetector::defaultAxesUnits "virtual Axes::Units IDetector::defaultAxesUnits() const
 
 Return default axes units. 
 ";
@@ -6450,11 +6478,6 @@ C++ includes: IDetector2D.h
 Sets detector parameters using angle ranges. 
 ";
 
-%feature("docstring")  IDetector2D::setDetectorAxes "void IDetector2D::setDetectorAxes(const IAxis &axis0, const IAxis &axis1)
-
-Sets detector parameters using axes. 
-";
-
 %feature("docstring")  IDetector2D::removeMasks "void IDetector2D::removeMasks()
 
 Removes all masks from the detector. 
@@ -9525,7 +9548,7 @@ C++ includes: ISampleBuilder.h
 %feature("docstring")  ISampleBuilder::buildSample "virtual MultiLayer* ISampleBuilder::buildSample() const =0
 ";
 
-%feature("docstring")  ISampleBuilder::createSampleByIndex "virtual MultiLayer* ISampleBuilder::createSampleByIndex(size_t index)
+%feature("docstring")  ISampleBuilder::createSampleByIndex "virtual MultiLayer* ISampleBuilder::createSampleByIndex(size_t)
 ";
 
 %feature("docstring")  ISampleBuilder::size "virtual size_t ISampleBuilder::size()
@@ -9917,31 +9940,31 @@ C++ includes: IUnitConverter.h
 %feature("docstring")  IUnitConverter::dimension "virtual size_t IUnitConverter::dimension() const =0
 ";
 
-%feature("docstring")  IUnitConverter::calculateMin "virtual double IUnitConverter::calculateMin(size_t i_axis, AxesUnits units_type) const =0
+%feature("docstring")  IUnitConverter::calculateMin "virtual double IUnitConverter::calculateMin(size_t i_axis, Axes::Units units_type) const =0
 ";
 
-%feature("docstring")  IUnitConverter::calculateMax "virtual double IUnitConverter::calculateMax(size_t i_axis, AxesUnits units_type) const =0
+%feature("docstring")  IUnitConverter::calculateMax "virtual double IUnitConverter::calculateMax(size_t i_axis, Axes::Units units_type) const =0
 ";
 
 %feature("docstring")  IUnitConverter::axisSize "virtual size_t IUnitConverter::axisSize(size_t i_axis) const =0
 ";
 
-%feature("docstring")  IUnitConverter::axisName "std::string IUnitConverter::axisName(size_t i_axis, AxesUnits units_type=AxesUnits::DEFAULT) const
+%feature("docstring")  IUnitConverter::axisName "std::string IUnitConverter::axisName(size_t i_axis, Axes::Units units_type=Axes::Units::DEFAULT) const
 ";
 
-%feature("docstring")  IUnitConverter::availableUnits "virtual std::vector<AxesUnits> IUnitConverter::availableUnits() const =0
+%feature("docstring")  IUnitConverter::availableUnits "virtual std::vector<Axes::Units> IUnitConverter::availableUnits() const =0
 ";
 
-%feature("docstring")  IUnitConverter::defaultUnits "virtual AxesUnits IUnitConverter::defaultUnits() const =0
+%feature("docstring")  IUnitConverter::defaultUnits "virtual Axes::Units IUnitConverter::defaultUnits() const =0
 ";
 
-%feature("docstring")  IUnitConverter::substituteDefaultUnits "AxesUnits IUnitConverter::substituteDefaultUnits(AxesUnits units) const
+%feature("docstring")  IUnitConverter::substituteDefaultUnits "Axes::Units IUnitConverter::substituteDefaultUnits(Axes::Units units) const
 ";
 
-%feature("docstring")  IUnitConverter::createConvertedAxis "virtual std::unique_ptr<IAxis> IUnitConverter::createConvertedAxis(size_t i_axis, AxesUnits units) const =0
+%feature("docstring")  IUnitConverter::createConvertedAxis "virtual std::unique_ptr<IAxis> IUnitConverter::createConvertedAxis(size_t i_axis, Axes::Units units) const =0
 ";
 
-%feature("docstring")  IUnitConverter::createConvertedData "std::unique_ptr< OutputData< double > > IUnitConverter::createConvertedData(const OutputData< double > &data, AxesUnits units) const
+%feature("docstring")  IUnitConverter::createConvertedData "std::unique_ptr< OutputData< double > > IUnitConverter::createConvertedData(const OutputData< double > &data, Axes::Units units) const
 
 Creates  OutputData array in converter units. 
 ";
@@ -11498,12 +11521,6 @@ C++ includes: OffSpecSimulation.h
 %feature("docstring")  OffSpecSimulation::OffSpecSimulation "OffSpecSimulation::OffSpecSimulation()
 ";
 
-%feature("docstring")  OffSpecSimulation::OffSpecSimulation "OffSpecSimulation::OffSpecSimulation(const MultiLayer &p_sample)
-";
-
-%feature("docstring")  OffSpecSimulation::OffSpecSimulation "OffSpecSimulation::OffSpecSimulation(const std::shared_ptr< class ISampleBuilder > p_sample_builder)
-";
-
 %feature("docstring")  OffSpecSimulation::~OffSpecSimulation "OffSpecSimulation::~OffSpecSimulation() final
 ";
 
@@ -11561,7 +11578,7 @@ C++ includes: SimpleUnitConverters.h
 %feature("docstring")  OffSpecularConverter::clone "OffSpecularConverter * OffSpecularConverter::clone() const final
 ";
 
-%feature("docstring")  OffSpecularConverter::defaultUnits "AxesUnits OffSpecularConverter::defaultUnits() const final
+%feature("docstring")  OffSpecularConverter::defaultUnits "Axes::Units OffSpecularConverter::defaultUnits() const final
 ";
 
 
@@ -11603,7 +11620,10 @@ C++ includes: OrderedMap.h
 %feature("docstring")  OrderedMap::end "iterator OrderedMap< Key, Object >::end()
 ";
 
-%feature("docstring")  OrderedMap::size "size_t OrderedMap< Key, Object >::size()
+%feature("docstring")  OrderedMap::size "size_t OrderedMap< Key, Object >::size() const
+";
+
+%feature("docstring")  OrderedMap::empty "bool OrderedMap< Key, Object >::empty() const
 ";
 
 %feature("docstring")  OrderedMap::insert "void OrderedMap< Key, Object >::insert(const Key &key, const Object &object)
@@ -11618,7 +11638,7 @@ C++ includes: OrderedMap.h
 %feature("docstring")  OrderedMap::erase "size_t OrderedMap< Key, Object >::erase(const Key &key)
 ";
 
-%feature("docstring")  OrderedMap::value "const Object& OrderedMap< Key, Object >::value(const Key &key)
+%feature("docstring")  OrderedMap::value "const Object& OrderedMap< Key, Object >::value(const Key &key) const
 ";
 
 
@@ -12234,6 +12254,9 @@ Clears the parameter map.
 Returns number of parameters in the pool. 
 ";
 
+%feature("docstring")  ParameterPool::empty "bool ParameterPool::empty() const
+";
+
 %feature("docstring")  ParameterPool::addParameter "RealParameter & ParameterPool::addParameter(RealParameter *newPar)
 
 Adds parameter to the pool, and returns reference to the input pointer.
@@ -13151,6 +13174,8 @@ C++ includes: IterationStrategy.h
 ";
 
 %feature("docstring")  Prism::Prism "Prism::Prism(bool symmetry_Ci, double height, const std::vector< kvector_t > &vertices)
+
+The mathematics implemented here is described in full detail in a paper by Joachim Wuttke, entitled \"Form factor (Fourier shape transform) of polygon and polyhedron.\" 
 ";
 
 %feature("docstring")  Prism::area "double Prism::area() const
@@ -13789,12 +13814,12 @@ C++ includes: SimpleUnitConverters.h
 %feature("docstring")  RectangularConverter::clone "RectangularConverter * RectangularConverter::clone() const final
 ";
 
-%feature("docstring")  RectangularConverter::availableUnits "std::vector< AxesUnits > RectangularConverter::availableUnits() const final
+%feature("docstring")  RectangularConverter::availableUnits "std::vector< Axes::Units > RectangularConverter::availableUnits() const final
 
 Returns the list of all available units. 
 ";
 
-%feature("docstring")  RectangularConverter::defaultUnits "AxesUnits RectangularConverter::defaultUnits() const final
+%feature("docstring")  RectangularConverter::defaultUnits "Axes::Units RectangularConverter::defaultUnits() const final
 ";
 
 
@@ -13896,7 +13921,7 @@ Inits detector with the beam settings.
 %feature("docstring")  RectangularDetector::getDetectorArrangment "RectangularDetector::EDetectorArrangement RectangularDetector::getDetectorArrangment() const
 ";
 
-%feature("docstring")  RectangularDetector::defaultAxesUnits "AxesUnits RectangularDetector::defaultAxesUnits() const override
+%feature("docstring")  RectangularDetector::defaultAxesUnits "Axes::Units RectangularDetector::defaultAxesUnits() const override
 
 return default axes units 
 ";
@@ -14545,7 +14570,7 @@ Retrieves a SampleBuilder from the registry, does the build, and returns the res
 // File: classSampleBuilderNode.xml
 %feature("docstring") SampleBuilderNode "
 
-Enfolds MultiLayerBuilder to have it in  INode tree.
+Wraps an  ISampleBuilder, and puts it in an  INode tree. Used by  SampleProvider.
 
 C++ includes: SampleBuilderNode.h
 ";
@@ -14556,7 +14581,7 @@ C++ includes: SampleBuilderNode.h
 %feature("docstring")  SampleBuilderNode::SampleBuilderNode "SampleBuilderNode::SampleBuilderNode(const SampleBuilderNode &other)
 ";
 
-%feature("docstring")  SampleBuilderNode::setSampleBuilder "void SampleBuilderNode::setSampleBuilder(builder_t sample_builder)
+%feature("docstring")  SampleBuilderNode::setSBN "void SampleBuilderNode::setSBN(const std::shared_ptr< ISampleBuilder > &sample_builder)
 
 Sets sample builder and borrows its parameters. 
 ";
@@ -14576,7 +14601,7 @@ Calls the  INodeVisitor's visit method.
 Creates a multilayer using sample builder. 
 ";
 
-%feature("docstring")  SampleBuilderNode::builder "SampleBuilderNode::builder_t SampleBuilderNode::builder() const
+%feature("docstring")  SampleBuilderNode::builder "std::shared_ptr< ISampleBuilder > SampleBuilderNode::builder() const
 
 Returns current sample builder. 
 ";
@@ -14720,7 +14745,7 @@ C++ includes: SampleLabelHandler.h
 // File: classSampleProvider.xml
 %feature("docstring") SampleProvider "
 
-Gives access to the sample to simulate. Sample can come either directly from the user or from SampleBuilder.
+Holds either a Sample, or a  SampleBuilderNode (which holds an  ISampleBuilder). Used in  Simulation, which holds a  SampleProvider member.
 
 C++ includes: SampleProvider.h
 ";
@@ -14737,7 +14762,7 @@ C++ includes: SampleProvider.h
 %feature("docstring")  SampleProvider::setSample "void SampleProvider::setSample(const MultiLayer &multilayer)
 ";
 
-%feature("docstring")  SampleProvider::setSampleBuilder "void SampleProvider::setSampleBuilder(const std::shared_ptr< ISampleBuilder > sample_builder)
+%feature("docstring")  SampleProvider::setBuilder "void SampleProvider::setBuilder(const std::shared_ptr< ISampleBuilder > &sample_builder)
 ";
 
 %feature("docstring")  SampleProvider::sample "const MultiLayer * SampleProvider::sample() const
@@ -15086,12 +15111,6 @@ C++ includes: Simulation.h
 %feature("docstring")  Simulation::Simulation "Simulation::Simulation()
 ";
 
-%feature("docstring")  Simulation::Simulation "Simulation::Simulation(const MultiLayer &p_sample)
-";
-
-%feature("docstring")  Simulation::Simulation "Simulation::Simulation(const std::shared_ptr< ISampleBuilder > p_sample_builder)
-";
-
 %feature("docstring")  Simulation::~Simulation "Simulation::~Simulation()
 ";
 
@@ -15154,7 +15173,7 @@ The  MultiLayer object will not be owned by the  Simulation object.
 %feature("docstring")  Simulation::sample "const MultiLayer * Simulation::sample() const
 ";
 
-%feature("docstring")  Simulation::setSampleBuilder "void Simulation::setSampleBuilder(const std::shared_ptr< ISampleBuilder > sample_builder)
+%feature("docstring")  Simulation::setSampleBuilder "void Simulation::setSampleBuilder(const std::shared_ptr< ISampleBuilder > &sample_builder)
 ";
 
 %feature("docstring")  Simulation::setBackground "void Simulation::setBackground(const IBackground &bg)
@@ -15232,12 +15251,6 @@ C++ includes: Simulation2D.h
 %feature("docstring")  Simulation2D::Simulation2D "Simulation2D::Simulation2D()
 ";
 
-%feature("docstring")  Simulation2D::Simulation2D "Simulation2D::Simulation2D(const MultiLayer &p_sample)
-";
-
-%feature("docstring")  Simulation2D::Simulation2D "Simulation2D::Simulation2D(const std::shared_ptr< ISampleBuilder > p_sample_builder)
-";
-
 %feature("docstring")  Simulation2D::~Simulation2D "Simulation2D::~Simulation2D() override
 ";
 
@@ -15579,13 +15592,13 @@ C++ includes: SimulationResult.h
 %feature("docstring")  SimulationResult::SimulationResult "SimulationResult::SimulationResult(SimulationResult &&other)
 ";
 
-%feature("docstring")  SimulationResult::data "std::unique_ptr< OutputData< double > > SimulationResult::data(AxesUnits units=AxesUnits::DEFAULT) const
+%feature("docstring")  SimulationResult::data "std::unique_ptr< OutputData< double > > SimulationResult::data(Axes::Units units=Axes::Units::DEFAULT) const
 ";
 
-%feature("docstring")  SimulationResult::histogram2d "Histogram2D * SimulationResult::histogram2d(AxesUnits units=AxesUnits::DEFAULT) const
+%feature("docstring")  SimulationResult::histogram2d "Histogram2D * SimulationResult::histogram2d(Axes::Units units=Axes::Units::DEFAULT) const
 ";
 
-%feature("docstring")  SimulationResult::axisInfo "std::vector< AxisInfo > SimulationResult::axisInfo(AxesUnits units=AxesUnits::DEFAULT) const
+%feature("docstring")  SimulationResult::axisInfo "std::vector< AxisInfo > SimulationResult::axisInfo(Axes::Units units=Axes::Units::DEFAULT) const
 
 Provide  AxisInfo for each axis and the given units. 
 ";
@@ -15598,15 +15611,18 @@ Returns underlying unit converter.
 %feature("docstring")  SimulationResult::size "size_t SimulationResult::size() const
 ";
 
-%feature("docstring")  SimulationResult::array "PyObject * SimulationResult::array(AxesUnits units=AxesUnits::DEFAULT) const
+%feature("docstring")  SimulationResult::empty "bool SimulationResult::empty() const
+";
+
+%feature("docstring")  SimulationResult::array "PyObject * SimulationResult::array(Axes::Units units=Axes::Units::DEFAULT) const
 
 returns intensity data as Python numpy array 
 ";
 
-%feature("docstring")  SimulationResult::axis "std::vector< double > SimulationResult::axis(AxesUnits units=AxesUnits::DEFAULT) const
+%feature("docstring")  SimulationResult::axis "std::vector< double > SimulationResult::axis(Axes::Units units=Axes::Units::DEFAULT) const
 ";
 
-%feature("docstring")  SimulationResult::axis "std::vector< double > SimulationResult::axis(size_t i_axis, AxesUnits units=AxesUnits::DEFAULT) const
+%feature("docstring")  SimulationResult::axis "std::vector< double > SimulationResult::axis(size_t i_axis, Axes::Units units=Axes::Units::DEFAULT) const
 
 Returns axis coordinates as a numpy array. With no parameters given returns coordinates of x-axis in default units. 
 ";
@@ -15894,7 +15910,7 @@ Returns region of interest if exists.
 Resets region of interest making whole detector plane available for the simulation. 
 ";
 
-%feature("docstring")  SpecularDetector1D::defaultAxesUnits "AxesUnits SpecularDetector1D::defaultAxesUnits() const override
+%feature("docstring")  SpecularDetector1D::defaultAxesUnits "Axes::Units SpecularDetector1D::defaultAxesUnits() const override
 
 Return default axes units. 
 ";
@@ -16059,12 +16075,6 @@ C++ includes: SpecularSimulation.h
 %feature("docstring")  SpecularSimulation::SpecularSimulation "SpecularSimulation::SpecularSimulation()
 ";
 
-%feature("docstring")  SpecularSimulation::SpecularSimulation "SpecularSimulation::SpecularSimulation(const MultiLayer &sample)
-";
-
-%feature("docstring")  SpecularSimulation::SpecularSimulation "SpecularSimulation::SpecularSimulation(const std::shared_ptr< ISampleBuilder > sample_builder)
-";
-
 %feature("docstring")  SpecularSimulation::~SpecularSimulation "SpecularSimulation::~SpecularSimulation() override
 ";
 
@@ -16201,12 +16211,12 @@ C++ includes: SimpleUnitConverters.h
 %feature("docstring")  SphericalConverter::clone "SphericalConverter * SphericalConverter::clone() const final
 ";
 
-%feature("docstring")  SphericalConverter::availableUnits "std::vector< AxesUnits > SphericalConverter::availableUnits() const final
+%feature("docstring")  SphericalConverter::availableUnits "std::vector< Axes::Units > SphericalConverter::availableUnits() const final
 
 Returns the list of all available units. 
 ";
 
-%feature("docstring")  SphericalConverter::defaultUnits "AxesUnits SphericalConverter::defaultUnits() const final
+%feature("docstring")  SphericalConverter::defaultUnits "Axes::Units SphericalConverter::defaultUnits() const final
 ";
 
 
@@ -16261,7 +16271,7 @@ Calls the  INodeVisitor's visit method.
 %feature("docstring")  SphericalDetector::~SphericalDetector "SphericalDetector::~SphericalDetector() override
 ";
 
-%feature("docstring")  SphericalDetector::defaultAxesUnits "AxesUnits SphericalDetector::defaultAxesUnits() const override
+%feature("docstring")  SphericalDetector::defaultAxesUnits "Axes::Units SphericalDetector::defaultAxesUnits() const override
 
 return default axes units 
 ";
@@ -16638,22 +16648,22 @@ C++ includes: UnitConverter1D.h
 Returns dimensionality of converted canvas. 
 ";
 
-%feature("docstring")  UnitConverter1D::calculateMin "double UnitConverter1D::calculateMin(size_t i_axis, AxesUnits units_type) const override
+%feature("docstring")  UnitConverter1D::calculateMin "double UnitConverter1D::calculateMin(size_t i_axis, Axes::Units units_type) const override
 
 Calculates minimum on-axis value in given units. 
 ";
 
-%feature("docstring")  UnitConverter1D::calculateMax "double UnitConverter1D::calculateMax(size_t i_axis, AxesUnits units_type) const override
+%feature("docstring")  UnitConverter1D::calculateMax "double UnitConverter1D::calculateMax(size_t i_axis, Axes::Units units_type) const override
 
 Calculates maximum on-axis value in given units. 
 ";
 
-%feature("docstring")  UnitConverter1D::createConvertedAxis "std::unique_ptr< IAxis > UnitConverter1D::createConvertedAxis(size_t i_axis, AxesUnits units) const override
+%feature("docstring")  UnitConverter1D::createConvertedAxis "std::unique_ptr< IAxis > UnitConverter1D::createConvertedAxis(size_t i_axis, Axes::Units units) const override
 
 Creates axis in converted units. 
 ";
 
-%feature("docstring")  UnitConverter1D::createConvertedData "std::unique_ptr< OutputData< double > > UnitConverter1D::createConvertedData(const OutputData< double > &data, AxesUnits units) const override
+%feature("docstring")  UnitConverter1D::createConvertedData "std::unique_ptr< OutputData< double > > UnitConverter1D::createConvertedData(const OutputData< double > &data, Axes::Units units) const override
 
 Creates  OutputData array in converter units. 
 ";
@@ -16667,7 +16677,7 @@ Conversion of axis units for the case of conventional (angle-based) reflectometr
 C++ includes: UnitConverter1D.h
 ";
 
-%feature("docstring")  UnitConverterConvSpec::UnitConverterConvSpec "UnitConverterConvSpec::UnitConverterConvSpec(const Beam &beam, const IAxis &axis, AxesUnits axis_units=AxesUnits::RADIANS)
+%feature("docstring")  UnitConverterConvSpec::UnitConverterConvSpec "UnitConverterConvSpec::UnitConverterConvSpec(const Beam &beam, const IAxis &axis, Axes::Units axis_units=Axes::Units::RADIANS)
 
 Constructs the object for unit conversion. 
 ";
@@ -16686,12 +16696,12 @@ Constructs the object for unit conversion.
 Returns the size of underlying axis. 
 ";
 
-%feature("docstring")  UnitConverterConvSpec::availableUnits "std::vector< AxesUnits > UnitConverterConvSpec::availableUnits() const override
+%feature("docstring")  UnitConverterConvSpec::availableUnits "std::vector< Axes::Units > UnitConverterConvSpec::availableUnits() const override
 
 Returns the list of all available units. 
 ";
 
-%feature("docstring")  UnitConverterConvSpec::defaultUnits "AxesUnits UnitConverterConvSpec::defaultUnits() const override
+%feature("docstring")  UnitConverterConvSpec::defaultUnits "Axes::Units UnitConverterConvSpec::defaultUnits() const override
 
 Returns default units to convert to. 
 ";
@@ -16719,12 +16729,12 @@ C++ includes: UnitConverter1D.h
 Returns the size of underlying axis. 
 ";
 
-%feature("docstring")  UnitConverterQSpec::availableUnits "std::vector< AxesUnits > UnitConverterQSpec::availableUnits() const override
+%feature("docstring")  UnitConverterQSpec::availableUnits "std::vector< Axes::Units > UnitConverterQSpec::availableUnits() const override
 
 Returns the list of all available units. 
 ";
 
-%feature("docstring")  UnitConverterQSpec::defaultUnits "AxesUnits UnitConverterQSpec::defaultUnits() const override
+%feature("docstring")  UnitConverterQSpec::defaultUnits "Axes::Units UnitConverterQSpec::defaultUnits() const override
 
 Returns default units to convert to. 
 ";
@@ -16747,21 +16757,21 @@ C++ includes: SimpleUnitConverters.h
 %feature("docstring")  UnitConverterSimple::dimension "size_t UnitConverterSimple::dimension() const final
 ";
 
-%feature("docstring")  UnitConverterSimple::calculateMin "double UnitConverterSimple::calculateMin(size_t i_axis, AxesUnits units_type) const final
+%feature("docstring")  UnitConverterSimple::calculateMin "double UnitConverterSimple::calculateMin(size_t i_axis, Axes::Units units_type) const final
 ";
 
-%feature("docstring")  UnitConverterSimple::calculateMax "double UnitConverterSimple::calculateMax(size_t i_axis, AxesUnits units_type) const final
+%feature("docstring")  UnitConverterSimple::calculateMax "double UnitConverterSimple::calculateMax(size_t i_axis, Axes::Units units_type) const final
 ";
 
 %feature("docstring")  UnitConverterSimple::axisSize "size_t UnitConverterSimple::axisSize(size_t i_axis) const final
 ";
 
-%feature("docstring")  UnitConverterSimple::availableUnits "std::vector< AxesUnits > UnitConverterSimple::availableUnits() const override
+%feature("docstring")  UnitConverterSimple::availableUnits "std::vector< Axes::Units > UnitConverterSimple::availableUnits() const override
 
 Returns the list of all available units. 
 ";
 
-%feature("docstring")  UnitConverterSimple::createConvertedAxis "std::unique_ptr< IAxis > UnitConverterSimple::createConvertedAxis(size_t i_axis, AxesUnits units) const final
+%feature("docstring")  UnitConverterSimple::createConvertedAxis "std::unique_ptr< IAxis > UnitConverterSimple::createConvertedAxis(size_t i_axis, Axes::Units units) const final
 ";
 
 
@@ -16975,73 +16985,70 @@ C++ includes: ZLimits.h
 ";
 
 
-// File: namespace_0d105.xml
+// File: namespace_0d106.xml
 
 
-// File: namespace_0d111.xml
+// File: namespace_0d112.xml
 
 
-// File: namespace_0d115.xml
+// File: namespace_0d116.xml
 
 
-// File: namespace_0d146.xml
+// File: namespace_0d147.xml
 
 
-// File: namespace_0d158.xml
+// File: namespace_0d159.xml
 
 
 // File: namespace_0d16.xml
 
 
-// File: namespace_0d166.xml
+// File: namespace_0d167.xml
 
 
-// File: namespace_0d171.xml
+// File: namespace_0d172.xml
 
 
-// File: namespace_0d180.xml
+// File: namespace_0d181.xml
 
 
-// File: namespace_0d182.xml
+// File: namespace_0d183.xml
 
 
-// File: namespace_0d186.xml
+// File: namespace_0d187.xml
 
 
 // File: namespace_0d2.xml
 
 
-// File: namespace_0d24.xml
-
+// File: namespace_0d25.xml
 
-// File: namespace_0d248.xml
 
-
-// File: namespace_0d251.xml
+// File: namespace_0d250.xml
 
 
 // File: namespace_0d253.xml
 
 
-// File: namespace_0d262.xml
+// File: namespace_0d260.xml
 
 
-// File: namespace_0d266.xml
+// File: namespace_0d264.xml
 
 
-// File: namespace_0d270.xml
+// File: namespace_0d268.xml
 
 
-// File: namespace_0d276.xml
+// File: namespace_0d274.xml
 
 
-// File: namespace_0d280.xml
+// File: namespace_0d278.xml
 
 
-// File: namespace_0d294.xml
+// File: namespace_0d292.xml
 
 
-// File: namespace_0d318.xml
+// File: namespace_0d323.xml
 
 
 // File: namespace_0d325.xml
@@ -17050,34 +17057,34 @@ C++ includes: ZLimits.h
 // File: namespace_0d327.xml
 
 
-// File: namespace_0d329.xml
+// File: namespace_0d347.xml
 
 
-// File: namespace_0d349.xml
+// File: namespace_0d351.xml
 
 
-// File: namespace_0d353.xml
+// File: namespace_0d355.xml
 
 
-// File: namespace_0d357.xml
+// File: namespace_0d369.xml
 
 
-// File: namespace_0d371.xml
+// File: namespace_0d378.xml
 
 
-// File: namespace_0d380.xml
+// File: namespace_0d382.xml
 
 
-// File: namespace_0d384.xml
+// File: namespace_0d392.xml
 
 
 // File: namespace_0d394.xml
 
 
-// File: namespace_0d396.xml
+// File: namespace_0d4.xml
 
 
-// File: namespace_0d4.xml
+// File: namespace_0d400.xml
 
 
 // File: namespace_0d402.xml
@@ -17095,39 +17102,36 @@ C++ includes: ZLimits.h
 // File: namespace_0d410.xml
 
 
-// File: namespace_0d412.xml
+// File: namespace_0d414.xml
 
 
 // File: namespace_0d416.xml
 
 
-// File: namespace_0d418.xml
+// File: namespace_0d426.xml
 
 
-// File: namespace_0d428.xml
+// File: namespace_0d439.xml
 
 
-// File: namespace_0d441.xml
+// File: namespace_0d448.xml
 
 
 // File: namespace_0d450.xml
 
 
-// File: namespace_0d452.xml
+// File: namespace_0d466.xml
 
 
-// File: namespace_0d468.xml
+// File: namespace_0d487.xml
 
 
-// File: namespace_0d489.xml
+// File: namespace_0d494.xml
 
 
 // File: namespace_0d496.xml
 
 
-// File: namespace_0d498.xml
-
-
 // File: namespace_0d504.xml
 
 
@@ -17146,34 +17150,34 @@ C++ includes: ZLimits.h
 // File: namespace_0d555.xml
 
 
-// File: namespace_0d571.xml
+// File: namespace_0d572.xml
 
 
-// File: namespace_0d583.xml
+// File: namespace_0d584.xml
 
 
-// File: namespace_0d589.xml
+// File: namespace_0d590.xml
 
 
-// File: namespace_0d593.xml
+// File: namespace_0d594.xml
 
 
-// File: namespace_0d611.xml
+// File: namespace_0d612.xml
 
 
-// File: namespace_0d630.xml
+// File: namespace_0d631.xml
 
 
-// File: namespace_0d85.xml
+// File: namespace_0d86.xml
 
 
-// File: namespace_0d87.xml
+// File: namespace_0d88.xml
 
 
-// File: namespace_0d89.xml
+// File: namespace_0d90.xml
 
 
-// File: namespace_0d93.xml
+// File: namespace_0d94.xml
 
 
 // File: namespacealgo.xml
@@ -17241,31 +17245,31 @@ vector<vector<double>>
 
 
 // File: namespaceAxisNames.xml
-%feature("docstring")  AxisNames::InitSphericalAxis0 "std::map< AxesUnits, std::string > AxisNames::InitSphericalAxis0()
+%feature("docstring")  AxisNames::InitSphericalAxis0 "std::map< Axes::Units, std::string > AxisNames::InitSphericalAxis0()
 ";
 
-%feature("docstring")  AxisNames::InitSphericalAxis1 "std::map< AxesUnits, std::string > AxisNames::InitSphericalAxis1()
+%feature("docstring")  AxisNames::InitSphericalAxis1 "std::map< Axes::Units, std::string > AxisNames::InitSphericalAxis1()
 ";
 
-%feature("docstring")  AxisNames::InitRectangularAxis0 "std::map< AxesUnits, std::string > AxisNames::InitRectangularAxis0()
+%feature("docstring")  AxisNames::InitRectangularAxis0 "std::map< Axes::Units, std::string > AxisNames::InitRectangularAxis0()
 ";
 
-%feature("docstring")  AxisNames::InitRectangularAxis1 "std::map< AxesUnits, std::string > AxisNames::InitRectangularAxis1()
+%feature("docstring")  AxisNames::InitRectangularAxis1 "std::map< Axes::Units, std::string > AxisNames::InitRectangularAxis1()
 ";
 
-%feature("docstring")  AxisNames::InitOffSpecAxis0 "std::map< AxesUnits, std::string > AxisNames::InitOffSpecAxis0()
+%feature("docstring")  AxisNames::InitOffSpecAxis0 "std::map< Axes::Units, std::string > AxisNames::InitOffSpecAxis0()
 ";
 
-%feature("docstring")  AxisNames::InitOffSpecAxis1 "std::map< AxesUnits, std::string > AxisNames::InitOffSpecAxis1()
+%feature("docstring")  AxisNames::InitOffSpecAxis1 "std::map< Axes::Units, std::string > AxisNames::InitOffSpecAxis1()
 ";
 
-%feature("docstring")  AxisNames::InitSpecAxis "std::map< AxesUnits, std::string > AxisNames::InitSpecAxis()
+%feature("docstring")  AxisNames::InitSpecAxis "std::map< Axes::Units, std::string > AxisNames::InitSpecAxis()
 ";
 
-%feature("docstring")  AxisNames::InitSpecAxisQ "std::map< AxesUnits, std::string > AxisNames::InitSpecAxisQ()
+%feature("docstring")  AxisNames::InitSpecAxisQ "std::map< Axes::Units, std::string > AxisNames::InitSpecAxisQ()
 ";
 
-%feature("docstring")  AxisNames::InitSampleDepthAxis "std::map< AxesUnits, std::string > AxisNames::InitSampleDepthAxis()
+%feature("docstring")  AxisNames::InitSampleDepthAxis "std::map< Axes::Units, std::string > AxisNames::InitSampleDepthAxis()
 ";
 
 
@@ -17491,7 +17495,7 @@ Creates a Fourier Transform of a 2D Array (vector of vectors).
 
 %feature("docstring")  IntensityDataFunctions::createRearrangedDataSet "std::unique_ptr< OutputData< double > > IntensityDataFunctions::createRearrangedDataSet(const OutputData< double > &data, int n)
 
-Returns new object with input data rotated by n*90 deg counterclockwise (n > 0) or clockwise (n < 0) Axes are swapped if the data is effectively rotated by 90 or 270 degrees Applicable to 2D arrays only 
+Returns new object with input data rotated by n*90 deg counterclockwise (n > 0) or clockwise (n < 0)  Axes are swapped if the data is effectively rotated by 90 or 270 degrees Applicable to 2D arrays only 
 ";
 
 %feature("docstring")  IntensityDataFunctions::createClippedDataSet "std::unique_ptr< OutputData< double > > IntensityDataFunctions::createClippedDataSet(const OutputData< double > &origin, double x1, double y1, double x2, double y2)
@@ -17511,7 +17515,7 @@ Creates Fourier Transform ( OutputData format) of intensity map ( OutputData for
 
 
 // File: namespaceInterferenceFunctionUtils.xml
-%feature("docstring")  InterferenceFunctionUtils::PrecomputeScalarFormFactors "std::vector< complex_t > InterferenceFunctionUtils::PrecomputeScalarFormFactors(const SimulationElement &sim_element, const std::vector< FormFactorCoherentSum > &ff_wrappers)
+%feature("docstring")  InterferenceFunctionUtils::PrecomputeScalarFormFactors "std::vector<complex_t> InterferenceFunctionUtils::PrecomputeScalarFormFactors(const SimulationElement &sim_element, const std::vector< FormFactorCoherentSum > &ff_wrappers)
 ";
 
 %feature("docstring")  InterferenceFunctionUtils::PrecomputePolarizedFormFactors "matrixFFVector_t InterferenceFunctionUtils::PrecomputePolarizedFormFactors(const SimulationElement &sim_element, const std::vector< FormFactorCoherentSum > &ff_wrappers)
@@ -18235,7 +18239,7 @@ Returns true if operation system is Windows.
 
 
 // File: namespaceUnitConverterUtils.xml
-%feature("docstring")  UnitConverterUtils::createOutputData "std::unique_ptr< OutputData< double > > UnitConverterUtils::createOutputData(const IUnitConverter &converter, AxesUnits units)
+%feature("docstring")  UnitConverterUtils::createOutputData "std::unique_ptr< OutputData< double > > UnitConverterUtils::createOutputData(const IUnitConverter &converter, Axes::Units units)
 
 Returns zero-valued output data array in specified units. 
 ";
@@ -18323,6 +18327,9 @@ Helper factory function to use in  GISASSimulation. Depending on the type of det
 // File: InterferenceFunctionRadialParaCrystal_8h.xml
 
 
+// File: InterferenceFunctions_8h.xml
+
+
 // File: InterferenceFunctionTwin_8cpp.xml
 
 
@@ -19032,6 +19039,9 @@ Generate z values (equidistant) for use in MaterialProfile.
 // File: FormFactorTruncatedSpheroid_8h.xml
 
 
+// File: HardParticles_8h.xml
+
+
 // File: IFormFactorPolyhedron_8cpp.xml
 
 
@@ -19077,18 +19087,6 @@ Generate z values (equidistant) for use in MaterialProfile.
 // File: Ripples_8h.xml
 
 
-// File: FormFactors_8h.xml
-
-
-// File: HardParticles_8h.xml
-
-
-// File: InterferenceFunctions_8h.xml
-
-
-// File: SoftParticles_8h.xml
-
-
 // File: boost__streams_8h.xml
 
 
@@ -19905,6 +19903,12 @@ Creates averaged material. Square refractive index of returned material is arith
 // File: ScalarRTCoefficients_8h.xml
 
 
+// File: FixedBuilder_8cpp.xml
+
+
+// File: FixedBuilder_8h.xml
+
+
 // File: IRegistry_8h.xml
 
 
@@ -20165,6 +20169,9 @@ Generate vertices of centered ellipse with given semi-axes at height z.
 // File: FormFactorSphereLogNormalRadius_8h.xml
 
 
+// File: SoftParticles_8h.xml
+
+
 // File: BoxCompositionBuilder_8cpp.xml
 
 
@@ -20374,6 +20381,9 @@ Generate vertices of centered ellipse with given semi-axes at height z.
 // File: TwoLayerRoughnessBuilder_8h.xml
 
 
+// File: CloneableVector_8h.xml
+
+
 // File: FileSystemUtils_8cpp.xml
 
 
@@ -20497,9 +20507,6 @@ Creates a vector<double> as a wavevector with given wavelength and angles. Speci
 // File: dir_05b265732c0b4c8e8dad02f2f774744b.xml
 
 
-// File: dir_72a38c5b455c03a72881c3c65e21783d.xml
-
-
 // File: dir_d7044b5fc4daccc5700de9f07da81a11.xml
 
 
diff --git a/auto/Wrap/doxygen_fit.i b/auto/Wrap/doxygenFit.i
similarity index 99%
rename from auto/Wrap/doxygen_fit.i
rename to auto/Wrap/doxygenFit.i
index 5c21bb88aa3dbec62e22a87db8d1490042884fd1..f85f4f26af8b9612b457f07f143671170c2b2025 100644
--- a/auto/Wrap/doxygen_fit.i
+++ b/auto/Wrap/doxygenFit.i
@@ -796,6 +796,9 @@ Sets the value of option. Option should hold same value type already.
 %feature("docstring")  OptionContainer::size "size_t OptionContainer::size() const
 ";
 
+%feature("docstring")  OptionContainer::empty "bool OptionContainer::empty() const
+";
+
 
 // File: classFit_1_1Parameter.xml
 %feature("docstring") Fit::Parameter "
diff --git a/auto/Wrap/libBornAgainCore.py b/auto/Wrap/libBornAgainCore.py
index 33eedbf361fa73a845850066197b8715813b9a16..6aef83834fb5a0d042257ca79965bbd2d3ce9c81 100644
--- a/auto/Wrap/libBornAgainCore.py
+++ b/auto/Wrap/libBornAgainCore.py
@@ -7494,6 +7494,14 @@ class ParameterPool(ICloneable):
         """
         return _libBornAgainCore.ParameterPool_size(self)
 
+    def empty(self):
+        r"""
+        empty(ParameterPool self) -> bool
+        bool ParameterPool::empty() const
+
+        """
+        return _libBornAgainCore.ParameterPool_empty(self)
+
     def addParameter(self, newPar):
         r"""
         addParameter(ParameterPool self, RealParameter newPar) -> RealParameter
@@ -14011,7 +14019,7 @@ class ISampleBuilder(IParameterized):
     def createSampleByIndex(self, arg0):
         r"""
         createSampleByIndex(ISampleBuilder self, size_t arg0) -> MultiLayer
-        virtual MultiLayer* ISampleBuilder::createSampleByIndex(size_t index)
+        virtual MultiLayer* ISampleBuilder::createSampleByIndex(size_t)
 
         """
         return _libBornAgainCore.ISampleBuilder_createSampleByIndex(self, arg0)
@@ -17333,7 +17341,7 @@ class Simulation(ICloneable, INode):
     def setSampleBuilderCpp(self, sample_builder):
         r"""
         setSampleBuilderCpp(Simulation self, std::shared_ptr< ISampleBuilder > const & sample_builder)
-        void Simulation::setSampleBuilder(const std::shared_ptr< ISampleBuilder > sample_builder)
+        void Simulation::setSampleBuilder(const std::shared_ptr< ISampleBuilder > &sample_builder)
 
         """
         return _libBornAgainCore.Simulation_setSampleBuilderCpp(self, sample_builder)
@@ -17609,7 +17617,7 @@ class GISASSimulation(Simulation2D):
     def __init__(self):
         r"""
         __init__(GISASSimulation self) -> GISASSimulation
-        GISASSimulation::GISASSimulation(const std::shared_ptr< ISampleBuilder > p_sample_builder)
+        GISASSimulation::GISASSimulation()
 
         """
         _libBornAgainCore.GISASSimulation_swiginit(self, _libBornAgainCore.new_GISASSimulation())
@@ -17685,7 +17693,7 @@ class DepthProbeSimulation(Simulation):
     def __init__(self):
         r"""
         __init__(DepthProbeSimulation self) -> DepthProbeSimulation
-        DepthProbeSimulation::DepthProbeSimulation(const std::shared_ptr< ISampleBuilder > sample_builder)
+        DepthProbeSimulation::DepthProbeSimulation()
 
         """
         _libBornAgainCore.DepthProbeSimulation_swiginit(self, _libBornAgainCore.new_DepthProbeSimulation())
@@ -17788,7 +17796,7 @@ class SpecularSimulation(Simulation):
     def __init__(self):
         r"""
         __init__(SpecularSimulation self) -> SpecularSimulation
-        SpecularSimulation::SpecularSimulation(const std::shared_ptr< ISampleBuilder > sample_builder)
+        SpecularSimulation::SpecularSimulation()
 
         """
         _libBornAgainCore.SpecularSimulation_swiginit(self, _libBornAgainCore.new_SpecularSimulation())
@@ -17896,7 +17904,7 @@ class OffSpecSimulation(Simulation2D):
     def __init__(self):
         r"""
         __init__(OffSpecSimulation self) -> OffSpecSimulation
-        OffSpecSimulation::OffSpecSimulation(const std::shared_ptr< class ISampleBuilder > p_sample_builder)
+        OffSpecSimulation::OffSpecSimulation()
 
         """
         _libBornAgainCore.OffSpecSimulation_swiginit(self, _libBornAgainCore.new_OffSpecSimulation())
@@ -18272,14 +18280,6 @@ class IDetector(ICloneable, INode):
         """
         return _libBornAgainCore.IDetector_init(self, arg2)
 
-    def clear(self):
-        r"""
-        clear(IDetector self)
-        void IDetector::clear()
-
-        """
-        return _libBornAgainCore.IDetector_clear(self)
-
     def addAxis(self, axis):
         r"""
         addAxis(IDetector self, IAxis axis)
@@ -18436,8 +18436,8 @@ class IDetector(ICloneable, INode):
 
     def defaultAxesUnits(self):
         r"""
-        defaultAxesUnits(IDetector self) -> AxesUnits
-        virtual AxesUnits IDetector::defaultAxesUnits() const
+        defaultAxesUnits(IDetector self) -> Axes::Units
+        virtual Axes::Units IDetector::defaultAxesUnits() const
 
         Return default axes units. 
 
@@ -18510,16 +18510,6 @@ class IDetector2D(IDetector):
         """
         return _libBornAgainCore.IDetector2D_setDetectorParameters(self, n_x, x_min, x_max, n_y, y_min, y_max)
 
-    def setDetectorAxes(self, axis0, axis1):
-        r"""
-        setDetectorAxes(IDetector2D self, IAxis axis0, IAxis axis1)
-        void IDetector2D::setDetectorAxes(const IAxis &axis0, const IAxis &axis1)
-
-        Sets detector parameters using axes. 
-
-        """
-        return _libBornAgainCore.IDetector2D_setDetectorAxes(self, axis0, axis1)
-
     def removeMasks(self):
         r"""
         removeMasks(IDetector2D self)
@@ -18676,8 +18666,8 @@ class SphericalDetector(IDetector2D):
 
     def defaultAxesUnits(self):
         r"""
-        defaultAxesUnits(SphericalDetector self) -> AxesUnits
-        AxesUnits SphericalDetector::defaultAxesUnits() const override
+        defaultAxesUnits(SphericalDetector self) -> Axes::Units
+        Axes::Units SphericalDetector::defaultAxesUnits() const override
 
         return default axes units 
 
@@ -19053,8 +19043,8 @@ class RectangularDetector(IDetector2D):
 
     def defaultAxesUnits(self):
         r"""
-        defaultAxesUnits(RectangularDetector self) -> AxesUnits
-        AxesUnits RectangularDetector::defaultAxesUnits() const override
+        defaultAxesUnits(RectangularDetector self) -> Axes::Units
+        Axes::Units RectangularDetector::defaultAxesUnits() const override
 
         return default axes units 
 
@@ -19893,7 +19883,7 @@ class IntensityFunctionSqrt(IIntensityFunction):
 # Register IntensityFunctionSqrt in _libBornAgainCore:
 _libBornAgainCore.IntensityFunctionSqrt_swigregister(IntensityFunctionSqrt)
 
-class AxesUnits(object):
+class Axes(object):
     r"""
 
 
@@ -19904,30 +19894,39 @@ class AxesUnits(object):
     """
 
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
-
-    def __init__(self, *args, **kwargs):
-        raise AttributeError("No constructor defined")
     __repr__ = _swig_repr
-    DEFAULT = _libBornAgainCore.AxesUnits_DEFAULT
+    DEFAULT = _libBornAgainCore.Axes_DEFAULT
     
-    NBINS = _libBornAgainCore.AxesUnits_NBINS
+    NBINS = _libBornAgainCore.Axes_NBINS
     
-    RADIANS = _libBornAgainCore.AxesUnits_RADIANS
+    RADIANS = _libBornAgainCore.Axes_RADIANS
     
-    DEGREES = _libBornAgainCore.AxesUnits_DEGREES
+    DEGREES = _libBornAgainCore.Axes_DEGREES
     
-    MM = _libBornAgainCore.AxesUnits_MM
+    MM = _libBornAgainCore.Axes_MM
     
-    QSPACE = _libBornAgainCore.AxesUnits_QSPACE
+    QSPACE = _libBornAgainCore.Axes_QSPACE
     
-    QXQY = _libBornAgainCore.AxesUnits_QXQY
+    QXQY = _libBornAgainCore.Axes_QXQY
     
-    RQ4 = _libBornAgainCore.AxesUnits_RQ4
+    RQ4 = _libBornAgainCore.Axes_RQ4
     
-    __swig_destroy__ = _libBornAgainCore.delete_AxesUnits
 
-# Register AxesUnits in _libBornAgainCore:
-_libBornAgainCore.AxesUnits_swigregister(AxesUnits)
+    def __init__(self):
+        r"""
+        __init__(Axes self) -> Axes
+
+
+        Wrapper for detector axes units, required for a better representation of detector axes units in python
+
+        C++ includes: IUnitConverter.h
+
+        """
+        _libBornAgainCore.Axes_swiginit(self, _libBornAgainCore.new_Axes())
+    __swig_destroy__ = _libBornAgainCore.delete_Axes
+
+# Register Axes in _libBornAgainCore:
+_libBornAgainCore.Axes_swigregister(Axes)
 
 class IUnitConverter(ICloneable):
     r"""
@@ -19964,16 +19963,16 @@ class IUnitConverter(ICloneable):
 
     def calculateMin(self, i_axis, units_type):
         r"""
-        calculateMin(IUnitConverter self, size_t i_axis, AxesUnits units_type) -> double
-        virtual double IUnitConverter::calculateMin(size_t i_axis, AxesUnits units_type) const =0
+        calculateMin(IUnitConverter self, size_t i_axis, Axes::Units units_type) -> double
+        virtual double IUnitConverter::calculateMin(size_t i_axis, Axes::Units units_type) const =0
 
         """
         return _libBornAgainCore.IUnitConverter_calculateMin(self, i_axis, units_type)
 
     def calculateMax(self, i_axis, units_type):
         r"""
-        calculateMax(IUnitConverter self, size_t i_axis, AxesUnits units_type) -> double
-        virtual double IUnitConverter::calculateMax(size_t i_axis, AxesUnits units_type) const =0
+        calculateMax(IUnitConverter self, size_t i_axis, Axes::Units units_type) -> double
+        virtual double IUnitConverter::calculateMax(size_t i_axis, Axes::Units units_type) const =0
 
         """
         return _libBornAgainCore.IUnitConverter_calculateMax(self, i_axis, units_type)
@@ -19988,38 +19987,40 @@ class IUnitConverter(ICloneable):
 
     def axisName(self, *args):
         r"""
-        axisName(IUnitConverter self, size_t i_axis, AxesUnits units_type=AxesUnits::DEFAULT) -> std::string
-        std::string IUnitConverter::axisName(size_t i_axis, AxesUnits units_type=AxesUnits::DEFAULT) const
+        axisName(IUnitConverter self, size_t i_axis, Axes::Units units_type=Axes::Units::DEFAULT) -> std::string
+        std::string IUnitConverter::axisName(size_t i_axis, Axes::Units units_type=Axes::Units::DEFAULT) const
 
         """
         return _libBornAgainCore.IUnitConverter_axisName(self, *args)
 
     def availableUnits(self):
         r"""
-        availableUnits(IUnitConverter self) -> std::vector< AxesUnits,std::allocator< AxesUnits > >
-        virtual std::vector<AxesUnits> IUnitConverter::availableUnits() const =0
+        availableUnits(IUnitConverter self) -> std::vector< Axes::Units,std::allocator< Axes::Units > >
+        virtual std::vector<Axes::Units> IUnitConverter::availableUnits() const =0
 
         """
         return _libBornAgainCore.IUnitConverter_availableUnits(self)
 
     def defaultUnits(self):
         r"""
-        defaultUnits(IUnitConverter self) -> AxesUnits
-        virtual AxesUnits IUnitConverter::defaultUnits() const =0
+        defaultUnits(IUnitConverter self) -> Axes::Units
+        virtual Axes::Units IUnitConverter::defaultUnits() const =0
 
         """
         return _libBornAgainCore.IUnitConverter_defaultUnits(self)
 
     def substituteDefaultUnits(self, units):
         r"""
-        substituteDefaultUnits(IUnitConverter self, AxesUnits units) -> AxesUnits
-        AxesUnits IUnitConverter::substituteDefaultUnits(AxesUnits units) const
+        substituteDefaultUnits(IUnitConverter self, Axes::Units units) -> Axes::Units
+        Axes::Units IUnitConverter::substituteDefaultUnits(Axes::Units units) const
 
         """
         return _libBornAgainCore.IUnitConverter_substituteDefaultUnits(self, units)
 
 # Register IUnitConverter in _libBornAgainCore:
 _libBornAgainCore.IUnitConverter_swigregister(IUnitConverter)
+axisUnitName = cvar.axisUnitName
+axisUnitLabel = cvar.axisUnitLabel
 
 class Histogram1D(IHistogram):
     r"""
@@ -20941,16 +20942,16 @@ class SimulationResult(object):
 
     def histogram2d(self, *args):
         r"""
-        histogram2d(SimulationResult self, AxesUnits units=AxesUnits::DEFAULT) -> Histogram2D
-        Histogram2D * SimulationResult::histogram2d(AxesUnits units=AxesUnits::DEFAULT) const
+        histogram2d(SimulationResult self, Axes::Units units=Axes::Units::DEFAULT) -> Histogram2D
+        Histogram2D * SimulationResult::histogram2d(Axes::Units units=Axes::Units::DEFAULT) const
 
         """
         return _libBornAgainCore.SimulationResult_histogram2d(self, *args)
 
     def axisInfo(self, *args):
         r"""
-        axisInfo(SimulationResult self, AxesUnits units=AxesUnits::DEFAULT) -> swig_dummy_type_axisinfo_vector
-        std::vector< AxisInfo > SimulationResult::axisInfo(AxesUnits units=AxesUnits::DEFAULT) const
+        axisInfo(SimulationResult self, Axes::Units units=Axes::Units::DEFAULT) -> swig_dummy_type_axisinfo_vector
+        std::vector< AxisInfo > SimulationResult::axisInfo(Axes::Units units=Axes::Units::DEFAULT) const
 
         Provide  AxisInfo for each axis and the given units. 
 
@@ -20975,10 +20976,18 @@ class SimulationResult(object):
         """
         return _libBornAgainCore.SimulationResult_size(self)
 
+    def empty(self):
+        r"""
+        empty(SimulationResult self) -> bool
+        bool SimulationResult::empty() const
+
+        """
+        return _libBornAgainCore.SimulationResult_empty(self)
+
     def array(self, *args):
         r"""
-        array(SimulationResult self, AxesUnits units=AxesUnits::DEFAULT) -> PyObject
-        PyObject * SimulationResult::array(AxesUnits units=AxesUnits::DEFAULT) const
+        array(SimulationResult self, Axes::Units units=Axes::Units::DEFAULT) -> PyObject
+        PyObject * SimulationResult::array(Axes::Units units=Axes::Units::DEFAULT) const
 
         returns intensity data as Python numpy array 
 
@@ -20987,9 +20996,9 @@ class SimulationResult(object):
 
     def axis(self, *args):
         r"""
-        axis(SimulationResult self, AxesUnits units=AxesUnits::DEFAULT) -> vdouble1d_t
-        axis(SimulationResult self, size_t i_axis, AxesUnits units=AxesUnits::DEFAULT) -> vdouble1d_t
-        std::vector< double > SimulationResult::axis(size_t i_axis, AxesUnits units=AxesUnits::DEFAULT) const
+        axis(SimulationResult self, Axes::Units units=Axes::Units::DEFAULT) -> vdouble1d_t
+        axis(SimulationResult self, size_t i_axis, Axes::Units units=Axes::Units::DEFAULT) -> vdouble1d_t
+        std::vector< double > SimulationResult::axis(size_t i_axis, Axes::Units units=Axes::Units::DEFAULT) const
 
         Returns axis coordinates as a numpy array. With no parameters given returns coordinates of x-axis in default units. 
 
diff --git a/auto/Wrap/libBornAgainCore_wrap.cpp b/auto/Wrap/libBornAgainCore_wrap.cpp
index a91c21eda728189598a306803a3eb14b70bd50ac..43bf5e88c6146c2a2650713cb1a1648f7ca4003e 100644
--- a/auto/Wrap/libBornAgainCore_wrap.cpp
+++ b/auto/Wrap/libBornAgainCore_wrap.cpp
@@ -3099,308 +3099,308 @@ namespace Swig {
 
 #define SWIGTYPE_p_AngularSpecScan swig_types[0]
 #define SWIGTYPE_p_Attributes swig_types[1]
-#define SWIGTYPE_p_AxesUnitsWrap swig_types[2]
-#define SWIGTYPE_p_AxesUnitsWrap__AxesUnits swig_types[3]
-#define SWIGTYPE_p_AxisInfo swig_types[4]
-#define SWIGTYPE_p_BasicLattice swig_types[5]
-#define SWIGTYPE_p_BasicVector3DT_double_t swig_types[6]
-#define SWIGTYPE_p_BasicVector3DT_int_t swig_types[7]
-#define SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t swig_types[8]
-#define SWIGTYPE_p_Beam swig_types[9]
-#define SWIGTYPE_p_Bin1D swig_types[10]
-#define SWIGTYPE_p_Bin1DCVector swig_types[11]
-#define SWIGTYPE_p_Bin1DKVector swig_types[12]
-#define SWIGTYPE_p_CallbackMap_t swig_types[13]
-#define SWIGTYPE_p_ChiSquaredModule swig_types[14]
-#define SWIGTYPE_p_ConstKBinAxis swig_types[15]
-#define SWIGTYPE_p_ConstantBackground swig_types[16]
-#define SWIGTYPE_p_ConvolutionDetectorResolution swig_types[17]
-#define SWIGTYPE_p_CreateItemCallback swig_types[18]
-#define SWIGTYPE_p_Crystal swig_types[19]
-#define SWIGTYPE_p_CustomBinAxis swig_types[20]
-#define SWIGTYPE_p_DepthProbeSimulation swig_types[21]
-#define SWIGTYPE_p_DetectionProperties swig_types[22]
-#define SWIGTYPE_p_DetectorMask swig_types[23]
-#define SWIGTYPE_p_DistributionCosine swig_types[24]
-#define SWIGTYPE_p_DistributionGate swig_types[25]
-#define SWIGTYPE_p_DistributionGaussian swig_types[26]
-#define SWIGTYPE_p_DistributionHandler swig_types[27]
-#define SWIGTYPE_p_DistributionLogNormal swig_types[28]
-#define SWIGTYPE_p_DistributionLorentz swig_types[29]
-#define SWIGTYPE_p_DistributionTrapezoid swig_types[30]
-#define SWIGTYPE_p_Ellipse swig_types[31]
-#define SWIGTYPE_p_FTDecayFunction1DCauchy swig_types[32]
-#define SWIGTYPE_p_FTDecayFunction1DGauss swig_types[33]
-#define SWIGTYPE_p_FTDecayFunction1DTriangle swig_types[34]
-#define SWIGTYPE_p_FTDecayFunction1DVoigt swig_types[35]
-#define SWIGTYPE_p_FTDecayFunction2DCauchy swig_types[36]
-#define SWIGTYPE_p_FTDecayFunction2DGauss swig_types[37]
-#define SWIGTYPE_p_FTDecayFunction2DVoigt swig_types[38]
-#define SWIGTYPE_p_FTDistribution1DCauchy swig_types[39]
-#define SWIGTYPE_p_FTDistribution1DCosine swig_types[40]
-#define SWIGTYPE_p_FTDistribution1DGate swig_types[41]
-#define SWIGTYPE_p_FTDistribution1DGauss swig_types[42]
-#define SWIGTYPE_p_FTDistribution1DTriangle swig_types[43]
-#define SWIGTYPE_p_FTDistribution1DVoigt swig_types[44]
-#define SWIGTYPE_p_FTDistribution2DCauchy swig_types[45]
-#define SWIGTYPE_p_FTDistribution2DCone swig_types[46]
-#define SWIGTYPE_p_FTDistribution2DGate swig_types[47]
-#define SWIGTYPE_p_FTDistribution2DGauss swig_types[48]
-#define SWIGTYPE_p_FTDistribution2DVoigt swig_types[49]
-#define SWIGTYPE_p_FitObjective swig_types[50]
-#define SWIGTYPE_p_FitOptions swig_types[51]
-#define SWIGTYPE_p_Fit__MinimizerResult swig_types[52]
-#define SWIGTYPE_p_Fit__Parameters swig_types[53]
-#define SWIGTYPE_p_FixedBinAxis swig_types[54]
-#define SWIGTYPE_p_FootprintGauss swig_types[55]
-#define SWIGTYPE_p_FootprintSquare swig_types[56]
-#define SWIGTYPE_p_FormFactorAnisoPyramid swig_types[57]
-#define SWIGTYPE_p_FormFactorBarGauss swig_types[58]
-#define SWIGTYPE_p_FormFactorBarLorentz swig_types[59]
-#define SWIGTYPE_p_FormFactorBox swig_types[60]
-#define SWIGTYPE_p_FormFactorCantellatedCube swig_types[61]
-#define SWIGTYPE_p_FormFactorCone swig_types[62]
-#define SWIGTYPE_p_FormFactorCone6 swig_types[63]
-#define SWIGTYPE_p_FormFactorCoreShell swig_types[64]
-#define SWIGTYPE_p_FormFactorCosineRippleBox swig_types[65]
-#define SWIGTYPE_p_FormFactorCosineRippleGauss swig_types[66]
-#define SWIGTYPE_p_FormFactorCosineRippleLorentz swig_types[67]
-#define SWIGTYPE_p_FormFactorCrystal swig_types[68]
-#define SWIGTYPE_p_FormFactorCuboctahedron swig_types[69]
-#define SWIGTYPE_p_FormFactorCylinder swig_types[70]
-#define SWIGTYPE_p_FormFactorDWBA swig_types[71]
-#define SWIGTYPE_p_FormFactorDWBAPol swig_types[72]
-#define SWIGTYPE_p_FormFactorDecoratorMaterial swig_types[73]
-#define SWIGTYPE_p_FormFactorDecoratorPositionFactor swig_types[74]
-#define SWIGTYPE_p_FormFactorDecoratorRotation swig_types[75]
-#define SWIGTYPE_p_FormFactorDodecahedron swig_types[76]
-#define SWIGTYPE_p_FormFactorDot swig_types[77]
-#define SWIGTYPE_p_FormFactorEllipsoidalCylinder swig_types[78]
-#define SWIGTYPE_p_FormFactorFullSphere swig_types[79]
-#define SWIGTYPE_p_FormFactorFullSpheroid swig_types[80]
-#define SWIGTYPE_p_FormFactorGaussSphere swig_types[81]
-#define SWIGTYPE_p_FormFactorHemiEllipsoid swig_types[82]
-#define SWIGTYPE_p_FormFactorHollowSphere swig_types[83]
-#define SWIGTYPE_p_FormFactorIcosahedron swig_types[84]
-#define SWIGTYPE_p_FormFactorLongBoxGauss swig_types[85]
-#define SWIGTYPE_p_FormFactorLongBoxLorentz swig_types[86]
-#define SWIGTYPE_p_FormFactorPrism3 swig_types[87]
-#define SWIGTYPE_p_FormFactorPrism6 swig_types[88]
-#define SWIGTYPE_p_FormFactorPyramid swig_types[89]
-#define SWIGTYPE_p_FormFactorSawtoothRippleBox swig_types[90]
-#define SWIGTYPE_p_FormFactorSawtoothRippleGauss swig_types[91]
-#define SWIGTYPE_p_FormFactorSawtoothRippleLorentz swig_types[92]
-#define SWIGTYPE_p_FormFactorSphereGaussianRadius swig_types[93]
-#define SWIGTYPE_p_FormFactorSphereLogNormalRadius swig_types[94]
-#define SWIGTYPE_p_FormFactorTetrahedron swig_types[95]
-#define SWIGTYPE_p_FormFactorTruncatedCube swig_types[96]
-#define SWIGTYPE_p_FormFactorTruncatedSphere swig_types[97]
-#define SWIGTYPE_p_FormFactorTruncatedSpheroid swig_types[98]
-#define SWIGTYPE_p_FormFactorWeighted swig_types[99]
-#define SWIGTYPE_p_GISASSimulation swig_types[100]
-#define SWIGTYPE_p_GaussFisherPeakShape swig_types[101]
-#define SWIGTYPE_p_HexagonalLattice swig_types[102]
-#define SWIGTYPE_p_Histogram1D swig_types[103]
-#define SWIGTYPE_p_Histogram2D swig_types[104]
-#define SWIGTYPE_p_HorizontalLine swig_types[105]
-#define SWIGTYPE_p_IAbstractParticle swig_types[106]
-#define SWIGTYPE_p_IAxis swig_types[107]
-#define SWIGTYPE_p_IBackground swig_types[108]
-#define SWIGTYPE_p_IChiSquaredModule swig_types[109]
-#define SWIGTYPE_p_ICloneable swig_types[110]
-#define SWIGTYPE_p_IClusteredParticles swig_types[111]
-#define SWIGTYPE_p_ICosineRipple swig_types[112]
-#define SWIGTYPE_p_IDetector swig_types[113]
-#define SWIGTYPE_p_IDetector2D swig_types[114]
-#define SWIGTYPE_p_IDetectorResolution swig_types[115]
-#define SWIGTYPE_p_IDistribution1D swig_types[116]
-#define SWIGTYPE_p_IFTDecayFunction1D swig_types[117]
-#define SWIGTYPE_p_IFTDecayFunction2D swig_types[118]
-#define SWIGTYPE_p_IFTDistribution1D swig_types[119]
-#define SWIGTYPE_p_IFTDistribution2D swig_types[120]
-#define SWIGTYPE_p_IFactoryT_std__string_ISampleBuilder_t swig_types[121]
-#define SWIGTYPE_p_IFactoryT_std__string_Simulation_t swig_types[122]
-#define SWIGTYPE_p_IFootprintFactor swig_types[123]
-#define SWIGTYPE_p_IFormFactor swig_types[124]
-#define SWIGTYPE_p_IFormFactorBorn swig_types[125]
-#define SWIGTYPE_p_IFormFactorDecorator swig_types[126]
-#define SWIGTYPE_p_IFormFactorPolyhedron swig_types[127]
-#define SWIGTYPE_p_IFormFactorPrism swig_types[128]
-#define SWIGTYPE_p_IHistogram swig_types[129]
-#define SWIGTYPE_p_IIntensityFunction swig_types[130]
-#define SWIGTYPE_p_IInterferenceFunction swig_types[131]
-#define SWIGTYPE_p_ILatticeOrientation swig_types[132]
-#define SWIGTYPE_p_ILayout swig_types[133]
-#define SWIGTYPE_p_INode swig_types[134]
-#define SWIGTYPE_p_INodeVisitor swig_types[135]
-#define SWIGTYPE_p_IObservable swig_types[136]
-#define SWIGTYPE_p_IObserver swig_types[137]
-#define SWIGTYPE_p_IParameterT_double_t swig_types[138]
-#define SWIGTYPE_p_IParameterized swig_types[139]
-#define SWIGTYPE_p_IParticle swig_types[140]
-#define SWIGTYPE_p_IPeakShape swig_types[141]
-#define SWIGTYPE_p_IPixel swig_types[142]
-#define SWIGTYPE_p_IProfileRectangularRipple swig_types[143]
-#define SWIGTYPE_p_IProfileRipple swig_types[144]
-#define SWIGTYPE_p_IResolutionFunction2D swig_types[145]
-#define SWIGTYPE_p_IRotation swig_types[146]
-#define SWIGTYPE_p_ISample swig_types[147]
-#define SWIGTYPE_p_ISampleBuilder swig_types[148]
-#define SWIGTYPE_p_ISawtoothRipple swig_types[149]
-#define SWIGTYPE_p_ISelectionRule swig_types[150]
-#define SWIGTYPE_p_IShape2D swig_types[151]
-#define SWIGTYPE_p_ISpecularScan swig_types[152]
-#define SWIGTYPE_p_IUnitConverter swig_types[153]
-#define SWIGTYPE_p_IVarianceFunction swig_types[154]
-#define SWIGTYPE_p_IdentityRotation swig_types[155]
-#define SWIGTYPE_p_Instrument swig_types[156]
-#define SWIGTYPE_p_IntensityDataIOFactory swig_types[157]
-#define SWIGTYPE_p_IntensityFunctionLog swig_types[158]
-#define SWIGTYPE_p_IntensityFunctionSqrt swig_types[159]
-#define SWIGTYPE_p_InterferenceFunction1DLattice swig_types[160]
-#define SWIGTYPE_p_InterferenceFunction2DLattice swig_types[161]
-#define SWIGTYPE_p_InterferenceFunction2DParaCrystal swig_types[162]
-#define SWIGTYPE_p_InterferenceFunction2DSuperLattice swig_types[163]
-#define SWIGTYPE_p_InterferenceFunction3DLattice swig_types[164]
-#define SWIGTYPE_p_InterferenceFunctionFinite2DLattice swig_types[165]
-#define SWIGTYPE_p_InterferenceFunctionFinite3DLattice swig_types[166]
-#define SWIGTYPE_p_InterferenceFunctionHardDisk swig_types[167]
-#define SWIGTYPE_p_InterferenceFunctionNone swig_types[168]
-#define SWIGTYPE_p_InterferenceFunctionRadialParaCrystal swig_types[169]
-#define SWIGTYPE_p_InterferenceFunctionTwin swig_types[170]
-#define SWIGTYPE_p_IsGISAXSDetector swig_types[171]
-#define SWIGTYPE_p_IsotropicGaussPeakShape swig_types[172]
-#define SWIGTYPE_p_IsotropicLorentzPeakShape swig_types[173]
-#define SWIGTYPE_p_IterationInfo swig_types[174]
-#define SWIGTYPE_p_Lattice swig_types[175]
-#define SWIGTYPE_p_Lattice2D swig_types[176]
-#define SWIGTYPE_p_Lattice2D__ReciprocalBases swig_types[177]
-#define SWIGTYPE_p_Layer swig_types[178]
-#define SWIGTYPE_p_LayerInterface swig_types[179]
-#define SWIGTYPE_p_LayerRoughness swig_types[180]
-#define SWIGTYPE_p_Line swig_types[181]
-#define SWIGTYPE_p_LorentzFisherPeakShape swig_types[182]
-#define SWIGTYPE_p_Material swig_types[183]
-#define SWIGTYPE_p_MesoCrystal swig_types[184]
-#define SWIGTYPE_p_MillerIndex swig_types[185]
-#define SWIGTYPE_p_MillerIndexOrientation swig_types[186]
-#define SWIGTYPE_p_MisesFisherGaussPeakShape swig_types[187]
-#define SWIGTYPE_p_MisesGaussPeakShape swig_types[188]
-#define SWIGTYPE_p_MultiLayer swig_types[189]
-#define SWIGTYPE_p_NodeMeta swig_types[190]
-#define SWIGTYPE_p_OffSpecSimulation swig_types[191]
-#define SWIGTYPE_p_OutputDataIteratorT_double_OutputDataT_double_t_t swig_types[192]
-#define SWIGTYPE_p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t swig_types[193]
-#define SWIGTYPE_p_OutputDataT_CumulativeValue_t swig_types[194]
-#define SWIGTYPE_p_OutputDataT_bool_t swig_types[195]
-#define SWIGTYPE_p_OutputDataT_double_t swig_types[196]
-#define SWIGTYPE_p_ParaMeta swig_types[197]
-#define SWIGTYPE_p_ParameterDistribution swig_types[198]
-#define SWIGTYPE_p_ParameterPool swig_types[199]
-#define SWIGTYPE_p_ParameterSample swig_types[200]
-#define SWIGTYPE_p_Particle swig_types[201]
-#define SWIGTYPE_p_ParticleComposition swig_types[202]
-#define SWIGTYPE_p_ParticleCoreShell swig_types[203]
-#define SWIGTYPE_p_ParticleDistribution swig_types[204]
-#define SWIGTYPE_p_ParticleLayout swig_types[205]
-#define SWIGTYPE_p_ParticleLimits swig_types[206]
-#define SWIGTYPE_p_PoissonNoiseBackground swig_types[207]
-#define SWIGTYPE_p_Polygon swig_types[208]
-#define SWIGTYPE_p_PolygonPrivate swig_types[209]
-#define SWIGTYPE_p_ProgressHandler__Callback_t swig_types[210]
-#define SWIGTYPE_p_PyBuilderCallback swig_types[211]
-#define SWIGTYPE_p_PyObserverCallback swig_types[212]
-#define SWIGTYPE_p_QSpecScan swig_types[213]
-#define SWIGTYPE_p_RangedDistribution swig_types[214]
-#define SWIGTYPE_p_RangedDistributionCosine swig_types[215]
-#define SWIGTYPE_p_RangedDistributionGate swig_types[216]
-#define SWIGTYPE_p_RangedDistributionGaussian swig_types[217]
-#define SWIGTYPE_p_RangedDistributionLogNormal swig_types[218]
-#define SWIGTYPE_p_RangedDistributionLorentz swig_types[219]
-#define SWIGTYPE_p_RealLimits swig_types[220]
-#define SWIGTYPE_p_RealParameter swig_types[221]
-#define SWIGTYPE_p_Rectangle swig_types[222]
-#define SWIGTYPE_p_RectangularDetector swig_types[223]
-#define SWIGTYPE_p_RectangularPixel swig_types[224]
-#define SWIGTYPE_p_RegionOfInterest swig_types[225]
-#define SWIGTYPE_p_ResolutionFunction2DGaussian swig_types[226]
-#define SWIGTYPE_p_RotationEuler swig_types[227]
-#define SWIGTYPE_p_RotationX swig_types[228]
-#define SWIGTYPE_p_RotationY swig_types[229]
-#define SWIGTYPE_p_RotationZ swig_types[230]
-#define SWIGTYPE_p_RoughnessModelWrap swig_types[231]
-#define SWIGTYPE_p_RoughnessModelWrap__RoughnessModel swig_types[232]
-#define SWIGTYPE_p_SafePointerVectorT_IParticle_t swig_types[233]
-#define SWIGTYPE_p_SampleBuilderFactory swig_types[234]
-#define SWIGTYPE_p_ScanResolution swig_types[235]
-#define SWIGTYPE_p_SimpleSelectionRule swig_types[236]
-#define SWIGTYPE_p_Simulation swig_types[237]
-#define SWIGTYPE_p_Simulation2D swig_types[238]
-#define SWIGTYPE_p_SimulationFactory swig_types[239]
-#define SWIGTYPE_p_SimulationOptions swig_types[240]
-#define SWIGTYPE_p_SimulationResult swig_types[241]
-#define SWIGTYPE_p_SlicedParticle swig_types[242]
-#define SWIGTYPE_p_SlicingEffects swig_types[243]
-#define SWIGTYPE_p_SpecularDetector1D swig_types[244]
-#define SWIGTYPE_p_SpecularSimulation swig_types[245]
-#define SWIGTYPE_p_SphericalDetector swig_types[246]
-#define SWIGTYPE_p_SquareLattice swig_types[247]
-#define SWIGTYPE_p_ThreadInfo swig_types[248]
-#define SWIGTYPE_p_Transform3D swig_types[249]
-#define SWIGTYPE_p_VariableBinAxis swig_types[250]
-#define SWIGTYPE_p_VarianceConstantFunction swig_types[251]
-#define SWIGTYPE_p_VarianceSimFunction swig_types[252]
-#define SWIGTYPE_p_VerticalLine swig_types[253]
-#define SWIGTYPE_p_WavevectorInfo swig_types[254]
-#define SWIGTYPE_p_ZLimits swig_types[255]
-#define SWIGTYPE_p_allocator_type swig_types[256]
-#define SWIGTYPE_p_bool swig_types[257]
-#define SWIGTYPE_p_char swig_types[258]
-#define SWIGTYPE_p_const_iterator swig_types[259]
-#define SWIGTYPE_p_corr_matrix_t swig_types[260]
-#define SWIGTYPE_p_difference_type swig_types[261]
-#define SWIGTYPE_p_double swig_types[262]
-#define SWIGTYPE_p_first_type swig_types[263]
-#define SWIGTYPE_p_int swig_types[264]
-#define SWIGTYPE_p_iterator swig_types[265]
-#define SWIGTYPE_p_key_type swig_types[266]
-#define SWIGTYPE_p_long_long swig_types[267]
-#define SWIGTYPE_p_mapped_type swig_types[268]
-#define SWIGTYPE_p_observer_t swig_types[269]
-#define SWIGTYPE_p_p_PyObject swig_types[270]
-#define SWIGTYPE_p_parameters_t swig_types[271]
-#define SWIGTYPE_p_second_type swig_types[272]
-#define SWIGTYPE_p_short swig_types[273]
-#define SWIGTYPE_p_signed_char swig_types[274]
-#define SWIGTYPE_p_size_type swig_types[275]
-#define SWIGTYPE_p_std__allocatorT_AxisInfo_t swig_types[276]
-#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_double_t_t swig_types[277]
-#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t swig_types[278]
-#define SWIGTYPE_p_std__allocatorT_IFormFactor_p_t swig_types[279]
-#define SWIGTYPE_p_std__allocatorT_INode_const_p_t swig_types[280]
-#define SWIGTYPE_p_std__allocatorT_INode_p_t swig_types[281]
-#define SWIGTYPE_p_std__allocatorT_ParameterSample_t swig_types[282]
-#define SWIGTYPE_p_std__allocatorT_double_t swig_types[283]
-#define SWIGTYPE_p_std__allocatorT_int_t swig_types[284]
-#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[285]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[286]
-#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[287]
-#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[288]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[289]
-#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[290]
-#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[291]
-#define SWIGTYPE_p_std__complexT_double_t swig_types[292]
-#define SWIGTYPE_p_std__functionT_ISampleBuilder_pfF_t swig_types[293]
-#define SWIGTYPE_p_std__functionT_Simulation_pfF_t swig_types[294]
-#define SWIGTYPE_p_std__functionT_void_fF_t swig_types[295]
-#define SWIGTYPE_p_std__functionT_void_fSimulationAreaIterator_const_RF_t swig_types[296]
-#define SWIGTYPE_p_std__invalid_argument swig_types[297]
-#define SWIGTYPE_p_std__lessT_std__string_t swig_types[298]
+#define SWIGTYPE_p_Axes swig_types[2]
+#define SWIGTYPE_p_AxisInfo swig_types[3]
+#define SWIGTYPE_p_BasicLattice swig_types[4]
+#define SWIGTYPE_p_BasicVector3DT_double_t swig_types[5]
+#define SWIGTYPE_p_BasicVector3DT_int_t swig_types[6]
+#define SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t swig_types[7]
+#define SWIGTYPE_p_Beam swig_types[8]
+#define SWIGTYPE_p_Bin1D swig_types[9]
+#define SWIGTYPE_p_Bin1DCVector swig_types[10]
+#define SWIGTYPE_p_Bin1DKVector swig_types[11]
+#define SWIGTYPE_p_CallbackMap_t swig_types[12]
+#define SWIGTYPE_p_ChiSquaredModule swig_types[13]
+#define SWIGTYPE_p_ConstKBinAxis swig_types[14]
+#define SWIGTYPE_p_ConstantBackground swig_types[15]
+#define SWIGTYPE_p_ConvolutionDetectorResolution swig_types[16]
+#define SWIGTYPE_p_CreateItemCallback swig_types[17]
+#define SWIGTYPE_p_Crystal swig_types[18]
+#define SWIGTYPE_p_CustomBinAxis swig_types[19]
+#define SWIGTYPE_p_DepthProbeSimulation swig_types[20]
+#define SWIGTYPE_p_DetectionProperties swig_types[21]
+#define SWIGTYPE_p_DetectorMask swig_types[22]
+#define SWIGTYPE_p_DistributionCosine swig_types[23]
+#define SWIGTYPE_p_DistributionGate swig_types[24]
+#define SWIGTYPE_p_DistributionGaussian swig_types[25]
+#define SWIGTYPE_p_DistributionHandler swig_types[26]
+#define SWIGTYPE_p_DistributionLogNormal swig_types[27]
+#define SWIGTYPE_p_DistributionLorentz swig_types[28]
+#define SWIGTYPE_p_DistributionTrapezoid swig_types[29]
+#define SWIGTYPE_p_Ellipse swig_types[30]
+#define SWIGTYPE_p_FTDecayFunction1DCauchy swig_types[31]
+#define SWIGTYPE_p_FTDecayFunction1DGauss swig_types[32]
+#define SWIGTYPE_p_FTDecayFunction1DTriangle swig_types[33]
+#define SWIGTYPE_p_FTDecayFunction1DVoigt swig_types[34]
+#define SWIGTYPE_p_FTDecayFunction2DCauchy swig_types[35]
+#define SWIGTYPE_p_FTDecayFunction2DGauss swig_types[36]
+#define SWIGTYPE_p_FTDecayFunction2DVoigt swig_types[37]
+#define SWIGTYPE_p_FTDistribution1DCauchy swig_types[38]
+#define SWIGTYPE_p_FTDistribution1DCosine swig_types[39]
+#define SWIGTYPE_p_FTDistribution1DGate swig_types[40]
+#define SWIGTYPE_p_FTDistribution1DGauss swig_types[41]
+#define SWIGTYPE_p_FTDistribution1DTriangle swig_types[42]
+#define SWIGTYPE_p_FTDistribution1DVoigt swig_types[43]
+#define SWIGTYPE_p_FTDistribution2DCauchy swig_types[44]
+#define SWIGTYPE_p_FTDistribution2DCone swig_types[45]
+#define SWIGTYPE_p_FTDistribution2DGate swig_types[46]
+#define SWIGTYPE_p_FTDistribution2DGauss swig_types[47]
+#define SWIGTYPE_p_FTDistribution2DVoigt swig_types[48]
+#define SWIGTYPE_p_FitObjective swig_types[49]
+#define SWIGTYPE_p_FitOptions swig_types[50]
+#define SWIGTYPE_p_Fit__MinimizerResult swig_types[51]
+#define SWIGTYPE_p_Fit__Parameters swig_types[52]
+#define SWIGTYPE_p_FixedBinAxis swig_types[53]
+#define SWIGTYPE_p_FootprintGauss swig_types[54]
+#define SWIGTYPE_p_FootprintSquare swig_types[55]
+#define SWIGTYPE_p_FormFactorAnisoPyramid swig_types[56]
+#define SWIGTYPE_p_FormFactorBarGauss swig_types[57]
+#define SWIGTYPE_p_FormFactorBarLorentz swig_types[58]
+#define SWIGTYPE_p_FormFactorBox swig_types[59]
+#define SWIGTYPE_p_FormFactorCantellatedCube swig_types[60]
+#define SWIGTYPE_p_FormFactorCone swig_types[61]
+#define SWIGTYPE_p_FormFactorCone6 swig_types[62]
+#define SWIGTYPE_p_FormFactorCoreShell swig_types[63]
+#define SWIGTYPE_p_FormFactorCosineRippleBox swig_types[64]
+#define SWIGTYPE_p_FormFactorCosineRippleGauss swig_types[65]
+#define SWIGTYPE_p_FormFactorCosineRippleLorentz swig_types[66]
+#define SWIGTYPE_p_FormFactorCrystal swig_types[67]
+#define SWIGTYPE_p_FormFactorCuboctahedron swig_types[68]
+#define SWIGTYPE_p_FormFactorCylinder swig_types[69]
+#define SWIGTYPE_p_FormFactorDWBA swig_types[70]
+#define SWIGTYPE_p_FormFactorDWBAPol swig_types[71]
+#define SWIGTYPE_p_FormFactorDecoratorMaterial swig_types[72]
+#define SWIGTYPE_p_FormFactorDecoratorPositionFactor swig_types[73]
+#define SWIGTYPE_p_FormFactorDecoratorRotation swig_types[74]
+#define SWIGTYPE_p_FormFactorDodecahedron swig_types[75]
+#define SWIGTYPE_p_FormFactorDot swig_types[76]
+#define SWIGTYPE_p_FormFactorEllipsoidalCylinder swig_types[77]
+#define SWIGTYPE_p_FormFactorFullSphere swig_types[78]
+#define SWIGTYPE_p_FormFactorFullSpheroid swig_types[79]
+#define SWIGTYPE_p_FormFactorGaussSphere swig_types[80]
+#define SWIGTYPE_p_FormFactorHemiEllipsoid swig_types[81]
+#define SWIGTYPE_p_FormFactorHollowSphere swig_types[82]
+#define SWIGTYPE_p_FormFactorIcosahedron swig_types[83]
+#define SWIGTYPE_p_FormFactorLongBoxGauss swig_types[84]
+#define SWIGTYPE_p_FormFactorLongBoxLorentz swig_types[85]
+#define SWIGTYPE_p_FormFactorPrism3 swig_types[86]
+#define SWIGTYPE_p_FormFactorPrism6 swig_types[87]
+#define SWIGTYPE_p_FormFactorPyramid swig_types[88]
+#define SWIGTYPE_p_FormFactorSawtoothRippleBox swig_types[89]
+#define SWIGTYPE_p_FormFactorSawtoothRippleGauss swig_types[90]
+#define SWIGTYPE_p_FormFactorSawtoothRippleLorentz swig_types[91]
+#define SWIGTYPE_p_FormFactorSphereGaussianRadius swig_types[92]
+#define SWIGTYPE_p_FormFactorSphereLogNormalRadius swig_types[93]
+#define SWIGTYPE_p_FormFactorTetrahedron swig_types[94]
+#define SWIGTYPE_p_FormFactorTruncatedCube swig_types[95]
+#define SWIGTYPE_p_FormFactorTruncatedSphere swig_types[96]
+#define SWIGTYPE_p_FormFactorTruncatedSpheroid swig_types[97]
+#define SWIGTYPE_p_FormFactorWeighted swig_types[98]
+#define SWIGTYPE_p_GISASSimulation swig_types[99]
+#define SWIGTYPE_p_GaussFisherPeakShape swig_types[100]
+#define SWIGTYPE_p_HexagonalLattice swig_types[101]
+#define SWIGTYPE_p_Histogram1D swig_types[102]
+#define SWIGTYPE_p_Histogram2D swig_types[103]
+#define SWIGTYPE_p_HorizontalLine swig_types[104]
+#define SWIGTYPE_p_IAbstractParticle swig_types[105]
+#define SWIGTYPE_p_IAxis swig_types[106]
+#define SWIGTYPE_p_IBackground swig_types[107]
+#define SWIGTYPE_p_IChiSquaredModule swig_types[108]
+#define SWIGTYPE_p_ICloneable swig_types[109]
+#define SWIGTYPE_p_IClusteredParticles swig_types[110]
+#define SWIGTYPE_p_ICosineRipple swig_types[111]
+#define SWIGTYPE_p_IDetector swig_types[112]
+#define SWIGTYPE_p_IDetector2D swig_types[113]
+#define SWIGTYPE_p_IDetectorResolution swig_types[114]
+#define SWIGTYPE_p_IDistribution1D swig_types[115]
+#define SWIGTYPE_p_IFTDecayFunction1D swig_types[116]
+#define SWIGTYPE_p_IFTDecayFunction2D swig_types[117]
+#define SWIGTYPE_p_IFTDistribution1D swig_types[118]
+#define SWIGTYPE_p_IFTDistribution2D swig_types[119]
+#define SWIGTYPE_p_IFactoryT_std__string_ISampleBuilder_t swig_types[120]
+#define SWIGTYPE_p_IFactoryT_std__string_Simulation_t swig_types[121]
+#define SWIGTYPE_p_IFootprintFactor swig_types[122]
+#define SWIGTYPE_p_IFormFactor swig_types[123]
+#define SWIGTYPE_p_IFormFactorBorn swig_types[124]
+#define SWIGTYPE_p_IFormFactorDecorator swig_types[125]
+#define SWIGTYPE_p_IFormFactorPolyhedron swig_types[126]
+#define SWIGTYPE_p_IFormFactorPrism swig_types[127]
+#define SWIGTYPE_p_IHistogram swig_types[128]
+#define SWIGTYPE_p_IIntensityFunction swig_types[129]
+#define SWIGTYPE_p_IInterferenceFunction swig_types[130]
+#define SWIGTYPE_p_ILatticeOrientation swig_types[131]
+#define SWIGTYPE_p_ILayout swig_types[132]
+#define SWIGTYPE_p_INode swig_types[133]
+#define SWIGTYPE_p_INodeVisitor swig_types[134]
+#define SWIGTYPE_p_IObservable swig_types[135]
+#define SWIGTYPE_p_IObserver swig_types[136]
+#define SWIGTYPE_p_IParameterT_double_t swig_types[137]
+#define SWIGTYPE_p_IParameterized swig_types[138]
+#define SWIGTYPE_p_IParticle swig_types[139]
+#define SWIGTYPE_p_IPeakShape swig_types[140]
+#define SWIGTYPE_p_IPixel swig_types[141]
+#define SWIGTYPE_p_IProfileRectangularRipple swig_types[142]
+#define SWIGTYPE_p_IProfileRipple swig_types[143]
+#define SWIGTYPE_p_IResolutionFunction2D swig_types[144]
+#define SWIGTYPE_p_IRotation swig_types[145]
+#define SWIGTYPE_p_ISample swig_types[146]
+#define SWIGTYPE_p_ISampleBuilder swig_types[147]
+#define SWIGTYPE_p_ISawtoothRipple swig_types[148]
+#define SWIGTYPE_p_ISelectionRule swig_types[149]
+#define SWIGTYPE_p_IShape2D swig_types[150]
+#define SWIGTYPE_p_ISpecularScan swig_types[151]
+#define SWIGTYPE_p_IUnitConverter swig_types[152]
+#define SWIGTYPE_p_IVarianceFunction swig_types[153]
+#define SWIGTYPE_p_IdentityRotation swig_types[154]
+#define SWIGTYPE_p_Instrument swig_types[155]
+#define SWIGTYPE_p_IntensityDataIOFactory swig_types[156]
+#define SWIGTYPE_p_IntensityFunctionLog swig_types[157]
+#define SWIGTYPE_p_IntensityFunctionSqrt swig_types[158]
+#define SWIGTYPE_p_InterferenceFunction1DLattice swig_types[159]
+#define SWIGTYPE_p_InterferenceFunction2DLattice swig_types[160]
+#define SWIGTYPE_p_InterferenceFunction2DParaCrystal swig_types[161]
+#define SWIGTYPE_p_InterferenceFunction2DSuperLattice swig_types[162]
+#define SWIGTYPE_p_InterferenceFunction3DLattice swig_types[163]
+#define SWIGTYPE_p_InterferenceFunctionFinite2DLattice swig_types[164]
+#define SWIGTYPE_p_InterferenceFunctionFinite3DLattice swig_types[165]
+#define SWIGTYPE_p_InterferenceFunctionHardDisk swig_types[166]
+#define SWIGTYPE_p_InterferenceFunctionNone swig_types[167]
+#define SWIGTYPE_p_InterferenceFunctionRadialParaCrystal swig_types[168]
+#define SWIGTYPE_p_InterferenceFunctionTwin swig_types[169]
+#define SWIGTYPE_p_IsGISAXSDetector swig_types[170]
+#define SWIGTYPE_p_IsotropicGaussPeakShape swig_types[171]
+#define SWIGTYPE_p_IsotropicLorentzPeakShape swig_types[172]
+#define SWIGTYPE_p_IterationInfo swig_types[173]
+#define SWIGTYPE_p_Lattice swig_types[174]
+#define SWIGTYPE_p_Lattice2D swig_types[175]
+#define SWIGTYPE_p_Lattice2D__ReciprocalBases swig_types[176]
+#define SWIGTYPE_p_Layer swig_types[177]
+#define SWIGTYPE_p_LayerInterface swig_types[178]
+#define SWIGTYPE_p_LayerRoughness swig_types[179]
+#define SWIGTYPE_p_Line swig_types[180]
+#define SWIGTYPE_p_LorentzFisherPeakShape swig_types[181]
+#define SWIGTYPE_p_Material swig_types[182]
+#define SWIGTYPE_p_MesoCrystal swig_types[183]
+#define SWIGTYPE_p_MillerIndex swig_types[184]
+#define SWIGTYPE_p_MillerIndexOrientation swig_types[185]
+#define SWIGTYPE_p_MisesFisherGaussPeakShape swig_types[186]
+#define SWIGTYPE_p_MisesGaussPeakShape swig_types[187]
+#define SWIGTYPE_p_MultiLayer swig_types[188]
+#define SWIGTYPE_p_NodeMeta swig_types[189]
+#define SWIGTYPE_p_OffSpecSimulation swig_types[190]
+#define SWIGTYPE_p_OutputDataIteratorT_double_OutputDataT_double_t_t swig_types[191]
+#define SWIGTYPE_p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t swig_types[192]
+#define SWIGTYPE_p_OutputDataT_CumulativeValue_t swig_types[193]
+#define SWIGTYPE_p_OutputDataT_bool_t swig_types[194]
+#define SWIGTYPE_p_OutputDataT_double_t swig_types[195]
+#define SWIGTYPE_p_ParaMeta swig_types[196]
+#define SWIGTYPE_p_ParameterDistribution swig_types[197]
+#define SWIGTYPE_p_ParameterPool swig_types[198]
+#define SWIGTYPE_p_ParameterSample swig_types[199]
+#define SWIGTYPE_p_Particle swig_types[200]
+#define SWIGTYPE_p_ParticleComposition swig_types[201]
+#define SWIGTYPE_p_ParticleCoreShell swig_types[202]
+#define SWIGTYPE_p_ParticleDistribution swig_types[203]
+#define SWIGTYPE_p_ParticleLayout swig_types[204]
+#define SWIGTYPE_p_ParticleLimits swig_types[205]
+#define SWIGTYPE_p_PoissonNoiseBackground swig_types[206]
+#define SWIGTYPE_p_Polygon swig_types[207]
+#define SWIGTYPE_p_PolygonPrivate swig_types[208]
+#define SWIGTYPE_p_ProgressHandler__Callback_t swig_types[209]
+#define SWIGTYPE_p_PyBuilderCallback swig_types[210]
+#define SWIGTYPE_p_PyObserverCallback swig_types[211]
+#define SWIGTYPE_p_QSpecScan swig_types[212]
+#define SWIGTYPE_p_RangedDistribution swig_types[213]
+#define SWIGTYPE_p_RangedDistributionCosine swig_types[214]
+#define SWIGTYPE_p_RangedDistributionGate swig_types[215]
+#define SWIGTYPE_p_RangedDistributionGaussian swig_types[216]
+#define SWIGTYPE_p_RangedDistributionLogNormal swig_types[217]
+#define SWIGTYPE_p_RangedDistributionLorentz swig_types[218]
+#define SWIGTYPE_p_RealLimits swig_types[219]
+#define SWIGTYPE_p_RealParameter swig_types[220]
+#define SWIGTYPE_p_Rectangle swig_types[221]
+#define SWIGTYPE_p_RectangularDetector swig_types[222]
+#define SWIGTYPE_p_RectangularPixel swig_types[223]
+#define SWIGTYPE_p_RegionOfInterest swig_types[224]
+#define SWIGTYPE_p_ResolutionFunction2DGaussian swig_types[225]
+#define SWIGTYPE_p_RotationEuler swig_types[226]
+#define SWIGTYPE_p_RotationX swig_types[227]
+#define SWIGTYPE_p_RotationY swig_types[228]
+#define SWIGTYPE_p_RotationZ swig_types[229]
+#define SWIGTYPE_p_RoughnessModelWrap swig_types[230]
+#define SWIGTYPE_p_RoughnessModelWrap__RoughnessModel swig_types[231]
+#define SWIGTYPE_p_SafePointerVectorT_IParticle_t swig_types[232]
+#define SWIGTYPE_p_SampleBuilderFactory swig_types[233]
+#define SWIGTYPE_p_ScanResolution swig_types[234]
+#define SWIGTYPE_p_SimpleSelectionRule swig_types[235]
+#define SWIGTYPE_p_Simulation swig_types[236]
+#define SWIGTYPE_p_Simulation2D swig_types[237]
+#define SWIGTYPE_p_SimulationFactory swig_types[238]
+#define SWIGTYPE_p_SimulationOptions swig_types[239]
+#define SWIGTYPE_p_SimulationResult swig_types[240]
+#define SWIGTYPE_p_SlicedParticle swig_types[241]
+#define SWIGTYPE_p_SlicingEffects swig_types[242]
+#define SWIGTYPE_p_SpecularDetector1D swig_types[243]
+#define SWIGTYPE_p_SpecularSimulation swig_types[244]
+#define SWIGTYPE_p_SphericalDetector swig_types[245]
+#define SWIGTYPE_p_SquareLattice swig_types[246]
+#define SWIGTYPE_p_ThreadInfo swig_types[247]
+#define SWIGTYPE_p_Transform3D swig_types[248]
+#define SWIGTYPE_p_VariableBinAxis swig_types[249]
+#define SWIGTYPE_p_VarianceConstantFunction swig_types[250]
+#define SWIGTYPE_p_VarianceSimFunction swig_types[251]
+#define SWIGTYPE_p_VerticalLine swig_types[252]
+#define SWIGTYPE_p_WavevectorInfo swig_types[253]
+#define SWIGTYPE_p_ZLimits swig_types[254]
+#define SWIGTYPE_p_allocator_type swig_types[255]
+#define SWIGTYPE_p_bool swig_types[256]
+#define SWIGTYPE_p_char swig_types[257]
+#define SWIGTYPE_p_const_iterator swig_types[258]
+#define SWIGTYPE_p_corr_matrix_t swig_types[259]
+#define SWIGTYPE_p_difference_type swig_types[260]
+#define SWIGTYPE_p_double swig_types[261]
+#define SWIGTYPE_p_first_type swig_types[262]
+#define SWIGTYPE_p_int swig_types[263]
+#define SWIGTYPE_p_iterator swig_types[264]
+#define SWIGTYPE_p_key_type swig_types[265]
+#define SWIGTYPE_p_long_long swig_types[266]
+#define SWIGTYPE_p_mapped_type swig_types[267]
+#define SWIGTYPE_p_observer_t swig_types[268]
+#define SWIGTYPE_p_p_PyObject swig_types[269]
+#define SWIGTYPE_p_parameters_t swig_types[270]
+#define SWIGTYPE_p_second_type swig_types[271]
+#define SWIGTYPE_p_short swig_types[272]
+#define SWIGTYPE_p_signed_char swig_types[273]
+#define SWIGTYPE_p_size_type swig_types[274]
+#define SWIGTYPE_p_std__allocatorT_AxisInfo_t swig_types[275]
+#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_double_t_t swig_types[276]
+#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t swig_types[277]
+#define SWIGTYPE_p_std__allocatorT_IFormFactor_p_t swig_types[278]
+#define SWIGTYPE_p_std__allocatorT_INode_const_p_t swig_types[279]
+#define SWIGTYPE_p_std__allocatorT_INode_p_t swig_types[280]
+#define SWIGTYPE_p_std__allocatorT_ParameterSample_t swig_types[281]
+#define SWIGTYPE_p_std__allocatorT_double_t swig_types[282]
+#define SWIGTYPE_p_std__allocatorT_int_t swig_types[283]
+#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[284]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_double_double_t_t swig_types[285]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_double_t_t swig_types[286]
+#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[287]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[288]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_int_std__allocatorT_int_t_t_t swig_types[289]
+#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[290]
+#define SWIGTYPE_p_std__complexT_double_t swig_types[291]
+#define SWIGTYPE_p_std__functionT_ISampleBuilder_pfF_t swig_types[292]
+#define SWIGTYPE_p_std__functionT_Simulation_pfF_t swig_types[293]
+#define SWIGTYPE_p_std__functionT_void_fF_t swig_types[294]
+#define SWIGTYPE_p_std__functionT_void_fSimulationAreaIterator_const_RF_t swig_types[295]
+#define SWIGTYPE_p_std__invalid_argument swig_types[296]
+#define SWIGTYPE_p_std__lessT_std__string_t swig_types[297]
+#define SWIGTYPE_p_std__mapT_Axes__Units_char_const_p_std__lessT_Axes__Units_t_std__allocatorT_std__pairT_Axes__Units_const_char_const_p_t_t_t swig_types[298]
 #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[299]
 #define SWIGTYPE_p_std__pairT_double_double_t swig_types[300]
 #define SWIGTYPE_p_std__shared_ptrT_IObserver_t swig_types[301]
 #define SWIGTYPE_p_std__shared_ptrT_ISampleBuilder_t swig_types[302]
-#define SWIGTYPE_p_std__vectorT_AxesUnitsWrap__AxesUnits_std__allocatorT_AxesUnitsWrap__AxesUnits_t_t swig_types[303]
+#define SWIGTYPE_p_std__vectorT_Axes__Units_std__allocatorT_Axes__Units_t_t swig_types[303]
 #define SWIGTYPE_p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t swig_types[304]
 #define SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t swig_types[305]
 #define SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t swig_types[306]
@@ -65488,6 +65488,29 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_ParameterPool_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterPool *arg1 = (ParameterPool *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ParameterPool, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParameterPool_empty" "', argument " "1"" of type '" "ParameterPool const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterPool * >(argp1);
+  result = (bool)((ParameterPool const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_ParameterPool_addParameter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   ParameterPool *arg1 = (ParameterPool *) 0 ;
@@ -103894,28 +103917,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IDetector_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IDetector *arg1 = (IDetector *) 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_IDetector, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector_clear" "', argument " "1"" of type '" "IDetector *""'"); 
-  }
-  arg1 = reinterpret_cast< IDetector * >(argp1);
-  (arg1)->clear();
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_IDetector_addAxis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   IDetector *arg1 = (IDetector *) 0 ;
@@ -104383,7 +104384,7 @@ SWIGINTERN PyObject *_wrap_IDetector_defaultAxesUnits(PyObject *SWIGUNUSEDPARM(s
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  AxesUnits result;
+  Axes::Units result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
@@ -104392,7 +104393,7 @@ SWIGINTERN PyObject *_wrap_IDetector_defaultAxesUnits(PyObject *SWIGUNUSEDPARM(s
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector_defaultAxesUnits" "', argument " "1"" of type '" "IDetector const *""'"); 
   }
   arg1 = reinterpret_cast< IDetector * >(argp1);
-  result = (AxesUnits)((IDetector const *)arg1)->defaultAxesUnits();
+  result = (Axes::Units)((IDetector const *)arg1)->defaultAxesUnits();
   resultobj = SWIG_From_int(static_cast< int >(result));
   return resultobj;
 fail:
@@ -104697,49 +104698,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IDetector2D_setDetectorAxes(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IDetector2D *arg1 = (IDetector2D *) 0 ;
-  IAxis *arg2 = 0 ;
-  IAxis *arg3 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  void *argp3 = 0 ;
-  int res3 = 0 ;
-  PyObject *swig_obj[3] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "IDetector2D_setDetectorAxes", 3, 3, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_setDetectorAxes" "', argument " "1"" of type '" "IDetector2D *""'"); 
-  }
-  arg1 = reinterpret_cast< IDetector2D * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_IAxis,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IDetector2D_setDetectorAxes" "', argument " "2"" of type '" "IAxis const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IDetector2D_setDetectorAxes" "', argument " "2"" of type '" "IAxis const &""'"); 
-  }
-  arg2 = reinterpret_cast< IAxis * >(argp2);
-  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_IAxis,  0  | 0);
-  if (!SWIG_IsOK(res3)) {
-    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IDetector2D_setDetectorAxes" "', argument " "3"" of type '" "IAxis const &""'"); 
-  }
-  if (!argp3) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IDetector2D_setDetectorAxes" "', argument " "3"" of type '" "IAxis const &""'"); 
-  }
-  arg3 = reinterpret_cast< IAxis * >(argp3);
-  (arg1)->setDetectorAxes((IAxis const &)*arg2,(IAxis const &)*arg3);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_IDetector2D_removeMasks(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   IDetector2D *arg1 = (IDetector2D *) 0 ;
@@ -105366,7 +105324,7 @@ SWIGINTERN PyObject *_wrap_SphericalDetector_defaultAxesUnits(PyObject *SWIGUNUS
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  AxesUnits result;
+  Axes::Units result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
@@ -105375,7 +105333,7 @@ SWIGINTERN PyObject *_wrap_SphericalDetector_defaultAxesUnits(PyObject *SWIGUNUS
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SphericalDetector_defaultAxesUnits" "', argument " "1"" of type '" "SphericalDetector const *""'"); 
   }
   arg1 = reinterpret_cast< SphericalDetector * >(argp1);
-  result = (AxesUnits)((SphericalDetector const *)arg1)->defaultAxesUnits();
+  result = (Axes::Units)((SphericalDetector const *)arg1)->defaultAxesUnits();
   resultobj = SWIG_From_int(static_cast< int >(result));
   return resultobj;
 fail:
@@ -107120,7 +107078,7 @@ SWIGINTERN PyObject *_wrap_RectangularDetector_defaultAxesUnits(PyObject *SWIGUN
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  AxesUnits result;
+  Axes::Units result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
@@ -107129,7 +107087,7 @@ SWIGINTERN PyObject *_wrap_RectangularDetector_defaultAxesUnits(PyObject *SWIGUN
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_defaultAxesUnits" "', argument " "1"" of type '" "RectangularDetector const *""'"); 
   }
   arg1 = reinterpret_cast< RectangularDetector * >(argp1);
-  result = (AxesUnits)((RectangularDetector const *)arg1)->defaultAxesUnits();
+  result = (Axes::Units)((RectangularDetector const *)arg1)->defaultAxesUnits();
   resultobj = SWIG_From_int(static_cast< int >(result));
   return resultobj;
 fail:
@@ -110034,20 +109992,33 @@ SWIGINTERN PyObject *IntensityFunctionSqrt_swiginit(PyObject *SWIGUNUSEDPARM(sel
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_delete_AxesUnits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_Axes(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Axes *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "new_Axes", 0, 0, 0)) SWIG_fail;
+  result = (Axes *)new Axes();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Axes, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_Axes(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AxesUnitsWrap *arg1 = (AxesUnitsWrap *) 0 ;
+  Axes *arg1 = (Axes *) 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_AxesUnitsWrap, SWIG_POINTER_DISOWN |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Axes, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_AxesUnits" "', argument " "1"" of type '" "AxesUnitsWrap *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Axes" "', argument " "1"" of type '" "Axes *""'"); 
   }
-  arg1 = reinterpret_cast< AxesUnitsWrap * >(argp1);
+  arg1 = reinterpret_cast< Axes * >(argp1);
   delete arg1;
   resultobj = SWIG_Py_Void();
   return resultobj;
@@ -110056,13 +110027,45 @@ fail:
 }
 
 
-SWIGINTERN PyObject *AxesUnits_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *Axes_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_AxesUnitsWrap, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_Axes, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
+SWIGINTERN PyObject *Axes_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
+SWIGINTERN int Swig_var_axisUnitName_set(PyObject *) {
+  SWIG_Error(SWIG_AttributeError,"Variable axisUnitName is read-only.");
+  return 1;
+}
+
+
+SWIGINTERN PyObject *Swig_var_axisUnitName_get(void) {
+  PyObject *pyobj = 0;
+  
+  pyobj = SWIG_NewPointerObj(SWIG_as_voidptr(&axisUnitName), SWIGTYPE_p_std__mapT_Axes__Units_char_const_p_std__lessT_Axes__Units_t_std__allocatorT_std__pairT_Axes__Units_const_char_const_p_t_t_t,  0 );
+  return pyobj;
+}
+
+
+SWIGINTERN int Swig_var_axisUnitLabel_set(PyObject *) {
+  SWIG_Error(SWIG_AttributeError,"Variable axisUnitLabel is read-only.");
+  return 1;
+}
+
+
+SWIGINTERN PyObject *Swig_var_axisUnitLabel_get(void) {
+  PyObject *pyobj = 0;
+  
+  pyobj = SWIG_NewPointerObj(SWIG_as_voidptr(&axisUnitLabel), SWIGTYPE_p_std__mapT_Axes__Units_char_const_p_std__lessT_Axes__Units_t_std__allocatorT_std__pairT_Axes__Units_const_char_const_p_t_t_t,  0 );
+  return pyobj;
+}
+
+
 SWIGINTERN PyObject *_wrap_delete_IUnitConverter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   IUnitConverter *arg1 = (IUnitConverter *) 0 ;
@@ -110135,7 +110138,7 @@ SWIGINTERN PyObject *_wrap_IUnitConverter_calculateMin(PyObject *SWIGUNUSEDPARM(
   PyObject *resultobj = 0;
   IUnitConverter *arg1 = (IUnitConverter *) 0 ;
   size_t arg2 ;
-  AxesUnits arg3 ;
+  Axes::Units arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   size_t val2 ;
@@ -110158,9 +110161,9 @@ SWIGINTERN PyObject *_wrap_IUnitConverter_calculateMin(PyObject *SWIGUNUSEDPARM(
   arg2 = static_cast< size_t >(val2);
   ecode3 = SWIG_AsVal_int(swig_obj[2], &val3);
   if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IUnitConverter_calculateMin" "', argument " "3"" of type '" "AxesUnits""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IUnitConverter_calculateMin" "', argument " "3"" of type '" "Axes::Units""'");
   } 
-  arg3 = static_cast< AxesUnits >(val3);
+  arg3 = static_cast< Axes::Units >(val3);
   result = (double)((IUnitConverter const *)arg1)->calculateMin(arg2,arg3);
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
@@ -110173,7 +110176,7 @@ SWIGINTERN PyObject *_wrap_IUnitConverter_calculateMax(PyObject *SWIGUNUSEDPARM(
   PyObject *resultobj = 0;
   IUnitConverter *arg1 = (IUnitConverter *) 0 ;
   size_t arg2 ;
-  AxesUnits arg3 ;
+  Axes::Units arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   size_t val2 ;
@@ -110196,9 +110199,9 @@ SWIGINTERN PyObject *_wrap_IUnitConverter_calculateMax(PyObject *SWIGUNUSEDPARM(
   arg2 = static_cast< size_t >(val2);
   ecode3 = SWIG_AsVal_int(swig_obj[2], &val3);
   if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IUnitConverter_calculateMax" "', argument " "3"" of type '" "AxesUnits""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IUnitConverter_calculateMax" "', argument " "3"" of type '" "Axes::Units""'");
   } 
-  arg3 = static_cast< AxesUnits >(val3);
+  arg3 = static_cast< Axes::Units >(val3);
   result = (double)((IUnitConverter const *)arg1)->calculateMax(arg2,arg3);
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
@@ -110241,7 +110244,7 @@ SWIGINTERN PyObject *_wrap_IUnitConverter_axisName__SWIG_0(PyObject *SWIGUNUSEDP
   PyObject *resultobj = 0;
   IUnitConverter *arg1 = (IUnitConverter *) 0 ;
   size_t arg2 ;
-  AxesUnits arg3 ;
+  Axes::Units arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   size_t val2 ;
@@ -110263,9 +110266,9 @@ SWIGINTERN PyObject *_wrap_IUnitConverter_axisName__SWIG_0(PyObject *SWIGUNUSEDP
   arg2 = static_cast< size_t >(val2);
   ecode3 = SWIG_AsVal_int(swig_obj[2], &val3);
   if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IUnitConverter_axisName" "', argument " "3"" of type '" "AxesUnits""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IUnitConverter_axisName" "', argument " "3"" of type '" "Axes::Units""'");
   } 
-  arg3 = static_cast< AxesUnits >(val3);
+  arg3 = static_cast< Axes::Units >(val3);
   result = ((IUnitConverter const *)arg1)->axisName(arg2,arg3);
   resultobj = SWIG_From_std_string(static_cast< std::string >(result));
   return resultobj;
@@ -110351,7 +110354,7 @@ SWIGINTERN PyObject *_wrap_IUnitConverter_axisName(PyObject *self, PyObject *arg
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'IUnitConverter_axisName'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    IUnitConverter::axisName(size_t,AxesUnits) const\n"
+    "    IUnitConverter::axisName(size_t,Axes::Units) const\n"
     "    IUnitConverter::axisName(size_t) const\n");
   return 0;
 }
@@ -110363,7 +110366,7 @@ SWIGINTERN PyObject *_wrap_IUnitConverter_availableUnits(PyObject *SWIGUNUSEDPAR
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  SwigValueWrapper< std::vector< enum AxesUnitsWrap::AxesUnits,std::allocator< enum AxesUnitsWrap::AxesUnits > > > result;
+  SwigValueWrapper< std::vector< enum Axes::Units,std::allocator< enum Axes::Units > > > result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
@@ -110373,7 +110376,7 @@ SWIGINTERN PyObject *_wrap_IUnitConverter_availableUnits(PyObject *SWIGUNUSEDPAR
   }
   arg1 = reinterpret_cast< IUnitConverter * >(argp1);
   result = ((IUnitConverter const *)arg1)->availableUnits();
-  resultobj = SWIG_NewPointerObj((new std::vector< AxesUnits,std::allocator< AxesUnits > >(static_cast< const std::vector< AxesUnits,std::allocator< AxesUnits > >& >(result))), SWIGTYPE_p_std__vectorT_AxesUnitsWrap__AxesUnits_std__allocatorT_AxesUnitsWrap__AxesUnits_t_t, SWIG_POINTER_OWN |  0 );
+  resultobj = SWIG_NewPointerObj((new std::vector< Axes::Units,std::allocator< Axes::Units > >(static_cast< const std::vector< Axes::Units,std::allocator< Axes::Units > >& >(result))), SWIGTYPE_p_std__vectorT_Axes__Units_std__allocatorT_Axes__Units_t_t, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -110386,7 +110389,7 @@ SWIGINTERN PyObject *_wrap_IUnitConverter_defaultUnits(PyObject *SWIGUNUSEDPARM(
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  AxesUnits result;
+  Axes::Units result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
@@ -110395,7 +110398,7 @@ SWIGINTERN PyObject *_wrap_IUnitConverter_defaultUnits(PyObject *SWIGUNUSEDPARM(
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IUnitConverter_defaultUnits" "', argument " "1"" of type '" "IUnitConverter const *""'"); 
   }
   arg1 = reinterpret_cast< IUnitConverter * >(argp1);
-  result = (AxesUnits)((IUnitConverter const *)arg1)->defaultUnits();
+  result = (Axes::Units)((IUnitConverter const *)arg1)->defaultUnits();
   resultobj = SWIG_From_int(static_cast< int >(result));
   return resultobj;
 fail:
@@ -110406,13 +110409,13 @@ fail:
 SWIGINTERN PyObject *_wrap_IUnitConverter_substituteDefaultUnits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   IUnitConverter *arg1 = (IUnitConverter *) 0 ;
-  AxesUnits arg2 ;
+  Axes::Units arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   int val2 ;
   int ecode2 = 0 ;
   PyObject *swig_obj[2] ;
-  AxesUnits result;
+  Axes::Units result;
   
   if (!SWIG_Python_UnpackTuple(args, "IUnitConverter_substituteDefaultUnits", 2, 2, swig_obj)) SWIG_fail;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IUnitConverter, 0 |  0 );
@@ -110422,10 +110425,10 @@ SWIGINTERN PyObject *_wrap_IUnitConverter_substituteDefaultUnits(PyObject *SWIGU
   arg1 = reinterpret_cast< IUnitConverter * >(argp1);
   ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IUnitConverter_substituteDefaultUnits" "', argument " "2"" of type '" "AxesUnits""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IUnitConverter_substituteDefaultUnits" "', argument " "2"" of type '" "Axes::Units""'");
   } 
-  arg2 = static_cast< AxesUnits >(val2);
-  result = (AxesUnits)((IUnitConverter const *)arg1)->substituteDefaultUnits(arg2);
+  arg2 = static_cast< Axes::Units >(val2);
+  result = (Axes::Units)((IUnitConverter const *)arg1)->substituteDefaultUnits(arg2);
   resultobj = SWIG_From_int(static_cast< int >(result));
   return resultobj;
 fail:
@@ -115574,7 +115577,7 @@ fail:
 SWIGINTERN PyObject *_wrap_SimulationResult_histogram2d__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   SimulationResult *arg1 = (SimulationResult *) 0 ;
-  AxesUnits arg2 ;
+  Axes::Units arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   int val2 ;
@@ -115589,9 +115592,9 @@ SWIGINTERN PyObject *_wrap_SimulationResult_histogram2d__SWIG_0(PyObject *SWIGUN
   arg1 = reinterpret_cast< SimulationResult * >(argp1);
   ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationResult_histogram2d" "', argument " "2"" of type '" "AxesUnits""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationResult_histogram2d" "', argument " "2"" of type '" "Axes::Units""'");
   } 
-  arg2 = static_cast< AxesUnits >(val2);
+  arg2 = static_cast< Axes::Units >(val2);
   result = (Histogram2D *)((SimulationResult const *)arg1)->histogram2d(arg2);
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram2D, SWIG_POINTER_OWN |  0 );
   return resultobj;
@@ -115657,7 +115660,7 @@ SWIGINTERN PyObject *_wrap_SimulationResult_histogram2d(PyObject *self, PyObject
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'SimulationResult_histogram2d'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    SimulationResult::histogram2d(AxesUnits) const\n"
+    "    SimulationResult::histogram2d(Axes::Units) const\n"
     "    SimulationResult::histogram2d() const\n");
   return 0;
 }
@@ -115666,7 +115669,7 @@ fail:
 SWIGINTERN PyObject *_wrap_SimulationResult_axisInfo__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   SimulationResult *arg1 = (SimulationResult *) 0 ;
-  AxesUnits arg2 ;
+  Axes::Units arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   int val2 ;
@@ -115681,9 +115684,9 @@ SWIGINTERN PyObject *_wrap_SimulationResult_axisInfo__SWIG_0(PyObject *SWIGUNUSE
   arg1 = reinterpret_cast< SimulationResult * >(argp1);
   ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationResult_axisInfo" "', argument " "2"" of type '" "AxesUnits""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationResult_axisInfo" "', argument " "2"" of type '" "Axes::Units""'");
   } 
-  arg2 = static_cast< AxesUnits >(val2);
+  arg2 = static_cast< Axes::Units >(val2);
   result = ((SimulationResult const *)arg1)->axisInfo(arg2);
   resultobj = swig::from(static_cast< std::vector< AxisInfo,std::allocator< AxisInfo > > >(result));
   return resultobj;
@@ -115749,7 +115752,7 @@ SWIGINTERN PyObject *_wrap_SimulationResult_axisInfo(PyObject *self, PyObject *a
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'SimulationResult_axisInfo'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    SimulationResult::axisInfo(AxesUnits) const\n"
+    "    SimulationResult::axisInfo(Axes::Units) const\n"
     "    SimulationResult::axisInfo() const\n");
   return 0;
 }
@@ -115801,10 +115804,33 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_SimulationResult_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationResult *arg1 = (SimulationResult *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SimulationResult, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationResult_empty" "', argument " "1"" of type '" "SimulationResult const *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationResult * >(argp1);
+  result = (bool)((SimulationResult const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_SimulationResult_array__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   SimulationResult *arg1 = (SimulationResult *) 0 ;
-  AxesUnits arg2 ;
+  Axes::Units arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   int val2 ;
@@ -115819,9 +115845,9 @@ SWIGINTERN PyObject *_wrap_SimulationResult_array__SWIG_0(PyObject *SWIGUNUSEDPA
   arg1 = reinterpret_cast< SimulationResult * >(argp1);
   ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationResult_array" "', argument " "2"" of type '" "AxesUnits""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationResult_array" "', argument " "2"" of type '" "Axes::Units""'");
   } 
-  arg2 = static_cast< AxesUnits >(val2);
+  arg2 = static_cast< Axes::Units >(val2);
   result = (PyObject *)((SimulationResult const *)arg1)->array(arg2);
   resultobj = result;
   return resultobj;
@@ -115887,7 +115913,7 @@ SWIGINTERN PyObject *_wrap_SimulationResult_array(PyObject *self, PyObject *args
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'SimulationResult_array'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    SimulationResult::array(AxesUnits) const\n"
+    "    SimulationResult::array(Axes::Units) const\n"
     "    SimulationResult::array() const\n");
   return 0;
 }
@@ -115896,7 +115922,7 @@ fail:
 SWIGINTERN PyObject *_wrap_SimulationResult_axis__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   SimulationResult *arg1 = (SimulationResult *) 0 ;
-  AxesUnits arg2 ;
+  Axes::Units arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   int val2 ;
@@ -115911,9 +115937,9 @@ SWIGINTERN PyObject *_wrap_SimulationResult_axis__SWIG_0(PyObject *SWIGUNUSEDPAR
   arg1 = reinterpret_cast< SimulationResult * >(argp1);
   ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationResult_axis" "', argument " "2"" of type '" "AxesUnits""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationResult_axis" "', argument " "2"" of type '" "Axes::Units""'");
   } 
-  arg2 = static_cast< AxesUnits >(val2);
+  arg2 = static_cast< Axes::Units >(val2);
   result = ((SimulationResult const *)arg1)->axis(arg2);
   resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
   return resultobj;
@@ -115947,7 +115973,7 @@ SWIGINTERN PyObject *_wrap_SimulationResult_axis__SWIG_2(PyObject *SWIGUNUSEDPAR
   PyObject *resultobj = 0;
   SimulationResult *arg1 = (SimulationResult *) 0 ;
   size_t arg2 ;
-  AxesUnits arg3 ;
+  Axes::Units arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   size_t val2 ;
@@ -115969,9 +115995,9 @@ SWIGINTERN PyObject *_wrap_SimulationResult_axis__SWIG_2(PyObject *SWIGUNUSEDPAR
   arg2 = static_cast< size_t >(val2);
   ecode3 = SWIG_AsVal_int(swig_obj[2], &val3);
   if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SimulationResult_axis" "', argument " "3"" of type '" "AxesUnits""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SimulationResult_axis" "', argument " "3"" of type '" "Axes::Units""'");
   } 
-  arg3 = static_cast< AxesUnits >(val3);
+  arg3 = static_cast< Axes::Units >(val3);
   result = ((SimulationResult const *)arg1)->axis(arg2,arg3);
   resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
   return resultobj;
@@ -116081,9 +116107,9 @@ SWIGINTERN PyObject *_wrap_SimulationResult_axis(PyObject *self, PyObject *args)
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'SimulationResult_axis'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    SimulationResult::axis(AxesUnits) const\n"
+    "    SimulationResult::axis(Axes::Units) const\n"
     "    SimulationResult::axis() const\n"
-    "    SimulationResult::axis(size_t,AxesUnits) const\n"
+    "    SimulationResult::axis(size_t,Axes::Units) const\n"
     "    SimulationResult::axis(size_t) const\n");
   return 0;
 }
@@ -124306,6 +124332,11 @@ static PyMethodDef SwigMethods[] = {
 		"Returns number of parameters in the pool. \n"
 		"\n"
 		""},
+	 { "ParameterPool_empty", _wrap_ParameterPool_empty, METH_O, "\n"
+		"ParameterPool_empty(ParameterPool self) -> bool\n"
+		"bool ParameterPool::empty() const\n"
+		"\n"
+		""},
 	 { "ParameterPool_addParameter", _wrap_ParameterPool_addParameter, METH_VARARGS, "\n"
 		"ParameterPool_addParameter(ParameterPool self, RealParameter newPar) -> RealParameter\n"
 		"RealParameter & ParameterPool::addParameter(RealParameter *newPar)\n"
@@ -128092,7 +128123,7 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "ISampleBuilder_createSampleByIndex", _wrap_ISampleBuilder_createSampleByIndex, METH_VARARGS, "\n"
 		"ISampleBuilder_createSampleByIndex(ISampleBuilder self, size_t arg0) -> MultiLayer\n"
-		"virtual MultiLayer* ISampleBuilder::createSampleByIndex(size_t index)\n"
+		"virtual MultiLayer* ISampleBuilder::createSampleByIndex(size_t)\n"
 		"\n"
 		""},
 	 { "ISampleBuilder_size", _wrap_ISampleBuilder_size, METH_O, "\n"
@@ -129966,7 +129997,7 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "Simulation_setSampleBuilderCpp", _wrap_Simulation_setSampleBuilderCpp, METH_VARARGS, "\n"
 		"Simulation_setSampleBuilderCpp(Simulation self, std::shared_ptr< ISampleBuilder > const & sample_builder)\n"
-		"void Simulation::setSampleBuilder(const std::shared_ptr< ISampleBuilder > sample_builder)\n"
+		"void Simulation::setSampleBuilder(const std::shared_ptr< ISampleBuilder > &sample_builder)\n"
 		"\n"
 		""},
 	 { "Simulation_setBackground", _wrap_Simulation_setBackground, METH_VARARGS, "\n"
@@ -130145,7 +130176,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "Simulation2D_swigregister", Simulation2D_swigregister, METH_O, NULL},
 	 { "new_GISASSimulation", _wrap_new_GISASSimulation, METH_NOARGS, "\n"
 		"new_GISASSimulation() -> GISASSimulation\n"
-		"GISASSimulation::GISASSimulation(const std::shared_ptr< ISampleBuilder > p_sample_builder)\n"
+		"GISASSimulation::GISASSimulation()\n"
 		"\n"
 		""},
 	 { "delete_GISASSimulation", _wrap_delete_GISASSimulation, METH_O, "\n"
@@ -130197,7 +130228,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "GISASSimulation_swiginit", GISASSimulation_swiginit, METH_VARARGS, NULL},
 	 { "new_DepthProbeSimulation", _wrap_new_DepthProbeSimulation, METH_NOARGS, "\n"
 		"new_DepthProbeSimulation() -> DepthProbeSimulation\n"
-		"DepthProbeSimulation::DepthProbeSimulation(const std::shared_ptr< ISampleBuilder > sample_builder)\n"
+		"DepthProbeSimulation::DepthProbeSimulation()\n"
 		"\n"
 		""},
 	 { "delete_DepthProbeSimulation", _wrap_delete_DepthProbeSimulation, METH_O, "\n"
@@ -130263,7 +130294,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "DepthProbeSimulation_swiginit", DepthProbeSimulation_swiginit, METH_VARARGS, NULL},
 	 { "new_SpecularSimulation", _wrap_new_SpecularSimulation, METH_NOARGS, "\n"
 		"new_SpecularSimulation() -> SpecularSimulation\n"
-		"SpecularSimulation::SpecularSimulation(const std::shared_ptr< ISampleBuilder > sample_builder)\n"
+		"SpecularSimulation::SpecularSimulation()\n"
 		"\n"
 		""},
 	 { "delete_SpecularSimulation", _wrap_delete_SpecularSimulation, METH_O, "\n"
@@ -130329,7 +130360,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "SpecularSimulation_swiginit", SpecularSimulation_swiginit, METH_VARARGS, NULL},
 	 { "new_OffSpecSimulation", _wrap_new_OffSpecSimulation, METH_NOARGS, "\n"
 		"new_OffSpecSimulation() -> OffSpecSimulation\n"
-		"OffSpecSimulation::OffSpecSimulation(const std::shared_ptr< class ISampleBuilder > p_sample_builder)\n"
+		"OffSpecSimulation::OffSpecSimulation()\n"
 		"\n"
 		""},
 	 { "delete_OffSpecSimulation", _wrap_delete_OffSpecSimulation, METH_O, "\n"
@@ -130516,11 +130547,6 @@ static PyMethodDef SwigMethods[] = {
 		"Inits detector with the beam settings. \n"
 		"\n"
 		""},
-	 { "IDetector_clear", _wrap_IDetector_clear, METH_O, "\n"
-		"IDetector_clear(IDetector self)\n"
-		"void IDetector::clear()\n"
-		"\n"
-		""},
 	 { "IDetector_addAxis", _wrap_IDetector_addAxis, METH_VARARGS, "\n"
 		"IDetector_addAxis(IDetector self, IAxis axis)\n"
 		"void IDetector::addAxis(const IAxis &axis)\n"
@@ -130628,8 +130654,8 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		""},
 	 { "IDetector_defaultAxesUnits", _wrap_IDetector_defaultAxesUnits, METH_O, "\n"
-		"IDetector_defaultAxesUnits(IDetector self) -> AxesUnits\n"
-		"virtual AxesUnits IDetector::defaultAxesUnits() const\n"
+		"IDetector_defaultAxesUnits(IDetector self) -> Axes::Units\n"
+		"virtual Axes::Units IDetector::defaultAxesUnits() const\n"
 		"\n"
 		"Return default axes units. \n"
 		"\n"
@@ -130671,13 +130697,6 @@ static PyMethodDef SwigMethods[] = {
 		"Sets detector parameters using angle ranges. \n"
 		"\n"
 		""},
-	 { "IDetector2D_setDetectorAxes", _wrap_IDetector2D_setDetectorAxes, METH_VARARGS, "\n"
-		"IDetector2D_setDetectorAxes(IDetector2D self, IAxis axis0, IAxis axis1)\n"
-		"void IDetector2D::setDetectorAxes(const IAxis &axis0, const IAxis &axis1)\n"
-		"\n"
-		"Sets detector parameters using axes. \n"
-		"\n"
-		""},
 	 { "IDetector2D_removeMasks", _wrap_IDetector2D_removeMasks, METH_O, "\n"
 		"IDetector2D_removeMasks(IDetector2D self)\n"
 		"void IDetector2D::removeMasks()\n"
@@ -130783,8 +130802,8 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		""},
 	 { "SphericalDetector_defaultAxesUnits", _wrap_SphericalDetector_defaultAxesUnits, METH_O, "\n"
-		"SphericalDetector_defaultAxesUnits(SphericalDetector self) -> AxesUnits\n"
-		"AxesUnits SphericalDetector::defaultAxesUnits() const override\n"
+		"SphericalDetector_defaultAxesUnits(SphericalDetector self) -> Axes::Units\n"
+		"Axes::Units SphericalDetector::defaultAxesUnits() const override\n"
 		"\n"
 		"return default axes units \n"
 		"\n"
@@ -131004,8 +131023,8 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		""},
 	 { "RectangularDetector_defaultAxesUnits", _wrap_RectangularDetector_defaultAxesUnits, METH_O, "\n"
-		"RectangularDetector_defaultAxesUnits(RectangularDetector self) -> AxesUnits\n"
-		"AxesUnits RectangularDetector::defaultAxesUnits() const override\n"
+		"RectangularDetector_defaultAxesUnits(RectangularDetector self) -> Axes::Units\n"
+		"Axes::Units RectangularDetector::defaultAxesUnits() const override\n"
 		"\n"
 		"return default axes units \n"
 		"\n"
@@ -131498,8 +131517,18 @@ static PyMethodDef SwigMethods[] = {
 	 { "delete_IntensityFunctionSqrt", _wrap_delete_IntensityFunctionSqrt, METH_O, "delete_IntensityFunctionSqrt(IntensityFunctionSqrt self)"},
 	 { "IntensityFunctionSqrt_swigregister", IntensityFunctionSqrt_swigregister, METH_O, NULL},
 	 { "IntensityFunctionSqrt_swiginit", IntensityFunctionSqrt_swiginit, METH_VARARGS, NULL},
-	 { "delete_AxesUnits", _wrap_delete_AxesUnits, METH_O, "delete_AxesUnits(AxesUnits self)"},
-	 { "AxesUnits_swigregister", AxesUnits_swigregister, METH_O, NULL},
+	 { "new_Axes", _wrap_new_Axes, METH_NOARGS, "\n"
+		"new_Axes() -> Axes\n"
+		"\n"
+		"\n"
+		"Wrapper for detector axes units, required for a better representation of detector axes units in python\n"
+		"\n"
+		"C++ includes: IUnitConverter.h\n"
+		"\n"
+		""},
+	 { "delete_Axes", _wrap_delete_Axes, METH_O, "delete_Axes(Axes self)"},
+	 { "Axes_swigregister", Axes_swigregister, METH_O, NULL},
+	 { "Axes_swiginit", Axes_swiginit, METH_VARARGS, NULL},
 	 { "delete_IUnitConverter", _wrap_delete_IUnitConverter, METH_O, "\n"
 		"delete_IUnitConverter(IUnitConverter self)\n"
 		"IUnitConverter::~IUnitConverter()\n"
@@ -131516,13 +131545,13 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		""},
 	 { "IUnitConverter_calculateMin", _wrap_IUnitConverter_calculateMin, METH_VARARGS, "\n"
-		"IUnitConverter_calculateMin(IUnitConverter self, size_t i_axis, AxesUnits units_type) -> double\n"
-		"virtual double IUnitConverter::calculateMin(size_t i_axis, AxesUnits units_type) const =0\n"
+		"IUnitConverter_calculateMin(IUnitConverter self, size_t i_axis, Axes::Units units_type) -> double\n"
+		"virtual double IUnitConverter::calculateMin(size_t i_axis, Axes::Units units_type) const =0\n"
 		"\n"
 		""},
 	 { "IUnitConverter_calculateMax", _wrap_IUnitConverter_calculateMax, METH_VARARGS, "\n"
-		"IUnitConverter_calculateMax(IUnitConverter self, size_t i_axis, AxesUnits units_type) -> double\n"
-		"virtual double IUnitConverter::calculateMax(size_t i_axis, AxesUnits units_type) const =0\n"
+		"IUnitConverter_calculateMax(IUnitConverter self, size_t i_axis, Axes::Units units_type) -> double\n"
+		"virtual double IUnitConverter::calculateMax(size_t i_axis, Axes::Units units_type) const =0\n"
 		"\n"
 		""},
 	 { "IUnitConverter_axisSize", _wrap_IUnitConverter_axisSize, METH_VARARGS, "\n"
@@ -131531,23 +131560,23 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		""},
 	 { "IUnitConverter_axisName", _wrap_IUnitConverter_axisName, METH_VARARGS, "\n"
-		"IUnitConverter_axisName(IUnitConverter self, size_t i_axis, AxesUnits units_type=AxesUnits::DEFAULT) -> std::string\n"
-		"std::string IUnitConverter::axisName(size_t i_axis, AxesUnits units_type=AxesUnits::DEFAULT) const\n"
+		"IUnitConverter_axisName(IUnitConverter self, size_t i_axis, Axes::Units units_type=Axes::Units::DEFAULT) -> std::string\n"
+		"std::string IUnitConverter::axisName(size_t i_axis, Axes::Units units_type=Axes::Units::DEFAULT) const\n"
 		"\n"
 		""},
 	 { "IUnitConverter_availableUnits", _wrap_IUnitConverter_availableUnits, METH_O, "\n"
-		"IUnitConverter_availableUnits(IUnitConverter self) -> std::vector< AxesUnits,std::allocator< AxesUnits > >\n"
-		"virtual std::vector<AxesUnits> IUnitConverter::availableUnits() const =0\n"
+		"IUnitConverter_availableUnits(IUnitConverter self) -> std::vector< Axes::Units,std::allocator< Axes::Units > >\n"
+		"virtual std::vector<Axes::Units> IUnitConverter::availableUnits() const =0\n"
 		"\n"
 		""},
 	 { "IUnitConverter_defaultUnits", _wrap_IUnitConverter_defaultUnits, METH_O, "\n"
-		"IUnitConverter_defaultUnits(IUnitConverter self) -> AxesUnits\n"
-		"virtual AxesUnits IUnitConverter::defaultUnits() const =0\n"
+		"IUnitConverter_defaultUnits(IUnitConverter self) -> Axes::Units\n"
+		"virtual Axes::Units IUnitConverter::defaultUnits() const =0\n"
 		"\n"
 		""},
 	 { "IUnitConverter_substituteDefaultUnits", _wrap_IUnitConverter_substituteDefaultUnits, METH_VARARGS, "\n"
-		"IUnitConverter_substituteDefaultUnits(IUnitConverter self, AxesUnits units) -> AxesUnits\n"
-		"AxesUnits IUnitConverter::substituteDefaultUnits(AxesUnits units) const\n"
+		"IUnitConverter_substituteDefaultUnits(IUnitConverter self, Axes::Units units) -> Axes::Units\n"
+		"Axes::Units IUnitConverter::substituteDefaultUnits(Axes::Units units) const\n"
 		"\n"
 		""},
 	 { "IUnitConverter_swigregister", IUnitConverter_swigregister, METH_O, NULL},
@@ -132139,13 +132168,13 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		""},
 	 { "SimulationResult_histogram2d", _wrap_SimulationResult_histogram2d, METH_VARARGS, "\n"
-		"SimulationResult_histogram2d(SimulationResult self, AxesUnits units=AxesUnits::DEFAULT) -> Histogram2D\n"
-		"Histogram2D * SimulationResult::histogram2d(AxesUnits units=AxesUnits::DEFAULT) const\n"
+		"SimulationResult_histogram2d(SimulationResult self, Axes::Units units=Axes::Units::DEFAULT) -> Histogram2D\n"
+		"Histogram2D * SimulationResult::histogram2d(Axes::Units units=Axes::Units::DEFAULT) const\n"
 		"\n"
 		""},
 	 { "SimulationResult_axisInfo", _wrap_SimulationResult_axisInfo, METH_VARARGS, "\n"
-		"SimulationResult_axisInfo(SimulationResult self, AxesUnits units=AxesUnits::DEFAULT) -> swig_dummy_type_axisinfo_vector\n"
-		"std::vector< AxisInfo > SimulationResult::axisInfo(AxesUnits units=AxesUnits::DEFAULT) const\n"
+		"SimulationResult_axisInfo(SimulationResult self, Axes::Units units=Axes::Units::DEFAULT) -> swig_dummy_type_axisinfo_vector\n"
+		"std::vector< AxisInfo > SimulationResult::axisInfo(Axes::Units units=Axes::Units::DEFAULT) const\n"
 		"\n"
 		"Provide  AxisInfo for each axis and the given units. \n"
 		"\n"
@@ -132162,17 +132191,22 @@ static PyMethodDef SwigMethods[] = {
 		"size_t SimulationResult::size() const\n"
 		"\n"
 		""},
+	 { "SimulationResult_empty", _wrap_SimulationResult_empty, METH_O, "\n"
+		"SimulationResult_empty(SimulationResult self) -> bool\n"
+		"bool SimulationResult::empty() const\n"
+		"\n"
+		""},
 	 { "SimulationResult_array", _wrap_SimulationResult_array, METH_VARARGS, "\n"
-		"SimulationResult_array(SimulationResult self, AxesUnits units=AxesUnits::DEFAULT) -> PyObject\n"
-		"PyObject * SimulationResult::array(AxesUnits units=AxesUnits::DEFAULT) const\n"
+		"SimulationResult_array(SimulationResult self, Axes::Units units=Axes::Units::DEFAULT) -> PyObject\n"
+		"PyObject * SimulationResult::array(Axes::Units units=Axes::Units::DEFAULT) const\n"
 		"\n"
 		"returns intensity data as Python numpy array \n"
 		"\n"
 		""},
 	 { "SimulationResult_axis", _wrap_SimulationResult_axis, METH_VARARGS, "\n"
-		"SimulationResult_axis(SimulationResult self, AxesUnits units=AxesUnits::DEFAULT) -> vdouble1d_t\n"
-		"SimulationResult_axis(SimulationResult self, size_t i_axis, AxesUnits units=AxesUnits::DEFAULT) -> vdouble1d_t\n"
-		"std::vector< double > SimulationResult::axis(size_t i_axis, AxesUnits units=AxesUnits::DEFAULT) const\n"
+		"SimulationResult_axis(SimulationResult self, Axes::Units units=Axes::Units::DEFAULT) -> vdouble1d_t\n"
+		"SimulationResult_axis(SimulationResult self, size_t i_axis, Axes::Units units=Axes::Units::DEFAULT) -> vdouble1d_t\n"
+		"std::vector< double > SimulationResult::axis(size_t i_axis, Axes::Units units=Axes::Units::DEFAULT) const\n"
 		"\n"
 		"Returns axis coordinates as a numpy array. With no parameters given returns coordinates of x-axis in default units. \n"
 		"\n"
@@ -135022,8 +135056,7 @@ static void *_p_OffSpecSimulationTo_p_Simulation2D(void *x, int *SWIGUNUSEDPARM(
 }
 static swig_type_info _swigt__p_AngularSpecScan = {"_p_AngularSpecScan", "AngularSpecScan *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Attributes = {"_p_Attributes", "Attributes *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_AxesUnitsWrap = {"_p_AxesUnitsWrap", "AxesUnitsWrap *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_AxesUnitsWrap__AxesUnits = {"_p_AxesUnitsWrap__AxesUnits", "enum AxesUnitsWrap::AxesUnits *|AxesUnits *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Axes = {"_p_Axes", "Axes *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_AxisInfo = {"_p_AxisInfo", "std::vector< AxisInfo >::value_type *|AxisInfo *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_BasicLattice = {"_p_BasicLattice", "BasicLattice *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_BasicVector3DT_double_t = {"_p_BasicVector3DT_double_t", "std::vector< BasicVector3D< double > >::value_type *|kvector_t *|BasicVector3D< double > *", 0, 0, (void*)0, 0};
@@ -135319,11 +135352,12 @@ static swig_type_info _swigt__p_std__functionT_void_fF_t = {"_p_std__functionT_v
 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_Axes__Units_char_const_p_std__lessT_Axes__Units_t_std__allocatorT_std__pairT_Axes__Units_const_char_const_p_t_t_t = {"_p_std__mapT_Axes__Units_char_const_p_std__lessT_Axes__Units_t_std__allocatorT_std__pairT_Axes__Units_const_char_const_p_t_t_t", "std::map< Axes::Units,char const *,std::less< Axes::Units >,std::allocator< std::pair< Axes::Units const,char const * > > > *|std::map< enum Axes::Units,char const *,std::less< enum Axes::Units >,std::allocator< std::pair< enum Axes::Units const,char const * > > > *", 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__shared_ptrT_IObserver_t = {"_p_std__shared_ptrT_IObserver_t", "std::shared_ptr< IObserver > *|IObservable::observer_t *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__shared_ptrT_ISampleBuilder_t = {"_p_std__shared_ptrT_ISampleBuilder_t", "std::shared_ptr< ISampleBuilder > *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_std__vectorT_AxesUnitsWrap__AxesUnits_std__allocatorT_AxesUnitsWrap__AxesUnits_t_t = {"_p_std__vectorT_AxesUnitsWrap__AxesUnits_std__allocatorT_AxesUnitsWrap__AxesUnits_t_t", "std::vector< enum AxesUnitsWrap::AxesUnits,std::allocator< enum AxesUnitsWrap::AxesUnits > > *|std::vector< AxesUnits,std::allocator< AxesUnits > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_Axes__Units_std__allocatorT_Axes__Units_t_t = {"_p_std__vectorT_Axes__Units_std__allocatorT_Axes__Units_t_t", "std::vector< Axes::Units,std::allocator< Axes::Units > > *|std::vector< enum Axes::Units,std::allocator< enum Axes::Units > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t = {"_p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t", "std::vector< AxisInfo,std::allocator< AxisInfo > > *|std::vector< AxisInfo > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t = {"_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t", "std::vector< BasicVector3D< double > > *|std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t = {"_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t", "std::vector< BasicVector3D< std::complex< double > > > *|std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > *", 0, 0, (void*)0, 0};
@@ -135357,8 +135391,7 @@ static swig_type_info _swigt__p_value_type = {"_p_value_type", "value_type *", 0
 static swig_type_info *swig_type_initial[] = {
   &_swigt__p_AngularSpecScan,
   &_swigt__p_Attributes,
-  &_swigt__p_AxesUnitsWrap,
-  &_swigt__p_AxesUnitsWrap__AxesUnits,
+  &_swigt__p_Axes,
   &_swigt__p_AxisInfo,
   &_swigt__p_BasicLattice,
   &_swigt__p_BasicVector3DT_double_t,
@@ -135654,11 +135687,12 @@ static swig_type_info *swig_type_initial[] = {
   &_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_Axes__Units_char_const_p_std__lessT_Axes__Units_t_std__allocatorT_std__pairT_Axes__Units_const_char_const_p_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,
   &_swigt__p_std__pairT_double_double_t,
   &_swigt__p_std__shared_ptrT_IObserver_t,
   &_swigt__p_std__shared_ptrT_ISampleBuilder_t,
-  &_swigt__p_std__vectorT_AxesUnitsWrap__AxesUnits_std__allocatorT_AxesUnitsWrap__AxesUnits_t_t,
+  &_swigt__p_std__vectorT_Axes__Units_std__allocatorT_Axes__Units_t_t,
   &_swigt__p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t,
   &_swigt__p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t,
   &_swigt__p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t,
@@ -135692,8 +135726,7 @@ static swig_type_info *swig_type_initial[] = {
 
 static swig_cast_info _swigc__p_AngularSpecScan[] = {  {&_swigt__p_AngularSpecScan, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Attributes[] = {  {&_swigt__p_Attributes, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_AxesUnitsWrap[] = {  {&_swigt__p_AxesUnitsWrap, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_AxesUnitsWrap__AxesUnits[] = {  {&_swigt__p_AxesUnitsWrap__AxesUnits, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Axes[] = {  {&_swigt__p_Axes, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_AxisInfo[] = {  {&_swigt__p_AxisInfo, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_BasicLattice[] = {  {&_swigt__p_BasicLattice, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_BasicVector3DT_double_t[] = {  {&_swigt__p_BasicVector3DT_double_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -135989,11 +136022,12 @@ static swig_cast_info _swigc__p_std__functionT_void_fF_t[] = {  {&_swigt__p_std_
 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_Axes__Units_char_const_p_std__lessT_Axes__Units_t_std__allocatorT_std__pairT_Axes__Units_const_char_const_p_t_t_t[] = {  {&_swigt__p_std__mapT_Axes__Units_char_const_p_std__lessT_Axes__Units_t_std__allocatorT_std__pairT_Axes__Units_const_char_const_p_t_t_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__shared_ptrT_IObserver_t[] = {  {&_swigt__p_std__shared_ptrT_IObserver_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__shared_ptrT_ISampleBuilder_t[] = {  {&_swigt__p_std__shared_ptrT_ISampleBuilder_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_std__vectorT_AxesUnitsWrap__AxesUnits_std__allocatorT_AxesUnitsWrap__AxesUnits_t_t[] = {  {&_swigt__p_std__vectorT_AxesUnitsWrap__AxesUnits_std__allocatorT_AxesUnitsWrap__AxesUnits_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_Axes__Units_std__allocatorT_Axes__Units_t_t[] = {  {&_swigt__p_std__vectorT_Axes__Units_std__allocatorT_Axes__Units_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t[] = {  {&_swigt__p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t[] = {  {&_swigt__p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t[] = {  {&_swigt__p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -136027,8 +136061,7 @@ static swig_cast_info _swigc__p_value_type[] = {  {&_swigt__p_value_type, 0, 0,
 static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_AngularSpecScan,
   _swigc__p_Attributes,
-  _swigc__p_AxesUnitsWrap,
-  _swigc__p_AxesUnitsWrap__AxesUnits,
+  _swigc__p_Axes,
   _swigc__p_AxisInfo,
   _swigc__p_BasicLattice,
   _swigc__p_BasicVector3DT_double_t,
@@ -136324,11 +136357,12 @@ static swig_cast_info *swig_cast_initial[] = {
   _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_Axes__Units_char_const_p_std__lessT_Axes__Units_t_std__allocatorT_std__pairT_Axes__Units_const_char_const_p_t_t_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__shared_ptrT_IObserver_t,
   _swigc__p_std__shared_ptrT_ISampleBuilder_t,
-  _swigc__p_std__vectorT_AxesUnitsWrap__AxesUnits_std__allocatorT_AxesUnitsWrap__AxesUnits_t_t,
+  _swigc__p_std__vectorT_Axes__Units_std__allocatorT_Axes__Units_t_t,
   _swigc__p_std__vectorT_AxisInfo_std__allocatorT_AxisInfo_t_t,
   _swigc__p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t,
   _swigc__p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t,
@@ -137149,14 +137183,16 @@ SWIG_init(void) {
   SWIG_Python_SetConstant(d, "IHistogram_AVERAGE",SWIG_From_int(static_cast< int >(IHistogram::AVERAGE)));
   SWIG_Python_SetConstant(d, "IHistogram_STANDARD_ERROR",SWIG_From_int(static_cast< int >(IHistogram::STANDARD_ERROR)));
   SWIG_Python_SetConstant(d, "IHistogram_NENTRIES",SWIG_From_int(static_cast< int >(IHistogram::NENTRIES)));
-  SWIG_Python_SetConstant(d, "AxesUnits_DEFAULT",SWIG_From_int(static_cast< int >(AxesUnitsWrap::DEFAULT)));
-  SWIG_Python_SetConstant(d, "AxesUnits_NBINS",SWIG_From_int(static_cast< int >(AxesUnitsWrap::NBINS)));
-  SWIG_Python_SetConstant(d, "AxesUnits_RADIANS",SWIG_From_int(static_cast< int >(AxesUnitsWrap::RADIANS)));
-  SWIG_Python_SetConstant(d, "AxesUnits_DEGREES",SWIG_From_int(static_cast< int >(AxesUnitsWrap::DEGREES)));
-  SWIG_Python_SetConstant(d, "AxesUnits_MM",SWIG_From_int(static_cast< int >(AxesUnitsWrap::MM)));
-  SWIG_Python_SetConstant(d, "AxesUnits_QSPACE",SWIG_From_int(static_cast< int >(AxesUnitsWrap::QSPACE)));
-  SWIG_Python_SetConstant(d, "AxesUnits_QXQY",SWIG_From_int(static_cast< int >(AxesUnitsWrap::QXQY)));
-  SWIG_Python_SetConstant(d, "AxesUnits_RQ4",SWIG_From_int(static_cast< int >(AxesUnitsWrap::RQ4)));
+  SWIG_Python_SetConstant(d, "Axes_DEFAULT",SWIG_From_int(static_cast< int >(Axes::DEFAULT)));
+  SWIG_Python_SetConstant(d, "Axes_NBINS",SWIG_From_int(static_cast< int >(Axes::NBINS)));
+  SWIG_Python_SetConstant(d, "Axes_RADIANS",SWIG_From_int(static_cast< int >(Axes::RADIANS)));
+  SWIG_Python_SetConstant(d, "Axes_DEGREES",SWIG_From_int(static_cast< int >(Axes::DEGREES)));
+  SWIG_Python_SetConstant(d, "Axes_MM",SWIG_From_int(static_cast< int >(Axes::MM)));
+  SWIG_Python_SetConstant(d, "Axes_QSPACE",SWIG_From_int(static_cast< int >(Axes::QSPACE)));
+  SWIG_Python_SetConstant(d, "Axes_QXQY",SWIG_From_int(static_cast< int >(Axes::QXQY)));
+  SWIG_Python_SetConstant(d, "Axes_RQ4",SWIG_From_int(static_cast< int >(Axes::RQ4)));
+  SWIG_addvarlink(globals, "axisUnitName", Swig_var_axisUnitName_get, Swig_var_axisUnitName_set);
+  SWIG_addvarlink(globals, "axisUnitLabel", Swig_var_axisUnitLabel_get, Swig_var_axisUnitLabel_set);
   SWIG_Python_SetConstant(d, "MillerIndexOrientation_QX",SWIG_From_int(static_cast< int >(MillerIndexOrientation::QX)));
   SWIG_Python_SetConstant(d, "MillerIndexOrientation_QY",SWIG_From_int(static_cast< int >(MillerIndexOrientation::QY)));
   SWIG_Python_SetConstant(d, "MillerIndexOrientation_QZ",SWIG_From_int(static_cast< int >(MillerIndexOrientation::QZ)));
diff --git a/cmake/modules/CheckCompiler.cmake b/cmake/modules/CheckCompiler.cmake
index 8b4f3c995b4600ff3acae48bdf1cad5e5d1622e1..8a0c88c44b025cf136e5d726914d9ea62a19cf3e 100644
--- a/cmake/modules/CheckCompiler.cmake
+++ b/cmake/modules/CheckCompiler.cmake
@@ -2,17 +2,20 @@
 #  CheckCompiler.cmake
 #---------------------------------------------------------------------------------------------------
 
-#---Set a default build type for single-configuration CMake generators if no build type is set------
+#--- Set a default build type for single-configuration CMake generators if no build type is set ---
+
 if(NOT CMAKE_BUILD_TYPE)
     #  set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "" FORCE)
     set(CMAKE_BUILD_TYPE Release CACHE STRING "" FORCE)
 endif()
 message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
 
-#---Need to locate thead libraries and options to set properly some compilation flags---------------
+#--- Need to locate thead libraries and options to set properly some compilation flags ---
+
 find_package(Threads)
 
-#---Setup details depending on the major platform type----------------------------------------------
+#--- Setup details depending on the major platform type ---
+
 if(CMAKE_SYSTEM_NAME MATCHES Linux)
     include(SetUpLinux)
 elseif(APPLE)
@@ -21,7 +24,8 @@ elseif(WIN32)
     include(SetUpWindows)
 endif()
 
-#---Print the final compiler flags------------------------------------------------------------------
+#--- Print the final compiler flags ---
+
 message(STATUS "BornAgain Platform: ${BORNAGAIN_PLATFORM}")
 message(STATUS "BornAgain Architecture: ${BORNAGAIN_ARCHITECTURE}")
 message(STATUS "Build Type: ${CMAKE_BUILD_TYPE}")