diff --git a/AMDiS/CMakeLists.txt b/AMDiS/CMakeLists.txt
index 0d26b1968fc0ca354e5a66abb522a50dbe6b2641..f2575d357553238036baf2dec940839450412149 100644
--- a/AMDiS/CMakeLists.txt
+++ b/AMDiS/CMakeLists.txt
@@ -104,6 +104,7 @@ SET(AMDIS_SRC ${SOURCE_DIR}/AdaptBase.cc
 	      ${SOURCE_DIR}/Line.cc
 	      ${SOURCE_DIR}/MacroElement.cc
 	      ${SOURCE_DIR}/Marker.cc
+	      ${SOURCE_DIR}/MatrixVector.cc
 	      ${SOURCE_DIR}/Mesh.cc
 	      ${SOURCE_DIR}/MeshStructure.cc
 	      ${SOURCE_DIR}/Operator.cc
diff --git a/AMDiS/src/MatrixVector.cc b/AMDiS/src/MatrixVector.cc
new file mode 100644
index 0000000000000000000000000000000000000000..361fc0cd1e10599fd8b57a90159034c392190811
--- /dev/null
+++ b/AMDiS/src/MatrixVector.cc
@@ -0,0 +1,38 @@
+//
+// Software License for AMDiS
+//
+// Copyright (c) 2010 Dresden University of Technology 
+// All rights reserved.
+// Authors: Simon Vey, Thomas Witkowski et al.
+//
+// This file is part of AMDiS
+//
+// See also license.opensource.txt in the distribution.
+
+
+#include "MatrixVector.h"
+#include "FiniteElemSpace.h"
+#include "DOFMatrix.h"
+
+namespace AMDiS {
+
+  vector<const FiniteElemSpace*> getFeSpaces(Matrix<DOFMatrix*> &mat)
+  {
+    FUNCNAME("getFeSpaces()");
+
+    int nComponents = mat.getNumRows();
+    vector<const FiniteElemSpace*> result(nComponents);
+
+    for (int i = 0; i < nComponents; i++) {
+      for (int j = 0; j < nComponents; j++) {
+	if (mat[i][j]) {
+	  result[i] = mat[i][j]->getRowFeSpace();
+	  break;
+	}
+      }
+    }
+
+    return result;
+  }
+
+}
diff --git a/AMDiS/src/MatrixVector.h b/AMDiS/src/MatrixVector.h
index 6b043fd0849290e73e22dc355458504e35357931..9edba99b9def59b87a5b0f8615d95d3c40fa38e1 100644
--- a/AMDiS/src/MatrixVector.h
+++ b/AMDiS/src/MatrixVector.h
@@ -518,6 +518,10 @@ namespace AMDiS {
     z[2] = x[0] * y[1] - x[1] * y[0];
   }
 
+
+  /// Returns a vector with the FE spaces of each row in the matrix. Thus, the
+  /// resulting vector may contain the same FE space multiple times.
+  vector<const FiniteElemSpace*> getFeSpaces(Matrix<DOFMatrix*> &mat);
 }
 
 #endif // AMDIS_MATRIXVECTOR_H
