Index: src/Actions/FragmentationAction/AnalyseFragmentationResultsAction.cpp
===================================================================
--- src/Actions/FragmentationAction/AnalyseFragmentationResultsAction.cpp	(revision 83a425eb7c3e26118a81096a43c79ffe877b2113)
+++ src/Actions/FragmentationAction/AnalyseFragmentationResultsAction.cpp	(revision 94db134a7b8bcdb17a2134fe1c6ca1aed4aded49)
@@ -251,4 +251,14 @@
     filename += FRAGMENTPREFIX + std::string("_VMGEnergy.dat");
     writeToFile(filename, gridresult);
+  }
+
+  if (results.hasLongRangeForces()) {
+    const std::string forceresult =
+        writeTable<VMGDataForceMap_t, VMGDataForceVector_t>()(
+            results.Result_ForceLongRange_fused, results.getMaxLevel());
+    LOG(2, "DEBUG: Force table is \n" << forceresult);
+    std::string filename;
+    filename += FRAGMENTPREFIX + std::string("_VMGForces.dat");
+    writeToFile(filename, forceresult);
   }
 
Index: src/Actions/FragmentationAction/FragmentationAutomationAction.cpp
===================================================================
--- src/Actions/FragmentationAction/FragmentationAutomationAction.cpp	(revision 83a425eb7c3e26118a81096a43c79ffe877b2113)
+++ src/Actions/FragmentationAction/FragmentationAutomationAction.cpp	(revision 94db134a7b8bcdb17a2134fe1c6ca1aed4aded49)
@@ -316,5 +316,6 @@
         destiter->second.both_sampled_potential = srciter->second.sampled_potential;
         destiter->second.nuclei_long = srciter->second.nuclei_long;
-        destiter->second.particle_forces = srciter->second.particle_forces;
+        destiter->second.forces = srciter->second.forces;
+        destiter->second.hasForces = srciter->second.hasForces;
       }
     }
Index: src/Fragmentation/Summation/Containers/FragmentationLongRangeResults.cpp
===================================================================
--- src/Fragmentation/Summation/Containers/FragmentationLongRangeResults.cpp	(revision 83a425eb7c3e26118a81096a43c79ffe877b2113)
+++ src/Fragmentation/Summation/Containers/FragmentationLongRangeResults.cpp	(revision 94db134a7b8bcdb17a2134fe1c6ca1aed4aded49)
@@ -65,5 +65,6 @@
     const KeySetsContainer& _ForceKeySet) :
     KeySet(_KeySet),
-    ForceKeySet(_ForceKeySet)
+    ForceKeySet(_ForceKeySet),
+    hasForces((!longrangeData.empty()) && (longrangeData.begin()->second.hasForces))
 {
   initLookups(fragmentData, longrangeData);
@@ -125,4 +126,20 @@
         longrangeData, VMGMatrixNrLookup, container, subsetmap,
         Result_LongRange_fused, Result_perIndexSet_LongRange);
+
+    if (hasLongRangeForces()) {
+      // force has extra data converter (this is similar to MPQCData's forces
+      std::map<JobId_t, VMGDataForceMap_t> VMGData_Force_fused;
+      convertDatatoForceMap<VMGData, VMGDataForceMap_t, VMGDataFused>(
+          longrangeData, ForceKeySet, VMGData_Force_fused);
+      Result_ForceLongRange_fused.resize(MaxLevel); // we need the results of correct size already
+      AllLevelOrthogonalSummator<VMGDataForceMap_t> forceSummer(
+                  subsetmap,
+                  VMGData_Force_fused,
+                  container->getContainer(),
+                  VMGMatrixNrLookup,
+                  Result_ForceLongRange_fused,
+                  Result_perIndexSet_LongRange_Force);
+      boost::mpl::for_each<VMGDataForceVector_t>(boost::ref(forceSummer));
+    }
 
     // then sum up
Index: src/Fragmentation/Summation/Containers/FragmentationLongRangeResults.hpp
===================================================================
--- src/Fragmentation/Summation/Containers/FragmentationLongRangeResults.hpp	(revision 83a425eb7c3e26118a81096a43c79ffe877b2113)
+++ src/Fragmentation/Summation/Containers/FragmentationLongRangeResults.hpp	(revision 94db134a7b8bcdb17a2134fe1c6ca1aed4aded49)
@@ -87,4 +87,7 @@
   }
 
