Index: src/Actions/FragmentationAction/FragmentationAutomationAction.cpp
===================================================================
--- src/Actions/FragmentationAction/FragmentationAutomationAction.cpp	(revision 995e2f630769a5f3b1bfaa3010c8e6eb0e1f0a9e)
+++ src/Actions/FragmentationAction/FragmentationAutomationAction.cpp	(revision c9f9bbb2d96080528233d702e81243480b34033d)
@@ -40,4 +40,5 @@
 
 #include <boost/mpl/remove.hpp>
+#include <boost/lambda/lambda.hpp>
 
 #include "CodePatterns/Assert.hpp"
@@ -173,9 +174,8 @@
 void ConvertFragmentResultTo(
     const std::vector<FragmentResult::ptr> &results,
-    std::vector<T> &fragmentData)
+    std::map<JobId_t, T> &fragmentData)
 {
   // extract results
   fragmentData.clear();
-  fragmentData.reserve(results.size());
 
   LOG(2, "DEBUG: Parsing now through " << results.size() << " results.");
@@ -189,5 +189,5 @@
     ia >> extractedData;
     LOG(1, "INFO: extracted data is " << extractedData << ".");
-    fragmentData.push_back(extractedData);
+    fragmentData.insert( std::make_pair( (*iter)->getId(), extractedData) );
   }
 
@@ -225,5 +225,4 @@
 /** Place results from FragmentResult into EnergyMatrix and ForceMatrix.
  *
- * @param jobids jobids with ids to associate with fragment number
  * @param fragmentData MPQCData resulting from the jobs
  * @param MatrixNrLookup Lookup up-map from job id to fragment number
@@ -235,6 +234,5 @@
  */
 bool putResultsintoMatrices(
-    const std::vector<JobId_t> &jobids,
-    const std::vector<MPQCData> &fragmentData,
+    const std::map<JobId_t, MPQCData> &fragmentData,
     std::map< JobId_t, size_t > &MatrixNrLookup,
     const size_t FragmentCounter,
@@ -243,10 +241,8 @@
     ForceMatrix &Force)
 {
-  ASSERT( jobids.size() == fragmentData.size(),
-      "putResultsintoMatrices() - jobids and fragmentData differ in size.");
-  std::vector<MPQCData>::const_iterator dataiter = fragmentData.begin();
-  std::vector<JobId_t>::const_iterator iditer = jobids.begin();
-  for (; dataiter != fragmentData.end(); ++dataiter, ++iditer) {
-    const MPQCData &extractedData = *dataiter;
+  for (std::map<JobId_t, MPQCData>::const_iterator dataiter = fragmentData.begin();
+      dataiter != fragmentData.end(); ++dataiter) {
+    const MPQCData &extractedData = dataiter->second;
+    const JobId_t &jobid = dataiter->first;
     // place results into EnergyMatrix ...
     {
@@ -255,7 +251,7 @@
       matrix[0].resize(1, extractedData.energies.total);
       if (!Energy.AddMatrix(
-          std::string("MPQCJob ")+toString(*iditer),
+          std::string("MPQCJob ")+toString(jobid),
           matrix,
-          MatrixNrLookup[*iditer])) {
+          MatrixNrLookup[jobid])) {
         ELOG(1, "Adding energy matrix failed.");
         return false;
@@ -276,7 +272,7 @@
       }
       if (!Force.AddMatrix(
-          std::string("MPQCJob ")+toString(*iditer),
+          std::string("MPQCJob ")+toString(jobid),
           matrix,
-          MatrixNrLookup[*iditer])) {
+          MatrixNrLookup[jobid])) {
         ELOG(1, "Adding force matrix failed.");
         return false;
@@ -301,6 +297,5 @@
 /** Print MPQCData from received results.
  *
- * @param jobids jobids with ids to associate with fragment number
- * @param fragmentData MPQCData resulting from the jobs
+ * @param fragmentData MPQCData resulting from the jobs, each associated to a job
  * @param KeySetFilename filename with keysets to associate forces correctly
  * @param NoAtoms total number of atoms
@@ -309,10 +304,16 @@
  */
 bool sumUpChargeDensity(
-    const std::vector<JobId_t> &jobids,
-    const std::vector<MPQCData> &fragmentData,
+    const std::map<JobId_t,MPQCData> &fragmentData,
     const std::string &KeySetFilename,
     SamplingGrid &full_sample,
     Fragment &full_fragment)
 {
+  // create a vector of all job ids
+  std::vector<JobId_t> jobids;
+  std::transform(fragmentData.begin(),fragmentData.end(),
+      std::back_inserter(jobids),
+      boost::bind( &std::map<JobId_t,MPQCData>::value_type::first, boost::lambda::_1 )
+  );
+
   // create lookup from job nr to fragment number
   std::map< JobId_t, size_t > MatrixNrLookup;
@@ -339,8 +340,8 @@
   std::vector<MPQCDataGridMap_t> Result_Grid_fused(
     OrthogonalSumUpPerLevel<MPQCDataGridMap_t, MPQCDataGridVector_t>(
-        fragmentData, jobids, MatrixNrLookup, container, subsetmap));
+        fragmentData, MatrixNrLookup, container, subsetmap));
   std::vector<MPQCDataFragmentMap_t> Result_Fragment_fused(
     OrthogonalSumUpPerLevel<MPQCDataFragmentMap_t, MPQCDataFragmentVector_t>(
-        fragmentData, jobids, MatrixNrLookup, container, subsetmap));
+        fragmentData, MatrixNrLookup, container, subsetmap));
   // obtain full grid
   full_sample = boost::fusion::at_key<MPQCDataFused::sampled_grid>(Result_Grid_fused.back());
