diff --git a/applications/solvers/multiphase/compressibleInterFoam/alphaEqnsSubCycle.H b/applications/solvers/multiphase/compressibleInterFoam/alphaEqnsSubCycle.H
index 6270f7e9e5dd202bb591a0fdb53c6f40d61231c9..2d70a5bab5932cb23837cdd0138fad6e9e81d28f 100644
--- a/applications/solvers/multiphase/compressibleInterFoam/alphaEqnsSubCycle.H
+++ b/applications/solvers/multiphase/compressibleInterFoam/alphaEqnsSubCycle.H
@@ -31,7 +31,7 @@
     }
 
     // correct interface on first PIMPLE corrector
-    if (pimple.corrPIMPLE() == 1)
+    if (pimple.corr() == 1)
     {
         interface.correct();
     }
diff --git a/applications/solvers/multiphase/compressibleInterFoam/compressibleInterDyMFoam/alphaEqnsSubCycle.H b/applications/solvers/multiphase/compressibleInterFoam/compressibleInterDyMFoam/alphaEqnsSubCycle.H
index 862dc60409f8e3b4daceeb169490ab2002187af3..ade8af00817fe065a03aeeb70a6b32f1980a4a77 100644
--- a/applications/solvers/multiphase/compressibleInterFoam/compressibleInterDyMFoam/alphaEqnsSubCycle.H
+++ b/applications/solvers/multiphase/compressibleInterFoam/compressibleInterDyMFoam/alphaEqnsSubCycle.H
@@ -33,7 +33,7 @@
     }
 
     // correct interface on first PIMPLE corrector
-    if (pimple.corrPIMPLE() == 1)
+    if (pimple.corr() == 1)
     {
         interface.correct();
     }
diff --git a/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.C b/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.C
index d3b295cdf29f2491f0ff76c6fad99a28f025d5e5..98a742e16bf12562525fc0da02f587defff2f0c6 100644
--- a/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.C
+++ b/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.C
@@ -44,8 +44,6 @@ void Foam::pimpleControl::read()
     const dictionary& pimpleDict = dict();
     nCorrPIMPLE_ = pimpleDict.lookupOrDefault<label>("nOuterCorrectors", 1);
     nCorrPISO_ = pimpleDict.lookupOrDefault<label>("nCorrectors", 1);
-    nCorrNonOrtho_ =
-        pimpleDict.lookupOrDefault<label>("nNonOrthogonalCorrectors", 1);
     turbOnFinalIterOnly_ =
         pimpleDict.lookupOrDefault<Switch>("turbOnFinalIterOnly", true);
 }
