Index: src/Potentials/EmpiricalPotential.hpp
===================================================================
--- src/Potentials/EmpiricalPotential.hpp	(revision 4e6a60fc96fe69cb1ca62739ca2e2c09255a4b0c)
+++ src/Potentials/EmpiricalPotential.hpp	(revision 94453f1a30a1e87e4b6a580cfe53d63156741dd8)
@@ -20,4 +20,5 @@
 #include "FunctionApproximation/FunctionModel.hpp"
 #include "Potentials/SerializablePotential.hpp"
+#include "Potentials/InternalCoordinates/Coordinator.hpp"
 
 /** An EmpiricalPotential is a function that is given a vector of objects as
@@ -73,4 +74,11 @@
   virtual derivative_components_t derivative(const arguments_t &arguments) const=0;
 
+  /** Returns the functor that converts argument_s into the
+   * internal coordinate described by this potential function.
+   *
+   * \return coordinator functor
+   */
+  virtual Coordinator::ptr getCoordinator() const=0;
+
 protected:
   /** Default constructor for class EmpiricalPotential.
@@ -81,6 +89,4 @@
   EmpiricalPotential()
   {}
-
-
 };
 
Index: src/Potentials/Specifics/ConstantPotential.cpp
===================================================================
--- src/Potentials/Specifics/ConstantPotential.cpp	(revision 4e6a60fc96fe69cb1ca62739ca2e2c09255a4b0c)
+++ src/Potentials/Specifics/ConstantPotential.cpp	(revision 94453f1a30a1e87e4b6a580cfe53d63156741dd8)
@@ -52,4 +52,5 @@
 #include "Potentials/helpers.hpp"
 #include "Potentials/ParticleTypeCheckers.hpp"
+#include "Potentials/InternalCoordinates/OneBody_Constant.hpp"
 
 class Fragment;
@@ -62,4 +63,5 @@
     ;
 const std::string ConstantPotential::potential_token("constant");
+Coordinator::ptr ConstantPotential::coordinator(new OneBody_Constant());
 
 ConstantPotential::ConstantPotential() :
Index: src/Potentials/Specifics/ConstantPotential.hpp
===================================================================
--- src/Potentials/Specifics/ConstantPotential.hpp	(revision 4e6a60fc96fe69cb1ca62739ca2e2c09255a4b0c)
+++ src/Potentials/Specifics/ConstantPotential.hpp	(revision 94453f1a30a1e87e4b6a580cfe53d63156741dd8)
@@ -112,4 +112,12 @@
   results_t parameter_derivative(const arguments_t &arguments, const size_t index) const;
 
+  /** Returns the functor that converts argument_s into the
+   * internal coordinate described by this potential function.
+   *
+   * \return coordinator functor
+   */
+  Coordinator::ptr getCoordinator() const
+  { return coordinator; }
+
   /** Return the token name of this specific potential.
    *
@@ -191,4 +199,7 @@
   //!> static token of this potential type
   static const std::string potential_token;
+
+  //!> internal coordinator object for converting arguments_t
+  static Coordinator::ptr coordinator;
 };
 
Index: src/Potentials/Specifics/FourBodyPotential_Improper.cpp
===================================================================
--- src/Potentials/Specifics/FourBodyPotential_Improper.cpp	(revision 4e6a60fc96fe69cb1ca62739ca2e2c09255a4b0c)
+++ src/Potentials/Specifics/FourBodyPotential_Improper.cpp	(revision 94453f1a30a1e87e4b6a580cfe53d63156741dd8)
@@ -39,4 +39,6 @@
 #include <boost/assign/list_of.hpp> // for 'map_list_of()'
 
+#include "Potentials/InternalCoordinates/FourBody_ImproperAngle.hpp"
+
 // static definitions
 const FourBodyPotential_Improper::ParameterNames_t
@@ -47,5 +49,5 @@
     ;
 const std::string FourBodyPotential_Improper::improper_token("improper");
-
+Coordinator::ptr FourBodyPotential_Improper::coordinator(new FourBody_ImproperAngle());
 
 FourBodyPotential_Improper::FourBodyPotential_Improper() :
Index: src/Potentials/Specifics/FourBodyPotential_Improper.hpp
===================================================================
--- src/Potentials/Specifics/FourBodyPotential_Improper.hpp	(revision 4e6a60fc96fe69cb1ca62739ca2e2c09255a4b0c)
+++ src/Potentials/Specifics/FourBodyPotential_Improper.hpp	(revision 94453f1a30a1e87e4b6a580cfe53d63156741dd8)
@@ -44,4 +44,12 @@
   FourBodyPotential_Improper();
 
+  /** Returns the functor that converts argument_s into the
+   * internal coordinate described by this potential function.
+   *
+   * \return coordinator functor
+   */
+  Coordinator::ptr getCoordinator() const
+  { return coordinator; }
+
 public:
   FourBodyPotential_Improper(const ParticleTypes_t &_ParticleTypes);
