diff --git a/AMDiS/src/parallel/DofComm.cc b/AMDiS/src/parallel/DofComm.cc
index dd812a66ff81522a993d906cc4fa8606918b8976..61f8dfa900d54645db83dbabfc8a6eb55b77cc28 100644
--- a/AMDiS/src/parallel/DofComm.cc
+++ b/AMDiS/src/parallel/DofComm.cc
@@ -38,14 +38,18 @@ namespace AMDiS {
   }
 
   
-  void DofComm::Iterator::setNextFeMap()
+  bool DofComm::Iterator::setNextFeMap()
   {
+    FUNCNAME("DofComm::Iterator::setNextFeMap()");
+
     if (dataIter != dofComm.data.end()) {
+      TEST_EXIT_DBG(dataIter->second.size())("Should not happen!\n");
+
       feMapIter = dataIter->second.begin();
       
       if (traverseFeSpace != NULL) {
-	TEST_EXIT_DBG(dataIter->second.count(traverseFeSpace))
-	  ("Should not happen!\n");
+	if ((dataIter->second.count(traverseFeSpace) == 0))
+	  return false;
 	
 	while (feMapIter->first != traverseFeSpace &&
 	       feMapIter != dataIter->second.end())
@@ -56,11 +60,11 @@ namespace AMDiS {
 	  ("Should not happen!\n");
       }
       
-      if (feMapIter != dataIter->second.end())
-	dofIter = feMapIter->second.begin();
-      
+      dofIter = feMapIter->second.begin();      
       dofCounter = 0;
     }
+
+    return true;
   }
 
 }
diff --git a/AMDiS/src/parallel/DofComm.h b/AMDiS/src/parallel/DofComm.h
index 5ef1cc8723a5d3fa5fff0d9c96bf14f3d5b8de42..58d5dd25f9f2956145f27089e3287c9c5b8f962d 100644
--- a/AMDiS/src/parallel/DofComm.h
+++ b/AMDiS/src/parallel/DofComm.h
@@ -77,7 +77,8 @@ namespace AMDiS {
 
 	dataIter = dofComm.data.begin();
 
-	setNextFeMap();
+	while (setNextFeMap() == false)
+	  ++dataIter;
       }
 
       inline bool end()
