Index: src/Fragmentation/Summation/Containers/FragmentationChargeDensity.cpp
===================================================================
--- src/Fragmentation/Summation/Containers/FragmentationChargeDensity.cpp	(revision da098d2d6175a98975caab22794474fb0971984f)
+++ src/Fragmentation/Summation/Containers/FragmentationChargeDensity.cpp	(revision 409a05f195306cbfa711519bd016407cdb0fcaa5)
@@ -81,6 +81,8 @@
 
   /// convert all MPQCData to MPQCDataMap_t
-  OrthogonalSumUpPerLevel<MPQCDataGridMap_t, MPQCData, MPQCDataGridVector_t>(
-      fragmentData, MatrixNrLookup, container, subsetmap,
+  OrthogonalSumUpPerLevel<MPQCDataGridMap_t, MPQCData, MPQCDataGridVector_t> gridsummation(
+      fragmentData);
+  // and sum up
+  gridsummation(MatrixNrLookup, container, subsetmap,
       Result_Grid_fused, Result_perIndexSet_Grid);
 }
Index: src/Fragmentation/Summation/Containers/FragmentationLongRangeResults.cpp
===================================================================
--- src/Fragmentation/Summation/Containers/FragmentationLongRangeResults.cpp	(revision da098d2d6175a98975caab22794474fb0971984f)
+++ src/Fragmentation/Summation/Containers/FragmentationLongRangeResults.cpp	(revision 409a05f195306cbfa711519bd016407cdb0fcaa5)
@@ -113,7 +113,8 @@
         "FragmentationLongRangeResults::FragmentationLongRangeResults() - ForceKeySet's KeySets and fragmentData differ in size.");
 
-    OrthogonalSumUpPerLevel<MPQCDataGridMap_t, MPQCData, MPQCDataGridVector_t>(
-        fragmentData, MPQCMatrixNrLookup, container, subsetmap,
-        Result_Grid_fused, Result_perIndexSet_Grid);
+    OrthogonalSumUpPerLevel<MPQCDataGridMap_t, MPQCData, MPQCDataGridVector_t>
+        chargesummation(fragmentData);
+    chargesummation(MPQCMatrixNrLookup, container, subsetmap, Result_Grid_fused, 
+        Result_perIndexSet_Grid);
 
     // multiply each short-range potential with the respective charge
@@ -124,6 +125,7 @@
     }
     // then sum up
