Index: src/FunctionApproximation/Extractors.cpp
===================================================================
--- src/FunctionApproximation/Extractors.cpp	(revision bc069f62cf8b80de4fd16b77c2bc588561bbfe34)
+++ src/FunctionApproximation/Extractors.cpp	(revision 9c793cf1c331845f9070f85ee2d7f53ab4007828)
@@ -61,8 +61,8 @@
 #include "LinearAlgebra/Vector.hpp"
 
+#include "Fragmentation/Homology/HomologyGraph.hpp"
 #include "FunctionApproximation/Extractors.hpp"
 #include "FunctionApproximation/FunctionArgument.hpp"
-
-#include "Fragmentation/Homology/HomologyGraph.hpp"
+#include "Potentials/BindingModel.hpp"
 
 using namespace boost::assign;
@@ -535,5 +535,5 @@
     const HomologyGraph &_graph,
     const ParticleTypes_t &_types,
-    const HomologyGraph &_bindingmodel
+    const BindingModel &_bindingmodel
     )
 {
@@ -545,9 +545,10 @@
     // deal with the case when there are no distances (ConstantPotential)
     if (_bindingmodel.getNodes().size() < 2) {
-      LOG(3, "DEBUG: Potential requires only zero or no particle types, needs no distances.");
+      LOG(3, "DEBUG: Potential requires only one or no particle types, needs no distances.");
       continue;
     }
-    if (_bindingmodel.getEdges().empty()) {
+    if (_bindingmodel.getGraph().getEdges().empty()) {
       LOG(3, "DEBUG: Potential represents non-bonded interactions, gets all distances.");
+      // TODO: Here we need to constrain to all distances matching the types?
       returnargs.push_back(args);
       continue;
@@ -604,7 +605,7 @@
 
     /// 2. grab first node of the binding model (gives a type)
-    const FragmentNode &firstnode = _bindingmodel.getNodes().begin()->first;
-    const size_t &firsttimes = _bindingmodel.getNodes().begin()->second;
-    const size_t &firsttype = firstnode.getAtomicNumber(); // TODO: convert to ParticleNumber_t ?
+    const BindingModel::vector_nodes_t::const_iterator firstiter = _bindingmodel.getNodes().begin();
+    const FragmentNode &firstnode = *firstiter;
+    const Extractors::ParticleType_t &firsttype = firstnode.getAtomicNumber();
 
     /// 3. grab all candidate nodes contained in arguments_t
@@ -612,12 +613,8 @@
         type_index_lookup_t::right_const_iterator,
         type_index_lookup_t::right_const_iterator> range = type_index_lookup.right.equal_range(firsttype);
-#ifndef NDEBUG
-    const size_t checktimes = std::distance(range.first, range.second);
-    ASSERT( firsttimes == checktimes,
-        "Extractors::reorderArgumentsByParticleTypes() - unequal amounts of same first type "
-        +toString(firsttype)+" in HomologyGraph and in type lookup "+toString(checktimes));
-#endif
 
     /// 4. go over all candidate nodes (gives index)
+    const size_t nodes_in_bindingmodel = _bindingmodel.getNodes().size();
+    LOG(2, "DEBUG: There are " << nodes_in_bindingmodel << " nodes in the binding model.");
     set_of_nodes_t set_of_nodes;
     for (type_index_lookup_t::right_const_iterator rangeiter = range.first;
@@ -648,5 +645,5 @@
 
       generateAllInducedConnectedSubgraphs(
-          N-1, level, nodes, set_of_nodes, nodes_per_level, fragmentgraph, distances, index_map);
+          nodes_in_bindingmodel-1, level, nodes, set_of_nodes, nodes_per_level, fragmentgraph, distances, index_map);
       LOG(2, "DEBUG: We have found " << set_of_nodes.size() << " unique induced, connected subgraphs.");
     }
@@ -661,6 +658,6 @@
 
       /// 10. compare each converted HomologyGraph with _bindingmodel: Accept or Reject
-      if (nodes_graph == _bindingmodel) {
-        LOG(2, "ACCEPT: " << nodes_graph << " is identical to " << _bindingmodel);
+      if (nodes_graph == _bindingmodel.getGraph()) {
+        LOG(2, "ACCEPT: " << nodes_graph << " is identical to " << _bindingmodel.getGraph());
         /// 11. for each accepted keyset, pick _all_ symmetric distances from arguments_t
         FunctionModel::arguments_t argumentbunch;
@@ -687,47 +684,47 @@
          */
 
-        /// So, we need to store for each node its type and the number of connected
-        /// edges, which we extract from the argumentbunch.
+        /// So, we need to extract from the argumentbunch the information contained in each
+        /// FragmentNode, namely its type and the number of connected edges
         node_FragmentNode_map_t node_FragmentNode_map = fillNodeFragmentMap(argumentbunch);
 
-        /// Then, we step through the nodes of the bindingmodel
-        const HomologyGraph::nodes_t bindingmodel_nodes = _bindingmodel.getNodes();
+        /// Then, we step through the nodes of the bindingmodel ...
+        /// ... and find a suitable mapping from indices in the arguments to
+        /// the index in the order of the HomologyGraph's nodes
+        const BindingModel::vector_nodes_t bindingmodel_nodes = _bindingmodel.getNodes();
         argindex_to_nodeindex_t argindex_to_nodeindex;
         size_t nodeindex = 0;
-        for (HomologyGraph::nodes_t::const_iterator nodeiter = bindingmodel_nodes.begin();
+        for (BindingModel::vector_nodes_t::const_iterator nodeiter = bindingmodel_nodes.begin();
             nodeiter != bindingmodel_nodes.end(); ++nodeiter) {
-          const FragmentNode &node = nodeiter->first;
+          const FragmentNode &node = *nodeiter;
           LOG(3, "DEBUG: Binding model's node #" << node << ".");
-          // might have to pick several
-          for (size_t pick_no = 0; pick_no < nodeiter->second; ++pick_no) {
-            /// ... and pick for each the first (and unique) from these stored nodes.
-            node_FragmentNode_map_t::iterator mapiter = node_FragmentNode_map.begin();
-            for (;mapiter != node_FragmentNode_map.end(); ++mapiter) {
-              if ((mapiter->second.first == node.getAtomicNumber())
-                  && (mapiter->second.second == node.getConnectedEdges())) {
-                LOG(3, "DEBUG: #" << mapiter->first << " with type " << mapiter->second.first
-                    << " and " << mapiter->second.second << " connected edges matches as choice #"
-                    << pick_no << ".");
-                break;
-              }
+          /// ... and pick for each the first (and unique) from these stored nodes.
+          node_FragmentNode_map_t::iterator mapiter = node_FragmentNode_map.begin();
+          for (;mapiter != node_FragmentNode_map.end(); ++mapiter) {
+            if ((mapiter->second.first == node.getAtomicNumber())
+                && (mapiter->second.second == node.getConnectedEdges())) {
+              LOG(3, "DEBUG: #" << mapiter->first << " with type " << mapiter->second.first
+                  << " and " << mapiter->second.second << " connected edges matches.");
+              break;
             }
-            ASSERT( mapiter != node_FragmentNode_map.end(),
-                "Extractors::reorderArgumentsByParticleTypes() - could not find a suitable node for #"+
-                toString(mapiter->first)+" with type "+toString(mapiter->second.first)+" and "+
-                toString(mapiter->second.second)+" connected edges");
-            std::pair<argindex_to_nodeindex_t::iterator, bool> inserter =
-                argindex_to_nodeindex.insert( std::make_pair(mapiter->first, nodeindex++) );
-            ASSERT( inserter.second,
-                "Extractors::reorderArgumentsByParticleTypes() - node #"+toString(mapiter->first)+
-                " is already present?");
-            // remove to ensure uniqueness of choice
-            node_FragmentNode_map.erase(mapiter);
           }
+          ASSERT( mapiter != node_FragmentNode_map.end(),
+              "Extractors::reorderArgumentsByParticleTypes() - could not find a suitable node for #"+
+              toString(mapiter->first)+" with type "+toString(mapiter->second.first)+" and "+
+              toString(mapiter->second.second)+" connected edges");
+          std::pair<argindex_to_nodeindex_t::iterator, bool> inserter =
+              argindex_to_nodeindex.insert( std::make_pair(mapiter->first, nodeindex++) );
+          ASSERT( inserter.second,
+              "Extractors::reorderArgumentsByParticleTypes() - node #"+toString(mapiter->first)+
+              " is already present?");
+          // remove to ensure uniqueness of choice
+          node_FragmentNode_map.erase(mapiter);
         }
-        /// This gives then the desired mapping from indices in the arguments to
-        /// the index in the order of the HomologyGraph's nodes
+        LOG(4, "DEBUG: argument's indices to node index map is " << argindex_to_nodeindex);
+        // i.e. this is not the arg's index in argumentbunch, but the index of the position
+        // contained in the argument_t
 
         /// Finally, we only need to bring the arguments in the typical order:
         /// 01 02 03 04 ... 0n, 12 13 14 ... 1n, 23 24 25 ... 2n, ...,  (n-1)n
+        /// These ordering we store in a map for each argument's indices
         const size_t num_args = argindex_to_nodeindex.size();
         argument_placement_map_t argument_placement_map = fillArgumentsPlacementMap(num_args);
@@ -737,11 +734,13 @@
             toString(argument_placement_map.size())+" and we expected "+toString(argumentbunch.size()));
 
-        // and finally resort the arguments with the known placement map
-        FunctionModel::arguments_t sortedargs(argumentbunch);
+        // and finally resort the arguments with the constructed placement map
+        FunctionModel::arguments_t sortedargs(argumentbunch.size());
         for (FunctionModel::arguments_t::const_iterator argiter = argumentbunch.begin();
             argiter != argumentbunch.end(); ++argiter) {
           const argument_t &arg = *argiter;
+          const argument_t::indices_t translatedIndices =
+              translateIndices(argindex_to_nodeindex, arg.indices);
           const argument_placement_map_t::const_iterator indexiter =
-              argument_placement_map.find( translateIndices(argindex_to_nodeindex, arg.indices) );
+              argument_placement_map.find( translatedIndices );
           ASSERT( indexiter != argument_placement_map.end(),
               "Extractors::reorderArgumentsByParticleTypes() - could not find place for edge "+
@@ -749,5 +748,5 @@
           sortedargs[indexiter->second] = arg;
           LOG(3, "DEBUG: Placed argument " << arg << " at #" << indexiter->second
-              << " as translated indices are " << translateIndices(argindex_to_nodeindex, arg.indices));
+              << " as translated indices are " << translatedIndices);
         }
         LOG(2, "DEBUG: Sorted arguments are " << sortedargs << ".");
@@ -755,5 +754,5 @@
         returnargs.push_back(sortedargs);
       } else {
-        LOG(2, "REJECT: " << nodes_graph << " is not identical to " << _bindingmodel);
+        LOG(2, "REJECT: " << nodes_graph << " is not identical to " << _bindingmodel.getGraph());
       }
     }
@@ -767,5 +766,5 @@
     const HomologyGraph &_graph,
     const ParticleTypes_t &_types,
-    const HomologyGraph &_bindingmodel
+    const BindingModel &_bindingmodel
     )
 {
Index: src/FunctionApproximation/Extractors.hpp
===================================================================
--- src/FunctionApproximation/Extractors.hpp	(revision bc069f62cf8b80de4fd16b77c2bc588561bbfe34)
+++ src/FunctionApproximation/Extractors.hpp	(revision 9c793cf1c331845f9070f85ee2d7f53ab4007828)
@@ -20,4 +20,5 @@
 #include "FunctionApproximation/FunctionModel.hpp"
 
+class BindingModel;
 class Fragment;
 class HomologyGraph;
@@ -118,5 +119,5 @@
       const HomologyGraph &_graph,
       const ParticleTypes_t &_types,
-      const HomologyGraph &_bindingmodel
+      const BindingModel &_bindingmodel
       );
 
@@ -135,5 +136,5 @@
       const HomologyGraph &_graph,
       const ParticleTypes_t &_types,
-      const HomologyGraph &_bindingmodel
+      const BindingModel &_bindingmodel
       );
 
Index: src/Potentials/EmpiricalPotential.hpp
===================================================================
--- src/Potentials/EmpiricalPotential.hpp	(revision bc069f62cf8b80de4fd16b77c2bc588561bbfe34)
+++ src/Potentials/EmpiricalPotential.hpp	(revision 9c793cf1c331845f9070f85ee2d7f53ab4007828)
@@ -17,7 +17,7 @@
 #include <vector>
 
-#include "Fragmentation/Homology/HomologyGraph.hpp"
 #include "FunctionApproximation/FunctionArgument.hpp"
 #include "FunctionApproximation/FunctionModel.hpp"
+#include "Potentials/BindingModel.hpp"
 #include "Potentials/SerializablePotential.hpp"
 #include "Potentials/InternalCoordinates/Coordinator.hpp"
@@ -84,7 +84,7 @@
   /** Getter for the graph specifying the binding model of the potential.
    *
-   * \return HomologyGraph of the binding model
+   * \return BindingModel ref of the binding model
    */
-  virtual const HomologyGraph& getBindingModel() const=0;
+  virtual const BindingModel& getBindingModel() const=0;
 
 protected:
Index: src/Potentials/Specifics/ConstantPotential.cpp
===================================================================
--- src/Potentials/Specifics/ConstantPotential.cpp	(revision bc069f62cf8b80de4fd16b77c2bc588561bbfe34)
+++ src/Potentials/Specifics/ConstantPotential.cpp	(revision 9c793cf1c331845f9070f85ee2d7f53ab4007828)
@@ -65,17 +65,17 @@
 Coordinator::ptr ConstantPotential::coordinator(Memory::ignore(new OneBody_Constant()));
 
-static HomologyGraph generateBindingModel(const EmpiricalPotential::ParticleTypes_t &_ParticleTypes)
+static BindingModel 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;
+  BindingModel::vector_nodes_t nodes;
   if (_ParticleTypes.size() == (size_t)1)
-    nodes.insert( std::make_pair(FragmentNode(_ParticleTypes.front(), 0), 1) );
+    nodes.push_back( FragmentNode(_ParticleTypes.front(), 0) );
 
   // there are no edges
   HomologyGraph::edges_t edges;
 
-  return HomologyGraph(nodes, edges);
+  return BindingModel(nodes, edges);
 }
 
@@ -83,5 +83,5 @@
     EmpiricalPotential(),
     params(parameters_t(MAXPARAMS, 0.)),
-    bindingmodel(HomologyGraph())
+    bindingmodel(BindingModel())
 {
   // have some decent defaults for parameter_derivative checking
Index: src/Potentials/Specifics/ConstantPotential.hpp
===================================================================
--- src/Potentials/Specifics/ConstantPotential.hpp	(revision bc069f62cf8b80de4fd16b77c2bc588561bbfe34)
+++ src/Potentials/Specifics/ConstantPotential.hpp	(revision 9c793cf1c331845f9070f85ee2d7f53ab4007828)
@@ -186,7 +186,7 @@
   /** Getter for the graph specifying the binding model of the potential.
    *
-   * \return HomologyGraph of the binding model
-   */
-  const HomologyGraph& getBindingModel() const
+   * \return BindingModel ref of the binding model
+   */
+  const BindingModel& getBindingModel() const
   { return bindingmodel; }
 
@@ -205,5 +205,5 @@
 
   //!> binding model for this potential
-  const HomologyGraph bindingmodel;
+  const BindingModel bindingmodel;
 };
 
Index: src/Potentials/Specifics/FourBodyPotential_Improper.cpp
===================================================================
--- src/Potentials/Specifics/FourBodyPotential_Improper.cpp	(revision bc069f62cf8b80de4fd16b77c2bc588561bbfe34)
+++ src/Potentials/Specifics/FourBodyPotential_Improper.cpp	(revision 9c793cf1c331845f9070f85ee2d7f53ab4007828)
@@ -53,24 +53,15 @@
 Coordinator::ptr FourBodyPotential_Improper::coordinator(Memory::ignore(new FourBody_ImproperAngle()));
 
-static HomologyGraph generateBindingModel(const EmpiricalPotential::ParticleTypes_t &_ParticleTypes)
+static BindingModel generateBindingModel(const EmpiricalPotential::ParticleTypes_t &_ParticleTypes)
 {
   // fill nodes
-  HomologyGraph::nodes_t nodes;
+  BindingModel::vector_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);
+    nodes.push_back( FragmentNode(_ParticleTypes[0], 3) );
+    nodes.push_back( FragmentNode(_ParticleTypes[1], 1) );
+    nodes.push_back( FragmentNode(_ParticleTypes[2], 1) );
+    nodes.push_back( FragmentNode(_ParticleTypes[3], 1) );
   }
 