@@ -54,7 +52,7 @@ void Foam::pimpleControl::read()
 bool Foam::pimpleControl::criteriaSatisfied()
 {
     // no checks on first iteration - nothing has been calculated yet
-    if ((corrPIMPLE_ == 1) || residualControl_.empty() || finalIter())
+    if ((corr_ == 1) || residualControl_.empty() || finalIter())
     {
         return false;
     }
@@ -104,7 +102,7 @@ bool Foam::pimpleControl::criteriaSatisfied()
                 Info<< algorithmName_ << " loop:" << endl;
 
                 Info<< "    " << variableName
-                    << " PIMPLE iter " << corrPIMPLE_
+                    << " PIMPLE iter " << corr_
                     << ": ini res = "
                     << residualControl_[fieldI].initialResidual
                     << ", abs tol = " << residual
@@ -127,10 +125,7 @@ Foam::pimpleControl::pimpleControl(fvMesh& mesh)
     solutionControl(mesh, "PIMPLE"),
     nCorrPIMPLE_(0),
     nCorrPISO_(0),
-    nCorrNonOrtho_(0),
-    corrPIMPLE_(0),
     corrPISO_(0),
-    corrNonOrtho_(0),
     turbOnFinalIterOnly_(true)
 {
     read();
@@ -172,4 +167,60 @@ Foam::pimpleControl::~pimpleControl()
 {}
 
 
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::pimpleControl::loop()
+{
+    read();
+
+    corr_++;
+
+    if (debug)
+    {
+        Info<< algorithmName_ << " loop: corr = " << corr_ << endl;
+    }
+
+    if (corr_ == nCorrPIMPLE_ + 1)
+    {
+        if ((!residualControl_.empty()) && (nCorrPIMPLE_ != 1))
+        {
+            Info<< algorithmName_ << ": not converged within "
+                << nCorrPIMPLE_ << " iterations" << endl;
+        }
+
+        corr_ = 0;
+        mesh_.data::remove("finalIteration");
+        return false;
+    }
+
+    bool completed = false;
+    if (criteriaSatisfied())
+    {
+        Info<< algorithmName_ << ": converged in " << corr_ << " iterations"
+            << endl;
+        completed = true;
+    }
+    else
+    {
+        if (finalIter())
+        {
+            mesh_.data::add("finalIteration", true);
+        }
+
+        if (corr_ <= nCorrPIMPLE_)
+        {
+            if (nCorrPIMPLE_ != 1)
+            {
+                Info<< algorithmName_ << ": iteration " << corr_ << endl;
+                storePrevIterFields();
+            }
+
+            completed = false;
+        }
+    }
+
+    return !completed;
+}
+
+
 // ************************************************************************* //
diff --git a/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.H b/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.H
index 0e6b2195056df34d965ae914ccc63a38c5565c53..9a5912e4fb703a655fbbb06dc0b8c9f6ecd60309 100644
--- a/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.H
+++ b/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.H
@@ -60,18 +60,9 @@ protected:
             //- Maximum number of PISO correctors
             label nCorrPISO_;
 
-            //- Maximum number of non-orthogonal correctors
-            label nCorrNonOrtho_;
-
-            //- Current PIMPLE corrector
-            label corrPIMPLE_;
-
             //- Current PISO corrector
             label corrPISO_;
 
-            //- Current non-orthogonal corrector
-            label corrNonOrtho_;
-
             //- Flag to indicate whether to only solve turbulence on final iter
             bool turbOnFinalIterOnly_;
 
@@ -120,39 +111,24 @@ public:
             //- Maximum number of PISO correctors
             inline label nCorrPISO() const;
 
-            //- Maximum number of non-orthogonal correctors
-            inline label nCorrNonOrtho() const;
-
-            //- Current PIMPLE corrector index
-            inline label corrPIMPLE() const;
-
             //- Current PISO corrector index
             inline label corrPISO() const;
 
-            //- Current non-orthogonal corrector index
-            inline label corrNonOrtho() const;
-
 
         // Solution control
 
             //- PIMPLE loop
-            inline bool loop();
+            virtual bool loop();
 
-            //- Corrector loop
+            //- Pressure corrector loop
             inline bool correct();
 
-            //- Non-orthogonal corrector loop
-            inline bool correctNonOrthogonal();
-
             //- Helper function to identify when to store the intial residuals
             inline bool storeInitialResiduals() const;
 
             //- Helper function to identify final PIMPLE (outer) iteration
             inline bool finalIter() const;
 
-            //- Helper function to identify final non-orthogonal iteration
-            inline bool finalNonOrthogonalIter() const;
-
             //- Helper function to identify final inner iteration
             inline bool finalInnerIter() const;
 
diff --git a/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControlI.H b/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControlI.H
index 791c71b730f3b31ff17aa4d7d48bc79922879386..1fe609873175cd745d297b3ba2133b151348dcfc 100644
--- a/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControlI.H
+++ b/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControlI.H
@@ -37,82 +37,12 @@ inline Foam::label Foam::pimpleControl::nCorrPISO() const
 }
 
 
-inline Foam::label Foam::pimpleControl::nCorrNonOrtho() const
-{
-    return nCorrPISO_;
-}
-
-
-inline Foam::label Foam::pimpleControl::corrPIMPLE() const
-{
-    return corrPIMPLE_;
-}
-
-
 inline Foam::label Foam::pimpleControl::corrPISO() const
 {
     return corrPISO_;
 }
 
 
-inline Foam::label Foam::pimpleControl::corrNonOrtho() const
-{
-    return corrNonOrtho_;
-}
-
-
-inline bool Foam::pimpleControl::loop()
-{
-    corrPIMPLE_++;
-
-    if (debug)
-    {
-        Info<< algorithmName_ << " loop: corrPIMPLE = " << corrPIMPLE_ << endl;
-    }
-
-    if (corrPIMPLE_ == nCorrPIMPLE_ + 1)
-    {
-        if ((!residualControl_.empty()) && (nCorrPIMPLE_ != 1))
-        {
-            Info<< algorithmName_ << ": not converged within "
-                << nCorrPIMPLE_ << " iterations" << endl;
-        }
-
-        corrPIMPLE_ = 0;
-        mesh_.data::remove("finalIteration");
-        return false;
-    }
-
-    bool completed = false;
-    if (criteriaSatisfied())
-    {
-        Info<< algorithmName_ << ": converged in " << corrPIMPLE_
-            << " iterations" << endl;
-        completed = true;
-    }
-    else
-    {
-        if (finalIter())
-        {
-            mesh_.data::add("finalIteration", true);
-        }
-
-        if (corrPIMPLE_ <= nCorrPIMPLE_)
-        {
-            if (nCorrPIMPLE_ != 1)
-            {
-                Info<< algorithmName_ << ": iteration " << corrPIMPLE_ << endl;
-                storePrevIterFields();
-            }
-
-            completed = false;
-        }
-    }
-
-    return !completed;
-}
-
-
 inline bool Foam::pimpleControl::correct()
 {
     corrPISO_++;
@@ -134,53 +64,25 @@ inline bool Foam::pimpleControl::correct()
 }
 
 
-inline bool Foam::pimpleControl::correctNonOrthogonal()
-{
-    corrNonOrtho_++;
-
-    if (debug)
-    {
-        Info<< algorithmName_ << " correctNonOrthogonal: corrNonOrtho = "
-            << corrNonOrtho_ << endl;
-    }
-
-    if (corrNonOrtho_ <= nCorrNonOrtho_ + 1)
-    {
-        return true;
-    }
-    else
-    {
-        corrNonOrtho_ = 0;
-        return false;
-    }
-}
-
-
 inline bool Foam::pimpleControl::storeInitialResiduals() const
 {
     // start from second PIMPLE iteration
-    return (corrPIMPLE_ == 2) && (corrPISO_ == 0) && (corrNonOrtho_ == 0);
+    return (corr_ == 2) && (corrPISO_ == 0) && (corrNonOrtho_ == 0);
 }
 
 
 inline bool Foam::pimpleControl::finalIter() const
 {
-    return corrPIMPLE_ == nCorrPIMPLE_;
-}
-
-
-inline bool Foam::pimpleControl::finalNonOrthogonalIter() const
-{
-    return corrNonOrtho_ == nCorrNonOrtho_ + 1;
+    return corr_ == nCorrPIMPLE_;
 }
 
 
 inline bool Foam::pimpleControl::finalInnerIter() const
 {
-     return
-        corrPIMPLE_ == nCorrPIMPLE_
-     && corrPISO_ == nCorrPISO_
-     && corrNonOrtho_ == nCorrNonOrtho_ + 1;
+    return
+       corr_ == nCorrPIMPLE_
+    && corrPISO_ == nCorrPISO_
+    && corrNonOrtho_ == nNonOrthCorr_ + 1;
 }
 
 
diff --git a/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControl.C b/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControl.C
index d2b603a5e01961e43e2ef3fa3c4344de0a3497ce..b944f38b8f4a17eff3705a96389462a8f71e0e4d 100644
--- a/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControl.C
+++ b/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControl.C
@@ -119,4 +119,38 @@ Foam::simpleControl::~simpleControl()
 {}
 
 
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::simpleControl::loop()
+{
+    read();
+
+    Time& time = const_cast<Time&>(mesh_.time());
+
+    if (initialised_)
+    {
+        if (criteriaSatisfied())
+        {
+            Info<< nl << algorithmName_ << " solution converged in "
+                << time.timeName() << " iterations" << nl << endl;
+
+            // Set to finalise calculation
+            time.writeAndEnd();
+        }
+        else
+        {
+            storePrevIterFields();
+        }
+    }
+    else
+    {
+        initialised_ = true;
+        storePrevIterFields();
+    }
+
+
+    return time.loop();
+}
+
+
 // ************************************************************************* //
diff --git a/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControl.H b/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControl.H
index ee718ce424b884e6c894e2c1acdb12e5888397ca..71f8d0e04c70d32089e5d2b4a37f6747587abba8 100644
--- a/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControl.H
+++ b/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControl.H
@@ -96,7 +96,7 @@ public:
         // Solution control
 
             //- Loop loop
-            inline bool loop();
+            virtual bool loop();
 };
 
 
