diff --git a/applications/solvers/basic/potentialFoam/createFields.H b/applications/solvers/basic/potentialFoam/createFields.H
index ef3b220257fbc7864f1fd2b9eb6481d09fa6af5c..dd6d1db04a0a7fcf60f49cb8afa93b87f1512135 100644
--- a/applications/solvers/basic/potentialFoam/createFields.H
+++ b/applications/solvers/basic/potentialFoam/createFields.H
@@ -1,21 +1,4 @@
-    Info<< "Reading field p\n" << endl;
-    volScalarField p
-    (
-        IOobject
-        (
-            "p",
-            runTime.timeName(),
-            mesh,
-            IOobject::MUST_READ,
-            IOobject::NO_WRITE
-        ),
-        mesh
-    );
-
-    p = dimensionedScalar("zero", p.dimensions(), 0.0);
-
-
-    Info<< "Reading field U\n" << endl;
+    Info<< "Reading velocity field U\n" << endl;
     volVectorField U
     (
         IOobject
@@ -51,12 +34,65 @@
     }
 
 
-    label pRefCell = 0;
-    scalar pRefValue = 0.0;
+    // Default name for the pressure field
+    word pName("p");
+
+    // Update name of the pressure field from the command-line option
+    args.optionReadIfPresent("pName", pName);
+
+    // Infer the pressure BCs from the velocity BCs
+    wordList pBCTypes
+    (
+        U.boundaryField().size(),
+        fixedValueFvPatchScalarField::typeName
+    );
+
+    forAll(U.boundaryField(), patchi)
+    {
+        if (U.boundaryField()[patchi].fixesValue())
+        {
+            pBCTypes[patchi] = zeroGradientFvPatchScalarField::typeName;
+        }
+    }
+
+    Info<< "Constructing pressure field " << pName << nl << endl;
+    volScalarField p
+    (
+        IOobject
+        (
+            pName,
+            runTime.timeName(),
+            mesh,
+            IOobject::READ_IF_PRESENT,
+            IOobject::NO_WRITE
+        ),
+        mesh,
+        dimensionedScalar(pName, sqr(dimVelocity), 0),
+        pBCTypes
+    );
+
+    Info<< "Constructing velocity potential field Phi\n" << endl;
+    volScalarField Phi
+    (
+        IOobject
+        (
+            "Phi",
+            runTime.timeName(),
+            mesh,
+            IOobject::READ_IF_PRESENT,
+            IOobject::NO_WRITE
+        ),
+        mesh,
+        dimensionedScalar("Phi", dimLength*dimVelocity, 0),
+        p.boundaryField().types()
+    );
+
+    label PhiRefCell = 0;
+    scalar PhiRefValue = 0;
     setRefCell
     (
-        p,
-        potentialFlow,
-        pRefCell,
-        pRefValue
+        Phi,
+        potentialFlow.dict(),
+        PhiRefCell,
+        PhiRefValue
     );
diff --git a/applications/solvers/basic/potentialFoam/potentialFoam.C b/applications/solvers/basic/potentialFoam/potentialFoam.C
index b4951e5b0c96ecc3f7005706431f0914c5dc84e4..37e613b7e2b57a83803b07dbe1f3be74153e326d 100644
--- a/applications/solvers/basic/potentialFoam/potentialFoam.C
+++ b/applications/solvers/basic/potentialFoam/potentialFoam.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2013 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2015 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -25,29 +25,48 @@ Application
     potentialFoam
 
 Description
-    Simple potential flow solver which can be used to generate starting fields
-    for full Navier-Stokes codes.
+    Potential flow solver which solves for the velocity potential
+    from which the flux-field is obtained and velocity field by reconstructing
+    the flux.
+
+    This application is particularly useful to generate starting fields for
+    Navier-Stokes codes.
 
 \*---------------------------------------------------------------------------*/
 
 #include "fvCFD.H"
 #include "fvIOoptionList.H"
