diff --git a/Device/Beam/Beam.cpp b/Device/Beam/Beam.cpp
index 8e0dd8c84ee6ec046f5f19bb02cf205c126af5e7..3c617c21df94062a77a0728e48f122b282d5917e 100644
--- a/Device/Beam/Beam.cpp
+++ b/Device/Beam/Beam.cpp
@@ -39,9 +39,9 @@ Beam::Beam(double intensity, double wavelength, const Direction& direction)
     setName("Beam");
     RealLimits::nonnegative().check("Intensity", m_intensity);
 
-    checkLimits("Wavelength", m_wavelength, wavelengthLimits);
-    checkLimits("InclinationAngle", m_alpha, m_alphaLimits);
-    checkLimits("AzimuthalAngle", m_phi, phiLimits);
+    wavelengthLimits.check("Wavelength", m_wavelength);
+    m_alphaLimits.check("InclinationAngle", m_alpha);
+    phiLimits.check("AzimuthalAngle", m_phi);
 }
 
 Beam Beam::horizontalBeam()
@@ -117,19 +117,19 @@ const IFootprintFactor* Beam::footprintFactor() const
 
 void Beam::setInclinationAngleGuarded(double value)
 {
-    checkLimits("inclination angle", value, m_alphaLimits);
+    m_alphaLimits.check("inclination angle", value);
     m_alpha = value;
 }
 
 void Beam::setAzimuthalAngleGuarded(double value)
 {
-    checkLimits("azimuthal angle", value, phiLimits);
+    phiLimits.check("azimuthal angle", value);
     m_phi = value;
 }
 
 void Beam::setWavelengthGuarded(double value)
 {
-    checkLimits("wavelength", value, wavelengthLimits);
+    wavelengthLimits.check("wavelength", value);
     m_wavelength = value;
 }
 
diff --git a/Fit/Param/RealLimits.cpp b/Fit/Param/RealLimits.cpp
index 8fb19309119657ab8ce4b96a77a29cbd1789c77e..1beeed1ebf487ef406808ca69c69b5e5901a7ea9 100644
--- a/Fit/Param/RealLimits.cpp
+++ b/Fit/Param/RealLimits.cpp
@@ -158,7 +158,7 @@ std::string RealLimits::toString() const
     return result.str();
 }
 
-void RealLimits::check(const std::string& name, const double value)
+void RealLimits::check(const std::string& name, const double value) const
 {
     if (!isInRange(value)) {
         std::ostringstream message;
diff --git a/Fit/Param/RealLimits.h b/Fit/Param/RealLimits.h
index a30ae9aeee1da40cce1a024f69799912eafaea7d..674ae5bc8694ae42db9415237e7ee6bb728565d8 100644
--- a/Fit/Param/RealLimits.h
+++ b/Fit/Param/RealLimits.h
@@ -81,7 +81,8 @@ public:
 
     std::string toString() const;
 
-    void check(const std::string& name, const double value);
+    //! Throws if value is outside limits. Parameter 'name' is for exception message.
+    void check(const std::string& name, const double value) const;
 
     //! Prints class
     friend std::ostream& operator<<(std::ostream& ostr, const RealLimits& m)
diff --git a/Param/Base/IParametric.cpp b/Param/Base/IParametric.cpp
index c72e7abf63dba8c7ac25976c48319bf6900b4af7..ead7233baad2c7836cfc20518e4a0c428c07d883 100644
--- a/Param/Base/IParametric.cpp
+++ b/Param/Base/IParametric.cpp
@@ -13,23 +13,7 @@
 //  ************************************************************************************************
 
 #include "Param/Base/IParametric.h"
-#include "Base/Utils/StringUtils.h"
-#include "Fit/Param/RealLimits.h"
-#include <iostream>
-#include <sstream>
-#include <stdexcept>
 
 IParametric::IParametric(const std::string& name) : m_name{name} {}
 
 IParametric::~IParametric() = default;
-
-void IParametric::checkLimits(const std::string& name, const double value,
-                              const RealLimits& limits) const
-{
-    if (!limits.isInRange(value)) {
-        std::ostringstream message;
-        message << "Cannot initialize parameter " << name << " with value " << value
-                << ": out of bounds [" << limits << "]\n";
-        throw std::runtime_error(message.str());
-    }
-}
diff --git a/Param/Base/IParametric.h b/Param/Base/IParametric.h
index 13199c813b9b6855a95e2aeef6b2296fab014377..9a2287cf50c0673ab11667bf4a0c8ea70b93ff34 100644
--- a/Param/Base/IParametric.h
+++ b/Param/Base/IParametric.h
@@ -41,11 +41,6 @@ public:
 protected:
     void setName(const std::string& name) { m_name = name; }
 
-    //! Check a certain value against limits.
-    //! Throws if not within the limits.
-    //! Name is only for exception message.
-    void checkLimits(const std::string& name, const double value, const RealLimits& limits) const;
-
 private:
     std::string m_name;
 };
diff --git a/Param/Node/INode.cpp b/Param/Node/INode.cpp
index b5fddb01c6b8e7e35cc77d917a039735dccce37c..3fed878f4fe6b0d5ecd4bd2e23fe06300fb56518 100644
--- a/Param/Node/INode.cpp
+++ b/Param/Node/INode.cpp
@@ -42,7 +42,7 @@ INode::INode(const NodeMeta& meta, const std::vector<double>& PValues) : m_P(PVa
         } else {
             limits = RealLimits::limited(pm.vMin, pm.vMax);
         }
-        checkLimits(pm.name, m_P[i], limits);
+        limits.check(pm.name, m_P[i]);
     }
 }
 
