diff --git a/applications/solvers/compressible/rhoPorousSimpleFoam/UEqn.H b/applications/solvers/compressible/rhoPorousSimpleFoam/UEqn.H
index 00a6f39bf468159df59e8de6983c4452be65c5ef..4150cd7503f41d781ce066ae50ee9acfd915e00c 100644
--- a/applications/solvers/compressible/rhoPorousSimpleFoam/UEqn.H
+++ b/applications/solvers/compressible/rhoPorousSimpleFoam/UEqn.H
@@ -35,7 +35,12 @@
     {
         pZones.addResistance(UEqn());
 
-        solve(UEqn() == -fvc::grad(p));
+        eqnResidual = solve
+        (
+            UEqn() == -fvc::grad(p)
+        ). initialResidual();
+
+        maxResidual = max(eqnResidual, maxResidual);
 
         trAU = 1.0/UEqn().A();
         trAU().rename("rAU");
diff --git a/applications/solvers/compressible/rhoPorousSimpleFoam/convergenceCheck.H b/applications/solvers/compressible/rhoPorousSimpleFoam/convergenceCheck.H
new file mode 100644
index 0000000000000000000000000000000000000000..8958063193af348a058fd8f3baecb2547c00da3c
--- /dev/null
+++ b/applications/solvers/compressible/rhoPorousSimpleFoam/convergenceCheck.H
@@ -0,0 +1,9 @@
+// check convergence
+
+if (maxResidual < convergenceCriterion)
+{
+    Info<< "reached convergence criterion: " << convergenceCriterion << endl;
+    runTime.writeAndEnd();
+    Info<< "latestTime = " << runTime.timeName() << endl;
+}
+
diff --git a/applications/solvers/compressible/rhoPorousSimpleFoam/hEqn.H b/applications/solvers/compressible/rhoPorousSimpleFoam/hEqn.H
index e5d60199fe7638498a04749a6e3d9d9f38384de3..8eb03f95eb46b687a79f9f68c09152bbd269224a 100644
--- a/applications/solvers/compressible/rhoPorousSimpleFoam/hEqn.H
+++ b/applications/solvers/compressible/rhoPorousSimpleFoam/hEqn.H
@@ -11,7 +11,8 @@
 
     hEqn.relax();
 
-    hEqn.solve();
+    eqnResidual = hEqn.solve().initialResidual();
+    maxResidual = max(eqnResidual, maxResidual);
 
     thermo->correct();
 }
diff --git a/applications/solvers/compressible/rhoPorousSimpleFoam/initConvergenceCheck.H b/applications/solvers/compressible/rhoPorousSimpleFoam/initConvergenceCheck.H
new file mode 100644
index 0000000000000000000000000000000000000000..b56197f22a50cfd07b04fc14d40b9a5454da8c5b
--- /dev/null
+++ b/applications/solvers/compressible/rhoPorousSimpleFoam/initConvergenceCheck.H
@@ -0,0 +1,7 @@
+// initialize values for convergence checks
+
+    scalar eqnResidual = 1, maxResidual = 0;
+    scalar convergenceCriterion = 0;
+
+    simple.readIfPresent("convergence", convergenceCriterion);
+
diff --git a/applications/solvers/compressible/rhoPorousSimpleFoam/pEqn.H b/applications/solvers/compressible/rhoPorousSimpleFoam/pEqn.H
index 558a57c86bed684ed2c4d46e194c746a485d2509..ae41da9e36fd7af8dd172b163b16dd8829a93b8b 100644
--- a/applications/solvers/compressible/rhoPorousSimpleFoam/pEqn.H
+++ b/applications/solvers/compressible/rhoPorousSimpleFoam/pEqn.H
@@ -26,7 +26,16 @@ for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)
     }
 
     tpEqn().setReference(pRefCell, pRefValue);
