Index: src/Fragmentation/Automation/FragmentJobQueue.cpp
===================================================================
--- src/Fragmentation/Automation/FragmentJobQueue.cpp	(revision ac9ca46967e95fa2cebeb516a6755eef363225d5)
+++ src/Fragmentation/Automation/FragmentJobQueue.cpp	(revision bae7bcfcfe9b08823c3f099f8441af87980bc96f)
@@ -45,4 +45,5 @@
 
 #include "Box.hpp"
+#include "Fragmentation/Automation/parseKeySetFile.hpp"
 #include "Helpers/defs.hpp"
 #include "Jobs/MPQCJob.hpp"
@@ -89,4 +90,34 @@
 }
 
+bool FragmentJobQueue::addKeySetsFromFiles(
+    const boost::filesystem::path &path,
+    const size_t FragmentCounter,
+    const enum KeySetFileType keysettype
+    )
+{
+  const size_t NoJobs = KeySets.KeySets.size();
+  parseKeySetFile(KeySets, path.string(), FragmentCounter, NonHydrogenKeySets);
+  ASSERT( (KeySets.KeySets.size()-NoJobs) == FragmentCounter,
+      "FragmentJobQueue::addKeySetsFromFiles() - mismatching number of new fragments "
+      +toString(KeySets.KeySets.size()-NoJobs)+" and number of Keyset "
+      +toString(FragmentCounter)+".");
+  return (KeySets.KeySets.size() > NoJobs);
+}
+
+bool FragmentJobQueue::addFullKeySetsFromFiles(
+    const boost::filesystem::path &path,
+    const size_t FragmentCounter,
+    const enum KeySetFileType keysettype
+    )
+{
+  const size_t NoJobs = FullKeySets.KeySets.size();
+  parseKeySetFile(FullKeySets, path.string(), FragmentCounter, NonHydrogenKeySets);
+  ASSERT( (FullKeySets.KeySets.size()-NoJobs) == FragmentCounter,
+      "FragmentJobQueue::addKeySetsFromFiles() - mismatching number of fragments "
+      +toString(FullKeySets.KeySets.size()-NoJobs)+" and number of FullKeyset "
+      +toString(FragmentCounter)+".");
+  return (FullKeySets.KeySets.size() > NoJobs);
+}
+
 void FragmentJobQueue::clear()
 {
Index: src/Fragmentation/Automation/FragmentJobQueue.hpp
===================================================================
--- src/Fragmentation/Automation/FragmentJobQueue.hpp	(revision ac9ca46967e95fa2cebeb516a6755eef363225d5)
+++ src/Fragmentation/Automation/FragmentJobQueue.hpp	(revision bae7bcfcfe9b08823c3f099f8441af87980bc96f)
@@ -21,4 +21,5 @@
 
 #include "Fragmentation/KeySetsContainer.hpp"
+#include "Fragmentation/Automation/parseKeySetFile.hpp"
 #include "Jobs/MPQCJob.hpp"
 
@@ -77,4 +78,22 @@
       const unsigned int level);
 
+  /** Adds keysets after fragments have been added by file.
+   *
+   */
+  bool addKeySetsFromFiles(
+      const boost::filesystem::path &path,
+      const size_t FragmentCounter,
+      const enum KeySetFileType keysettype
+      );
+
+  /** Adds keysets after fragments have been added by file.
+   *
+   */
+  bool addFullKeySetsFromFiles(
+      const boost::filesystem::path &path,
+      const size_t FragmentCounter,
+      const enum KeySetFileType keysettype
+      );
+
   /** Getter for the container of all KeySets to the jobs.
    *
Index: src/Fragmentation/Automation/FragmentationChargeDensity.cpp
===================================================================
--- src/Fragmentation/Automation/FragmentationChargeDensity.cpp	(revision ac9ca46967e95fa2cebeb516a6755eef363225d5)
+++ src/Fragmentation/Automation/FragmentationChargeDensity.cpp	(revision bae7bcfcfe9b08823c3f099f8441af87980bc96f)
@@ -57,5 +57,5 @@
 FragmentationChargeDensity::FragmentationChargeDensity(
     const std::map<JobId_t,MPQCData> &fragmentData,
-    const std::string &KeySetFilename)
+    const KeySetsContainer &KeySet)
 {
   // create a vector of all job ids
@@ -70,8 +70,4 @@
   const std::map< JobId_t, size_t > MatrixNrLookup =
       createMatrixNrLookup(jobids, FragmentCounter);
-
-  // initialise keysets
-  KeySetsContainer KeySet;
-  parseKeySetFile(KeySet, KeySetFilename, FragmentCounter, NonHydrogenKeySets);
 
   /// prepare for OrthogonalSummation
@@ -91,4 +87,5 @@
 }
 
+
 std::vector<SamplingGrid> FragmentationChargeDensity::getFullSampledGrid()
 {
Index: src/Fragmentation/Automation/FragmentationChargeDensity.hpp
===================================================================
--- src/Fragmentation/Automation/FragmentationChargeDensity.hpp	(revision ac9ca46967e95fa2cebeb516a6755eef363225d5)
+++ src/Fragmentation/Automation/FragmentationChargeDensity.hpp	(revision bae7bcfcfe9b08823c3f099f8441af87980bc96f)
@@ -16,5 +16,4 @@
 
 #include <map>
-#include <string>
 #include <vector>
 
@@ -27,4 +26,6 @@
 #include "Jobs/Grid/SamplingGrid.hpp"
 
+class KeySetsContainer;
+
 /** This structure is a container for the summed up charge density per level.
  *
@@ -35,9 +36,9 @@
    *
    * @param fragmentData MPQCData resulting from the jobs, each associated to a job
-   * @param KeySetFilename filename with keysets to associate forces correctly
+   * @param KeySet KeySets of all (non-hydrogen) atoms
    */
   FragmentationChargeDensity(
       const std::map<JobId_t,MPQCData> &fragmentData,
-      const std::string &KeySetFilename);
+      const KeySetsContainer& KeySet);
 
   std::vector<SamplingGrid> getFullSampledGrid();
