Index: src/Actions/FillAction/FillRegularGridAction.cpp
===================================================================
--- src/Actions/FillAction/FillRegularGridAction.cpp	(revision 42b6de7c684d4c908777f116dccaf00a8e479cf2)
+++ src/Actions/FillAction/FillRegularGridAction.cpp	(revision 531f27764dc2eabbcb727eb49be1867ac1257e30)
@@ -24,4 +24,5 @@
 #include "Atom/AtomicInfo.hpp"
 #include "Atom/CopyAtoms/CopyAtoms_withBonds.hpp"
+#include "Bond/BondInfo.hpp"
 #include "CodePatterns/Log.hpp"
 #include "Descriptors/MoleculeOrderDescriptor.hpp"
@@ -67,5 +68,6 @@
   getParametersfromValueStorage();
 
-  // get the filler molecule and move to origin
+  // get the filler molecule
+  std::vector<AtomicInfo> movedatoms;
   const std::vector< molecule *> molecules = World::getInstance().getSelectedMolecules();
   if (molecules.size() != 1) {
@@ -74,4 +76,6 @@
   }
   molecule *filler = *(molecules.begin());
+  for(molecule::const_iterator iter = filler->begin(); iter != filler->end(); ++iter)
+    movedatoms.push_back( AtomicInfo(*(*iter)) );
   LOG(1, "INFO: Chosen molecule has " << filler->size() << " atoms.");
 
