diff --git a/NumLib/ODESolver/ConvergenceCriterionPerComponentResidual.cpp b/NumLib/ODESolver/ConvergenceCriterionPerComponentResidual.cpp
index db4199d117c7ba6c7eb50590c1ada6989c780cc8..db4dcb4bf49cbeb26cdc43c5973c3780dc3a8305 100644
--- a/NumLib/ODESolver/ConvergenceCriterionPerComponentResidual.cpp
+++ b/NumLib/ODESolver/ConvergenceCriterionPerComponentResidual.cpp
@@ -35,6 +35,30 @@ ConvergenceCriterionPerComponentResidual::
         OGS_FATAL("The given tolerances vector is empty.");
 }
 
+
+void ConvergenceCriterionPerComponentResidual::checkDeltaX(
+    const GlobalVector& minus_delta_x, GlobalVector const& x)
+{
+    if ((!_dof_table) || (!_mesh))
+        OGS_FATAL("D.o.f. table or mesh have not been set.");
+
+    for (unsigned global_component = 0; global_component < _abstols.size();
+         ++global_component)
+    {
+        // TODO short cut if tol <= 0.0
+        auto error_dx = norm(minus_delta_x, global_component, _norm_type,
+                             *_dof_table, *_mesh);
+        auto norm_x =
+            norm(x, global_component, _norm_type, *_dof_table, *_mesh);
+
+        INFO(
+            "Convergence criterion, component %u: |dx|=%.4e, |x|=%.4e, "
+            "|dx|/|x|=%.4e",
+            error_dx, global_component, norm_x, error_dx / norm_x);
+    }
+}
+
+
 void ConvergenceCriterionPerComponentResidual::checkResidual(
     const GlobalVector& residual)
 {
diff --git a/NumLib/ODESolver/ConvergenceCriterionPerComponentResidual.h b/NumLib/ODESolver/ConvergenceCriterionPerComponentResidual.h
index 885addf410a9c186a3e5fcd6aabc7c5c9354a3c8..2c7c36a434398057e320aaf8e718926877884775 100644
--- a/NumLib/ODESolver/ConvergenceCriterionPerComponentResidual.h
+++ b/NumLib/ODESolver/ConvergenceCriterionPerComponentResidual.h
@@ -33,11 +33,11 @@ public:
         std::vector<double>&& relative_tolerances,
         MathLib::VecNormType norm_type);
 
-    bool hasDeltaXCheck() const override { return false; }
+    bool hasDeltaXCheck() const override { return true; }
     bool hasResidualCheck() const override { return true; }
 
-    void checkDeltaX(const GlobalVector& /*minus_delta_x*/,
-                     GlobalVector const& /*x*/) override {}
+    void checkDeltaX(const GlobalVector& minus_delta_x,
+                     GlobalVector const& x) override;
     void checkResidual(const GlobalVector& residual) override;
 
     void preFirstIteration() override { _is_first_iteration = true; }