-    tpEqn().solve();
+    // retain the residual from the first iteration
+    if (nonOrth == 0)
+    {
+        eqnResidual = tpEqn().solve().initialResidual();
+        maxResidual = max(eqnResidual, maxResidual);
+    }
+    else
+    {
+        tpEqn().solve();
+    }
 
     if (nonOrth == nNonOrthCorr)
     {
diff --git a/applications/solvers/compressible/rhoPorousSimpleFoam/rhoPorousSimpleFoam.C b/applications/solvers/compressible/rhoPorousSimpleFoam/rhoPorousSimpleFoam.C
index 4042dc43f140d34a3bc7aaf49b1293a2409f5cf1..cba0c2dce171dcef9122ced75c5c9c3e1ad35c10 100644
--- a/applications/solvers/compressible/rhoPorousSimpleFoam/rhoPorousSimpleFoam.C
+++ b/applications/solvers/compressible/rhoPorousSimpleFoam/rhoPorousSimpleFoam.C
@@ -56,6 +56,7 @@ int main(int argc, char *argv[])
         Info<< "Time = " << runTime.timeName() << nl << endl;
 
 #       include "readSIMPLEControls.H"
+#       include "initConvergenceCheck.H"
 
         p.storePrevIter();
         rho.storePrevIter();
@@ -70,10 +71,11 @@ int main(int argc, char *argv[])
         turbulence->correct();
 
         runTime.write();
-
         Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
             << "  ClockTime = " << runTime.elapsedClockTime() << " s"
             << nl << endl;
+
+#       include "convergenceCheck.H"
     }
 
     Info<< "End\n" << endl;
diff --git a/applications/solvers/compressible/rhoSimpleFoam/UEqn.H b/applications/solvers/compressible/rhoSimpleFoam/UEqn.H
index f1bed4d071e985d92c9057c777ca9e216b174c54..c41bc9b6c7b93cab65751d97b441f519e4b3d05f 100644
--- a/applications/solvers/compressible/rhoSimpleFoam/UEqn.H
+++ b/applications/solvers/compressible/rhoSimpleFoam/UEqn.H
@@ -9,4 +9,9 @@
 
     UEqn().relax();
 
-    solve(UEqn() == -fvc::grad(p));
+    eqnResidual = solve
+    (
+        UEqn() == -fvc::grad(p)
+    ).initialResidual();
+
+    maxResidual = max(eqnResidual, maxResidual);
diff --git a/applications/solvers/compressible/rhoSimpleFoam/convergenceCheck.H b/applications/solvers/compressible/rhoSimpleFoam/convergenceCheck.H
new file mode 100644
index 0000000000000000000000000000000000000000..8958063193af348a058fd8f3baecb2547c00da3c
--- /dev/null
+++ b/applications/solvers/compressible/rhoSimpleFoam/convergenceCheck.H
@@ -0,0 +1,9 @@
+// check convergence
+
+if (maxResidual < convergenceCriterion)
+{
+    Info<< "reached convergence criterion: " << convergenceCriterion << endl;
+    runTime.writeAndEnd();
+    Info<< "latestTime = " << runTime.timeName() << endl;
+}
+
diff --git a/applications/solvers/compressible/rhoSimpleFoam/hEqn.H b/applications/solvers/compressible/rhoSimpleFoam/hEqn.H
index e5d60199fe7638498a04749a6e3d9d9f38384de3..8eb03f95eb46b687a79f9f68c09152bbd269224a 100644
--- a/applications/solvers/compressible/rhoSimpleFoam/hEqn.H
+++ b/applications/solvers/compressible/rhoSimpleFoam/hEqn.H
@@ -11,7 +11,8 @@
 
     hEqn.relax();
 
-    hEqn.solve();
+    eqnResidual = hEqn.solve().initialResidual();
+    maxResidual = max(eqnResidual, maxResidual);
 
     thermo->correct();
 }
diff --git a/applications/solvers/compressible/rhoSimpleFoam/initConvergenceCheck.H b/applications/solvers/compressible/rhoSimpleFoam/initConvergenceCheck.H
new file mode 100644
index 0000000000000000000000000000000000000000..b56197f22a50cfd07b04fc14d40b9a5454da8c5b
--- /dev/null
+++ b/applications/solvers/compressible/rhoSimpleFoam/initConvergenceCheck.H
@@ -0,0 +1,7 @@
+// initialize values for convergence checks
+
+    scalar eqnResidual = 1, maxResidual = 0;
+    scalar convergenceCriterion = 0;
+
+    simple.readIfPresent("convergence", convergenceCriterion);
+
diff --git a/applications/solvers/compressible/rhoSimpleFoam/pEqn.H b/applications/solvers/compressible/rhoSimpleFoam/pEqn.H
index 87f82991efab27ed09108b586047497f87fc18ba..9f7e576919221f54f8286fa1bf0cad6ab7366c44 100644
--- a/applications/solvers/compressible/rhoSimpleFoam/pEqn.H
+++ b/applications/solvers/compressible/rhoSimpleFoam/pEqn.H
@@ -12,7 +12,16 @@ for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)
     );
 
     pEqn.setReference(pRefCell, pRefValue);