@@ -54,4 +55,17 @@
   //!> results per IndexSet of summed up fragment positions and charges
   std::map<IndexSet::ptr, std::pair<MPQCDataFragmentMap_t, MPQCDataFragmentMap_t> > Result_perIndexSet_Fragment;
+
+private:
+  /** Helper function to call OrthogonalSummation.
+   *
+   * \param fragmentData map of calculated jobs
+   * \param KeySet container of all keysets
+   * \param MatrixNrLookup map with enumerated job ids
+   */
+  void sumUp(
+      const std::map<JobId_t,MPQCData> &fragmentData,
+      const KeySetsContainer &KeySet,
+      const std::map< JobId_t, size_t > &MatrixNrLookup);
+
 };
 
Index: src/Fragmentation/Automation/FragmentationResults.cpp
===================================================================
--- src/Fragmentation/Automation/FragmentationResults.cpp	(revision ac9ca46967e95fa2cebeb516a6755eef363225d5)
+++ src/Fragmentation/Automation/FragmentationResults.cpp	(revision bae7bcfcfe9b08823c3f099f8441af87980bc96f)
@@ -58,9 +58,11 @@
 #include "Helpers/defs.hpp"
 
-
 FragmentationResults::FragmentationResults(
     const std::map<JobId_t,MPQCData> &fragmentData,
     std::map<JobId_t,VMGData> &longrangeData,
-    const std::string &KeySetFilename)
+    const KeySetsContainer& _KeySet,
+    const KeySetsContainer& _ForceKeySet) :
+    KeySet(_KeySet),
+    ForceKeySet(_ForceKeySet)
 {
   // create lookup from job nr to fragment number
@@ -74,10 +76,4 @@
   VMGMatrixNrLookup =
       createMatrixNrLookup(vmgjobids, VMGFragmentCounter);
-
-  // initialise keysets
-  parseKeySetFile(KeySet, KeySetFilename, MPQCFragmentCounter, NonHydrogenKeySets);
-  parseKeySetFile(ForceKeySet, KeySetFilename, MPQCFragmentCounter, HydrogenKeySets);
-
-  /// prepare for OrthogonalSummation
 
   // convert KeySetContainer to IndexSetContainer
Index: src/Fragmentation/Automation/FragmentationResults.hpp
===================================================================
--- src/Fragmentation/Automation/FragmentationResults.hpp	(revision ac9ca46967e95fa2cebeb516a6755eef363225d5)
+++ src/Fragmentation/Automation/FragmentationResults.hpp	(revision bae7bcfcfe9b08823c3f099f8441af87980bc96f)
@@ -16,5 +16,4 @@
 
 #include <map>
-#include <string>
 #include <vector>
 
@@ -42,20 +41,24 @@
 struct FragmentationResults
 {
-  /** Constructor for class FragmentationResults.
-   *
-   * Performs the summation and fills all result vectors.
+  /** Constructor for class FragmentationResults, based on KeySets.
    *
    * @param fragmentData results from short-range fragment calculations
    * @param longrangeData results from long-range fragment calculations
-   * @param fullsolutionData results from long-range full calculations
-   * @param KeySetFilename path to fragment files
-   * @param NoAtoms number of atoms of full system
-   * @param full_sample summed up grid charge
+   * @param _KeySet KeySets of all (non-hydrogen) atoms
+   * @param _ForceKeySet KeySets of all atoms except those added by saturation
    */
   FragmentationResults(
       const std::map<JobId_t,MPQCData> &fragmentData,
       std::map<JobId_t,VMGData> &longrangeData,
-      const std::string &KeySetFilename);
+      const KeySetsContainer& _KeySet,
+      const KeySetsContainer& _ForceKeySet);
 
+  /** Performs the summation and fills all result vectors.
+   *
+   * @param fragmentData results from short-range fragment calculations
+   * @param longrangeData results from long-range fragment calculations
+   * @param fullsolutionData long-range solution
+   * @param full_sample sampled density
+   */
   void operator()(
       const std::map<JobId_t,MPQCData> &fragmentData,
