Index: src/Jobs/InterfaceVMGJob.cpp
===================================================================
--- src/Jobs/InterfaceVMGJob.cpp	(revision 445ce6d3846182eaf130a6a73ea863d0a443e6f0)
+++ src/Jobs/InterfaceVMGJob.cpp	(revision 17e4fde191dda907bf7bd206803886c13e02d440)
@@ -59,4 +59,5 @@
 #include "Fragmentation/Summation/SetValues/FragmentForces.hpp"
 #include "Jobs/WindowGrid_converter.hpp"
+#include "Jobs/ChargeSmearer.hpp"
 
 using namespace VMG;
@@ -75,9 +76,12 @@
     const ImportParticles_t _ImportParticles,
     const bool _DoPrintDebug,
+    const bool _DoSmearCharges,
     int coarseningSteps,
     double alpha) :
   VMG::Interface(boundary, levelMin, levelMax,
       _box_begin, _box_end, coarseningSteps, alpha),
-  spl(near_field_cells, Extent(MaxLevel()).MeshWidth().Max()),
+  nfc(near_field_cells),
+  meshwidth(Extent(MaxLevel()).MeshWidth().Max()),
+  spl(nfc, meshwidth),
   sampled_input(_sampled_input),
   returndata(_returndata),
@@ -85,5 +89,6 @@
   ImportParticles(_ImportParticles),
   DoPrintDebug(_DoPrintDebug),
-  OpenBoundaryCondition(boundary[0] == VMG::Open)
+  OpenBoundaryCondition(boundary[0] == VMG::Open),
+  DoSmearCharges(_DoSmearCharges)
 {
   for (size_t i=0;i<3;++i) {
@@ -159,9 +164,14 @@
 
   // add sampled electron charge density onto grid
+  if (DoSmearCharges) {
+    ChargeSmearer &smearer = ChargeSmearer::getInstance();
+    smearer.initializeSplineArray(spl, nfc, meshwidth);
+  }
   WindowGrid_converter::addWindowOntoGrid(
       grid,
       sampled_input,
       1.,
-      OpenBoundaryCondition);
+      OpenBoundaryCondition,
+      DoSmearCharges);
 
   if (DoPrintDebug) {
Index: src/Jobs/InterfaceVMGJob.hpp
===================================================================
--- src/Jobs/InterfaceVMGJob.hpp	(revision 445ce6d3846182eaf130a6a73ea863d0a443e6f0)
+++ src/Jobs/InterfaceVMGJob.hpp	(revision 17e4fde191dda907bf7bd206803886c13e02d440)
@@ -53,4 +53,5 @@
       const ImportParticles_t _ImportParticles=DoImportParticles,
       const bool _DoPrintDebug=false,
+      const bool _DoSmearCharges=false,
       int coarseningSteps=9,
       double alpha=1.6
@@ -63,4 +64,6 @@
 
 protected:
+  unsigned int nfc;
+  const double meshwidth;
   VMG::Particle::BSpline spl;
 
@@ -88,4 +91,7 @@
   //!> open boundary conditions or not
   const bool OpenBoundaryCondition;
+
+  //!> whether to smear out electronic charge distributions with bsplines or not
+  const bool DoSmearCharges;
 };
 
Index: src/Jobs/VMGJob.cpp
===================================================================
--- src/Jobs/VMGJob.cpp	(revision 445ce6d3846182eaf130a6a73ea863d0a443e6f0)
+++ src/Jobs/VMGJob.cpp	(revision 17e4fde191dda907bf7bd206803886c13e02d440)
@@ -92,5 +92,6 @@
     const bool _DoImportParticles,
     const bool _DoPrintDebug,
-    const bool _OpenBoundaryConditions) :
+    const bool _OpenBoundaryConditions,
+    const bool _DoSmearCharges) :
   FragmentJob(_JobId),
   density_grid(_density_grid),
@@ -102,4 +103,5 @@
   DoPrintDebug(_DoPrintDebug),
   OpenBoundaryConditions(_OpenBoundaryConditions),
+  DoSmearCharges(_DoSmearCharges),
   returndata(static_cast<const SamplingGridProperties &>(_density_grid)),
   particles()
@@ -113,4 +115,5 @@
   DoPrintDebug(false),
   OpenBoundaryConditions(false),
+  DoSmearCharges(false),
   particles()
 {}
@@ -246,5 +249,6 @@
           VMGInterfaces::InterfaceVMGJob::DoImportParticles
           : VMGInterfaces::InterfaceVMGJob::DontImportParticles,