@@ -352,6 +353,5 @@
 /** Print MPQCData from received results.
  *
- * @param results results with ids to associate with fragment number
- * @param fragmentData MPQCData resulting from the jobs
+ * @param fragmentData MPQCData resulting from the jobs, associated to job id
  * @param KeySetFilename filename with keysets to associate forces correctly
  * @param NoAtoms total number of atoms
@@ -359,10 +359,16 @@
  */
 bool printReceivedMPQCResults(
-    const std::vector<JobId_t> &jobids,
-    const std::vector<MPQCData> &fragmentData,
+    const std::map<JobId_t, MPQCData> &fragmentData,
     const std::string &KeySetFilename,
     size_t NoAtoms,
     SamplingGrid &full_sample)
 {
+  // create a vector of all job ids
+  std::vector<JobId_t> jobids;
+  std::transform(fragmentData.begin(),fragmentData.end(),
+      std::back_inserter(jobids),
+      boost::bind( &std::map<JobId_t,MPQCData>::value_type::first, boost::lambda::_1 )
+  );
+
   // create lookup from job nr to fragment number
   std::map< JobId_t, size_t > MatrixNrLookup;
@@ -373,5 +379,5 @@
   EnergyMatrix Energy;
   ForceMatrix Force;
-  if (!putResultsintoMatrices(jobids, fragmentData, MatrixNrLookup, FragmentCounter, NoAtoms, Energy, Force))
+  if (!putResultsintoMatrices(fragmentData, MatrixNrLookup, FragmentCounter, NoAtoms, Energy, Force))
     return false;
 
@@ -412,14 +418,14 @@
     std::vector<MPQCDataEnergyMap_t> Result_Energy_fused(
         OrthogonalSumUpPerLevel<MPQCDataEnergyMap_t, MPQCDataEnergyVector_t>(
-            fragmentData, jobids, MatrixNrLookup, container, subsetmap));
+            fragmentData, MatrixNrLookup, container, subsetmap));
     std::vector<MPQCDataGridMap_t> Result_Grid_fused(
       OrthogonalSumUpPerLevel<MPQCDataGridMap_t, MPQCDataGridVector_t>(
-          fragmentData, jobids, MatrixNrLookup, container, subsetmap));
+          fragmentData, MatrixNrLookup, container, subsetmap));
     std::vector<MPQCDataTimeMap_t> Result_Time_fused(
       SumUpPerLevel<MPQCDataTimeMap_t, MPQCDataTimeVector_t>(
-          fragmentData, jobids, MatrixNrLookup, container, subsetmap));
+          fragmentData, MatrixNrLookup, container, subsetmap));
 
     // force has extra converter
-    std::vector<MPQCDataForceMap_t> MPQCData_Force_fused;
+    std::map<JobId_t, MPQCDataForceMap_t> MPQCData_Force_fused;
     convertMPQCDatatoForceMap(fragmentData, ForceKeySet, MPQCData_Force_fused);
     std::vector<MPQCDataForceMap_t> Result_Force_fused(subsetmap->getMaximumSubsetLevel());
@@ -427,5 +433,4 @@
                 subsetmap,
                 MPQCData_Force_fused,
-                jobids,
                 container->getContainer(),
                 MatrixNrLookup,
