Index: src/Fragmentation/Summation/OrthogonalSummator.hpp
===================================================================
--- src/Fragmentation/Summation/OrthogonalSummator.hpp	(revision d199cc8649eee7e4b74fe6a4fc9da9737f7e5c82)
+++ src/Fragmentation/Summation/OrthogonalSummator.hpp	(revision a96b02be2381aa330df86c1a1c114213944e1657)
@@ -73,13 +73,11 @@
       const IndexSetContainer::Container_t &_container,
       std::map< JobId_t, size_t > &_MatrixNrLookup) : /* cannot make this const due to operator[] */
-    subsetmap(_subsetmap),
-    data(_data),
-    jobids(_jobids),
-    container(_container),
-    MatrixNrLookup(_MatrixNrLookup)
+    indices(getSubsets(_container)),
+    values(createValues(_data, _jobids, _container, _MatrixNrLookup)),
+    OS(indices, values, _subsetmap)
   {
-    ASSERT( data.size() == jobids.size(),
+    ASSERT( _data.size() == _jobids.size(),
         "OrthogonalSummator() - data and ids don't have same size.");
-    ASSERT( jobids.size() == MatrixNrLookup.size(),
+    ASSERT( _jobids.size() == _MatrixNrLookup.size(),
         "OrthogonalSummator() - ids and MatrixNrLookup don't have same size.");
   }
@@ -91,7 +89,25 @@
    * the result.
    *
+   * \param level up to which level to sum up
    * \return result of OrthogonalSummation for given type from MPQCDataMap_t.
    */
-  MapValue operator()()
+  MapValue operator()(/* const size_t level */)
+  {
+    // evaluate
+    const MapValue result = OS();
+    return result;
+  }
+
+private:
+  /** Tiny helper to create the indices from a given IndexSetContainer.
+   *
+   * Basically, we just have to make sure we miss the last one but only
+   * if the \a container has more than one set.
+   *
+   * @param container container with IndexSet
+   * @return all subsets contained in \a container
+   */
+  typename OrthogonalSummation<MapValue>::InputSets_t getSubsets(
+      const IndexSetContainer::Container_t &container)
   {
     // if we just have one indexset, we don't need to get rid of the "union index set"
@@ -99,4 +115,22 @@
         container.begin(),
         container.end()-1 == container.begin() ? container.end() : container.end()-1);
+    return indices;
+  }
+
+  /** Tiny helper to create the values for the summation in the correct order.
+   *
+   * @param data
+   * @param jobids
+   * @param container
+   * @param MatrixNrLookup
+   * @return
+   */
+  typename OrthogonalSummation<MapValue>::InputValues_t createValues(
+      const std::vector<MapType> &data,
+      const std::vector<JobId_t> &jobids,
+      const IndexSetContainer::Container_t &container,
+      std::map< JobId_t, size_t > &MatrixNrLookup)
+  {
+    // if we just have one indexset, we don't need to get rid of the "union index set"
     typename OrthogonalSummation<MapValue>::InputValues_t values(
         container.size() == 1 ? (size_t)1 : container.size()-1);
@@ -108,22 +142,13 @@
       values[ MatrixNrLookup[*iditer] ] = value;
     }
-
-    // create the summation functor and evaluate
-    OrthogonalSummation<MapValue> OS(indices, values, subsetmap);
-    const MapValue result = OS();
-    return result;
+    return values;
   }
-
 private:
-  //!> Hierarchy of IndexSet's
-  SubsetMap::ptr &subsetmap;
-  //!> vector of data converted from MPQCData
-  const std::vector<MapType> &data;
-  //!> vector of jobids
-  const std::vector<JobId_t> &jobids;
-  //!> container with all IndexSet's
-  const IndexSetContainer::Container_t &container;
-  //!> lookup map from job ids to ordering in above vectors
-  std::map< JobId_t, size_t > MatrixNrLookup;
+  //!> created indices for OS such that we may hand over refs
+  typename OrthogonalSummation<MapValue>::InputSets_t indices;
+  //!> created values for OS such that we may hand over refs
+  typename OrthogonalSummation<MapValue>::InputValues_t values;
+  //!> Summation instance to use in operator()(level)
+  OrthogonalSummation<MapValue> OS;
 };
 
Index: src/Fragmentation/Summation/Summator.hpp
===================================================================
--- src/Fragmentation/Summation/Summator.hpp	(revision d199cc8649eee7e4b74fe6a4fc9da9737f7e5c82)
+++ src/Fragmentation/Summation/Summator.hpp	(revision a96b02be2381aa330df86c1a1c114213944e1657)
@@ -20,5 +20,5 @@
 #include "Jobs/MPQCDataMap.hpp"
 