-      DoPrintDebug);
+      DoPrintDebug,
+      DoSmearCharges);
   const int cycle_type = 1; // V-type
   if (OpenBoundaryConditions) {
Index: src/Jobs/VMGJob.hpp
===================================================================
--- src/Jobs/VMGJob.hpp	(revision 445ce6d3846182eaf130a6a73ea863d0a443e6f0)
+++ src/Jobs/VMGJob.hpp	(revision 17e4fde191dda907bf7bd206803886c13e02d440)
@@ -44,4 +44,6 @@
    * @param _DoImportParticles whether we import particles (true) or evaluate only
    * @param _DoPrintDebug whether we do print grid for debug visualization or not
+   * @param _OpenBoundaryConditions whether we have open (true) boundary conditions or periodic (false)
+   * @param _DoSmearCharges whether to smear out electronic charge distributions with bsplines or not
    */
   VMGJob(const JobId_t _JobId,
@@ -53,5 +55,6 @@
       const bool _DoImportParticles=true,
       const bool _DoPrintDebug=false,
-      const bool _OpenBoundaryConditions=false
+      const bool _OpenBoundaryConditions=false,
+      const bool _DoSmearCharges=false
       );
   virtual ~VMGJob();
@@ -81,4 +84,6 @@
   //!> whether we have open (true) boundary conditions or periodic (false)
   const bool OpenBoundaryConditions;
+  //!> whether to smear out electronic charge distributions with bsplines or not
+  const bool DoSmearCharges;
 
 private:
@@ -134,4 +139,5 @@
     ar & const_cast< bool &>(DoPrintDebug);
     ar & const_cast< bool &>(OpenBoundaryConditions);
+    ar & const_cast< bool &>(DoSmearCharges);
     ar & returndata;
   }
Index: src/Jobs/WindowGrid_converter.cpp
===================================================================
--- src/Jobs/WindowGrid_converter.cpp	(revision 445ce6d3846182eaf130a6a73ea863d0a443e6f0)
+++ src/Jobs/WindowGrid_converter.cpp	(revision 17e4fde191dda907bf7bd206803886c13e02d440)
@@ -50,4 +50,5 @@
 
 #include "Fragmentation/Summation/SetValues/SamplingGrid.hpp"
+#include "Jobs/ChargeSmearer.hpp"
 
 void WindowGrid_converter::addGridOntoWindow(
@@ -178,5 +179,6 @@
     const SamplingGrid &grid,
     const double prefactor,
-    const bool OpenBoundaryConditions)
+    const bool OpenBoundaryConditions,
+    const bool DoSmearCharges)
 {
 #ifndef NDEBUG
@@ -265,4 +267,5 @@
   griditer = window.Iterators().Local().Begin();
   SamplingGrid::sampledvalues_t::const_iterator copyiter = grid.sampled_grid.begin();
+  const ChargeSmearer &smearer = ChargeSmearer::getInstance();
   // NOTE: GridIterator::operator+=()'s implementation in vmg is broken. DON'T USE!
 //  griditer += pre_offset[0] * total[1] * total[2];
@@ -293,5 +296,10 @@
         ASSERT( copyiter != grid.sampled_grid.end(),
             "InterfaceVMGJob::addWindowOntoGrid() - griditer is already at end of window.");
-        window(*griditer++) += prefactor*(*copyiter++);
+        // either smear out charges or not.
+        if (DoSmearCharges) {
+          smearer(window, griditer++, prefactor*(*copyiter++));
+        } else {
+          window(*griditer++) += prefactor*(*copyiter++);
+        }
       }
 //      griditer += post_offset[2];
@@ -324,4 +332,5 @@
       "InterfaceVMGJob::addWindowOntoGrid() - copyiter is not at end of window.");
 #endif
-//  LOG(2, "DEBUG: Grid after adding other is " << grid << ".");
+
+  //  LOG(2, "DEBUG: Grid after adding other is " << grid << ".");
 }
Index: src/Jobs/WindowGrid_converter.hpp
===================================================================
--- src/Jobs/WindowGrid_converter.hpp	(revision 445ce6d3846182eaf130a6a73ea863d0a443e6f0)
+++ src/Jobs/WindowGrid_converter.hpp	(revision 17e4fde191dda907bf7bd206803886c13e02d440)
@@ -49,5 +49,6 @@
       const SamplingGrid &grid,
       const double prefactor,
-      const bool OpenBoundaryConditions = false);
+      const bool OpenBoundaryConditions = false,
+      const bool DoSmearCharges = false);
 
 };
