Index: src/Actions/FillAction/FillRegularGridAction.cpp
===================================================================
--- src/Actions/FillAction/FillRegularGridAction.cpp	(revision 901d8728439c01d409375e1e3f5d042c4d2d7bb6)
+++ src/Actions/FillAction/FillRegularGridAction.cpp	(revision f61f610060cf4f27c505a50acd437f8a6b56abf8)
@@ -26,4 +26,5 @@
 #include "Filling/Cluster.hpp"
 #include "Filling/Filler.hpp"
+#include "Filling/Inserter/Inserter.hpp"
 #include "Filling/Inserter/SimpleInserter.hpp"
 #include "Filling/Mesh/CubeMesh.hpp"
@@ -109,9 +110,9 @@
       Andpredicate = (Andpredicate) && !(*surface_predicate);
     Mesh *mesh = new CubeMesh(params.counts, params.offset, World::getInstance().getDomain().getM());
+    Inserter *inserter = new Inserter(Inserter::impl_ptr(new SimpleInserter()));
 
     // fill
     {
-      SimpleInserter inserter;
-      Filler *fillerFunction = new Filler(*mesh, Andpredicate, inserter);
+      Filler *fillerFunction = new Filler(*mesh, Andpredicate, *inserter);
       ClusterInterface::Cluster_impl cluster( new Cluster( filler->getAtomIds(), filler->getBoundingShape()) );
       CopyAtoms_withBonds copyMethod;
@@ -122,4 +123,5 @@
     // remove
     delete mesh;
+    delete inserter;
     delete voidnode_predicate;
     delete surface_predicate;
Index: src/Filling/Inserter/Inserter.cpp
===================================================================
--- src/Filling/Inserter/Inserter.cpp	(revision f61f610060cf4f27c505a50acd437f8a6b56abf8)
+++ src/Filling/Inserter/Inserter.cpp	(revision f61f610060cf4f27c505a50acd437f8a6b56abf8)
@@ -0,0 +1,55 @@
+/*
+ * Project: MoleCuilder
+ * Description: creates and alters molecular systems
+ * Copyright (C)  2012 University of Bonn. All rights reserved.
+ * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
+ */
+
+/*
+ * Inserter.cpp
+ *
+ *  Created on: Feb 21, 2012
+ *      Author: heber
+ */
+
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "CodePatterns/MemDebug.hpp"
+
+#include "Inserter.hpp"
+
+#include "InserterBase.hpp"
+
+/** Constructor for class Inserter.
+ *
+ * @param _impl implementation to wrap
+ */
+Inserter::Inserter(Inserter::impl_ptr _impl) :
+    impl(_impl)
+{}
+
+/** Copy Constructor for class Inserter.
+ *
+ */
+Inserter::Inserter(const Inserter &ptr) :
+    impl(ptr.getImpl())
+{}
+
+/** Destructor for class Inserter.
+ *
+ */
+Inserter::~Inserter()
+{}
+
+void Inserter::operator()(CopyAtomsInterface &copyMethod, ClusterInterface::Cluster_impl cluster, const Vector &offset) const
+{
+  return impl->operator()(copyMethod, cluster, offset);
+}
+
+Inserter::impl_ptr Inserter::getImpl() const {
+  return impl;
+}
Index: src/Filling/Inserter/Inserter.hpp
===================================================================
--- src/Filling/Inserter/Inserter.hpp	(revision 901d8728439c01d409375e1e3f5d042c4d2d7bb6)
+++ src/Filling/Inserter/Inserter.hpp	(revision f61f610060cf4f27c505a50acd437f8a6b56abf8)
@@ -15,4 +15,6 @@
 #endif
 
+#include <boost/shared_ptr.hpp>
+
 #include "Filling/ClusterInterface.hpp"
 
@@ -20,14 +22,30 @@
 class Vector;
 
-/** Inserter defines the interface to all classes that handle insertion of \a
- * Cluster into the World at a specific position.
+class InserterBase;
+
+/** This class defines the interface for all derived classes.
+ *
+ * This is just a functor of an inserter function.
+ *
  */
 class Inserter
 {
 public:
-  virtual void operator()(CopyAtomsInterface &copyMethod, ClusterInterface::Cluster_impl cluster, const Vector &offset) const = 0;
+  typedef boost::shared_ptr<InserterBase> impl_ptr;
+  friend impl_ptr getInserterImpl(const Inserter&);
 
-  virtual ~Inserter() {}
+  Inserter(const Inserter &ptr);
+  Inserter(impl_ptr);
+  ~Inserter();
+  void operator()(CopyAtomsInterface &copyMethod, ClusterInterface::Cluster_impl cluster, const Vector &offset) const;
+
+protected:
+  impl_ptr getImpl() const;
+
+private:
+  impl_ptr impl;
 };
+
+Inserter::impl_ptr getInserterImpl(const Inserter &f);
 
 
Index: src/Filling/Inserter/InserterBase.hpp
===================================================================
--- src/Filling/Inserter/InserterBase.hpp	(revision f61f610060cf4f27c505a50acd437f8a6b56abf8)
+++ src/Filling/Inserter/InserterBase.hpp	(revision f61f610060cf4f27c505a50acd437f8a6b56abf8)
@@ -0,0 +1,36 @@
+/*
+ * InserterBase.hpp
+ *
+ *  Created on: Feb 21, 2012
+ *      Author: heber
+ */
+
+#ifndef INSERTERBASE_HPP_
+#define INSERTERBASE_HPP_
+
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "Filling/ClusterInterface.hpp"
+
+class CopyAtomsInterface;
+class Vector;
+
+/** Inserter defines the interface to all classes that handle insertion of \a
+ * Cluster into the World at a specific position.
+ */
+class InserterBase
+{
+public:
+  InserterBase() {}
+  virtual ~InserterBase() {}
+
+  virtual void operator()(CopyAtomsInterface &copyMethod, ClusterInterface::Cluster_impl cluster, const Vector &offset) const = 0;
+
+};
+
+
+#endif /* INSERTERBASE_HPP_ */
Index: src/Filling/Inserter/SimpleInserter.hpp
===================================================================
--- src/Filling/Inserter/SimpleInserter.hpp	(revision 901d8728439c01d409375e1e3f5d042c4d2d7bb6)
+++ src/Filling/Inserter/SimpleInserter.hpp	(revision f61f610060cf4f27c505a50acd437f8a6b56abf8)
@@ -15,10 +15,10 @@
 #endif
 
-#include "Filling/Inserter/Inserter.hpp"
+#include "Filling/Inserter/InserterBase.hpp"
 
 /** SimpleInserter implements Inserter interface such that the given \a Cluster
  * is simply inserted at the given position.
  */
-class SimpleInserter : public Inserter
+class SimpleInserter : public InserterBase
 {
 public:
Index: src/Filling/Makefile.am
===================================================================
--- src/Filling/Makefile.am	(revision 901d8728439c01d409375e1e3f5d042c4d2d7bb6)
+++ src/Filling/Makefile.am	(revision f61f610060cf4f27c505a50acd437f8a6b56abf8)
@@ -8,4 +8,5 @@
 	Filling/Filler.cpp \
 	Filling/Generators/NodeGenerator.cpp \
+	Filling/Inserter/Inserter.cpp \
 	Filling/Inserter/SimpleInserter.cpp \
 	Filling/Predicates/AnyFillPredicate.cpp \
@@ -24,4 +25,5 @@
 	Filling/Generators/NodeGenerator.hpp \
 	Filling/Inserter/Inserter.hpp \
+	Filling/Inserter/InserterBase.hpp \
 	Filling/Inserter/SimpleInserter.hpp \
 	Filling/NodeTypes.hpp \
Index: src/Filling/unittests/FillerUnitTest.cpp
===================================================================
--- src/Filling/unittests/FillerUnitTest.cpp	(revision 901d8728439c01d409375e1e3f5d042c4d2d7bb6)
+++ src/Filling/unittests/FillerUnitTest.cpp	(revision f61f610060cf4f27c505a50acd437f8a6b56abf8)
@@ -30,4 +30,5 @@
 #include "Filling/Cluster.hpp"
 #include "Filling/Filler.hpp"
+#include "Filling/Inserter/Inserter.hpp"
 #include "Filling/Inserter/SimpleInserter.hpp"
 #include "Filling/Mesh/Mesh.hpp"
@@ -71,5 +72,5 @@
   predicate = new FillPredicate(AlwaysFillPredicate());
   mesh = new MeshStub();
-  inserter = new SimpleInserter();
+  inserter = new Inserter(Inserter::impl_ptr(new SimpleInserter()));
   CPPUNIT_ASSERT_EQUAL( (size_t)5, mesh->getNodes().size() );
   filler = new Filler(*mesh, *predicate, *inserter);