+#include "pisoControl.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 int main(int argc, char *argv[])
 {
-    argList::addBoolOption("writep", "write the final pressure field");
+    argList::addOption
+    (
+        "pName",
+        "pName",
+        "Name of the pressure field"
+    );
+
     argList::addBoolOption
     (
         "initialiseUBCs",
-        "initialise U boundary conditions"
+        "Initialise U boundary conditions"
+    );
+
+    argList::addBoolOption
+    (
+        "writePhi",
+        "Write the velocity potential field"
     );
 
     #include "setRootCase.H"
     #include "createTime.H"
     #include "createMesh.H"
-    #include "readControls.H"
+
+    pisoControl potentialFlow(mesh, "potentialFlow");
+
     #include "createFields.H"
     #include "createFvOptions.H"
 
@@ -63,55 +82,47 @@ int main(int argc, char *argv[])
 
     adjustPhi(phi, U, p);
 
-
-    for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)
+    // Non-orthogonal velocity potential corrector loop
+    while (potentialFlow.correctNonOrthogonal())
     {
-        fvScalarMatrix pEqn
+        fvScalarMatrix PhiEqn
         (
-            fvm::laplacian
-            (
-                dimensionedScalar
-                (
-                    "1",
-                    dimTime/p.dimensions()*dimensionSet(0, 2, -2, 0, 0),
-                    1
-                ),
-                p
-            )
+            fvm::laplacian(dimensionedScalar("1", dimless, 1), Phi)
          ==
             fvc::div(phi)
         );
 
-        pEqn.setReference(pRefCell, pRefValue);
-        pEqn.solve();
+        PhiEqn.setReference(PhiRefCell, PhiRefValue);
+        PhiEqn.solve();
 
-        if (nonOrth == nNonOrthCorr)
+        if (potentialFlow.finalNonOrthogonalIter())
         {
-            phi -= pEqn.flux();
+            phi -= PhiEqn.flux();
         }
     }
 
     fvOptions.makeAbsolute(phi);
 
-    Info<< "continuity error = "
+    Info<< "Continuity error = "
         << mag(fvc::div(phi))().weightedAverage(mesh.V()).value()
         << endl;
 
     U = fvc::reconstruct(phi);
     U.correctBoundaryConditions();
 
-    Info<< "Interpolated U error = "
+    Info<< "Interpolated velocity error = "
         << (sqrt(sum(sqr((fvc::interpolate(U) & mesh.Sf()) - phi)))
           /sum(mesh.magSf())).value()
         << endl;
 
-    // Force the write
+    // Write U and phi
     U.write();
     phi.write();
 
-    if (args.optionFound("writep"))
+    // Optionally write Phi
+    if (args.optionFound("writePhi"))
     {
-        p.write();
+        Phi.write();
     }
 
     runTime.functionObjects().end();
