diff --git a/AMDiS/libtool b/AMDiS/libtool
index 41ace2e6aa8dc61f34efef5d3ac31a4138c1ba01..486eabd3eefb59bce7cb3fc38a32f6c54ef0e385 100755
--- a/AMDiS/libtool
+++ b/AMDiS/libtool
@@ -30,10 +30,10 @@
 # the same distribution terms that you use for the rest of that program.
 
 # A sed program that does not truncate output.
-SED="/bin/sed"
+SED="/usr/bin/sed"
 
 # Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="/bin/sed -e 1s/^X//"
+Xsed="/usr/bin/sed -e 1s/^X//"
 
 # The HP-UX ksh and POSIX shell print the target directory to stdout
 # if CDPATH is set.
@@ -44,7 +44,7 @@ available_tags=" CXX F77"
 
 # ### BEGIN LIBTOOL CONFIG
 
-# Libtool was configured on host NWRW15:
+# Libtool was configured on host deimos103:
 
 # Shell to use when invoking shell scripts.
 SHELL="/bin/sh"
@@ -66,12 +66,12 @@ fast_install=yes
 
 # The host system.
 host_alias=
-host=i686-pc-linux-gnu
+host=x86_64-unknown-linux-gnu
 host_os=linux-gnu
 
 # The build system.
 build_alias=
-build=i686-pc-linux-gnu
+build=x86_64-unknown-linux-gnu
 build_os=linux-gnu
 
 # An echo program that does not interpret backslashes.
@@ -82,13 +82,13 @@ AR="ar"
 AR_FLAGS="cru"
 
 # A C compiler.
-LTCC="gcc"
+LTCC="/licsoft/libraries/openmpi/1.2.6/64bit/bin/mpicc"
 
 # LTCC compiler flags.
 LTCFLAGS="-g -O2"
 
 # A language-specific compiler.
-CC="gcc"
+CC="/licsoft/libraries/openmpi/1.2.6/64bit/bin/mpicc"
 
 # Is the compiler the GNU C compiler?
 with_gcc=yes
@@ -97,7 +97,7 @@ with_gcc=yes
 EGREP="grep -E"
 
 # The linker used to build libraries.
-LD="/usr/bin/ld"
+LD="/usr/x86_64-suse-linux/bin/ld -m elf_x86_64"
 
 # Whether we need hard or soft links.
 LN_S="ln -s"
@@ -171,7 +171,7 @@ dlopen_self=unknown
 dlopen_self_static=unknown
 
 # Compiler flag to prevent dynamic linking.
-link_static_flag="-static"
+link_static_flag=""
 
 # Compiler flag to turn off builtin functions.
 no_builtin_flag=" -fno-builtin"
@@ -325,10 +325,10 @@ variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COM
 link_all_deplibs=unknown
 
 # Compile-time system search path for libraries
-sys_lib_search_path_spec=" /usr/lib/gcc/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../i386-redhat-linux/lib/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../i386-redhat-linux/lib/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../ /lib/i386-redhat-linux/4.1.2/ /lib/ /usr/lib/i386-redhat-linux/4.1.2/ /usr/lib/"
+sys_lib_search_path_spec=" /usr/lib64/gcc/x86_64-suse-linux/4.1.2/ /usr/lib/gcc/x86_64-suse-linux/4.1.2/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/lib/x86_64-suse-linux/4.1.2/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/lib/../lib64/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../x86_64-suse-linux/4.1.2/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../lib64/ /lib/x86_64-suse-linux/4.1.2/ /lib/../lib64/ /usr/lib/x86_64-suse-linux/4.1.2/ /usr/lib/../lib64/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/lib/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../ /lib/ /usr/lib/"
 
 # Run-time system search path for libraries
-sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/octave-2.9.9 /usr/lib/qt-3.3/lib "
+sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/X11R6/lib64/Xaw3d /usr/X11R6/lib64 /usr/X11R6/lib/Xaw3d /usr/X11R6/lib /usr/x86_64-suse-linux/lib /usr/local/lib64 /usr/local/lib /opt/kde3/lib64 /opt/kde3/lib /opt/gnome/lib64 /opt/gnome/lib /lib64 /lib /usr/lib64 /usr/lib /opt/cluster/intel/cce/9.1.042/lib /opt/cluster/intel/fce/9.1.036/lib /opt/cluster/Pathscale3.0/lib/2.9.99 /opt/cluster/Pathscale3.0/lib/2.9.99/32 /work/licsoft/compilers/pgi/linux86-64/6.2/lib /work/licsoft/compilers/pgi/linux86-64/6.2/libso "
 
 # Fix the shell variable $srcfile for the compiler.
 fix_srcfile_path=""
@@ -6760,7 +6760,7 @@ build_old_libs=`case $build_libtool_libs in yes) $echo no;; *) $echo yes;; esac`
 # End:
 # ### BEGIN LIBTOOL TAG CONFIG: CXX
 
-# Libtool was configured on host NWRW15:
+# Libtool was configured on host deimos103:
 
 # Shell to use when invoking shell scripts.
 SHELL="/bin/sh"
@@ -6782,12 +6782,12 @@ fast_install=yes
 
 # The host system.
 host_alias=
-host=i686-pc-linux-gnu
+host=x86_64-unknown-linux-gnu
 host_os=linux-gnu
 
 # The build system.
 build_alias=
-build=i686-pc-linux-gnu
+build=x86_64-unknown-linux-gnu
 build_os=linux-gnu
 
 # An echo program that does not interpret backslashes.
@@ -6798,13 +6798,13 @@ AR="ar"
 AR_FLAGS="cru"
 
 # A C compiler.
-LTCC="gcc"
+LTCC="/licsoft/libraries/openmpi/1.2.6/64bit/bin/mpicc"
 
 # LTCC compiler flags.
 LTCFLAGS="-g -O2"
 
 # A language-specific compiler.
-CC="g++"
+CC="/licsoft/libraries/openmpi/1.2.6/64bit/bin/mpiCC"
 
 # Is the compiler the GNU C compiler?
 with_gcc=yes
@@ -6813,7 +6813,7 @@ with_gcc=yes
 EGREP="grep -E"
 
 # The linker used to build libraries.
-LD="/usr/bin/ld"
+LD="/usr/x86_64-suse-linux/bin/ld -m elf_x86_64"
 
 # Whether we need hard or soft links.
 LN_S="ln -s"
@@ -6887,7 +6887,7 @@ dlopen_self=unknown
 dlopen_self_static=unknown
 
 # Compiler flag to prevent dynamic linking.
-link_static_flag="-static"
+link_static_flag=""
 
 # Compiler flag to turn off builtin functions.
 no_builtin_flag=" -fno-builtin"
@@ -6942,11 +6942,11 @@ striplib="strip --strip-unneeded"
 
 # Dependencies to place before the objects being linked to create a
 # shared library.
-predep_objects="/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crti.o /usr/lib/gcc/i386-redhat-linux/4.1.2/crtbeginS.o"
+predep_objects="/usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../lib64/crti.o /usr/lib64/gcc/x86_64-suse-linux/4.1.2/crtbeginS.o"
 
 # Dependencies to place after the objects being linked to create a
 # shared library.
-postdep_objects="/usr/lib/gcc/i386-redhat-linux/4.1.2/crtendS.o /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crtn.o"
+postdep_objects="/usr/lib64/gcc/x86_64-suse-linux/4.1.2/crtendS.o /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../lib64/crtn.o"
 
 # Dependencies to place before the objects being linked to create a
 # shared library.
@@ -6954,11 +6954,11 @@ predeps=""
 
 # Dependencies to place after the objects being linked to create a
 # shared library.
