diff --git a/AMDiS/src/CoarseningManager3d.cc b/AMDiS/src/CoarseningManager3d.cc
index 8b91217a54a31c52bc5c9da5aef2babb0b3b718c..e5a370e07849e4f7f1de791d5cd783b09aa19335 100644
--- a/AMDiS/src/CoarseningManager3d.cc
+++ b/AMDiS/src/CoarseningManager3d.cc
@@ -24,7 +24,8 @@ namespace AMDiS {
 
   int CoarseningManager3d::coarsenFunction(ElInfo *el_info)
   {
-    Tetrahedron *el = dynamic_cast<Tetrahedron*>(const_cast<Element*>(el_info->getElement()));
+    Tetrahedron *el = 
+      dynamic_cast<Tetrahedron*>(const_cast<Element*>(el_info->getElement()));
     DegreeOfFreedom *edge[2];
     int n_neigh, bound = 0;
     ElInfo *elinfo = el_info;
@@ -122,7 +123,8 @@ namespace AMDiS {
   void CoarseningManager3d::coarsenTetrahedron(RCNeighbourList *coarsenList, 
 					       int index)
   {
-    Tetrahedron *el = dynamic_cast<Tetrahedron*>(const_cast<Element*>(coarsenList->getElement(index)));
+    Tetrahedron *el = 
+      dynamic_cast<Tetrahedron*>(const_cast<Element*>(coarsenList->getElement(index)));
     Tetrahedron *child[2];
     Tetrahedron *neigh;
     int dir, el_type, i, node, opp_v;
@@ -137,7 +139,8 @@ namespace AMDiS {
     /****************************************************************************/
 
     for (dir = 0; dir < 2; dir++) {
-      neigh = dynamic_cast<Tetrahedron*>(const_cast<Element*>( coarsenList->getNeighbourElement(index, dir)));
+      neigh = 
+	dynamic_cast<Tetrahedron*>(const_cast<Element*>(coarsenList->getNeighbourElement(index, dir)));
       opp_v = coarsenList->getOppVertex(index, dir);
 
       if (!neigh  ||  neigh->isLeaf()) {
@@ -147,13 +150,13 @@ namespace AMDiS {
 
 	if (mesh->getNumberOfDofs(EDGE)) {
 	  node = mesh->getNode(EDGE) + Tetrahedron::nChildEdge[el_type][0][dir];
-	  mesh->freeDof(const_cast<int*>( child[0]->getDof(node)), EDGE);
+	  mesh->freeDof(const_cast<int*>(child[0]->getDof(node)), EDGE);
 	}
 	if (mesh->getNumberOfDofs(FACE)) {
 	  node = mesh->getNode(FACE) + Tetrahedron::nChildFace[el_type][0][dir];
-	  mesh->freeDof(const_cast<int*>( child[0]->getDof(node)), FACE);
+	  mesh->freeDof(const_cast<int*>(child[0]->getDof(node)), FACE);
 	  node = mesh->getNode(FACE) + Tetrahedron::nChildFace[el_type][1][dir];
-	  mesh->freeDof(const_cast<int*>( child[1]->getDof(node)), FACE);
+	  mesh->freeDof(const_cast<int*>(child[1]->getDof(node)), FACE);
 	}
       }
     }
@@ -165,14 +168,14 @@ namespace AMDiS {
 
     if (mesh->getNumberOfDofs(FACE)) {
       node = mesh->getNode(FACE);
-      mesh->freeDof(const_cast<int*>( child[0]->getDof(node)), FACE);
+      mesh->freeDof(const_cast<int*>(child[0]->getDof(node)), FACE);
     }
 
 
     if (mesh->getNumberOfDofs(CENTER)) {
       node = mesh->getNode(CENTER);
       for (i = 0; i < 2; i++)
-	mesh->freeDof(const_cast<int*>( child[i]->getDof(node)), CENTER);
+	mesh->freeDof(const_cast<int*>(child[i]->getDof(node)), CENTER);
     }
 
     /****************************************************************************/
@@ -250,15 +253,19 @@ namespace AMDiS {
 			 
     while (neigh != el) {
       for (j = 0; j < n_vertices; j++)
-	if (neigh->getDof(j) == edge[0])  break;
+	if (neigh->getDof(j) == edge[0])
+	  break;
       for (k = 0; k < n_vertices; k++)
-	if (neigh->getDof(k) == edge[1])  break;
+	if (neigh->getDof(k) == edge[1])
+	  break;
 
       if (j > 3 || k > 3) {
 	for (j = 0; j < n_vertices; j++)
-	  if (mesh->associated(neigh->getDof(j, 0), edge[0][0]))  break;
+	  if (mesh->associated(neigh->getDof(j, 0), edge[0][0]))
+	    break;
 	for (k = 0; k < n_vertices; k++)
-	  if (mesh->associated(neigh->getDof(k, 0), edge[1][0]))  break;
+	  if (mesh->associated(neigh->getDof(k, 0), edge[1][0]))
+	    break;
      
 	TEST_EXIT_DBG(j < n_vertices  &&  k < n_vertices)
 	  ("dof %d or dof %d not found on element %d with nodes (%d %d %d %d)\n", 
@@ -305,7 +312,7 @@ namespace AMDiS {
     /*  the domain's boundary is reached; loop back to the starting el          */
     /****************************************************************************/
 
-    i = *n_neigh-1;
+    i = *n_neigh - 1;
     opp_v = coarsenList->getOppVertex(i, 0);
     do {
       TEST_EXIT_DBG(neigh_info->getNeighbour(opp_v)  &&  i > 0)
@@ -326,32 +333,32 @@ namespace AMDiS {
 					 int n_neigh, 
 					 int bound)
   {
-    Tetrahedron *el = dynamic_cast<Tetrahedron*>(const_cast<Element*>( coarsenList->getElement(0)));
-    int i, node;
-    DegreeOfFreedom *dof;
+    FUNCNAME("CoarseningManager3d::coarsenPatch()");
+
+    Tetrahedron *el = 
+      dynamic_cast<Tetrahedron*>(const_cast<Element*>(coarsenList->getElement(0)));
+    DegreeOfFreedom *dof = NULL;
+
+    TEST_EXIT_DBG(el)("No element!\n");
+    TEST_EXIT_DBG(el->getChild(0))("No child in element!\n");
 
     if (mesh->getNumberOfDofs(EDGE)) {
-      /****************************************************************************/
-      /*  get dof for coarsening edge                                             */
-      /****************************************************************************/
-      node = mesh->getNode(EDGE);
-      if (!(dof = const_cast<int*>( el->getDof(node))))
+      // === Get dof for coarsening edge. ===
+
+      int node = mesh->getNode(EDGE);
+      if (!(dof = const_cast<int*>(el->getDof(node))))
 	dof = mesh->getDof(EDGE);
-    } else {
-      dof = NULL;
     }
 
     if (mesh->getNumberOfDofs(EDGE) || 
 	mesh->getNumberOfDofs(FACE) || 
 	mesh->getNumberOfDofs(CENTER)) {     
-      for (i = 0; i < n_neigh; i++)
+      for (int i = 0; i < n_neigh; i++)
 	coarsenList->addDOFParent(i, dof);
     }
       
 
-    /****************************************************************************/
-    /*  restrict dof vectors to the parents on the patch                        */
-    /****************************************************************************/
+    // === Restrict dof vectors to the parents on the patch. ===
 
     int nrAdmin = mesh->getNumberOfDOFAdmin();
     for (int iadmin = 0; iadmin < nrAdmin; iadmin++) {
@@ -362,41 +369,35 @@ namespace AMDiS {
 	(*it)->coarseRestrict(*coarsenList, n_neigh);
     } 
 
-    /****************************************************************************/
-    /*  and now start to coarsen the patch:                                     */
-    /****************************************************************************/
-    /*  remove dof's of the coarsening edge                                     */
-    /****************************************************************************/
+    // === And now start to coarsen the patch: remove dof's of the coarsening edge. ===
 
-    mesh->freeDof(const_cast<int*>( el->getChild(0)->getDof(3)), VERTEX);
+    mesh->freeDof(const_cast<int*>(el->getChild(0)->getDof(3)), VERTEX);
     mesh->incrementNumberOfVertices(-1);
 
     if (mesh->getNumberOfDofs(EDGE)) {
-      node = mesh->getNode(EDGE) + 2;
-      mesh->freeDof(const_cast<int*>( el->getChild(0)->getDof(node)), EDGE);
-      mesh->freeDof(const_cast<int*>( el->getChild(1)->getDof(node)), EDGE);
+      int node = mesh->getNode(EDGE) + 2;
+      mesh->freeDof(const_cast<int*>(el->getChild(0)->getDof(node)), EDGE);
+      mesh->freeDof(const_cast<int*>(el->getChild(1)->getDof(node)), EDGE);
     }
 
     if (coarsenList->getElement(0)->isNewCoordSet())
       coarsenList->getElement(0)->eraseNewCoord();   
 
-    for (i = 0; i < n_neigh; i++) {
+    for (int i = 0; i < n_neigh; i++) {
       coarsenList->getElement(i)->setNewCoord(NULL);
       coarsenTetrahedron(coarsenList, i);
     }
 
-    /****************************************************************************/
-    /*  if the coarsening edge is an interior edge there are  n_neigh + 1 edges */
-    /*  and 2*n_neigh + 1 faces removed; if it is a boundary edge it is one     */
-    /*  more edge and one more face                                             */
-    /****************************************************************************/
+    // === If the coarsening edge is an interior edge there are  n_neigh + 1 edges ===
+    // === and 2 * n_neigh + 1 faces removed; if it is a boundary edge it is one   ===
+    // === more edge and one more face.                                            ===
 
     if (bound) {
       mesh->incrementNumberOfEdges(-(n_neigh + 2));
-      mesh->incrementNumberOfFaces(-(2*n_neigh + 1));
+      mesh->incrementNumberOfFaces(-(2 * n_neigh + 1));
     } else {
       mesh->incrementNumberOfEdges(-(n_neigh + 1));
-      mesh->incrementNumberOfFaces(-(2*n_neigh));
+      mesh->incrementNumberOfFaces(-(2 * n_neigh));
     }
   }
 
diff --git a/AMDiS/src/parallel/MeshDistributor.cc b/AMDiS/src/parallel/MeshDistributor.cc
index 3afa0c5841702c2b96a9bf356dc4460340dca523..132595e230b66f9698044f0cfa503e908235e29a 100644
--- a/AMDiS/src/parallel/MeshDistributor.cc
+++ b/AMDiS/src/parallel/MeshDistributor.cc
@@ -1132,6 +1132,12 @@ namespace AMDiS {
     MSG("Debug mode tests finished!\n");
 #endif
 
+    // === In 3D we have to make some test, if the resulting mesh is valid. If   ===
+    // === it is not valid, there is no possiblity yet to fix this problem, just ===
+    // === exit with an error message.                                           ===
+    
+    check3dValidMesh();
+
     MSG("Mesh repartitioning needed %.5f seconds\n", MPI::Wtime() - timePoint);
   }