@@ -90,10 +81,10 @@
   }
 
-  return HomologyGraph(nodes, edges);
+  return BindingModel(nodes, edges);
 }
 
 FourBodyPotential_Improper::FourBodyPotential_Improper() :
     FourBodyPotential_Torsion(),
-    bindingmodel(HomologyGraph())
+    bindingmodel(BindingModel())
 {}
 
Index: src/Potentials/Specifics/FourBodyPotential_Improper.hpp
===================================================================
--- src/Potentials/Specifics/FourBodyPotential_Improper.hpp	(revision bc069f62cf8b80de4fd16b77c2bc588561bbfe34)
+++ src/Potentials/Specifics/FourBodyPotential_Improper.hpp	(revision 9c793cf1c331845f9070f85ee2d7f53ab4007828)
@@ -62,7 +62,7 @@
   /** Getter for the graph specifying the binding model of the potential.
    *
-   * \return HomologyGraph of the binding model
+   * \return BindingModel ref of the binding model
    */
-  const HomologyGraph& getBindingModel() const
+  const BindingModel& getBindingModel() const
   { return bindingmodel; }
 
@@ -89,5 +89,5 @@
 
   //!> binding model for this potential
-  const HomologyGraph bindingmodel;
+  const BindingModel bindingmodel;
 };
 
