diff --git a/applications/utilities/preProcessing/applyBoundaryLayer/Make/options b/applications/utilities/preProcessing/applyBoundaryLayer/Make/options
index 9778b15c09da197c25fef02b86cd13e6b2dcecde..6b1672b25db2f2cdb2abc7d42ef7d556564c4ba4 100644
--- a/applications/utilities/preProcessing/applyBoundaryLayer/Make/options
+++ b/applications/utilities/preProcessing/applyBoundaryLayer/Make/options
@@ -1,7 +1,10 @@
 EXE_INC = \
     -I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \
     -I$(LIB_SRC)/TurbulenceModels/incompressible/lnInclude \
+    -I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude \
+    -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
     -I$(LIB_SRC)/transportModels \
+    -I$(LIB_SRC)/transportModels/compressible/lnInclude \
     -I$(LIB_SRC)/transportModels/incompressible/singlePhaseTransportModel \
     -I$(LIB_SRC)/finiteVolume/lnInclude \
     -I$(LIB_SRC)/meshTools/lnInclude
@@ -9,7 +12,9 @@ EXE_INC = \
 EXE_LIBS = \
     -lturbulenceModels \
     -lincompressibleTurbulenceModels \
+    -lcompressibleTurbulenceModels \
     -lincompressibleTransportModels \
+    -lcompressibleTransportModels \
     -lgenericPatchFields \
     -lfiniteVolume \
     -lmeshTools
diff --git a/applications/utilities/preProcessing/applyBoundaryLayer/applyBoundaryLayer.C b/applications/utilities/preProcessing/applyBoundaryLayer/applyBoundaryLayer.C
index 4f2a30fb5f40539e52e5a4298213dd60168ad95c..e00f12b48ebfccf6f14fbf25ef276358deaee5ae 100644
--- a/applications/utilities/preProcessing/applyBoundaryLayer/applyBoundaryLayer.C
+++ b/applications/utilities/preProcessing/applyBoundaryLayer/applyBoundaryLayer.C
@@ -38,7 +38,9 @@ Description
 #include "fvCFD.H"
 #include "singlePhaseTransportModel.H"
 #include "turbulentTransportModel.H"
+#include "turbulentFluidThermoModel.H"
 #include "wallDist.H"
+#include "processorFvPatchField.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -46,6 +48,266 @@ Description
 static const scalar Cmu(0.09);
 static const scalar kappa(0.41);
 