-postdeps="-lstdc++ -lm -lgcc_s -lc -lgcc_s"
+postdeps="-lmpi_cxx -lmpi -lopen-rte -lopen-pal -libverbs -lrt -lnuma -ldl -lnsl -lutil -ldl -lstdc++ -lm -lgcc_s -lpthread -lc -lgcc_s"
 
 # The library search path used internally by the compiler when linking
 # a shared library.
-compiler_lib_search_path="-L/usr/lib/gcc/i386-redhat-linux/4.1.2 -L/usr/lib/gcc/i386-redhat-linux/4.1.2 -L/usr/lib/gcc/i386-redhat-linux/4.1.2/../../.."
+compiler_lib_search_path="-L/usr/lib64 -L/licsoft/libraries/openmpi/1.2.6/64bit/lib -L/usr/lib64/gcc/x86_64-suse-linux/4.1.2 -L/usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/lib -L/usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../.."
 
 # Method to check whether dependent libraries are shared objects.
 deplibs_check_method="pass_all"
@@ -7038,10 +7038,10 @@ variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COM
 link_all_deplibs=unknown
 
 # Compile-time system search path for libraries
-sys_lib_search_path_spec=" /usr/lib/gcc/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../i386-redhat-linux/lib/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../i386-redhat-linux/lib/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../ /lib/i386-redhat-linux/4.1.2/ /lib/ /usr/lib/i386-redhat-linux/4.1.2/ /usr/lib/"
+sys_lib_search_path_spec=" /usr/lib64/gcc/x86_64-suse-linux/4.1.2/ /usr/lib/gcc/x86_64-suse-linux/4.1.2/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/lib/x86_64-suse-linux/4.1.2/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/lib/../lib64/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../x86_64-suse-linux/4.1.2/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../lib64/ /lib/x86_64-suse-linux/4.1.2/ /lib/../lib64/ /usr/lib/x86_64-suse-linux/4.1.2/ /usr/lib/../lib64/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/lib/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../ /lib/ /usr/lib/"
 
 # Run-time system search path for libraries
-sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/octave-2.9.9 /usr/lib/qt-3.3/lib "
+sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/X11R6/lib64/Xaw3d /usr/X11R6/lib64 /usr/X11R6/lib/Xaw3d /usr/X11R6/lib /usr/x86_64-suse-linux/lib /usr/local/lib64 /usr/local/lib /opt/kde3/lib64 /opt/kde3/lib /opt/gnome/lib64 /opt/gnome/lib /lib64 /lib /usr/lib64 /usr/lib /opt/cluster/intel/cce/9.1.042/lib /opt/cluster/intel/fce/9.1.036/lib /opt/cluster/Pathscale3.0/lib/2.9.99 /opt/cluster/Pathscale3.0/lib/2.9.99/32 /work/licsoft/compilers/pgi/linux86-64/6.2/lib /work/licsoft/compilers/pgi/linux86-64/6.2/libso "
 
 # Fix the shell variable $srcfile for the compiler.
 fix_srcfile_path=""
@@ -7065,7 +7065,7 @@ include_expsyms=""
 
 # ### BEGIN LIBTOOL TAG CONFIG: F77
 
-# Libtool was configured on host NWRW15:
+# Libtool was configured on host deimos103:
 
 # Shell to use when invoking shell scripts.
 SHELL="/bin/sh"
@@ -7087,12 +7087,12 @@ fast_install=yes
 
 # The host system.
 host_alias=
-host=i686-pc-linux-gnu
+host=x86_64-unknown-linux-gnu
 host_os=linux-gnu
 
 # The build system.
 build_alias=
-build=i686-pc-linux-gnu
+build=x86_64-unknown-linux-gnu
 build_os=linux-gnu
 
 # An echo program that does not interpret backslashes.
@@ -7103,7 +7103,7 @@ AR="ar"
 AR_FLAGS="cru"
 
 # A C compiler.
