diff --git a/NumLib/ODESolver/ConvergenceCriterion.h b/NumLib/ODESolver/ConvergenceCriterion.h
index 95ab8e9fdd890cc88ad2e245114af2ad6712d594..db0024ed0bf6aee69f1d85fd069302c05fb0660f 100644
--- a/NumLib/ODESolver/ConvergenceCriterion.h
+++ b/NumLib/ODESolver/ConvergenceCriterion.h
@@ -53,6 +53,10 @@ public:
     //! Check if the residual satisfies the convergence criterion.
     virtual void checkResidual(GlobalVector const& residual) = 0;
 
+    //! Tell the ConvergenceCriterion that it is called for the first time now
+    //! (while solving a specific nonlinear system).
+    virtual void preFirstIteration() {}
+
     //! Indicate that a new iteration now starts.
     //!
     //! A concrete implementation of ConvergenceCriterion might want to check
diff --git a/NumLib/ODESolver/NonlinearSolver.cpp b/NumLib/ODESolver/NonlinearSolver.cpp
index 4cf1e2d69a236e7c1aa8fd066d98abfd4741ced6..990d00a8ce1f5338dffa0f719ab6daa7ed3cec8b 100644
--- a/NumLib/ODESolver/NonlinearSolver.cpp
+++ b/NumLib/ODESolver/NonlinearSolver.cpp
@@ -48,12 +48,12 @@ bool NonlinearSolver<NonlinearSolverTag::Picard>::solve(
 
     LinAlg::copy(x, x_new);  // set initial guess, TODO save the copy
 
+    _convergence_criterion->preFirstIteration();
 
     unsigned iteration = 1;
-    for (; iteration <= _maxiter; ++iteration)
+    for (; iteration <= _maxiter;
+         ++iteration, _convergence_criterion->reset())
     {
-        _convergence_criterion->reset();
-
         BaseLib::RunTime time_iteration;
         time_iteration.start();
 
@@ -192,11 +192,12 @@ bool NonlinearSolver<NonlinearSolverTag::Newton>::solve(
     LinAlg::copy(x, minus_delta_x);
     minus_delta_x.setZero();
 
+    _convergence_criterion->preFirstIteration();
+
     unsigned iteration = 1;
-    for (; iteration <= _maxiter; ++iteration)
+    for (; iteration <= _maxiter;
+         ++iteration, _convergence_criterion->reset())
     {
-        _convergence_criterion->reset();
-
         BaseLib::RunTime time_iteration;
         time_iteration.start();