diff --git a/Tests/Unit/Param/IParameterizedTest.cpp b/Tests/Unit/Param/IParameterizedTest.cpp
index a8c3e93d560584949d22a2619e8fdbdea6c32b42..23a9e3149757a95402c960d5657ed55170c88db8 100644
--- a/Tests/Unit/Param/IParameterizedTest.cpp
+++ b/Tests/Unit/Param/IParameterizedTest.cpp
@@ -1,5 +1,4 @@
 #include "Fit/Param/RealLimits.h"
-#include "Param/Base/IParametric.h"
 #include "Tests/GTestWrapper/google_test.h"
 #include <stdexcept>
 
@@ -7,8 +6,8 @@ class IParametricTest : public ::testing::Test {};
 
 TEST_F(IParametricTest, checkLimits)
 {
-    // this checks only the function if IParametricTest::checkLimits() in principle. More
-    // tests regarding RealLimits shall be done in dedicated RealLimits unit tests
+    // this checks only the function if RealLimits.check() works in principle.
+    // More tests regarding RealLimits should be done in dedicated RealLimits unit tests.
     EXPECT_NO_THROW(RealLimits::nonnegative().check("A", 0));
     EXPECT_THROW(RealLimits::positive().check("A", 0), std::runtime_error);
 }
diff --git a/auto/Wrap/doxygenFit.i b/auto/Wrap/doxygenFit.i
index aa28b58963e410b59f30a256a552efaf559fe791..c4289fa332428d7a0154099b30166fb6ec9e94fe 100644
--- a/auto/Wrap/doxygenFit.i
+++ b/auto/Wrap/doxygenFit.i
@@ -11326,7 +11326,9 @@ returns true if proposed value is in limits range
 %feature("docstring")  RealLimits::toString "std::string RealLimits::toString() const
 ";
 
-%feature("docstring")  RealLimits::check "void RealLimits::check(const std::string &name, const double value)
+%feature("docstring")  RealLimits::check "void RealLimits::check(const std::string &name, const double value) const
+
+Throws if value is outside limits. Parameter 'name' is for exception message. 
 ";
 
 %feature("docstring")  RealLimits::isLimitless "bool RealLimits::isLimitless() const
diff --git a/auto/Wrap/libBornAgainFit.py b/auto/Wrap/libBornAgainFit.py
index 33191aabc94582f0effe24279af499383e8b01fb..2317f20169b320e571b40c64d7701d2e4dfd7f2b 100644
--- a/auto/Wrap/libBornAgainFit.py
+++ b/auto/Wrap/libBornAgainFit.py
@@ -1860,7 +1860,9 @@ class RealLimits(object):
     def check(self, name, value):
         r"""
         check(RealLimits self, std::string const & name, double const value)
-        void RealLimits::check(const std::string &name, const double value)
+        void RealLimits::check(const std::string &name, const double value) const
+
+        Throws if value is outside limits. Parameter 'name' is for exception message. 
 
         """
         return _libBornAgainFit.RealLimits_check(self, name, value)
diff --git a/auto/Wrap/libBornAgainFit_wrap.cpp b/auto/Wrap/libBornAgainFit_wrap.cpp
index 6e6989d8dbf7f956e6da99b7d420f82b8db31c43..0d283083b1449e19d3bcd2205fec4efc88c3ca40 100644
--- a/auto/Wrap/libBornAgainFit_wrap.cpp
+++ b/auto/Wrap/libBornAgainFit_wrap.cpp
@@ -24216,7 +24216,7 @@ SWIGINTERN PyObject *_wrap_RealLimits_check(PyObject *SWIGUNUSEDPARM(self), PyOb
   if (!SWIG_Python_UnpackTuple(args, "RealLimits_check", 3, 3, swig_obj)) SWIG_fail;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RealLimits, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RealLimits_check" "', argument " "1"" of type '" "RealLimits *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RealLimits_check" "', argument " "1"" of type '" "RealLimits const *""'"); 
   }
   arg1 = reinterpret_cast< RealLimits * >(argp1);
   {
@@ -24235,7 +24235,7 @@ SWIGINTERN PyObject *_wrap_RealLimits_check(PyObject *SWIGUNUSEDPARM(self), PyOb
     SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RealLimits_check" "', argument " "3"" of type '" "double""'");
   } 
   arg3 = static_cast< double >(val3);
-  (arg1)->check((std::string const &)*arg2,arg3);
+  ((RealLimits const *)arg1)->check((std::string const &)*arg2,arg3);
   resultobj = SWIG_Py_Void();
   if (SWIG_IsNewObj(res2)) delete arg2;
   return resultobj;
@@ -28462,7 +28462,9 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "RealLimits_check", _wrap_RealLimits_check, METH_VARARGS, "\n"
 		"RealLimits_check(RealLimits self, std::string const & name, double const value)\n"
-		"void RealLimits::check(const std::string &name, const double value)\n"
+		"void RealLimits::check(const std::string &name, const double value) const\n"
+		"\n"
+		"Throws if value is outside limits. Parameter 'name' is for exception message. \n"
 		"\n"
 		""},
 	 { "RealLimits___eq__", _wrap_RealLimits___eq__, METH_VARARGS, "RealLimits___eq__(RealLimits self, RealLimits other) -> bool"},