@@ -82,7 +86,8 @@
   Tesselation * TesselStruct = NULL;
   if (params.SphereRadius != 0.) {
-    if ( molecules.size() == 0) {
+    if ( atoms.size() == 0) {
       ELOG(1, "You have given a sphere radius " << params.SphereRadius
           << " != 0, but have not select any molecules.");
+      return Action::failure;
     }
     // create adaptor for the selected atoms
@@ -99,5 +104,5 @@
 
   // create predicate, mesh, and filler
-  std::vector<AtomicInfo> clonedatoms;
+  FillRegularGridState *UndoState = NULL;
   bool successflag = false;
   {
@@ -129,5 +134,7 @@
       delete fillerFunction;
 
-      // append each cluster's atoms to clonedatoms
+      // append each cluster's atoms to clonedatoms (however not selected ones)
+      std::vector<const atom *> clonedatoms;
+      std::vector<AtomicInfo> clonedatominfos;
       for (Filler::ClusterVector_t::const_iterator iter = ClonedClusters.begin();
           iter != ClonedClusters.end(); ++iter) {
@@ -135,10 +142,23 @@
         clonedatoms.reserve(clonedatoms.size()+atoms.size());
         for (AtomIdSet::const_iterator atomiter = atoms.begin(); atomiter != atoms.end(); ++atomiter)
-          clonedatoms.push_back( AtomicInfo(*(*atomiter)) );
+          if (!filler->containsAtom(*atomiter)) {
+            clonedatoms.push_back( *atomiter );
+            clonedatominfos.push_back( AtomicInfo(*(*atomiter)) );
+          }
       }
+      std::vector< BondInfo > clonedbonds;
+      StoreBondInformationFromAtoms(clonedatoms, clonedbonds);
+      LOG(2, "DEBUG: There are " << clonedatominfos.size() << " newly created atoms.");
+
       if (!successflag) {
-        ELOG(1, "Insertion failed, removing inserted clusters again.");
-        RemoveAtomsFromAtomicInfo(clonedatoms);
+        ELOG(1, "Insertion failed, removing inserted clusters, translating original one back");
+        RemoveAtomsFromAtomicInfo(clonedatominfos);
         clonedatoms.clear();
+        SetAtomsFromAtomicInfo(movedatoms);
+      } else {
+        std::vector<Vector> MovedToVector(filler->size(), zeroVec);
+        std::transform(filler->begin(), filler->end(), MovedToVector.begin(),
+            boost::bind(&AtomInfo::getPosition, _1) );
+        UndoState = new FillRegularGridState(clonedatominfos,clonedbonds,movedatoms,MovedToVector,params);
       }
     }
@@ -154,5 +174,5 @@
 
   if (successflag)
-    return Action::state_ptr(new FillRegularGridState(clonedatoms,params));
+    return Action::state_ptr(UndoState);
   else
     return Action::failure;
@@ -164,4 +184,6 @@
   // remove all created atoms
   RemoveAtomsFromAtomicInfo(state->clonedatoms);
+  // add the original cluster
+  SetAtomsFromAtomicInfo(state->movedatoms);
 
   return Action::state_ptr(_state);
@@ -171,5 +193,14 @@
   FillRegularGridState *state = assert_cast<FillRegularGridState*>(_state.get());
 
-  if (AddAtomsFromAtomicInfo(state->clonedatoms))
+  // place filler cluster again at new spot
+  ResetAtomPosition(state->movedatoms, state->MovedToVector);
+
+  // re-create all clusters
+  bool statusflag = AddAtomsFromAtomicInfo(state->clonedatoms);
+
+  // re-create the bonds
+  if (statusflag)
+    AddBondsFromBondInfo(state->clonedbonds);
+  if (statusflag)
     return Action::state_ptr(_state);
   else
Index: src/Actions/FillAction/FillRegularGridAction.def
===================================================================
--- src/Actions/FillAction/FillRegularGridAction.def	(revision 42b6de7c684d4c908777f116dccaf00a8e479cf2)
+++ src/Actions/FillAction/FillRegularGridAction.def	(revision 531f27764dc2eabbcb727eb49be1867ac1257e30)
@@ -7,5 +7,8 @@
 
 // all includes and forward declarations necessary for non-integral types below
-class atom;
+#include <vector>
+#include "Atom/AtomicInfo.hpp"
+#include "Bond/BondInfo.hpp"
+#include "types.hpp"
 
 // i.e. there is an integer with variable name Z that can be found in
@@ -18,6 +21,6 @@
 #define paramreferences (counts)(offset)(mindistance)(SphereRadius)(RandAtomDisplacement)(RandMoleculeDisplacement)(DoRotate)
 
-#define statetypes (std::vector<AtomicInfo>) 
-#define statereferences (clonedatoms) 
+#define statetypes (std::vector<AtomicInfo>)(std::vector<BondInfo>)(std::vector<AtomicInfo>)(std::vector<Vector>)
+#define statereferences (clonedatoms)(clonedbonds)(movedatoms)(MovedToVector)
 
 // some defines for all the names, you may use ACTION, STATE and PARAMS
Index: src/Actions/FillAction/FillSphericalSurfaceAction.cpp
===================================================================
--- src/Actions/FillAction/FillSphericalSurfaceAction.cpp	(revision 42b6de7c684d4c908777f116dccaf00a8e479cf2)
+++ src/Actions/FillAction/FillSphericalSurfaceAction.cpp	(revision 531f27764dc2eabbcb727eb49be1867ac1257e30)
@@ -21,4 +21,5 @@
 
 #include "Actions/UndoRedoHelpers.hpp"
+#include "Atom/atom.hpp"
 #include "Atom/AtomicInfo.hpp"
 #include "Atom/CopyAtoms/CopyAtoms_withBonds.hpp"
@@ -54,7 +55,7 @@
   getParametersfromValueStorage();
 
-  // check for selected atoms
-  // get the filler molecule and move to origin
+  // get the filler molecule
   const std::vector< molecule *> molecules = World::getInstance().getSelectedMolecules();
+  std::vector<AtomicInfo> movedatoms;
   if (molecules.size() != 1) {
     ELOG(1, "No exactly one molecule selected, aborting,");
@@ -62,4 +63,6 @@
   }
   molecule *filler = *(molecules.begin());
+  for(molecule::const_iterator iter = filler->begin(); iter != filler->end(); ++iter)
+    movedatoms.push_back( AtomicInfo(*(*iter)) );
   LOG(1, "INFO: Chosen molecule has " << filler->size() << " atoms.");
 
@@ -84,5 +87,5 @@
 
   // create predicate, mesh, and filler
-  std::vector<AtomicInfo> clonedatoms;
+  FillSphericalSurfaceState *UndoState = NULL;
   bool successflag = false;
   {
@@ -108,5 +111,7 @@
       delete fillerFunction;
 
-      // append each cluster's atoms to clonedatoms
+      // append each cluster's atoms to clonedatoms (however not selected ones)
+      std::vector<const atom *> clonedatoms;
+      std::vector<AtomicInfo> clonedatominfos;
       for (Filler::ClusterVector_t::const_iterator iter = ClonedClusters.begin();
           iter != ClonedClusters.end(); ++iter) {
@@ -114,13 +119,26 @@
         clonedatoms.reserve(clonedatoms.size()+atoms.size());
         for (AtomIdSet::const_iterator atomiter = atoms.begin(); atomiter != atoms.end(); ++atomiter)
-          clonedatoms.push_back( AtomicInfo(*(*atomiter)) );
+          if (!filler->containsAtom(*atomiter)) {
+            clonedatoms.push_back( *atomiter );
+            clonedatominfos.push_back( AtomicInfo(*(*atomiter)) );
+          }
       }
+      std::vector< BondInfo > clonedbonds;
+      StoreBondInformationFromAtoms(clonedatoms, clonedbonds);
+      LOG(2, "DEBUG: There are " << clonedatominfos.size() << " newly created atoms with "
+          << clonedbonds.size()/2 << " bonds.");
+
       if (!successflag) {
-        ELOG(1, "Insertion failed, removing inserted clusters again.");
-        RemoveAtomsFromAtomicInfo(clonedatoms);
+        ELOG(1, "Insertion failed, removing inserted clusters, translating original one back");
+        RemoveAtomsFromAtomicInfo(clonedatominfos);
         clonedatoms.clear();
+        SetAtomsFromAtomicInfo(movedatoms);
+      } else {
+        std::vector<Vector> MovedToVector(filler->size(), zeroVec);
+        std::transform(filler->begin(), filler->end(), MovedToVector.begin(),
+            boost::bind(&AtomInfo::getPosition, _1) );
+        UndoState = new FillSphericalSurfaceState(clonedatominfos,clonedbonds,movedatoms,MovedToVector,params);
       }
     }
-
 
     // remove
@@ -131,5 +149,5 @@
 
   if (successflag)
-    return Action::state_ptr(new FillSphericalSurfaceState(clonedatoms,params));
+    return Action::state_ptr(UndoState);
   else
     return Action::failure;
@@ -141,4 +159,6 @@
   // remove all created atoms
   RemoveAtomsFromAtomicInfo(state->clonedatoms);
+  // add the original cluster
+  SetAtomsFromAtomicInfo(state->movedatoms);
 
   return Action::state_ptr(_state);
@@ -148,5 +168,13 @@
   FillSphericalSurfaceState *state = assert_cast<FillSphericalSurfaceState*>(_state.get());
 
-  if (AddAtomsFromAtomicInfo(state->clonedatoms))
+  // place filler cluster again at new spot
+  ResetAtomPosition(state->movedatoms, state->MovedToVector);
+
+  // re-create all clusters
+  bool statusflag = AddAtomsFromAtomicInfo(state->clonedatoms);
+
+  // re-create the bonds
+  statusflag = statusflag && AddBondsFromBondInfo(state->clonedbonds);
+  if (statusflag)
     return Action::state_ptr(_state);
   else
Index: src/Actions/FillAction/FillSphericalSurfaceAction.def
===================================================================
--- src/Actions/FillAction/FillSphericalSurfaceAction.def	(revision 42b6de7c684d4c908777f116dccaf00a8e479cf2)
+++ src/Actions/FillAction/FillSphericalSurfaceAction.def	(revision 531f27764dc2eabbcb727eb49be1867ac1257e30)
@@ -9,5 +9,6 @@
 #include <vector>
 #include "Atom/AtomicInfo.hpp"
-#include "LinearAlgebra/Vector.hpp"
+#include "Bond/BondInfo.hpp"
+#include "types.hpp"
 
 // i.e. there is an integer with variable name Z that can be found in
@@ -20,6 +21,6 @@
 #define paramreferences (center)(radius)(N)(mindistance)(AlignedAxis)
 
-#define statetypes (std::vector<AtomicInfo>) 
-#define statereferences (clonedatoms) 
+#define statetypes (std::vector<AtomicInfo>)(std::vector<BondInfo>)(std::vector<AtomicInfo>)(std::vector<Vector>)
+#define statereferences (clonedatoms)(clonedbonds)(movedatoms)(MovedToVector)
 
 // some defines for all the names, you may use ACTION, STATE and PARAMS