@@ -496,6 +501,4 @@
 /** Print MPQCData from received results.
  *
- * @param fragmentresults results with short-range job ids to associate with fragment number
- * @param longrangeresults results with long-range job ids to associate with fragment number
  * @param fragmentData MPQCData resulting from the jobs
  * @param longrangeData VMGData resulting from long-range jobs
@@ -506,8 +509,6 @@
  */
 bool printReceivedFullResults(
-    const std::vector<FragmentResult::ptr> &fragmentresults,
-    const std::vector<FragmentResult::ptr> &longrangeresults,
-    const std::vector<MPQCData> &fragmentData,
-    const std::vector<VMGData> &longrangeData,
+    const std::map<JobId_t,MPQCData> &fragmentData,
+    const std::map<JobId_t,VMGData> &longrangeData,
     const VMGData &fullsolutionData,
     const std::string &KeySetFilename,
@@ -515,9 +516,10 @@
     SamplingGrid &full_sample)
 {
-  // create a vector of all job ids from short-range
-  std::vector<JobId_t> jobids(fragmentresults.size(), JobId::IllegalJob);
-  std::transform(fragmentresults.begin(), fragmentresults.end(), jobids.begin(),
-      boost::bind(&FragmentResult::getId,
-          boost::bind(&FragmentResult::ptr::operator->, _1)));
+  // create a vector of all job ids
+  std::vector<JobId_t> jobids;
+  std::transform(fragmentData.begin(),fragmentData.end(),
+      std::back_inserter(jobids),
+      boost::bind( &std::map<JobId_t,MPQCData>::value_type::first, boost::lambda::_1 )
+  );
 
   // create lookup from job nr to fragment number
@@ -555,17 +557,17 @@
     std::vector<MPQCDataEnergyMap_t> Result_Energy_fused(
         OrthogonalSumUpPerLevel<MPQCDataEnergyMap_t, MPQCDataEnergyVector_t>(
-            fragmentData, jobids, MatrixNrLookup, container, subsetmap));
+            fragmentData, MatrixNrLookup, container, subsetmap));
     std::vector<MPQCDataGridMap_t> Result_Grid_fused(
       OrthogonalSumUpPerLevel<MPQCDataGridMap_t, MPQCDataGridVector_t>(
-          fragmentData, jobids, MatrixNrLookup, container, subsetmap));
+          fragmentData, MatrixNrLookup, container, subsetmap));
     std::vector<MPQCDataTimeMap_t> Result_Time_fused(
       SumUpPerLevel<MPQCDataTimeMap_t, MPQCDataTimeVector_t>(
-          fragmentData, jobids, MatrixNrLookup, container, subsetmap));
+          fragmentData, MatrixNrLookup, container, subsetmap));
     std::vector<MPQCDataFragmentMap_t> Result_Fragment_fused(
       OrthogonalSumUpPerLevel<MPQCDataFragmentMap_t, MPQCDataFragmentVector_t>(
-          fragmentData, jobids, MatrixNrLookup, container, subsetmap));
+          fragmentData, MatrixNrLookup, container, subsetmap));
 
     // force has extra converter
-    std::vector<MPQCDataForceMap_t> MPQCData_Force_fused;
+    std::map<JobId_t, MPQCDataForceMap_t> MPQCData_Force_fused;
     convertMPQCDatatoForceMap(fragmentData, ForceKeySet, MPQCData_Force_fused);
     std::vector<MPQCDataForceMap_t> Result_Force_fused(subsetmap->getMaximumSubsetLevel());
@@ -573,5 +575,4 @@
                 subsetmap,
                 MPQCData_Force_fused,
-                jobids,
                 container->getContainer(),
                 MatrixNrLookup,
@@ -580,10 +581,9 @@
 
     // obtain full grid
-    std::vector<VMGDataMap_t> VMGData_Potential_fused;
+    std::map<JobId_t, VMGDataMap_t> VMGData_Potential_fused;
     convertDataTo<VMGData, VMGDataMap_t>(longrangeData, VMGData_Potential_fused);
     OrthogonalFullSummator<VMGDataMap_t, VMGDataFused::sampled_potential> potentialSummer(
                 subsetmap,
                 VMGData_Potential_fused,
-                jobids,
                 container->getContainer(),
                 MatrixNrLookup);
@@ -592,5 +592,4 @@
                 subsetmap,
                 VMGData_Potential_fused,
-                jobids,
                 container->getContainer(),
                 MatrixNrLookup);
@@ -605,5 +604,4 @@
                 subsetmap,
                 VMGData_Potential_fused,
-                jobids,
                 container->getContainer(),
                 MatrixNrLookup);
@@ -685,5 +683,5 @@
     FragmentController &controller,
     const FragmentationFragmentationAutomationAction::FragmentationFragmentationAutomationParameters &params,
-    const std::vector<MPQCData> &fragmentData,
+    const std::map<JobId_t, MPQCData> &fragmentData,
     const SamplingGrid &full_sampled_grid,
     const Fragment &full_fragment)
@@ -692,11 +690,11 @@
   // add one job for each fragment as the short-range correction which we need
   // to subtract from the obtained full potential to get the long-range part only
-  for (std::vector<MPQCData>::const_iterator iter = fragmentData.begin();
+  for (std::map<JobId_t, MPQCData>::const_iterator iter = fragmentData.begin();
       iter != fragmentData.end(); ++iter) {
     const JobId_t next_id = controller.getAvailableId();
-    LOG(1, "INFO: Creating VMGJob with " << iter->sampled_grid.sampled_grid.size()
-        << " gridpoints and " << iter->charges.size() << " particle charges.");
+    LOG(1, "INFO: Creating VMGJob with " << iter->second.sampled_grid.sampled_grid.size()
+        << " gridpoints and " << iter->second.charges.size() << " particle charges.");
     FragmentJob::ptr testJob(
-        new VMGJob(next_id, iter->sampled_grid, iter->positions, iter->charges) );
+        new VMGJob(next_id, iter->second.sampled_grid, iter->second.positions, iter->second.charges) );
     jobs.push_back(testJob);
   }
@@ -776,5 +774,5 @@
   RunService(io_service, "Requesting short-range results");
   std::vector<FragmentResult::ptr> MPQCresults = controller.getReceivedResults();
-  std::vector<MPQCData> fragmentData;
+  std::map<JobId_t, MPQCData> fragmentData;
   ConvertFragmentResultTo<MPQCData>(MPQCresults, fragmentData);
 