Index: src/Potentials/Specifics/FourBodyPotential_Torsion.cpp
===================================================================
--- src/Potentials/Specifics/FourBodyPotential_Torsion.cpp	(revision bc069f62cf8b80de4fd16b77c2bc588561bbfe34)
+++ src/Potentials/Specifics/FourBodyPotential_Torsion.cpp	(revision 9c793cf1c331845f9070f85ee2d7f53ab4007828)
@@ -66,24 +66,15 @@
 Coordinator::ptr FourBodyPotential_Torsion::coordinator(Memory::ignore(new FourBody_TorsionAngle()));
 
-static HomologyGraph generateBindingModel(const EmpiricalPotential::ParticleTypes_t &_ParticleTypes)
+static BindingModel generateBindingModel(const EmpiricalPotential::ParticleTypes_t &_ParticleTypes)
 {
   // fill nodes
-  HomologyGraph::nodes_t nodes;
+  BindingModel::vector_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);
+    nodes.push_back( FragmentNode(_ParticleTypes[0], 1) );
+    nodes.push_back( FragmentNode(_ParticleTypes[1], 2) );
+    nodes.push_back( FragmentNode(_ParticleTypes[2], 2) );
+    nodes.push_back( FragmentNode(_ParticleTypes[3], 1) );
   }
 
