Index: src/Atom/AtomicInfo.cpp
===================================================================
--- src/Atom/AtomicInfo.cpp	(revision 2598874de68fdc051204a1835045f988d021c922)
+++ src/Atom/AtomicInfo.cpp	(revision b3d687bc878019a08e899000aa1d38119f390058)
@@ -22,4 +22,5 @@
 #include "atom.hpp"
 #include "AtomicInfo.hpp"
+#include "CodePatterns/Assert.hpp"
 #include "Descriptors/AtomIdDescriptor.hpp"
 #include "Descriptors/MoleculeIdDescriptor.hpp"
@@ -45,8 +46,13 @@
     Velocity(_atom.getAtomicVelocity()),
     FatherId(_atom.father->getId()),
-    MolId(_atom.getMolecule()->getId()),
+    MolId(0),
     Id(_atom.getId()),
     Nr(_atom.getNr())
-{}
+{
+  const molecule * const mol = _atom.getMolecule();
+  ASSERT(mol != NULL,
+      "Atom "+toString(_atom.getId())+" is not associated with any molecule.");
+  MolId = mol->getId();
+}
 
 AtomicInfo::~AtomicInfo()
Index: src/Atom/CopyAtoms/CopyAtoms_withBonds.cpp
===================================================================
--- src/Atom/CopyAtoms/CopyAtoms_withBonds.cpp	(revision 2598874de68fdc051204a1835045f988d021c922)
+++ src/Atom/CopyAtoms/CopyAtoms_withBonds.cpp	(revision b3d687bc878019a08e899000aa1d38119f390058)
@@ -26,4 +26,5 @@
 #include "CodePatterns/Assert.hpp"
 #include "CodePatterns/Log.hpp"
+#include "molecule.hpp"
 #include "WorldTime.hpp"
 
@@ -72,4 +73,16 @@
   }
 
+  // associate cloned atoms with molecule from original atom
+  for (AtomVector::const_iterator original_iter = _atoms.begin();
+      original_iter != _atoms.end(); ++original_iter) {
+    const atom * const _atom = *original_iter;
+    molecule * const mol = _atom->getMolecule();
+    if (mol != NULL) {
+      ASSERT( LookupMap.count(_atom),
+          "CopyAtoms_withBonds::operator() - atom "+toString(_atom)+" not found in LookupMap.");
+      mol->AddAtom(LookupMap[_atom]);
+    }
+  }
+
   // print copied atoms
   if (DoLog(3))
Index: src/Filling/Filler.cpp
===================================================================
--- src/Filling/Filler.cpp	(revision 2598874de68fdc051204a1835045f988d021c922)
+++ src/Filling/Filler.cpp	(revision b3d687bc878019a08e899000aa1d38119f390058)
@@ -39,4 +39,5 @@
 #include "LinearAlgebra/RealSpaceMatrix.hpp"
 #include "LinearAlgebra/Vector.hpp"
+#include "molecule.hpp"
 #include "NodeTypes.hpp"
 #include "Predicates/FillPredicate.hpp"
@@ -86,30 +87,33 @@
   NodeSet FillNodes(nodes.size(), zeroVec);
 
-  // move filler cluster's atoms out of domain such that it does not disturb the predicate.
-  // we only move the atoms as otherwise two translate ShapeOps will be on top of the Shape
-  // which is subsequently copied to all other cloned Clusters ...
-  Vector BoxDiagonal;
+  // evaluate predicates at each FillNode
   {
-    const RealSpaceMatrix &M = World::getInstance().getDomain().getM();
-    BoxDiagonal = (M * Vector(1.,1.,1.));
-    BoxDiagonal -= cluster->getShape().getCenter();
-    BoxDiagonal *= 1. + 2.*cluster->getShape().getRadius()/BoxDiagonal.Norm(); // extend it a little further
-    AtomIdSet atoms = cluster->getAtoms();
-    for (AtomIdSet::iterator iter = atoms.begin(); iter != atoms.end(); ++iter)
-      (*iter)->setPosition( (*iter)->getPosition() + BoxDiagonal );
-    LOG(1, "INFO: Translating original cluster's atoms by " << BoxDiagonal << ".");
-  }
+    // move filler cluster's atoms out of domain such that it does not disturb the predicate.
+    // we only move the atoms as otherwise two translate ShapeOps will be on top of the Shape
+    // which is subsequently copied to all other cloned Clusters ...
+    Vector BoxDiagonal;
+    {
+      const RealSpaceMatrix &M = World::getInstance().getDomain().getM();
+      BoxDiagonal = (M * Vector(1.,1.,1.));
+      BoxDiagonal -= cluster->getShape().getCenter();
+      BoxDiagonal *= 1. + 2.*cluster->getShape().getRadius()/BoxDiagonal.Norm(); // extend it a little further
+      AtomIdSet atoms = cluster->getAtoms();
+      for (AtomIdSet::iterator iter = atoms.begin(); iter != atoms.end(); ++iter)
+        (*iter)->setPosition( (*iter)->getPosition() + BoxDiagonal );
+      LOG(1, "INFO: Translating original cluster's atoms by " << BoxDiagonal << ".");
+    }
 