@@ -795,5 +793,4 @@
   Fragment full_fragment;
   sumUpChargeDensity(
-      jobids,
       fragmentData,
       params.path.get(),
@@ -818,9 +815,9 @@
       "FragmentationFragmentationAutomationAction::performCall() - number of MPQCresultd and VMGresults don't match.");
 
-  std::vector<VMGData> longrangeData;
+  std::map<JobId_t, VMGData> longrangeData;
   ConvertFragmentResultTo<VMGData>(VMGresults, longrangeData);
-  // remove full solution from vector, has to be treated extra
-  VMGData fullsolutionData = longrangeData.back();
-  longrangeData.pop_back();
+  // remove full solution from map (must be highest id), has to be treated extra
+  VMGData fullsolutionData = (--longrangeData.end())->second;
+  longrangeData.erase(--longrangeData.end());
 
   // Final phase: print result
@@ -828,6 +825,4 @@
     LOG(1, "INFO: Parsing fragment files from " << params.path.get() << ".");
     printReceivedFullResults(
-        MPQCresults,
-        VMGresults,
         fragmentData,
         longrangeData,
@@ -843,5 +838,4 @@
     LOG(1, "INFO: Parsing fragment files from " << params.path.get() << ".");
     printReceivedMPQCResults(
-        jobids,
         fragmentData,
         params.path.get(),
Index: src/Fragmentation/Converter/DataConverter.hpp
===================================================================
--- src/Fragmentation/Converter/DataConverter.hpp	(revision 995e2f630769a5f3b1bfaa3010c8e6eb0e1f0a9e)
+++ src/Fragmentation/Converter/DataConverter.hpp	(revision c9f9bbb2d96080528233d702e81243480b34033d)
@@ -15,5 +15,5 @@
 #endif
 
-#include <vector>
+#include <map>
 #include <boost/fusion/sequence.hpp>
 
@@ -38,6 +38,6 @@
 template <typename source, typename dest>
 inline void convertDataTo(
-    const std::vector<source> &fragmentData,
-    std::vector<dest> &MPQCData_fused)
+    const std::map<JobId_t, source> &fragmentData,
+    std::map<JobId_t, dest> &MPQCData_fused)
 {
   MPQCData_fused.clear();
@@ -46,13 +46,12 @@
 template <>
 inline void convertDataTo<MPQCData, MPQCDataEnergyMap_t>(
-    const std::vector<MPQCData> &fragmentData,
-    std::vector<MPQCDataEnergyMap_t> &MPQCData_Energy_fused)
+    const std::map<JobId_t, MPQCData> &fragmentData,
+    std::map<JobId_t, 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();
+  for(std::map<JobId_t, MPQCData>::const_iterator dataiter = fragmentData.begin();
       dataiter != fragmentData.end(); ++dataiter) {
-    const MPQCData &extractedData = *dataiter;
+    const MPQCData &extractedData = dataiter->second;
     LOG(4, "DEBUG: Current extracted Data is " << extractedData << ".");
     MPQCDataEnergyMap_t instance;
@@ -66,5 +65,5 @@
     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);
+    MPQCData_Energy_fused.insert( std::make_pair(dataiter->first, instance) );
   }
 }
@@ -73,13 +72,12 @@
 template <>
 inline void convertDataTo<VMGData, VMGDataMap_t>(
-    const std::vector<VMGData> &longrangeData,
-    std::vector<VMGDataMap_t> &VMGData_fused)
+    const std::map<JobId_t, VMGData> &longrangeData,
+    std::map<JobId_t, VMGDataMap_t> &VMGData_fused)
 {
   // energy_t
   VMGData_fused.clear();
-  VMGData_fused.reserve(longrangeData.size());
-  for(std::vector<VMGData>::const_iterator dataiter = longrangeData.begin();
+  for(std::map<JobId_t, VMGData>::const_iterator dataiter = longrangeData.begin();
       dataiter != longrangeData.end(); ++dataiter) {
-    const VMGData &extractedData = *dataiter;
+    const VMGData &extractedData = dataiter->second;
     LOG(4, "DEBUG: Current extracted Data is " << extractedData << ".");
     VMGDataMap_t instance;
@@ -87,5 +85,5 @@
     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);
+    VMGData_fused.insert( std::make_pair(dataiter->first, instance) );
   }
 }
@@ -93,7 +91,7 @@
 
 inline void convertMPQCDatatoForceMap(
-    const std::vector<MPQCData> &fragmentData,
+    const std::map<JobId_t, MPQCData> &fragmentData,
     const KeySetsContainer &ForceKeySet,
-    std::vector<MPQCDataForceMap_t> &MPQCData_Force_fused)
+    std::map<JobId_t, MPQCDataForceMap_t> &MPQCData_Force_fused)
 {
   // forces
@@ -101,9 +99,8 @@
       "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();
+  std::map<JobId_t, MPQCData>::const_iterator dataiter = fragmentData.begin();
   KeySetsContainer::ArrayOfIntVectors::const_iterator arrayiter = ForceKeySet.KeySets.begin();
   for(;dataiter != fragmentData.end(); ++dataiter, ++arrayiter) {
-    const MPQCData &extractedData = *dataiter;
+    const MPQCData &extractedData = dataiter->second;
     LOG(4, "DEBUG: Current extracted Data is " << extractedData << ".");
     MPQCDataForceMap_t instance;
@@ -112,5 +109,5 @@
     boost::fusion::at_key<MPQCDataFused::forces>(instance) =
         IndexedVectors(indices, extractedData.forces);
-    MPQCData_Force_fused.push_back(instance);
+    MPQCData_Force_fused.insert( std::make_pair(dataiter->first, instance) );
   }
 }
