Index: src/Potentials/EmpiricalPotential.hpp
===================================================================
--- src/Potentials/EmpiricalPotential.hpp	(revision dda3e8e0ed52a27bea7146869d59f76442212c40)
+++ src/Potentials/EmpiricalPotential.hpp	(revision 4f82f83a50fa8fb99e9d809e96bed7e48c874dfe)
@@ -17,4 +17,6 @@
 #include <vector>
 
+#include "FunctionApproximation/FunctionArgument.hpp"
+
 /** An EmpiricalPotential is a function that is given a vector of objects as
  * arguments which it uses to evaluate an internal function and returns a
@@ -29,26 +31,8 @@
 {
 public:
-  /** This class encapsulates all information with respect to a single argument
-   *  for a empirical potential function.
-   */
-  struct argument_t
-  {
-    //!> indices between which the distance is given
-    std::pair<size_t, size_t> indices;
-    //!> distance
-    double distance;
-  };
-
-  //!> typedef on the result value of operator()
-  typedef double result_t;
-  //!> typedef on the result value of derivative()
-  typedef std::vector<result_t> derivative_components_t;
-  //!> typedef for the list of argument_t to be given to operator().
-  typedef std::vector<argument_t> arguments_t;
-public:
   /** Default constructor for class EmpiricalPotential.
    *
    */
-  EmpiricalPotential();
+  EmpiricalPotential() {}
 
   /** Destructor for class EmpiricalPotential.
@@ -56,19 +40,4 @@
    */
   virtual ~EmpiricalPotential() {}
-
-  /** This evaluates the internal function with the given list of \a arguments.
-   *
-   * @param arguments arguments for the internal function
-   * @return result of the function evaluation
-   */
-  result_t operator()(const arguments_t &arguments) const;
-
-  /** This evaluates the first derivative of the internal function with the
-   * given list of \a arguments.
-   *
-   * @param arguments arguments for the internal function
-   * @return result vector with same number of components as \a arguments
-   */
-  derivative_components_t derivative(const arguments_t &arguments) const;
 };
 
Index: src/Potentials/Specifics/ManyBodyPotential_Tersoff.cpp
===================================================================
--- src/Potentials/Specifics/ManyBodyPotential_Tersoff.cpp	(revision dda3e8e0ed52a27bea7146869d59f76442212c40)
+++ src/Potentials/Specifics/ManyBodyPotential_Tersoff.cpp	(revision 4f82f83a50fa8fb99e9d809e96bed7e48c874dfe)
@@ -46,5 +46,5 @@
 #include "Potentials/helpers.hpp"
 
-EmpiricalPotential::result_t
+ManyBodyPotential_Tersoff::results_t
 ManyBodyPotential_Tersoff::operator()(
     const arguments_t &arguments
@@ -74,8 +74,8 @@
           manybodyparameter_lambda2)
   );
-  return result;
+  return std::vector<result_t>(1, result);
 }
 
-EmpiricalPotential::result_t
+ManyBodyPotential_Tersoff::result_t
 ManyBodyPotential_Tersoff::function_cutoff(
     const double &distance
@@ -92,5 +92,5 @@
 }
 
-EmpiricalPotential::result_t
+ManyBodyPotential_Tersoff::result_t
 ManyBodyPotential_Tersoff::function_prefactor(
     const double &alpha,
@@ -103,5 +103,5 @@
 }
 
-EmpiricalPotential::result_t
+ManyBodyPotential_Tersoff::result_t
 ManyBodyPotential_Tersoff::function_eta(
     const argument_t &r_ij
@@ -124,5 +124,5 @@
 }
 
-EmpiricalPotential::result_t
+ManyBodyPotential_Tersoff::result_t
 ManyBodyPotential_Tersoff::function_zeta(
     const argument_t &r_ij
@@ -148,5 +148,5 @@
 }
 