+void correctProcessorPatches(volScalarField& vf)
+{
+    if (!Pstream::parRun())
+    {
+        return;
+    }
+
+    // Not possible to use correctBoundaryConditions on fields as they may
+    // use local info as opposed to the constraint values employed here,
+    // but still need to update processor patches
+
+    volScalarField::GeometricBoundaryField& bf = vf.boundaryField();
+
+    forAll(bf, patchI)
+    {
+        if (isA<processorFvPatchField<scalar> >(bf[patchI]))
+        {
+            bf[patchI].initEvaluate();
+        }
+    }
+
+    forAll(bf, patchI)
+    {
+        if (isA<processorFvPatchField<scalar> >(bf[patchI]))
+        {
+            bf[patchI].evaluate();
+        }
+    }
+}
+
+
+template<class TurbulenceModel>
+Foam::tmp<Foam::volScalarField> calcK
+(
+    TurbulenceModel& turbulence,
+    const volScalarField& mask,
+    const volScalarField& nut,
+    const volScalarField& y,
+    const dimensionedScalar& ybl,
+    const scalar Cmu,
+    const scalar kappa
+)
+{
+    // Turbulence k
+    tmp<volScalarField> tk = turbulence->k();
+    volScalarField& k = tk();
+    scalar ck0 = pow025(Cmu)*kappa;
+    k = (1 - mask)*k + mask*sqr(nut/(ck0*min(y, ybl)));
+
+    // Do not correct BC
+    // - operation may use inconsistent fields wrt these local manipulations
+    // k.correctBoundaryConditions();
+    correctProcessorPatches(k);
+
+    Info<< "Writing k\n" << endl;
+    k.write();
+
+    return tk;
+}
+
+
+template<class TurbulenceModel>
+Foam::tmp<Foam::volScalarField> calcEpsilon
+(
+    TurbulenceModel& turbulence,
+    const volScalarField& mask,
+    const volScalarField& k,
+    const volScalarField& y,
+    const dimensionedScalar& ybl,
+    const scalar Cmu,
+    const scalar kappa
+)
+{
+    // Turbulence epsilon
+    tmp<volScalarField> tepsilon = turbulence->epsilon();
+    volScalarField& epsilon = tepsilon();
+    scalar ce0 = ::pow(Cmu, 0.75)/kappa;
+    epsilon = (1 - mask)*epsilon + mask*ce0*k*sqrt(k)/min(y, ybl);
+    epsilon.max(SMALL);
+
+    // Do not correct BC
+    // - operation may use inconsistent fields wrt these local manipulations
+    // epsilon.correctBoundaryConditions();
+    correctProcessorPatches(epsilon);
+
+    Info<< "Writing epsilon\n" << endl;
+    epsilon.write();
+
+    return tepsilon;
+}
+
+
+void calcOmega
+(
+    const fvMesh& mesh,
+    const volScalarField& mask,
+    const volScalarField& k,
+    const volScalarField& epsilon
+)
+{
+    // Turbulence omega
+    IOobject omegaHeader
+    (
+        "omega",
+        mesh.time().timeName(),
+        mesh,
+        IOobject::MUST_READ,
+        IOobject::NO_WRITE,
+        false
+    );
+
+    if (omegaHeader.headerOk())
+    {
+        volScalarField omega(omegaHeader, mesh);
+        dimensionedScalar k0("SMALL", k.dimensions(), SMALL);
+
+        omega = (1 - mask)*omega + mask*epsilon/(Cmu*k + k0);
+        omega.max(SMALL);
+
+        // Do not correct BC
+        // - operation may use inconsistent fields wrt these local
+        //   manipulations
+        // omega.correctBoundaryConditions();
+        correctProcessorPatches(omega);
+
+        Info<< "Writing omega\n" << endl;
+        omega.write();
+    }
+}
+
+
+void setField
+(
+    const fvMesh& mesh,
+    const word& fieldName,
+    const volScalarField& value
+)
+{
+    IOobject fldHeader
+    (
+        fieldName,
+        mesh.time().timeName(),
+        mesh,
+        IOobject::MUST_READ,
+        IOobject::NO_WRITE,
+        false
+    );
+
+    if (fldHeader.headerOk())
+    {
+        volScalarField fld(fldHeader, mesh);
+        fld = value;
+
+        // Do not correct BC
+        // - operation may use inconsistent fields wrt these local
+        //   manipulations
+        // fld.correctBoundaryConditions();
+        correctProcessorPatches(fld);
+
+        Info<< "Writing " << fieldName << nl << endl;
+        fld.write();
+    }
+}
+
+
+void calcCompressible
+(
+    const fvMesh& mesh,
+    const volScalarField& mask,
+    const volVectorField& U,
+    const volScalarField& y,
+    const dimensionedScalar& ybl
+)
+{
+    const Time& runTime = mesh.time();
+
+    autoPtr<fluidThermo> pThermo(fluidThermo::New(mesh));
+    fluidThermo& thermo = pThermo();
+    volScalarField rho(thermo.rho());
+
+    // Update/re-write phi
+    #include "compressibleCreatePhi.H"
+    phi.write();
+
+    autoPtr<compressible::turbulenceModel> turbulence
+    (
+        compressible::turbulenceModel::New
+        (
+            rho,
+            U,
+            phi,
+            thermo
+        )
+    );
+
+    // Calculate nut - reference nut is calculated by the turbulence model
+    // on its construction
+    tmp<volScalarField> tnut = turbulence->nut();
+
+    volScalarField& nut = tnut();
+    volScalarField S(mag(dev(symm(fvc::grad(U)))));
+    nut = (1 - mask)*nut + mask*sqr(kappa*min(y, ybl))*::sqrt(2)*S;
+
+    // Do not correct BC - wall functions will 'undo' manipulation above
+    // by using nut from turbulence model
+    correctProcessorPatches(nut);
+    nut.write();
+
+    tmp<volScalarField> k =
+        calcK(turbulence, mask, nut, y, ybl, Cmu, kappa);
+    tmp<volScalarField> epsilon =
+        calcEpsilon(turbulence, mask, k, y, ybl, Cmu, kappa);
+    calcOmega(mesh, mask, k, epsilon);
+    setField(mesh, "nuTilda", nut);
+}
+
+
+void calcIncompressible
+(
+    const fvMesh& mesh,
+    const volScalarField& mask,
+    const volVectorField& U,
+    const volScalarField& y,
+    const dimensionedScalar& ybl
+)
+{
+    const Time& runTime = mesh.time();
+
+    // Update/re-write phi
+    #include "createPhi.H"
+    phi.write();
+
+    singlePhaseTransportModel laminarTransport(U, phi);
+
+    autoPtr<incompressible::turbulenceModel> turbulence
+    (
+        incompressible::turbulenceModel::New(U, phi, laminarTransport)
+    );
+
+    tmp<volScalarField> tnut = turbulence->nut();
+
+    // Calculate nut - reference nut is calculated by the turbulence model
+    // on its construction
+    volScalarField& nut = tnut();
+    volScalarField S(mag(dev(symm(fvc::grad(U)))));
+    nut = (1 - mask)*nut + mask*sqr(kappa*min(y, ybl))*::sqrt(2)*S;
+
+    // Do not correct BC - wall functions will 'undo' manipulation above
+    // by using nut from turbulence model
+    correctProcessorPatches(nut);
+    nut.write();
+
+    tmp<volScalarField> k =
+        calcK(turbulence, mask, nut, y, ybl, Cmu, kappa);
+    tmp<volScalarField> epsilon =
+        calcEpsilon(turbulence, mask, k, y, ybl, Cmu, kappa);
+    calcOmega(mesh, mask, k, epsilon);
+    setField(mesh, "nuTilda", nut);
+}
+
 
 int main(int argc, char *argv[])
 {
@@ -55,6 +317,8 @@ int main(int argc, char *argv[])
         "turbulence fields based on the 1/7th power-law."
     );
 
