diff --git a/AMDiS/libtool b/AMDiS/libtool
index 10b5aa1c338e90d57869a52c6b277086fbe72364..3b6673371f6b9a9c8f45abefeac61e4c5b70b66e 100755
--- a/AMDiS/libtool
+++ b/AMDiS/libtool
@@ -82,13 +82,13 @@ AR="ar"
 AR_FLAGS="cru"
 
 # A C compiler.
-LTCC="/usr/lib/openmpi/1.2.7-gcc//bin/mpicc"
+LTCC="gcc"
 
 # LTCC compiler flags.
 LTCFLAGS="-g -O2"
 
 # A language-specific compiler.
-CC="/usr/lib/openmpi/1.2.7-gcc//bin/mpicc"
+CC="gcc"
 
 # Is the compiler the GNU C compiler?
 with_gcc=yes
@@ -174,7 +174,7 @@ dlopen_self=unknown
 dlopen_self_static=unknown
 
 # Compiler flag to prevent dynamic linking.
-link_static_flag=""
+link_static_flag="-static"
 
 # Compiler flag to turn off builtin functions.
 no_builtin_flag=" -fno-builtin"
@@ -6801,13 +6801,13 @@ AR="ar"
 AR_FLAGS="cru"
 
 # A C compiler.
-LTCC="/usr/lib/openmpi/1.2.7-gcc//bin/mpicc"
+LTCC="gcc"
 
 # LTCC compiler flags.
 LTCFLAGS="-g -O2"
 
 # A language-specific compiler.
-CC="/usr/lib/openmpi/1.2.7-gcc//bin/mpiCC"
+CC="g++"
 
 # Is the compiler the GNU C compiler?
 with_gcc=yes
@@ -6893,7 +6893,7 @@ dlopen_self=unknown
 dlopen_self_static=unknown
 
 # Compiler flag to prevent dynamic linking.
-link_static_flag=""
+link_static_flag="-static"
 
 # Compiler flag to turn off builtin functions.
 no_builtin_flag=" -fno-builtin"
@@ -6960,11 +6960,11 @@ predeps=""
 
 # Dependencies to place after the objects being linked to create a
 # shared library.
-postdeps="-lmpi_cxx -lmpi -lopen-rte -lopen-pal -ldl -lnsl -lutil -ldl -lstdc++ -lm -lgcc_s -lpthread -lc -lgcc_s"
+postdeps="-lstdc++ -lm -lgcc_s -lc -lgcc_s"
 
 # The library search path used internally by the compiler when linking
 # a shared library.
-compiler_lib_search_path=`echo "-L/usr/lib/openmpi/1.2.7-gcc/lib -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/../../.." | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"`
+compiler_lib_search_path=`echo "-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/../../.." | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"`
 
 # Method to check whether dependent libraries are shared objects.
 deplibs_check_method="pass_all"
@@ -7109,7 +7109,7 @@ AR="ar"
 AR_FLAGS="cru"
 
 # A C compiler.
-LTCC="/usr/lib/openmpi/1.2.7-gcc//bin/mpicc"
+LTCC="gcc"
 
 # LTCC compiler flags.
 LTCFLAGS="-g -O2"