-  // evaluate predicate and gather into new set
-  NodeSet::iterator transform_end  =
-      std::remove_copy_if(nodes.begin(), nodes.end(), FillNodes.begin(), predicate );
-  FillNodes.erase(transform_end, FillNodes.end());
+    // evaluate predicate and gather into new set
+    NodeSet::iterator transform_end  =
+        std::remove_copy_if(nodes.begin(), nodes.end(), FillNodes.begin(), predicate );
+    FillNodes.erase(transform_end, FillNodes.end());
 
-  // shift cluster back to original place
-  {
-    AtomIdSet atoms = cluster->getAtoms();
-    for (AtomIdSet::iterator iter = atoms.begin(); iter != atoms.end(); ++iter)
-      (*iter)->setPosition( (*iter)->getPosition() - BoxDiagonal );
-    LOG(1, "INFO: Translating original cluster's atoms back.");
+    // shift cluster back to original place
+    {
+      AtomIdSet atoms = cluster->getAtoms();
+      for (AtomIdSet::iterator iter = atoms.begin(); iter != atoms.end(); ++iter)
+        (*iter)->setPosition( (*iter)->getPosition() - BoxDiagonal );
+      LOG(1, "INFO: Translating original cluster's atoms back.");
+    }
   }
 
@@ -123,19 +127,38 @@
   // clone clusters
   std::vector<ClusterInterface::Cluster_impl> clusters(FillNodes.size());
-  std::vector<ClusterInterface::Cluster_impl>::iterator clusteriter = clusters.begin();
-  *clusteriter = cluster;
-  clusteriter++;
-  std::generate_n(clusteriter, FillNodes.size()-1,
-      boost::bind(&ClusterInterface::clone, boost::cref(cluster), boost::ref(copyMethod), zeroVec) );
+  {
+    std::vector<ClusterInterface::Cluster_impl>::iterator clusteriter = clusters.begin();
+    *clusteriter = cluster;
+    clusteriter++;
+    std::generate_n(clusteriter, FillNodes.size()-1,
+        boost::bind(&ClusterInterface::clone, boost::cref(cluster), boost::ref(copyMethod), zeroVec) );
+  }
 
   // insert each cluster by abusing std::search a bit:
-  // we look for the subsequence of FillNodes inside clusters. If Inserter always
-  // returns true, we'll have the iterator pointing at first cluster
-  std::vector<ClusterInterface::Cluster_impl>::const_iterator inserteriter =
-    std::search(clusters.begin(), clusters.end(), FillNodes.begin(), FillNodes.end(),
-        boost::bind(&Inserter::operator(), boost::cref(inserter), _1, _2));
-  if( inserteriter != clusters.begin()) {
-    ELOG(1, "Not all cloned clusters could be successfully inserted.");
-    return false;
+  {
+    // we look for the subsequence of FillNodes inside clusters. If Inserter always
+    // returns true, we'll have the iterator pointing at first cluster
+    std::vector<ClusterInterface::Cluster_impl>::const_iterator inserteriter =
+      std::search(clusters.begin(), clusters.end(), FillNodes.begin(), FillNodes.end(),
+          boost::bind(&Inserter::operator(), boost::cref(inserter), _1, _2));
+    if( inserteriter != clusters.begin()) {
+      ELOG(1, "Not all cloned clusters could be successfully inserted.");
+      return false;
+    }
+  }
+
+  // create molecules for each cluster and fill in atoms
+  {
+    std::vector<molecule *> molecules(clusters.size()-1, NULL);
+    std::generate_n(molecules.begin(), FillNodes.size()-1,
+        boost::bind(&World::createMolecule, World::getPointer()) );
+    std::vector<ClusterInterface::Cluster_impl>::const_iterator clusteriter = clusters.begin();
+    ++clusteriter;
+    std::vector<molecule *>::iterator moliter = molecules.begin();
+    for (;moliter != molecules.end(); ++clusteriter, ++moliter) {
+      AtomIdSet atoms = (*clusteriter)->getAtoms();
+      for (AtomIdSet::iterator iter = atoms.begin(); iter != atoms.end(); ++iter)
+        (*moliter)->AddAtom(*iter);
+    }
   }
 