@@ -106,10 +106,6 @@ public:
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-#include "simpleControlI.H"
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
 #endif
 
 // ************************************************************************* //
diff --git a/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControlI.H b/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControlI.H
index 9080c9b24523aebb4470ec5f770f9c321e7e4544..eaca9b079d061c97637a3fca18c11a02bb44e1ef 100644
--- a/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControlI.H
+++ b/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControlI.H
@@ -27,36 +27,6 @@ License
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-inline bool Foam::simpleControl::loop()
-{
-    read();
-
-    Time& time = const_cast<Time&>(mesh_.time());
-
-    if (initialised_)
-    {
-        if (criteriaSatisfied())
-        {
-            Info<< nl << algorithmName_ << " solution converged in "
-                << time.timeName() << " iterations" << nl << endl;
-
-            // Set to finalise calculation
-            time.writeAndEnd();
-        }
-        else
-        {
-            storePrevIterFields();
-        }
-    }
-    else
-    {
-        initialised_ = true;
-        storePrevIterFields();
-    }
-
-
-    return time.loop();
-}
 
 
 // ************************************************************************* //
diff --git a/src/finiteVolume/cfdTools/general/solutionControl/solutionControl/solutionControl.C b/src/finiteVolume/cfdTools/general/solutionControl/solutionControl/solutionControl.C
index a238d94e0af4e650bb24c1abdd88dd934d705b11..3de1587e7e9eb3a2e790c9dcb1875797fcc62901 100644
--- a/src/finiteVolume/cfdTools/general/solutionControl/solutionControl/solutionControl.C
+++ b/src/finiteVolume/cfdTools/general/solutionControl/solutionControl/solutionControl.C
@@ -170,7 +170,9 @@ Foam::solutionControl::solutionControl(fvMesh& mesh, const word& algorithmName)
     algorithmName_(algorithmName),
     nNonOrthCorr_(0),
     momentumPredictor_(true),
