Index: src/Potentials/Specifics/ManyBodyPotential_Tersoff.cpp
===================================================================
--- src/Potentials/Specifics/ManyBodyPotential_Tersoff.cpp	(revision b3eabc5ab97979bd66a5016b2618193a6479b544)
+++ src/Potentials/Specifics/ManyBodyPotential_Tersoff.cpp	(revision 55fe7880f56f0159a3633b579bba428b3d3c3b82)
@@ -165,4 +165,11 @@
       ++argiter) {
     const argument_t &r_ij = *argiter;
+    ASSERT( arguments[0].types.first == getParticleTypes()[0],
+        "ManyBodyPotential_Tersoff::operator() - first charge "
+        +toString(arguments[0].types.first)+" is not "+toString(getParticleTypes()[0]));
+    ASSERT( arguments[0].types.second == getParticleTypes()[1],
+        "ManyBodyPotential_Tersoff::operator() - second charge "
+        +toString(arguments[0].types.second)+" is not "+toString(getParticleTypes()[1]));
+
     const double cutoff = function_cutoff(r_ij.distance);
     const double temp = (cutoff == 0.) ?
@@ -217,4 +224,11 @@
       ++argiter) {
     const argument_t &r_ij = *argiter;
+    ASSERT( arguments[0].types.first == getParticleTypes()[0],
+        "ManyBodyPotential_Tersoff::operator() - first charge "
+        +toString(arguments[0].types.first)+" is not "+toString(getParticleTypes()[0]));
+    ASSERT( arguments[0].types.second == getParticleTypes()[1],
+        "ManyBodyPotential_Tersoff::operator() - second charge "
+        +toString(arguments[0].types.second)+" is not "+toString(getParticleTypes()[1]));
+
   switch (index) {
 //    case R:
Index: src/Potentials/Specifics/PairPotential_Angle.cpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Angle.cpp	(revision b3eabc5ab97979bd66a5016b2618193a6479b544)
+++ src/Potentials/Specifics/PairPotential_Angle.cpp	(revision 55fe7880f56f0159a3633b579bba428b3d3c3b82)
@@ -119,4 +119,22 @@
   ASSERT( arguments.size() == 3,
       "PairPotential_Angle::operator() - requires exactly three arguments.");
+  ASSERT( arguments[0].types.first == getParticleTypes()[0],
+      "PairPotential_Angle::operator() - first charge of first distance "
+      +toString(arguments[0].types.first)+" is not "+toString(getParticleTypes()[0]));
+  ASSERT( arguments[0].types.second == getParticleTypes()[1],
+      "PairPotential_Angle::operator() - second charge of first distance "
+      +toString(arguments[0].types.second)+" is not "+toString(getParticleTypes()[1]));
+  ASSERT( arguments[1].types.first == getParticleTypes()[0],
+      "PairPotential_Angle::operator() - first charge of second distance "
+      +toString(arguments[1].types.first)+" is not "+toString(getParticleTypes()[0]));
+  ASSERT( arguments[1].types.second == getParticleTypes()[2],
+      "PairPotential_Angle::operator() - second charge of second distance "
+      +toString(arguments[1].types.second)+" is not "+toString(getParticleTypes()[2]));
+  ASSERT( arguments[2].types.first == getParticleTypes()[1],
+      "PairPotential_Angle::operator() - first charge of third distance "
+      +toString(arguments[2].types.first)+" is not "+toString(getParticleTypes()[1]));
+  ASSERT( arguments[2].types.second == getParticleTypes()[2],
+      "PairPotential_Angle::operator() - second charge of third distance "
+      +toString(arguments[2].types.second)+" is not "+toString(getParticleTypes()[2]));
   const argument_t &r_ij = arguments[0];
   const argument_t &r_ik = arguments[1];
@@ -136,4 +154,22 @@
   ASSERT( arguments.size() == 3,
       "PairPotential_Angle::operator() - requires exactly three arguments.");
+  ASSERT( arguments[0].types.first == getParticleTypes()[0],
+      "PairPotential_Angle::derivative() - first charge of first distance "
+      +toString(arguments[0].types.first)+" is not "+toString(getParticleTypes()[0]));
+  ASSERT( arguments[0].types.second == getParticleTypes()[1],
+      "PairPotential_Angle::derivative() - second charge of first distance "
+      +toString(arguments[0].types.second)+" is not "+toString(getParticleTypes()[1]));
+  ASSERT( arguments[1].types.first == getParticleTypes()[0],
+      "PairPotential_Angle::derivative() - first charge of second distance "
+      +toString(arguments[1].types.first)+" is not "+toString(getParticleTypes()[0]));
+  ASSERT( arguments[1].types.second == getParticleTypes()[2],
+      "PairPotential_Angle::derivative() - second charge of second distance "
+      +toString(arguments[1].types.second)+" is not "+toString(getParticleTypes()[2]));
+  ASSERT( arguments[2].types.first == getParticleTypes()[1],
+      "PairPotential_Angle::derivative() - first charge of third distance "
+      +toString(arguments[2].types.first)+" is not "+toString(getParticleTypes()[1]));
+  ASSERT( arguments[2].types.second == getParticleTypes()[2],
+      "PairPotential_Angle::derivative() - second charge of third distance "
+      +toString(arguments[2].types.second)+" is not "+toString(getParticleTypes()[2]));
   derivative_components_t result;
   const argument_t &r_ij = arguments[0];
@@ -154,4 +190,22 @@
   ASSERT( arguments.size() == 3,
       "PairPotential_Angle::parameter_derivative() - requires exactly three arguments.");
+  ASSERT( arguments[0].types.first == getParticleTypes()[0],
+      "PairPotential_Angle::parameter_derivative() - first charge of first distance "
+      +toString(arguments[0].types.first)+" is not "+toString(getParticleTypes()[0]));
+  ASSERT( arguments[0].types.second == getParticleTypes()[1],
+      "PairPotential_Angle::parameter_derivative() - second charge of first distance "
+      +toString(arguments[0].types.second)+" is not "+toString(getParticleTypes()[1]));
+  ASSERT( arguments[1].types.first == getParticleTypes()[0],
+      "PairPotential_Angle::parameter_derivative() - first charge of second distance "
+      +toString(arguments[1].types.first)+" is not "+toString(getParticleTypes()[0]));
+  ASSERT( arguments[1].types.second == getParticleTypes()[2],
+      "PairPotential_Angle::parameter_derivative() - second charge of second distance "
+      +toString(arguments[1].types.second)+" is not "+toString(getParticleTypes()[2]));
+  ASSERT( arguments[2].types.first == getParticleTypes()[1],
+      "PairPotential_Angle::parameter_derivative() - first charge of third distance "
+      +toString(arguments[2].types.first)+" is not "+toString(getParticleTypes()[1]));
+  ASSERT( arguments[2].types.second == getParticleTypes()[2],
+      "PairPotential_Angle::parameter_derivative() - second charge of third distance "
+      +toString(arguments[2].types.second)+" is not "+toString(getParticleTypes()[2]));
   const argument_t &r_ij = arguments[0];
   const argument_t &r_ik = arguments[1];
Index: src/Potentials/Specifics/PairPotential_Harmonic.cpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Harmonic.cpp	(revision b3eabc5ab97979bd66a5016b2618193a6479b544)
+++ src/Potentials/Specifics/PairPotential_Harmonic.cpp	(revision 55fe7880f56f0159a3633b579bba428b3d3c3b82)
@@ -100,4 +100,10 @@
   ASSERT( arguments.size() == 1,
       "PairPotential_Harmonic::operator() - requires exactly one argument.");
+  ASSERT( arguments[0].types.first == getParticleTypes()[0],
+      "PairPotential_Harmonic::operator() - first charge "
+      +toString(arguments[0].types.first)+" is not "+toString(getParticleTypes()[0]));
+  ASSERT( arguments[0].types.second == getParticleTypes()[1],
+      "PairPotential_Harmonic::operator() - second charge "
+      +toString(arguments[0].types.second)+" is not "+toString(getParticleTypes()[1]));
   const argument_t &r_ij = arguments[0];
   const result_t result =
@@ -115,4 +121,10 @@
   ASSERT( arguments.size() == 1,
       "PairPotential_Harmonic::operator() - requires exactly one argument.");
+  ASSERT( arguments[0].types.first == getParticleTypes()[0],
+      "PairPotential_Harmonic::derivative() - first charge "
+      +toString(arguments[0].types.first)+" is not "+toString(getParticleTypes()[0]));
+  ASSERT( arguments[0].types.second == getParticleTypes()[1],
+      "PairPotential_Harmonic::derivative() - second charge "
+      +toString(arguments[0].types.second)+" is not "+toString(getParticleTypes()[1]));
   derivative_components_t result;
   const argument_t &r_ij = arguments[0];
@@ -131,4 +143,10 @@
   ASSERT( arguments.size() == 1,
       "PairPotential_Harmonic::parameter_derivative() - requires exactly one argument.");
+  ASSERT( arguments[0].types.first == getParticleTypes()[0],
+      "PairPotential_Harmonic::parameter_derivative() - first charge "
+      +toString(arguments[0].types.first)+" is not "+toString(getParticleTypes()[0]));
+  ASSERT( arguments[0].types.second == getParticleTypes()[1],
+      "PairPotential_Harmonic::parameter_derivative() - second charge "
+      +toString(arguments[0].types.second)+" is not "+toString(getParticleTypes()[1]));
   const argument_t &r_ij = arguments[0];
   switch (index) {
Index: src/Potentials/Specifics/PairPotential_Morse.cpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Morse.cpp	(revision b3eabc5ab97979bd66a5016b2618193a6479b544)
+++ src/Potentials/Specifics/PairPotential_Morse.cpp	(revision 55fe7880f56f0159a3633b579bba428b3d3c3b82)
@@ -105,4 +105,10 @@
   ASSERT( arguments.size() == 1,
       "PairPotential_Morse::operator() - requires exactly one argument.");
+  ASSERT( arguments[0].types.first == getParticleTypes()[0],
+      "PairPotential_Morse::operator() - first charge "
+      +toString(arguments[0].types.first)+" is not "+toString(getParticleTypes()[0]));
+  ASSERT( arguments[0].types.second == getParticleTypes()[1],
+      "PairPotential_Morse::operator() - second charge "
+      +toString(arguments[0].types.second)+" is not "+toString(getParticleTypes()[1]));
   const argument_t &r_ij = arguments[0];
   // Maple: f(r,D,k,R,c) := D * (1 - exp(-k*(r-R)))^(2)+c
@@ -121,4 +127,10 @@
   ASSERT( arguments.size() == 1,
       "PairPotential_Morse::operator() - requires exactly one argument.");
+  ASSERT( arguments[0].types.first == getParticleTypes()[0],
+      "PairPotential_Morse::derivative() - first charge "
+      +toString(arguments[0].types.first)+" is not "+toString(getParticleTypes()[0]));
+  ASSERT( arguments[0].types.second == getParticleTypes()[1],
+      "PairPotential_Morse::derivative() - second charge "
+      +toString(arguments[0].types.second)+" is not "+toString(getParticleTypes()[1]));
   derivative_components_t result;
   const argument_t &r_ij = arguments[0];
@@ -142,4 +154,10 @@
   ASSERT( arguments.size() == 1,
       "PairPotential_Morse::parameter_derivative() - requires exactly one argument.");
+  ASSERT( arguments[0].types.first == getParticleTypes()[0],
+      "PairPotential_Morse::parameter_derivative() - first charge "
+      +toString(arguments[0].types.first)+" is not "+toString(getParticleTypes()[0]));
+  ASSERT( arguments[0].types.second == getParticleTypes()[1],
+      "PairPotential_Morse::parameter_derivative() - second charge "
+      +toString(arguments[0].types.second)+" is not "+toString(getParticleTypes()[1]));
   const argument_t &r_ij = arguments[0];
   switch (index) {
Index: src/Potentials/Specifics/unittests/ManyBodyPotential_TersoffUnitTest.cpp
===================================================================
--- src/Potentials/Specifics/unittests/ManyBodyPotential_TersoffUnitTest.cpp	(revision b3eabc5ab97979bd66a5016b2618193a6479b544)
+++ src/Potentials/Specifics/unittests/ManyBodyPotential_TersoffUnitTest.cpp	(revision 55fe7880f56f0159a3633b579bba428b3d3c3b82)
@@ -294,4 +294,5 @@
         argument_t arg;
         arg.indices = std::make_pair(i,j);
+        arg.types = std::make_pair(0,1);
         arg.distance = CurrentConfiguration[i].distance(CurrentConfiguration[j]);
         arg.globalid = index; // this is needed for the triplefunction to the configuration
Index: src/Potentials/Specifics/unittests/PairPotential_AngleUnitTest.cpp
===================================================================
--- src/Potentials/Specifics/unittests/PairPotential_AngleUnitTest.cpp	(revision b3eabc5ab97979bd66a5016b2618193a6479b544)
+++ src/Potentials/Specifics/unittests/PairPotential_AngleUnitTest.cpp	(revision 55fe7880f56f0159a3633b579bba428b3d3c3b82)
@@ -71,6 +71,6 @@
   angles += -0.5, -.4, -.3, -.2, -.1, 0., .1, .2, .3, .4, .5;
   FunctionModel::arguments_t tempvector(3);
-  tempvector[0] = argument_t( std::make_pair(0,1), std::make_pair(1,1), 1.);
-  tempvector[1] = argument_t( std::make_pair(0,2), std::make_pair(1,1), 1.);
+  tempvector[0] = argument_t( std::make_pair(0,1), std::make_pair(0,1), 1.);
+  tempvector[1] = argument_t( std::make_pair(0,2), std::make_pair(0,1), 1.);
   tempvector[2] = argument_t( std::make_pair(1,2), std::make_pair(1,1), 0.);
   for (angles_t::const_iterator iter = angles.begin(); iter != angles.end(); ++iter) {
Index: src/Potentials/Specifics/unittests/PairPotential_HarmonicUnitTest.cpp
===================================================================
--- src/Potentials/Specifics/unittests/PairPotential_HarmonicUnitTest.cpp	(revision b3eabc5ab97979bd66a5016b2618193a6479b544)
+++ src/Potentials/Specifics/unittests/PairPotential_HarmonicUnitTest.cpp	(revision 55fe7880f56f0159a3633b579bba428b3d3c3b82)
@@ -97,8 +97,9 @@
   PairPotential_Harmonic harmonic(types, .5,1.,.1);
   for (size_t index = 0; index < input.size(); ++index) {
+    argument_t arg(argument_t::indices_t(0,1), argument_t::types_t(0,1), input[index]);
     CPPUNIT_ASSERT(
         Helpers::isEqual(
             output[index],
-            harmonic( FunctionModel::arguments_t(1,argument_t(input[index])) )[0]
+            harmonic( FunctionModel::arguments_t(1,arg) )[0]
         )
     );
@@ -115,9 +116,10 @@
       ;
   PairPotential_Harmonic harmonic(types, .5,1.,.1);
+  argument_t arg(argument_t::indices_t(0,1), argument_t::types_t(0,1), 1.);
   CPPUNIT_ASSERT(
       Helpers::isEqual(
           0.,
           harmonic.derivative(
-              FunctionModel::arguments_t(1,argument_t(1.))
+              FunctionModel::arguments_t(1,arg)
           )[0]
       )
@@ -135,9 +137,10 @@
       ;
   PairPotential_Harmonic harmonic(types, .5,1.,.1);
+  argument_t arg(argument_t::indices_t(0,1), argument_t::types_t(0,1), 1.);
   CPPUNIT_ASSERT(
       Helpers::isEqual(
           0.,
           harmonic.parameter_derivative(
-              FunctionModel::arguments_t(1,argument_t(1.)),
+              FunctionModel::arguments_t(1,arg),
               0
           )[0]
@@ -148,5 +151,5 @@
           0.,
           harmonic.parameter_derivative(
-              FunctionModel::arguments_t(1,argument_t(1.)),
+              FunctionModel::arguments_t(1,arg),
               1
           )[0]
@@ -157,5 +160,5 @@
           1.,
           harmonic.parameter_derivative(
-              FunctionModel::arguments_t(1,argument_t(1.)),
+              FunctionModel::arguments_t(1,arg),
               2
           )[0]
Index: src/Potentials/Specifics/unittests/PairPotential_MorseUnitTest.cpp
===================================================================
--- src/Potentials/Specifics/unittests/PairPotential_MorseUnitTest.cpp	(revision b3eabc5ab97979bd66a5016b2618193a6479b544)
+++ src/Potentials/Specifics/unittests/PairPotential_MorseUnitTest.cpp	(revision 55fe7880f56f0159a3633b579bba428b3d3c3b82)
@@ -113,8 +113,9 @@
   PairPotential_Morse Morse(types, a,c,D,d);
   for (size_t index = 0; index < input.size(); ++index) {
+    argument_t arg(argument_t::indices_t(0,1), argument_t::types_t(0,1), input[index]);
     CPPUNIT_ASSERT(
         Helpers::isEqual(
             output[index],
-            Morse( FunctionModel::arguments_t(1,argument_t(input[index])) )[0],
+            Morse( FunctionModel::arguments_t(1,arg) )[0],
             1.e-4/std::numeric_limits<double>::epsilon() // only compare four digits
         )
@@ -132,9 +133,10 @@
       ;
   PairPotential_Morse Morse(types, a,c,D,d);
+  argument_t arg(argument_t::indices_t(0,1), argument_t::types_t(0,1), c);
   CPPUNIT_ASSERT(
       Helpers::isEqual(
           0.,
           Morse.derivative(
-              FunctionModel::arguments_t(1,argument_t(c))
+              FunctionModel::arguments_t(1,arg)
           )[0],
           1.e+6
@@ -153,9 +155,10 @@
       ;
   PairPotential_Morse Morse(types, a,c,D,d);
+  argument_t arg(argument_t::indices_t(0,1), argument_t::types_t(0,1), c);
   CPPUNIT_ASSERT(
       Helpers::isEqual(
           0.,
           Morse.parameter_derivative(
-              FunctionModel::arguments_t(1,argument_t(c)),
+              FunctionModel::arguments_t(1,arg),
               0
           )[0],
@@ -167,5 +170,5 @@
           0.,
           Morse.parameter_derivative(
-              FunctionModel::arguments_t(1,argument_t(c)),
+              FunctionModel::arguments_t(1,arg),
               1
           )[0],
@@ -177,5 +180,5 @@
           0.,
           Morse.parameter_derivative(
-              FunctionModel::arguments_t(1,argument_t(c)),
+              FunctionModel::arguments_t(1,arg),
               2
           )[0],
@@ -187,5 +190,5 @@
           1.,
           Morse.parameter_derivative(
-              FunctionModel::arguments_t(1,argument_t(c)),
+              FunctionModel::arguments_t(1,arg),
               3
           )[0],