-    pEqn.solve();
+    // retain the residual from the first iteration
+    if (nonOrth == 0)
+    {
+        eqnResidual = pEqn.solve().initialResidual();
+        maxResidual = max(eqnResidual, maxResidual);
+    }
+    else
+    {
+        pEqn.solve();
+    }
 
     if (nonOrth == nNonOrthCorr)
     {
diff --git a/applications/solvers/compressible/rhoSimpleFoam/rhoSimpleFoam.C b/applications/solvers/compressible/rhoSimpleFoam/rhoSimpleFoam.C
index b5b2aeb152c206980769de73809320f30ce6e144..edfe32990257558342f2fd34ec326ac365b09e0a 100644
--- a/applications/solvers/compressible/rhoSimpleFoam/rhoSimpleFoam.C
+++ b/applications/solvers/compressible/rhoSimpleFoam/rhoSimpleFoam.C
@@ -26,8 +26,7 @@ Application
     rhoSimpleFoam
 
 Description
-    Steady-state solver for turbulent flow of compressible fluids for
-    ventilation and heat-transfer.
+    Steady-state solver for turbulent flow of compressible fluids
 
 \*---------------------------------------------------------------------------*/
 
@@ -56,6 +55,7 @@ int main(int argc, char *argv[])
         Info<< "Time = " << runTime.timeName() << nl << endl;
 
 #       include "readSIMPLEControls.H"
+#       include "initConvergenceCheck.H"
 
         p.storePrevIter();
         rho.storePrevIter();
@@ -74,6 +74,8 @@ int main(int argc, char *argv[])
         Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
             << "  ClockTime = " << runTime.elapsedClockTime() << " s"
             << nl << endl;
+
+#       include "convergenceCheck.H"
     }
 
     Info<< "End\n" << endl;
diff --git a/applications/solvers/heatTransfer/buoyantSimpleFoam/UEqn.H b/applications/solvers/heatTransfer/buoyantSimpleFoam/UEqn.H
index d58a70a54e4f3a533ee3f149a757ed68c0438f14..5bc4c4738ccc963dadfa1666a1886deb56cd5b5b 100644
--- a/applications/solvers/heatTransfer/buoyantSimpleFoam/UEqn.H
+++ b/applications/solvers/heatTransfer/buoyantSimpleFoam/UEqn.H
@@ -9,4 +9,10 @@
 
     UEqn().relax();
 
-    solve(UEqn() == -fvc::grad(pd) - fvc::grad(rho)*gh);
+    eqnResidual = solve
+    (
+        UEqn() == -fvc::grad(pd) - fvc::grad(rho)*gh
+    ).initialResidual();
+
+    maxResidual = max(eqnResidual, maxResidual);
+
diff --git a/applications/solvers/heatTransfer/buoyantSimpleFoam/buoyantSimpleFoam.C b/applications/solvers/heatTransfer/buoyantSimpleFoam/buoyantSimpleFoam.C
index 932deb1fed6013dee7da3d3ddcf4bea8a9347989..3beb759bd717a875dc0fe8b98221a636f1d8daeb 100644
--- a/applications/solvers/heatTransfer/buoyantSimpleFoam/buoyantSimpleFoam.C
+++ b/applications/solvers/heatTransfer/buoyantSimpleFoam/buoyantSimpleFoam.C
@@ -26,8 +26,7 @@ Application
     buoyantSimpleFoam
 
 Description
-    Steady-state solver for buoyant, turbulent flow of compressible fluids for
-    ventilation and heat-transfer.
+    Steady-state solver for buoyant, turbulent flow of compressible fluids
 
 \*---------------------------------------------------------------------------*/
 