+  const bool hasLongRangeForces() const
+  { return hasForces; }
+
 private:
   void initLookups(
@@ -100,10 +103,14 @@
   IndexSetContainer::ptr container;
   SubsetMap::ptr subsetmap;
+  //!> indicates whether the longrange results contain VMG forces data or not
+  bool hasForces;
 
 public:
   //!> results per level of summed up sampled grid charge
   std::vector<MPQCDataGridMap_t> Result_Grid_fused;
-  //!> results per level of summed up long range energy and forces
+  //!> results per level of summed up long range energies
   std::vector<VMGDataMap_t> Result_LongRange_fused;
+  //!> results per level of summed up long range forces
+  std::vector<VMGDataForceMap_t> Result_ForceLongRange_fused;
   //!> results per level of summed up long range potential grids
   std::vector<VMGDataGridMap_t> Result_GridLongRange_fused;
@@ -113,6 +120,8 @@
   //!> results per IndexSet of summed up sampled grid charge
   std::map<IndexSet::ptr, std::pair<MPQCDataGridMap_t,MPQCDataGridMap_t> > Result_perIndexSet_Grid;
-  //!> results per IndexSet of summed up long range energy and forces
+  //!> results per IndexSet of summed up long range energies
   std::map<IndexSet::ptr, std::pair<VMGDataMap_t, VMGDataMap_t> > Result_perIndexSet_LongRange;
+  //!> results per IndexSet of summed up long range forces
+  std::map<IndexSet::ptr, std::pair<VMGDataForceMap_t, VMGDataForceMap_t> > Result_perIndexSet_LongRange_Force;
   //!> results per IndexSet of summed up long range potential grids
   std::map<IndexSet::ptr, std::pair<VMGDataGridMap_t, VMGDataGridMap_t> > Result_perIndexSet_LongRange_Grid;
Index: src/Fragmentation/Summation/Containers/FragmentationShortRangeResults.cpp
===================================================================
--- src/Fragmentation/Summation/Containers/FragmentationShortRangeResults.cpp	(revision 83a425eb7c3e26118a81096a43c79ffe877b2113)
+++ src/Fragmentation/Summation/Containers/FragmentationShortRangeResults.cpp	(revision 94db134a7b8bcdb17a2134fe1c6ca1aed4aded49)
@@ -109,5 +109,5 @@
     // force has extra data converter
     std::map<JobId_t, MPQCDataForceMap_t> MPQCData_Force_fused;
-    convertMPQCDatatoForceMap(fragmentData, ForceKeySet, MPQCData_Force_fused);
+    convertDatatoForceMap<MPQCData, MPQCDataForceMap_t, MPQCDataFused>(fragmentData, ForceKeySet, MPQCData_Force_fused);
     Result_Force_fused.resize(MaxLevel); // we need the results of correct size already
     AllLevelOrthogonalSummator<MPQCDataForceMap_t> forceSummer(
Index: src/Fragmentation/Summation/Containers/MPQCDataFused.hpp
===================================================================
--- src/Fragmentation/Summation/Containers/MPQCDataFused.hpp	(revision 83a425eb7c3e26118a81096a43c79ffe877b2113)
+++ src/Fragmentation/Summation/Containers/MPQCDataFused.hpp	(revision 94db134a7b8bcdb17a2134fe1c6ca1aed4aded49)
@@ -22,5 +22,5 @@
  * instance when going throughb the list with boost::mpl::for_each.
  */
-namespace MPQCDataFused {
+struct MPQCDataFused {
   // keys for energy_t
   struct energy_total {};
@@ -51,5 +51,5 @@
   struct times_gather_cputime {};
   struct times_gather_flops {};
-}
+};
 
 
Index: src/Fragmentation/Summation/Containers/VMGData.cpp
===================================================================
--- src/Fragmentation/Summation/Containers/VMGData.cpp	(revision 83a425eb7c3e26118a81096a43c79ffe877b2113)
+++ src/Fragmentation/Summation/Containers/VMGData.cpp	(revision 94db134a7b8bcdb17a2134fe1c6ca1aed4aded49)
@@ -44,5 +44,6 @@
   sampled_potential(_props),
   nuclei_long(0.),
-  electron_long(0.)
+  electron_long(0.),
+  hasForces(false)
 {}
 
@@ -54,5 +55,5 @@
   ost << "Nuclei long-Range energy: " << data.nuclei_long << std::endl;
   ost << "Electron long-Range energy: " << data.electron_long << std::endl;
-  ost << "Nuclei long-Range forces: " << data.particle_forces << std::endl;
+  ost << "Nuclei long-Range forces: " << data.forces << std::endl;
   return ost;
 }
Index: src/Fragmentation/Summation/Containers/VMGData.hpp
===================================================================
--- src/Fragmentation/Summation/Containers/VMGData.hpp	(revision 83a425eb7c3e26118a81096a43c79ffe877b2113)
+++ src/Fragmentation/Summation/Containers/VMGData.hpp	(revision 94db134a7b8bcdb17a2134fe1c6ca1aed4aded49)
@@ -50,5 +50,8 @@
   double electron_long;
   //!> force vectors of all nuclei
-  FragmentForces particle_forces;
+  FragmentForces forces;
+
+  //!> internal value to check when we should sum forces and when not
+  bool hasForces;
 
 private:
@@ -64,6 +67,9 @@
       ar & nuclei_long;
     ar & electron_long;
-    if (version > 2)
-      ar & particle_forces;
+    if (version > 2) {
+      ar & forces;
+      hasForces = true;
+    } else
+      hasForces = false;
   }
 };