-EmpiricalPotential::result_t
+ManyBodyPotential_Tersoff::result_t
 ManyBodyPotential_Tersoff::function_angle(
     const double &r_ij,
Index: src/Potentials/Specifics/ManyBodyPotential_Tersoff.hpp
===================================================================
--- src/Potentials/Specifics/ManyBodyPotential_Tersoff.hpp	(revision dda3e8e0ed52a27bea7146869d59f76442212c40)
+++ src/Potentials/Specifics/ManyBodyPotential_Tersoff.hpp	(revision 4f82f83a50fa8fb99e9d809e96bed7e48c874dfe)
@@ -14,8 +14,9 @@
 #endif
 
-#include "Potentials/EmpiricalPotential.hpp"
-
 #include <boost/function.hpp>
 #include <cmath>
+
+#include "Potentials/EmpiricalPotential.hpp"
+#include "FunctionApproximation/FunctionModel.hpp"
 
 /** This class is the implementation of the Tersoff potential function.
@@ -26,5 +27,5 @@
  *
  */
-class ManyBodyPotential_Tersoff : public EmpiricalPotential
+class ManyBodyPotential_Tersoff : public EmpiricalPotential, public FunctionModel
 {
 private:
@@ -102,5 +103,5 @@
    * @return value of the potential function
    */
-  result_t operator()(const arguments_t &arguments) const;
+  results_t operator()(const arguments_t &arguments) const;
 
   /** Evaluates the derivative of the Tersoff potential with respect to the
Index: src/Potentials/Specifics/PairPotential_Harmonic.cpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Harmonic.cpp	(revision dda3e8e0ed52a27bea7146869d59f76442212c40)
+++ src/Potentials/Specifics/PairPotential_Harmonic.cpp	(revision 4f82f83a50fa8fb99e9d809e96bed7e48c874dfe)
@@ -43,5 +43,5 @@
 #include "Potentials/helpers.hpp"
 
-EmpiricalPotential::result_t
+PairPotential_Harmonic::results_t
 PairPotential_Harmonic::operator()(
     const arguments_t &arguments
@@ -52,8 +52,8 @@
   const argument_t &r_ij = arguments[0];
   const result_t result = spring_constant * Helpers::pow( r_ij.distance - equilibrium_distance, 2 );
-  return result;
+  return std::vector<result_t>(1, result);
 }
 
-EmpiricalPotential::derivative_components_t
+PairPotential_Harmonic::derivative_components_t
 PairPotential_Harmonic::derivative(
     const arguments_t &arguments
@@ -69,2 +69,18 @@
   return result;
 }
+
+void PairPotential_Harmonic::setParameters(const parameters_t &_params)
+{
+  ASSERT( _params.size() == 2,
+      "PairPotential_Harmonic::setParameters() - we need exactly two parameters.");
+  spring_constant = _params[0];
+  equilibrium_distance = _params[1];
+}
+
+PairPotential_Harmonic::parameters_t PairPotential_Harmonic::getParameters() const
+{
+  parameters_t params(2, 0.);
+  params[0] = spring_constant;
+  params[1] = equilibrium_distance;
+  return params;
+}
Index: src/Potentials/Specifics/PairPotential_Harmonic.hpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Harmonic.hpp	(revision dda3e8e0ed52a27bea7146869d59f76442212c40)
+++ src/Potentials/Specifics/PairPotential_Harmonic.hpp	(revision 4f82f83a50fa8fb99e9d809e96bed7e48c874dfe)
@@ -17,4 +17,5 @@
 
 #include "Potentials/EmpiricalPotential.hpp"
+#include "FunctionApproximation/FunctionModel.hpp"
 
 /** This is the implementation of a harmonic pair potential.
@@ -23,7 +24,8 @@
  *
  */
-class PairPotential_Harmonic : public EmpiricalPotential
+class PairPotential_Harmonic : public EmpiricalPotential, public FunctionModel
 {
 public:
+  PairPotential_Harmonic();
   PairPotential_Harmonic(
       const double _spring_constant,
@@ -34,4 +36,25 @@
   virtual ~PairPotential_Harmonic() {}
 
+  /** Setter for parameters as required by FunctionModel interface.
+   *
+   * \param _params given set of parameters
+   */
+  void setParameters(const parameters_t &_params);
+
+  /** Getter for parameters as required by FunctionModel interface.
+   *
+   * \return set of parameters
+   */
+  parameters_t getParameters() const;
+
+  /** Getter for the number of parameters of this model function.
+   *
+   * \return number of parameters
+   */
+  size_t getParameterDimension() const
+  {
+    return 2;
+  }
+
   /** Evaluates the harmonic potential function for the given arguments.
    *
@@ -39,5 +62,5 @@
    * @return value of the potential function
    */
-  result_t operator()(const arguments_t &arguments) const;
+  results_t operator()(const arguments_t &arguments) const;
 
   /** Evaluates the derivative of the potential function.
@@ -50,7 +73,7 @@
 private:
   //!> the spring constant for the harmonic potential
-  const double spring_constant;
+  double spring_constant;
   //!> the equilibrium distance indicating the potential minimum
-  const double equilibrium_distance;
+  double equilibrium_distance;
 };
 