-LTCC="gcc"
+LTCC="/licsoft/libraries/openmpi/1.2.6/64bit/bin/mpicc"
 
 # LTCC compiler flags.
 LTCFLAGS="-g -O2"
@@ -7112,13 +7112,13 @@ LTCFLAGS="-g -O2"
 CC="g77"
 
 # Is the compiler the GNU C compiler?
-with_gcc=yes
+with_gcc=
 
 # An ERE matcher.
 EGREP="grep -E"
 
 # The linker used to build libraries.
-LD="/usr/bin/ld"
+LD="/usr/x86_64-suse-linux/bin/ld -m elf_x86_64"
 
 # Whether we need hard or soft links.
 LN_S="ln -s"
@@ -7346,10 +7346,10 @@ variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COM
 link_all_deplibs=unknown
 
 # Compile-time system search path for libraries
-sys_lib_search_path_spec=" /usr/lib/gcc/i386-redhat-linux/3.4.6/ /usr/lib/gcc/i386-redhat-linux/3.4.6/ /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../i386-redhat-linux/lib/i386-redhat-linux/3.4.6/ /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../i386-redhat-linux/lib/ /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../i386-redhat-linux/3.4.6/ /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../ /lib/i386-redhat-linux/3.4.6/ /lib/ /usr/lib/i386-redhat-linux/3.4.6/ /usr/lib/"
+sys_lib_search_path_spec=" /usr/lib64/gcc-lib/x86_64-suse-linux/3.3.5/ /usr/lib/gcc/x86_64-suse-linux/3.3.5/ /usr/lib64/gcc-lib/x86_64-suse-linux/3.3.5/../../../../x86_64-suse-linux/lib/x86_64-suse-linux/3.3.5/ /usr/lib64/gcc-lib/x86_64-suse-linux/3.3.5/../../../../x86_64-suse-linux/lib/ /usr/lib64/gcc-lib/x86_64-suse-linux/3.3.5/../../../x86_64-suse-linux/3.3.5/ /usr/lib64/gcc-lib/x86_64-suse-linux/3.3.5/../../../ /lib/x86_64-suse-linux/3.3.5/ /lib/ /usr/lib/x86_64-suse-linux/3.3.5/ /usr/lib/"
 
 # Run-time system search path for libraries
-sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/octave-2.9.9 /usr/lib/qt-3.3/lib "
+sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/X11R6/lib64/Xaw3d /usr/X11R6/lib64 /usr/X11R6/lib/Xaw3d /usr/X11R6/lib /usr/x86_64-suse-linux/lib /usr/local/lib64 /usr/local/lib /opt/kde3/lib64 /opt/kde3/lib /opt/gnome/lib64 /opt/gnome/lib /lib64 /lib /usr/lib64 /usr/lib /opt/cluster/intel/cce/9.1.042/lib /opt/cluster/intel/fce/9.1.036/lib /opt/cluster/Pathscale3.0/lib/2.9.99 /opt/cluster/Pathscale3.0/lib/2.9.99/32 /work/licsoft/compilers/pgi/linux86-64/6.2/lib /work/licsoft/compilers/pgi/linux86-64/6.2/libso "
 
 # Fix the shell variable $srcfile for the compiler.
 fix_srcfile_path=""
