Index: src/Actions/FragmentationAction/FragmentationAutomationAction.cpp
===================================================================
--- src/Actions/FragmentationAction/FragmentationAutomationAction.cpp	(revision 3023451f9bb244c1ffafbac7f100be34a2430f1f)
+++ src/Actions/FragmentationAction/FragmentationAutomationAction.cpp	(revision 0398bd3f86573bb724b71c8e05ebaeadda50c7c7)
@@ -59,6 +59,6 @@
 #include "Fragmentation/KeySet.hpp"
 #include "Fragmentation/KeySetsContainer.hpp"
-#include "Fragmentation/Summation/AllLevelOrthogonalSummator.hpp"
-#include "Fragmentation/Summation/AllLevelSummator.hpp"
+#include "Fragmentation/Summation/OrthogonalSumUpPerLevel.hpp"
+#include "Fragmentation/Summation/SumUpPerLevel.hpp"
 #include "Fragmentation/Summation/OrthogonalFullSummator.hpp"
 #include "Fragmentation/Summation/OrthogonalSummation.hpp"
@@ -308,192 +308,4 @@
   return true;
 }
-
-template <typename source, typename dest>
-void convertDataTo(
-    const std::vector<source> &fragmentData,
-    std::vector<dest> &MPQCData_fused)
-{
-  MPQCData_fused.clear();
-}
-
-template <>
-void convertDataTo<MPQCData, MPQCDataEnergyMap_t>(
-    const std::vector<MPQCData> &fragmentData,
-    std::vector<MPQCDataEnergyMap_t> &MPQCData_Energy_fused)
-{
-  // energy_t
-  MPQCData_Energy_fused.clear();
-  MPQCData_Energy_fused.reserve(fragmentData.size());
-  for(std::vector<MPQCData>::const_iterator dataiter = fragmentData.begin();
-      dataiter != fragmentData.end(); ++dataiter) {
-    const MPQCData &extractedData = *dataiter;
-    LOG(4, "DEBUG: Current extracted Data is " << extractedData << ".");
-    MPQCDataEnergyMap_t instance;
-    boost::fusion::at_key<MPQCDataFused::energy_total>(instance) = extractedData.energies.total;
-    boost::fusion::at_key<MPQCDataFused::energy_nuclear_repulsion>(instance) = extractedData.energies.nuclear_repulsion;
-    boost::fusion::at_key<MPQCDataFused::energy_electron_coulomb>(instance) = extractedData.energies.electron_coulomb;
-    boost::fusion::at_key<MPQCDataFused::energy_electron_exchange>(instance) = extractedData.energies.electron_exchange;
-    boost::fusion::at_key<MPQCDataFused::energy_correlation>(instance) = extractedData.energies.correlation;
-    boost::fusion::at_key<MPQCDataFused::energy_overlap>(instance) = extractedData.energies.overlap;
-    boost::fusion::at_key<MPQCDataFused::energy_kinetic>(instance) = extractedData.energies.kinetic;
-    boost::fusion::at_key<MPQCDataFused::energy_hcore>(instance) = extractedData.energies.hcore;
-    boost::fusion::at_key<MPQCDataFused::energy_eigenvalues>(instance) = extractedData.energies.eigenvalues;
-    MPQCData_Energy_fused.push_back(instance);
-  }
-}
-
-template <>
-void convertDataTo<VMGData, VMGDataMap_t>(
-    const std::vector<VMGData> &longrangeData,
-    std::vector<VMGDataMap_t> &VMGData_fused)
-{
-  // energy_t
-  VMGData_fused.clear();
-  VMGData_fused.reserve(longrangeData.size());
-  for(std::vector<VMGData>::const_iterator dataiter = longrangeData.begin();
-      dataiter != longrangeData.end(); ++dataiter) {
-    const VMGData &extractedData = *dataiter;
-    LOG(4, "DEBUG: Current extracted Data is " << extractedData << ".");
-    VMGDataMap_t instance;
-    boost::fusion::at_key<VMGDataFused::sampled_potential>(instance) = extractedData.sampled_potential;
-    boost::fusion::at_key<VMGDataFused::energy_potential>(instance) = extractedData.sampled_potential.integral();
-    boost::fusion::at_key<VMGDataFused::energy_long>(instance) = extractedData.e_long;
-    VMGData_fused.push_back(instance);
-  }
-}
-
-void convertMPQCDatatoForceMap(
-    const std::vector<MPQCData> &fragmentData,
-    const KeySetsContainer &ForceKeySet,
-    std::vector<MPQCDataForceMap_t> &MPQCData_Force_fused)
-{
-  // forces
-  ASSERT( ForceKeySet.KeySets.size() == fragmentData.size(),
-      "FragmentationAutomationAction::performCall() - indices and fragmentData differ in size.");
-  MPQCData_Force_fused.clear();
-  MPQCData_Force_fused.reserve(fragmentData.size());
-  std::vector<MPQCData>::const_iterator dataiter = fragmentData.begin();
-  KeySetsContainer::ArrayOfIntVectors::const_iterator arrayiter = ForceKeySet.KeySets.begin();
-  for(;dataiter != fragmentData.end(); ++dataiter, ++arrayiter) {
-    const MPQCData &extractedData = *dataiter;
-    LOG(4, "DEBUG: Current extracted Data is " << extractedData << ".");
-    MPQCDataForceMap_t instance;
-    // must convert int to index_t
-    IndexedVectors::indices_t indices(arrayiter->begin(), arrayiter->end());
-    boost::fusion::at_key<MPQCDataFused::forces>(instance) =
-        IndexedVectors(indices, extractedData.forces);
-    MPQCData_Force_fused.push_back(instance);
-  }
-}
-
-template <>
-void convertDataTo<MPQCData, MPQCDataGridMap_t>(
-    const std::vector<MPQCData> &fragmentData,
-    std::vector<MPQCDataGridMap_t> &MPQCData_Grid_fused)
-{
-  // sampled_grid
-  MPQCData_Grid_fused.clear();
-  MPQCData_Grid_fused.reserve(fragmentData.size());
-  for(std::vector<MPQCData>::const_iterator dataiter = fragmentData.begin();
-      dataiter != fragmentData.end(); ++dataiter) {
-    const MPQCData &extractedData = *dataiter;
-    LOG(4, "DEBUG: Current extracted Data is " << extractedData << ".");
-    MPQCDataGridMap_t instance;
-    boost::fusion::at_key<MPQCDataFused::sampled_grid>(instance) = extractedData.sampled_grid;
-    MPQCData_Grid_fused.push_back(instance);
-  }
-}
-
-template <>
-void convertDataTo<MPQCData, MPQCDataFragmentMap_t>(
-    const std::vector<MPQCData> &fragmentData,
-    std::vector<MPQCDataFragmentMap_t> &MPQCData_Fragment_fused)
-{
-  // fragment
-  MPQCData_Fragment_fused.clear();
-  MPQCData_Fragment_fused.reserve(fragmentData.size());
-  for(std::vector<MPQCData>::const_iterator dataiter = fragmentData.begin();
-      dataiter != fragmentData.end(); ++dataiter) {
-    const MPQCData &extractedData = *dataiter;
-    LOG(4, "DEBUG: Current extracted Data is " << extractedData << ".");
-    MPQCDataFragmentMap_t instance;
-    boost::fusion::at_key<MPQCDataFused::fragment>(instance) =
-        Fragment(extractedData.positions, extractedData.charges);
-    MPQCData_Fragment_fused.push_back(instance);
-  }
-}
-
-template <>
-void convertDataTo<MPQCData, MPQCDataTimeMap_t>(
-    const std::vector<MPQCData> &fragmentData,
-    std::vector<MPQCDataTimeMap_t> &MPQCData_Time_fused)
-{
-  // times
-  MPQCData_Time_fused.clear();
-  MPQCData_Time_fused.reserve(fragmentData.size());
-  for(std::vector<MPQCData>::const_iterator dataiter = fragmentData.begin();
-      dataiter != fragmentData.end(); ++dataiter) {
-    const MPQCData &extractedData = *dataiter;
-    LOG(4, "DEBUG: Current extracted Data is " << extractedData << ".");
-    MPQCDataTimeMap_t instance;
-    boost::fusion::at_key<MPQCDataFused::times_walltime>(instance) = extractedData.times.walltime;
-    boost::fusion::at_key<MPQCDataFused::times_cputime>(instance) = extractedData.times.cputime;
-    boost::fusion::at_key<MPQCDataFused::times_flops>(instance) = extractedData.times.flops;
-    MPQCData_Time_fused.push_back(instance);
-  }
-}
-
-template <typename TypeMap, typename TypeVector>
-std::vector<TypeMap> SumUpPerLevel(
-    const std::vector<MPQCData> &fragmentData,
-    const std::vector<JobId_t> &jobids,
-    std::map< JobId_t, size_t > &MatrixNrLookup,
-    const IndexSetContainer::ptr &container,
-    SubsetMap::ptr &subsetmap
-    )
-{
-  // place data into boost::fusion::map instance
-  std::vector<TypeMap> MPQCData_fused;
-  convertDataTo<MPQCData, TypeMap>(fragmentData, MPQCData_fused);
-  // instantiate summator
-  std::vector<TypeMap> Result_fused(subsetmap->getMaximumSubsetLevel());
-  AllLevelSummator<TypeMap> Summer(
-              subsetmap,
-              MPQCData_fused,
-              jobids,
-              container->getContainer(),
-              MatrixNrLookup,
-              Result_fused);
-  // sum up for each type key in TypeVector
-  boost::mpl::for_each<TypeVector>(boost::ref(Summer));
-  return Result_fused;
-}
-
-template <typename TypeMap, typename TypeVector>
-std::vector<TypeMap> OrthogonalSumUpPerLevel(
-    const std::vector<MPQCData> &fragmentData,
-    const std::vector<JobId_t> &jobids,
-    std::map< JobId_t, size_t > &MatrixNrLookup,
-    const IndexSetContainer::ptr &container,
-    SubsetMap::ptr &subsetmap
-    )
-{
-  // place data into boost::fusion::map instance
-  std::vector<TypeMap> MPQCData_fused;
-  convertDataTo<MPQCData, TypeMap>(fragmentData, MPQCData_fused);
-  // instantiate summator
-  std::vector<TypeMap> Result_fused(subsetmap->getMaximumSubsetLevel());
-  AllLevelOrthogonalSummator<TypeMap> Summer(
-              subsetmap,
-              MPQCData_fused,
-              jobids,
-              container->getContainer(),
-              MatrixNrLookup,
-              Result_fused);
-  // sum up for each type key in TypeVector
-  boost::mpl::for_each<TypeVector>(boost::ref(Summer));
-  return Result_fused;
-}
-
 /** Print MPQCData from received results.
  *
@@ -552,5 +364,4 @@
   return true;
 }
-
 
 /** Print MPQCData from received results.
Index: src/Fragmentation/Converter/DataConverter.hpp
===================================================================
--- src/Fragmentation/Converter/DataConverter.hpp	(revision 0398bd3f86573bb724b71c8e05ebaeadda50c7c7)
+++ src/Fragmentation/Converter/DataConverter.hpp	(revision 0398bd3f86573bb724b71c8e05ebaeadda50c7c7)
@@ -0,0 +1,176 @@
+/*
+ * DataConverter.hpp
+ *
+ *  Created on: Aug 27, 2012
+ *      Author: heber
+ */
+
+#ifndef DATACONVERTER_HPP_
+#define DATACONVERTER_HPP_
+
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <vector>
+#include <boost/fusion/sequence.hpp>
+
+#include "CodePatterns/Assert.hpp"
+
+#include "JobMarket/types.hpp"
+
+#include "Fragmentation/KeySetsContainer.hpp"
+#include "Fragmentation/SetValues/Histogram.hpp"
+#include "Fragmentation/SetValues/Fragment.hpp"
+#include "Fragmentation/SetValues/IndexedVectors.hpp"
+
+#include "Jobs/MPQCData.hpp"
+#include "Jobs/MPQCDataFused.hpp"
+#include "Jobs/MPQCDataMap.hpp"
+#ifdef HAVE_VMG
+#include "Jobs/VMGData.hpp"
+#include "Jobs/VMGDataFused.hpp"
+#include "Jobs/VMGDataMap.hpp"
+#endif
+
+template <typename source, typename dest>
+inline void convertDataTo(
+    const std::vector<source> &fragmentData,
+    std::vector<dest> &MPQCData_fused)
+{
+  MPQCData_fused.clear();
+}
+
+template <>
+inline void convertDataTo<MPQCData, MPQCDataEnergyMap_t>(
+    const std::vector<MPQCData> &fragmentData,
+    std::vector<MPQCDataEnergyMap_t> &MPQCData_Energy_fused)
+{
+  // energy_t
+  MPQCData_Energy_fused.clear();
+  MPQCData_Energy_fused.reserve(fragmentData.size());
+  for(std::vector<MPQCData>::const_iterator dataiter = fragmentData.begin();
+      dataiter != fragmentData.end(); ++dataiter) {
+    const MPQCData &extractedData = *dataiter;
+    LOG(4, "DEBUG: Current extracted Data is " << extractedData << ".");
+    MPQCDataEnergyMap_t instance;
+    boost::fusion::at_key<MPQCDataFused::energy_total>(instance) = extractedData.energies.total;
+    boost::fusion::at_key<MPQCDataFused::energy_nuclear_repulsion>(instance) = extractedData.energies.nuclear_repulsion;
+    boost::fusion::at_key<MPQCDataFused::energy_electron_coulomb>(instance) = extractedData.energies.electron_coulomb;
+    boost::fusion::at_key<MPQCDataFused::energy_electron_exchange>(instance) = extractedData.energies.electron_exchange;
+    boost::fusion::at_key<MPQCDataFused::energy_correlation>(instance) = extractedData.energies.correlation;
+    boost::fusion::at_key<MPQCDataFused::energy_overlap>(instance) = extractedData.energies.overlap;
+    boost::fusion::at_key<MPQCDataFused::energy_kinetic>(instance) = extractedData.energies.kinetic;
+    boost::fusion::at_key<MPQCDataFused::energy_hcore>(instance) = extractedData.energies.hcore;
+    boost::fusion::at_key<MPQCDataFused::energy_eigenvalues>(instance) = extractedData.energies.eigenvalues;
+    MPQCData_Energy_fused.push_back(instance);
+  }
+}
+
+#ifdef HAVE_VMG
+template <>
+inline void convertDataTo<VMGData, VMGDataMap_t>(
+    const std::vector<VMGData> &longrangeData,
+    std::vector<VMGDataMap_t> &VMGData_fused)
+{
+  // energy_t
+  VMGData_fused.clear();
+  VMGData_fused.reserve(longrangeData.size());
+  for(std::vector<VMGData>::const_iterator dataiter = longrangeData.begin();
+      dataiter != longrangeData.end(); ++dataiter) {
+    const VMGData &extractedData = *dataiter;
+    LOG(4, "DEBUG: Current extracted Data is " << extractedData << ".");
+    VMGDataMap_t instance;
+    boost::fusion::at_key<VMGDataFused::sampled_potential>(instance) = extractedData.sampled_potential;
+    boost::fusion::at_key<VMGDataFused::energy_potential>(instance) = extractedData.sampled_potential.integral();
+    boost::fusion::at_key<VMGDataFused::energy_long>(instance) = extractedData.e_long;
+    VMGData_fused.push_back(instance);
+  }
+}
+#endif
+
+inline void convertMPQCDatatoForceMap(
+    const std::vector<MPQCData> &fragmentData,
+    const KeySetsContainer &ForceKeySet,
+    std::vector<MPQCDataForceMap_t> &MPQCData_Force_fused)
+{
+  // forces
+  ASSERT( ForceKeySet.KeySets.size() == fragmentData.size(),
+      "FragmentationAutomationAction::performCall() - indices and fragmentData differ in size.");
+  MPQCData_Force_fused.clear();
+  MPQCData_Force_fused.reserve(fragmentData.size());
+  std::vector<MPQCData>::const_iterator dataiter = fragmentData.begin();
+  KeySetsContainer::ArrayOfIntVectors::const_iterator arrayiter = ForceKeySet.KeySets.begin();
+  for(;dataiter != fragmentData.end(); ++dataiter, ++arrayiter) {
+    const MPQCData &extractedData = *dataiter;
+    LOG(4, "DEBUG: Current extracted Data is " << extractedData << ".");
+    MPQCDataForceMap_t instance;
+    // must convert int to index_t
+    IndexedVectors::indices_t indices(arrayiter->begin(), arrayiter->end());
+    boost::fusion::at_key<MPQCDataFused::forces>(instance) =
+        IndexedVectors(indices, extractedData.forces);
+    MPQCData_Force_fused.push_back(instance);
+  }
+}
+
+template <>
+inline void convertDataTo<MPQCData, MPQCDataGridMap_t>(
+    const std::vector<MPQCData> &fragmentData,
+    std::vector<MPQCDataGridMap_t> &MPQCData_Grid_fused)
+{
+  // sampled_grid
+  MPQCData_Grid_fused.clear();
+  MPQCData_Grid_fused.reserve(fragmentData.size());
+  for(std::vector<MPQCData>::const_iterator dataiter = fragmentData.begin();
+      dataiter != fragmentData.end(); ++dataiter) {
+    const MPQCData &extractedData = *dataiter;
+    LOG(4, "DEBUG: Current extracted Data is " << extractedData << ".");
+    MPQCDataGridMap_t instance;
+    boost::fusion::at_key<MPQCDataFused::sampled_grid>(instance) = extractedData.sampled_grid;
+    MPQCData_Grid_fused.push_back(instance);
+  }
+}
+
+template <>
+inline void convertDataTo<MPQCData, MPQCDataFragmentMap_t>(
+    const std::vector<MPQCData> &fragmentData,
+    std::vector<MPQCDataFragmentMap_t> &MPQCData_Fragment_fused)
+{
+  // fragment
+  MPQCData_Fragment_fused.clear();
+  MPQCData_Fragment_fused.reserve(fragmentData.size());
+  for(std::vector<MPQCData>::const_iterator dataiter = fragmentData.begin();
+      dataiter != fragmentData.end(); ++dataiter) {
+    const MPQCData &extractedData = *dataiter;
+    LOG(4, "DEBUG: Current extracted Data is " << extractedData << ".");
+    MPQCDataFragmentMap_t instance;
+    boost::fusion::at_key<MPQCDataFused::fragment>(instance) =
+        Fragment(extractedData.positions, extractedData.charges);
+    MPQCData_Fragment_fused.push_back(instance);
+  }
+}
+
+template <>
+inline void convertDataTo<MPQCData, MPQCDataTimeMap_t>(
+    const std::vector<MPQCData> &fragmentData,
+    std::vector<MPQCDataTimeMap_t> &MPQCData_Time_fused)
+{
+  // times
+  MPQCData_Time_fused.clear();
+  MPQCData_Time_fused.reserve(fragmentData.size());
+  for(std::vector<MPQCData>::const_iterator dataiter = fragmentData.begin();
+      dataiter != fragmentData.end(); ++dataiter) {
+    const MPQCData &extractedData = *dataiter;
+    LOG(4, "DEBUG: Current extracted Data is " << extractedData << ".");
+    MPQCDataTimeMap_t instance;
+    boost::fusion::at_key<MPQCDataFused::times_walltime>(instance) = extractedData.times.walltime;
+    boost::fusion::at_key<MPQCDataFused::times_cputime>(instance) = extractedData.times.cputime;
+    boost::fusion::at_key<MPQCDataFused::times_flops>(instance) = extractedData.times.flops;
+    MPQCData_Time_fused.push_back(instance);
+  }
+}
+
+
+#endif /* DATACONVERTER_HPP_ */
Index: src/Fragmentation/Converter/Makefile.am
===================================================================
--- src/Fragmentation/Converter/Makefile.am	(revision 0398bd3f86573bb724b71c8e05ebaeadda50c7c7)
+++ src/Fragmentation/Converter/Makefile.am	(revision 0398bd3f86573bb724b71c8e05ebaeadda50c7c7)
@@ -0,0 +1,54 @@
+# PLEASE adhere to the alphabetical ordering in this Makefile!
+# Also indentation by a single tab
+
+FRAGMENTATIONCONVERTERSOURCE = 
+
+FRAGMENTATIONCONVERTERHEADER = \
+	Fragmentation/Converter/DataConverter.hpp
+
+
+noinst_LTLIBRARIES += libMolecuilderFragmentationConverter.la
+libMolecuilderFragmentationConverter_la_includedir = $(includedir)/MoleCuilder/Fragmentation/Converter/
+libMolecuilderFragmentationConverter_la_CPPFLAGS = ${BOOST_CPPFLAGS} ${CodePatterns_CFLAGS}
+libMolecuilderFragmentationConverter_la_LDFLAGS = -ldl ${BOOST_LDFLAGS}
+libMolecuilderFragmentationConverter_la_LIBADD = \
+	${CodePatterns_LIBS}
+
+
+nobase_libMolecuilderFragmentationConverter_la_include_HEADERS = ${FRAGMENTATIONCONVERTERHEADER}
+
+## Define the source file list for the "libexample-@MOLECUILDER_API_VERSION@.la"
+## target.  Note that @MOLECUILDER_API_VERSION@ is not interpreted by Automake and
+## will therefore be treated as if it were literally part of the target name,
+## and the variable name derived from that.
+## The file extension .cc is recognized by Automake, and makes it produce
+## rules which invoke the C++ compiler to produce a libtool object file (.lo)
+## from each source file.  Note that it is not necessary to list header files
+## which are already listed elsewhere in a _HEADERS variable assignment.
+libMolecuilderFragmentationConverter_la_SOURCES = ${FRAGMENTATIONCONVERTERSOURCE}
+
+## Instruct libtool to include ABI version information in the generated shared
+## library file (.so).  The library ABI version is defined in configure.ac, so
+## that all version information is kept in one place.
+#libMolecuilderFragmentationConverter_la_LDFLAGS = -version-info $(MOLECUILDER_SO_VERSION)
+
+## The generated configuration header is installed in its own subdirectory of
+## $(libdir).  The reason for this is that the configuration information put
+## into this header file describes the target platform the installed library
+## has been built for.  Thus the file must not be installed into a location
+## intended for architecture-independent files, as defined by the Filesystem
+## Hierarchy Standard (FHS).
+## The nodist_ prefix instructs Automake to not generate rules for including
+## the listed files in the distribution on 'make dist'.  Files that are listed
+## in _HEADERS variables are normally included in the distribution, but the
+## configuration header file is generated at configure time and should not be
+## shipped with the source tarball.
+#libMolecuilderFragmentationConverter_libincludedir = $(libdir)/MoleCuilder/include
+#nodist_libMolecuilderFragmentationConverter_libinclude_HEADERS = $(top_builddir)/libmolecuilder_config.h
+
+## Install the generated pkg-config file (.pc) into the expected location for
+## architecture-dependent package configuration information.  Occasionally,
+## pkg-config files are also used for architecture-independent data packages,
+## in which case the correct install location would be $(datadir)/pkgconfig.
+#pkgconfigdir = $(libdir)/pkgconfig
+#pkgconfig_DATA = $(top_builddir)/MoleCuilder.pc
Index: src/Fragmentation/Summation/Makefile.am
===================================================================
--- src/Fragmentation/Summation/Makefile.am	(revision 3023451f9bb244c1ffafbac7f100be34a2430f1f)
+++ src/Fragmentation/Summation/Makefile.am	(revision 0398bd3f86573bb724b71c8e05ebaeadda50c7c7)
@@ -17,4 +17,5 @@
 	Fragmentation/Summation/OrthogonalSummation_impl.hpp \
 	Fragmentation/Summation/OrthogonalSummator.hpp \
