Index: source/lac/petsc_solver.cc
===================================================================
--- source/lac/petsc_solver.cc	(revision 25383)
+++ source/lac/petsc_solver.cc	(working copy)
@@ -73,6 +73,7 @@
                      const PreconditionerBase &preconditioner)
   {
     int ierr;
+    bool petsc_owns_solver_convergence=false;
                                      // first create a solver object if this
                                      // is necessary
     if (solver_data.get() == 0)
@@ -99,19 +100,21 @@
         ierr = KSPSetPC (solver_data->ksp, preconditioner.get_pc());
         AssertThrow (ierr == 0, ExcPETScError(ierr));
 
+        if ( !petsc_owns_solver_convergence ) {
                                          // then a convergence monitor
                                          // function. that function simply
                                          // checks with the solver_control
                                          // object we have in this object for
                                          // convergence
 #if DEAL_II_PETSC_VERSION_LT(3,0,0)
-        KSPSetConvergenceTest (solver_data->ksp, &convergence_test,
-                               reinterpret_cast<void *>(&solver_control));
+          KSPSetConvergenceTest (solver_data->ksp, &convergence_test,
+                                 reinterpret_cast<void *>(&solver_control));
 #else
-        KSPSetConvergenceTest (solver_data->ksp, &convergence_test,
-                               reinterpret_cast<void *>(&solver_control),
-                               PETSC_NULL);
+          KSPSetConvergenceTest (solver_data->ksp, &convergence_test,
+                                 reinterpret_cast<void *>(&solver_control),
+                                 PETSC_NULL);
 #endif
+        }
 
       }
 
@@ -138,10 +141,32 @@
 
                                      // in case of failure: throw
                                      // exception
-    if (solver_control.last_check() != SolverControl::success)
-      throw SolverControl::NoConvergence (solver_control.last_step(),
-                                          solver_control.last_value());
-                                     // otherwise exit as normal
+    if ( !petsc_owns_solver_convergence ) {
+
+      if (solver_control.last_check() != SolverControl::success)
+        throw SolverControl::NoConvergence (solver_control.last_step(),
+                                            solver_control.last_value());
+                                       // otherwise exit as normal
+    } else {
+
+      KSPConvergedReason petsc_converged_reason;
+      PetscReal          petsc_last_value;
+      PetscInt           petsc_last_step;
+
+      ierr = KSPGetConvergedReason(solver_data->ksp, &petsc_converged_reason);
+      AssertThrow (ierr == 0, ExcPETScError(ierr));
+
+      if(petsc_converged_reason <= 0 ) {
+
+        ierr = KSPGetResidualNorm(solver_data->ksp, &petsc_last_value);
+        AssertThrow (ierr == 0, ExcPETScError(ierr));
+
+        ierr = KSPGetIterationNumber(solver_data->ksp, &petsc_last_step);
+        AssertThrow (ierr == 0, ExcPETScError(ierr));
+
+      }
+    }
+
   }
 
 