diff --git a/AMDiS/src/ElInfo2d.cc b/AMDiS/src/ElInfo2d.cc
index 7df8e6f2cc253d07b99f8f007f6a9b0b033fbd8f..890e42c8c7388e355da6f2a7b87d8e994bdd0421 100644
--- a/AMDiS/src/ElInfo2d.cc
+++ b/AMDiS/src/ElInfo2d.cc
@@ -34,8 +34,8 @@ namespace AMDiS {
     FUNCNAME("ElInfo::fillMacroInfo()");
  
     macroElement_ = const_cast<MacroElement*>(mel);
-    element_  = const_cast<Element*>(mel->getElement());
-    parent_  = NULL;
+    element_ = const_cast<Element*>(mel->getElement());
+    parent_ = NULL;
     level = 0;
 
     if (fillFlag_.isSet(Mesh::FILL_COORDS) || 
diff --git a/AMDiS/src/Element.cc b/AMDiS/src/Element.cc
index c8ac2cb33abafa45ed22fe7fef91cd467592bcbd..947d6700d99dd79bb877151e310ebc0b64e4f63e 100644
--- a/AMDiS/src/Element.cc
+++ b/AMDiS/src/Element.cc
@@ -14,11 +14,11 @@ namespace AMDiS {
     if (!elementData) 
       return -1;
 
-    ElementRegion_ED* red = dynamic_cast<ElementRegion_ED*>(elementData->getElementData(ELEMENT_REGION));
+    ElementRegion_ED* red = 
+      dynamic_cast<ElementRegion_ED*>(elementData->getElementData(ELEMENT_REGION));
 
-    if (red) {
-      return red->getRegion();
-    }
+    if (red)
+      return red->getRegion();    
     
     return -1;
   }
@@ -52,16 +52,14 @@ namespace AMDiS {
   // call destructor through Mesh::freeElement !!!
   Element::~Element()
   {  
-    if (child[0]) {
+    if (child[0])
       DELETE child[0];
-    }
-    if (child[1]) {
-      DELETE child[1];
-    }
+    
+    if (child[1])
+      DELETE child[1];   
 
-    if (newCoord) {
-      DELETE newCoord;
-    }
+    if (newCoord)
+      DELETE newCoord;    
 
     if (elementData) {
       elementData->deleteDecorated();
diff --git a/AMDiS/src/Element.h b/AMDiS/src/Element.h
index 8e9700c0677881099d854949d523d23f33439df2..41c4ede07c307fc41789b05ca843f19e876b47f4 100644
--- a/AMDiS/src/Element.h
+++ b/AMDiS/src/Element.h
@@ -22,10 +22,6 @@
 #ifndef AMDIS_ELEMENT_H
 #define AMDIS_ELEMENT_H
 
-// ============================================================================
-// ===== includes =============================================================
-// ============================================================================
-
 #include "Global.h"
 #include "RefinementManager.h"
 #include "Serializable.h"
@@ -34,23 +30,14 @@
 
 namespace AMDiS {
 
-  // ============================================================================
-  // ===== forward declarations =================================================
-  // ============================================================================
-
   class Mesh;
   class DOFAdmin;
   template<typename T> class WorldVector;
   class CoarseningManager;
-
   template<typename T, GeoIndex d> class FixVec;
 
 #define AMDIS_UNDEFINED  5
 
-  // ============================================================================
-  // ===== class Element ========================================================
-  // ============================================================================
-
   /** \ingroup Triangulation 
    * \brief
    * Base class for Line, Triangle, Tetrahedron
@@ -103,8 +90,6 @@ namespace AMDiS {
      */
     Element* cloneWithDOFs();
 
-    // ===== getting methods ======================================================
-
     /** \name getting methods
      * \{
      */
@@ -232,8 +217,6 @@ namespace AMDiS {
 
     /** \} */
 
-    // ===== setting methods ======================================================
-
     /** \name setting methods
      * \{
      */
@@ -454,9 +437,9 @@ namespace AMDiS {
     /// Deserialize an element from a file.
     void deserialize(std::istream &in);
 
+    ///
     int calcMemoryUsage();
 
-    // ===== protected methods ====================================================
   protected:
     /// Sets Element's \ref dof pointer. Used by friend class Mesh.
     void setDOFPtrs();
diff --git a/AMDiS/src/MacroElement.h b/AMDiS/src/MacroElement.h
index fbe77f60ea019c90d3cdfc6a6981cb2fcf42384b..43bba36884641f77d65acf997e2b3c9080e51d01 100644
--- a/AMDiS/src/MacroElement.h
+++ b/AMDiS/src/MacroElement.h
@@ -40,10 +40,6 @@ namespace AMDiS {
   template<typename T> class WorldVector;
   template<typename T> class DimVec;
 
-  // ============================================================================
-  // ===== class MacroElement ===================================================
-  // ============================================================================
-
   /** \ingroup Triangulation
    * \brief
    * MacroElements form the macro triangulation of a Mesh. In a MacroElement
@@ -64,8 +60,6 @@ namespace AMDiS {
     ///
     MacroElement& operator=(const MacroElement &el);
 
-    // ===== getting methods ======================================================
-
     /** \name getting methods
      * \{
      */
@@ -117,8 +111,6 @@ namespace AMDiS {
 
     /** \} */
 
-    // ===== setting methods ======================================================
-
     /** \name setting methods
      * \{
      */
diff --git a/AMDiS/src/Mesh.cc b/AMDiS/src/Mesh.cc
index d3b380b750f0d57b412e132edf1619819c2c0710..026832e139581cddc9d2873a7a8e9923f81c74f2 100644
--- a/AMDiS/src/Mesh.cc
+++ b/AMDiS/src/Mesh.cc
@@ -23,7 +23,6 @@
 #include "Projection.h"
 #include "ElInfoStack.h"
 
-
 namespace AMDiS {
 
 #define TIME_USED(f,s) ((double)((s)-(f))/(double)CLOCKS_PER_SEC)
@@ -268,45 +267,91 @@ namespace AMDiS {
     me->setIndex(macroElements.size());
   }
 
-  void Mesh::removeMacroElement(MacroElement* me) 
+  void Mesh::removeMacroElements(std::vector<MacroElement*>& macros) 
   {
     FUNCNAME("Mesh::removeMacroElement()");
 
     TEST_EXIT(dim == 2)("Not yet implemented!\n");
 
-    bool found = false;
-
-    // Remove the macro element from mesh's list of all macro elements.
-    for (std::deque<MacroElement*>::iterator it = macroElements.begin();
-	 it != macroElements.end();
-	 ++it) {
-      if (*it == me) {
-	macroElements.erase(it, it + 1);
-	found = true;
-	break;
-      }
+    // Map that stores for each dof pointer (which may have a list of dofs)
+    // all macro element indices that own the dof.
+    std::map<const DegreeOfFreedom*, std::set<MacroElement*> > dofsOwner;
+    
+    // Determine all dof owner macro elements.
+    for (std::deque<MacroElement*>::iterator macroIt = macroElements.begin();
+	 macroIt != macroElements.end();
+	 ++macroIt) {
+      Element *el = (*macroIt)->getElement();
+      for (int i = 0; i < 3; i++)
+	dofsOwner[el->getDOF(i)].insert(*macroIt);      
     }
+
     
-    TEST_EXIT(found)("Cannot find MacroElement that should be removed!\n");
-
-    // Go through all neighbours of the macro element and remove this macro element
-    // to be neighbour of some other macro element.
-    for (int i = 0; i < dim; i++) {
-      if (me->getNeighbour(i)) {
-	for (int j = 0; j < dim; j++) {
-	  if (me->getNeighbour(i)->getNeighbour(j) == me) {
-	    me->getNeighbour(i)->setNeighbour(j, NULL);
+    // Remove all the given macro elements.
+    for (std::vector<MacroElement*>::iterator macroIt = macros.begin();
+	 macroIt != macros.end();
+	 ++macroIt) {
+      bool found = false;
+
+      // Remove the macro element from mesh's list of all macro elements.
+      for (std::deque<MacroElement*>::iterator it = macroElements.begin();
+	   it != macroElements.end();
+	   ++it) {
+	if (*it == *macroIt) {
+	  macroElements.erase(it, it + 1);
+	  found = true;
+	  break;
+	}
+      }
+      
+      TEST_EXIT(found)("Cannot find MacroElement that should be removed!\n");
+      
+      // Go through all neighbours of the macro element and remove this macro element
+      // to be neighbour of some other macro element.
+      for (int i = 0; i <= dim; i++) {
+	if ((*macroIt)->getNeighbour(i)) {
+	  for (int j = 0; j <= dim; j++) {
+	    if ((*macroIt)->getNeighbour(i)->getNeighbour(j) == *macroIt) {
+	      (*macroIt)->getNeighbour(i)->setNeighbour(j, NULL);
+	    }
 	  }
+	} else {
+	  // There is no neighbour at this edge, so we have to decrease the number
+	  // of edges in the mesh.
+	  nEdges--;
 	}
+      }
+
+      nLeaves--;
+      nElements--;
+
+      // Remove this macro element from the dof owner list.
+      for (std::map<const DegreeOfFreedom*, std::set<MacroElement*> >::iterator dofsIt = dofsOwner.begin();
+	   dofsIt != dofsOwner.end();
+	   ++dofsIt) {
+	std::set<MacroElement*>::iterator mIt = dofsIt->second.find(*macroIt);
+	if (mIt != dofsIt->second.end())
+	  dofsIt->second.erase(mIt);
+      }
+
+      // And remove the macro element from memory
+      delete *macroIt;
+    }
+
+    int nRemainDofs = 0;
+    // Check now all the dofs, that have no owner anymore and therefore have to
+    // be removed.
+    for (std::map<const DegreeOfFreedom*, std::set<MacroElement*> >::iterator dofsIt = dofsOwner.begin();
+	 dofsIt != dofsOwner.end();
+	 ++dofsIt) {    
+      if (dofsIt->second.size() == 0) {
+	dofsOwner.erase(dofsIt++);
       } else {
-	// There is no neighbour at this edge, so we have to decrease the number
-	// of edges in the mesh.
-	nEdges--;
+	nRemainDofs++;
       }
     }
 
-    nLeaves--;
-    nElements--;
+    nVertices = nRemainDofs;
   }
 
   int Mesh::traverse(int level, Flag flag, int (*el_fct)(ElInfo*))
diff --git a/AMDiS/src/Mesh.h b/AMDiS/src/Mesh.h
index d9d87abca22f904a2b9ee5f88887310d7afc9d8c..a7acddc47bed822b9dd784b3f05d56430ad4040d 100644
--- a/AMDiS/src/Mesh.h
+++ b/AMDiS/src/Mesh.h
@@ -415,11 +415,11 @@ namespace AMDiS {
     void addMacroElement(MacroElement* me);
 
     /* \brief
-     * Removes a macro element from the mesh. This works only for the case, that
-     * there are no global or local refinements, i.e., all macro elements have no
-     * children.
+     * Removes a set of macro elements from the mesh. This works only for the case, 
+     * that there are no global or local refinements, i.e., all macro elements have 
+     * no children.
      */
-    void removeMacroElement(MacroElement* me);
+    void removeMacroElements(std::vector<MacroElement*>& macros);
 
     /// Frees the array of DOF pointers (see \ref createDOFPtrs)
     void freeDOFPtrs(DegreeOfFreedom **ptrs);
diff --git a/AMDiS/src/ParallelDomainProblem.cc b/AMDiS/src/ParallelDomainProblem.cc
index ac9b5573d9353f4dd9465edb5896156a9438d413..b793fadde6416f7c6286a5532f5ce603b95e663e 100644
--- a/AMDiS/src/ParallelDomainProblem.cc
+++ b/AMDiS/src/ParallelDomainProblem.cc
@@ -18,6 +18,7 @@ namespace AMDiS {
     : iterationIF(iIF),
       timeIF(tIF),
       mesh(m),
+      initialPartitionMesh(true),
       nRankDOFs(0)
   {
     mpiRank = MPI::COMM_WORLD.Get_rank();
@@ -95,23 +96,20 @@ namespace AMDiS {
       }
     }
 
-    bool removed = false;
-    do {
-      removed = false;
-      for (std::deque<MacroElement*>::iterator it = mesh->firstMacroElement();
-	   it != mesh->endOfMacroElements();
-	   ++it) {
-	PartitionElementData *partitionData = 
-	  dynamic_cast<PartitionElementData*>
-	  ((*it)->getElement()->getElementData(PARTITION_ED));
-	if (partitionData->getPartitionStatus() != IN) {
-	  mesh->removeMacroElement(*it);
-	  removed = true;
-	  break;
-	}
+    std::vector<MacroElement*> macrosToRemove;
+    for (std::deque<MacroElement*>::iterator it = mesh->firstMacroElement();
+	 it != mesh->endOfMacroElements();
+	 ++it) {
+      PartitionElementData *partitionData = 
+	dynamic_cast<PartitionElementData*>
+	((*it)->getElement()->getElementData(PARTITION_ED));
+      if (partitionData->getPartitionStatus() != IN) {
+	macrosToRemove.push_back(*it);
       }
-    } while (removed);
-    
+    }
+
+    mesh->removeMacroElements(macrosToRemove);
+
     int *gOrder = (int*)(malloc(sizeof(int) * rankDofs.size()));
     int *lOrder = (int*)(malloc(sizeof(int) * rankDofs.size()));
 
diff --git a/AMDiS/src/RefinementManager.cc b/AMDiS/src/RefinementManager.cc
index 1e2abc776cd1ca86e0b3f9277bd65c0e9d0add37..2ad6ea82787ab3dbd6803599437b997a2a5f11ca 100644
--- a/AMDiS/src/RefinementManager.cc
+++ b/AMDiS/src/RefinementManager.cc
@@ -34,10 +34,8 @@ namespace AMDiS {
       return static_cast<Flag>(0);
 
     globalMark = mark;
-    aMesh->traverse(-1, 
-		    Mesh::CALL_LEAF_EL |
-		    Mesh::FILL_COORDS |
-		    Mesh::FILL_BOUND, 
+    aMesh->traverse(-1,
+		    Mesh::CALL_LEAF_EL | Mesh::FILL_COORDS | Mesh::FILL_BOUND, 
 		    globalRefineFct);
     return refineMesh(aMesh);
   }
@@ -51,23 +49,22 @@ namespace AMDiS {
 
     mesh = aMesh;
     int n_elements = mesh->getNumberOfLeaves();
-    ElInfo *el_info;
-
+    ElInfo *elInfo;
     newCoords = false;
-
     stack = NEW TraverseStack;
     doMoreRecursiveRefine = true;
+
     while (doMoreRecursiveRefine) {
       doMoreRecursiveRefine = false;
-      el_info = stack->traverseFirst(mesh, -1, 
-				     Mesh::CALL_LEAF_EL | Mesh::FILL_NEIGH| Mesh::FILL_BOUND);
-      while (el_info) {
-	if (el_info->getElement()->getMark() > 0) {
+      elInfo = stack->traverseFirst(mesh, -1, 
+				    Mesh::CALL_LEAF_EL | Mesh::FILL_NEIGH | Mesh::FILL_BOUND);
+      while (elInfo) {
+	if (elInfo->getElement()->getMark() > 0) {
 	  doMoreRecursiveRefine = doMoreRecursiveRefine || 
-	    (el_info->getElement()->getMark() > 1);
-	  el_info = refineFunction(el_info);
-	}
-	el_info = stack->traverseNext(el_info);
+	    (elInfo->getElement()->getMark() > 1);
+	  elInfo = refineFunction(elInfo);
+	}	
+	elInfo = stack->traverseNext(elInfo);
       }
     }