+	Fragmentation/Summation/OrthogonalSumUpPerLevel.hpp \
 	Fragmentation/Summation/printKeyNames.hpp \
 	Fragmentation/Summation/SetValue.hpp \
@@ -25,4 +26,5 @@
 	Fragmentation/Summation/Summation_impl.hpp \
 	Fragmentation/Summation/Summator.hpp \
+	Fragmentation/Summation/SumUpPerLevel.hpp \
 	Fragmentation/Summation/ValuePrinter.hpp \
 	Fragmentation/Summation/writeTable.hpp \
Index: src/Fragmentation/Summation/OrthogonalSumUpPerLevel.hpp
===================================================================
--- src/Fragmentation/Summation/OrthogonalSumUpPerLevel.hpp	(revision 0398bd3f86573bb724b71c8e05ebaeadda50c7c7)
+++ src/Fragmentation/Summation/OrthogonalSumUpPerLevel.hpp	(revision 0398bd3f86573bb724b71c8e05ebaeadda50c7c7)
@@ -0,0 +1,56 @@
+/*
+ * OrthogonalSumUpPerLevel.hpp
+ *
+ *  Created on: Aug 27, 2012
+ *      Author: heber
+ */
+
+#ifndef ORTHOGONALSUMUPPERLEVEL_HPP_
+#define ORTHOGONALSUMUPPERLEVEL_HPP_
+
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+#include <map>
+#include <vector>
+
+#include "Fragmentation/Converter/DataConverter.hpp"
+#include "Fragmentation/Summation/AllLevelOrthogonalSummator.hpp"
+#include "Fragmentation/Summation/IndexSetContainer.hpp"
+
+#include "Jobs/MPQCData.hpp"
+
+#include <boost/mpl/for_each.hpp>
+
+template <typename TypeMap, typename TypeVector>
+std::vector<TypeMap> OrthogonalSumUpPerLevel(
+    const std::vector<MPQCData> &fragmentData,
+    const std::vector<JobId_t> &jobids,
+    std::map< JobId_t, size_t > &MatrixNrLookup,
+    const IndexSetContainer::ptr &container,
+    SubsetMap::ptr &subsetmap
+    )
+{
+  // place data into boost::fusion::map instance
+  std::vector<TypeMap> MPQCData_fused;
+  convertDataTo<MPQCData, TypeMap>(fragmentData, MPQCData_fused);
+  // instantiate summator
+  std::vector<TypeMap> Result_fused(subsetmap->getMaximumSubsetLevel());
+  AllLevelOrthogonalSummator<TypeMap> Summer(
+              subsetmap,
+              MPQCData_fused,
+              jobids,
+              container->getContainer(),
+              MatrixNrLookup,
+              Result_fused);
+  // sum up for each type key in TypeVector
+  boost::mpl::for_each<TypeVector>(boost::ref(Summer));
+  return Result_fused;
+}
+
+
+#endif /* ORTHOGONALSUMUPPERLEVEL_HPP_ */
Index: src/Fragmentation/Summation/SumUpPerLevel.hpp
===================================================================
--- src/Fragmentation/Summation/SumUpPerLevel.hpp	(revision 0398bd3f86573bb724b71c8e05ebaeadda50c7c7)
+++ src/Fragmentation/Summation/SumUpPerLevel.hpp	(revision 0398bd3f86573bb724b71c8e05ebaeadda50c7c7)
@@ -0,0 +1,55 @@
+/*
+ * SumUpPerLevel.hpp
+ *
+ *  Created on: Aug 27, 2012
+ *      Author: heber
+ */
+
+#ifndef SUMUPPERLEVEL_HPP_
+#define SUMUPPERLEVEL_HPP_
+
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <map>
+#include <vector>
+
+#include "Fragmentation/Converter/DataConverter.hpp"
+#include "Fragmentation/Summation/AllLevelSummator.hpp"
+#include "Fragmentation/Summation/IndexSetContainer.hpp"
+
+#include "Jobs/MPQCData.hpp"
+
+#include <boost/mpl/for_each.hpp>
+
+template <typename TypeMap, typename TypeVector>
+std::vector<TypeMap> SumUpPerLevel(
+    const std::vector<MPQCData> &fragmentData,
+    const std::vector<JobId_t> &jobids,
+    std::map< JobId_t, size_t > &MatrixNrLookup,
+    const IndexSetContainer::ptr &container,
+    SubsetMap::ptr &subsetmap
+    )
+{
+  // place data into boost::fusion::map instance
+  std::vector<TypeMap> MPQCData_fused;
+  convertDataTo<MPQCData, TypeMap>(fragmentData, MPQCData_fused);
+  // instantiate summator
+  std::vector<TypeMap> Result_fused(subsetmap->getMaximumSubsetLevel());
+  AllLevelSummator<TypeMap> Summer(
+              subsetmap,
+              MPQCData_fused,
+              jobids,
+              container->getContainer(),
+              MatrixNrLookup,
+              Result_fused);
+  // sum up for each type key in TypeVector
+  boost::mpl::for_each<TypeVector>(boost::ref(Summer));
+  return Result_fused;
+}
+
+
+#endif /* SUMUPPERLEVEL_HPP_ */
Index: src/Makefile.am
===================================================================
--- src/Makefile.am	(revision 3023451f9bb244c1ffafbac7f100be34a2430f1f)
+++ src/Makefile.am	(revision 0398bd3f86573bb724b71c8e05ebaeadda50c7c7)
@@ -16,4 +16,5 @@
 include Filling/Makefile.am
 include Fragmentation/Makefile.am
+include Fragmentation/Converter/Makefile.am
 include Fragmentation/Summation/Makefile.am
 include Fragmentation/SetValues/Makefile.am