@@ -103,5 +94,5 @@
   }
 
-  return HomologyGraph(nodes, edges);
+  return BindingModel(nodes, edges);
 }
 
@@ -109,5 +100,5 @@
   EmpiricalPotential(),
   params(parameters_t(MAXPARAMS, 0.)),
-  bindingmodel(HomologyGraph())
+  bindingmodel(BindingModel())
 {
   // have some decent defaults for parameter_derivative checking
Index: src/Potentials/Specifics/FourBodyPotential_Torsion.hpp
===================================================================
--- src/Potentials/Specifics/FourBodyPotential_Torsion.hpp	(revision bc069f62cf8b80de4fd16b77c2bc588561bbfe34)
+++ src/Potentials/Specifics/FourBodyPotential_Torsion.hpp	(revision 9c793cf1c331845f9070f85ee2d7f53ab4007828)
@@ -193,7 +193,7 @@
   /** Getter for the graph specifying the binding model of the potential.
    *
-   * \return HomologyGraph of the binding model
-   */
-  const HomologyGraph& getBindingModel() const
+   * \return BindingModel ref of the binding model
+   */
+  const BindingModel& getBindingModel() const
   { return bindingmodel; }
 
@@ -221,5 +221,5 @@
 
   //!> binding model for this potential
-  const HomologyGraph bindingmodel;
+  const BindingModel bindingmodel;
 };
 