@@ -118,17 +115,16 @@
 template <>
 inline void convertDataTo<MPQCData, MPQCDataGridMap_t>(
-    const std::vector<MPQCData> &fragmentData,
-    std::vector<MPQCDataGridMap_t> &MPQCData_Grid_fused)
+    const std::map<JobId_t, MPQCData> &fragmentData,
+    std::map<JobId_t, 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();
+  for(std::map<JobId_t, MPQCData>::const_iterator dataiter = fragmentData.begin();
       dataiter != fragmentData.end(); ++dataiter) {
-    const MPQCData &extractedData = *dataiter;
+    const MPQCData &extractedData = dataiter->second;
     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);
+    MPQCData_Grid_fused.insert( std::make_pair(dataiter->first, instance) );
   }
 }
@@ -136,18 +132,17 @@
 template <>
 inline void convertDataTo<MPQCData, MPQCDataFragmentMap_t>(
-    const std::vector<MPQCData> &fragmentData,
-    std::vector<MPQCDataFragmentMap_t> &MPQCData_Fragment_fused)
+    const std::map<JobId_t, MPQCData> &fragmentData,
+    std::map<JobId_t, 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();
+  for(std::map<JobId_t, MPQCData>::const_iterator dataiter = fragmentData.begin();
       dataiter != fragmentData.end(); ++dataiter) {
-    const MPQCData &extractedData = *dataiter;
+    const MPQCData &extractedData = dataiter->second;
     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);
+    MPQCData_Fragment_fused.insert( std::make_pair(dataiter->first, instance) );
   }
 }
@@ -155,13 +150,12 @@
 template <>
 inline void convertDataTo<MPQCData, MPQCDataTimeMap_t>(
-    const std::vector<MPQCData> &fragmentData,
-    std::vector<MPQCDataTimeMap_t> &MPQCData_Time_fused)
+    const std::map<JobId_t, MPQCData> &fragmentData,
+    std::map<JobId_t, 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();
+  for(std::map<JobId_t, MPQCData>::const_iterator dataiter = fragmentData.begin();
       dataiter != fragmentData.end(); ++dataiter) {
-    const MPQCData &extractedData = *dataiter;
+    const MPQCData &extractedData = dataiter->second;
     LOG(4, "DEBUG: Current extracted Data is " << extractedData << ".");
     MPQCDataTimeMap_t instance;
@@ -169,5 +163,5 @@
     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);
+    MPQCData_Time_fused.insert( std::make_pair(dataiter->first, instance) );
   }
 }
Index: src/Fragmentation/Summation/AllLevelOrthogonalSummator.hpp
===================================================================
--- src/Fragmentation/Summation/AllLevelOrthogonalSummator.hpp	(revision 995e2f630769a5f3b1bfaa3010c8e6eb0e1f0a9e)
+++ src/Fragmentation/Summation/AllLevelOrthogonalSummator.hpp	(revision c9f9bbb2d96080528233d702e81243480b34033d)
@@ -34,6 +34,5 @@
    *
    * \param _subsetmap map with hierarchy of IndexSet's
-   * \param _data MPQCData converted to MPQCDataMap_t type
-   * \param _jobids job ids to sum data in correct order
+   * \param _data MPQCData converted to MPQCDataMap_t type, associated to the jobid
    * \param _container container of IndexSet's such that each set has correct order
    *        to job id and hence to _data.