+    #include "addRegionOption.H"
+
     argList::addOption
     (
         "ybl",
@@ -69,8 +333,8 @@ int main(int argc, char *argv[])
     );
     argList::addBoolOption
     (
-        "writenut",
-        "write nut field"
+        "compressible",
+        "apply to compressible case"
     );
 
     #include "setRootCase.H"
@@ -93,9 +357,11 @@ int main(int argc, char *argv[])
     }
 
     #include "createTime.H"
-    #include "createMesh.H"
+    #include "createNamedMesh.H"
     #include "createFields.H"
 
+    const bool compressible = args.optionFound("compressible");
+
     // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
     // Modify velocity by applying a 1/7th power law boundary-layer
@@ -117,113 +383,16 @@ int main(int argc, char *argv[])
     Info<< "Writing U\n" << endl;
     U.write();
 
-    // Update/re-write phi
-    #include "createPhi.H"
-    phi.write();
-
-    singlePhaseTransportModel laminarTransport(U, phi);
-
-    autoPtr<incompressible::turbulenceModel> turbulence
-    (
-        incompressible::turbulenceModel::New(U, phi, laminarTransport)
-    );
 
-    if (isA<incompressible::RASModel>(turbulence()))
+    if (compressible)
     {
-        // Calculate nut - reference nut is calculated by the turbulence model
-        // on its construction
-        tmp<volScalarField> tnut = turbulence->nut();
-        volScalarField& nut = tnut();
-        volScalarField S(mag(dev(symm(fvc::grad(U)))));
-        nut = (1 - mask)*nut + mask*sqr(kappa*min(y, ybl))*::sqrt(2)*S;
-
-        // do not correct BC - wall functions will 'undo' manipulation above
-        // by using nut from turbulence model
-
-        if (args.optionFound("writenut"))
-        {
-            Info<< "Writing nut" << endl;
-            nut.write();
-        }
-
-
-        //--- Read and modify turbulence fields
-
-        // Turbulence k
-        tmp<volScalarField> tk = turbulence->k();
-        volScalarField& k = tk();
-        scalar ck0 = pow025(Cmu)*kappa;
-        k = (1 - mask)*k + mask*sqr(nut/(ck0*min(y, ybl)));
-
-        // do not correct BC - operation may use inconsistent fields wrt these
-        // local manipulations
-        // k.correctBoundaryConditions();
-
-        Info<< "Writing k\n" << endl;
-        k.write();
-
-
-        // Turbulence epsilon
-        tmp<volScalarField> tepsilon = turbulence->epsilon();
-        volScalarField& epsilon = tepsilon();
-        scalar ce0 = ::pow(Cmu, 0.75)/kappa;
-        epsilon = (1 - mask)*epsilon + mask*ce0*k*sqrt(k)/min(y, ybl);
-
-        // do not correct BC - wall functions will use non-updated k from
-        // turbulence model
-        // epsilon.correctBoundaryConditions();
-
-        Info<< "Writing epsilon\n" << endl;
-        epsilon.write();
-
-        // Turbulence omega
-        IOobject omegaHeader
-        (
-            "omega",
-            runTime.timeName(),
-            mesh,
-            IOobject::MUST_READ,
-            IOobject::NO_WRITE,
-            false
-        );
-
-        if (omegaHeader.headerOk())
-        {
-            volScalarField omega(omegaHeader, mesh);
-            dimensionedScalar k0("VSMALL", k.dimensions(), VSMALL);
-            omega = (1 - mask)*omega + mask*epsilon/(Cmu*k + k0);
-
-            // do not correct BC - wall functions will use non-updated k from
-            // turbulence model
-            // omega.correctBoundaryConditions();
-
-            Info<< "Writing omega\n" << endl;
-            omega.write();
-        }
-
-        // Turbulence nuTilda
-        IOobject nuTildaHeader
-        (
-            "nuTilda",
-            runTime.timeName(),
-            mesh,
-            IOobject::MUST_READ,
-            IOobject::NO_WRITE,
-            false
-        );
-
-        if (nuTildaHeader.headerOk())
-        {
-            volScalarField nuTilda(nuTildaHeader, mesh);
-            nuTilda = nut;
-
-            // do not correct BC
-            // nuTilda.correctBoundaryConditions();
-
-            Info<< "Writing nuTilda\n" << endl;
-            nuTilda.write();
-        }
+        calcCompressible(mesh, mask, U, y, ybl);
     }
+    else
+    {
+        calcIncompressible(mesh, mask, U, y, ybl);
+    }
+
 
     Info<< nl << "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
         << "  ClockTime = " << runTime.elapsedClockTime() << " s"