Index: src/Potentials/Specifics/ManyBodyPotential_Tersoff.cpp
===================================================================
--- src/Potentials/Specifics/ManyBodyPotential_Tersoff.cpp	(revision bc069f62cf8b80de4fd16b77c2bc588561bbfe34)
+++ src/Potentials/Specifics/ManyBodyPotential_Tersoff.cpp	(revision 9c793cf1c331845f9070f85ee2d7f53ab4007828)
@@ -82,18 +82,13 @@
 Coordinator::ptr ManyBodyPotential_Tersoff::coordinator(Memory::ignore(new OneBody_Constant()));
 
-static HomologyGraph generateBindingModel(const EmpiricalPotential::ParticleTypes_t &_ParticleTypes)
+static BindingModel generateBindingModel(const EmpiricalPotential::ParticleTypes_t &_ParticleTypes)
 {
   // fill nodes
-  HomologyGraph::nodes_t nodes;
+  BindingModel::vector_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);
+    nodes.push_back( FragmentNode(_ParticleTypes[0], 1) );
+    nodes.push_back( FragmentNode(_ParticleTypes[1], 1) );
   }
 
@@ -104,5 +99,5 @@
   }
 
-  return HomologyGraph(nodes, edges);
+  return BindingModel(nodes, edges);
 }
 