@@ -57,6 +56,7 @@ int main(int argc, char *argv[])
         Info<< "Time = " << runTime.timeName() << nl << endl;
 
 #       include "readSIMPLEControls.H"
+#       include "initConvergenceCheck.H"
 
         pd.storePrevIter();
         rho.storePrevIter();
@@ -64,9 +64,7 @@ int main(int argc, char *argv[])
         // Pressure-velocity SIMPLE corrector
         {
 #           include "UEqn.H"
-
 #           include "hEqn.H"
-
 #           include "pEqn.H"
         }
 
@@ -77,6 +75,8 @@ int main(int argc, char *argv[])
         Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
             << "  ClockTime = " << runTime.elapsedClockTime() << " s"
             << nl << endl;
+
+#       include "convergenceCheck.H"
     }
 
     Info<< "End\n" << endl;
diff --git a/applications/solvers/heatTransfer/buoyantSimpleFoam/convergenceCheck.H b/applications/solvers/heatTransfer/buoyantSimpleFoam/convergenceCheck.H
new file mode 100644
index 0000000000000000000000000000000000000000..8958063193af348a058fd8f3baecb2547c00da3c
--- /dev/null
+++ b/applications/solvers/heatTransfer/buoyantSimpleFoam/convergenceCheck.H
@@ -0,0 +1,9 @@
+// check convergence
+
+if (maxResidual < convergenceCriterion)
+{
+    Info<< "reached convergence criterion: " << convergenceCriterion << endl;
+    runTime.writeAndEnd();
+    Info<< "latestTime = " << runTime.timeName() << endl;
+}
+
diff --git a/applications/solvers/heatTransfer/buoyantSimpleFoam/hEqn.H b/applications/solvers/heatTransfer/buoyantSimpleFoam/hEqn.H
index 5ff3394ac0ae9efa6878bc14da8839702b42a81e..dad078c2193a6797d2f08ed9751cdac4ca4ff157 100644
--- a/applications/solvers/heatTransfer/buoyantSimpleFoam/hEqn.H
+++ b/applications/solvers/heatTransfer/buoyantSimpleFoam/hEqn.H
@@ -11,7 +11,8 @@
 
     hEqn.relax();
 
-    hEqn.solve();
+    eqnResidual = hEqn.solve().initialResidual();
+    maxResidual = max(eqnResidual, maxResidual);
 
     thermo->correct();
 }
diff --git a/applications/solvers/heatTransfer/buoyantSimpleFoam/initConvergenceCheck.H b/applications/solvers/heatTransfer/buoyantSimpleFoam/initConvergenceCheck.H
new file mode 100644
index 0000000000000000000000000000000000000000..b56197f22a50cfd07b04fc14d40b9a5454da8c5b
--- /dev/null
+++ b/applications/solvers/heatTransfer/buoyantSimpleFoam/initConvergenceCheck.H
@@ -0,0 +1,7 @@
+// initialize values for convergence checks
+
+    scalar eqnResidual = 1, maxResidual = 0;
+    scalar convergenceCriterion = 0;
+
+    simple.readIfPresent("convergence", convergenceCriterion);
+
diff --git a/applications/solvers/heatTransfer/buoyantSimpleFoam/pEqn.H b/applications/solvers/heatTransfer/buoyantSimpleFoam/pEqn.H
index 6f7aa582f078a471d7db384fd5d3729416277e6d..4c8d0939a8b53526a4ee07d4f91d6a5b3692a821 100644
--- a/applications/solvers/heatTransfer/buoyantSimpleFoam/pEqn.H
+++ b/applications/solvers/heatTransfer/buoyantSimpleFoam/pEqn.H
@@ -13,7 +13,16 @@ for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)
     );
 
     pdEqn.setReference(pdRefCell, pdRefValue);
