diff --git a/src/finiteVolume/Make/files b/src/finiteVolume/Make/files
index f8aac2551b9f9565a3f80789b8d2ab1fcf526a15..95ca51d2f6ae317721c9fbc1fe88fc8ff5b8e5b3 100644
--- a/src/finiteVolume/Make/files
+++ b/src/finiteVolume/Make/files
@@ -352,6 +352,8 @@ general = cfdTools/general
 $(general)/findRefCell/findRefCell.C
 $(general)/adjustPhi/adjustPhi.C
 $(general)/bound/bound.C
+$(general)/solutionControl/solutionControl.C
+$(general)/simpleControl/simpleControl.C
 $(general)/pimpleControl/pimpleControl.C
 
 porousMedia = $(general)/porousMedia
diff --git a/src/finiteVolume/cfdTools/general/simpleControl/simpleControl.C b/src/finiteVolume/cfdTools/general/simpleControl/simpleControl.C
new file mode 100644
index 0000000000000000000000000000000000000000..b20efd658c4d0a409bcfacdff916bf7018dcd133
--- /dev/null
+++ b/src/finiteVolume/cfdTools/general/simpleControl/simpleControl.C
@@ -0,0 +1,117 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "simpleControl.H"
+#include "Time.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTypeNameAndDebug(simpleControl, 0);
+}
+
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+void Foam::simpleControl::read()
+{
+    solutionControl::read(true);
+}
+
+
+bool Foam::simpleControl::criteriaSatisfied()
+{
+    if (residualControl_.empty())
+    {
+        return false;
+    }
+
+    bool achieved = true;
+    const dictionary& solverDict = mesh_.solverPerformanceDict();
+
+    forAllConstIter(dictionary, solverDict, iter)
+    {
+        const word& variableName = iter().keyword();
+        label fieldI = applyToField(variableName);
+        if (fieldI != -1)
+        {
+            const List<lduMatrix::solverPerformance> sp(iter().stream());
+            const scalar residual = sp.first().initialResidual();
+
+            bool absCheck = residual < residualControl_[fieldI].absTol;
+            achieved = achieved && absCheck;
+
+            if (debug)
+            {
+                Info<< dictName_ << " solution statistics:" << endl;
+
+                Info<< "    " << variableName << ": abs tol = " << residual
+                    << " (" << residualControl_[fieldI].absTol << ")"
+                    << endl;
+            }
+        }
+    }
+
+    return achieved;
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::simpleControl::simpleControl(fvMesh& mesh)
+:
+    solutionControl(mesh, "SIMPLE"),
+    initialised_(false)
+{
+    read();
+
+    if (residualControl_.size() > 0)
+    {
+        Info<< dictName_ << " convergence criteria" << endl;
+        forAll(residualControl_, i)
+        {
+            Info<< "    field " << residualControl_[i].name << token::TAB
+                << " absTol " << residualControl_[i].absTol
+                << nl;
+        }
+        Info<< endl;
+    }
+    else
+    {
+        Info<< "No " << dictName_ << " convergence criteria found. "
+            << "Calculations will run for " << mesh_.time().endTime().value()
+            << " steps." << nl << endl;
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::simpleControl::~simpleControl()
+{}
+
+
+// ************************************************************************* //
diff --git a/src/finiteVolume/cfdTools/general/simpleControl/simpleControl.H b/src/finiteVolume/cfdTools/general/simpleControl/simpleControl.H
new file mode 100644
index 0000000000000000000000000000000000000000..e8e76f42d85b323a8752ca60d8f0a69aebce5871
--- /dev/null
+++ b/src/finiteVolume/cfdTools/general/simpleControl/simpleControl.H
@@ -0,0 +1,115 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::simpleControl
+
+Description
+    SIMPLE control class to supply convergence information/checks for
+    the SIMPLE loop.
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef simpleControl_H
+#define simpleControl_H
+
+#include "solutionControl.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                         Class simpleControl Declaration
+\*---------------------------------------------------------------------------*/
+
+class simpleControl
+:
+    public solutionControl
+{
+
+protected:
+
+    // Protected Data
+
+        //- Initialised flag
+        bool initialised_;
+
+
+    // Protected Member Functions
+
+        //- Read constrols from fvSolution dictionary
+        void read();
+
+        //- Return true if all convergence checks are satified
+        bool criteriaSatisfied();
+
+        //- Disallow default bitwise copy construct
+        simpleControl(const simpleControl&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const simpleControl&);
+
+
+public:
+
+
+    // Static Data Members
+
+        //- Run-time type information
+        TypeName("simpleControl");
+
+
+    // Constructors
+
+        //- Construct from mesh
+        simpleControl(fvMesh& mesh);
+
+
+    //- Destructor
+    virtual ~simpleControl();
+
+
+    // Member Functions
+
+        // Solution control
+
+            //- Loop loop
+            inline bool loop();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "simpleControlI.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/finiteVolume/cfdTools/general/simpleControl/simpleControlI.H b/src/finiteVolume/cfdTools/general/simpleControl/simpleControlI.H
new file mode 100644
index 0000000000000000000000000000000000000000..b7f053da37b7e612e5a9de696e18d3d1f9517965
--- /dev/null
+++ b/src/finiteVolume/cfdTools/general/simpleControl/simpleControlI.H
@@ -0,0 +1,56 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "Time.H"
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+inline bool Foam::simpleControl::loop()
+{
+    read();
+
+    Time& time = const_cast<Time&>(mesh_.time());
+
+    if (initialised_)
+    {
+        if (criteriaSatisfied())
+        {
+            Info<< dictName_ << " solution converged in " << time.timeName()
+                << " iterations" << nl << endl;
+
+            // Set to finalise calculation
+            time.writeAndEnd();
+        }
+    }
+    else
+    {
+        initialised_ = true;
+    }
+
+    return time.loop();
+}
+
+
+// ************************************************************************* //