diff --git a/tutorials/basic/potentialFoam/cylinder/Allrun b/tutorials/basic/potentialFoam/cylinder/Allrun
index c306dd0ef61dda77095e8828a2aa078f3959a4c4..74a2fc93fb5c534cce3635408579acc8830712a3 100755
--- a/tutorials/basic/potentialFoam/cylinder/Allrun
+++ b/tutorials/basic/potentialFoam/cylinder/Allrun
@@ -6,26 +6,6 @@ cd ${0%/*} || exit 1    # Run from this directory
 
 application=`getApplication`
 
-
-# This case uses the #codeStream which is disabled by default. Enable for
-# just this case.
-MAIN_CONTROL_DICT=`foamEtcFile controlDict`
-if [ -f "$MAIN_CONTROL_DICT" ]
-then
-    echo "Modifying ${MAIN_CONTROL_DICT} to enable allowSystemOperations"
-
-    # Clean up on termination and on Ctrl-C
-    trap 'mv ${MAIN_CONTROL_DICT}.$$ ${MAIN_CONTROL_DICT} 2>/dev/null; exit 0' \
-        EXIT TERM INT
-    cp ${MAIN_CONTROL_DICT} ${MAIN_CONTROL_DICT}.$$
-
-    echo "Enabling allowSystemOperations in ${MAIN_CONTROL_DICT}."
-
-    sed \
-    -e s/"\(allowSystemOperations[ \t]*\)\([0-9]\);"/"\1 1;"/g \
-    ${MAIN_CONTROL_DICT}.$$ > ${MAIN_CONTROL_DICT}
-fi
-
 cp -r 0.org 0 > /dev/null 2>&1
 runApplication blockMesh
 runApplication $application
diff --git a/tutorials/basic/potentialFoam/cylinder/system/fvSchemes b/tutorials/basic/potentialFoam/cylinder/system/fvSchemes
index ed633c033c5861d60411a916f291e2eb1282f35e..b3b176d949a83c4486c52bd54c0781b403504c3a 100644
--- a/tutorials/basic/potentialFoam/cylinder/system/fvSchemes
+++ b/tutorials/basic/potentialFoam/cylinder/system/fvSchemes
@@ -48,7 +48,7 @@ snGradSchemes
 fluxRequired
 {
     default         no;
-    p               ;
+    Phi             ;
 }
 
 
diff --git a/tutorials/basic/potentialFoam/cylinder/system/fvSolution b/tutorials/basic/potentialFoam/cylinder/system/fvSolution
index a5d2d6481d89d02da1f18c1032f6d0baa6fbc2fa..9e1ab1b2b403b7c51b3416da3e814d7dc8b55dac 100644
--- a/tutorials/basic/potentialFoam/cylinder/system/fvSolution
+++ b/tutorials/basic/potentialFoam/cylinder/system/fvSolution
@@ -17,7 +17,7 @@ FoamFile
 
 solvers
 {
-    p
+    Phi
     {
         solver          PCG;
         preconditioner  DIC;
diff --git a/tutorials/basic/potentialFoam/pitzDaily/system/fvSchemes b/tutorials/basic/potentialFoam/pitzDaily/system/fvSchemes
index 076bce55b71f8d5797b4bb4d79cad9398b908181..b2334a206c9c7c0e385ee73e73fa1b619362d78d 100644
--- a/tutorials/basic/potentialFoam/pitzDaily/system/fvSchemes
+++ b/tutorials/basic/potentialFoam/pitzDaily/system/fvSchemes
@@ -48,7 +48,7 @@ snGradSchemes
 fluxRequired
 {
     default         no;
-    p               ;
+    Phi             ;
 }
 
 
diff --git a/tutorials/basic/potentialFoam/pitzDaily/system/fvSolution b/tutorials/basic/potentialFoam/pitzDaily/system/fvSolution
index 329a6d2eecba46dc927fff788dc34f63113ff38d..3565bddf3718b5e45146bf27370edffbe42a1832 100644
--- a/tutorials/basic/potentialFoam/pitzDaily/system/fvSolution
+++ b/tutorials/basic/potentialFoam/pitzDaily/system/fvSolution
@@ -17,7 +17,7 @@ FoamFile
 
 solvers
 {
-    p
+    Phi
     {
         solver          PCG;
         preconditioner  DIC;
diff --git a/tutorials/incompressible/pisoFoam/les/motorBike/motorBike/system/fvSchemes b/tutorials/incompressible/pisoFoam/les/motorBike/motorBike/system/fvSchemes
index c6c8fbf6f8d2f4b4630c8e4cf2ff9ee24c94e8ed..33a55391e4a81037f55ee389c2d95a8ae284319a 100644
--- a/tutorials/incompressible/pisoFoam/les/motorBike/motorBike/system/fvSchemes
+++ b/tutorials/incompressible/pisoFoam/les/motorBike/motorBike/system/fvSchemes
@@ -55,7 +55,8 @@ snGradSchemes
 fluxRequired
 {
     default         no;
-    p               ;
+    p;
+    Phi;
 }
 
 wallDist
diff --git a/tutorials/incompressible/pisoFoam/les/motorBike/motorBike/system/fvSolution b/tutorials/incompressible/pisoFoam/les/motorBike/motorBike/system/fvSolution
index de4bd756b96b610cd4fdaed26887a6ccb1266c1a..5eeddfb8fd02b449c8b05f680a55a9e6d4fe30de 100644
--- a/tutorials/incompressible/pisoFoam/les/motorBike/motorBike/system/fvSolution
+++ b/tutorials/incompressible/pisoFoam/les/motorBike/motorBike/system/fvSolution
@@ -38,6 +38,11 @@ solvers
         relTol          0;
     };
 
+    Phi
+    {
+        $p;
+    }
+
     "(U|nuTilda)"
     {
         solver          smoothSolver;
diff --git a/tutorials/incompressible/simpleFoam/motorBike/system/fvSchemes b/tutorials/incompressible/simpleFoam/motorBike/system/fvSchemes
index cf8155eeaaa014761b76d7401dae31b0746db221..81136adfaa3a2befb6a79a30787d2fe40f184a6d 100644
--- a/tutorials/incompressible/simpleFoam/motorBike/system/fvSchemes
+++ b/tutorials/incompressible/simpleFoam/motorBike/system/fvSchemes
@@ -53,6 +53,7 @@ fluxRequired
 {
     default         no;
     p;
+    Phi;
 }
 
 wallDist
diff --git a/tutorials/incompressible/simpleFoam/motorBike/system/fvSolution b/tutorials/incompressible/simpleFoam/motorBike/system/fvSolution
index 55c9820427db82757efd4a3df9fb7909bdc31cb7..4f0f515acac7065c1e4e0040bff3ec3e042d6b4b 100644
--- a/tutorials/incompressible/simpleFoam/motorBike/system/fvSolution
+++ b/tutorials/incompressible/simpleFoam/motorBike/system/fvSolution
@@ -30,6 +30,11 @@ solvers
         mergeLevels      1;
     }
 
+    Phi
+    {
+        $p;
+    }
+
     U
     {
         solver           smoothSolver;
diff --git a/tutorials/incompressible/simpleFoam/pipeCyclic/Allrun b/tutorials/incompressible/simpleFoam/pipeCyclic/Allrun
index 0dc5142f92c853c426acfa9c1022b1502cc3b2b7..28f5ac16f87f4c5f7e6247cd14e2952ea2630f85 100755
--- a/tutorials/incompressible/simpleFoam/pipeCyclic/Allrun
+++ b/tutorials/incompressible/simpleFoam/pipeCyclic/Allrun
@@ -7,26 +7,6 @@ cd ${0%/*} || exit 1    # Run from this directory
 # Get application directory
 application=`getApplication`
 
-# This case uses the #codeStream which is disabled by default. Enable for
-# just this case.
-MAIN_CONTROL_DICT=`foamEtcFile controlDict`
-if [ -f "$MAIN_CONTROL_DICT" ]
-then
-    echo "Modifying ${MAIN_CONTROL_DICT} to enable allowSystemOperations"
-
-    # Clean up on termination and on Ctrl-C
-    trap 'mv ${MAIN_CONTROL_DICT}.$$ ${MAIN_CONTROL_DICT} 2>/dev/null; exit 0' \
-        EXIT TERM INT
-    cp ${MAIN_CONTROL_DICT} ${MAIN_CONTROL_DICT}.$$
-
-    echo "Enabling allowSystemOperations in ${MAIN_CONTROL_DICT}."
-
-    sed \
-    -e s/"\(allowSystemOperations[ \t]*\)\([0-9]\);"/"\1 1;"/g \
-    ${MAIN_CONTROL_DICT}.$$ > ${MAIN_CONTROL_DICT}
-fi
-
-
 runApplication blockMesh
 runApplication topoSet
 runApplication refineHexMesh c0 -overwrite
diff --git a/tutorials/lagrangian/reactingParcelFoam/verticalChannel/system/fvSchemes b/tutorials/lagrangian/reactingParcelFoam/verticalChannel/system/fvSchemes
index fb6d354d17ea27b960b4c50944dc60e1b44b0e43..082adfea4bcb4e86238a05e08a81903b1d92bf7b 100644
--- a/tutorials/lagrangian/reactingParcelFoam/verticalChannel/system/fvSchemes
+++ b/tutorials/lagrangian/reactingParcelFoam/verticalChannel/system/fvSchemes
@@ -58,6 +58,7 @@ fluxRequired
 {
     default         no;
     p;
+    Phi;
 }
 
 wallDist
diff --git a/tutorials/lagrangian/reactingParcelFoam/verticalChannel/system/fvSolution b/tutorials/lagrangian/reactingParcelFoam/verticalChannel/system/fvSolution
index be9c35449c077f7313f807b84432e32fc3c28950..9ef58598dd7359930477f82d628b9644aff6d14c 100644
--- a/tutorials/lagrangian/reactingParcelFoam/verticalChannel/system/fvSolution
+++ b/tutorials/lagrangian/reactingParcelFoam/verticalChannel/system/fvSolution
@@ -68,6 +68,11 @@ solvers
         relTol          0;
     }
 
+    Phi
+    {
+        $p;
+    }
+
     "(Yi|O2|N2|H2O)"
     {
         solver          PBiCG;
@@ -88,7 +93,7 @@ solvers
 
 potentialFlow
 {
-    // used for potentialFoam initialisation
+    // Used for potentialFoam initialisation
     nNonOrthogonalCorrectors 5;
 }
 
diff --git a/tutorials/lagrangian/simpleReactingParcelFoam/verticalChannel/system/fvSchemes b/tutorials/lagrangian/simpleReactingParcelFoam/verticalChannel/system/fvSchemes
index 2091a6975945faddd7b7661b7aaad1ebac1bc354..1e024443b85abb83834733748968c17cadf591ab 100644
--- a/tutorials/lagrangian/simpleReactingParcelFoam/verticalChannel/system/fvSchemes
+++ b/tutorials/lagrangian/simpleReactingParcelFoam/verticalChannel/system/fvSchemes
@@ -59,6 +59,7 @@ fluxRequired
 {
     default         no;
     p;
+    Phi;
 }
 
 wallDist
diff --git a/tutorials/lagrangian/simpleReactingParcelFoam/verticalChannel/system/fvSolution b/tutorials/lagrangian/simpleReactingParcelFoam/verticalChannel/system/fvSolution
index a1c90c36c68a11d7c95089c81110e04e06f3cda0..f442d38a5827e77d970e2a269da197048c50181d 100644
--- a/tutorials/lagrangian/simpleReactingParcelFoam/verticalChannel/system/fvSolution
+++ b/tutorials/lagrangian/simpleReactingParcelFoam/verticalChannel/system/fvSolution
@@ -37,6 +37,11 @@ solvers
         maxIter          50;
     };
 
+    Phi
+    {
+        $p;
+    }
+
     "(U|Yi|h|k|omega)"
     {
         solver          smoothSolver;