@@ -117,5 +112,5 @@
     omega(1.),
     triplefunction(&Helpers::NoOp_Triplefunction),
-    bindingmodel(HomologyGraph())
+    bindingmodel(BindingModel())
 {}
 
Index: src/Potentials/Specifics/ManyBodyPotential_Tersoff.hpp
===================================================================
--- src/Potentials/Specifics/ManyBodyPotential_Tersoff.hpp	(revision bc069f62cf8b80de4fd16b77c2bc588561bbfe34)
+++ src/Potentials/Specifics/ManyBodyPotential_Tersoff.hpp	(revision 9c793cf1c331845f9070f85ee2d7f53ab4007828)
@@ -215,7 +215,7 @@
   /** Getter for the graph specifying the binding model of the potential.
    *
-   * \return HomologyGraph of the binding model
-   */
-  const HomologyGraph& getBindingModel() const
+   * \return BindingModel ref of the binding model
+   */
+  const BindingModel& getBindingModel() const
   { return bindingmodel; }
 
@@ -372,5 +372,5 @@
 
   //!> binding model for this potential
-  const HomologyGraph bindingmodel;
+  const BindingModel bindingmodel;
 };
 
Index: src/Potentials/Specifics/PairPotential_Harmonic.cpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Harmonic.cpp	(revision bc069f62cf8b80de4fd16b77c2bc588561bbfe34)
+++ src/Potentials/Specifics/PairPotential_Harmonic.cpp	(revision 9c793cf1c331845f9070f85ee2d7f53ab4007828)
@@ -67,18 +67,13 @@
 Coordinator::ptr PairPotential_Harmonic::coordinator(Memory::ignore(new TwoBody_Length()));
 
-static HomologyGraph generateBindingModel(const EmpiricalPotential::ParticleTypes_t &_ParticleTypes)
+static BindingModel generateBindingModel(const EmpiricalPotential::ParticleTypes_t &_ParticleTypes)
 {
   // fill nodes
-  HomologyGraph::nodes_t nodes;
+  BindingModel::vector_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);
+    nodes.push_back( FragmentNode(_ParticleTypes[0], 1) );
+    nodes.push_back( FragmentNode(_ParticleTypes[1], 1) );
   }
 
@@ -89,5 +84,5 @@
   }
 
-  return HomologyGraph(nodes, edges);
+  return BindingModel(nodes, edges);
 }
 
@@ -95,5 +90,5 @@
   EmpiricalPotential(),
   params(parameters_t(MAXPARAMS, 0.)),