-    transonic_(false)
+    transonic_(false),
+    corr_(0),
+    corrNonOrtho_(0)
 {}
 
 
diff --git a/src/finiteVolume/cfdTools/general/solutionControl/solutionControl/solutionControl.H b/src/finiteVolume/cfdTools/general/solutionControl/solutionControl/solutionControl.H
index 94a8b41305271ffbce0d6b3b5c25b3b1089e783f..45970fc325baa23c97549951a7bb463908fb7064 100644
--- a/src/finiteVolume/cfdTools/general/solutionControl/solutionControl/solutionControl.H
+++ b/src/finiteVolume/cfdTools/general/solutionControl/solutionControl/solutionControl.H
@@ -82,6 +82,15 @@ protected:
             bool transonic_;
 
 
+        // Evolution
+
+            //- Current corrector loop index
+            label corr_;
+
+            //- Current non-orthogonal corrector loop index
+            label corrNonOrtho_;
+
+
     // Protected Member Functions
 
         //- Read controls from fvSolution dictionary
@@ -137,17 +146,35 @@ public:
             //- Return the solution dictionary
             inline const dictionary& dict() const;
 
+            //- Current corrector loop index
+            inline label corr() const;
+
+            //- Current non-orthogonal corrector index
+            inline label corrNonOrtho() const;
+
 
         // Solution control
 
             //- Maximum number of non-orthogonal correctors
             inline label nNonOrthCorr() const;
 
+            //- Helper function to identify final non-orthogonal iteration
+            inline bool finalNonOrthogonalIter() const;
+
             //- Flag to indicate to solve for momentum
             inline bool momentumPredictor() const;
 
             //- Flag to indicate to solve using transonic algorithm
             inline bool transonic() const;
+
+
+        // Evolution
+
+            //- Main control loop
+            virtual bool loop() = 0;
+
+            //- Non-orthogonal corrector loop
+            inline bool correctNonOrthogonal();
 };
 
 
diff --git a/src/finiteVolume/cfdTools/general/solutionControl/solutionControl/solutionControlI.H b/src/finiteVolume/cfdTools/general/solutionControl/solutionControl/solutionControlI.H
index 438c8569d3eea055e49362d0686648bf0ecde9ae..b9d975cfba2079d805bfee913354075ac8d7e028 100644
--- a/src/finiteVolume/cfdTools/general/solutionControl/solutionControl/solutionControlI.H
+++ b/src/finiteVolume/cfdTools/general/solutionControl/solutionControl/solutionControlI.H
@@ -31,12 +31,30 @@ inline const Foam::dictionary& Foam::solutionControl::dict() const
 }
 
 
+inline Foam::label Foam::solutionControl::corr() const
+{
+    return corr_;
+}
+
+
+inline Foam::label Foam::solutionControl::corrNonOrtho() const
+{
+    return corrNonOrtho_;
+}
+
+
 inline Foam::label Foam::solutionControl::nNonOrthCorr() const
 {
     return nNonOrthCorr_;
 }
 
 
+inline bool Foam::solutionControl::finalNonOrthogonalIter() const
+{
+    return corrNonOrtho_ == nNonOrthCorr_ + 1;
+}
+
+
 inline bool Foam::solutionControl::momentumPredictor() const
 {
     return momentumPredictor_;
@@ -49,4 +67,26 @@ inline bool Foam::solutionControl::transonic() const
 }
 
 
+inline bool Foam::solutionControl::correctNonOrthogonal()
+{
+    corrNonOrtho_++;
+
+    if (debug)
+    {
+        Info<< algorithmName_ << " correctNonOrthogonal: corrNonOrtho = "
+            << corrNonOrtho_ << endl;
+    }
+
+    if (corrNonOrtho_ <= nNonOrthCorr_ + 1)
+    {
+        return true;
+    }
+    else
+    {
+        corrNonOrtho_ = 0;
+        return false;
+    }
+}
+
+
 // ************************************************************************* //