@@ -80,4 +88,7 @@
   //!> static token of this potential type
   static const std::string improper_token;
+
+  //!> internal coordinator object for converting arguments_t
+  static Coordinator::ptr coordinator;
 };
 
Index: src/Potentials/Specifics/FourBodyPotential_Torsion.cpp
===================================================================
--- src/Potentials/Specifics/FourBodyPotential_Torsion.cpp	(revision 4e6a60fc96fe69cb1ca62739ca2e2c09255a4b0c)
+++ src/Potentials/Specifics/FourBodyPotential_Torsion.cpp	(revision 94453f1a30a1e87e4b6a580cfe53d63156741dd8)
@@ -49,4 +49,5 @@
 #include "FunctionApproximation/TrainingData.hpp"
 #include "Potentials/helpers.hpp"
+#include "Potentials/InternalCoordinates/FourBody_TorsionAngle.hpp"
 #include "Potentials/ParticleTypeCheckers.hpp"
 
@@ -61,4 +62,5 @@
     ;
 const std::string FourBodyPotential_Torsion::potential_token("torsion");
+Coordinator::ptr FourBodyPotential_Torsion::coordinator(new FourBody_TorsionAngle());
 
 FourBodyPotential_Torsion::FourBodyPotential_Torsion() :
Index: src/Potentials/Specifics/FourBodyPotential_Torsion.hpp
===================================================================
--- src/Potentials/Specifics/FourBodyPotential_Torsion.hpp	(revision 4e6a60fc96fe69cb1ca62739ca2e2c09255a4b0c)
+++ src/Potentials/Specifics/FourBodyPotential_Torsion.hpp	(revision 94453f1a30a1e87e4b6a580cfe53d63156741dd8)
@@ -114,4 +114,12 @@
   results_t parameter_derivative(const arguments_t &arguments, const size_t index) const;
 