@@ -43,6 +42,5 @@
   AllLevelOrthogonalSummator(
       SubsetMap::ptr &_subsetmap,
-      const std::vector<MapType> &_data,
-      const std::vector<JobId_t> &_jobids,
+      const std::map<JobId_t, MapType> &_data,
       const IndexSetContainer::Container_t &_container,
       std::map< JobId_t, size_t > &_MatrixNrLookup,  /* cannot make this const due to operator[] */
@@ -50,5 +48,4 @@
     subsetmap(_subsetmap),
     data(_data),
-    jobids(_jobids),
     container(_container),
     MatrixNrLookup(_MatrixNrLookup),
@@ -70,5 +67,5 @@
     // create OrthogonalSummator instance
     OrthogonalSummator<MapType, MapKey> sum_value(
-        subsetmap, data, jobids, container, MatrixNrLookup
+        subsetmap, data, container, MatrixNrLookup
         );
     const size_t MaxLevel = subsetmap->getMaximumSubsetLevel();
@@ -86,8 +83,6 @@
   //!> 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;
+  //!> map from jobids to data converted from MPQCData
+  const std::map<JobId_t, MapType> &data;
   //!> container with all IndexSet's
   const IndexSetContainer::Container_t &container;
Index: src/Fragmentation/Summation/AllLevelSummator.hpp
===================================================================
--- src/Fragmentation/Summation/AllLevelSummator.hpp	(revision 995e2f630769a5f3b1bfaa3010c8e6eb0e1f0a9e)
+++ src/Fragmentation/Summation/AllLevelSummator.hpp	(revision c9f9bbb2d96080528233d702e81243480b34033d)
@@ -34,6 +34,5 @@
    *
    * \param _subsetmap map with hierarchy of IndexSet's
-   * \param _data MPQCData converted to MPQCDataMap_t type
-   * \param _jobids job ids to sum data in correct order
+   * \param _data MPQCData converted to MPQCDataMap_t type, associated to job id
    * \param _container container of IndexSet's such that each set has correct order
    *        to job id and hence to _data.
@@ -43,6 +42,5 @@
   AllLevelSummator(
       SubsetMap::ptr &_subsetmap,
-      const std::vector<MapType> &_data,
-      const std::vector<JobId_t> &_jobids,
+      const std::map<JobId_t, MapType> &_data,
       const IndexSetContainer::Container_t &_container,
       std::map< JobId_t, size_t > &_MatrixNrLookup,  /* cannot make this const due to operator[] */
@@ -50,5 +48,4 @@
     subsetmap(_subsetmap),
     data(_data),
-    jobids(_jobids),
     container(_container),
     MatrixNrLookup(_MatrixNrLookup),
@@ -70,5 +67,5 @@
     // create Summator instance
     Summator<MapType, MapKey> sum_value(
-        subsetmap, data, jobids, container, MatrixNrLookup
+        subsetmap, data, container, MatrixNrLookup
         );
     const size_t MaxLevel = subsetmap->getMaximumSubsetLevel();
@@ -87,7 +84,5 @@
   SubsetMap::ptr &subsetmap;
   //!> vector of data converted from MPQCData
-  const std::vector<MapType> &data;
-  //!> vector of jobids
-  const std::vector<JobId_t> &jobids;
+  const std::map<JobId_t, MapType> &data;
   //!> container with all IndexSet's
   const IndexSetContainer::Container_t &container;
Index: src/Fragmentation/Summation/OrthogonalFullSummator.hpp
===================================================================
--- src/Fragmentation/Summation/OrthogonalFullSummator.hpp	(revision 995e2f630769a5f3b1bfaa3010c8e6eb0e1f0a9e)
+++ src/Fragmentation/Summation/OrthogonalFullSummator.hpp	(revision c9f9bbb2d96080528233d702e81243480b34033d)
@@ -40,6 +40,5 @@
    *
    * \param _subsetmap map with hierarchy of IndexSet's
-   * \param _data MPQCData converted to MPQCDataMap_t type
-   * \param _jobids job ids to sum data in correct order
+   * \param _data MPQCData converted to MPQCDataMap_t type, associated to job id
    * \param _container container of IndexSet's such that each set has correct order
    *        to job id and hence to _data.
@@ -48,17 +47,14 @@
   OrthogonalFullSummator(
       SubsetMap::ptr &_subsetmap,
-      const std::vector<MapType> &_data,
-      const std::vector<JobId_t> &_jobids,
+      const std::map<JobId_t, MapType> &_data,
       const IndexSetContainer::Container_t &_container,
       std::map< JobId_t, size_t > &_MatrixNrLookup) : /* cannot make this const due to operator[] */
     indices(getSubsets(_container)),
-    values(createValues(_data, _jobids, _container, _MatrixNrLookup)),
+    values(createValues(_data, _container, _MatrixNrLookup)),
     OS(indices, values, _subsetmap)
   {
     ASSERT( _data.size() == _container.size(),
         "OrthogonalFullSummator() - data and indices don't have same size.");
-    ASSERT( _data.size() == _jobids.size(),
-        "OrthogonalFullSummator() - data and ids don't have same size.");
-    ASSERT( _jobids.size() == _MatrixNrLookup.size(),
+    ASSERT( _data.size() == _MatrixNrLookup.size(),
         "OrthogonalFullSummator() - ids and MatrixNrLookup don't have same size.");
   }
@@ -107,5 +103,4 @@
    *
    * @param data
-   * @param jobids
    * @param container
    * @param MatrixNrLookup
@@ -113,16 +108,15 @@
    */
   typename OrthogonalSummation<MapValue>::InputValues_t createValues(
-      const std::vector<MapType> &data,
-      const std::vector<JobId_t> &jobids,
+      const std::map<JobId_t, MapType> &data,
       const IndexSetContainer::Container_t &container,
       std::map< JobId_t, size_t > &MatrixNrLookup)
   {
     typename OrthogonalSummation<MapValue>::InputValues_t values(container.size());
-    typename std::vector<MapType>::const_iterator dataiter = data.begin();
-    std::vector<size_t>::const_iterator iditer = jobids.begin();
-    for (; dataiter != data.end(); ++dataiter, ++iditer) {
-      const MapType &Data = *dataiter;
+    for (typename std::map<JobId_t, MapType>::const_iterator dataiter = data.begin();
+        dataiter != data.end(); ++dataiter) {
+      const MapType &Data = dataiter->second;
+      const JobId_t &jobid = dataiter->first;
       const MapValue &value = boost::fusion::at_key<MapKey>(Data);
-      values[ MatrixNrLookup[*iditer] ] = value;
+      values[ MatrixNrLookup[jobid] ] = value;
     }
     return values;
Index: src/Fragmentation/Summation/OrthogonalSumUpPerLevel.hpp
===================================================================
--- src/Fragmentation/Summation/OrthogonalSumUpPerLevel.hpp	(revision 995e2f630769a5f3b1bfaa3010c8e6eb0e1f0a9e)
+++ src/Fragmentation/Summation/OrthogonalSumUpPerLevel.hpp	(revision c9f9bbb2d96080528233d702e81243480b34033d)
@@ -29,6 +29,5 @@
 template <typename TypeMap, typename TypeVector>
 std::vector<TypeMap> OrthogonalSumUpPerLevel(
-    const std::vector<MPQCData> &fragmentData,
-    const std::vector<JobId_t> &jobids,
+    const std::map<JobId_t, MPQCData> &fragmentData,
     std::map< JobId_t, size_t > &MatrixNrLookup,
     const IndexSetContainer::ptr &container,
@@ -37,5 +36,5 @@
 {
   // place data into boost::fusion::map instance
-  std::vector<TypeMap> MPQCData_fused;
+  std::map<JobId_t, TypeMap> MPQCData_fused;
   convertDataTo<MPQCData, TypeMap>(fragmentData, MPQCData_fused);
   // instantiate summator
@@ -44,5 +43,4 @@
               subsetmap,
               MPQCData_fused,
-              jobids,
               container->getContainer(),
               MatrixNrLookup,
Index: src/Fragmentation/Summation/OrthogonalSummator.hpp
===================================================================
--- src/Fragmentation/Summation/OrthogonalSummator.hpp	(revision 995e2f630769a5f3b1bfaa3010c8e6eb0e1f0a9e)
+++ src/Fragmentation/Summation/OrthogonalSummator.hpp	(revision c9f9bbb2d96080528233d702e81243480b34033d)
@@ -63,6 +63,5 @@
    *
    * \param _subsetmap map with hierarchy of IndexSet's
-   * \param _data MPQCData converted to MPQCDataMap_t type
-   * \param _jobids job ids to sum data in correct order
+   * \param _data MPQCData converted to MPQCDataMap_t type, associated to job id
    * \param _container container of IndexSet's such that each set has correct order
    *        to job id and hence to _data.
@@ -71,15 +70,12 @@
   OrthogonalSummator(
       SubsetMap::ptr &_subsetmap,
-      const std::vector<MapType> &_data,
-      const std::vector<JobId_t> &_jobids,
+      const std::map<JobId_t, MapType> &_data,
       const IndexSetContainer::Container_t &_container,
       std::map< JobId_t, size_t > &_MatrixNrLookup) : /* cannot make this const due to operator[] */
     indices(getSubsets(_data.size(),_container)),
-    values(createValues(_data, _jobids, _container, _MatrixNrLookup)),
+    values(createValues(_data, _container, _MatrixNrLookup)),
     OS(indices, values, _subsetmap)
   {
-    ASSERT( _data.size() == _jobids.size(),
-        "OrthogonalSummator() - data and ids don't have same size.");
-    ASSERT( _jobids.size() == _MatrixNrLookup.size(),
+    ASSERT( _data.size() == _MatrixNrLookup.size(),
         "OrthogonalSummator() - ids and MatrixNrLookup don't have same size.");
   }
@@ -124,5 +120,4 @@
    *
    * @param data
-   * @param jobids
    * @param container
    * @param MatrixNrLookup
@@ -130,6 +125,5 @@
    */
   typename OrthogonalSummation<MapValue>::InputValues_t createValues(
-      const std::vector<MapType> &data,
-      const std::vector<JobId_t> &jobids,
+      const std::map<JobId_t, MapType> &data,
       const IndexSetContainer::Container_t &container,
       std::map< JobId_t, size_t > &MatrixNrLookup)
@@ -137,10 +131,10 @@
     // if the power set of , we don't need to get rid of the "union index set"
     typename OrthogonalSummation<MapValue>::InputValues_t values(data.size());
-    typename std::vector<MapType>::const_iterator dataiter = data.begin();
-    std::vector<size_t>::const_iterator iditer = jobids.begin();
-    for (; dataiter != data.end(); ++dataiter, ++iditer) {
-      const MapType &Data = *dataiter;
+    for (typename std::map<JobId_t, MapType>::const_iterator dataiter = data.begin();
+        dataiter != data.end(); ++dataiter) {
+      const MapType &Data = dataiter->second;
+      const JobId_t &jobid = dataiter->first;
       const MapValue &value = boost::fusion::at_key<MapKey>(Data);
-      values[ MatrixNrLookup[*iditer] ] = value;
+      values[ MatrixNrLookup[jobid] ] = value;
     }
     return values;
Index: src/Fragmentation/Summation/SumUpPerLevel.hpp
===================================================================
--- src/Fragmentation/Summation/SumUpPerLevel.hpp	(revision 995e2f630769a5f3b1bfaa3010c8e6eb0e1f0a9e)
+++ src/Fragmentation/Summation/SumUpPerLevel.hpp	(revision c9f9bbb2d96080528233d702e81243480b34033d)
@@ -28,6 +28,5 @@
 template <typename TypeMap, typename TypeVector>
 std::vector<TypeMap> SumUpPerLevel(
-    const std::vector<MPQCData> &fragmentData,
-    const std::vector<JobId_t> &jobids,
+    const std::map<JobId_t, MPQCData> &fragmentData,
     std::map< JobId_t, size_t > &MatrixNrLookup,
     const IndexSetContainer::ptr &container,
@@ -36,5 +35,5 @@
 {
   // place data into boost::fusion::map instance
-  std::vector<TypeMap> MPQCData_fused;
+  std::map<JobId_t, TypeMap> MPQCData_fused;
   convertDataTo<MPQCData, TypeMap>(fragmentData, MPQCData_fused);
   // instantiate summator
@@ -43,5 +42,4 @@
               subsetmap,
               MPQCData_fused,
-              jobids,
               container->getContainer(),
               MatrixNrLookup,
Index: src/Fragmentation/Summation/Summator.hpp
===================================================================
--- src/Fragmentation/Summation/Summator.hpp	(revision 995e2f630769a5f3b1bfaa3010c8e6eb0e1f0a9e)
+++ src/Fragmentation/Summation/Summator.hpp	(revision c9f9bbb2d96080528233d702e81243480b34033d)
@@ -63,6 +63,5 @@
    *
    * \param _subsetmap map with hierarchy of IndexSet's
-   * \param _data MPQCData converted to MPQCDataMap_t type
-   * \param _jobids job ids to sum data in correct order
+   * \param _data MPQCData converted to MPQCDataMap_t type, associated to job id
    * \param _container container of IndexSet's such that each set has correct order
    *        to job id and hence to _data.
@@ -71,15 +70,12 @@
   Summator(
       SubsetMap::ptr &_subsetmap,
-      const std::vector<MapType> &_data,
-      const std::vector<JobId_t> &_jobids,
+      const std::map<JobId_t, MapType> &_data,
       const IndexSetContainer::Container_t &_container,
       std::map< JobId_t, size_t > &_MatrixNrLookup) : /* cannot make this const due to operator[] */
     indices(getSubsets(_data.size(),_container)),
-    values(createValues(_data, _jobids, _container, _MatrixNrLookup)),
+    values(createValues(_data, _container, _MatrixNrLookup)),
     OS(indices, values, _subsetmap)
   {
-    ASSERT( _data.size() == _jobids.size(),
-        "Summator() - data and ids don't have same size.");
-    ASSERT( _jobids.size() == _MatrixNrLookup.size(),
+    ASSERT( _data.size() == _MatrixNrLookup.size(),
         "Summator() - ids and MatrixNrLookup don't have same size.");
   }
@@ -124,5 +120,4 @@
    *
    * @param data
-   * @param jobids
    * @param container
    * @param MatrixNrLookup
@@ -130,6 +125,5 @@
    */
   typename Summation<MapValue>::InputValues_t createValues(
-      const std::vector<MapType> &data,
-      const std::vector<JobId_t> &jobids,
+      const std::map<JobId_t, MapType> &data,
       const IndexSetContainer::Container_t &container,
       std::map< JobId_t, size_t > &MatrixNrLookup)
@@ -137,10 +131,10 @@
     // if we just have one indexset, we don't need to get rid of the "union index set"
     typename Summation<MapValue>::InputValues_t values(data.size());
-    typename std::vector<MapType>::const_iterator dataiter = data.begin();
-    std::vector<size_t>::const_iterator iditer = jobids.begin();
-    for (; dataiter != data.end(); ++dataiter, ++iditer) {
-      const MapType &Data = *dataiter;
+    for (typename std::map<JobId_t, MapType>::const_iterator dataiter = data.begin();
+        dataiter != data.end(); ++dataiter) {
+      const MapType &Data = dataiter->second;
+      const JobId_t &jobid = dataiter->first;
       const MapValue &value = boost::fusion::at_key<MapKey>(Data);
-      values[ MatrixNrLookup[*iditer] ] = value;
+      values[ MatrixNrLookup[jobid] ] = value;
     }
     return values;
Index: src/UIElements/Makefile.am
===================================================================
--- src/UIElements/Makefile.am	(revision 995e2f630769a5f3b1bfaa3010c8e6eb0e1f0a9e)
+++ src/UIElements/Makefile.am	(revision c9f9bbb2d96080528233d702e81243480b34033d)
@@ -253,4 +253,5 @@
 endif
 libMolecuilderUI_la_LIBADD += \
+	libMolecuilderFragmentationConverter.la \
 	libMolecuilderFragmentationSummation.la \
 	libMolecuilderFragmentationSetValues.la \
