Index: src/FunctionApproximation/FunctionApproximation.cpp
===================================================================
--- src/FunctionApproximation/FunctionApproximation.cpp	(revision f48ad38cd0929af71770a13f3b37615e477e02b2)
+++ 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 f48ad38cd0929af71770a13f3b37615e477e02b2)
+++ 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;
 };
 
Index: src/LevMartester.cpp
===================================================================
--- src/LevMartester.cpp	(revision f48ad38cd0929af71770a13f3b37615e477e02b2)
+++ src/LevMartester.cpp	(revision d032921179582b5da1ab3dfa13a0d02d06251602)
@@ -318,5 +318,8 @@
     FunctionApproximation approximator(1, 1, model);
     approximator.setTrainingData(DistanceEnergyVector.first,DistanceEnergyVector.second);
-    approximator(FunctionApproximation::ParameterDerivative);
+    if (model.isBoxConstraint() && approximator.checkParameterDerivatives())
+      approximator(FunctionApproximation::ParameterDerivative);
+    else
+      ELOG(0, "We require parameter derivatives for a box constraint minimization.");
     params = model.getParameters();
 
@@ -392,5 +395,8 @@
         model); // CH4 has 5 atoms, hence 5*4/2 distances
     approximator.setTrainingData(DistanceEnergyVector.first,DistanceEnergyVector.second);
-    approximator(FunctionApproximation::FiniteDifferences);
+    if (model.isBoxConstraint() && approximator.checkParameterDerivatives())
+      approximator(FunctionApproximation::ParameterDerivative);
+    else
+      ELOG(0, "We require parameter derivatives for a box constraint minimization.");
     params = model.getParameters();
 
Index: src/Potentials/Specifics/ManyBodyPotential_Tersoff.hpp
===================================================================
--- src/Potentials/Specifics/ManyBodyPotential_Tersoff.hpp	(revision f48ad38cd0929af71770a13f3b37615e477e02b2)
+++ src/Potentials/Specifics/ManyBodyPotential_Tersoff.hpp	(revision d032921179582b5da1ab3dfa13a0d02d06251602)
@@ -16,4 +16,5 @@
 #include <boost/function.hpp>
 #include <cmath>
+#include <limits>
 
 #include "CodePatterns/Assert.hpp"
@@ -120,4 +121,40 @@
    */
   results_t parameter_derivative(const arguments_t &arguments, const size_t index) const;
+
+  /** 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
+   */
+  bool isBoxConstraint() const {
+    return true;
+  }
+
+  /** Returns a vector which are the lower boundaries for each parameter_t
+   * of this FunctionModel.
+   *
+   * \return vector of parameter_t resembling lowest allowed values
+   */
+  parameters_t getLowerBoxConstraints() const {
+    parameters_t lowerbound(getParameterDimension(), -std::numeric_limits<double>::max());
+//    lowerbound[R] = 0.;
+//    lowerbound[S] = 0.;
+//    lowerbound[lambda3] = 0.;
+//    lowerbound[alpha] = 0.;
+    lowerbound[beta] = std::numeric_limits<double>::min();
+    lowerbound[n] = std::numeric_limits<double>::min();
+    lowerbound[c] = std::numeric_limits<double>::min();
+    lowerbound[d] = std::numeric_limits<double>::min();
+    return lowerbound;
+  }
+
+  /** Returns a vector which are the upper boundaries for each parameter_t
+   * of this FunctionModel.
+   *
+   * \return vector of parameter_t resembling highest allowed values
+   */
+  parameters_t getUpperBoxConstraints() const {
+    return parameters_t(getParameterDimension(), std::numeric_limits<double>::max());
+  }
 
 private:
Index: src/Potentials/Specifics/PairPotential_Harmonic.hpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Harmonic.hpp	(revision f48ad38cd0929af71770a13f3b37615e477e02b2)
+++ src/Potentials/Specifics/PairPotential_Harmonic.hpp	(revision d032921179582b5da1ab3dfa13a0d02d06251602)
@@ -14,4 +14,6 @@
 #include <config.h>
 #endif
+
+#include <limits>
 
 #include "CodePatterns/Assert.hpp"
@@ -98,4 +100,33 @@
   results_t parameter_derivative(const arguments_t &arguments, const size_t index) const;
 
+  /** 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
+   */
+  bool isBoxConstraint() const {
+    return true;
+  }
+
+  /** Returns a vector which are the lower boundaries for each parameter_t
+   * of this FunctionModel.
+   *
+   * \return vector of parameter_t resembling lowest allowed values
+   */
+  parameters_t getLowerBoxConstraints() const {
+    parameters_t lowerbounds(getParameterDimension(), -std::numeric_limits<double>::max());
+    lowerbounds[equilibrium_distance] = 0.;
+    return lowerbounds;
+  }
+
+  /** Returns a vector which are the upper boundaries for each parameter_t
+   * of this FunctionModel.
+   *
+   * \return vector of parameter_t resembling highest allowed values
+   */
+  parameters_t getUpperBoxConstraints() const {
+    return parameters_t(getParameterDimension(), std::numeric_limits<double>::max());
+  }
+
   enum parameter_enum_t {
     spring_constant=0,
Index: src/Potentials/Specifics/PairPotential_Morse.hpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Morse.hpp	(revision f48ad38cd0929af71770a13f3b37615e477e02b2)
+++ src/Potentials/Specifics/PairPotential_Morse.hpp	(revision d032921179582b5da1ab3dfa13a0d02d06251602)
@@ -14,4 +14,6 @@
 #include <config.h>
 #endif
+
+#include <limits>
 
 #include "CodePatterns/Assert.hpp"
@@ -99,4 +101,33 @@
   results_t parameter_derivative(const arguments_t &arguments, const size_t index) const;
 
+  /** 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
+   */
+  bool isBoxConstraint() const {
+    return true;
+  }
+
+  /** Returns a vector which are the lower boundaries for each parameter_t
+   * of this FunctionModel.
+   *
+   * \return vector of parameter_t resembling lowest allowed values
+   */
+  parameters_t getLowerBoxConstraints() const {
+    parameters_t lowerbound(getParameterDimension(), -std::numeric_limits<double>::max());
+    lowerbound[equilibrium_distance] = 0.;
+    return lowerbound;
+  }
+
+  /** Returns a vector which are the upper boundaries for each parameter_t
+   * of this FunctionModel.
+   *
+   * \return vector of parameter_t resembling highest allowed values
+   */
+  parameters_t getUpperBoxConstraints() const {
+    return parameters_t(getParameterDimension(), std::numeric_limits<double>::max());
+  }
+
   enum parameter_enum_t {
     spring_constant=0,