diff --git a/AMDiS/src/parallel/ParallelCoarseSpaceMatVec.cc b/AMDiS/src/parallel/ParallelCoarseSpaceMatVec.cc
index 0934f36b0f1974708599457391c876200f1834ae..f98d4c8a3e08fdb2fcf7dd374415887245fc3980 100644
--- a/AMDiS/src/parallel/ParallelCoarseSpaceMatVec.cc
+++ b/AMDiS/src/parallel/ParallelCoarseSpaceMatVec.cc
@@ -89,7 +89,7 @@ namespace AMDiS {
       int nMat = uniqueCoarseMap.size() + 1;
       nnz.resize(nMat);
       for (int i = 0; i < nMat; i++) {
-	nnz.resize(nMat);
+	nnz[i].resize(nMat);
 	for (int j = 0; j < nMat; j++)
 	  nnz[i][j].clear();
       }
@@ -105,13 +105,15 @@ namespace AMDiS {
 	    continue;
 
 	  if (i == j) {
-	    nnz[i][j].create(seqMat, mpiCommGlobal, coarseSpaceMap, NULL,
+	    nnz[i][j].create(seqMat, mpiCommGlobal, *(coarseSpaceMap[i - 1]), NULL,
 			     meshDistributor->getElementObjectDb());
 	  } else {
-	    ParallelDofMapping *rowMap = NULL;
-	    ParallelDofMapping *colMap = NULL;
-	    
-	    nnz[i][j].create(seqMat, mpiCommGlobal, *rowMap, *colMap, NULL,
+	    ParallelDofMapping &rowMap = 
+	      (i == 0 ? *interiorMap : *(coarseSpaceMap[i - 1]));
+	    ParallelDofMapping &colMap =
+	      (j == 0 ? *interiorMap : *(coarseSpaceMap[j - 1]));
+
+	    nnz[i][j].create(seqMat, mpiCommGlobal, rowMap, colMap, NULL,
 			     meshDistributor->getElementObjectDb());
 
 	/*
diff --git a/AMDiS/src/parallel/ParallelCoarseSpaceMatVec.h b/AMDiS/src/parallel/ParallelCoarseSpaceMatVec.h
index 6ddeb9f5db9975e2d6feaa410bc183186813e812..4be886a64c94a00e18d26b67657638f464c308d7 100644
--- a/AMDiS/src/parallel/ParallelCoarseSpaceMatVec.h
+++ b/AMDiS/src/parallel/ParallelCoarseSpaceMatVec.h
@@ -27,6 +27,7 @@
 #include <map>
 #include <petsc.h>
 #include "AMDiS_fwd.h"
+#include "parallel/MatrixNnzStructure.h"
 
 namespace AMDiS {
 
diff --git a/AMDiS/src/parallel/PetscSolver.cc b/AMDiS/src/parallel/PetscSolver.cc
index 0b16c340580db29c930f46c5a33260199be510a6..6b25876a3c0558052c86950b59d22ec33aaa1aac 100644
--- a/AMDiS/src/parallel/PetscSolver.cc
+++ b/AMDiS/src/parallel/PetscSolver.cc
@@ -135,30 +135,6 @@ namespace AMDiS {
   }
 
 
-  vector<const FiniteElemSpace*> PetscSolver::getFeSpaces(Matrix<DOFMatrix*> *mat)
-  {
-    FUNCNAME("PetscSolver::getFeSpaces()");
-
-    int nComponents = mat->getNumRows();
-    vector<const FiniteElemSpace*> result(nComponents);
-
-    for (int i = 0; i < nComponents; i++) 
-      for (int j = 0; j < nComponents; j++)
-	if ((*mat)[i][j]) {
-	  result[i] = (*mat)[i][j]->getRowFeSpace();
-	  break;
-	}
-
-#if (DEBUG != 0)
-    // === In debug mode, we test if all FE spaces of the matrix are also ===
-    // === considered by the mesh distributor.                            ===
-    checkFeSpaces(result);
-#endif
-
-    return result;
-  }
-
-
   vector<const FiniteElemSpace*> PetscSolver::getFeSpaces(SystemVector *vec)
   {
     FUNCNAME("PetscSolver::getFeSpaces()");
diff --git a/AMDiS/src/parallel/PetscSolver.h b/AMDiS/src/parallel/PetscSolver.h
index 6551d18a307074fb1dff27652aeb4ccd275385da..81f4e1a11eb2bcdf9124df77db7c601bcabab282 100644
--- a/AMDiS/src/parallel/PetscSolver.h
+++ b/AMDiS/src/parallel/PetscSolver.h
@@ -229,10 +229,6 @@ namespace AMDiS {
     /// Checks if all given FE spaces are handled by the mesh distributor.
     void checkFeSpaces(vector<const FiniteElemSpace*>& feSpaces);
 
-    /// Returns a vector with the FE spaces of each row in the matrix. Thus, the
-    /// resulting vector may contain the same FE space multiple times.
-    vector<const FiniteElemSpace*> getFeSpaces(Matrix<DOFMatrix*> *mat);
-
     /// Returns a vector with the FE spaces of all components of a system vector.
     vector<const FiniteElemSpace*> getFeSpaces(SystemVector *vec);
 
diff --git a/AMDiS/src/parallel/PetscSolverFeti.cc b/AMDiS/src/parallel/PetscSolverFeti.cc
index 8905d8849cac52771a71e0316d1d2ba88e934d3e..e5b21db5cd7e7bdb3bae1908d79fbe5d9114e7bb 100644
--- a/AMDiS/src/parallel/PetscSolverFeti.cc
+++ b/AMDiS/src/parallel/PetscSolverFeti.cc
@@ -11,6 +11,7 @@
 
 
 #include "AMDiS.h"
+#include "MatrixVector.h"
 #include "parallel/PetscSolverFeti.h"
 #include "parallel/PetscSolverFetiStructs.h"
 #include "parallel/StdMpi.h"
@@ -1351,7 +1352,7 @@ namespace AMDiS {
     
     // === Create all sets and indices. ===
     
-    vector<const FiniteElemSpace*> feSpaces = getFeSpaces(mat);
+    vector<const FiniteElemSpace*> feSpaces = AMDiS::getFeSpaces(*mat);
 
     initialize(feSpaces);
 
diff --git a/AMDiS/src/parallel/PetscSolverGlobalMatrix.cc b/AMDiS/src/parallel/PetscSolverGlobalMatrix.cc
index d82b8caec741585eca074c63f91896d2ae70bb6e..d75905b250d247a93ff6c71aef045de4d13f77bb 100644
--- a/AMDiS/src/parallel/PetscSolverGlobalMatrix.cc
+++ b/AMDiS/src/parallel/PetscSolverGlobalMatrix.cc
@@ -24,7 +24,7 @@ namespace AMDiS {
     petscData.init(interiorMap, coarseSpaceMap, 
 		   subdomainLevel, mpiCommLocal, mpiCommGlobal,
 		   meshDistributor);
-    petscData.create();
+    petscData.create(*seqMat);
 
     if (coarseSpaceMap.size()) {
       updateSubdomainData();
@@ -130,7 +130,7 @@ namespace AMDiS {
     TEST_EXIT_DBG(coarseSpaceMap.size() == seqMat->getSize())
       ("Wrong sizes %d %d\n", coarseSpaceMap.size(), seqMat->getSize());
 
-    vector<const FiniteElemSpace*> feSpaces = getFeSpaces(seqMat);
+    vector<const FiniteElemSpace*> feSpaces = AMDiS::getFeSpaces(*seqMat);
 
     int nRowsRankInterior = interiorMap->getRankDofs();
     int nRowsOverallInterior = interiorMap->getOverallDofs();