Index: src/Potentials/EmpiricalPotential.hpp
===================================================================
--- src/Potentials/EmpiricalPotential.hpp	(revision c5e75f3270a380f8e6976913af3591de13b69f61)
+++ src/Potentials/EmpiricalPotential.hpp	(revision d5ca1af98e88b536fe2483fab7d7d2b875452e83)
@@ -17,4 +17,5 @@
 #include <vector>
 
+#include "Fragmentation/Homology/HomologyGraph.hpp"
 #include "FunctionApproximation/FunctionArgument.hpp"
 #include "FunctionApproximation/FunctionModel.hpp"
@@ -81,4 +82,10 @@
   virtual Coordinator::ptr getCoordinator() const=0;
 
+  /** Getter for the graph specifying the binding model of the potential.
+   *
+   * \return HomologyGraph of the binding model
+   */
+  virtual const HomologyGraph& getBindingModel() const=0;
+
 protected:
   /** Default constructor for class EmpiricalPotential.
Index: src/Potentials/Specifics/ConstantPotential.cpp
===================================================================
--- src/Potentials/Specifics/ConstantPotential.cpp	(revision c5e75f3270a380f8e6976913af3591de13b69f61)
+++ src/Potentials/Specifics/ConstantPotential.cpp	(revision d5ca1af98e88b536fe2483fab7d7d2b875452e83)
@@ -65,7 +65,23 @@
 Coordinator::ptr ConstantPotential::coordinator(Memory::ignore(new OneBody_Constant()));
 
+static HomologyGraph generateBindingModel(const EmpiricalPotential::ParticleTypes_t &_ParticleTypes)
+{
+  // fill nodes
+  ASSERT( _ParticleTypes.size() <= (size_t)1,
+      "generateBindingModel() - ConstantPotential needs zero or one type.");
+  HomologyGraph::nodes_t nodes;
+  if (_ParticleTypes.size() == (size_t)1)
+    nodes.insert( std::make_pair(FragmentNode(_ParticleTypes.front(), 0), 1) );
+
+  // there are no edges
+  HomologyGraph::edges_t edges;
+
+  return HomologyGraph(nodes, edges);
+}
+
 ConstantPotential::ConstantPotential() :
     EmpiricalPotential(),
-    params(parameters_t(MAXPARAMS, 0.))
+    params(parameters_t(MAXPARAMS, 0.)),
+    bindingmodel(HomologyGraph())
 {
   // have some decent defaults for parameter_derivative checking
@@ -77,5 +93,6 @@
     ) :
   EmpiricalPotential(_ParticleTypes),
-  params(parameters_t(MAXPARAMS, 0.))
+  params(parameters_t(MAXPARAMS, 0.)),
+  bindingmodel(generateBindingModel(_ParticleTypes))
 {
   // have some decent defaults for parameter_derivative checking
@@ -87,5 +104,6 @@
     const double _energy_offset) :
   EmpiricalPotential(_ParticleTypes),
-  params(parameters_t(MAXPARAMS, 0.))
+  params(parameters_t(MAXPARAMS, 0.)),
+  bindingmodel(generateBindingModel(_ParticleTypes))
 {
   params[energy_offset] = _energy_offset;
Index: src/Potentials/Specifics/ConstantPotential.hpp
===================================================================
--- src/Potentials/Specifics/ConstantPotential.hpp	(revision c5e75f3270a380f8e6976913af3591de13b69f61)
+++ src/Potentials/Specifics/ConstantPotential.hpp	(revision d5ca1af98e88b536fe2483fab7d7d2b875452e83)
@@ -184,4 +184,11 @@
   };
 
+  /** Getter for the graph specifying the binding model of the potential.
+   *
+   * \return HomologyGraph of the binding model
+   */
+  const HomologyGraph& getBindingModel() const
+  { return bindingmodel; }
+
 private:
   //!> parameter vector with parameters as in enum parameter_enum_t
@@ -196,4 +203,7 @@
   //!> internal coordinator object for converting arguments_t
   static Coordinator::ptr coordinator;
+
+  //!> binding model for this potential
+  const HomologyGraph bindingmodel;
 };
 