-    OrthogonalSumUpPerLevel<VMGDataMap_t, VMGData, VMGDataVector_t>(
-        longrangeData, VMGMatrixNrLookup, container, subsetmap,
+    OrthogonalSumUpPerLevel<VMGDataMap_t, VMGData, VMGDataVector_t> vmgsummation(
+        longrangeData);
+    vmgsummation(VMGMatrixNrLookup, container, subsetmap,
         Result_LongRange_fused, Result_perIndexSet_LongRange);
 
@@ -163,6 +165,7 @@
 
     // then sum up
-    OrthogonalSumUpPerLevel<VMGDataGridMap_t, VMGData, VMGDataGridVector_t>(
-        longrangeData, VMGMatrixNrLookup, container, subsetmap,
+    OrthogonalSumUpPerLevel<VMGDataGridMap_t, VMGData, VMGDataGridVector_t> vmggridsummation(
+        longrangeData);
+    vmggridsummation(VMGMatrixNrLookup, container, subsetmap,
         Result_GridLongRange_fused, Result_perIndexSet_LongRange_Grid);
 
Index: src/Fragmentation/Summation/Containers/FragmentationShortRangeResults.cpp
===================================================================
--- src/Fragmentation/Summation/Containers/FragmentationShortRangeResults.cpp	(revision da098d2d6175a98975caab22794474fb0971984f)
+++ src/Fragmentation/Summation/Containers/FragmentationShortRangeResults.cpp	(revision 409a05f195306cbfa711519bd016407cdb0fcaa5)
@@ -97,12 +97,15 @@
         "FragmentationShortRangeResults::FragmentationShortRangeResults() - ForceKeySet's KeySets and fragmentData differ in size.");
 
-    OrthogonalSumUpPerLevel<MPQCDataEnergyMap_t, MPQCData, MPQCDataEnergyVector_t>(
-        fragmentData, MPQCMatrixNrLookup, container, subsetmap,
+    OrthogonalSumUpPerLevel<MPQCDataEnergyMap_t, MPQCData, MPQCDataEnergyVector_t> mpqcenergysummation(
+        fragmentData);
+    mpqcenergysummation(MPQCMatrixNrLookup, container, subsetmap,
         Result_Energy_fused, Result_perIndexSet_Energy);
-    OrthogonalSumUpPerLevel<MPQCDataFragmentMap_t, MPQCData, MPQCDataFragmentVector_t>(
-        fragmentData, MPQCMatrixNrLookup, container, subsetmap,
+    OrthogonalSumUpPerLevel<MPQCDataFragmentMap_t, MPQCData, MPQCDataFragmentVector_t> mpqcfragmentsummation(
+        fragmentData);
+    mpqcfragmentsummation(MPQCMatrixNrLookup, container, subsetmap,
         Result_Fragment_fused, Result_perIndexSet_Fragment);
-    SumUpPerLevel<MPQCDataTimeMap_t, MPQCData, MPQCDataTimeVector_t>(
-        fragmentData, MPQCMatrixNrLookup, container, subsetmap,
+    SumUpPerLevel<MPQCDataTimeMap_t, MPQCData, MPQCDataTimeVector_t> mpqctimesummation(
+        fragmentData);
+    mpqctimesummation(MPQCMatrixNrLookup, container, subsetmap,
         Result_Time_fused, Result_perIndexSet_Time);
 
Index: src/Fragmentation/Summation/OrthogonalSumUpPerLevel.hpp
===================================================================
--- src/Fragmentation/Summation/OrthogonalSumUpPerLevel.hpp	(revision da098d2d6175a98975caab22794474fb0971984f)
+++ src/Fragmentation/Summation/OrthogonalSumUpPerLevel.hpp	(revision 409a05f195306cbfa711519bd016407cdb0fcaa5)
@@ -30,35 +30,74 @@
 
 template <typename TypeMap, typename TypeData, typename TypeVector>
-void OrthogonalSumUpPerLevel(
-    const std::map<JobId_t, TypeData> &fragmentData,
-    const std::map< JobId_t, size_t > &MatrixNrLookup,
-    const IndexSetContainer::ptr &container,
-    SubsetMap::ptr &subsetmap,
-    std::vector<TypeMap> &levelresults,
-    std::map<IndexSet::ptr, std::pair<TypeMap, TypeMap> > &keysetresults
-    )
+struct OrthogonalSumUpPerLevel
 {
-  // place data into boost::fusion::map instance
+  /** Constructor of class OrthogonalSumUpPerLevel.
+   *
+   * This prepares all the data by converting them into boost::fusion::map
+   * format and also initializes the default zero instances used as base
+   * in the summation.
+   *
+   * \param _fragmentData data to sum up per job
+   */
+  OrthogonalSumUpPerLevel(const std::map<JobId_t, TypeData> &_fragmentData)
+  {
+    // place data into boost::fusion::map instance
+    convertDataTo<TypeData, TypeMap>(_fragmentData, Data_fused);
+
+    // initialize zero instance map
+    ZeroInstanceInitializer<TypeMap> initZeroInstance(ZeroInstances);
+    boost::mpl::for_each<TypeVector>(boost::ref(initZeroInstance));
+  }
+
+  /** Setter for a specific zero value for the given \a MapValue type.
+   *
+   * \param _zeroinstance zero instance to set for type \a MapValue
+   */
+  template <typename MapKey>
+  void setZeroInstance(
+      const typename boost::fusion::result_of::value_at_key<TypeMap, MapKey>::type &_zeroinstance)
+  {
+    boost::fusion::at_key<MapKey>(ZeroInstances) = _zeroinstance;
+  }
+
+  /** Perform the actual orthogonal summation for each type in \a TypeMap,
+   * given by \a TypeVector.
+   *
+   * i.e. we boost::fusion::for_each over each type in \a TypeVector and perform
+   * an AllLevelSummator on the type.
+   *
+   * \param MatrixNrLookup lookup from job number to a consecutive index in a vector, starting at 0
+   * \param container container of all indexsets
+   * \param subsetmap map with all subsets for each indexset
+   * \param levelresults after summation contains results for each level
+   * \param keysetresults after summation contains results for each keyset
+   */
+  void operator()(
+      const std::map< JobId_t, size_t > &MatrixNrLookup,
+      const IndexSetContainer::ptr &container,
+      SubsetMap::ptr &subsetmap,
+      std::vector<TypeMap> &levelresults,
+      std::map<IndexSet::ptr, std::pair<TypeMap, TypeMap> > &keysetresults
+      )
+  {
+    // instantiate summator
+    levelresults.resize(subsetmap->getMaximumSetLevel());
+    AllLevelOrthogonalSummator<TypeMap> Summer(
+                subsetmap,
+                Data_fused,
+                container->getContainer(),
+                MatrixNrLookup,
+                levelresults,
+                keysetresults,
+                ZeroInstances);
+    // sum up for each type key in TypeVector
+    boost::mpl::for_each<TypeVector>(boost::ref(Summer));
+  }
+
+  //!> map with all jobs placed into boost::fusion::maps
   std::map<JobId_t, TypeMap> Data_fused;
-  convertDataTo<TypeData, TypeMap>(fragmentData, Data_fused);
-
-  // initialize zero instance map
+  //!> zero instances to use in summation
   TypeMap ZeroInstances;
-  ZeroInstanceInitializer<TypeMap> initZeroInstance(ZeroInstances);
-  boost::mpl::for_each<TypeVector>(boost::ref(initZeroInstance));
-
-  // instantiate summator
-  levelresults.resize(subsetmap->getMaximumSetLevel());
-  AllLevelOrthogonalSummator<TypeMap> Summer(
-              subsetmap,
-              Data_fused,
-              container->getContainer(),
-              MatrixNrLookup,
-              levelresults,
-              keysetresults,
-              ZeroInstances);
-  // sum up for each type key in TypeVector
-  boost::mpl::for_each<TypeVector>(boost::ref(Summer));
-}
+};
 
 
Index: src/Fragmentation/Summation/SumUpPerLevel.hpp
===================================================================
--- src/Fragmentation/Summation/SumUpPerLevel.hpp	(revision da098d2d6175a98975caab22794474fb0971984f)
+++ src/Fragmentation/Summation/SumUpPerLevel.hpp	(revision 409a05f195306cbfa711519bd016407cdb0fcaa5)
@@ -28,36 +28,66 @@
 
 template <typename TypeMap, typename TypeData, typename TypeVector>
-void SumUpPerLevel(
-    const std::map<JobId_t, TypeData> &fragmentData,
-    const std::map< JobId_t, size_t > &MatrixNrLookup,
-    const IndexSetContainer::ptr &container,
-    SubsetMap::ptr &subsetmap,
-    std::vector<TypeMap> &levelresults,
-    std::map<IndexSet::ptr, std::pair<TypeMap, TypeMap> > &keysetresults
-    )
+struct SumUpPerLevel
 {
-  // place data into boost::fusion::map instance
+  SumUpPerLevel(const std::map<JobId_t, TypeData> &fragmentData)
+  {
+    // place data into boost::fusion::map instance
+    convertDataTo<TypeData, TypeMap>(fragmentData, Data_fused);
+
+    // initialize zero instance map
+    ZeroInstanceInitializer<TypeMap> initZeroInstance(ZeroInstances);
+    boost::mpl::for_each<TypeVector>(boost::ref(initZeroInstance));
+  }
+
+  /** Setter for a specific zero value for the given \a MapValue type.
+   *
+   * \param _zeroinstance zero instance to set for type \a MapValue
+   */
+  template <typename MapKey>
+  void setZeroInstance(
+      const typename boost::fusion::result_of::value_at_key<TypeMap, MapKey>::type &_zeroinstance)
+  {
+    boost::fusion::at_key<MapKey>(ZeroInstances) = _zeroinstance;
+  }
+
+  /** Perform the actual summation for each type in \a TypeMap, given by
+   * \a TypeVector.
+   *
+   * i.e. we boost::fusion::for_each over each type in \a TypeVector and perform
+   * an AllLevelSummator on the type.
+   *
+   * \param MatrixNrLookup lookup from job number to a consecutive index in a vector, starting at 0
+   * \param container container of all indexsets
+   * \param subsetmap map with all subsets for each indexset
+   * \param levelresults after summation contains results for each level
+   * \param keysetresults after summation contains results for each keyset
+   */
+  void operator()(
+      const std::map< JobId_t, size_t > &MatrixNrLookup,
+      const IndexSetContainer::ptr &container,
+      SubsetMap::ptr &subsetmap,
+      std::vector<TypeMap> &levelresults,
+      std::map<IndexSet::ptr, std::pair<TypeMap, TypeMap> > &keysetresults
+      )
+  {
+    // instantiate summator
+    levelresults.resize(subsetmap->getMaximumSetLevel());
+    AllLevelSummator<TypeMap> Summer(
+                subsetmap,
+                Data_fused,
+                container->getContainer(),
+                MatrixNrLookup,
+                levelresults,
+                keysetresults,
+                ZeroInstances);
+    // sum up for each type key in TypeVector
+    boost::mpl::for_each<TypeVector>(boost::ref(Summer));
+  }
+
+  //!> map with all jobs placed into boost::fusion::maps
   std::map<JobId_t, TypeMap> Data_fused;
-  convertDataTo<TypeData, TypeMap>(fragmentData, Data_fused);
-
-  // initialize zero instance map
+  //!> zero instances to use in summation
   TypeMap ZeroInstances;
-  ZeroInstanceInitializer<TypeMap> initZeroInstance(ZeroInstances);
-  boost::mpl::for_each<TypeVector>(boost::ref(initZeroInstance));
-
-  // instantiate summator
-  levelresults.resize(subsetmap->getMaximumSetLevel());
-  AllLevelSummator<TypeMap> Summer(
-              subsetmap,
-              Data_fused,
-              container->getContainer(),
-              MatrixNrLookup,
-              levelresults,
-              keysetresults,
-              ZeroInstances);
-  // sum up for each type key in TypeVector
-  boost::mpl::for_each<TypeVector>(boost::ref(Summer));
-}
-
+};
 
 #endif /* SUMUPPERLEVEL_HPP_ */