-/** Summator is a general class for making us of OrthogonalSummation.
+/** Summator is a general class for making us of Summation.
  *
  * The idea is that we want to sum up not only one value but a whole bunch of.
@@ -32,5 +32,5 @@
  * key. Via this key, which is a type and hence can be used for template
  * specification, we may gather all information for launching the
- * OrthogonalSummation. We only need to convert MPQCData into the above
+ * Summation. We only need to convert MPQCData into the above
  * MPQCDataMap_t instance and may then access the member variables via the above
  * key and also obtain the type at \b run-time through the key.
@@ -73,13 +73,11 @@
       const IndexSetContainer::Container_t &_container,
       std::map< JobId_t, size_t > &_MatrixNrLookup) : /* cannot make this const due to operator[] */
-    subsetmap(_subsetmap),
-    data(_data),
-    jobids(_jobids),
-    container(_container),
-    MatrixNrLookup(_MatrixNrLookup)
+    indices(getSubsets(_container)),
+    values(createValues(_data, _jobids, _container, _MatrixNrLookup)),
+    OS(indices, values, _subsetmap)
   {
-    ASSERT( data.size() == jobids.size(),
+    ASSERT( _data.size() == _jobids.size(),
         "Summator() - data and ids don't have same size.");
-    ASSERT( jobids.size() == MatrixNrLookup.size(),
+    ASSERT( _jobids.size() == _MatrixNrLookup.size(),
         "Summator() - ids and MatrixNrLookup don't have same size.");
   }
@@ -87,11 +85,29 @@
   /** Summation operator.
    *
-   * Initialises instantiated OrthogonalSummation of the respective type via
-   * \a Summator::data, uses OrthogonalSummation::operator() to sum and returns
+   * Initialises instantiated Summation of the respective type via
+   * \a Summator::data, uses Summation::operator() to sum and returns
    * the result.
    *
-   * \return result of OrthogonalSummation for given type from MPQCDataMap_t.
+   * \param level up to which level to sum up
+   * \return result of Summation for given type from MPQCDataMap_t.
    */
-  MapValue operator()()
+  MapValue operator()(/* const size_t level */)
+  {
+    // evaluate
+    const MapValue result = OS();
+    return result;
+  }
+
+private:
+  /** Tiny helper to create the indices from a given IndexSetContainer.
+   *
+   * Basically, we just have to make sure we miss the last one but only
+   * if the \a container has more than one set.
+   *
+   * @param container container with IndexSet
+   * @return all subsets contained in \a container
+   */
+  typename Summation<MapValue>::InputSets_t getSubsets(
+      const IndexSetContainer::Container_t &container)
   {
     // if we just have one indexset, we don't need to get rid of the "union index set"
@@ -99,4 +115,22 @@
         container.begin(),
         container.end()-1 == container.begin() ? container.end() : container.end()-1);
+    return indices;
+  }
+
+  /** Tiny helper to create the values for the summation in the correct order.
+   *
+   * @param data
+   * @param jobids
+   * @param container
+   * @param MatrixNrLookup
+   * @return
+   */
+  typename Summation<MapValue>::InputValues_t createValues(
+      const std::vector<MapType> &data,
+      const std::vector<JobId_t> &jobids,
+      const IndexSetContainer::Container_t &container,
+      std::map< JobId_t, size_t > &MatrixNrLookup)
+  {
+    // if we just have one indexset, we don't need to get rid of the "union index set"
     typename Summation<MapValue>::InputValues_t values(
         container.size() == 1 ? (size_t)1 : container.size()-1);
@@ -108,22 +142,13 @@
       values[ MatrixNrLookup[*iditer] ] = value;
     }
-
-    // create the summation functor and evaluate
-    Summation<MapValue> OS(indices, values, subsetmap);
-    const MapValue result = OS();
-    return result;
+    return values;
   }
-
 private:
-  //!> Hierarchy of IndexSet's
-  SubsetMap::ptr &subsetmap;
-  //!> vector of data converted from MPQCData
-  const std::vector<MapType> &data;
-  //!> vector of jobids
-  const std::vector<JobId_t> &jobids;
-  //!> container with all IndexSet's
-  const IndexSetContainer::Container_t &container;
-  //!> lookup map from job ids to ordering in above vectors
-  std::map< JobId_t, size_t > MatrixNrLookup;
+  //!> created indices for OS such that we may hand over refs
+  typename Summation<MapValue>::InputSets_t indices;
+  //!> created values for OS such that we may hand over refs
+  typename Summation<MapValue>::InputValues_t values;
+  //!> Summation instance to use in operator()(level)
+  Summation<MapValue> OS;
 };
 