@@ -87,9 +88,9 @@ namespace AMDiS {
       
       inline void nextRank()
       {
-	++dataIter;
-
-	setNextFeMap();
+	do {
+	  ++dataIter;
+	} while (setNextFeMap() == false);
       }
 
       inline void nextFeSpace()
@@ -101,9 +102,9 @@ namespace AMDiS {
       {
 	++feMapIter;
 	if (feMapIter == dataIter->second.end()) {
-	  ++dataIter;
-
-	  setNextFeMap();
+	  do {
+	    ++dataIter;
+	  } while (setNextFeMap() == false);
 	} else {
 	  dofIter = feMapIter->second.begin();
 	  dofCounter = 0;
@@ -122,15 +123,17 @@ namespace AMDiS {
 	    ++feMapIter;
 	}
 
-	TEST_EXIT_DBG(feMapIter != dataIter->second.end())
-	  ("Should not happen!\n");
-
-	dofIter = feMapIter->second.begin();
-	dofCounter = 0;
+	if (feMapIter != dataIter->second.end()) {
+	  dofIter = feMapIter->second.begin();
+	  dofCounter = 0;
+	}
       }
 
       inline bool endDofIter()
       {
+	if (feMapIter == dataIter->second.end())
+	  return true;
+
 	return (dofIter == feMapIter->second.end());
       }
       
@@ -171,7 +174,7 @@ namespace AMDiS {
       }
 
     protected:
-      void setNextFeMap();
+      bool setNextFeMap();
 
     protected:
       DofComm &dofComm;
diff --git a/AMDiS/src/parallel/PetscProblemStat.cc b/AMDiS/src/parallel/PetscProblemStat.cc
index 16f4df52d61360c7f579b0039bf3dc5987dfcd0b..a2afb7d5c3ed379accce239862323470d7d145ee 100644
--- a/AMDiS/src/parallel/PetscProblemStat.cc
+++ b/AMDiS/src/parallel/PetscProblemStat.cc
@@ -31,26 +31,30 @@ namespace AMDiS {
   {
     FUNCNAME("PetscProblemStat::PetscProblemStat()");
 
-    string name("");
-    Parameters::get("parallel->solver", name);
+    string tmp("");
+    Parameters::get("parallel->solver", tmp);
     
-    if (name == "petsc-schur") {
+    if (tmp == "petsc-schur") {
       petscSolver = new PetscSolverSchur();
-    } else if (name == "petsc-feti") {
+    } else if (tmp == "petsc-feti") {
       petscSolver = new PetscSolverFeti();
-    } else if (name == "petsc-block") {
+    } else if (tmp == "petsc-block") {
       petscSolver = new PetscSolverGlobalBlockMatrix();
-    } else if (name == "petsc" || name == "") {
+    } else if (tmp == "petsc" || tmp == "") {
       petscSolver = new PetscSolverGlobalMatrix();
-    } else if (name == "bddcml") {
+    } else if (tmp == "bddcml") {
 #ifdef HAVE_BDDC_ML
       petscSolver = new BddcMlSolver();
 #else
       ERROR_EXIT("AMDiS was compiled without BDDC-ML support!\n");
 #endif
     } else {
-      ERROR_EXIT("No parallel solver %s available!\n", name.c_str());
+      ERROR_EXIT("No parallel solver %s available!\n", tmp.c_str());
     }
+
+    tmp = "";
+    Parameters::get(nameStr + "->solver->petsc prefix", tmp);
+    petscSolver->setKspPrefix(tmp);    
   }
 
 
diff --git a/AMDiS/src/parallel/PetscSolver.cc b/AMDiS/src/parallel/PetscSolver.cc
index 6c5b210944b6bba213ad1e6a6d979b3bf1081eab..ad2d7cc9eeedd1002469cd99011c18364d807109 100644
--- a/AMDiS/src/parallel/PetscSolver.cc
+++ b/AMDiS/src/parallel/PetscSolver.cc
@@ -18,6 +18,18 @@ namespace AMDiS {
 
   using namespace std;
 
+  PetscSolver::PetscSolver()
+    : meshDistributor(NULL),
+      mpiRank(-1),
+      kspPrefix("")
+  {
+    string kspStr = "";
+    Parameters::get("parallel->solver->petsc->ksp", kspStr);
+    if (kspStr != "")
+      PetscOptionsInsertString(kspStr.c_str());
+  }
+
+
   void PetscSolver::printSolutionInfo(AdaptInfo *adaptInfo,
 				      bool iterationCounter, 
 				      bool residual)
diff --git a/AMDiS/src/parallel/PetscSolver.h b/AMDiS/src/parallel/PetscSolver.h
index cb02f06804e7ce4961ea971fa58419c4321ea82b..3c2e3e1d13a882c6988131744f24ecb06c4c1bb3 100644
--- a/AMDiS/src/parallel/PetscSolver.h
+++ b/AMDiS/src/parallel/PetscSolver.h
@@ -46,10 +46,7 @@ namespace AMDiS {
   class PetscSolver
   {
   public:
-    PetscSolver()
-      : meshDistributor(NULL),
-	mpiRank(-1)
-    {}
+    PetscSolver();
 
     virtual ~PetscSolver() {}
 
@@ -96,6 +93,11 @@ namespace AMDiS {
       return pc; 
     }
 
+    void setKspPrefix(std::string s)
+    {
+      kspPrefix = s;
+    }
+
   protected:
     void printSolutionInfo(AdaptInfo* adaptInfo,
 			   bool iterationCounter = true,
@@ -135,15 +137,18 @@ namespace AMDiS {
     /// Petsc's matrix structure.
     Mat petscMatrix;
 
-    /** \brief
-     * PETSc's vector structures for the rhs vector, the solution vector and a
-     * temporary vector for calculating the final residuum.
-     */
+    /// PETSc's vector structures for the rhs vector, the solution vector and a
+    /// temporary vector for calculating the final residuum.
     Vec petscRhsVec, petscSolVec, petscTmpVec;
 
+    /// PETSc solver object
     KSP solver;
 
+    /// PETSc preconditioner object
     PC pc;
+
+    /// KSP database prefix
+    string kspPrefix;
   };
 
 
diff --git a/AMDiS/src/parallel/PetscSolverGlobalMatrix.cc b/AMDiS/src/parallel/PetscSolverGlobalMatrix.cc
index 8470ad97aaefc884aa12eef56dbc4338790cd65a..cd21ab4319d34c9016104d69f4440b31ec11740b 100644
--- a/AMDiS/src/parallel/PetscSolverGlobalMatrix.cc
+++ b/AMDiS/src/parallel/PetscSolverGlobalMatrix.cc
@@ -10,6 +10,7 @@
 // See also license.opensource.txt in the distribution.
 
 
+#include "AMDiS.h"
 #include "parallel/PetscSolverGlobalMatrix.h"
 #include "parallel/StdMpi.h"
 #include "parallel/MpiHelper.h"
@@ -113,6 +114,7 @@ namespace AMDiS {
     KSPSetOperators(solver, petscMatrix, petscMatrix, SAME_NONZERO_PATTERN); 
     KSPSetTolerances(solver, 0.0, 1e-8, PETSC_DEFAULT, PETSC_DEFAULT);
     KSPSetType(solver, KSPBCGS);
+    KSPSetOptionsPrefix(solver, kspPrefix.c_str());
     KSPSetFromOptions(solver);
     PCSetFromOptions(pc);
 
@@ -171,7 +173,11 @@ namespace AMDiS {
     }
 
     // PETSc.
-    KSPSolve(solver, petscRhsVec, petscSolVec);
+    PetscErrorCode solverError = KSPSolve(solver, petscRhsVec, petscSolVec);
+    if (solverError != 0) {
+      AMDiS::finalize();
+      exit(-1);
+    }
 
     // === Transfere values from PETSc's solution vectors to the DOF vectors. ===
     PetscScalar *vecPointer;