diff --git a/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp b/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp
index ccbb5cf3792e3ea6c1442154610d937704c9f681..85efd57217a0ad0c50d0754fabaf0f66c4be9a95 100644
--- a/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp
+++ b/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp
@@ -20,7 +20,8 @@
 
 namespace NumLib
 {
-bool EvolutionaryPIDcontroller::next(const double solution_error)
+bool EvolutionaryPIDcontroller::next(double const solution_error,
+                                     int const /*number_iterations*/)
 {
     const bool is_previous_step_accepted = _is_accepted;
 
diff --git a/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.h b/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.h
index 2a5489bd0bb007e0dcfa78a772d2a6e532996b26..2f5b0fc692cde8bcced88e18b46bfbb9cd52fd4b 100644
--- a/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.h
+++ b/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.h
@@ -77,7 +77,7 @@ public:
                               time steps.
      * @return true if the next step exists
      */
-    bool next(const double solution_error) override;
+    bool next(double solution_error, int number_iterations) override;
 
     /// return if current time step is accepted
     bool accepted() const override { return _is_accepted; }
diff --git a/NumLib/TimeStepping/Algorithms/FixedTimeStepping.cpp b/NumLib/TimeStepping/Algorithms/FixedTimeStepping.cpp
index 8c90eb9794fbd13508da83b8ffc70347729ef5e8..f9fa3c9413072d759942b7e0ae235b1575e365ca 100644
--- a/NumLib/TimeStepping/Algorithms/FixedTimeStepping.cpp
+++ b/NumLib/TimeStepping/Algorithms/FixedTimeStepping.cpp
@@ -30,7 +30,8 @@ FixedTimeStepping::FixedTimeStepping(double t0, double tn, double dt)
 {
 }
 
-bool FixedTimeStepping::next(const double /*solution_error*/)
+bool FixedTimeStepping::next(double const /*solution_error*/,
+                             int const /*number_iterations*/)
 {
     // check if last time step
     if (_ts_current.steps() == _dt_vector.size() ||
diff --git a/NumLib/TimeStepping/Algorithms/FixedTimeStepping.h b/NumLib/TimeStepping/Algorithms/FixedTimeStepping.h
index 72e3d5bafac5598402ab363324c84369f68fa5aa..302fe049e5c04027b18b9d41a4b76e2527614330 100644
--- a/NumLib/TimeStepping/Algorithms/FixedTimeStepping.h
+++ b/NumLib/TimeStepping/Algorithms/FixedTimeStepping.h
@@ -58,7 +58,7 @@ public:
                       const std::vector<double>& vec_all_dt);
 
     /// move to the next time step
-    bool next(const double solution_error) override;
+    bool next(double solution_error, int number_iterations) override;
 
     /// return if current time step is accepted
     bool accepted() const override { return true; }
diff --git a/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp b/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp
index 8b0d000bdbae84dd9bd36ba7ca904f893e63b567..d60a2184a4f34982df5260e9edf641d0812a07c0 100644
--- a/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp
+++ b/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp
@@ -36,8 +36,11 @@ IterationNumberBasedTimeStepping::IterationNumberBasedTimeStepping(
     assert(iter_times_vector.size() == multiplier_vector.size());
 }
 
-bool IterationNumberBasedTimeStepping::next(double const /*solution_error*/)
+bool IterationNumberBasedTimeStepping::next(double const /*solution_error*/,
+                                            int const number_iterations)
 {
+    _iter_times = number_iterations;
+
     // check current time step
     if (std::abs(_ts_current.current() - end()) <
         std::numeric_limits<double>::epsilon())
@@ -59,6 +62,7 @@ bool IterationNumberBasedTimeStepping::next(double const /*solution_error*/)
     // prepare the next time step info
     _ts_current = _ts_prev;
     _ts_current += getNextTimeStepSize();
+    _iter_times = 0;
 
     return true;
 }
diff --git a/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.h b/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.h
index 73aee64bbdd7098e738a169fab5b22564963da8a..e863e72a0b535055665f36fb632ebe9eec40f9c4 100644
--- a/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.h
+++ b/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.h
@@ -95,7 +95,7 @@ public:
     ~IterationNumberBasedTimeStepping() override = default;
 
     /// move to the next time step
-    bool next(double solution_error) override;
+    bool next(double solution_error, int number_iterations) override;
 
     /// return if the current step is accepted
     bool accepted() const override;
diff --git a/NumLib/TimeStepping/Algorithms/TimeStepAlgorithm.h b/NumLib/TimeStepping/Algorithms/TimeStepAlgorithm.h
index 026cb7e1a6b61e9cf172cd3dd32f5d127d1e46ae..28f12e865713b182f69d34c93e9097841c3d965b 100644
--- a/NumLib/TimeStepping/Algorithms/TimeStepAlgorithm.h
+++ b/NumLib/TimeStepping/Algorithms/TimeStepAlgorithm.h
@@ -90,8 +90,9 @@ public:
 
     /// move to the next time step
     /// \param solution_error Solution error between two successive time steps.
+    /// \param number_iterations Number of non-linear iterations used.
     /// \return true if the next step exists
-    virtual bool next(const double solution_error) = 0;
+    virtual bool next(const double solution_error, int number_iterations) = 0;
 
     /// return if current time step is accepted or not
     virtual bool accepted() const = 0;
diff --git a/ProcessLib/UncoupledProcessesTimeLoop.cpp b/ProcessLib/UncoupledProcessesTimeLoop.cpp
index 7cab9ddaececa9a6de8f0bfc01c8132711560b06..a44abfdbc8fda5315453e6ff0314c316bf29a87a 100644
--- a/ProcessLib/UncoupledProcessesTimeLoop.cpp
+++ b/ProcessLib/UncoupledProcessesTimeLoop.cpp
@@ -356,7 +356,8 @@ double UncoupledProcessesTimeLoop::computeTimeStepping(
             timestepper->setAcceptedOrNot(false);
         }
 
-        if (!timestepper->next(solution_error) &&
+        if (!timestepper->next(solution_error,
+                               ppd.nonlinear_solver_status.number_iterations) &&
             // In case of FixedTimeStepping, which makes timestepper->next(...)
             // return false when the ending time is reached.
             t + std::numeric_limits<double>::epsilon() < timestepper->end())