Index: src/Potentials/Specifics/FourBodyPotential_Improper.cpp
===================================================================
--- src/Potentials/Specifics/FourBodyPotential_Improper.cpp	(revision c5e75f3270a380f8e6976913af3591de13b69f61)
+++ src/Potentials/Specifics/FourBodyPotential_Improper.cpp	(revision d5ca1af98e88b536fe2483fab7d7d2b875452e83)
@@ -35,4 +35,6 @@
 #include "CodePatterns/MemDebug.hpp"
 
+#include "CodePatterns/Assert.hpp"
+
 #include "FourBodyPotential_Improper.hpp"
 
@@ -51,11 +53,53 @@
 Coordinator::ptr FourBodyPotential_Improper::coordinator(Memory::ignore(new FourBody_ImproperAngle()));
 
+static HomologyGraph generateBindingModel(const EmpiricalPotential::ParticleTypes_t &_ParticleTypes)
+{
+  // fill nodes
+  HomologyGraph::nodes_t nodes;
+  {
+    ASSERT( _ParticleTypes.size() == (size_t)4,
+        "generateBindingModel() - FourBodyPotential_Improper needs four types.");
+    std::pair<HomologyGraph::nodes_t::iterator, bool > inserter;
+    inserter = nodes.insert( std::make_pair(FragmentNode(_ParticleTypes[0], 3), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+    inserter = nodes.insert( std::make_pair(FragmentNode(_ParticleTypes[1], 1), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+    inserter = nodes.insert( std::make_pair(FragmentNode(_ParticleTypes[2], 1), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+    inserter = nodes.insert( std::make_pair(FragmentNode(_ParticleTypes[3], 1), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+  }
+
+  // there are no edges
+  HomologyGraph::edges_t edges;
+  {
+    std::pair<HomologyGraph::edges_t::iterator, bool > inserter;
+    inserter = edges.insert( std::make_pair( FragmentEdge(_ParticleTypes[0], _ParticleTypes[1]), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+    inserter = edges.insert( std::make_pair( FragmentEdge(_ParticleTypes[0], _ParticleTypes[2]), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+    inserter = edges.insert( std::make_pair( FragmentEdge(_ParticleTypes[0], _ParticleTypes[3]), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+  }
+
+  return HomologyGraph(nodes, edges);
+}
+
 FourBodyPotential_Improper::FourBodyPotential_Improper() :
-    FourBodyPotential_Torsion()
+    FourBodyPotential_Torsion(),
+    bindingmodel(HomologyGraph())
 {}
 
 FourBodyPotential_Improper::FourBodyPotential_Improper(
     const ParticleTypes_t &_ParticleTypes) :
-    FourBodyPotential_Torsion(_ParticleTypes)
+    FourBodyPotential_Torsion(_ParticleTypes),
+    bindingmodel(generateBindingModel(_ParticleTypes))
 {}
 
@@ -67,5 +111,6 @@
         _ParticleTypes,
         _spring_constant,
-        _equilibrium_distance)
+        _equilibrium_distance),
+    bindingmodel(generateBindingModel(_ParticleTypes))
 {}
 
Index: src/Potentials/Specifics/FourBodyPotential_Improper.hpp
===================================================================
--- src/Potentials/Specifics/FourBodyPotential_Improper.hpp	(revision c5e75f3270a380f8e6976913af3591de13b69f61)
+++ src/Potentials/Specifics/FourBodyPotential_Improper.hpp	(revision d5ca1af98e88b536fe2483fab7d7d2b875452e83)
@@ -60,4 +60,11 @@
   virtual ~FourBodyPotential_Improper() {}
 
+  /** Getter for the graph specifying the binding model of the potential.
+   *
+   * \return HomologyGraph of the binding model
+   */
+  const HomologyGraph& getBindingModel() const
+  { return bindingmodel; }
+
 private:
   /** Function to obtain angle between planes from distances.
@@ -91,4 +98,7 @@
   //!> internal coordinator object for converting arguments_t
   static Coordinator::ptr coordinator;
+
+  //!> binding model for this potential
+  const HomologyGraph bindingmodel;
 };
 
Index: src/Potentials/Specifics/FourBodyPotential_Torsion.cpp
===================================================================
--- src/Potentials/Specifics/FourBodyPotential_Torsion.cpp	(revision c5e75f3270a380f8e6976913af3591de13b69f61)
+++ src/Potentials/Specifics/FourBodyPotential_Torsion.cpp	(revision d5ca1af98e88b536fe2483fab7d7d2b875452e83)
@@ -66,7 +66,48 @@
 Coordinator::ptr FourBodyPotential_Torsion::coordinator(Memory::ignore(new FourBody_TorsionAngle()));
 
+static HomologyGraph generateBindingModel(const EmpiricalPotential::ParticleTypes_t &_ParticleTypes)
+{
+  // fill nodes
+  HomologyGraph::nodes_t nodes;
+  {
+    ASSERT( _ParticleTypes.size() == (size_t)4,
+        "generateBindingModel() - FourBodyPotential_Torsion needs four types.");
+    std::pair<HomologyGraph::nodes_t::iterator, bool > inserter;
+    inserter = nodes.insert( std::make_pair(FragmentNode(_ParticleTypes[0], 1), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+    inserter = nodes.insert( std::make_pair(FragmentNode(_ParticleTypes[1], 2), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+    inserter = nodes.insert( std::make_pair(FragmentNode(_ParticleTypes[2], 2), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+    inserter = nodes.insert( std::make_pair(FragmentNode(_ParticleTypes[3], 1), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+  }
+
+  // there are no edges
+  HomologyGraph::edges_t edges;
+  {
+    std::pair<HomologyGraph::edges_t::iterator, bool > inserter;
+    inserter = edges.insert( std::make_pair( FragmentEdge(_ParticleTypes[0], _ParticleTypes[1]), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+    inserter = edges.insert( std::make_pair( FragmentEdge(_ParticleTypes[1], _ParticleTypes[2]), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+    inserter = edges.insert( std::make_pair( FragmentEdge(_ParticleTypes[2], _ParticleTypes[3]), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+  }
+
+  return HomologyGraph(nodes, edges);
+}
+
 FourBodyPotential_Torsion::FourBodyPotential_Torsion() :
   EmpiricalPotential(),
-  params(parameters_t(MAXPARAMS, 0.))
+  params(parameters_t(MAXPARAMS, 0.)),
+  bindingmodel(HomologyGraph())
 {
   // have some decent defaults for parameter_derivative checking
@@ -79,5 +120,6 @@
     ) :
   EmpiricalPotential(_ParticleTypes),
-  params(parameters_t(MAXPARAMS, 0.))
+  params(parameters_t(MAXPARAMS, 0.)),
+  bindingmodel(generateBindingModel(_ParticleTypes))
 {
   // have some decent defaults for parameter_derivative checking
@@ -91,5 +133,6 @@
     const double _equilibrium_distance) :
   EmpiricalPotential(_ParticleTypes),
-  params(parameters_t(MAXPARAMS, 0.))
+  params(parameters_t(MAXPARAMS, 0.)),
+  bindingmodel(generateBindingModel(_ParticleTypes))
 {
   params[spring_constant] = _spring_constant;
Index: src/Potentials/Specifics/FourBodyPotential_Torsion.hpp
===================================================================
--- src/Potentials/Specifics/FourBodyPotential_Torsion.hpp	(revision c5e75f3270a380f8e6976913af3591de13b69f61)
+++ src/Potentials/Specifics/FourBodyPotential_Torsion.hpp	(revision d5ca1af98e88b536fe2483fab7d7d2b875452e83)
@@ -191,4 +191,11 @@
   };
 
+  /** Getter for the graph specifying the binding model of the potential.
+   *
+   * \return HomologyGraph of the binding model
+   */
+  const HomologyGraph& getBindingModel() const
+  { return bindingmodel; }
+
 protected:
   virtual result_t function_theta(
@@ -212,4 +219,7 @@
   //!> internal coordinator object for converting arguments_t
   static Coordinator::ptr coordinator;
+
+  //!> binding model for this potential
+  const HomologyGraph bindingmodel;
 };
 
Index: src/Potentials/Specifics/ManyBodyPotential_Tersoff.cpp
===================================================================
--- src/Potentials/Specifics/ManyBodyPotential_Tersoff.cpp	(revision c5e75f3270a380f8e6976913af3591de13b69f61)
+++ src/Potentials/Specifics/ManyBodyPotential_Tersoff.cpp	(revision d5ca1af98e88b536fe2483fab7d7d2b875452e83)
@@ -82,4 +82,29 @@
 Coordinator::ptr ManyBodyPotential_Tersoff::coordinator(Memory::ignore(new OneBody_Constant()));
 
+static HomologyGraph generateBindingModel(const EmpiricalPotential::ParticleTypes_t &_ParticleTypes)
+{
+  // fill nodes
+  HomologyGraph::nodes_t nodes;
+  {
+    ASSERT( _ParticleTypes.size() == (size_t)2,
+        "generateBindingModel() - ManyBodyPotential_Tersoff needs two types.");
+    std::pair<HomologyGraph::nodes_t::iterator, bool > inserter;
+    inserter = nodes.insert( std::make_pair(FragmentNode(_ParticleTypes[0], 1), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+    inserter = nodes.insert( std::make_pair(FragmentNode(_ParticleTypes[1], 1), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+  }
+
+  // there are no edges
+  HomologyGraph::edges_t edges;
+  {
+    edges.insert( std::make_pair( FragmentEdge(_ParticleTypes[0], _ParticleTypes[1]), 1) );
+  }
+
+  return HomologyGraph(nodes, edges);
+}
+
 ManyBodyPotential_Tersoff::ManyBodyPotential_Tersoff() :
     EmpiricalPotential(),
@@ -91,5 +116,6 @@
     chi(1.),
     omega(1.),
-    triplefunction(&Helpers::NoOp_Triplefunction)
+    triplefunction(&Helpers::NoOp_Triplefunction),
+    bindingmodel(HomologyGraph())
 {}
 
@@ -105,5 +131,6 @@
     chi(1.),
     omega(1.),
-    triplefunction(&Helpers::NoOp_Triplefunction)
+    triplefunction(&Helpers::NoOp_Triplefunction),
+    bindingmodel(generateBindingModel(_ParticleTypes))
 {
   // have some decent defaults for parameter_derivative checking
@@ -144,5 +171,6 @@
   chi(_chi),
   omega(_mu),
-  triplefunction(&Helpers::NoOp_Triplefunction)
+  triplefunction(&Helpers::NoOp_Triplefunction),
+  bindingmodel(generateBindingModel(_ParticleTypes))
 {
 //  Info info(__func__);
Index: src/Potentials/Specifics/ManyBodyPotential_Tersoff.hpp
===================================================================
--- src/Potentials/Specifics/ManyBodyPotential_Tersoff.hpp	(revision c5e75f3270a380f8e6976913af3591de13b69f61)
+++ src/Potentials/Specifics/ManyBodyPotential_Tersoff.hpp	(revision d5ca1af98e88b536fe2483fab7d7d2b875452e83)
@@ -213,4 +213,11 @@
   { triplefunction = _triplefunction;  }
 
+  /** Getter for the graph specifying the binding model of the potential.
+   *
+   * \return HomologyGraph of the binding model
+   */
+  const HomologyGraph& getBindingModel() const
+  { return bindingmodel; }
+
 private:
   /** This function represents the cutoff \f$ f_C \f$.
@@ -363,4 +370,7 @@
   //!> internal coordinator object for converting arguments_t
   static Coordinator::ptr coordinator;
+
+  //!> binding model for this potential
+  const HomologyGraph bindingmodel;
 };
 
Index: src/Potentials/Specifics/PairPotential_Harmonic.cpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Harmonic.cpp	(revision c5e75f3270a380f8e6976913af3591de13b69f61)
+++ src/Potentials/Specifics/PairPotential_Harmonic.cpp	(revision d5ca1af98e88b536fe2483fab7d7d2b875452e83)
@@ -67,7 +67,33 @@
 Coordinator::ptr PairPotential_Harmonic::coordinator(Memory::ignore(new TwoBody_Length()));
 
+static HomologyGraph generateBindingModel(const EmpiricalPotential::ParticleTypes_t &_ParticleTypes)
+{
+  // fill nodes
+  HomologyGraph::nodes_t nodes;
+  {
+    ASSERT( _ParticleTypes.size() == (size_t)2,
+        "generateBindingModel() - PairPotential_Harmonic needs two types.");
+    std::pair<HomologyGraph::nodes_t::iterator, bool > inserter;
+    inserter = nodes.insert( std::make_pair(FragmentNode(_ParticleTypes[0], 1), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+    inserter = nodes.insert( std::make_pair(FragmentNode(_ParticleTypes[1], 1), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+  }
+
+  // there are no edges
+  HomologyGraph::edges_t edges;
+  {
+    edges.insert( std::make_pair( FragmentEdge(_ParticleTypes[0], _ParticleTypes[1]), 1) );
+  }
+
+  return HomologyGraph(nodes, edges);
+}
+
 PairPotential_Harmonic::PairPotential_Harmonic() :
   EmpiricalPotential(),
-  params(parameters_t(MAXPARAMS, 0.))
+  params(parameters_t(MAXPARAMS, 0.)),
+  bindingmodel(HomologyGraph())
 {
   // have some decent defaults for parameter_derivative checking
@@ -79,5 +105,6 @@
     const ParticleTypes_t &_ParticleTypes) :
   EmpiricalPotential(_ParticleTypes),
-  params(parameters_t(MAXPARAMS, 0.))
+  params(parameters_t(MAXPARAMS, 0.)),
+  bindingmodel(generateBindingModel(_ParticleTypes))
 {
   // have some decent defaults for parameter_derivative checking
@@ -91,5 +118,6 @@
     const double _equilibrium_distance) :
   EmpiricalPotential(_ParticleTypes),
-  params(parameters_t(MAXPARAMS, 0.))
+  params(parameters_t(MAXPARAMS, 0.)),
+  bindingmodel(generateBindingModel(_ParticleTypes))
 {
   params[spring_constant] = _spring_constant;
Index: src/Potentials/Specifics/PairPotential_Harmonic.hpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Harmonic.hpp	(revision c5e75f3270a380f8e6976913af3591de13b69f61)
+++ src/Potentials/Specifics/PairPotential_Harmonic.hpp	(revision d5ca1af98e88b536fe2483fab7d7d2b875452e83)
@@ -185,4 +185,12 @@
     MAXPARAMS
   };
+
+  /** Getter for the graph specifying the binding model of the potential.
+   *
+   * \return HomologyGraph of the binding model
+   */
+  const HomologyGraph& getBindingModel() const
+  { return bindingmodel; }
+
 private:
   //!> parameter vector with parameters as in enum parameter_enum_t
@@ -197,4 +205,7 @@
   //!> internal coordinator object for converting arguments_t
   static Coordinator::ptr coordinator;
+
+  //!> binding model for this potential
+  const HomologyGraph bindingmodel;
 };
 
Index: src/Potentials/Specifics/PairPotential_LennardJones.cpp
===================================================================
--- src/Potentials/Specifics/PairPotential_LennardJones.cpp	(revision c5e75f3270a380f8e6976913af3591de13b69f61)
+++ src/Potentials/Specifics/PairPotential_LennardJones.cpp	(revision d5ca1af98e88b536fe2483fab7d7d2b875452e83)
@@ -67,4 +67,26 @@
 Coordinator::ptr PairPotential_LennardJones::coordinator(Memory::ignore(new TwoBody_Length()));
 
+static HomologyGraph generateBindingModel(const EmpiricalPotential::ParticleTypes_t &_ParticleTypes)
+{
+  // fill nodes
+  HomologyGraph::nodes_t nodes;
+  {
+    ASSERT( _ParticleTypes.size() == (size_t)2,
+        "generateBindingModel() - PairPotential_LennardJones needs two types.");
+    std::pair<HomologyGraph::nodes_t::iterator, bool > inserter;
+    inserter = nodes.insert( std::make_pair(FragmentNode(_ParticleTypes[0], 1), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+    inserter = nodes.insert( std::make_pair(FragmentNode(_ParticleTypes[1], 1), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+  }
+
+  // there are no edges
+  HomologyGraph::edges_t edges;
+
+  return HomologyGraph(nodes, edges);
+}
+
 void PairPotential_LennardJones::setDefaultParameters()
 {
@@ -75,5 +97,6 @@
 PairPotential_LennardJones::PairPotential_LennardJones() :
     EmpiricalPotential(),
-    params(parameters_t(MAXPARAMS, 0.))
+    params(parameters_t(MAXPARAMS, 0.)),
+    bindingmodel(HomologyGraph())
 {
   // have some decent defaults for parameter_derivative checking
@@ -85,5 +108,6 @@
     ) :
   EmpiricalPotential(_ParticleTypes),
-  params(parameters_t(MAXPARAMS, 0.))
+  params(parameters_t(MAXPARAMS, 0.)),
+  bindingmodel(generateBindingModel(_ParticleTypes))
 {
   // have some decent defaults for parameter_derivative checking
@@ -97,5 +121,6 @@
     ) :
   EmpiricalPotential(_ParticleTypes),
-  params(parameters_t(MAXPARAMS, 0.))
+  params(parameters_t(MAXPARAMS, 0.)),
+  bindingmodel(generateBindingModel(_ParticleTypes))
 {
   params[epsilon] = _epsilon;
Index: src/Potentials/Specifics/PairPotential_LennardJones.hpp
===================================================================
--- src/Potentials/Specifics/PairPotential_LennardJones.hpp	(revision c5e75f3270a380f8e6976913af3591de13b69f61)
+++ src/Potentials/Specifics/PairPotential_LennardJones.hpp	(revision d5ca1af98e88b536fe2483fab7d7d2b875452e83)
@@ -187,4 +187,11 @@
   };
 
+  /** Getter for the graph specifying the binding model of the potential.
+   *
+   * \return HomologyGraph of the binding model
+   */
+  const HomologyGraph& getBindingModel() const
+  { return bindingmodel; }
+
 private:
   /** Sets some sensible default parameter values.
@@ -205,4 +212,7 @@
   //!> internal coordinator object for converting arguments_t
   static Coordinator::ptr coordinator;
+
+  //!> binding model for this potential
+  const HomologyGraph bindingmodel;
 };
 
Index: src/Potentials/Specifics/PairPotential_Morse.cpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Morse.cpp	(revision c5e75f3270a380f8e6976913af3591de13b69f61)
+++ src/Potentials/Specifics/PairPotential_Morse.cpp	(revision d5ca1af98e88b536fe2483fab7d7d2b875452e83)
@@ -69,7 +69,33 @@
 Coordinator::ptr PairPotential_Morse::coordinator(Memory::ignore(new TwoBody_Length()));
 
+static HomologyGraph generateBindingModel(const EmpiricalPotential::ParticleTypes_t &_ParticleTypes)
+{
+  // fill nodes
+  HomologyGraph::nodes_t nodes;
+  {
+    ASSERT( _ParticleTypes.size() == (size_t)2,
+        "generateBindingModel() - PairPotential_Morse needs two types.");
+    std::pair<HomologyGraph::nodes_t::iterator, bool > inserter;
+    inserter = nodes.insert( std::make_pair(FragmentNode(_ParticleTypes[0], 1), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+    inserter = nodes.insert( std::make_pair(FragmentNode(_ParticleTypes[1], 1), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+  }
+
+  // there are no edges
+  HomologyGraph::edges_t edges;
+  {
+    edges.insert( std::make_pair( FragmentEdge(_ParticleTypes[0], _ParticleTypes[1]), 1) );
+  }
+
+  return HomologyGraph(nodes, edges);
+}
+
 PairPotential_Morse::PairPotential_Morse() :
   EmpiricalPotential(),
-  params(parameters_t(MAXPARAMS, 0.))
+  params(parameters_t(MAXPARAMS, 0.)),
+  bindingmodel(HomologyGraph())
 {
   // have some decent defaults for parameter_derivative checking
@@ -83,5 +109,6 @@
     ) :
   EmpiricalPotential(_ParticleTypes),
-  params(parameters_t(MAXPARAMS, 0.))
+  params(parameters_t(MAXPARAMS, 0.)),
+  bindingmodel(generateBindingModel(_ParticleTypes))
 {
   // have some decent defaults for parameter_derivative checking
@@ -97,5 +124,6 @@
     const double _dissociation_energy) :
   EmpiricalPotential(_ParticleTypes),
-  params(parameters_t(MAXPARAMS, 0.))
+  params(parameters_t(MAXPARAMS, 0.)),
+  bindingmodel(generateBindingModel(_ParticleTypes))
 {
   params[spring_constant] = _spring_constant;
Index: src/Potentials/Specifics/PairPotential_Morse.hpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Morse.hpp	(revision c5e75f3270a380f8e6976913af3591de13b69f61)
+++ src/Potentials/Specifics/PairPotential_Morse.hpp	(revision d5ca1af98e88b536fe2483fab7d7d2b875452e83)
@@ -188,4 +188,11 @@
   };
 
+  /** Getter for the graph specifying the binding model of the potential.
+   *
+   * \return HomologyGraph of the binding model
+   */
+  const HomologyGraph& getBindingModel() const
+  { return bindingmodel; }
+
 private:
   //!> parameter vector with parameters as in enum parameter_enum_t
@@ -200,4 +207,7 @@
   //!> internal coordinator object for converting arguments_t
   static Coordinator::ptr coordinator;
+
+  //!> binding model for this potential
+  const HomologyGraph bindingmodel;
 };
 
Index: src/Potentials/Specifics/ThreeBodyPotential_Angle.cpp
===================================================================
--- src/Potentials/Specifics/ThreeBodyPotential_Angle.cpp	(revision c5e75f3270a380f8e6976913af3591de13b69f61)
+++ src/Potentials/Specifics/ThreeBodyPotential_Angle.cpp	(revision d5ca1af98e88b536fe2483fab7d7d2b875452e83)
@@ -67,7 +67,42 @@
 Coordinator::ptr ThreeBodyPotential_Angle::coordinator(Memory::ignore(new ThreeBody_Angle()));
 
+static HomologyGraph generateBindingModel(const EmpiricalPotential::ParticleTypes_t &_ParticleTypes)
+{
+  // fill nodes
+  HomologyGraph::nodes_t nodes;
+  {
+    ASSERT( _ParticleTypes.size() == (size_t)3,
+        "generateBindingModel() - ThreeBodyPotential_Angle needs three types.");
+    std::pair<HomologyGraph::nodes_t::iterator, bool > inserter;
+    inserter = nodes.insert( std::make_pair(FragmentNode(_ParticleTypes[0], 1), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+    inserter = nodes.insert( std::make_pair(FragmentNode(_ParticleTypes[1], 2), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+    inserter = nodes.insert( std::make_pair(FragmentNode(_ParticleTypes[2], 1), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+  }
+
+  // there are no edges
+  HomologyGraph::edges_t edges;
+  {
+    std::pair<HomologyGraph::edges_t::iterator, bool > inserter;
+    inserter = edges.insert( std::make_pair( FragmentEdge(_ParticleTypes[0], _ParticleTypes[1]), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+    inserter = edges.insert( std::make_pair( FragmentEdge(_ParticleTypes[1], _ParticleTypes[2]), 1) );
+    if (!inserter.second)
+      ++(inserter.first->second);
+  }
+
+  return HomologyGraph(nodes, edges);
+}
+
 ThreeBodyPotential_Angle::ThreeBodyPotential_Angle() :
   EmpiricalPotential(),
-  params(parameters_t(MAXPARAMS, 0.))
+  params(parameters_t(MAXPARAMS, 0.)),
+  bindingmodel(HomologyGraph())
 {
   // have some decent defaults for parameter_derivative checking
@@ -80,5 +115,6 @@
     ) :
   EmpiricalPotential(_ParticleTypes),
-  params(parameters_t(MAXPARAMS, 0.))
+  params(parameters_t(MAXPARAMS, 0.)),
+  bindingmodel(generateBindingModel(_ParticleTypes))
 {
   // have some decent defaults for parameter_derivative checking
@@ -92,5 +128,6 @@
     const double _equilibrium_distance) :
   EmpiricalPotential(_ParticleTypes),
-  params(parameters_t(MAXPARAMS, 0.))
+  params(parameters_t(MAXPARAMS, 0.)),
+  bindingmodel(generateBindingModel(_ParticleTypes))
 {
   params[spring_constant] = _spring_constant;
Index: src/Potentials/Specifics/ThreeBodyPotential_Angle.hpp
===================================================================
--- src/Potentials/Specifics/ThreeBodyPotential_Angle.hpp	(revision c5e75f3270a380f8e6976913af3591de13b69f61)
+++ src/Potentials/Specifics/ThreeBodyPotential_Angle.hpp	(revision d5ca1af98e88b536fe2483fab7d7d2b875452e83)
@@ -188,4 +188,11 @@
   };
 
+  /** Getter for the graph specifying the binding model of the potential.
+   *
+   * \return HomologyGraph of the binding model
+   */
+  const HomologyGraph& getBindingModel() const
+  { return bindingmodel; }
+
 private:
   result_t
@@ -207,4 +214,7 @@
   //!> internal coordinator object for converting arguments_t
   static Coordinator::ptr coordinator;
+
+  //!> binding model for this potential
+  const HomologyGraph bindingmodel;
 };
 
