diff --git a/.clang-tidy b/.clang-tidy
index 7e7b70be9cda99c75c38706a5cce1525f8f080c1..b34d484da73f65c362e874c2bd7b317a5d9db7f1 100644
--- a/.clang-tidy
+++ b/.clang-tidy
@@ -95,6 +95,7 @@ Checks: '
 -*narrowing-conversions,
 -cppcoreguidelines-owning-memory,
 -bugprone-unused-return-value,
+-bugprone-parent-virtual-call,
 
 
 -SectionComment_Temporarily_disabled_checks__To_be_resolved_soon,
@@ -104,7 +105,6 @@ Checks: '
 *-use-equals-default,
 *-use-nullptr,
 *-use-override,
--bugprone-parent-virtual-call,
 clang-analyzer-core.CallAndMessage,
 clang-analyzer-optin.cplusplus.VirtualCall,
 cppcoreguidelines-explicit-virtual-functions,
diff --git a/Base/Axis/Bin.h b/Base/Axis/Bin.h
index 43a26fa2c1a3b30c9b653714bf8ff4c5b5797840..bd8dadf7a85f169bb3787c124ba9d12e7cdad3e1 100644
--- a/Base/Axis/Bin.h
+++ b/Base/Axis/Bin.h
@@ -18,7 +18,7 @@
 #include "Base/Vector/Vectors3D.h"
 
 struct Bin1D {
-    Bin1D()  = default;
+    Bin1D() = default;
     Bin1D(double lower, double upper) : m_lower(lower), m_upper(upper) {}
     double m_lower{0}; //!< lower bound of the bin
     double m_upper{0}; //!< upper bound of the bin
@@ -33,7 +33,7 @@ bool BinContains(const Bin1D& bin, double value);
 //! An one-dimensional range of R3's.
 
 struct Bin1DKVector {
-    Bin1DKVector()  = default;
+    Bin1DKVector() = default;
     Bin1DKVector(const R3 lower, const R3 upper) : m_q_lower(lower), m_q_upper(upper) {}
     Bin1DKVector(double wavelength, const Bin1D& alpha_bin, const Bin1D& phi_bin);
 
@@ -47,7 +47,7 @@ struct Bin1DKVector {
 
 class Bin1DCVector {
 public:
-    Bin1DCVector()  = default;
+    Bin1DCVector() = default;
     Bin1DCVector(C3 lower, C3 upper) : m_q_lower(lower), m_q_upper(upper) {}
     Bin1DCVector(double wavelength, const Bin1D& alpha_bin, const Bin1D& phi_bin);
     C3 center() const { return (m_q_lower + m_q_upper) / 2.0; }
diff --git a/Base/Axis/IAxis.h b/Base/Axis/IAxis.h
index b6b5706f86b5337560d3fdc06ab2b0e0f4264f04..de41b692c1d86f237a3d7e57b72def0819f51c2a 100644
--- a/Base/Axis/IAxis.h
+++ b/Base/Axis/IAxis.h
@@ -24,7 +24,7 @@
 
 class IAxis {
 public:
-    explicit IAxis(std::string  name) : m_name(std::move(name)) {}
+    explicit IAxis(std::string name) : m_name(std::move(name)) {}
     IAxis(const IAxis&) = delete;
     virtual ~IAxis() = default;
 
diff --git a/Base/Axis/VariableBinAxis.cpp b/Base/Axis/VariableBinAxis.cpp
index fe8f31129b461b9cd51cc9a083190d6771438e44..1ba874c3a41aa038a8540a9799a47408bb5920df 100644
--- a/Base/Axis/VariableBinAxis.cpp
+++ b/Base/Axis/VariableBinAxis.cpp
@@ -78,8 +78,7 @@ size_t VariableBinAxis::findClosestIndex(double value) const
     if (value >= upperBound())
         return m_nbins - 1;
 
-    auto top_limit =
-        std::lower_bound(m_bin_boundaries.begin(), m_bin_boundaries.end(), value);
+    auto top_limit = std::lower_bound(m_bin_boundaries.begin(), m_bin_boundaries.end(), value);
     if (*top_limit != value)
         --top_limit;
     size_t nbin = top_limit - m_bin_boundaries.begin();
diff --git a/Base/Element/IElement.h b/Base/Element/IElement.h
index 527e97ea18a5a3676ff2d9995dbda683330dc836..02acf3cd6a6e85f4a33d083e25a9bf5fb7f8d491 100644
--- a/Base/Element/IElement.h
+++ b/Base/Element/IElement.h
@@ -29,7 +29,7 @@
 
 class IElement {
 public:
-    explicit IElement(PolMatrices  polpair) : m_polpair(std::move(polpair)) {}
+    explicit IElement(PolMatrices polpair) : m_polpair(std::move(polpair)) {}
 
 protected:
     const PolMatrices m_polpair;
diff --git a/Base/Element/PolMatrices.cpp b/Base/Element/PolMatrices.cpp
index a7f9c40e080cbdf3c2faa3964f2cc20a90b48ecc..484808b9e3a6b1976577ba77722223948e46bf7a 100644
--- a/Base/Element/PolMatrices.cpp
+++ b/Base/Element/PolMatrices.cpp
@@ -23,7 +23,7 @@ PolMatrices::PolMatrices()
 {
 }
 
-PolMatrices::PolMatrices(Eigen::Matrix2cd  polarization, Eigen::Matrix2cd  analyzer)
+PolMatrices::PolMatrices(Eigen::Matrix2cd polarization, Eigen::Matrix2cd analyzer)
     : m_polarizer_matrix(std::move(polarization)), m_analyzer_matrix(std::move(analyzer))
 {
 }
diff --git a/Base/Element/PolMatrices.h b/Base/Element/PolMatrices.h
index a627eb944babd90afe6eb55d41317460fd8cc632..7eb16cb441ca988273bf6bc51e8974c4f3ae4958 100644
--- a/Base/Element/PolMatrices.h
+++ b/Base/Element/PolMatrices.h
@@ -28,7 +28,7 @@
 class PolMatrices {
 public:
     PolMatrices();
-    PolMatrices(Eigen::Matrix2cd  polarization, Eigen::Matrix2cd  analyzer);
+    PolMatrices(Eigen::Matrix2cd polarization, Eigen::Matrix2cd analyzer);
 
     //! Sets the polarization density matrix (in spin basis along z-axis)
     void setPolarizerMatrix(const Eigen::Matrix2cd& polarization)
diff --git a/Base/Math/FourierTransform.cpp b/Base/Math/FourierTransform.cpp
index 4c3c8c82a0cdc5b8cf92aee25c852f8cbc9f054e..60caca13ec60cfdaa95a24f111530fbbb2c98f2c 100644
--- a/Base/Math/FourierTransform.cpp
+++ b/Base/Math/FourierTransform.cpp
@@ -65,8 +65,7 @@ void FourierTransform::fft(const double2d_t& source, double2d_t& result)
     const size_t nh = ws.h_fftw;
 
     // Resize the array for holding the FT output to correct dimensions
-    result.resize(nh,
-                  std::vector<double>(static_cast<size_t>(ws.w_fftw)));
+    result.resize(nh, std::vector<double>(static_cast<size_t>(ws.w_fftw)));
 
     // Storing FT output
     for (size_t i = 0; i < nh; i++) {
diff --git a/Base/Progress/ProgressHandler.h b/Base/Progress/ProgressHandler.h
index d2c6bd9c71f12e33c3ec44e3712fa4e29b999b8a..31e34fce16e4515c890139f8328348712072607e 100644
--- a/Base/Progress/ProgressHandler.h
+++ b/Base/Progress/ProgressHandler.h
@@ -35,10 +35,7 @@ class ProgressHandler {
 public:
     using Callback_t = std::function<bool(size_t)>;
 
-    ProgressHandler()
-        : m_inform(nullptr) 
-    {
-    }
+    ProgressHandler() : m_inform(nullptr) {}
     ProgressHandler(const ProgressHandler& other)
         : m_inform(other.m_inform) // not clear whether we want multiple copies of this
         , m_expected_nticks(other.m_expected_nticks)
diff --git a/Base/Types/SafePointerVector.h b/Base/Types/SafePointerVector.h
index 56651b3022db4ac893aa5c1fd924fdf637a11f69..9413ed149ce25356a9c934d94cfd224b8bdf2e09 100644
--- a/Base/Types/SafePointerVector.h
+++ b/Base/Types/SafePointerVector.h
@@ -29,15 +29,15 @@
 
 template <class T> class SafePointerVector {
 public:
-    using iterator = typename std::vector<T *>::iterator;
-    using const_iterator = typename std::vector<T *>::const_iterator;
+    using iterator = typename std::vector<T*>::iterator;
+    using const_iterator = typename std::vector<T*>::const_iterator;
     SafePointerVector() = default;
     SafePointerVector(const SafePointerVector& other);
-    SafePointerVector(SafePointerVector&& other) noexcept ;
+    SafePointerVector(SafePointerVector&& other) noexcept;
     ~SafePointerVector() { clear(); }
 
     SafePointerVector& operator=(const SafePointerVector& right);
-    SafePointerVector& operator=(SafePointerVector&& right) noexcept ;
+    SafePointerVector& operator=(SafePointerVector&& right) noexcept;
     size_t size() const { return m_pointers.size(); }
     bool empty() const { return m_pointers.empty(); }
     void push_back(T* pointer) { m_pointers.push_back(pointer); }
@@ -63,8 +63,8 @@ template <class T> SafePointerVector<T>::SafePointerVector(const SafePointerVect
 }
 
 template <class T>
-SafePointerVector<T>::SafePointerVector(SafePointerVector<T>&& other)
- noexcept     : m_pointers(std::move(other.m_pointers))
+SafePointerVector<T>::SafePointerVector(SafePointerVector<T>&& other) noexcept
+    : m_pointers(std::move(other.m_pointers))
 {
 }
 
@@ -80,8 +80,8 @@ SafePointerVector<T>& SafePointerVector<T>::operator=(const SafePointerVector<T>
 }
 
 template <class T>
-SafePointerVector<T>& SafePointerVector<T>::operator=(SafePointerVector<T>&& right)
- noexcept {
+SafePointerVector<T>& SafePointerVector<T>::operator=(SafePointerVector<T>&& right) noexcept
+{
     clear();
     m_pointers = std::move(right.m_pointers);
     right.m_pointers.clear();
diff --git a/Base/Util/ThreadInfo.h b/Base/Util/ThreadInfo.h
index 4165e0b960b34494c8bc74ca33df4dddfefa645a..7d1a07f8f3b27310ddd5039bfaaf3e40254336fd 100644
--- a/Base/Util/ThreadInfo.h
+++ b/Base/Util/ThreadInfo.h
@@ -25,6 +25,6 @@ struct ThreadInfo {
     unsigned current_batch{0};
 };
 
-inline ThreadInfo::ThreadInfo()  = default;
+inline ThreadInfo::ThreadInfo() = default;
 
 #endif // BORNAGAIN_BASE_UTIL_THREADINFO_H
diff --git a/Base/Vector/Transform3D.cpp b/Base/Vector/Transform3D.cpp
index ebd0f2c31741a7d759bd358ba9af23d1aae53cb9..57b198977024e3a5cacb8f5b5fe5eb676f12b2ea 100644
--- a/Base/Vector/Transform3D.cpp
+++ b/Base/Vector/Transform3D.cpp
@@ -22,7 +22,7 @@ Transform3D::Transform3D()
     m_inverse_matrix.setIdentity();
 }
 
-Transform3D::Transform3D(Eigen::Matrix3d  matrix) : m_matrix(std::move(matrix))
+Transform3D::Transform3D(Eigen::Matrix3d matrix) : m_matrix(std::move(matrix))
 {
     m_inverse_matrix = m_matrix.inverse();
 }
diff --git a/Base/Vector/Transform3D.h b/Base/Vector/Transform3D.h
index 425ee3ffc4df3b3c2913830922ca3d5e9686db3d..b1d601bbfd6a319c6c801853cea03231f0528118 100644
--- a/Base/Vector/Transform3D.h
+++ b/Base/Vector/Transform3D.h
@@ -31,7 +31,7 @@ public:
 
 #ifndef SWIG
     //! Constructor from matrix (no checks if this is an element of SO(3)!)
-    explicit Transform3D(Eigen::Matrix3d  matrix);
+    explicit Transform3D(Eigen::Matrix3d matrix);
 #endif
 
     //! Destructor
diff --git a/Fit/Adapter/MinimizerAdapter.cpp b/Fit/Adapter/MinimizerAdapter.cpp
index 6368b052b091496ab47817b163d117e49d1fd105..3a040ecac678d76f01e328c561164bf74a1a0260 100644
--- a/Fit/Adapter/MinimizerAdapter.cpp
+++ b/Fit/Adapter/MinimizerAdapter.cpp
@@ -24,7 +24,7 @@
 
 using namespace mumufit;
 
-MinimizerAdapter::MinimizerAdapter(MinimizerInfo  minimizerInfo)
+MinimizerAdapter::MinimizerAdapter(MinimizerInfo minimizerInfo)
     : m_minimizerInfo(std::move(minimizerInfo))
     , m_adapter(new mumufit::ObjectiveFunctionAdapter)
     , m_status(false)
diff --git a/Fit/Adapter/MinimizerAdapter.h b/Fit/Adapter/MinimizerAdapter.h
index 5d89d84b38e77ab1a4e2d3033729e88257cead00..7486ec3280c6a74f8537667665b84e3311353c4e 100644
--- a/Fit/Adapter/MinimizerAdapter.h
+++ b/Fit/Adapter/MinimizerAdapter.h
@@ -76,7 +76,7 @@ public:
     void setOptions(const std::string& optionString) override;
 
 protected:
-    explicit MinimizerAdapter(MinimizerInfo  minimizerInfo);
+    explicit MinimizerAdapter(MinimizerInfo minimizerInfo);
 
     mumufit::MinimizerResult minimize(mumufit::Parameters parameters);
 
diff --git a/Fit/Adapter/ObjectiveFunctionAdapter.cpp b/Fit/Adapter/ObjectiveFunctionAdapter.cpp
index 7b23c8bd841a744f4c0be996ab462e5effea8044..34a13b8c1297d32a96b9c0bd745df7817c06097f 100644
--- a/Fit/Adapter/ObjectiveFunctionAdapter.cpp
+++ b/Fit/Adapter/ObjectiveFunctionAdapter.cpp
@@ -28,7 +28,7 @@ const RootScalarFunction*
 ObjectiveFunctionAdapter::rootObjectiveFunction(fcn_scalar_t fcn, const Parameters& parameters)
 {
     std::unique_ptr<ScalarFunctionAdapter> tem_adapter(new ScalarFunctionAdapter(fcn, parameters));
-    const auto *result = tem_adapter->rootObjectiveFunction();
+    const auto* result = tem_adapter->rootObjectiveFunction();
     m_adapter = std::move(tem_adapter);
     return result;
 }
@@ -38,7 +38,7 @@ ObjectiveFunctionAdapter::rootResidualFunction(fcn_residual_t fcn, const Paramet
 {
     std::unique_ptr<ResidualFunctionAdapter> tem_adapter(
         new ResidualFunctionAdapter(fcn, parameters));
-    const auto *result = tem_adapter->rootResidualFunction();
+    const auto* result = tem_adapter->rootResidualFunction();
     m_adapter = std::move(tem_adapter);
     return result;
 }
diff --git a/Fit/Adapter/ResidualFunctionAdapter.cpp b/Fit/Adapter/ResidualFunctionAdapter.cpp
index 5fb32c115c02891c27e48c162d2de6e7a8c6da01..aa5b016bc9c62b02913d90a0b5fb5cfa0fc6646f 100644
--- a/Fit/Adapter/ResidualFunctionAdapter.cpp
+++ b/Fit/Adapter/ResidualFunctionAdapter.cpp
@@ -44,8 +44,8 @@ const RootResidualFunction* ResidualFunctionAdapter::rootResidualFunction()
 
     scalar_function_t objective_fun = [&](const std::vector<double>& pars) { return chi2(pars); };
 
-    m_root_objective = std::make_unique<RootResidualFunction>(
-        objective_fun, gradient_fun, m_parameters.size(), m_datasize);
+    m_root_objective = std::make_unique<RootResidualFunction>(objective_fun, gradient_fun,
+                                                              m_parameters.size(), m_datasize);
 
     return m_root_objective.get();
 }
diff --git a/Fit/Adapter/ScalarFunctionAdapter.cpp b/Fit/Adapter/ScalarFunctionAdapter.cpp
index db3cad34ec5fef1e925e81918ec75d16e996aa2a..ff1e130cbf6e714532de11b9b6e144cd6d79cee5 100644
--- a/Fit/Adapter/ScalarFunctionAdapter.cpp
+++ b/Fit/Adapter/ScalarFunctionAdapter.cpp
@@ -14,12 +14,12 @@
 
 #include "Fit/Adapter/ScalarFunctionAdapter.h"
 
-#include <utility>
 #include "Fit/Adapter/RootScalarFunction.h"
+#include <utility>
 
 using namespace mumufit;
 
-ScalarFunctionAdapter::ScalarFunctionAdapter(fcn_scalar_t func, Parameters  parameters)
+ScalarFunctionAdapter::ScalarFunctionAdapter(fcn_scalar_t func, Parameters parameters)
     : m_fcn(std::move(func)), m_parameters(std::move(parameters))
 {
 }
diff --git a/Fit/Adapter/ScalarFunctionAdapter.h b/Fit/Adapter/ScalarFunctionAdapter.h
index 14a6fcc01dc9fbe8a5e8bfd79753a988433876d0..c9cd6981e55eb8c598ef95b03fd21591ee69c18a 100644
--- a/Fit/Adapter/ScalarFunctionAdapter.h
+++ b/Fit/Adapter/ScalarFunctionAdapter.h
@@ -39,7 +39,7 @@ namespace mumufit {
 
 class ScalarFunctionAdapter : public IFunctionAdapter {
 public:
-    ScalarFunctionAdapter(fcn_scalar_t func, Parameters  parameters);
+    ScalarFunctionAdapter(fcn_scalar_t func, Parameters parameters);
 
     const RootScalarFunction* rootObjectiveFunction();
 
diff --git a/Fit/Kernel/MinimizerFactory.cpp b/Fit/Kernel/MinimizerFactory.cpp
index 898aba642f3804b4fd4d488d815948e90f806d5d..7710f5a2633f9dde0eb4c135f389ab1fa8200243 100644
--- a/Fit/Kernel/MinimizerFactory.cpp
+++ b/Fit/Kernel/MinimizerFactory.cpp
@@ -112,7 +112,7 @@ std::string MinimizerFactory::catalogDetailsToString()
 
         // list of minimizer options
         std::unique_ptr<IMinimizer> minimizer(createMinimizer(minimizerName));
-        if (auto *rootMinimizer = dynamic_cast<MinimizerAdapter*>(minimizer.get())) {
+        if (auto* rootMinimizer = dynamic_cast<MinimizerAdapter*>(minimizer.get())) {
             result << "\nOptions\n";
             for (const auto& option : rootMinimizer->options()) {
                 std::ostringstream opt;
diff --git a/Fit/Minimizer/MinimizerInfo.h b/Fit/Minimizer/MinimizerInfo.h
index ad8e95a2771a11726f28929a96b6c7fd8f61565e..e3b5091e2d7c815677410cac777595eb3d12ce71 100644
--- a/Fit/Minimizer/MinimizerInfo.h
+++ b/Fit/Minimizer/MinimizerInfo.h
@@ -28,7 +28,7 @@
 
 class AlgorithmInfo {
 public:
-    AlgorithmInfo(std::string  itemName, std::string  itemDescription)
+    AlgorithmInfo(std::string itemName, std::string itemDescription)
         : m_itemName(std::move(itemName)), m_itemDescription(std::move(itemDescription))
     {
     }
@@ -45,7 +45,7 @@ private:
 
 class MinimizerInfo {
 public:
-    MinimizerInfo(std::string  minimizerType, std::string  minimizerDescription)
+    MinimizerInfo(std::string minimizerType, std::string minimizerDescription)
         : m_name(std::move(minimizerType)), m_description(std::move(minimizerDescription))
     {
     }
diff --git a/Fit/Param/Attributes.h b/Fit/Param/Attributes.h
index 0402af3caea297bbeba126d1ef7283f1e4c5c2e8..c6ffc107c525e80e810d93ed1781362d5928a1e5 100644
--- a/Fit/Param/Attributes.h
+++ b/Fit/Param/Attributes.h
@@ -25,7 +25,7 @@
 
 class Attributes {
 public:
-    Attributes()  = default;
+    Attributes() = default;
     //! Creates a fixed value object
     static Attributes fixed() { return Attributes(true); }
     static Attributes free() { return Attributes(false); }
diff --git a/Fit/Param/Parameter.cpp b/Fit/Param/Parameter.cpp
index b5e7a99aa910d356965bce7d41f6d2f607948f2e..f34ef0572035d8a445d224042af052bf6404b86c 100644
--- a/Fit/Param/Parameter.cpp
+++ b/Fit/Param/Parameter.cpp
@@ -30,7 +30,7 @@ using namespace mumufit;
 
 Parameter::Parameter() : m_start_value(0.0), m_value(0.0), m_step(0.0), m_error(0.0) {}
 
-Parameter::Parameter(std::string  name, double value, const AttLimits& limits, double step)
+Parameter::Parameter(std::string name, double value, const AttLimits& limits, double step)
     : m_name(std::move(name))
     , m_start_value(value)
     , m_value(value)
diff --git a/Fit/Param/Parameter.h b/Fit/Param/Parameter.h
index 9f5ab358fe0f01427ba0884f0144b39492e262c5..eb57c4f18b38ee278339831df0ce46d7f466cfab 100644
--- a/Fit/Param/Parameter.h
+++ b/Fit/Param/Parameter.h
@@ -33,8 +33,8 @@ public:
     //! @param limits: fit parameter limits
     //! @param step: initial step of fit parameter during the minimization,
     //! will be calculated automatically, if zero.
-    Parameter(std::string  name, double value,
-              const AttLimits& limits = AttLimits::limitless(), double step = 0.0);
+    Parameter(std::string name, double value, const AttLimits& limits = AttLimits::limitless(),
+              double step = 0.0);
 
     std::string name() const;
 
diff --git a/Fit/TestEngine/MinimizerTestPlan.h b/Fit/TestEngine/MinimizerTestPlan.h
index 911ca63ac546a06acc1a8a578d3db8a5a3c612d6..c6718818342d0b2cfdff336dffd6ee0c2b1b8a57 100644
--- a/Fit/TestEngine/MinimizerTestPlan.h
+++ b/Fit/TestEngine/MinimizerTestPlan.h
@@ -45,7 +45,7 @@ class Minimizer;
 class MinimizerTestPlan {
 public:
     MinimizerTestPlan() = default;
-    explicit MinimizerTestPlan(std::vector<ParameterReference>  parameter_references)
+    explicit MinimizerTestPlan(std::vector<ParameterReference> parameter_references)
         : m_parameter_references(std::move(parameter_references))
     {
     }
diff --git a/Fit/Tools/MultiOption.cpp b/Fit/Tools/MultiOption.cpp
index 332378eef4b9d160a15618ffd76724f2fe24cb74..dc53552d79484d66db2f87eefcd1fc7c1608ca00 100644
--- a/Fit/Tools/MultiOption.cpp
+++ b/Fit/Tools/MultiOption.cpp
@@ -16,7 +16,7 @@
 #include <string>
 #include <utility>
 
-MultiOption::MultiOption(std::string  name) : m_name(std::move(name)) {}
+MultiOption::MultiOption(std::string name) : m_name(std::move(name)) {}
 
 std::string MultiOption::name() const
 {
diff --git a/Fit/Tools/MultiOption.h b/Fit/Tools/MultiOption.h
index 10e4870d798ce9f47b1dd0c66bd341e38995c5bc..996967a335e133782a097c1106c19fc4ae5147d2 100644
--- a/Fit/Tools/MultiOption.h
+++ b/Fit/Tools/MultiOption.h
@@ -29,7 +29,7 @@ class MultiOption {
 public:
     using variant_t = std::variant<int, double, std::string>;
 
-    explicit MultiOption(std::string  name = "");
+    explicit MultiOption(std::string name = "");
 
     template <typename T>
     explicit MultiOption(const std::string& name, const T& t, const std::string& descripion = "");
diff --git a/GUI/Model/Sample/ParticleLayoutItem.cpp b/GUI/Model/Sample/ParticleLayoutItem.cpp
index db2d8bec5d61940ef6087c23bf4a813e3219bcfd..440a3a7b7af4c2c260dce82426ec06895a5db648 100644
--- a/GUI/Model/Sample/ParticleLayoutItem.cpp
+++ b/GUI/Model/Sample/ParticleLayoutItem.cpp
@@ -27,9 +27,9 @@ namespace {
 bool isInterference2D(const QString& model_type)
 {
     return model_type == Interference2DLatticeItem::M_TYPE
-        || model_type == Interference2DParaCrystalItem::M_TYPE
-        || model_type == InterferenceFinite2DLatticeItem::M_TYPE
-        || model_type == InterferenceHardDiskItem::M_TYPE;
+           || model_type == Interference2DParaCrystalItem::M_TYPE
+           || model_type == InterferenceFinite2DLatticeItem::M_TYPE
+           || model_type == InterferenceHardDiskItem::M_TYPE;
 }
 
 //! Returns true if name is related to 2D interference functions.
diff --git a/GUI/View/Info/PythonSyntaxHighlighter.cpp b/GUI/View/Info/PythonSyntaxHighlighter.cpp
index 05880c12884d072c317cac107ab445581aab7228..4446856bb96bc001634c5bdfe144b720b2e31cf9 100644
--- a/GUI/View/Info/PythonSyntaxHighlighter.cpp
+++ b/GUI/View/Info/PythonSyntaxHighlighter.cpp
@@ -233,7 +233,7 @@ bool PythonSyntaxHighlighter::matchMultiline(const QString& text, const QRegExp&
 }
 
 QTextCharFormat PythonSyntaxHighlighter::getTextCharFormat(const QString& colorName,
-                                                                 const QString& style)
+                                                           const QString& style)
 {
     QTextCharFormat charFormat;
     QColor color(colorName);
diff --git a/GUI/View/Instrument/ResolutionFunctionEditor.cpp b/GUI/View/Instrument/ResolutionFunctionEditor.cpp
index a1148a732bff56323238ff024e14b46c5b628cde..a85605b99bb06a43cc697db5ac5a6d6cbe29e2c4 100644
--- a/GUI/View/Instrument/ResolutionFunctionEditor.cpp
+++ b/GUI/View/Instrument/ResolutionFunctionEditor.cpp
@@ -44,8 +44,8 @@ QString unitString(const ResolutionFunctionEditor::Unit unit)
 /// form for the parameters of the gauss 2D resolution function
 class GaussResolutionFunctionForm : public QWidget {
 public:
-    GaussResolutionFunctionForm(ResolutionFunctionEditor::Unit unit,
-                                QWidget* parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
+    GaussResolutionFunctionForm(ResolutionFunctionEditor::Unit unit, QWidget* parent = nullptr,
+                                Qt::WindowFlags f = Qt::WindowFlags());
     void setItem(ResolutionFunction2DGaussianItem* item);
 
 private slots:
diff --git a/GUI/View/Realspace/IPositionBuilder.cpp b/GUI/View/Realspace/IPositionBuilder.cpp
index 18250c548642e21a12d82e4cd7ed18fed08cc9e9..1d759dddc0b73b19142592a3bf78656d9e94108c 100644
--- a/GUI/View/Realspace/IPositionBuilder.cpp
+++ b/GUI/View/Realspace/IPositionBuilder.cpp
@@ -241,14 +241,12 @@ RadialParacrystalPositionBuilder::generatePositionsImpl(double layer_size, doubl
         unsigned i_left = static_cast<unsigned>(std::max(0, 2 * i - 3));
 
         double offset = m_iff->randomSample();
-        lattice_positions[2 * i - 1][0] =
-            lattice_positions[i_left][0] + distance + offset;
+        lattice_positions[2 * i - 1][0] = lattice_positions[i_left][0] + distance + offset;
         lattice_positions[2 * i - 1][1] = 0.0;
 
         // positions of particles located along -x (store at even index)
         offset = m_iff->randomSample();
-        lattice_positions[2 * i][0] =
-            lattice_positions[2 * (i - 1)][0] - distance + offset;
+        lattice_positions[2 * i][0] = lattice_positions[2 * (i - 1)][0] - distance + offset;
         lattice_positions[2 * i][1] = 0.0;
     }
     return lattice_positions;
diff --git a/GUI/View/Realspace/RealSpace2DParacrystalUtils.cpp b/GUI/View/Realspace/RealSpace2DParacrystalUtils.cpp
index c899f69dee7d3b6ae900d35114494149d1626968..a31820cfbaa6686128eaeedc3b6b691193255fa3 100644
--- a/GUI/View/Realspace/RealSpace2DParacrystalUtils.cpp
+++ b/GUI/View/Realspace/RealSpace2DParacrystalUtils.cpp
@@ -42,7 +42,7 @@ void FindLatticePositionsIndex(size_t& index, size_t& index_prev, int i, int j,
                                double l_alpha)
 {
     int newindex = i * (2 * size + 1) + j;
-    ASSERT(newindex>0);
+    ASSERT(newindex > 0);
     index = newindex;
 
     if (std::sin(l_alpha) == 0) { // along l1
diff --git a/Param/Distrib/Distributions.h b/Param/Distrib/Distributions.h
index cb7ed897274c20244c32217c585785558cea2ac6..676685668a99563cfd878c96cce76b5bda8f3631 100644
--- a/Param/Distrib/Distributions.h
+++ b/Param/Distrib/Distributions.h
@@ -91,7 +91,7 @@ public:
     inline static const std::string class_name = "DistributionGate";
     std::string className() const final { return class_name; }
 
-    DistributionGate(const std::vector<double> P);
+    explicit DistributionGate(std::vector<double> P);
     DistributionGate(double min, double max);
     DistributionGate();
 
@@ -111,7 +111,7 @@ public:
     void accept(INodeVisitor* visitor) const override { visitor->visit(this); }
 
 #ifndef SWIG
-    virtual std::string pythonConstructor(const std::string& units) const override;
+    std::string pythonConstructor(const std::string& units) const override;
 #endif
 
 private:
@@ -131,7 +131,7 @@ public:
     inline static const std::string class_name = "DistributionLorentz";
     std::string className() const final { return class_name; }
 
-    DistributionLorentz(const std::vector<double> P);
+    explicit DistributionLorentz(std::vector<double> P);
     DistributionLorentz(double mean, double hwhm);
     DistributionLorentz();
 
@@ -150,7 +150,7 @@ public:
     void accept(INodeVisitor* visitor) const override { visitor->visit(this); }
 
 #ifndef SWIG
-    virtual std::string pythonConstructor(const std::string& units) const override;
+    std::string pythonConstructor(const std::string& units) const override;
 #endif
 
 private:
@@ -170,7 +170,7 @@ public:
     inline static const std::string class_name = "DistributionGaussian";
     std::string className() const final { return class_name; }
 
-    DistributionGaussian(const std::vector<double> P);
+    explicit DistributionGaussian(std::vector<double> P);
     DistributionGaussian(double mean, double std_dev);
     DistributionGaussian();
 
@@ -192,7 +192,7 @@ public:
     void accept(INodeVisitor* visitor) const override { visitor->visit(this); }
 
 #ifndef SWIG
-    virtual std::string pythonConstructor(const std::string& units) const override;
+    std::string pythonConstructor(const std::string& units) const override;
 #endif
 
 private:
@@ -212,7 +212,7 @@ public:
     inline static const std::string class_name = "DistributionLogNormal";
     std::string className() const final { return class_name; }
 
-    DistributionLogNormal(const std::vector<double> P);
+    explicit DistributionLogNormal(std::vector<double> P);
     DistributionLogNormal(double median, double scale_param);
 
     DistributionLogNormal* clone() const override
@@ -233,7 +233,7 @@ public:
 
     void accept(INodeVisitor* visitor) const override { visitor->visit(this); }
 
-    virtual std::string pythonConstructor(const std::string& units) const override;
+    std::string pythonConstructor(const std::string& units) const override;
 
 private:
     const double& m_median;
@@ -254,7 +254,7 @@ public:
     inline static const std::string class_name = "DistributionCosine";
     std::string className() const final { return class_name; }
 
-    DistributionCosine(const std::vector<double> P);
+    explicit DistributionCosine(std::vector<double> P);
     DistributionCosine(double mean, double sigma);
     DistributionCosine();
 
@@ -273,7 +273,7 @@ public:
     void accept(INodeVisitor* visitor) const override { visitor->visit(this); }
 
 #ifndef SWIG
-    virtual std::string pythonConstructor(const std::string& units) const override;
+    std::string pythonConstructor(const std::string& units) const override;
 #endif
 
 private:
@@ -293,7 +293,7 @@ public:
     inline static const std::string class_name = "DistributionTrapezoid";
     std::string className() const final { return class_name; }
 
-    DistributionTrapezoid(const std::vector<double> P);
+    explicit DistributionTrapezoid(std::vector<double> P);
     DistributionTrapezoid(double center, double left, double middle, double right);
     DistributionTrapezoid();
 
@@ -317,7 +317,7 @@ public:
     void accept(INodeVisitor* visitor) const override { visitor->visit(this); }
 
 #ifndef SWIG
-    virtual std::string pythonConstructor(const std::string& units) const override;
+    std::string pythonConstructor(const std::string& units) const override;
 #endif
 
 private:
diff --git a/Param/Distrib/ParameterSample.h b/Param/Distrib/ParameterSample.h
index ca0513467ae8528eb2877ded3da4f74d69aae772..3213fb4a1e77f20aebf3719b45261f049aec4d0d 100644
--- a/Param/Distrib/ParameterSample.h
+++ b/Param/Distrib/ParameterSample.h
@@ -19,7 +19,10 @@
 
 class ParameterSample {
 public:
-    ParameterSample(double _value = 0., double _weight = 1.) : value(_value), weight(_weight) {}
+    explicit ParameterSample(double _value = 0., double _weight = 1.)
+        : value(_value), weight(_weight)
+    {
+    }
     double value;
     double weight;
 };
diff --git a/Param/Node/INode.cpp b/Param/Node/INode.cpp
index c9c7bf7a071e6aa0199bbdbe0754421d43087c0c..0421eb493cae58f9c9b8e096cf3e76e9a9f97d74 100644
--- a/Param/Node/INode.cpp
+++ b/Param/Node/INode.cpp
@@ -18,6 +18,7 @@
 #include "Param/Node/NodeUtils.h"
 #include <algorithm>
 #include <exception>
+#include <utility>
 
 NodeMeta nodeMetaUnion(const std::vector<ParaMeta>& base, const NodeMeta& other)
 {
@@ -25,7 +26,7 @@ NodeMeta nodeMetaUnion(const std::vector<ParaMeta>& base, const NodeMeta& other)
 }
 
 
-INode::INode(const NodeMeta& meta, const std::vector<double>& PValues) : m_P(PValues)
+INode::INode(const NodeMeta& meta, std::vector<double> PValues) : m_P(std::move(PValues))
 {
 
     for (size_t i = 0; i < meta.paraMeta.size(); ++i) {
diff --git a/Param/Node/INode.h b/Param/Node/INode.h
index 95ecbb2c2254328f1b68b4ca9a0620f8747b1e2b..ee401a5b5aa6335ce773ddfa694d3f1351c56aff 100644
--- a/Param/Node/INode.h
+++ b/Param/Node/INode.h
@@ -20,6 +20,7 @@
 #include <limits>
 #include <memory>
 #include <string>
+#include <utility>
 #include <vector>
 
 const double INF = std::numeric_limits<double>::infinity();
@@ -37,8 +38,8 @@ struct ParaMeta {
 //! Metadata of one model node.
 struct NodeMeta {
     NodeMeta() = default;
-    NodeMeta(const std::string&, const std::string&, const std::vector<ParaMeta>& paraMeta_)
-        : paraMeta(paraMeta_)
+    NodeMeta(const std::string&, const std::string&, std::vector<ParaMeta> paraMeta_)
+        : paraMeta(std::move(paraMeta_))
     {
     }
     std::vector<ParaMeta> paraMeta;
@@ -50,10 +51,10 @@ NodeMeta nodeMetaUnion(const std::vector<ParaMeta>& base, const NodeMeta& other)
 
 class INode {
 public:
-    INode() {}
-    INode(const NodeMeta& meta, const std::vector<double>& PValues);
+    INode() = default;
+    INode(const NodeMeta& meta, std::vector<double> PValues);
 
-    virtual ~INode() {}
+    virtual ~INode() = default;
 
     //! Calls the INodeVisitor's visit method
     virtual void accept(INodeVisitor* visitor) const = 0;
diff --git a/Param/Node/INodeVisitor.h b/Param/Node/INodeVisitor.h
index b3f838c35a6fd6c115759522dcb8a7d76729f2c8..1cfe134136c3607c1770e6aa897a4528f8aa445b 100644
--- a/Param/Node/INodeVisitor.h
+++ b/Param/Node/INodeVisitor.h
@@ -141,8 +141,8 @@ class SquareLattice2D;
 
 class INodeVisitor {
 public:
-    INodeVisitor() : m_depth(0) {}
-    virtual ~INodeVisitor() {}
+    INodeVisitor() {}
+    virtual ~INodeVisitor() = default;
 
     virtual void visit(const BasicLattice2D*) {}
     virtual void visit(const Beam*) {}
@@ -270,7 +270,7 @@ public:
     void setDepth(int depth) { m_depth = depth; }
 
 private:
-    int m_depth;
+    int m_depth{0};
 };
 
 #endif // BORNAGAIN_PARAM_NODE_INODEVISITOR_H
diff --git a/Resample/Flux/MatrixFlux.cpp b/Resample/Flux/MatrixFlux.cpp
index e98b22db2a1b570a408f4d3f1012636b9d044b58..9d8bb86ae40c000b05b0fc805320f6e58e8f1015 100644
--- a/Resample/Flux/MatrixFlux.cpp
+++ b/Resample/Flux/MatrixFlux.cpp
@@ -30,10 +30,7 @@ complex_t GetImExponential(complex_t exponent)
 
 
 MatrixFlux::MatrixFlux(double kz_sign, Eigen::Vector2cd eigenvalues, R3 b, double magnetic_SLD)
-    : m_lambda(std::move(eigenvalues))
-    , m_b(b)
-    , m_kz_sign(kz_sign)
-    , m_magnetic_SLD(magnetic_SLD)
+    : m_lambda(std::move(eigenvalues)), m_b(b), m_kz_sign(kz_sign), m_magnetic_SLD(magnetic_SLD)
 {
     ASSERT(std::abs(m_b.mag() - 1) < eps || (m_b.mag() < eps && magnetic_SLD < eps));
 
diff --git a/auto/Wrap/doxygenParam.i b/auto/Wrap/doxygenParam.i
index 9f34241eae6d5d3fdfba94abf972944c21764cd9..d1b50863ef6f804d30e6bac7dd708f9b5d967476 100644
--- a/auto/Wrap/doxygenParam.i
+++ b/auto/Wrap/doxygenParam.i
@@ -12,7 +12,7 @@ C++ includes: Distributions.h
 %feature("docstring")  DistributionCosine::className "std::string DistributionCosine::className() const final
 ";
 
-%feature("docstring")  DistributionCosine::DistributionCosine "DistributionCosine::DistributionCosine(const std::vector< double > P)
+%feature("docstring")  DistributionCosine::DistributionCosine "DistributionCosine::DistributionCosine(std::vector< double > P)
 ";
 
 %feature("docstring")  DistributionCosine::DistributionCosine "DistributionCosine::DistributionCosine(double mean, double sigma)
@@ -69,7 +69,7 @@ C++ includes: Distributions.h
 %feature("docstring")  DistributionGate::className "std::string DistributionGate::className() const final
 ";
 
-%feature("docstring")  DistributionGate::DistributionGate "DistributionGate::DistributionGate(const std::vector< double > P)
+%feature("docstring")  DistributionGate::DistributionGate "DistributionGate::DistributionGate(std::vector< double > P)
 ";
 
 %feature("docstring")  DistributionGate::DistributionGate "DistributionGate::DistributionGate(double min, double max)
@@ -129,7 +129,7 @@ C++ includes: Distributions.h
 %feature("docstring")  DistributionGaussian::className "std::string DistributionGaussian::className() const final
 ";
 
-%feature("docstring")  DistributionGaussian::DistributionGaussian "DistributionGaussian::DistributionGaussian(const std::vector< double > P)
+%feature("docstring")  DistributionGaussian::DistributionGaussian "DistributionGaussian::DistributionGaussian(std::vector< double > P)
 ";
 
 %feature("docstring")  DistributionGaussian::DistributionGaussian "DistributionGaussian::DistributionGaussian(double mean, double std_dev)
@@ -230,7 +230,7 @@ C++ includes: Distributions.h
 %feature("docstring")  DistributionLogNormal::className "std::string DistributionLogNormal::className() const final
 ";
 
-%feature("docstring")  DistributionLogNormal::DistributionLogNormal "DistributionLogNormal::DistributionLogNormal(const std::vector< double > P)
+%feature("docstring")  DistributionLogNormal::DistributionLogNormal "DistributionLogNormal::DistributionLogNormal(std::vector< double > P)
 ";
 
 %feature("docstring")  DistributionLogNormal::DistributionLogNormal "DistributionLogNormal::DistributionLogNormal(double median, double scale_param)
@@ -287,7 +287,7 @@ C++ includes: Distributions.h
 %feature("docstring")  DistributionLorentz::className "std::string DistributionLorentz::className() const final
 ";
 
-%feature("docstring")  DistributionLorentz::DistributionLorentz "DistributionLorentz::DistributionLorentz(const std::vector< double > P)
+%feature("docstring")  DistributionLorentz::DistributionLorentz "DistributionLorentz::DistributionLorentz(std::vector< double > P)
 ";
 
 %feature("docstring")  DistributionLorentz::DistributionLorentz "DistributionLorentz::DistributionLorentz(double mean, double hwhm)
@@ -344,7 +344,7 @@ C++ includes: Distributions.h
 %feature("docstring")  DistributionTrapezoid::className "std::string DistributionTrapezoid::className() const final
 ";
 
-%feature("docstring")  DistributionTrapezoid::DistributionTrapezoid "DistributionTrapezoid::DistributionTrapezoid(const std::vector< double > P)
+%feature("docstring")  DistributionTrapezoid::DistributionTrapezoid "DistributionTrapezoid::DistributionTrapezoid(std::vector< double > P)
 ";
 
 %feature("docstring")  DistributionTrapezoid::DistributionTrapezoid "DistributionTrapezoid::DistributionTrapezoid(double center, double left, double middle, double right)
@@ -459,13 +459,13 @@ Base class for tree-like structures containing parameterized objects.
 C++ includes: INode.h
 ";
 
-%feature("docstring")  INode::INode "INode::INode()
+%feature("docstring")  INode::INode "INode::INode()=default
 ";
 
-%feature("docstring")  INode::INode "INode::INode(const NodeMeta &meta, const std::vector< double > &PValues)
+%feature("docstring")  INode::INode "INode::INode(const NodeMeta &meta, std::vector< double > PValues)
 ";
 
-%feature("docstring")  INode::~INode "virtual INode::~INode()
+%feature("docstring")  INode::~INode "virtual INode::~INode()=default
 ";
 
 %feature("docstring")  INode::accept "virtual void INode::accept(INodeVisitor *visitor) const =0
@@ -505,7 +505,7 @@ C++ includes: INodeVisitor.h
 %feature("docstring")  INodeVisitor::INodeVisitor "INodeVisitor::INodeVisitor()
 ";
 
-%feature("docstring")  INodeVisitor::~INodeVisitor "virtual INodeVisitor::~INodeVisitor()
+%feature("docstring")  INodeVisitor::~INodeVisitor "virtual INodeVisitor::~INodeVisitor()=default
 ";
 
 %feature("docstring")  INodeVisitor::visit "virtual void INodeVisitor::visit(const BasicLattice2D *)
@@ -946,7 +946,7 @@ C++ includes: INode.h
 %feature("docstring")  NodeMeta::NodeMeta "NodeMeta::NodeMeta()=default
 ";
 
-%feature("docstring")  NodeMeta::NodeMeta "NodeMeta::NodeMeta(const std::string &, const std::string &, const std::vector< ParaMeta > &paraMeta_)
+%feature("docstring")  NodeMeta::NodeMeta "NodeMeta::NodeMeta(const std::string &, const std::string &, std::vector< ParaMeta > paraMeta_)
 ";
 
 
diff --git a/auto/Wrap/libBornAgainParam.py b/auto/Wrap/libBornAgainParam.py
index 5d3040cc2f1d097362be0b02f81abe4b68a0a505..feb2f25178eaaf2beaaef5dbc31c922da5a81d29 100644
--- a/auto/Wrap/libBornAgainParam.py
+++ b/auto/Wrap/libBornAgainParam.py
@@ -2066,8 +2066,8 @@ class NodeMeta(object):
     def __init__(self, *args):
         r"""
         __init__(NodeMeta self) -> NodeMeta
-        __init__(NodeMeta self, std::string const & arg2, std::string const & arg3, std::vector< ParaMeta,std::allocator< ParaMeta > > const & paraMeta_) -> NodeMeta
-        NodeMeta::NodeMeta(const std::string &, const std::string &, const std::vector< ParaMeta > &paraMeta_)
+        __init__(NodeMeta self, std::string const & arg2, std::string const & arg3, std::vector< ParaMeta,std::allocator< ParaMeta > > paraMeta_) -> NodeMeta
+        NodeMeta::NodeMeta(const std::string &, const std::string &, std::vector< ParaMeta > paraMeta_)
 
         """
         _libBornAgainParam.NodeMeta_swiginit(self, _libBornAgainParam.new_NodeMeta(*args))
@@ -2102,7 +2102,7 @@ class INode(object):
         r"""
         __init__(INode self) -> INode
         __init__(INode self, NodeMeta meta, vdouble1d_t PValues) -> INode
-        INode::INode(const NodeMeta &meta, const std::vector< double > &PValues)
+        INode::INode(const NodeMeta &meta, std::vector< double > PValues)
 
         """
         if self.__class__ == INode:
diff --git a/auto/Wrap/libBornAgainParam_wrap.cpp b/auto/Wrap/libBornAgainParam_wrap.cpp
index 489092be20016672fe7a2485b1daa546d864349d..a92de01ac4e30501a579fc6cfbad04ba6e4fe1ac 100644
--- a/auto/Wrap/libBornAgainParam_wrap.cpp
+++ b/auto/Wrap/libBornAgainParam_wrap.cpp
@@ -7109,7 +7109,7 @@ SwigDirector_INode::SwigDirector_INode(PyObject *self): INode(), Swig::Director(
 
 
 
-SwigDirector_INode::SwigDirector_INode(PyObject *self, NodeMeta const &meta, std::vector< double, std::allocator< double > > const &PValues): INode(meta, PValues), Swig::Director(self) {
+SwigDirector_INode::SwigDirector_INode(PyObject *self, NodeMeta const &meta, std::vector< double, std::allocator< double > > PValues): INode(meta, PValues), Swig::Director(self) {
   SWIG_DIRECTOR_RGTR((INode *)this, this); 
 }
 
@@ -28223,10 +28223,10 @@ SWIGINTERN PyObject *_wrap_new_NodeMeta__SWIG_1(PyObject *SWIGUNUSEDPARM(self),
   PyObject *resultobj = 0;
   std::string *arg1 = 0 ;
   std::string *arg2 = 0 ;
-  std::vector< ParaMeta,std::allocator< ParaMeta > > *arg3 = 0 ;
+  SwigValueWrapper< std::vector< ParaMeta,std::allocator< ParaMeta > > > arg3 ;
   int res1 = SWIG_OLDOBJ ;
   int res2 = SWIG_OLDOBJ ;
-  void *argp3 = 0 ;
+  void *argp3 ;
   int res3 = 0 ;
   NodeMeta *result = 0 ;
   
@@ -28253,15 +28253,20 @@ SWIGINTERN PyObject *_wrap_new_NodeMeta__SWIG_1(PyObject *SWIGUNUSEDPARM(self),
     }
     arg2 = ptr;
   }
-  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t,  0  | 0);
-  if (!SWIG_IsOK(res3)) {
-    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_NodeMeta" "', argument " "3"" of type '" "std::vector< ParaMeta,std::allocator< ParaMeta > > const &""'"); 
-  }
-  if (!argp3) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_NodeMeta" "', argument " "3"" of type '" "std::vector< ParaMeta,std::allocator< ParaMeta > > const &""'"); 
+  {
+    res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_std__vectorT_ParaMeta_std__allocatorT_ParaMeta_t_t,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_NodeMeta" "', argument " "3"" of type '" "std::vector< ParaMeta,std::allocator< ParaMeta > >""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_NodeMeta" "', argument " "3"" of type '" "std::vector< ParaMeta,std::allocator< ParaMeta > >""'");
+    } else {
+      std::vector< ParaMeta,std::allocator< ParaMeta > > * temp = reinterpret_cast< std::vector< ParaMeta,std::allocator< ParaMeta > > * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
   }
-  arg3 = reinterpret_cast< std::vector< ParaMeta,std::allocator< ParaMeta > > * >(argp3);
-  result = (NodeMeta *)new NodeMeta((std::string const &)*arg1,(std::string const &)*arg2,(std::vector< ParaMeta,std::allocator< ParaMeta > > const &)*arg3);
+  result = (NodeMeta *)new NodeMeta((std::string const &)*arg1,(std::string const &)*arg2,arg3);
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_NodeMeta, SWIG_POINTER_NEW |  0 );
   if (SWIG_IsNewObj(res1)) delete arg1;
   if (SWIG_IsNewObj(res2)) delete arg2;
@@ -28305,7 +28310,7 @@ fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_NodeMeta'.\n"
     "  Possible C/C++ prototypes are:\n"
     "    NodeMeta::NodeMeta()\n"
-    "    NodeMeta::NodeMeta(std::string const &,std::string const &,std::vector< ParaMeta,std::allocator< ParaMeta > > const &)\n");
+    "    NodeMeta::NodeMeta(std::string const &,std::string const &,std::vector< ParaMeta,std::allocator< ParaMeta > >)\n");
   return 0;
 }
 
@@ -28457,10 +28462,9 @@ SWIGINTERN PyObject *_wrap_new_INode__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_
   PyObject *resultobj = 0;
   PyObject *arg1 = (PyObject *) 0 ;
   NodeMeta *arg2 = 0 ;
-  std::vector< double,std::allocator< double > > *arg3 = 0 ;
+  std::vector< double,std::allocator< double > > arg3 ;
   void *argp2 = 0 ;
   int res2 = 0 ;
-  int res3 = SWIG_OLDOBJ ;
   INode *result = 0 ;
   
   if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
@@ -28475,28 +28479,24 @@ SWIGINTERN PyObject *_wrap_new_INode__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_
   arg2 = reinterpret_cast< NodeMeta * >(argp2);
   {
     std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    res3 = swig::asptr(swig_obj[2], &ptr);
-    if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_INode" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_INode" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    int res = swig::asptr(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_INode" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > >""'"); 
     }
-    arg3 = ptr;
+    arg3 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
   }
   if ( arg1 != Py_None ) {
     /* subclassed */
-    result = (INode *)new SwigDirector_INode(arg1,(NodeMeta const &)*arg2,(std::vector< double,std::allocator< double > > const &)*arg3); 
+    result = (INode *)new SwigDirector_INode(arg1,(NodeMeta const &)*arg2,arg3); 
   } else {
     SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing abstract class or protected constructor"); 
     SWIG_fail;
   }
   
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_INode, SWIG_POINTER_NEW |  0 );
-  if (SWIG_IsNewObj(res3)) delete arg3;
   return resultobj;
 fail:
-  if (SWIG_IsNewObj(res3)) delete arg3;
   return NULL;
 }
 
@@ -28536,7 +28536,7 @@ fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_INode'.\n"
     "  Possible C/C++ prototypes are:\n"
     "    INode::INode()\n"
-    "    INode::INode(PyObject *,NodeMeta const &,std::vector< double,std::allocator< double > > const &)\n");
+    "    INode::INode(PyObject *,NodeMeta const &,std::vector< double,std::allocator< double > >)\n");
   return 0;
 }
 
@@ -34552,7 +34552,7 @@ SWIGINTERN PyObject *_wrap_new_DistributionGate__SWIG_0(PyObject *SWIGUNUSEDPARM
     std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
     int res = swig::asptr(swig_obj[0], &ptr);
     if (!SWIG_IsOK(res) || !ptr) {
-      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_DistributionGate" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_DistributionGate" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > >""'"); 
     }
     arg1 = *ptr;
     if (SWIG_IsNewObj(res)) delete ptr;
@@ -34646,7 +34646,7 @@ SWIGINTERN PyObject *_wrap_new_DistributionGate(PyObject *self, PyObject *args)
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_DistributionGate'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    DistributionGate::DistributionGate(std::vector< double,std::allocator< double > > const)\n"
+    "    DistributionGate::DistributionGate(std::vector< double,std::allocator< double > >)\n"
     "    DistributionGate::DistributionGate(double,double)\n"
     "    DistributionGate::DistributionGate()\n");
   return 0;
@@ -35042,7 +35042,7 @@ SWIGINTERN PyObject *_wrap_new_DistributionLorentz__SWIG_0(PyObject *SWIGUNUSEDP
     std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
     int res = swig::asptr(swig_obj[0], &ptr);
     if (!SWIG_IsOK(res) || !ptr) {
-      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_DistributionLorentz" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_DistributionLorentz" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > >""'"); 
     }
     arg1 = *ptr;
     if (SWIG_IsNewObj(res)) delete ptr;
@@ -35136,7 +35136,7 @@ SWIGINTERN PyObject *_wrap_new_DistributionLorentz(PyObject *self, PyObject *arg
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_DistributionLorentz'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    DistributionLorentz::DistributionLorentz(std::vector< double,std::allocator< double > > const)\n"
+    "    DistributionLorentz::DistributionLorentz(std::vector< double,std::allocator< double > >)\n"
     "    DistributionLorentz::DistributionLorentz(double,double)\n"
     "    DistributionLorentz::DistributionLorentz()\n");
   return 0;
@@ -35509,7 +35509,7 @@ SWIGINTERN PyObject *_wrap_new_DistributionGaussian__SWIG_0(PyObject *SWIGUNUSED
     std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
     int res = swig::asptr(swig_obj[0], &ptr);
     if (!SWIG_IsOK(res) || !ptr) {
-      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_DistributionGaussian" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_DistributionGaussian" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > >""'"); 
     }
     arg1 = *ptr;
     if (SWIG_IsNewObj(res)) delete ptr;
@@ -35603,7 +35603,7 @@ SWIGINTERN PyObject *_wrap_new_DistributionGaussian(PyObject *self, PyObject *ar
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_DistributionGaussian'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    DistributionGaussian::DistributionGaussian(std::vector< double,std::allocator< double > > const)\n"
+    "    DistributionGaussian::DistributionGaussian(std::vector< double,std::allocator< double > >)\n"
     "    DistributionGaussian::DistributionGaussian(double,double)\n"
     "    DistributionGaussian::DistributionGaussian()\n");
   return 0;
@@ -35976,7 +35976,7 @@ SWIGINTERN PyObject *_wrap_new_DistributionLogNormal__SWIG_0(PyObject *SWIGUNUSE
     std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
     int res = swig::asptr(swig_obj[0], &ptr);
     if (!SWIG_IsOK(res) || !ptr) {
-      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_DistributionLogNormal" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_DistributionLogNormal" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > >""'"); 
     }
     arg1 = *ptr;
     if (SWIG_IsNewObj(res)) delete ptr;
@@ -36054,7 +36054,7 @@ SWIGINTERN PyObject *_wrap_new_DistributionLogNormal(PyObject *self, PyObject *a
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_DistributionLogNormal'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    DistributionLogNormal::DistributionLogNormal(std::vector< double,std::allocator< double > > const)\n"
+    "    DistributionLogNormal::DistributionLogNormal(std::vector< double,std::allocator< double > >)\n"
     "    DistributionLogNormal::DistributionLogNormal(double,double)\n");
   return 0;
 }
@@ -36486,7 +36486,7 @@ SWIGINTERN PyObject *_wrap_new_DistributionCosine__SWIG_0(PyObject *SWIGUNUSEDPA
     std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
     int res = swig::asptr(swig_obj[0], &ptr);
     if (!SWIG_IsOK(res) || !ptr) {
-      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_DistributionCosine" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_DistributionCosine" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > >""'"); 
     }
     arg1 = *ptr;
     if (SWIG_IsNewObj(res)) delete ptr;
@@ -36580,7 +36580,7 @@ SWIGINTERN PyObject *_wrap_new_DistributionCosine(PyObject *self, PyObject *args
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_DistributionCosine'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    DistributionCosine::DistributionCosine(std::vector< double,std::allocator< double > > const)\n"
+    "    DistributionCosine::DistributionCosine(std::vector< double,std::allocator< double > >)\n"
     "    DistributionCosine::DistributionCosine(double,double)\n"
     "    DistributionCosine::DistributionCosine()\n");
   return 0;
@@ -36953,7 +36953,7 @@ SWIGINTERN PyObject *_wrap_new_DistributionTrapezoid__SWIG_0(PyObject *SWIGUNUSE
     std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
     int res = swig::asptr(swig_obj[0], &ptr);
     if (!SWIG_IsOK(res) || !ptr) {
-      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_DistributionTrapezoid" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const""'"); 
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_DistributionTrapezoid" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > >""'"); 
     }
     arg1 = *ptr;
     if (SWIG_IsNewObj(res)) delete ptr;
@@ -37075,7 +37075,7 @@ SWIGINTERN PyObject *_wrap_new_DistributionTrapezoid(PyObject *self, PyObject *a
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_DistributionTrapezoid'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    DistributionTrapezoid::DistributionTrapezoid(std::vector< double,std::allocator< double > > const)\n"
+    "    DistributionTrapezoid::DistributionTrapezoid(std::vector< double,std::allocator< double > >)\n"
     "    DistributionTrapezoid::DistributionTrapezoid(double,double,double,double)\n"
     "    DistributionTrapezoid::DistributionTrapezoid()\n");
   return 0;
@@ -42380,8 +42380,8 @@ static PyMethodDef SwigMethods[] = {
 	 { "ParaMeta_swiginit", ParaMeta_swiginit, METH_VARARGS, NULL},
 	 { "new_NodeMeta", _wrap_new_NodeMeta, METH_VARARGS, "\n"
 		"NodeMeta()\n"
-		"new_NodeMeta(std::string const & arg1, std::string const & arg2, std::vector< ParaMeta,std::allocator< ParaMeta > > const & paraMeta_) -> NodeMeta\n"
-		"NodeMeta::NodeMeta(const std::string &, const std::string &, const std::vector< ParaMeta > &paraMeta_)\n"
+		"new_NodeMeta(std::string const & arg1, std::string const & arg2, std::vector< ParaMeta,std::allocator< ParaMeta > > paraMeta_) -> NodeMeta\n"
+		"NodeMeta::NodeMeta(const std::string &, const std::string &, std::vector< ParaMeta > paraMeta_)\n"
 		"\n"
 		""},
 	 { "NodeMeta_paraMeta_set", _wrap_NodeMeta_paraMeta_set, METH_VARARGS, "NodeMeta_paraMeta_set(NodeMeta self, std::vector< ParaMeta,std::allocator< ParaMeta > > * paraMeta)"},
@@ -42397,12 +42397,12 @@ static PyMethodDef SwigMethods[] = {
 	 { "new_INode", _wrap_new_INode, METH_VARARGS, "\n"
 		"INode()\n"
 		"new_INode(PyObject * _self, NodeMeta meta, vdouble1d_t PValues) -> INode\n"
-		"INode::INode(const NodeMeta &meta, const std::vector< double > &PValues)\n"
+		"INode::INode(const NodeMeta &meta, std::vector< double > PValues)\n"
 		"\n"
 		""},
 	 { "delete_INode", _wrap_delete_INode, METH_O, "\n"
 		"delete_INode(INode self)\n"
-		"virtual INode::~INode()\n"
+		"virtual INode::~INode()=default\n"
 		"\n"
 		""},
 	 { "INode_accept", _wrap_INode_accept, METH_VARARGS, "\n"
@@ -42448,7 +42448,7 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "delete_INodeVisitor", _wrap_delete_INodeVisitor, METH_O, "\n"
 		"delete_INodeVisitor(INodeVisitor self)\n"
-		"virtual INodeVisitor::~INodeVisitor()\n"
+		"virtual INodeVisitor::~INodeVisitor()=default\n"
 		"\n"
 		""},
 	 { "INodeVisitor_visit", _wrap_INodeVisitor_visit, METH_VARARGS, "\n"
diff --git a/auto/Wrap/libBornAgainParam_wrap.h b/auto/Wrap/libBornAgainParam_wrap.h
index 1f85a0ea5feaf13e93011e829fe904a665a586bd..23f12180b69307618ac556746180abb558b23c40 100644
--- a/auto/Wrap/libBornAgainParam_wrap.h
+++ b/auto/Wrap/libBornAgainParam_wrap.h
@@ -19,7 +19,7 @@ class SwigDirector_INode : public INode, public Swig::Director {
 
 public:
     SwigDirector_INode(PyObject *self);
-    SwigDirector_INode(PyObject *self, NodeMeta const &meta, std::vector< double, std::allocator< double > > const &PValues);
+    SwigDirector_INode(PyObject *self, NodeMeta const &meta, std::vector< double, std::allocator< double > > PValues);
     virtual ~SwigDirector_INode();
     virtual void accept(INodeVisitor *visitor) const;
     virtual std::vector< INode const *, std::allocator< INode const * > > getChildren() const;