Index: src/Fragmentation/Summation/Containers/VMGDataFused.hpp
===================================================================
--- src/Fragmentation/Summation/Containers/VMGDataFused.hpp	(revision 83a425eb7c3e26118a81096a43c79ffe877b2113)
+++ src/Fragmentation/Summation/Containers/VMGDataFused.hpp	(revision 94db134a7b8bcdb17a2134fe1c6ca1aed4aded49)
@@ -23,5 +23,5 @@
  * instance when going throughb the list with boost::mpl::for_each.
  */
-namespace VMGDataFused {
+struct VMGDataFused {
   // keys for sampled_potential
   struct sampled_potential {};
@@ -30,5 +30,5 @@
   struct electron_long {};
   // keys for forces
-  struct particle_forces {};
+  struct forces {};
 
   // keys for longrange
@@ -42,5 +42,5 @@
   struct total_shortrange {};
 
-}
+};
 
 
Index: src/Fragmentation/Summation/Containers/VMGDataMap.hpp
===================================================================
--- src/Fragmentation/Summation/Containers/VMGDataMap.hpp	(revision 83a425eb7c3e26118a81096a43c79ffe877b2113)
+++ src/Fragmentation/Summation/Containers/VMGDataMap.hpp	(revision 94db134a7b8bcdb17a2134fe1c6ca1aed4aded49)
@@ -34,13 +34,26 @@
 typedef boost::fusion::map<
     boost::fusion::pair<VMGDataFused::nuclei_long, double >,
-    boost::fusion::pair<VMGDataFused::electron_long, double >,
-    boost::fusion::pair<VMGDataFused::particle_forces, IndexedVectors >
+    boost::fusion::pair<VMGDataFused::electron_long, double >
 > VMGDataMap_t;
 
 typedef boost::mpl::list<
     VMGDataFused::nuclei_long,
-    VMGDataFused::electron_long,
-	VMGDataFused::particle_forces
+    VMGDataFused::electron_long
 > VMGDataVector_t;
+
+/** This boost::fusion map defines key-value or rather key-type pairs with
+ * which we associate all forces data members in VMGData and their type.
+ *
+ * This lets us resolves any ambiguitites of types in VMGData, e.g.
+ * to know vector<double> is forces or energy_eigenvalues.
+ *
+ */
+typedef boost::fusion::map<
+    boost::fusion::pair<VMGDataFused::forces, IndexedVectors >
+> VMGDataForceMap_t;
+
+typedef boost::mpl::list<
+    VMGDataFused::forces
+> VMGDataForceVector_t;
 
 typedef boost::fusion::map<