-    pdEqn.solve();
+    // retain the residual from the first iteration
+    if (nonOrth == 0)
+    {
+        eqnResidual = pdEqn.solve().initialResidual();
+        maxResidual = max(eqnResidual, maxResidual);
+    }
+    else
+    {
+        pdEqn.solve();
+    }
 
     if (nonOrth == nNonOrthCorr)
     {
diff --git a/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/UEqn.H b/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/UEqn.H
index d58a70a54e4f3a533ee3f149a757ed68c0438f14..5bc4c4738ccc963dadfa1666a1886deb56cd5b5b 100644
--- a/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/UEqn.H
+++ b/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/UEqn.H
@@ -9,4 +9,10 @@
 
     UEqn().relax();
 
-    solve(UEqn() == -fvc::grad(pd) - fvc::grad(rho)*gh);
+    eqnResidual = solve
+    (
+        UEqn() == -fvc::grad(pd) - fvc::grad(rho)*gh
+    ).initialResidual();
+
+    maxResidual = max(eqnResidual, maxResidual);
+
diff --git a/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/buoyantSimpleRadiationFoam.C b/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/buoyantSimpleRadiationFoam.C
index 034134eeb55773e5ff440cde7824068a6274db4a..4bb432d53ea832e69b95492f41fc2bef80b06ee5 100644
--- a/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/buoyantSimpleRadiationFoam.C
+++ b/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/buoyantSimpleRadiationFoam.C
@@ -58,6 +58,7 @@ int main(int argc, char *argv[])
         Info<< "Time = " << runTime.timeName() << nl << endl;
 
 #       include "readSIMPLEControls.H"
+#       include "initConvergenceCheck.H"
 
         pd.storePrevIter();
         rho.storePrevIter();
@@ -65,9 +66,7 @@ int main(int argc, char *argv[])
         // Pressure-velocity SIMPLE corrector
         {
 #           include "UEqn.H"
-
 #           include "hEqn.H"
-
 #           include "pEqn.H"
         }
 
@@ -78,6 +77,8 @@ int main(int argc, char *argv[])
         Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
             << "  ClockTime = " << runTime.elapsedClockTime() << " s"
             << nl << endl;
+
+#       include "convergenceCheck.H"
     }
 
     Info<< "End\n" << endl;
diff --git a/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/convergenceCheck.H b/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/convergenceCheck.H
new file mode 100644
index 0000000000000000000000000000000000000000..8958063193af348a058fd8f3baecb2547c00da3c
--- /dev/null
+++ b/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/convergenceCheck.H
@@ -0,0 +1,9 @@
+// check convergence
+
+if (maxResidual < convergenceCriterion)
+{
+    Info<< "reached convergence criterion: " << convergenceCriterion << endl;
+    runTime.writeAndEnd();
+    Info<< "latestTime = " << runTime.timeName() << endl;
+}
+
diff --git a/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/hEqn.H b/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/hEqn.H
index 88094369d4107068cf0fc9eeb788322a7f0158da..31462927b94bdd60bba71db3718e6d98a7e9defb 100644
--- a/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/hEqn.H
+++ b/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/hEqn.H
@@ -12,7 +12,8 @@
 
     hEqn.relax();
 
-    hEqn.solve();
+    eqnResidual = hEqn.solve().initialResidual();
+    maxResidual = max(eqnResidual, maxResidual);
 
     thermo->correct();
 
diff --git a/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/initConvergenceCheck.H b/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/initConvergenceCheck.H
new file mode 100644
index 0000000000000000000000000000000000000000..b56197f22a50cfd07b04fc14d40b9a5454da8c5b
--- /dev/null
+++ b/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/initConvergenceCheck.H
@@ -0,0 +1,7 @@
+// initialize values for convergence checks
+
+    scalar eqnResidual = 1, maxResidual = 0;
+    scalar convergenceCriterion = 0;
+
+    simple.readIfPresent("convergence", convergenceCriterion);
+
diff --git a/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/pEqn.H b/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/pEqn.H
index 6f7aa582f078a471d7db384fd5d3729416277e6d..4c8d0939a8b53526a4ee07d4f91d6a5b3692a821 100644
--- a/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/pEqn.H
+++ b/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/pEqn.H
@@ -13,7 +13,16 @@ for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)
     );
 
     pdEqn.setReference(pdRefCell, pdRefValue);