diff --git a/AMDiS/src/ElInfo2d.cc b/AMDiS/src/ElInfo2d.cc
index fbd38c3f29d6d0617b304566119bb1e3d7216e9b..a486147b186847d9038e09894b145e3c84af3ea6 100644
--- a/AMDiS/src/ElInfo2d.cc
+++ b/AMDiS/src/ElInfo2d.cc
@@ -79,7 +79,7 @@ namespace AMDiS {
 	  int edgeNo = oppVertex_[i] = mel->getOppVertex(i);
 
 
-	  if (nb->getFirstChild() && (edgeNo != 2)) {  
+	  if (nb->getFirstChild() && edgeNo != 2) {  
 
 	    // Search for the next neighbour. In many cases, the neighbour element 
 	    // may be refinemed in a way, such that there is no new vertex on the 
@@ -113,6 +113,7 @@ namespace AMDiS {
 	      //                -------
 	      //
 	      //            nb     el
+              //
 	      // That means, the edge 0 of the same level neighbour is the common
 	      // edge, i.e., the direct neighbour is the second child of the same
 	      // level neighbour.
@@ -178,10 +179,21 @@ namespace AMDiS {
 		break;
 		
 	      case 2:
+		if (*(macroNeighbour->getElement()->getDOF(2)) == *(element_->getDOF(0))) {
+		  neighbourCoord_[i][0] = macroNeighbour->coord[2];
+		  neighbourCoord_[i][1] = macroNeighbour->coord[1];
+		} else if (*(macroNeighbour->getElement()->getDOF(2)) == *(element_->getDOF(1))) {
+		  neighbourCoord_[i][0] = macroNeighbour->coord[0];
+		  neighbourCoord_[i][1] = macroNeighbour->coord[2];		 
+		} else {
+		  ERROR_EXIT("Should not happen!\n");
+		}
+
 		// I've deleted here some code, be I think that this case is not
 		// possible. If an error occurs in this line, please check AMDiS
 		// revision <= 476 at the same position.
-		ERROR_EXIT("Should not happen!\n");
+		//		ERROR_EXIT("Should not happen!\n");
+
 		break;
 
 	      default:
diff --git a/AMDiS/src/Element.cc b/AMDiS/src/Element.cc
index a3f77696e758bec87ab889cf7e6688aa5c0b0ab3..6934a84c6825f8d6f31858602b4bf6467f8480a4 100644
--- a/AMDiS/src/Element.cc
+++ b/AMDiS/src/Element.cc
@@ -156,14 +156,16 @@ namespace AMDiS {
       if (ndof > 0) {
 	for (int i = 0; i < mesh->getGeo(position); i++) {
 	  if (dof[j] != NULL) {
-	    if (Mesh::serializedDOFs[dof[j][0]] == NULL) {
+	    std::pair<DegreeOfFreedom, int> idx = std::make_pair(dof[j][0], pos);
+
+	    if (Mesh::serializedDOFs[idx] == NULL) {
 	      el->dof[j] = new DegreeOfFreedom[ndof];
 	      for (int k = 0; k < ndof; k++)
 		el->dof[j][k] = dof[j][k];
 
-	      Mesh::serializedDOFs[dof[j][0]] = el->dof[j];
+	      Mesh::serializedDOFs[idx] = el->dof[j];
 	    } else {
-	      el->dof[j] = Mesh::serializedDOFs[dof[j][0]];
+	      el->dof[j] = Mesh::serializedDOFs[idx];
 	    }
 	  } else {
 	    el->dof[j] = NULL;
@@ -175,12 +177,10 @@ namespace AMDiS {
     
     /* =========== And clone the children ============= */
 
-    if (child[0]) {
+    if (child[0]) 
       el->child[0] = child[0]->cloneWithDOFs();
-    }
-    if (child[1]) {
+    if (child[1])
       el->child[1] = child[1]->cloneWithDOFs();
-    }
 
     return el;
   }
@@ -264,7 +264,7 @@ namespace AMDiS {
     int edges = mesh->getGeo(EDGE); 
     int faces = mesh->getGeo(FACE);
 
-    if ((nd = admin->getNumberOfDOFs(VERTEX)))  {
+    if (nd = admin->getNumberOfDOFs(VERTEX)) {
       nd0 = admin->getNumberOfPreDOFs(VERTEX);
       n0 = admin->getMesh()->getNode(VERTEX);
       for (i = 0; i < vertices; i++) {
@@ -273,7 +273,7 @@ namespace AMDiS {
     }
 
     if (mesh->getDim() > 1) {
-      if ((nd = admin->getNumberOfDOFs(EDGE)))  {
+      if (nd = admin->getNumberOfDOFs(EDGE)) {
 	nd0 = admin->getNumberOfPreDOFs(EDGE);
 	n0 = admin->getMesh()->getNode(EDGE);
 	for (i = 0; i < edges; i++) {
@@ -283,7 +283,7 @@ namespace AMDiS {
     }
 
     if (mesh->getDim() == 3) {
-      if ((nd = admin->getNumberOfDOFs(FACE)))  {
+      if (nd = admin->getNumberOfDOFs(FACE)) {
 	nd0 = admin->getNumberOfPreDOFs(FACE);
 	n0 = admin->getMesh()->getNode(FACE);
 	for (i = 0; i < faces; i++) {
@@ -292,10 +292,11 @@ namespace AMDiS {
       }
     }
 
-    if ((nd = admin->getNumberOfDOFs(CENTER)))  {
+    if (nd = admin->getNumberOfDOFs(CENTER)) {
       nd0 = admin->getNumberOfPreDOFs(CENTER);
       n0 = admin->getMesh()->getNode(CENTER);
-      i = 0;          /* only one center */
+      // only one center
+      i = 0;   
       CHANGE_DOFS_2(this);
     }
   }
@@ -389,18 +390,26 @@ namespace AMDiS {
       if (ndof > 0) {
 	for (int i = 0; i < mesh->getGeo(position); i++) {
 	  if (dof[j] != NULL) {
-	    if (Mesh::serializedDOFs[dof[j][0]] == NULL) {
-	      Mesh::serializedDOFs[dof[j][0]] = dof[j];
+	    // Create index to check if the dofs were already written.
+	    std::pair<DegreeOfFreedom, int> idx = std::make_pair(dof[j][0], pos);
+
+	    if (Mesh::serializedDOFs[idx] == NULL) {
+	      Mesh::serializedDOFs[idx] = dof[j];
 	      out.write(reinterpret_cast<const char*>(&ndof), sizeof(int));
-	      out.write(reinterpret_cast<const char*>(dof[j]), ndof * sizeof(DegreeOfFreedom));
+	      out.write(reinterpret_cast<const char*>(&pos), sizeof(int));
+	      out.write(reinterpret_cast<const char*>(dof[j]), 
+			ndof * sizeof(DegreeOfFreedom));
 	    } else {
 	      int minusOne = -1;
 	      out.write(reinterpret_cast<const char*>(&minusOne), sizeof(int));
-	      out.write(reinterpret_cast<const char*>(&(dof[j][0])), sizeof(DegreeOfFreedom));
+	      out.write(reinterpret_cast<const char*>(&pos), sizeof(int));
+	      out.write(reinterpret_cast<const char*>(&(dof[j][0])), 
+			sizeof(DegreeOfFreedom));
 	    }
 	  } else {
 	    int zero = 0;
 	    out.write(reinterpret_cast<const char*>(&zero), sizeof(int));
+	    out.write(reinterpret_cast<const char*>(&pos), sizeof(int));
 	  }
 	  j++;
 	}
@@ -466,32 +475,35 @@ namespace AMDiS {
 
     dof = new DegreeOfFreedom*[nodes]; 
 
-    //    std::cout << "-- n = " << nodes << std::endl;
-
     for (int i = 0; i < nodes; i++) {
-      int nDofs;
+      int nDofs, pos;
       in.read(reinterpret_cast<char*>(&nDofs), sizeof(int));
-
-      //      std::cout << "d = " << nDofs << std::endl;
+      in.read(reinterpret_cast<char*>(&pos), sizeof(int));
 
       if (nDofs) {
 	if (nDofs != -1) {
 	  dof[i] = new DegreeOfFreedom[nDofs];
 	  in.read(reinterpret_cast<char*>(dof[i]), nDofs * sizeof(DegreeOfFreedom));
-	  if (Mesh::serializedDOFs[dof[i][0]] != NULL) {
-	    DegreeOfFreedom *dofPtr = Mesh::serializedDOFs[dof[i][0]];
+
+	  // Create index to check if the dofs were alread read from file.
+	  std::pair<DegreeOfFreedom, int> idx = std::make_pair(dof[i][0], pos);
+
+	  if (Mesh::serializedDOFs[idx] != NULL) {
+	    DegreeOfFreedom *dofPtr = Mesh::serializedDOFs[idx];
 	    delete [] dof[i];
 	    dof[i] = dofPtr;
 	  } else {
-	    Mesh::serializedDOFs[dof[i][0]] = dof[i];
+	    Mesh::serializedDOFs[idx] = dof[i];
 	  }
+
 	} else {
 	  DegreeOfFreedom index;
 	  in.read(reinterpret_cast<char*>(&index), sizeof(DegreeOfFreedom));
-	  TEST_EXIT(Mesh::serializedDOFs.find(index) != Mesh::serializedDOFs.end())
+
+	  std::pair<DegreeOfFreedom, int> idx = std::make_pair(index, pos);
+	  TEST_EXIT(Mesh::serializedDOFs.find(idx) !=  Mesh::serializedDOFs.end())
 	    ("This should never happen!\n");
-	  dof[i] = Mesh::serializedDOFs[index];
-	  //	  std::cout << "i = " << index << " " << Mesh::serializedDOFs[index] << " " << Mesh::serializedDOFs[index][0] << std::endl;
+	  dof[i] = Mesh::serializedDOFs[idx];
 	}
       } else {
 	dof[i] = NULL;
@@ -501,8 +513,6 @@ namespace AMDiS {
     // read index
     in.read(reinterpret_cast<char*>(&index), sizeof(int));
 
-    //    std::cout << "index = " << index << std::endl;
-
     // read mark
     in.read(reinterpret_cast<char*>(&mark), sizeof(signed char));
 
@@ -527,11 +537,11 @@ namespace AMDiS {
 
     if (typeName != "NULL") {
       elementData = CreatorMap<ElementData>::getCreator(typeName)->create();
-      if (elementData) {
+
+      if (elementData)
 	elementData->deserialize(in);
-      } else {
-	ERROR_EXIT("unexpected type name\n");
-      }
+      else
+	ERROR_EXIT("unexpected type name\n");      
     } else {
       elementData = NULL;
     }
@@ -544,9 +554,8 @@ namespace AMDiS {
     result += sizeof(Element);
     result += mesh->getNumberOfNodes() * sizeof(DegreeOfFreedom*);
 
-    if (child[0]) {
-      result += child[0]->calcMemoryUsage() + child[1]->calcMemoryUsage();
-    }
+    if (child[0])
+      result += child[0]->calcMemoryUsage() + child[1]->calcMemoryUsage();    
 
     return result;
   }
diff --git a/AMDiS/src/Mesh.cc b/AMDiS/src/Mesh.cc
index ac4f86fdc9c9fb06b9419b4c0a804e805d032701..3e75bcad1fd0a3989810ff29d9d64df96a1f1ff0 100644
--- a/AMDiS/src/Mesh.cc
+++ b/AMDiS/src/Mesh.cc
@@ -66,7 +66,7 @@ namespace AMDiS {
   Mesh* Mesh::traversePtr = NULL;
   std::vector<DegreeOfFreedom> Mesh::dof_used;
   const int Mesh::MAX_DOF = 100;
-  std::map<DegreeOfFreedom, DegreeOfFreedom*> Mesh::serializedDOFs;
+  std::map<std::pair<DegreeOfFreedom, int>, DegreeOfFreedom*> Mesh::serializedDOFs;
 
   struct delmem { 
     DegreeOfFreedom* ptr;
@@ -894,6 +894,39 @@ namespace AMDiS {
     return found;
   }
 
+  bool Mesh::getDofIndexCoords(DegreeOfFreedom dof, 
+			       const FiniteElemSpace* feSpace,
+			       WorldVector<double>& coords)
+  {
+    DimVec<double>* baryCoords;
+    bool found = false;
+    TraverseStack stack;
+    Vector<DegreeOfFreedom> dofVec(feSpace->getBasisFcts()->getNumber());
+
+    ElInfo *elInfo = stack.traverseFirst(this, -1, 
+					 Mesh::CALL_LEAF_EL | Mesh::FILL_COORDS);    
+    while (elInfo) {
+      feSpace->getBasisFcts()->getLocalIndicesVec(elInfo->getElement(),
+						  feSpace->getAdmin(),
+						  &dofVec);
+      for (int i = 0; i < feSpace->getBasisFcts()->getNumber(); i++) {
+	if (dofVec[i] == dof) {
+	  baryCoords = feSpace->getBasisFcts()->getCoords(i);
+	  elInfo->coordToWorld(*baryCoords, coords);
+	  found = true;
+	  break;	  
+	}
+      }
+      
+      if (found)
+	break;
+      
+      elInfo = stack.traverseNext(elInfo);
+    }
+
+    return found;
+  }
+
   void Mesh::setDiameter(const WorldVector<double>& w) 
   { 
     diam = w; 
diff --git a/AMDiS/src/Mesh.h b/AMDiS/src/Mesh.h
index 8905e5f9923bdd0bf1967a2d89eda878562e6718..68dc9399b33a528190cb191de9bd53cf75bef158 100644
--- a/AMDiS/src/Mesh.h
+++ b/AMDiS/src/Mesh.h
@@ -502,6 +502,9 @@ namespace AMDiS {
 			   const FiniteElemSpace* feSpace,
 			   WorldVector<double>& coords);
 
+    bool getDofIndexCoords(DegreeOfFreedom dof, 
+			   const FiniteElemSpace* feSpace,
+			   WorldVector<double>& coords);
 
     /// Returns FILL_ANY_?D
     inline static const Flag& getFillAnyFlag(int dim) 
@@ -749,8 +752,17 @@ namespace AMDiS {
     /// Used by check functions
     static std::vector<DegreeOfFreedom> dof_used;
 
-    ///
-    static std::map<DegreeOfFreedom, DegreeOfFreedom*> serializedDOFs;
+    /** \brief
+     * This map is used for serialization and deserialization of mesh elements. 
+     * During the serialization process, all elements are visited and their dof indices
+     * are written to the file. If a dof index at a position, i.e. vertex, line or face,
+     * was written to file, the combination of dof index and position is inserted to
+     * this map. That ensures that the same dof at the same position, but being part of
+     * another element, is not written twice to the file. 
+     * When a state should be deserialized, the information can be used to construct
+     * exactly the same dof structure.
+     */
+    static std::map<std::pair<DegreeOfFreedom, int>, DegreeOfFreedom*> serializedDOFs;
 
     /** \brief
      * Used while mesh refinement. To create new elements