-  bindingmodel(HomologyGraph())
+  bindingmodel(BindingModel())
 {
   // have some decent defaults for parameter_derivative checking
Index: src/Potentials/Specifics/PairPotential_Harmonic.hpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Harmonic.hpp	(revision bc069f62cf8b80de4fd16b77c2bc588561bbfe34)
+++ src/Potentials/Specifics/PairPotential_Harmonic.hpp	(revision 9c793cf1c331845f9070f85ee2d7f53ab4007828)
@@ -188,7 +188,7 @@
   /** Getter for the graph specifying the binding model of the potential.
    *
-   * \return HomologyGraph of the binding model
-   */
-  const HomologyGraph& getBindingModel() const
+   * \return BindingModel ref of the binding model
+   */
+  const BindingModel& getBindingModel() const
   { return bindingmodel; }
 
@@ -207,5 +207,5 @@
 
   //!> binding model for this potential
-  const HomologyGraph bindingmodel;
+  const BindingModel bindingmodel;
 };
 
Index: src/Potentials/Specifics/PairPotential_LennardJones.cpp
===================================================================
--- src/Potentials/Specifics/PairPotential_LennardJones.cpp	(revision bc069f62cf8b80de4fd16b77c2bc588561bbfe34)
+++ src/Potentials/Specifics/PairPotential_LennardJones.cpp	(revision 9c793cf1c331845f9070f85ee2d7f53ab4007828)
@@ -67,18 +67,13 @@
 Coordinator::ptr PairPotential_LennardJones::coordinator(Memory::ignore(new TwoBody_Length()));
 
-static HomologyGraph generateBindingModel(const EmpiricalPotential::ParticleTypes_t &_ParticleTypes)
+static BindingModel generateBindingModel(const EmpiricalPotential::ParticleTypes_t &_ParticleTypes)
 {
   // fill nodes
-  HomologyGraph::nodes_t nodes;
+  BindingModel::vector_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);
+    nodes.push_back( FragmentNode(_ParticleTypes[0], 1) );
+    nodes.push_back( FragmentNode(_ParticleTypes[1], 1) );
   }
 
@@ -86,5 +81,5 @@
   HomologyGraph::edges_t edges;
 
-  return HomologyGraph(nodes, edges);
+  return BindingModel(nodes, edges);
 }
 
@@ -98,5 +93,5 @@
     EmpiricalPotential(),
     params(parameters_t(MAXPARAMS, 0.)),
-    bindingmodel(HomologyGraph())
+    bindingmodel(BindingModel())
 {
   // have some decent defaults for parameter_derivative checking
Index: src/Potentials/Specifics/PairPotential_LennardJones.hpp
===================================================================
--- src/Potentials/Specifics/PairPotential_LennardJones.hpp	(revision bc069f62cf8b80de4fd16b77c2bc588561bbfe34)
+++ src/Potentials/Specifics/PairPotential_LennardJones.hpp	(revision 9c793cf1c331845f9070f85ee2d7f53ab4007828)
@@ -189,7 +189,7 @@
   /** Getter for the graph specifying the binding model of the potential.
    *
-   * \return HomologyGraph of the binding model
-   */
-  const HomologyGraph& getBindingModel() const
+   * \return BindingModel ref of the binding model
+   */
+  const BindingModel& getBindingModel() const
   { return bindingmodel; }
 
@@ -214,5 +214,5 @@
 
   //!> binding model for this potential
-  const HomologyGraph bindingmodel;
+  const BindingModel bindingmodel;
 };
 
Index: src/Potentials/Specifics/PairPotential_Morse.cpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Morse.cpp	(revision bc069f62cf8b80de4fd16b77c2bc588561bbfe34)
+++ src/Potentials/Specifics/PairPotential_Morse.cpp	(revision 9c793cf1c331845f9070f85ee2d7f53ab4007828)
@@ -69,18 +69,13 @@
 Coordinator::ptr PairPotential_Morse::coordinator(Memory::ignore(new TwoBody_Length()));
 