-    pdEqn.solve();
+    // retain the residual from the first iteration
+    if (nonOrth == 0)
+    {
+        eqnResidual = pdEqn.solve().initialResidual();
+        maxResidual = max(eqnResidual, maxResidual);
+    }
+    else
+    {
+        pdEqn.solve();
+    }
 
     if (nonOrth == nNonOrthCorr)
     {
diff --git a/applications/solvers/incompressible/simpleFoam/UEqn.H b/applications/solvers/incompressible/simpleFoam/UEqn.H
index e6fb6bf89edccff6f683313796f1b7a46157d781..9f9d9f6dd41457397ce54c3b69901d33b27a21c1 100644
--- a/applications/solvers/incompressible/simpleFoam/UEqn.H
+++ b/applications/solvers/incompressible/simpleFoam/UEqn.H
@@ -8,4 +8,10 @@
 
     UEqn().relax();
 
-    solve(UEqn() == -fvc::grad(p));
+    eqnResidual = solve
+    (
+        UEqn() == -fvc::grad(p)
+    ).initialResidual();
+
+    maxResidual = max(eqnResidual, maxResidual);
+
diff --git a/applications/solvers/incompressible/simpleFoam/convergenceCheck.H b/applications/solvers/incompressible/simpleFoam/convergenceCheck.H
new file mode 100644
index 0000000000000000000000000000000000000000..8958063193af348a058fd8f3baecb2547c00da3c
--- /dev/null
+++ b/applications/solvers/incompressible/simpleFoam/convergenceCheck.H
@@ -0,0 +1,9 @@
+// check convergence
+
+if (maxResidual < convergenceCriterion)
+{
+    Info<< "reached convergence criterion: " << convergenceCriterion << endl;
+    runTime.writeAndEnd();
+    Info<< "latestTime = " << runTime.timeName() << endl;
+}
+
diff --git a/applications/solvers/incompressible/simpleFoam/initConvergenceCheck.H b/applications/solvers/incompressible/simpleFoam/initConvergenceCheck.H
new file mode 100644
index 0000000000000000000000000000000000000000..b56197f22a50cfd07b04fc14d40b9a5454da8c5b
--- /dev/null
+++ b/applications/solvers/incompressible/simpleFoam/initConvergenceCheck.H
@@ -0,0 +1,7 @@
+// initialize values for convergence checks
+
+    scalar eqnResidual = 1, maxResidual = 0;
+    scalar convergenceCriterion = 0;
+
+    simple.readIfPresent("convergence", convergenceCriterion);
+
diff --git a/applications/solvers/incompressible/simpleFoam/pEqn.H b/applications/solvers/incompressible/simpleFoam/pEqn.H
index abdfaff3fcddfe65cdc4814344c19f8cc098ff81..dd9cae30a9c3a94d4be9c1bd3d5ab2df2d65f998 100644
--- a/applications/solvers/incompressible/simpleFoam/pEqn.H
+++ b/applications/solvers/incompressible/simpleFoam/pEqn.H
@@ -15,7 +15,16 @@
         );
 
         pEqn.setReference(pRefCell, pRefValue);
-        pEqn.solve();
+        // retain the residual from the first iteration
+        if (nonOrth == 0)
+        {
+            eqnResidual = pEqn.solve().initialResidual();
+            maxResidual = max(eqnResidual, maxResidual);
+        }
+        else
+        {
+            pEqn.solve();
+        }
 
         if (nonOrth == nNonOrthCorr)
         {
diff --git a/applications/solvers/incompressible/simpleFoam/simpleFoam.C b/applications/solvers/incompressible/simpleFoam/simpleFoam.C
index 6fb4f3312d0c5112c6f12064a401dfe2a47ed7fb..7c378fe8ff714f44ddb56f898968fa607d986850 100644
--- a/applications/solvers/incompressible/simpleFoam/simpleFoam.C
+++ b/applications/solvers/incompressible/simpleFoam/simpleFoam.C
@@ -54,6 +54,7 @@ int main(int argc, char *argv[])
         Info<< "Time = " << runTime.timeName() << nl << endl;
 
 #       include "readSIMPLEControls.H"
+#       include "initConvergenceCheck.H"
 
         p.storePrevIter();
 
@@ -70,6 +71,8 @@ int main(int argc, char *argv[])
         Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
             << "  ClockTime = " << runTime.elapsedClockTime() << " s"
             << nl << endl;
+
+#       include "convergenceCheck.H"
     }
 
     Info<< "End\n" << endl;