Index: src/FunctionApproximation/FunctionApproximation.cpp
===================================================================
--- src/FunctionApproximation/FunctionApproximation.cpp	(revision eb1efe719c9062ecc3dbe78c9ad1eefbf84a5023)
+++ src/FunctionApproximation/FunctionApproximation.cpp	(revision d032921179582b5da1ab3dfa13a0d02d06251602)
@@ -169,15 +169,41 @@
     // give this pointer as additional data to construct function pointer in
     // LevMarCallback and call
-    if (mode == FiniteDifferences) {
-      ret=dlevmar_dif(
-          &FunctionApproximation::LevMarCallback,
-          p, x, m, n, 1000, opts, info, work, covar, this); // no Jacobian, caller allocates work memory, covariance estimated
-    } else if (mode == ParameterDerivative) {
-      ret=dlevmar_der(
-          &FunctionApproximation::LevMarCallback,
-          &FunctionApproximation::LevMarDerivativeCallback,
-          p, x, m, n, 1000, opts, info, work, covar, this); // no Jacobian, caller allocates work memory, covariance estimated
+    if (model.isBoxConstraint()) {
+      FunctionModel::parameters_t lowerbound = model.getLowerBoxConstraints();
+      FunctionModel::parameters_t upperbound = model.getUpperBoxConstraints();
+      double *lb = new double[m];
+      double *ub = new double[m];
+      for (size_t i=0;i<m;++i) {
+        lb[i] = lowerbound[i];
+        ub[i] = upperbound[i];
+      }
+      if (mode == FiniteDifferences) {
+        ret=dlevmar_bc_dif(
+            &FunctionApproximation::LevMarCallback,
+            p, x, m, n, lb, ub, NULL, 1000, opts, info, work, covar, this); // no Jacobian, caller allocates work memory, covariance estimated
+      } else if (mode == ParameterDerivative) {
+        ret=dlevmar_bc_der(
+            &FunctionApproximation::LevMarCallback,
+            &FunctionApproximation::LevMarDerivativeCallback,
+            p, x, m, n, lb, ub, NULL, 1000, opts, info, work, covar, this); // no Jacobian, caller allocates work memory, covariance estimated
+      } else {
+        ASSERT(0, "FunctionApproximation::operator() - Unknown jacobian method chosen.");
+      }
+      delete[] lb;
+      delete[] ub;
     } else {
       ASSERT(0, "FunctionApproximation::operator() - Unknown jacobian method chosen.");
+      if (mode == FiniteDifferences) {
+        ret=dlevmar_dif(
+            &FunctionApproximation::LevMarCallback,
+            p, x, m, n, 1000, opts, info, work, covar, this); // no Jacobian, caller allocates work memory, covariance estimated
+      } else if (mode == ParameterDerivative) {
+        ret=dlevmar_der(
+            &FunctionApproximation::LevMarCallback,
+            &FunctionApproximation::LevMarDerivativeCallback,
+            p, x, m, n, 1000, opts, info, work, covar, this); // no Jacobian, caller allocates work memory, covariance estimated
+      } else {
+        ASSERT(0, "FunctionApproximation::operator() - Unknown jacobian method chosen.");
+      }
     }
 
Index: src/FunctionApproximation/FunctionModel.hpp
===================================================================
--- src/FunctionApproximation/FunctionModel.hpp	(revision eb1efe719c9062ecc3dbe78c9ad1eefbf84a5023)
+++ src/FunctionApproximation/FunctionModel.hpp	(revision d032921179582b5da1ab3dfa13a0d02d06251602)
@@ -78,4 +78,25 @@
    */
   virtual results_t parameter_derivative(const arguments_t &arguments, const size_t index) const=0;
+
+  /** States whether lower and upper boundaries should be used to constraint
+   * the parameter search for this function model.
+   *
+   * \return true - constraints should be used, false - else
+   */
+  virtual bool isBoxConstraint() const=0;
+
+  /** Returns a vector which are the lower boundaries for each parameter_t
+   * of this FunctionModel.
+   *
+   * \return vector of parameter_t resembling lowest allowed values
+   */
+  virtual parameters_t getLowerBoxConstraints() const=0;
+
+  /** Returns a vector which are the upper boundaries for each parameter_t
+   * of this FunctionModel.
+   *
+   * \return vector of parameter_t resembling highest allowed values
+   */
+  virtual parameters_t getUpperBoxConstraints() const=0;
 };
 