+  /** Returns the functor that converts argument_s into the
+   * internal coordinate described by this potential function.
+   *
+   * \return coordinator functor
+   */
+  Coordinator::ptr getCoordinator() const
+  { return coordinator; }
+
   /** Return the token name of this specific potential.
    *
@@ -207,4 +215,7 @@
   //!> static token of this potential type
   static const std::string potential_token;
+
+  //!> internal coordinator object for converting arguments_t
+  static Coordinator::ptr coordinator;
 };
 
Index: src/Potentials/Specifics/ManyBodyPotential_Tersoff.cpp
===================================================================
--- src/Potentials/Specifics/ManyBodyPotential_Tersoff.cpp	(revision 4e6a60fc96fe69cb1ca62739ca2e2c09255a4b0c)
+++ src/Potentials/Specifics/ManyBodyPotential_Tersoff.cpp	(revision 94453f1a30a1e87e4b6a580cfe53d63156741dd8)
@@ -52,4 +52,5 @@
 #include "FunctionApproximation/TrainingData.hpp"
 #include "Potentials/helpers.hpp"
+#include "Potentials/InternalCoordinates/OneBody_Constant.hpp"
 #include "Potentials/ParticleTypeCheckers.hpp"
 
@@ -77,4 +78,5 @@
     ;
 const std::string ManyBodyPotential_Tersoff::potential_token("tersoff");
+Coordinator::ptr ManyBodyPotential_Tersoff::coordinator(new OneBody_Constant());
 
 ManyBodyPotential_Tersoff::ManyBodyPotential_Tersoff() :
Index: src/Potentials/Specifics/ManyBodyPotential_Tersoff.hpp
===================================================================
--- src/Potentials/Specifics/ManyBodyPotential_Tersoff.hpp	(revision 4e6a60fc96fe69cb1ca62739ca2e2c09255a4b0c)
+++ src/Potentials/Specifics/ManyBodyPotential_Tersoff.hpp	(revision 94453f1a30a1e87e4b6a580cfe53d63156741dd8)
@@ -129,4 +129,12 @@
   results_t parameter_derivative(const arguments_t &arguments, const size_t index) const;
 
+  /** Returns the functor that converts argument_s into the
+   * internal coordinate described by this potential function.
+   *
+   * \return coordinator functor
+   */
+  Coordinator::ptr getCoordinator() const
+  { return coordinator; }
+
   /** Return the token name of this specific potential.
    *
@@ -358,4 +366,7 @@
   //!> static token of this potential type
   static const std::string potential_token;
+
+  //!> internal coordinator object for converting arguments_t
+  static Coordinator::ptr coordinator;
 };
 
Index: src/Potentials/Specifics/PairPotential_Harmonic.cpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Harmonic.cpp	(revision 4e6a60fc96fe69cb1ca62739ca2e2c09255a4b0c)
+++ src/Potentials/Specifics/PairPotential_Harmonic.cpp	(revision 94453f1a30a1e87e4b6a580cfe53d63156741dd8)
@@ -50,4 +50,5 @@
 #include "FunctionApproximation/TrainingData.hpp"
 #include "Potentials/helpers.hpp"
+#include "Potentials/InternalCoordinates/TwoBody_Length.hpp"
 #include "Potentials/ParticleTypeCheckers.hpp"
 
@@ -62,4 +63,5 @@
     ;
 const std::string PairPotential_Harmonic::potential_token("harmonic_bond");
+Coordinator::ptr PairPotential_Harmonic::coordinator(new TwoBody_Length());
 
 PairPotential_Harmonic::PairPotential_Harmonic() :
Index: src/Potentials/Specifics/PairPotential_Harmonic.hpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Harmonic.hpp	(revision 4e6a60fc96fe69cb1ca62739ca2e2c09255a4b0c)
+++ src/Potentials/Specifics/PairPotential_Harmonic.hpp	(revision 94453f1a30a1e87e4b6a580cfe53d63156741dd8)
@@ -112,4 +112,12 @@
   results_t parameter_derivative(const arguments_t &arguments, const size_t index) const;
 
+  /** Returns the functor that converts argument_s into the
+   * internal coordinate described by this potential function.
+   *
+   * \return coordinator functor
+   */
+  Coordinator::ptr getCoordinator() const
+  { return coordinator; }
+
   /** States whether lower and upper boundaries should be used to constraint
    * the parameter search for this function model.
@@ -192,4 +200,7 @@
   //!> static token of this potential type
   static const std::string potential_token;
+
+  //!> internal coordinator object for converting arguments_t
+  static Coordinator::ptr coordinator;
 };
 
Index: src/Potentials/Specifics/PairPotential_LennardJones.cpp
===================================================================
--- src/Potentials/Specifics/PairPotential_LennardJones.cpp	(revision 4e6a60fc96fe69cb1ca62739ca2e2c09255a4b0c)
+++ src/Potentials/Specifics/PairPotential_LennardJones.cpp	(revision 94453f1a30a1e87e4b6a580cfe53d63156741dd8)
@@ -50,4 +50,5 @@
 #include "FunctionApproximation/TrainingData.hpp"
 #include "Potentials/helpers.hpp"
+#include "Potentials/InternalCoordinates/TwoBody_Length.hpp"
 #include "Potentials/ParticleTypeCheckers.hpp"
 
@@ -62,4 +63,5 @@
     ;
 const std::string PairPotential_LennardJones::potential_token("lennardjones");
+Coordinator::ptr PairPotential_LennardJones::coordinator(new TwoBody_Length());
 
 void PairPotential_LennardJones::setDefaultParameters()
Index: src/Potentials/Specifics/PairPotential_LennardJones.hpp
===================================================================
--- src/Potentials/Specifics/PairPotential_LennardJones.hpp	(revision 4e6a60fc96fe69cb1ca62739ca2e2c09255a4b0c)
+++ src/Potentials/Specifics/PairPotential_LennardJones.hpp	(revision 94453f1a30a1e87e4b6a580cfe53d63156741dd8)
@@ -114,4 +114,12 @@
   results_t parameter_derivative(const arguments_t &arguments, const size_t index) const;
 
+  /** Returns the functor that converts argument_s into the
+   * internal coordinate described by this potential function.
+   *
+   * \return coordinator functor
+   */
+  Coordinator::ptr getCoordinator() const
+  { return coordinator; }
+
   /** Return the token name of this specific potential.
    *
@@ -200,4 +208,7 @@
   //!> static token of this potential type
   static const std::string potential_token;
+
+  //!> internal coordinator object for converting arguments_t
+  static Coordinator::ptr coordinator;
 };
 
Index: src/Potentials/Specifics/PairPotential_Morse.cpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Morse.cpp	(revision 4e6a60fc96fe69cb1ca62739ca2e2c09255a4b0c)
+++ src/Potentials/Specifics/PairPotential_Morse.cpp	(revision 94453f1a30a1e87e4b6a580cfe53d63156741dd8)
@@ -51,4 +51,5 @@
 #include "FunctionApproximation/TrainingData.hpp"
 #include "Potentials/helpers.hpp"
+#include "Potentials/InternalCoordinates/TwoBody_Length.hpp"
 #include "Potentials/ParticleTypeCheckers.hpp"
 
@@ -64,4 +65,5 @@
     ;
 const std::string PairPotential_Morse::potential_token("morse");
+Coordinator::ptr PairPotential_Morse::coordinator(new TwoBody_Length());
 
 PairPotential_Morse::PairPotential_Morse() :
Index: src/Potentials/Specifics/PairPotential_Morse.hpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Morse.hpp	(revision 4e6a60fc96fe69cb1ca62739ca2e2c09255a4b0c)
+++ src/Potentials/Specifics/PairPotential_Morse.hpp	(revision 94453f1a30a1e87e4b6a580cfe53d63156741dd8)
@@ -113,4 +113,12 @@
   results_t parameter_derivative(const arguments_t &arguments, const size_t index) const;
 
+  /** Returns the functor that converts argument_s into the
+   * internal coordinate described by this potential function.
+   *
+   * \return coordinator functor
+   */
+  Coordinator::ptr getCoordinator() const
+  { return coordinator; }
+
   /** Return the token name of this specific potential.
    *
@@ -195,4 +203,7 @@
   //!> static token of this potential type
   static const std::string potential_token;
+
+  //!> internal coordinator object for converting arguments_t
+  static Coordinator::ptr coordinator;
 };
 
Index: src/Potentials/Specifics/ThreeBodyPotential_Angle.cpp
===================================================================
--- src/Potentials/Specifics/ThreeBodyPotential_Angle.cpp	(revision 4e6a60fc96fe69cb1ca62739ca2e2c09255a4b0c)
+++ src/Potentials/Specifics/ThreeBodyPotential_Angle.cpp	(revision 94453f1a30a1e87e4b6a580cfe53d63156741dd8)
@@ -50,4 +50,5 @@
 #include "FunctionApproximation/TrainingData.hpp"
 #include "Potentials/helpers.hpp"
+#include "Potentials/InternalCoordinates/ThreeBody_Angle.hpp"
 #include "Potentials/ParticleTypeCheckers.hpp"
 
@@ -62,4 +63,5 @@
     ;
 const std::string ThreeBodyPotential_Angle::potential_token("harmonic_angle");
+Coordinator::ptr ThreeBodyPotential_Angle::coordinator(new ThreeBody_Angle());
 
 ThreeBodyPotential_Angle::ThreeBodyPotential_Angle() :
Index: src/Potentials/Specifics/ThreeBodyPotential_Angle.hpp
===================================================================
--- src/Potentials/Specifics/ThreeBodyPotential_Angle.hpp	(revision 4e6a60fc96fe69cb1ca62739ca2e2c09255a4b0c)
+++ src/Potentials/Specifics/ThreeBodyPotential_Angle.hpp	(revision 94453f1a30a1e87e4b6a580cfe53d63156741dd8)
@@ -112,4 +112,12 @@
   results_t parameter_derivative(const arguments_t &arguments, const size_t index) const;
 
+  /** Returns the functor that converts argument_s into the
+   * internal coordinate described by this potential function.
+   *
+   * \return coordinator functor
+   */
+  Coordinator::ptr getCoordinator() const
+  { return coordinator; }
+
   /** Return the token name of this specific potential.
    *
@@ -202,4 +210,7 @@
   //!> static token of this potential type
   static const std::string potential_token;
+
+  //!> internal coordinator object for converting arguments_t
+  static Coordinator::ptr coordinator;
 };
 
