Index: src/Potentials/CompoundPotential.cpp
===================================================================
--- src/Potentials/CompoundPotential.cpp	(revision cf490596aa095354fadee6f22fe748155d8907b7)
+++ src/Potentials/CompoundPotential.cpp	(revision 7e5b948dfcdf3cb9788af021b64481bb1fd5d746)
@@ -76,6 +76,6 @@
     Extractors::elementcounts_t counts_per_charge =
         Extractors::_detail::getElementCounts(charges);
-    ASSERT( !counts_per_charge.empty(),
-        "getFirstGraphwithSpecifiedElements() - charge counts are empty?");
+//    ASSERT( !counts_per_charge.empty(),
+//        "getFirstGraphwithSpecifiedElements() - charge counts are empty?");
     LOG(2, "DEBUG: counts_per_charge is " << counts_per_charge << ".");
 
@@ -120,7 +120,9 @@
       if (dim < model_dim) {
         std::copy(iter, iter+dim, std::back_inserter(subparams));
+        iter += dim;
         dim = 0;
       } else {
         std::copy(iter, iter+model_dim, std::back_inserter(subparams));
+        iter += model_dim;
         dim -= model_dim;
       }
@@ -166,11 +168,39 @@
 }
 
+std::vector<CompoundPotential::arguments_t> CompoundPotential::splitUpArgumentsByModels(
+    const arguments_t &arguments) const
+{
+  std::vector<arguments_t> partial_args(models.size());
+  std::vector<arguments_t>::iterator partialiter = partial_args.begin();
+  arguments_t::const_iterator argiter = arguments.begin();
+  BOOST_FOREACH( const SerializablePotential::ParticleTypes_t &types, particletypes_per_model) {
+    // we always expect N(N-1)/2 distances for N particle types
+    arguments_t::const_iterator enditer = argiter+(types.size()*(types.size()-1)/2);
+    ASSERT( argiter != arguments.end(),
+        "CompoundPotential::splitUpArgumentsByModels() - incorrect number of arguments.");
+    std::copy(argiter, enditer, std::back_inserter(*partialiter++));
+    argiter = enditer;
+  }
+  ASSERT( argiter == arguments.end(),
+      "CompoundPotential::splitUpArgumentsByModels() - incorrect number of arguments.");
+  return partial_args;
+}
+
 CompoundPotential::results_t CompoundPotential::operator()(const arguments_t &arguments) const
 {
+  // first, we have to split up the given arguments
+  std::vector<arguments_t> partial_args =
+      splitUpArgumentsByModels(arguments);
+  // then, with each bunch of arguments, we call the specific model
   results_t results(1,0.);
   std::vector<results_t> partial_results(models.size());
-  std::transform(models.begin(), models.end(), partial_results.begin(),
-          boost::bind(&FunctionModel::operator(), _1, boost::cref(arguments))
+  std::transform(
+      models.begin(), models.end(),
+      partial_args.begin(),
+      partial_results.begin(),
+      boost::bind(&FunctionModel::operator(), _1, _2)
   );
+  std::for_each(partial_results.begin(), partial_results.end(),
+      std::cout << (boost::lambda::_1)[0] << "\t");
   std::for_each(partial_results.begin(), partial_results.end(),
       results[0] += (boost::lambda::_1)[0]);
@@ -180,4 +210,8 @@
 CompoundPotential::results_t CompoundPotential::parameter_derivative(const arguments_t &arguments, const size_t index) const
 {
+  // first, we have to split up the given arguments
+  std::vector<arguments_t> partial_args =
+      splitUpArgumentsByModels(arguments);
+  // then, with each bunch of arguments, we call the specific model
   // get parameter dimensions per model
   std::vector<size_t> dimensions(models.size(), 0);
@@ -191,8 +225,11 @@
   std::vector<size_t>::const_iterator iter =
       std::lower_bound(dimensions.begin(), dimensions.end(), index);
+
+  // step forward to same model
   models_t::const_iterator modeliter = models.begin();
-
-  // step forward to same model
   std::advance(modeliter,
+      std::distance(const_cast<const std::vector<size_t> &>(dimensions).begin(), iter) );
+  std::vector<arguments_t>::const_iterator argiter = partial_args.begin();
+  std::advance(argiter,
       std::distance(const_cast<const std::vector<size_t> &>(dimensions).begin(), iter) );
 
@@ -200,5 +237,5 @@
   const size_t indexbase = (iter == dimensions.begin()) ? 0 : *(--iter);
   CompoundPotential::results_t results =
-      (*modeliter)->parameter_derivative(arguments, index-indexbase);
+      (*modeliter)->parameter_derivative(*argiter, index-indexbase);
   return results;
 }
@@ -268,5 +305,5 @@
 
     returnfunction =
-          boost::bind(&Extractors::combineArguments,
+          boost::bind(&Extractors::concatenateArguments,
               boost::bind(returnfunction, _1, _2),
               boost::bind(&Extractors::gatherAllDistancesFromFragment,
Index: src/Potentials/CompoundPotential.hpp
===================================================================
--- src/Potentials/CompoundPotential.hpp	(revision cf490596aa095354fadee6f22fe748155d8907b7)
+++ src/Potentials/CompoundPotential.hpp	(revision 7e5b948dfcdf3cb9788af021b64481bb1fd5d746)
@@ -132,4 +132,12 @@
 
 private:
+  /** Helper function to split up concatenated arguments for operator() calls.
+   *
+   * \param arguments arguments to split up
+   * \return vector of partial arguments
+   */
+  std::vector<arguments_t> splitUpArgumentsByModels(const arguments_t &arguments) const;
+
+private:
   //!> typedef for internal vector of simultaneously fitted models.
   typedef std::vector<FunctionModel*> models_t;
Index: src/Potentials/Specifics/PairPotential_Morse.cpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Morse.cpp	(revision cf490596aa095354fadee6f22fe748155d8907b7)
+++ src/Potentials/Specifics/PairPotential_Morse.cpp	(revision 7e5b948dfcdf3cb9788af021b64481bb1fd5d746)
@@ -75,5 +75,5 @@
   params[equilibrium_distance] = 1.;
   params[dissociation_energy] = 0.1;
-  params[energy_offset] = 0.1;
+  params[energy_offset] = 0.;
 }
 
Index: src/Potentials/unittests/CompoundPotentialUnitTest.cpp
===================================================================
--- src/Potentials/unittests/CompoundPotentialUnitTest.cpp	(revision cf490596aa095354fadee6f22fe748155d8907b7)
+++ src/Potentials/unittests/CompoundPotentialUnitTest.cpp	(revision 7e5b948dfcdf3cb9788af021b64481bb1fd5d746)
@@ -50,4 +50,5 @@
 #include "Potentials/PotentialFactory.hpp"
 #include "Potentials/PotentialRegistry.hpp"
+#include "Potentials/Specifics/ConstantPotential.hpp"
 #include "Potentials/Specifics/PairPotential_Morse.hpp"
 
@@ -80,4 +81,13 @@
     PotentialRegistry::getInstance().registerInstance(morse);
     morse = NULL;
+  }
+  // register ConstantPotential with registry
+  {
+    ConstantPotential::ParticleTypes_t types;
+    EmpiricalPotential *constant =
+        PotentialFactory::getInstance().createInstance(
+            std::string("constant"), types);
+    PotentialRegistry::getInstance().registerInstance(constant);
+    constant = NULL;
   }
 
@@ -144,12 +154,13 @@
   CompoundPotential compound(*graph);
   CompoundPotential::parameters_t params;
-  params += a,c,D,d;
+  params += d,a,c,D;
   compound.setParameters(params);
   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]);
+    const double result = compound( FunctionModel::arguments_t(1,arg) )[0];
     CPPUNIT_ASSERT(
         Helpers::isEqual(
             output[index],
-            compound( FunctionModel::arguments_t(1,arg) )[0],
+            result,
             1.e-4/std::numeric_limits<double>::epsilon() // only compare four digits
         )
@@ -164,13 +175,12 @@
 //  CompoundPotential compound(*graph);
 //  CompoundPotential::parameters_t params;
-//  params += a,c,D,d;
+//  params += d,a,c,D;
 //  compound.setParameters(params);
 //  argument_t arg(argument_t::indices_t(0,1), argument_t::types_t(0,1), c);
+//  const double result = compound.derivative(FunctionModel::arguments_t(1,arg))[0]
 //  CPPUNIT_ASSERT(
 //      Helpers::isEqual(
 //          0.,
-//          compound.derivative(
-//              FunctionModel::arguments_t(1,arg)
-//          )[0],
+//          result,
 //          1.e+6
 //      )
@@ -185,46 +195,58 @@
   CompoundPotential compound(*graph);
   CompoundPotential::parameters_t params;
-  params += a,c,D,d;
+  params += d,a,c,D;
   compound.setParameters(params);
   argument_t arg(argument_t::indices_t(0,1), argument_t::types_t(0,1), c);
-  CPPUNIT_ASSERT(
-      Helpers::isEqual(
-          0.,
-          compound.parameter_derivative(
-              FunctionModel::arguments_t(1,arg),
-              0
-          )[0],
-          1.e+6
-      )
-  );
-  CPPUNIT_ASSERT(
-      Helpers::isEqual(
-          0.,
-          compound.parameter_derivative(
-              FunctionModel::arguments_t(1,arg),
-              1
-          )[0],
-          1.e+6
-      )
-  );
-  CPPUNIT_ASSERT(
-      Helpers::isEqual(
-          0.,
-          compound.parameter_derivative(
-              FunctionModel::arguments_t(1,arg),
-              2
-          )[0],
-          1.e+6
-      )
-  );
-  CPPUNIT_ASSERT(
-      Helpers::isEqual(
-          1.,
-          compound.parameter_derivative(
-              FunctionModel::arguments_t(1,arg),
-              3
-          )[0],
-          1.e+6
-      )
-  );
-}
+  {
+    const double result =
+        compound.parameter_derivative(
+            FunctionModel::arguments_t(1,arg),
+            0)[0];
+    CPPUNIT_ASSERT(
+        Helpers::isEqual(
+            1.,
+            result,
+            1.e+6
+        )
+    );
+  }
+  {
+    const double result =
+        compound.parameter_derivative(
+            FunctionModel::arguments_t(1,arg),
+            1)[0];
+    CPPUNIT_ASSERT(
+        Helpers::isEqual(
+            0.,
+            result,
+            1.e+6
+        )
+    );
+  }
+  {
+    const double result =
+        compound.parameter_derivative(
+            FunctionModel::arguments_t(1,arg),
+            2)[0];
+    CPPUNIT_ASSERT(
+        Helpers::isEqual(
+            0.,
+            result,
+            1.e+6
+        )
+    );
+  }
+  {
+    const double result =
+        compound.parameter_derivative(
+            FunctionModel::arguments_t(1,arg),
+            3)[0];
+    CPPUNIT_ASSERT(
+        Helpers::isEqual(
+            0.,
+            result,
+            1.e+6
+        )
+    );
+  }
+}
