Index: src/Potentials/Specifics/ManyBodyPotential_Tersoff.cpp
===================================================================
--- src/Potentials/Specifics/ManyBodyPotential_Tersoff.cpp	(revision 3d255915b7f2233d996e6bf9358789e4d408da65)
+++ src/Potentials/Specifics/ManyBodyPotential_Tersoff.cpp	(revision da2d5c9d76dfbd881fcf84f38ad0fc0c9d8347a8)
@@ -683,9 +683,6 @@
 
 FunctionModel::extractor_t
-ManyBodyPotential_Tersoff::getFragmentSpecificExtractor(
-    const charges_t &charges) const
-{
-  ASSERT(charges.size() <= (size_t)2,
-      "ManyBodyPotential_Tersoff::getFragmentSpecificExtractor() - requires 1 charge.");
+ManyBodyPotential_Tersoff::getFragmentSpecificExtractor() const
+{
   FunctionModel::extractor_t returnfunction =
       boost::bind(&Extractors::gatherAllDistances,
Index: src/Potentials/Specifics/ManyBodyPotential_Tersoff.hpp
===================================================================
--- src/Potentials/Specifics/ManyBodyPotential_Tersoff.hpp	(revision 3d255915b7f2233d996e6bf9358789e4d408da65)
+++ src/Potentials/Specifics/ManyBodyPotential_Tersoff.hpp	(revision da2d5c9d76dfbd881fcf84f38ad0fc0c9d8347a8)
@@ -179,8 +179,7 @@
    * from a Fragment.
    *
-   * \param charges vector of charges to be extracted
    * \return bound function extracting distances from a fragment
    */
-  FunctionModel::extractor_t getFragmentSpecificExtractor(const charges_t &charges) const;
+  FunctionModel::extractor_t getFragmentSpecificExtractor() const;
 
   /** Sets the magic triple function that we use for getting angle distances.
Index: src/Potentials/Specifics/PairPotential_Angle.cpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Angle.cpp	(revision 3d255915b7f2233d996e6bf9358789e4d408da65)
+++ src/Potentials/Specifics/PairPotential_Angle.cpp	(revision da2d5c9d76dfbd881fcf84f38ad0fc0c9d8347a8)
@@ -41,4 +41,5 @@
 #include <boost/assign/list_of.hpp> // for 'map_list_of()'
 #include <boost/bind.hpp>
+#include <boost/lambda/lambda.hpp>
 #include <string>
 
@@ -206,14 +207,15 @@
 
 FunctionModel::extractor_t
-PairPotential_Angle::getFragmentSpecificExtractor(
-    const charges_t &charges) const
-{
-  ASSERT(charges.size() == (size_t)3,
-      "PairPotential_Angle::getFragmentSpecificExtractor() - requires 3 charges.");
+PairPotential_Angle::getFragmentSpecificExtractor() const
+{
+  Fragment::charges_t charges;
+  charges.resize(getParticleTypes().size());
+  std::transform(getParticleTypes().begin(), getParticleTypes().end(),
+      charges.begin(), boost::lambda::_1);
   FunctionModel::extractor_t returnfunction =
       boost::bind(&Extractors::gatherDistancesFromFragment,
           boost::bind(&Fragment::getPositions, _1),
           boost::bind(&Fragment::getCharges, _1),
-          boost::cref(charges),
+          charges,
           _2);
   return returnfunction;
Index: src/Potentials/Specifics/PairPotential_Angle.hpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Angle.hpp	(revision 3d255915b7f2233d996e6bf9358789e4d408da65)
+++ src/Potentials/Specifics/PairPotential_Angle.hpp	(revision da2d5c9d76dfbd881fcf84f38ad0fc0c9d8347a8)
@@ -156,8 +156,7 @@
    * from a Fragment.
    *
-   * \param charges vector of charges to be extracted
    * \return bound function extracting distances from a fragment
    */
-  FunctionModel::extractor_t getFragmentSpecificExtractor(const charges_t &charges) const;
+  FunctionModel::extractor_t getFragmentSpecificExtractor() const;
 
   enum parameter_enum_t {
Index: src/Potentials/Specifics/PairPotential_Harmonic.cpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Harmonic.cpp	(revision 3d255915b7f2233d996e6bf9358789e4d408da65)
+++ src/Potentials/Specifics/PairPotential_Harmonic.cpp	(revision da2d5c9d76dfbd881fcf84f38ad0fc0c9d8347a8)
@@ -41,4 +41,5 @@
 #include <boost/assign/list_of.hpp> // for 'map_list_of()'
 #include <boost/bind.hpp>
+#include <boost/lambda/lambda.hpp>
 #include <string>
 
@@ -182,14 +183,15 @@
 
 FunctionModel::extractor_t
-PairPotential_Harmonic::getFragmentSpecificExtractor(
-    const charges_t &charges) const
-{
-  ASSERT(charges.size() == (size_t)2,
-      "PairPotential_Harmonic::getFragmentSpecificExtractor() - requires 2 charges.");
+PairPotential_Harmonic::getFragmentSpecificExtractor() const
+{
+  Fragment::charges_t charges;
+  charges.resize(getParticleTypes().size());
+  std::transform(getParticleTypes().begin(), getParticleTypes().end(),
+      charges.begin(), boost::lambda::_1);
   FunctionModel::extractor_t returnfunction =
       boost::bind(&Extractors::gatherDistancesFromFragment,
           boost::bind(&Fragment::getPositions, _1),
           boost::bind(&Fragment::getCharges, _1),
-          boost::cref(charges),
+          charges,
           _2);
   return returnfunction;
Index: src/Potentials/Specifics/PairPotential_Harmonic.hpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Harmonic.hpp	(revision 3d255915b7f2233d996e6bf9358789e4d408da65)
+++ src/Potentials/Specifics/PairPotential_Harmonic.hpp	(revision da2d5c9d76dfbd881fcf84f38ad0fc0c9d8347a8)
@@ -138,8 +138,7 @@
    * from a Fragment.
    *
-   * \param charges vector of charges to be extracted
    * \return bound function extracting distances from a fragment
    */
-  FunctionModel::extractor_t getFragmentSpecificExtractor(const charges_t &charges) const;
+  FunctionModel::extractor_t getFragmentSpecificExtractor() const;
 
   /** Return the token name of this specific potential.
Index: src/Potentials/Specifics/PairPotential_Morse.cpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Morse.cpp	(revision 3d255915b7f2233d996e6bf9358789e4d408da65)
+++ src/Potentials/Specifics/PairPotential_Morse.cpp	(revision da2d5c9d76dfbd881fcf84f38ad0fc0c9d8347a8)
@@ -41,4 +41,5 @@
 #include <boost/assign/list_of.hpp> // for 'map_list_of()'
 #include <boost/bind.hpp>
+#include <boost/lambda/lambda.hpp>
 #include <cmath>
 #include <string>
@@ -211,14 +212,15 @@
 
 FunctionModel::extractor_t
-PairPotential_Morse::getFragmentSpecificExtractor(
-    const charges_t &charges) const
-{
-  ASSERT(charges.size() == (size_t)2,
-      "PairPotential_Morse::getFragmentSpecificExtractor() - requires 2 charges.");
+PairPotential_Morse::getFragmentSpecificExtractor() const
+{
+  Fragment::charges_t charges;
+  charges.resize(getParticleTypes().size());
+  std::transform(getParticleTypes().begin(), getParticleTypes().end(),
+      charges.begin(), boost::lambda::_1);
   FunctionModel::extractor_t returnfunction =
       boost::bind(&Extractors::gatherDistancesFromFragment,
           boost::bind(&Fragment::getPositions, _1),
           boost::bind(&Fragment::getCharges, _1),
-          boost::cref(charges),
+          charges,
           _2);
   return returnfunction;
Index: src/Potentials/Specifics/PairPotential_Morse.hpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Morse.hpp	(revision 3d255915b7f2233d996e6bf9358789e4d408da65)
+++ src/Potentials/Specifics/PairPotential_Morse.hpp	(revision da2d5c9d76dfbd881fcf84f38ad0fc0c9d8347a8)
@@ -155,8 +155,7 @@
    * from a Fragment.
    *
-   * \param charges vector of charges to be extracted
    * \return bound function extracting distances from a fragment
    */
-  FunctionModel::extractor_t getFragmentSpecificExtractor(const charges_t &charges) const;
+  FunctionModel::extractor_t getFragmentSpecificExtractor() const;
 
   enum parameter_enum_t {
Index: src/Potentials/Specifics/SaturationPotential.cpp
===================================================================
--- src/Potentials/Specifics/SaturationPotential.cpp	(revision 3d255915b7f2233d996e6bf9358789e4d408da65)
+++ src/Potentials/Specifics/SaturationPotential.cpp	(revision da2d5c9d76dfbd881fcf84f38ad0fc0c9d8347a8)
@@ -41,4 +41,5 @@
 #include <boost/assign.hpp>
 #include <boost/assign/list_of.hpp> // for 'map_list_of()'
+#include <boost/lambda/lambda.hpp>
 #include <iostream>
 #include <string>
@@ -396,9 +397,10 @@
 
 FunctionModel::extractor_t
-SaturationPotential::getFragmentSpecificExtractor(
-    const charges_t &charges) const
-{
-  ASSERT(charges.size() == (size_t)2,
-      "SaturationPotential::getFragmentSpecificExtractor() - requires 2 charges.");
+SaturationPotential::getFragmentSpecificExtractor() const
+{
+  Fragment::charges_t charges;
+  charges.resize(getParticleTypes().size());
+  std::transform(getParticleTypes().begin(), getParticleTypes().end(),
+      charges.begin(), boost::lambda::_1);	  
   FunctionModel::extractor_t returnfunction;
   if (charges[0] == charges[1]) {
@@ -409,5 +411,5 @@
             boost::bind(&Fragment::getPositions, _1),
             boost::bind(&Fragment::getCharges, _1),
-            boost::cref(charges),
+            charges, // is only temporarily created, hence copy
             _2);
   } else {
Index: src/Potentials/Specifics/SaturationPotential.hpp
===================================================================
--- src/Potentials/Specifics/SaturationPotential.hpp	(revision 3d255915b7f2233d996e6bf9358789e4d408da65)
+++ src/Potentials/Specifics/SaturationPotential.hpp	(revision da2d5c9d76dfbd881fcf84f38ad0fc0c9d8347a8)
@@ -181,8 +181,7 @@
    * from a Fragment.
    *
-   * \param charges vector of charges to be extracted
    * \return bound function extracting distances from a fragment
    */
-  FunctionModel::extractor_t getFragmentSpecificExtractor(const charges_t &charges) const;
+  FunctionModel::extractor_t getFragmentSpecificExtractor() const;
 
   enum parameter_enum_t {
