diff --git a/grid/alu3dgrid/entity.hh b/grid/alu3dgrid/entity.hh
index adf86a788b77df2ca53e2a6687f172007d80e5c3..b48027d6e1a8b198a911624200481fb2c764f37a 100644
--- a/grid/alu3dgrid/entity.hh
+++ b/grid/alu3dgrid/entity.hh
@@ -404,6 +404,9 @@ namespace Dune {
     int level () const ;
 
   protected:
+    // clones object
+    void clone (const ALU3dGridEntityPointerType & org);
+
     //! has to be called when iterator is finished
     void done ();
 
diff --git a/grid/alu3dgrid/entity_imp.cc b/grid/alu3dgrid/entity_imp.cc
index 7ec3981c18ad436eb27b2196fb38f940092c2d78..6afd31c54f729e143e8d5bdb1a63a78623f0fb60 100644
--- a/grid/alu3dgrid/entity_imp.cc
+++ b/grid/alu3dgrid/entity_imp.cc
@@ -734,6 +734,27 @@ namespace Dune {
     return *this;
   }
 
+  template<int codim, class GridImp >
+  inline void
+  ALU3dGridEntityPointerBase<codim,GridImp> ::
+  clone (const ALU3dGridEntityPointerType & org)
+  {
+    assert( &grid_ == &org.grid_ );
+    // set item
+    item_ = org.item_;
+
+    // if entity exists, just remove item pointer
+    if(entity_)
+    {
+      if(item_)
+        this->entityImp().setElement( *item_ );
+      else
+        this->entityImp().removeElement();
+    }
+
+    return ;
+  }
+
   template<int codim, class GridImp >
   inline ALU3dGridEntityPointerBase<codim,GridImp> ::
   ~ALU3dGridEntityPointerBase()
diff --git a/grid/alu3dgrid/iterator.hh b/grid/alu3dgrid/iterator.hh
index 847d91a56a2449bbd02e22c945bfb87b9ff9c1f0..0716c648775cba55ab5cc3c60184a01fff840e88 100644
--- a/grid/alu3dgrid/iterator.hh
+++ b/grid/alu3dgrid/iterator.hh
@@ -1041,15 +1041,15 @@ namespace Dune {
     //! dereference Entity, faster then the entity pointersmethod
     Entity & dereference () const;
 
-  private:
     //! the assignment operator
     ThisType & operator = (const ALU3dGridHierarchicIterator<GridImp> &org);
 
+  private:
     // go to next valid element
     ALU3DSPACE HElementType * goNextElement (ALU3DSPACE HElementType * oldEl);
 
     //! element from where we started
-    const ALU3DSPACE HElementType & elem_;
+    const ALU3DSPACE HElementType * elem_;
 
     //! maximal level to go down
     int maxlevel_;
diff --git a/grid/alu3dgrid/iterator_imp.cc b/grid/alu3dgrid/iterator_imp.cc
index 7f7ba23a804b066b4679f606192d062e4ec05a06..e0cc10ec0a1f0af7bc61ae88a9b9fad0e7b97c22 100644
--- a/grid/alu3dgrid/iterator_imp.cc
+++ b/grid/alu3dgrid/iterator_imp.cc
@@ -763,13 +763,13 @@ namespace Dune {
   ALU3dGridHierarchicIterator(const GridImp & grid ,
                               const ALU3DSPACE HElementType & elem, int maxlevel ,bool end)
     : ALU3dGridEntityPointer<0,GridImp> ( grid, maxlevel )
-      , elem_(elem)
+      , elem_(&elem)
       , maxlevel_(maxlevel)
   {
     if (!end)
     {
       ALU3DSPACE HElementType * item =
-        const_cast<ALU3DSPACE HElementType *> (elem_.down());
+        const_cast<ALU3DSPACE HElementType *> (elem.down());
       if(item)
       {
         // we have children and they lie in the disired level range
@@ -797,6 +797,20 @@ namespace Dune {
       , maxlevel_(org.maxlevel_)
   {}
 
+  template <class GridImp>
+  inline ALU3dGridHierarchicIterator<GridImp> &
+  ALU3dGridHierarchicIterator<GridImp> ::
+  operator = (const ALU3dGridHierarchicIterator<GridImp> & org)
+  {
+    elem_     = org.elem_;
+    maxlevel_ = org.maxlevel_;
+
+    // this method will free entity
+    this->clone(org);
+
+    return *this;
+  }
+
   template <class GridImp>
   inline ALU3DSPACE HElementType * ALU3dGridHierarchicIterator<GridImp>::
   goNextElement(ALU3DSPACE HElementType * oldelem )
@@ -820,12 +834,12 @@ namespace Dune {
     }
 
     nextelem = oldelem->up();
-    if(nextelem == &elem_) return 0;
+    if(nextelem == elem_) return 0;
 
     while( !nextelem->next() )
     {
       nextelem = nextelem->up();
-      if(nextelem == &elem_) return 0;
+      if(nextelem == elem_) return 0;
     }
 
     if(nextelem) nextelem = nextelem->next();