-static HomologyGraph generateBindingModel(const EmpiricalPotential::ParticleTypes_t &_ParticleTypes)
+static BindingModel generateBindingModel(const EmpiricalPotential::ParticleTypes_t &_ParticleTypes)
 {
   // fill nodes
-  HomologyGraph::nodes_t nodes;
+  BindingModel::vector_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);
+    nodes.push_back( FragmentNode(_ParticleTypes[0], 1) );
+    nodes.push_back( FragmentNode(_ParticleTypes[1], 1) );
   }
 
@@ -91,5 +86,5 @@
   }
 
-  return HomologyGraph(nodes, edges);
+  return BindingModel(nodes, edges);
 }
 
@@ -97,5 +92,5 @@
   EmpiricalPotential(),
   params(parameters_t(MAXPARAMS, 0.)),
-  bindingmodel(HomologyGraph())
+  bindingmodel(BindingModel())
 {
   // have some decent defaults for parameter_derivative checking
Index: src/Potentials/Specifics/PairPotential_Morse.hpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Morse.hpp	(revision bc069f62cf8b80de4fd16b77c2bc588561bbfe34)
+++ src/Potentials/Specifics/PairPotential_Morse.hpp	(revision 9c793cf1c331845f9070f85ee2d7f53ab4007828)
@@ -190,7 +190,7 @@
   /** Getter for the graph specifying the binding model of the potential.
    *
-   * \return HomologyGraph of the binding model
-   */
-  const HomologyGraph& getBindingModel() const
+   * \return BindingModel ref of the binding model
+   */
+  const BindingModel& getBindingModel() const
   { return bindingmodel; }
 
@@ -209,5 +209,5 @@
 
   //!> binding model for this potential
-  const HomologyGraph bindingmodel;
+  const BindingModel bindingmodel;
 };
 
Index: src/Potentials/Specifics/ThreeBodyPotential_Angle.cpp
===================================================================
--- src/Potentials/Specifics/ThreeBodyPotential_Angle.cpp	(revision bc069f62cf8b80de4fd16b77c2bc588561bbfe34)
+++ src/Potentials/Specifics/ThreeBodyPotential_Angle.cpp	(revision 9c793cf1c331845f9070f85ee2d7f53ab4007828)
@@ -67,21 +67,14 @@
 Coordinator::ptr ThreeBodyPotential_Angle::coordinator(Memory::ignore(new ThreeBody_Angle()));
 
-static HomologyGraph generateBindingModel(const EmpiricalPotential::ParticleTypes_t &_ParticleTypes)
+static BindingModel generateBindingModel(const EmpiricalPotential::ParticleTypes_t &_ParticleTypes)
 {
   // fill nodes
-  HomologyGraph::nodes_t nodes;
+  BindingModel::vector_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);
+    nodes.push_back( FragmentNode(_ParticleTypes[0], 1) );
+    nodes.push_back( FragmentNode(_ParticleTypes[1], 2) );
+    nodes.push_back( FragmentNode(_ParticleTypes[2], 1) );
   }
 
@@ -98,5 +91,5 @@
   }
 
-  return HomologyGraph(nodes, edges);
+  return BindingModel(nodes, edges);
 }
 
@@ -104,5 +97,5 @@
   EmpiricalPotential(),
   params(parameters_t(MAXPARAMS, 0.)),
-  bindingmodel(HomologyGraph())
+  bindingmodel(BindingModel())
 {
   // have some decent defaults for parameter_derivative checking
Index: src/Potentials/Specifics/ThreeBodyPotential_Angle.hpp
===================================================================
--- src/Potentials/Specifics/ThreeBodyPotential_Angle.hpp	(revision bc069f62cf8b80de4fd16b77c2bc588561bbfe34)
+++ src/Potentials/Specifics/ThreeBodyPotential_Angle.hpp	(revision 9c793cf1c331845f9070f85ee2d7f53ab4007828)
@@ -192,5 +192,5 @@
    * \return HomologyGraph of the binding model
    */
-  const HomologyGraph& getBindingModel() const
+  const BindingModel& getBindingModel() const
   { return bindingmodel; }
 
@@ -216,5 +216,5 @@
 
   //!> binding model for this potential
-  const HomologyGraph bindingmodel;
+  const BindingModel bindingmodel;
 };
 
