Index: src/Fragmentation/Automation/VMGFragmentController.cpp
===================================================================
--- src/Fragmentation/Automation/VMGFragmentController.cpp	(revision 17e4fde191dda907bf7bd206803886c13e02d440)
+++ src/Fragmentation/Automation/VMGFragmentController.cpp	(revision a9099d81f7976517594383e2252b45063eed2328)
@@ -47,4 +47,6 @@
 #include "Jobs/VMGJob.hpp"
 #include "molecule.hpp"
+#include "Potentials/Particles/Particle.hpp"
+#include "Potentials/Particles/ParticleRegistry.hpp"
 #include "World.hpp"
 
@@ -77,5 +79,6 @@
     const bool _DoPrintDebug,
     const bool _OpenBoundaryConditions,
-    const bool _DoSmearCharges)
+    const bool _DoSmearCharges,
+    const bool _UseImplicitCharges)
 {
   std::vector<FragmentJob::ptr> jobs;
@@ -110,7 +113,8 @@
   std::vector< std::vector<double> > positions;
   std::vector<double> charges;
+  const World &world = const_cast<const World &>(World::getInstance());
+  const ParticleRegistry &registry = const_cast<const ParticleRegistry &>(ParticleRegistry::getInstance());
   {
-    const World::ConstAtomComposite &atoms = const_cast<const World &>(World::getInstance()).
-        getAllAtoms();
+    const World::ConstAtomComposite &atoms = world.getAllAtoms();
     positions.reserve(atoms.size());
     charges.reserve(atoms.size());
@@ -118,13 +122,30 @@
     for (World::ConstAtomComposite::const_iterator iter = atoms.begin();
         iter != atoms.end(); ++iter) {
+      // set position for this atom
       const Vector &pos = (*iter)->getPosition();
       // convert positions to atomic length units
-      for (size_t i=0;i<3;++i) position[i] = pos[i]/AtomicLengthToAngstroem;
-      positions.push_back(position);
-      int charge = (*iter)->getElement().getAtomicNumber();
-      // subtract core electron charge from nuclei charge if only valence sampled
-      if (_DoValenceOnly == MPQCData::DoSampleValenceOnly)
-        charge -= getCoreElectrons(charge);
-      charges.push_back((double)charge);
+      for (size_t i=0;i<3;++i)
+        position[i] = pos[i]/AtomicLengthToAngstroem;
+
+      // use partial charges ...
+      const atomId_t atomid = (*iter)->getId();
+      if ((!world.isAtomSelected(atomid)) && (_UseImplicitCharges)) {
+        // ... for all unselected particles ...
+        const std::string &symbol = (*iter)->getElement().getSymbol();
+        if (registry.isPresentByName(symbol)) {
+          // ... that are present in ParticleRegistry
+          const Particle * const particle = registry.getByName(symbol);
+          LOG(3, "DEBUG: Using implicit charge " << particle->charge << " for atom " << atomid);
+          positions.push_back(position);
+          charges.push_back(particle->charge);
+        }
+      } else {
+        double charge = (*iter)->getElement().getAtomicNumber();
+        // subtract core electron charge from nuclei charge if only valence sampled
+        if (_DoValenceOnly == MPQCData::DoSampleValenceOnly)
+          charge -= getCoreElectrons(charge);
+        positions.push_back(position);
+        charges.push_back((double)charge);
+      }
     }
   }
Index: src/Fragmentation/Automation/VMGFragmentController.hpp
===================================================================
--- src/Fragmentation/Automation/VMGFragmentController.hpp	(revision 17e4fde191dda907bf7bd206803886c13e02d440)
+++ src/Fragmentation/Automation/VMGFragmentController.hpp	(revision a9099d81f7976517594383e2252b45063eed2328)
@@ -64,4 +64,6 @@
    *        boundary conditions
    * \param _DoSmearCharges whether to smear out electronic charge distributions with bsplines or not
+   * \param _UseImplicitCharges use implicit charges in potential storage if
+   * 		element is found
    */
   bool createLongRangeJobs(
@@ -75,5 +77,6 @@
       const bool _DoPrintDebug,
       const bool _OpenBoundaryConditions = false,
-      const bool _DoSmearCharges = false);
+      const bool _DoSmearCharges = false,
+      const bool _UseImplicitCharges = false);
 
   void waitforResults(const size_t NoExpectedResults)