Index: src/Fragmentation/Summation/Containers/VMGData_printKeyNames.hpp
===================================================================
--- src/Fragmentation/Summation/Containers/VMGData_printKeyNames.hpp	(revision 83a425eb7c3e26118a81096a43c79ffe877b2113)
+++ src/Fragmentation/Summation/Containers/VMGData_printKeyNames.hpp	(revision 94db134a7b8bcdb17a2134fe1c6ca1aed4aded49)
@@ -38,5 +38,5 @@
   (nuclei_long) \
   (electron_long) \
-  (particle_forces) \
+  (forces) \
   (electron_longrange) \
   (electron_shortrange) \
Index: src/Fragmentation/Summation/Converter/DataConverter.hpp
===================================================================
--- src/Fragmentation/Summation/Converter/DataConverter.hpp	(revision 83a425eb7c3e26118a81096a43c79ffe877b2113)
+++ src/Fragmentation/Summation/Converter/DataConverter.hpp	(revision 94db134a7b8bcdb17a2134fe1c6ca1aed4aded49)
@@ -113,19 +113,20 @@
 #endif
 
-inline void convertMPQCDatatoForceMap(
-    const std::map<JobId_t, MPQCData> &fragmentData,
+template <class datatype, class dataforcemap, class dataforcefused>
+inline void convertDatatoForceMap(
+    const std::map<JobId_t, datatype> &fragmentData,
     const KeySetsContainer &ForceKeySet,
-    std::map<JobId_t, MPQCDataForceMap_t> &MPQCData_Force_fused)
+    std::map<JobId_t, dataforcemap> &Data_Force_fused)
 {
   // forces
   ASSERT( ForceKeySet.KeySets.size() == fragmentData.size(),
       "FragmentationAutomationAction::performCall() - indices and fragmentData differ in size.");
-  MPQCData_Force_fused.clear();
-  std::map<JobId_t, MPQCData>::const_iterator dataiter = fragmentData.begin();
+  Data_Force_fused.clear();
+  typename std::map<JobId_t, datatype>::const_iterator dataiter = fragmentData.begin();
   KeySetsContainer::ArrayOfIntVectors::const_iterator arrayiter = ForceKeySet.KeySets.begin();
   for(;dataiter != fragmentData.end(); ++dataiter, ++arrayiter) {
-    const MPQCData &extractedData = dataiter->second;
-    LOG(4, "DEBUG: Current extracted Data is " << extractedData << ".");
-    MPQCDataForceMap_t instance;
+    const datatype &extractedData = dataiter->second;
+    LOG(4, "DEBUG: Current extracted Data is " << extractedData << ".");
+    dataforcemap instance;
     // must convert int to index_t
     if (DoLog(5)) {
@@ -138,7 +139,7 @@
     }
     IndexedVectors::indices_t indices(arrayiter->begin(), arrayiter->end());
-    boost::fusion::at_key<MPQCDataFused::forces>(instance) =
+    boost::fusion::at_key<typename dataforcefused::forces>(instance) =
         IndexedVectors(indices, extractedData.forces);
-    MPQCData_Force_fused.insert( std::make_pair(dataiter->first, instance) );
+    Data_Force_fused.insert( std::make_pair(dataiter->first, instance) );
   }
 }
Index: src/Jobs/InterfaceVMGJob.cpp
===================================================================
--- src/Jobs/InterfaceVMGJob.cpp	(revision 83a425eb7c3e26118a81096a43c79ffe877b2113)
+++ src/Jobs/InterfaceVMGJob.cpp	(revision 94db134a7b8bcdb17a2134fe1c6ca1aed4aded49)
@@ -355,8 +355,8 @@
   {
     size_t index = 0;
-    returndata.particle_forces.resize(
+    returndata.forces.resize(
         num_particles_local, FragmentForces::force_t(3, 0.) );
-    for (FragmentForces::forces_t::iterator iter = returndata.particle_forces.begin();
-        iter != returndata.particle_forces.end(); ++iter)
+    for (FragmentForces::forces_t::iterator iter = returndata.forces.begin();
+        iter != returndata.forces.end(); ++iter)
       for (size_t i=0;i<3;++i)
           (*iter)[i] = f[index++];
