diff --git a/src/Allwmake b/src/Allwmake
index f3c4420474f56a0740a88658e236f11e72325074..9070e42da0f51cdded71c9eee8477003f4f16126 100755
--- a/src/Allwmake
+++ b/src/Allwmake
@@ -58,7 +58,7 @@ wmake libso randomProcesses
 thermophysicalModels/Allwmake
 transportModels/Allwmake
 turbulenceModels/Allwmake
-wmake libso surfaceFilmModels
+regionModels/Allwmake
 lagrangian/Allwmake
 postProcessing/Allwmake
 mesh/Allwmake
diff --git a/src/regionModels/Allwmake b/src/regionModels/Allwmake
new file mode 100755
index 0000000000000000000000000000000000000000..7713ded586a3b86c9dac8648bf41cb7de13d79fb
--- /dev/null
+++ b/src/regionModels/Allwmake
@@ -0,0 +1,11 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # run from this directory
+set -x
+
+wmake libso regionModel
+#wmake libso pyrolysisModels
+wmake libso surfaceFilmModels
+#wmake libso regionCoupling
+
+
+# ----------------------------------------------------------------- end-of-file
diff --git a/src/regionModels/regionModel/Make/files b/src/regionModels/regionModel/Make/files
new file mode 100644
index 0000000000000000000000000000000000000000..e2989ef8fc5e480868c56e4566f5f8230b7769e0
--- /dev/null
+++ b/src/regionModels/regionModel/Make/files
@@ -0,0 +1,14 @@
+/* Region models */
+regionModel/regionModel.C
+singleLayerRegion/singleLayerRegion.C
+regionModel1D/regionModel1D.C
+
+/* Boundary conditions */
+derivedFvPatchFields/directMappedField/directMappedFieldFvPatchFields.C
+
+derivedFvPatchFields/directMappedFixedInternalValue/directMappedFixedInternalValueFvPatchFields.C
+derivedFvPatchFields/directMappedFixedPushedInternalValue/directMappedFixedPushedInternalValueFvPatchFields.C
+derivedFvPatchFields/directMappedNamedFixedValue/directMappedNamedFixedValueFvPatchFields.C
+
+
+LIB = $(FOAM_LIBBIN)/libregionModels
diff --git a/src/regionModels/regionModel/Make/options b/src/regionModels/regionModel/Make/options
new file mode 100644
index 0000000000000000000000000000000000000000..d27c95d033dd5d7b1995c8ff8dc406e35ca1f586
--- /dev/null
+++ b/src/regionModels/regionModel/Make/options
@@ -0,0 +1,7 @@
+EXE_INC = \
+    -I$(LIB_SRC)/finiteVolume/lnInclude \
+    -I$(LIB_SRC)/meshTools/lnInclude
+
+EXE_LIBS = \
+    -lfiniteVolume \
+    -lmeshTools
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/directMappedField/directMappedFieldFvPatchField.C b/src/regionModels/regionModel/derivedFvPatchFields/directMappedField/directMappedFieldFvPatchField.C
new file mode 100644
index 0000000000000000000000000000000000000000..f9be131628de4acef8fb56eb74729ae772068f43
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/directMappedField/directMappedFieldFvPatchField.C
@@ -0,0 +1,313 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 "directMappedFieldFvPatchField.H"
+
+#include "volFields.H"
+#include "interpolationCell.H"
+#include "mapDistribute.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+template<class Type>
+directMappedFieldFvPatchField<Type>::directMappedFieldFvPatchField
+(
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF
+)
+:
+    directMappedPatchBase(p.patch()),
+    fixedValueFvPatchField<Type>(p, iF),
+    fieldName_(iF.name()),
+    setAverage_(false),
+    average_(pTraits<Type>::zero)
+{}
+
+
+template<class Type>
+directMappedFieldFvPatchField<Type>::directMappedFieldFvPatchField
+(
+    const directMappedFieldFvPatchField<Type>& ptf,
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF,
+    const fvPatchFieldMapper& mapper
+)
+:
+    directMappedPatchBase(p.patch(), ptf),
+    fixedValueFvPatchField<Type>(ptf, p, iF, mapper),
+    fieldName_(ptf.fieldName_),
+    setAverage_(ptf.setAverage_),
+    average_(ptf.average_)
+{}
+
+
+template<class Type>
+directMappedFieldFvPatchField<Type>::directMappedFieldFvPatchField
+(
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF,
+    const dictionary& dict
+)
+:
+    directMappedPatchBase(p.patch(), dict),
+    fixedValueFvPatchField<Type>(p, iF, dict),
+    fieldName_(dict.template lookupOrDefault<word>("fieldName", iF.name())),
+    setAverage_(readBool(dict.lookup("setAverage"))),
+    average_(pTraits<Type>(dict.lookup("average")))
+{}
+
+
+template<class Type>
+directMappedFieldFvPatchField<Type>::directMappedFieldFvPatchField
+(
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF,
+
+    // directMappedPatchBase
+    const word& sampleRegion,
+    const sampleMode sampleMode,
+    const word& samplePatch,
+    const scalar distance,
+
+    // My settings
+    const word& fieldName,
+    const bool setAverage,
+    const Type average
+)
+:
+    directMappedPatchBase
+    (
+        p.patch(),
+        sampleRegion,
+        sampleMode,
+        samplePatch,
+        distance
+    ),
+    fixedValueFvPatchField<Type>(p, iF),
+    fieldName_(fieldName),
+    setAverage_(setAverage),
+    average_(average)
+{}
+
+
+template<class Type>
+directMappedFieldFvPatchField<Type>::directMappedFieldFvPatchField
+(
+    const directMappedFieldFvPatchField<Type>& ptf
+)
+:
+    directMappedPatchBase(ptf.patch().patch(), ptf),
+    fixedValueFvPatchField<Type>(ptf),
+    fieldName_(ptf.fieldName_),
+    setAverage_(ptf.setAverage_),
+    average_(ptf.average_)
+{}
+
+
+template<class Type>
+directMappedFieldFvPatchField<Type>::directMappedFieldFvPatchField
+(
+    const directMappedFieldFvPatchField<Type>& ptf,
+    const DimensionedField<Type, volMesh>& iF
+)
+:
+    directMappedPatchBase(ptf.patch().patch(), ptf),
+    fixedValueFvPatchField<Type>(ptf, iF),
+    fieldName_(ptf.fieldName_),
+    setAverage_(ptf.setAverage_),
+    average_(ptf.average_)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class Type>
+const GeometricField<Type, fvPatchField, volMesh>&
+directMappedFieldFvPatchField<Type>::sampleField() const
+{
+    typedef GeometricField<Type, fvPatchField, volMesh> fieldType;
+
+    const fvMesh& nbrMesh = refCast<const fvMesh>(sampleMesh());
+
+    if (sameRegion())
+    {
+        if (fieldName_ == this->dimensionedInternalField().name())
+        {
+            // Optimisation: bypass field lookup
+            return
+                dynamic_cast<const fieldType&>
+                (
+                    this->dimensionedInternalField()
+                );
+        }
+        else
+        {
+            const fvMesh& thisMesh = this->patch().boundaryMesh().mesh();
+            return thisMesh.template lookupObject<fieldType>(fieldName_);
+        }
+    }
+    else
+    {
+        return nbrMesh.template lookupObject<fieldType>(fieldName_);
+    }
+}
+
+
+template<class Type>
+void directMappedFieldFvPatchField<Type>::updateCoeffs()
+{
+    if (this->updated())
+    {
+        return;
+    }
+
+    typedef GeometricField<Type, fvPatchField, volMesh> fieldType;
+
+    const fvMesh& nbrMesh = refCast<const fvMesh>(sampleMesh());
+    const mapDistribute& distMap = directMappedPatchBase::map();
+
+    // Result of obtaining remote values
+    Field<Type> newValues;
+
+    switch (mode())
+    {
+        case NEARESTCELL:
+        {
+            newValues = sampleField();
+
+            distMap.distribute(newValues);
+
+            break;
+        }
+        case NEARESTPATCHFACE:
+        {
+            const label nbrPatchID = nbrMesh.boundaryMesh().findPatchID
+            (
+                samplePatch()
+            );
+            if (nbrPatchID < 0)
+            {
+                FatalErrorIn
+                (
+                    "void directMappedFieldFvPatchField<Type>::updateCoeffs()"
+                )<< "Unable to find sample patch " << samplePatch()
+                 << " in region " << sampleRegion()
+                 << " for patch " << this->patch().name() << nl
+                 << abort(FatalError);
+            }
+
+            const fieldType& nbrField = sampleField();
+
+            newValues = nbrField.boundaryField()[nbrPatchID];
+            distMap.distribute(newValues);
+
+            break;
+        }
+        case NEARESTFACE:
+        {
+            Field<Type> allValues(nbrMesh.nFaces(), pTraits<Type>::zero);
+
+            const fieldType& nbrField = sampleField();
+
+            forAll(nbrField.boundaryField(), patchI)
+            {
+                const fvPatchField<Type>& pf =
+                    nbrField.boundaryField()[patchI];
+                label faceStart = pf.patch().patch().start();
+
+                forAll(pf, faceI)
+                {
+                    allValues[faceStart++] = pf[faceI];
+                }
+            }
+
+            distMap.distribute(allValues);
+
+            newValues.transfer(allValues);
+
+            break;
+        }
+        default:
+        {
+            FatalErrorIn("directMappedFieldFvPatchField<Type>::updateCoeffs()")
+                << "Unknown sampling mode: " << mode()
+                << nl << abort(FatalError);
+        }
+    }
+
+    if (setAverage_)
+    {
+        Type averagePsi =
+            gSum(this->patch().magSf()*newValues)
+           /gSum(this->patch().magSf());
+
+        if (mag(averagePsi)/mag(average_) > 0.5)
+        {
+            newValues *= mag(average_)/mag(averagePsi);
+        }
+        else
+        {
+            newValues += (average_ - averagePsi);
+        }
+    }
+
+    this->operator==(newValues);
+
+    if (debug)
+    {
+        Info<< "operating on field:" << this->dimensionedInternalField().name()
+            << " patch:" << this->patch().name()
+            << "  avg:" << gAverage(*this)
+            << "  min:" << gMin(*this)
+            << "  max:" << gMax(*this)
+            << endl;
+    }
+
+    fixedValueFvPatchField<Type>::updateCoeffs();
+}
+
+
+template<class Type>
+void directMappedFieldFvPatchField<Type>::write(Ostream& os) const
+{
+    fvPatchField<Type>::write(os);
+    directMappedPatchBase::write(os);
+    os.writeKeyword("fieldName") << fieldName_ << token::END_STATEMENT << nl;
+    os.writeKeyword("setAverage") << setAverage_ << token::END_STATEMENT << nl;
+    os.writeKeyword("average") << average_ << token::END_STATEMENT << nl;
+    this->writeEntry("value", os);
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/directMappedField/directMappedFieldFvPatchField.H b/src/regionModels/regionModel/derivedFvPatchFields/directMappedField/directMappedFieldFvPatchField.H
new file mode 100644
index 0000000000000000000000000000000000000000..c11a8e71a9783c0d703d3b161296ffe74480e8ff
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/directMappedField/directMappedFieldFvPatchField.H
@@ -0,0 +1,201 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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::directMappedFieldFvPatchField
+
+Description
+    Self-contained version of directMapped. Does not use information on
+    patch, instead holds it locally (and possibly duplicate) so use
+    normal directMapped in preference and only use this if you cannot
+    change the underlying patch type to directMapped.
+
+SourceFiles
+    directMappedFieldFvPatchField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef directMappedFieldFvPatchField_H
+#define directMappedFieldFvPatchField_H
+
+#include "directMappedPatchBase.H"
+#include "fixedValueFvPatchFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+               Class directMappedFieldFvPatchField Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class Type>
+class directMappedFieldFvPatchField
+:
+    public directMappedPatchBase,
+    public fixedValueFvPatchField<Type>
+{
+    // Private data
+
+        //- Name of field to sample - defaults to field associated with this
+        //  patchField if not specified
+        word fieldName_;
+
+        //- If true adjust the mapped field to maintain average value average_
+        const bool setAverage_;
+
+        //- Average value the mapped field is adjusted to maintain if
+        //  setAverage_ is set true
+        const Type average_;
+
+
+    // Private Member Functions
+
+        //- Field to sample. Either on my or nbr mesh
+        const GeometricField<Type, fvPatchField, volMesh>& sampleField() const;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("directMappedField");
+
+
+    // Constructors
+
+        //- Construct from patch and internal field
+        directMappedFieldFvPatchField
+        (
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&
+        );
+
+        //- Construct from patch, internal field and dictionary
+        directMappedFieldFvPatchField
+        (
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&,
+            const dictionary&
+        );
+
+        //- Construct from patch, internal field and distance for normal type
+        //  sampling
+        directMappedFieldFvPatchField
+        (
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&,
+
+            // directMappedPatchBase
+            const word& sampleRegion,
+            const sampleMode sampleMode,
+            const word& samplePatch,
+            const scalar distance,
+
+            // My settings
+            const word& fieldName,
+            const bool setAverage,
+            const Type average
+        );
+
+        //- Construct by mapping given
+        //  directMappedFieldFvPatchField
+        //  onto a new patch
+        directMappedFieldFvPatchField
+        (
+            const directMappedFieldFvPatchField<Type>&,
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&,
+            const fvPatchFieldMapper&
+        );
+
+        //- Construct as copy
+        directMappedFieldFvPatchField
+        (
+            const directMappedFieldFvPatchField<Type>&
+        );
+
+        //- Construct and return a clone
+        virtual tmp<fvPatchField<Type> > clone() const
+        {
+            return tmp<fvPatchField<Type> >
+            (
+                new directMappedFieldFvPatchField<Type>
+                (
+                    *this
+                )
+            );
+        }
+
+        //- Construct as copy setting internal field reference
+        directMappedFieldFvPatchField
+        (
+            const directMappedFieldFvPatchField<Type>&,
+            const DimensionedField<Type, volMesh>&
+        );
+
+        //- Construct and return a clone setting internal field reference
+        virtual tmp<fvPatchField<Type> > clone
+        (
+            const DimensionedField<Type, volMesh>& iF
+        ) const
+        {
+            return tmp<fvPatchField<Type> >
+            (
+                new directMappedFieldFvPatchField<Type>
+                (
+                    *this,
+                    iF
+                )
+            );
+        }
+
+
+    // Member functions
+
+        // Evaluation functions
+
+            //- Update the coefficients associated with the patch field
+            virtual void updateCoeffs();
+
+
+        //- Write
+        virtual void write(Ostream&) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#   include "directMappedFieldFvPatchField.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/directMappedField/directMappedFieldFvPatchFields.C b/src/regionModels/regionModel/derivedFvPatchFields/directMappedField/directMappedFieldFvPatchFields.C
new file mode 100644
index 0000000000000000000000000000000000000000..92b3a995763280773d429c9e3745d466e8ab2034
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/directMappedField/directMappedFieldFvPatchFields.C
@@ -0,0 +1,43 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 "directMappedFieldFvPatchFields.H"
+#include "volMesh.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+makePatchFields(directMappedField);
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/directMappedField/directMappedFieldFvPatchFields.H b/src/regionModels/regionModel/derivedFvPatchFields/directMappedField/directMappedFieldFvPatchFields.H
new file mode 100644
index 0000000000000000000000000000000000000000..45517fb557c9e5fef71ff0ddec250031a19a7241
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/directMappedField/directMappedFieldFvPatchFields.H
@@ -0,0 +1,49 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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/>.
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef directMappedFieldFvPatchFields_H
+#define directMappedFieldFvPatchFields_H
+
+#include "directMappedFieldFvPatchField.H"
+#include "fieldTypes.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+makePatchTypeFieldTypedefs(directMappedField)
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/directMappedField/directMappedFieldFvPatchFieldsFwd.H b/src/regionModels/regionModel/derivedFvPatchFields/directMappedField/directMappedFieldFvPatchFieldsFwd.H
new file mode 100644
index 0000000000000000000000000000000000000000..82b5fe7a141a20e1fd4649b3b56296c85fa73503
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/directMappedField/directMappedFieldFvPatchFieldsFwd.H
@@ -0,0 +1,50 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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/>.
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef directMappedFieldFvPatchFieldsFwd_H
+#define directMappedFieldFvPatchFieldsFwd_H
+
+#include "fieldTypes.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+template<class Type> class directMappedFieldFvPatchField;
+
+makePatchTypeFieldTypedefs(directMappedField)
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedInternalValue/directMappedFixedInternalValueFvPatchField.C b/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedInternalValue/directMappedFixedInternalValueFvPatchField.C
new file mode 100644
index 0000000000000000000000000000000000000000..ee04c6ff94a7155eacb04e883afa42d5a7f8230f
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedInternalValue/directMappedFixedInternalValueFvPatchField.C
@@ -0,0 +1,157 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "directMappedFixedInternalValueFvPatchField.H"
+#include "UIndirectList.H"
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+template<class Type>
+Foam::directMappedFixedInternalValueFvPatchField<Type>::
+directMappedFixedInternalValueFvPatchField
+(
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF
+)
+:
+    directMappedFixedValueFvPatchField<Type>(p, iF)
+{}
+
+
+template<class Type>
+Foam::directMappedFixedInternalValueFvPatchField<Type>::
+directMappedFixedInternalValueFvPatchField
+(
+    const directMappedFixedInternalValueFvPatchField<Type>& ptf,
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF,
+    const fvPatchFieldMapper& mapper
+)
+:
+    directMappedFixedValueFvPatchField<Type>(ptf, p, iF, mapper)
+{}
+
+
+template<class Type>
+Foam::directMappedFixedInternalValueFvPatchField<Type>::
+directMappedFixedInternalValueFvPatchField
+(
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF,
+    const dictionary& dict
+)
+:
+    directMappedFixedValueFvPatchField<Type>(p, iF, dict)
+{}
+
+
+template<class Type>
+Foam::directMappedFixedInternalValueFvPatchField<Type>::
+directMappedFixedInternalValueFvPatchField
+(
+    const directMappedFixedInternalValueFvPatchField<Type>& ptf
+)
+:
+    directMappedFixedValueFvPatchField<Type>(ptf)
+{}
+
+
+template<class Type>
+Foam::directMappedFixedInternalValueFvPatchField<Type>::
+directMappedFixedInternalValueFvPatchField
+(
+    const directMappedFixedInternalValueFvPatchField<Type>& ptf,
+    const DimensionedField<Type, volMesh>& iF
+)
+:
+    directMappedFixedValueFvPatchField<Type>(ptf, iF)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class Type>
+void Foam::directMappedFixedInternalValueFvPatchField<Type>::updateCoeffs()
+{
+    typedef GeometricField<Type, fvPatchField, volMesh> FieldType;
+
+    if (this->updated())
+    {
+        return;
+    }
+
+    // Retrieve the neighbour values and assign to this patch boundary field
+    directMappedFixedValueFvPatchField<Type>::updateCoeffs();
+
+    // Get the coupling information from the directMappedPatchBase
+    const directMappedPatchBase& mpp =
+        refCast<const directMappedPatchBase>(this->patch().patch());
+    const polyMesh& nbrMesh = mpp.sampleMesh();
+    const fvPatch& nbrPatch =
+        refCast<const fvMesh>
+        (
+            nbrMesh
+        ).boundary()[mpp.samplePolyPatch().index()];
+
+    // Force recalculation of mapping and schedule
+    const mapDistribute& distMap = mpp.map();
+
+    // Retrieve the neighbour field
+    const fvPatchField<Type>& nbrField =
+        nbrPatch.template lookupPatchField<FieldType, Type>
+        (
+            this->dimensionedInternalField().name()
+        );
+
+    // Retrieve the neighbour patch internal field
+    Field<Type> nbrIntFld = nbrField.patchInternalField();
+    mapDistribute::distribute
+    (
+        Pstream::defaultCommsType,
+        distMap.schedule(),
+        distMap.constructSize(),
+        distMap.subMap(),           // what to send
+        distMap.constructMap(),     // what to receive
+        nbrIntFld
+    );
+
+    // Assign (this) patch internal field to its neighbour values
+    Field<Type>& intFld = const_cast<Field<Type>&>(this->internalField());
+    UIndirectList<Type>(intFld, this->patch().faceCells()) = nbrIntFld;
+}
+
+
+template<class Type>
+void Foam::directMappedFixedInternalValueFvPatchField<Type>::write
+(
+    Ostream& os
+) const
+{
+    directMappedFixedValueFvPatchField<Type>::write(os);
+}
+
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedInternalValue/directMappedFixedInternalValueFvPatchField.H b/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedInternalValue/directMappedFixedInternalValueFvPatchField.H
new file mode 100644
index 0000000000000000000000000000000000000000..bdc887e1850867ca2ca1ead2cdc6c67603800a11
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedInternalValue/directMappedFixedInternalValueFvPatchField.H
@@ -0,0 +1,151 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::directMappedFixedInternalValueFvPatchField
+
+Description
+    Recycles the boundary and internal values of a neighbour patch field to
+    the boundary and internal values of *this.
+
+SourceFiles
+    directMappedFixedInternalValueFvPatchField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef directMappedFixedInternalValueFvPatchField_H
+#define directMappedFixedInternalValueFvPatchField_H
+
+#include "directMappedFixedValueFvPatchField.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+         Class directMappedFixedInternalValueFvPatchField Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class Type>
+class directMappedFixedInternalValueFvPatchField
+:
+    public directMappedFixedValueFvPatchField<Type>
+{
+
+public:
+
+    //- Runtime type information
+    TypeName("directMappedFixedInternalValue");
+
+
+    // Constructors
+
+        //- Construct from patch and internal field
+        directMappedFixedInternalValueFvPatchField
+        (
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&
+        );
+
+        //- Construct from patch, internal field and dictionary
+        directMappedFixedInternalValueFvPatchField
+        (
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&,
+            const dictionary&
+        );
+
+        //- Construct by mapping given
+        // directMappedFixedInternalValueFvPatchField  onto a new patch
+        directMappedFixedInternalValueFvPatchField
+        (
+            const directMappedFixedInternalValueFvPatchField<Type>&,
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&,
+            const fvPatchFieldMapper&
+        );
+
+        //- Construct as copy
+        directMappedFixedInternalValueFvPatchField
+        (
+            const directMappedFixedInternalValueFvPatchField<Type>&
+        );
+
+        //- Construct and return a clone
+        virtual tmp<fvPatchField<Type> > clone() const
+        {
+            return tmp<fvPatchField<Type> >
+            (
+                new directMappedFixedInternalValueFvPatchField<Type>(*this)
+            );
+        }
+
+        //- Construct as copy setting internal field reference
+        directMappedFixedInternalValueFvPatchField
+        (
+            const directMappedFixedInternalValueFvPatchField<Type>&,
+            const DimensionedField<Type, volMesh>&
+        );
+
+        //- Construct and return a clone setting internal field reference
+        virtual tmp<fvPatchField<Type> > clone
+        (
+            const DimensionedField<Type, volMesh>& iF
+        ) const
+        {
+            return tmp<fvPatchField<Type> >
+            (
+                new directMappedFixedInternalValueFvPatchField<Type>(*this, iF)
+            );
+        }
+
+
+    // Member functions
+
+        // Evaluation functions
+
+            //- Update the coefficients associated with the patch field
+            virtual void updateCoeffs();
+
+        //- Write
+        virtual void write(Ostream&) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#   include "directMappedFixedInternalValueFvPatchField.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedInternalValue/directMappedFixedInternalValueFvPatchFields.C b/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedInternalValue/directMappedFixedInternalValueFvPatchFields.C
new file mode 100644
index 0000000000000000000000000000000000000000..e43d668c3791e7f3965bbe4f61ba72f0750ee65c
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedInternalValue/directMappedFixedInternalValueFvPatchFields.C
@@ -0,0 +1,44 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "directMappedFixedInternalValueFvPatchFields.H"
+#include "volMesh.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+makePatchFields(directMappedFixedInternalValue);
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedInternalValue/directMappedFixedInternalValueFvPatchFields.H b/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedInternalValue/directMappedFixedInternalValueFvPatchFields.H
new file mode 100644
index 0000000000000000000000000000000000000000..199df7664009048fe96011605a68b765ae10bf2a
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedInternalValue/directMappedFixedInternalValueFvPatchFields.H
@@ -0,0 +1,50 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef directMappedFixedInternalValueFvPatchFields_H
+#define directMappedFixedInternalValueFvPatchFields_H
+
+#include "directMappedFixedInternalValueFvPatchField.H"
+#include "fieldTypes.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+makePatchTypeFieldTypedefs(directMappedFixedInternalValue)
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedInternalValue/directMappedFixedInternalValueFvPatchFieldsFwd.H b/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedInternalValue/directMappedFixedInternalValueFvPatchFieldsFwd.H
new file mode 100644
index 0000000000000000000000000000000000000000..6433bf0606a92a2d535a6c9565d38d7b2e662057
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedInternalValue/directMappedFixedInternalValueFvPatchFieldsFwd.H
@@ -0,0 +1,51 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef directMappedFixedInternalValueFvPatchFieldsFwd_H
+#define directMappedFixedInternalValueFvPatchFieldsFwd_H
+
+#include "fieldTypes.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+template<class Type> class directMappedFixedInternalValueFvPatchField;
+
+makePatchTypeFieldTypedefs(directMappedFixedInternalValue)
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedPushedInternalValue/directMappedFixedPushedInternalValueFvPatchField.C b/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedPushedInternalValue/directMappedFixedPushedInternalValueFvPatchField.C
new file mode 100644
index 0000000000000000000000000000000000000000..b3eacffa08a28487e3aef22bc034206a35560b0a
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedPushedInternalValue/directMappedFixedPushedInternalValueFvPatchField.C
@@ -0,0 +1,126 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "directMappedFixedPushedInternalValueFvPatchField.H"
+#include "UIndirectList.H"
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+template<class Type>
+Foam::directMappedFixedPushedInternalValueFvPatchField<Type>::
+directMappedFixedPushedInternalValueFvPatchField
+(
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF
+)
+:
+    directMappedFixedValueFvPatchField<Type>(p, iF)
+{}
+
+
+template<class Type>
+Foam::directMappedFixedPushedInternalValueFvPatchField<Type>::
+directMappedFixedPushedInternalValueFvPatchField
+(
+    const directMappedFixedPushedInternalValueFvPatchField<Type>& ptf,
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF,
+    const fvPatchFieldMapper& mapper
+)
+:
+    directMappedFixedValueFvPatchField<Type>(ptf, p, iF, mapper)
+{}
+
+
+template<class Type>
+Foam::directMappedFixedPushedInternalValueFvPatchField<Type>::
+directMappedFixedPushedInternalValueFvPatchField
+(
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF,
+    const dictionary& dict
+)
+:
+    directMappedFixedValueFvPatchField<Type>(p, iF, dict)
+{}
+
+
+template<class Type>
+Foam::directMappedFixedPushedInternalValueFvPatchField<Type>::
+directMappedFixedPushedInternalValueFvPatchField
+(
+    const directMappedFixedPushedInternalValueFvPatchField<Type>& ptf
+)
+:
+    directMappedFixedValueFvPatchField<Type>(ptf)
+{}
+
+
+template<class Type>
+Foam::directMappedFixedPushedInternalValueFvPatchField<Type>::
+directMappedFixedPushedInternalValueFvPatchField
+(
+    const directMappedFixedPushedInternalValueFvPatchField<Type>& ptf,
+    const DimensionedField<Type, volMesh>& iF
+)
+:
+    directMappedFixedValueFvPatchField<Type>(ptf, iF)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class Type>
+void
+Foam::directMappedFixedPushedInternalValueFvPatchField<Type>::updateCoeffs()
+{
+    typedef GeometricField<Type, fvPatchField, volMesh> FieldType;
+
+    if (this->updated())
+    {
+        return;
+    }
+
+    // Retrieve the neighbour values and assign to this patch boundary field
+    directMappedFixedValueFvPatchField<Type>::updateCoeffs();
+
+    // Assign the patch internal field to its boundary value
+    Field<Type>& intFld = const_cast<Field<Type>&>(this->internalField());
+    UIndirectList<Type>(intFld, this->patch().faceCells()) = *this;
+}
+
+
+template<class Type>
+void Foam::directMappedFixedPushedInternalValueFvPatchField<Type>::write
+(
+    Ostream& os
+) const
+{
+    directMappedFixedValueFvPatchField<Type>::write(os);
+}
+
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedPushedInternalValue/directMappedFixedPushedInternalValueFvPatchField.H b/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedPushedInternalValue/directMappedFixedPushedInternalValueFvPatchField.H
new file mode 100644
index 0000000000000000000000000000000000000000..1b8ff45c44fe6fc53fc33f198a3d64ada95ee5f8
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedPushedInternalValue/directMappedFixedPushedInternalValueFvPatchField.H
@@ -0,0 +1,158 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::directMappedFixedPushedInternalValueFvPatchField
+
+Description
+    Recycles the boundary values of a neighbour patch field to the boundary
+    and internal values of *this.
+
+SourceFiles
+    directMappedFixedPushedInternalValueFvPatchField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef directMappedFixedPushedInternalValueFvPatchField_H
+#define directMappedFixedPushedInternalValueFvPatchField_H
+
+#include "directMappedFixedValueFvPatchField.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+      Class directMappedFixedPushedInternalValueFvPatchField Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class Type>
+class directMappedFixedPushedInternalValueFvPatchField
+:
+    public directMappedFixedValueFvPatchField<Type>
+{
+
+public:
+
+    //- Runtime type information
+    TypeName("directMappedFixedPushedInternalValue");
+
+
+    // Constructors
+
+        //- Construct from patch and internal field
+        directMappedFixedPushedInternalValueFvPatchField
+        (
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&
+        );
+
+        //- Construct from patch, internal field and dictionary
+        directMappedFixedPushedInternalValueFvPatchField
+        (
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&,
+            const dictionary&
+        );
+
+        //- Construct by mapping given a
+        //  directMappedFixedPushedInternalValueFvPatchField  onto a new patch
+        directMappedFixedPushedInternalValueFvPatchField
+        (
+            const directMappedFixedPushedInternalValueFvPatchField<Type>&,
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&,
+            const fvPatchFieldMapper&
+        );
+
+        //- Construct as copy
+        directMappedFixedPushedInternalValueFvPatchField
+        (
+            const directMappedFixedPushedInternalValueFvPatchField<Type>&
+        );
+
+        //- Construct and return a clone
+        virtual tmp<fvPatchField<Type> > clone() const
+        {
+            return tmp<fvPatchField<Type> >
+            (
+                new directMappedFixedPushedInternalValueFvPatchField<Type>
+                (
+                    *this
+                )
+            );
+        }
+
+        //- Construct as copy setting internal field reference
+        directMappedFixedPushedInternalValueFvPatchField
+        (
+            const directMappedFixedPushedInternalValueFvPatchField<Type>&,
+            const DimensionedField<Type, volMesh>&
+        );
+
+        //- Construct and return a clone setting internal field reference
+        virtual tmp<fvPatchField<Type> > clone
+        (
+            const DimensionedField<Type, volMesh>& iF
+        ) const
+        {
+            return tmp<fvPatchField<Type> >
+            (
+                new directMappedFixedPushedInternalValueFvPatchField<Type>
+                (
+                    *this,
+                    iF
+                )
+            );
+        }
+
+
+    // Member functions
+
+        // Evaluation functions
+
+            //- Update the coefficients associated with the patch field
+            virtual void updateCoeffs();
+
+        //- Write
+        virtual void write(Ostream&) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#   include "directMappedFixedPushedInternalValueFvPatchField.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedPushedInternalValue/directMappedFixedPushedInternalValueFvPatchFields.C b/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedPushedInternalValue/directMappedFixedPushedInternalValueFvPatchFields.C
new file mode 100644
index 0000000000000000000000000000000000000000..ba56536a60c233fa1ab2403900f24e595f7de80a
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedPushedInternalValue/directMappedFixedPushedInternalValueFvPatchFields.C
@@ -0,0 +1,44 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "directMappedFixedPushedInternalValueFvPatchFields.H"
+#include "volMesh.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+makePatchFields(directMappedFixedPushedInternalValue);
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedPushedInternalValue/directMappedFixedPushedInternalValueFvPatchFields.H b/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedPushedInternalValue/directMappedFixedPushedInternalValueFvPatchFields.H
new file mode 100644
index 0000000000000000000000000000000000000000..e333000ed0f80c39fe0024074e2554c9ee546c4c
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedPushedInternalValue/directMappedFixedPushedInternalValueFvPatchFields.H
@@ -0,0 +1,50 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef directMappedFixedPushedInternalValueFvPatchFields_H
+#define directMappedFixedPushedInternalValueFvPatchFields_H
+
+#include "directMappedFixedPushedInternalValueFvPatchField.H"
+#include "fieldTypes.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+makePatchTypeFieldTypedefs(directMappedFixedPushedInternalValue)
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedPushedInternalValue/directMappedFixedPushedInternalValueFvPatchFieldsFwd.H b/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedPushedInternalValue/directMappedFixedPushedInternalValueFvPatchFieldsFwd.H
new file mode 100644
index 0000000000000000000000000000000000000000..9c1e26a315d7f9e0c07b9ec833c2e28dbd989011
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/directMappedFixedPushedInternalValue/directMappedFixedPushedInternalValueFvPatchFieldsFwd.H
@@ -0,0 +1,51 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef directMappedFixedPushedInternalValueFvPatchFieldsFwd_H
+#define directMappedFixedPushedInternalValueFvPatchFieldsFwd_H
+
+#include "fieldTypes.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+template<class Type> class directMappedFixedPushedInternalValueFvPatchField;
+
+makePatchTypeFieldTypedefs(directMappedFixedInternalValue)
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/directMappedNamedFixedValue/directMappedNamedFixedValueFvPatchField.C b/src/regionModels/regionModel/derivedFvPatchFields/directMappedNamedFixedValue/directMappedNamedFixedValueFvPatchField.C
new file mode 100644
index 0000000000000000000000000000000000000000..edbd419b83a0cb5c94789810099bc1cea67c4c5f
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/directMappedNamedFixedValue/directMappedNamedFixedValueFvPatchField.C
@@ -0,0 +1,336 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "directMappedNamedFixedValueFvPatchField.H"
+#include "directMappedPatchBase.H"
+#include "mapDistribute.H"
+#include "volFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+template<class Type>
+directMappedNamedFixedValueFvPatchField<Type>::
+directMappedNamedFixedValueFvPatchField
+(
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF
+)
+:
+    fixedValueFvPatchField<Type>(p, iF),
+    fieldName_(iF.name()),
+    setAverage_(false),
+    average_(pTraits<Type>::zero)
+{}
+
+
+template<class Type>
+directMappedNamedFixedValueFvPatchField<Type>::
+directMappedNamedFixedValueFvPatchField
+(
+    const directMappedNamedFixedValueFvPatchField<Type>& ptf,
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF,
+    const fvPatchFieldMapper& mapper
+)
+:
+    fixedValueFvPatchField<Type>(ptf, p, iF, mapper),
+    fieldName_(ptf.fieldName_),
+    setAverage_(ptf.setAverage_),
+    average_(ptf.average_)
+{
+    if (!isA<directMappedPatchBase>(this->patch().patch()))
+    {
+        FatalErrorIn
+        (
+            "directMappedNamedFixedValueFvPatchField<Type>::"
+            "directMappedNamedFixedValueFvPatchField\n"
+            "(\n"
+            "    const directMappedNamedFixedValueFvPatchField<Type>&,\n"
+            "    const fvPatch&,\n"
+            "    const Field<Type>&,\n"
+            "    const fvPatchFieldMapper&\n"
+            ")\n"
+        )   << "\n    patch type '" << p.type()
+            << "' not type '" << directMappedPatchBase::typeName << "'"
+            << "\n    for patch " << p.name()
+            << " of field " << this->dimensionedInternalField().name()
+            << " in file " << this->dimensionedInternalField().objectPath()
+            << exit(FatalError);
+    }
+}
+
+
+template<class Type>
+directMappedNamedFixedValueFvPatchField<Type>::
+directMappedNamedFixedValueFvPatchField
+(
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF,
+    const dictionary& dict
+)
+:
+    fixedValueFvPatchField<Type>(p, iF, dict),
+    fieldName_(dict.lookupOrDefault<word>("fieldName", iF.name())),
+    setAverage_(readBool(dict.lookup("setAverage"))),
+    average_(pTraits<Type>(dict.lookup("average")))
+{
+    if (!isA<directMappedPatchBase>(this->patch().patch()))
+    {
+        FatalErrorIn
+        (
+            "directMappedNamedFixedValueFvPatchField<Type>::"
+            "directMappedNamedFixedValueFvPatchField"
+            "("
+            "    const fvPatch&, "
+            "    const DimensionedField<Type, volMesh>& iF, "
+            "    const dictionary&"
+            ")"
+        )   << "\n    patch type '" << p.type()
+            << "' not type '" << directMappedPatchBase::typeName << "'"
+            << "\n    for patch " << p.name()
+            << " of field " << fieldName_
+            << " in file " << this->dimensionedInternalField().objectPath()
+            << exit(FatalError);
+    }
+
+    //// Force calculation of schedule (uses parallel comms)
+    //const directMappedPatchBase& mpp = refCast<const directMappedPatchBase>
+    //(
+    //    this->patch().patch()
+    //);
+    //(void)mpp.map().schedule();
+}
+
+
+template<class Type>
+directMappedNamedFixedValueFvPatchField<Type>::
+directMappedNamedFixedValueFvPatchField
+(
+    const directMappedNamedFixedValueFvPatchField<Type>& ptf
+)
+:
+    fixedValueFvPatchField<Type>(ptf),
+    fieldName_(ptf.fieldName_),
+    setAverage_(ptf.setAverage_),
+    average_(ptf.average_)
+{}
+
+
+template<class Type>
+directMappedNamedFixedValueFvPatchField<Type>::
+directMappedNamedFixedValueFvPatchField
+(
+    const directMappedNamedFixedValueFvPatchField<Type>& ptf,
+    const DimensionedField<Type, volMesh>& iF
+)
+:
+    fixedValueFvPatchField<Type>(ptf, iF),
+    fieldName_(ptf.fieldName_),
+    setAverage_(ptf.setAverage_),
+    average_(ptf.average_)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class Type>
+void directMappedNamedFixedValueFvPatchField<Type>::updateCoeffs()
+{
+    if (this->updated())
+    {
+        return;
+    }
+
+    typedef GeometricField<Type, fvPatchField, volMesh> fieldType;
+
+    // Get the scheduling information from the directMappedPatchBase
+    const directMappedPatchBase& mpp = refCast<const directMappedPatchBase>
+    (
+        directMappedNamedFixedValueFvPatchField<Type>::patch().patch()
+    );
+    const mapDistribute& distMap = mpp.map();
+
+    // Force recalculation of schedule
+    (void)distMap.schedule();
+
+    const fvMesh& nbrMesh = refCast<const fvMesh>(mpp.sampleMesh());
+
+    // Result of obtaining remote values
+    Field<Type> newValues;
+
+    switch (mpp.mode())
+    {
+        case directMappedPatchBase::NEARESTCELL:
+        {
+            if (mpp.sameRegion())
+            {
+                newValues = this->internalField();
+            }
+            else
+            {
+                newValues = nbrMesh.lookupObject<fieldType>
+                (
+                    fieldName_
+                ).internalField();
+            }
+            mapDistribute::distribute
+            (
+                Pstream::defaultCommsType,
+                distMap.schedule(),
+                distMap.constructSize(),
+                distMap.subMap(),
+                distMap.constructMap(),
+                newValues
+            );
+
+            break;
+        }
+        case directMappedPatchBase::NEARESTPATCHFACE:
+        {
+            const label nbrPatchID =
+                nbrMesh.boundaryMesh().findPatchID(mpp.samplePatch());
+            if (nbrPatchID < 0)
+            {
+                FatalErrorIn
+                (
+                    "void directMappedNamedFixedValueFvPatchField<Type>::"
+                    "updateCoeffs()"
+                )<< "Unable to find sample patch " << mpp.samplePatch()
+                 << " in region " << mpp.sampleRegion()
+                 << " for patch " << this->patch().name() << nl
+                 << abort(FatalError);
+            }
+
+            const fieldType& nbrField =
+                nbrMesh.lookupObject<fieldType>(fieldName_);
+            newValues = nbrField.boundaryField()[nbrPatchID];
+            mapDistribute::distribute
+            (
+                Pstream::defaultCommsType,
+                distMap.schedule(),
+                distMap.constructSize(),
+                distMap.subMap(),
+                distMap.constructMap(),
+                newValues
+            );
+
+            break;
+        }
+        case directMappedPatchBase::NEARESTFACE:
+        {
+            Field<Type> allValues(nbrMesh.nFaces(), pTraits<Type>::zero);
+
+            const fieldType& nbrField =
+                nbrMesh.lookupObject<fieldType>(fieldName_);
+            forAll(nbrField.boundaryField(), patchI)
+            {
+                const fvPatchField<Type>& pf =
+                    nbrField.boundaryField()[patchI];
+                label faceStart = pf.patch().patch().start();
+
+                forAll(pf, faceI)
+                {
+                    allValues[faceStart++] = pf[faceI];
+                }
+            }
+
+            mapDistribute::distribute
+            (
+                Pstream::defaultCommsType,
+                distMap.schedule(),
+                distMap.constructSize(),
+                distMap.subMap(),
+                distMap.constructMap(),
+                allValues
+            );
+
+            newValues = this->patch().patchSlice(allValues);
+
+            break;
+        }
+        default:
+        {
+            FatalErrorIn
+            (
+                "directMappedNamedFixedValueFvPatchField<Type>::updateCoeffs()"
+            )<< "Unknown sampling mode: " << mpp.mode()
+             << nl << abort(FatalError);
+        }
+    }
+
+    if (setAverage_)
+    {
+        Type averagePsi =
+            gSum(this->patch().magSf()*newValues)
+           /gSum(this->patch().magSf());
+
+        if (mag(averagePsi)/mag(average_) > 0.5)
+        {
+            newValues *= mag(average_)/mag(averagePsi);
+        }
+        else
+        {
+            newValues += (average_ - averagePsi);
+        }
+    }
+
+    this->operator==(newValues);
+
+    if (debug)
+    {
+        Info<< "directMapped on field:" << fieldName_
+            << " patch:" << this->patch().name()
+            << "  avg:" << gAverage(*this)
+            << "  min:" << gMin(*this)
+            << "  max:" << gMax(*this)
+            << endl;
+    }
+
+    fixedValueFvPatchField<Type>::updateCoeffs();
+}
+
+
+template<class Type>
+void directMappedNamedFixedValueFvPatchField<Type>::write(Ostream& os) const
+{
+    fvPatchField<Type>::write(os);
+    os.writeKeyword("fieldName") << fieldName_ << token::END_STATEMENT << nl;
+    os.writeKeyword("setAverage") << setAverage_ << token::END_STATEMENT << nl;
+    os.writeKeyword("average") << average_ << token::END_STATEMENT << nl;
+    this->writeEntry("value", os);
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/directMappedNamedFixedValue/directMappedNamedFixedValueFvPatchField.H b/src/regionModels/regionModel/derivedFvPatchFields/directMappedNamedFixedValue/directMappedNamedFixedValueFvPatchField.H
new file mode 100644
index 0000000000000000000000000000000000000000..248c6690ffa5f79d85339049eb08a0ed3874dbe0
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/directMappedNamedFixedValue/directMappedNamedFixedValueFvPatchField.H
@@ -0,0 +1,165 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::directMappedNamedFixedValueFvPatchField
+
+Description
+    Variant of directMappedFixedValueFvPatch where the name of the field to
+    map is input.
+
+SourceFiles
+    directMappedNamedFixedValueFvPatchField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef directMappedNamedFixedValueFvPatchField_H
+#define directMappedNamedFixedValueFvPatchField_H
+
+#include "fixedValueFvPatchField.H"
+#include "directMappedFvPatch.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+          Class directMappedNamesFixedValueFvPatchField Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class Type>
+class directMappedNamedFixedValueFvPatchField
+:
+    public fixedValueFvPatchField<Type>
+{
+    // Private data
+
+        //- Name of field to sample - defaults to field associated with this
+        //  patch if not specified
+        word fieldName_;
+
+        //- If true adjust the mapped field to maintain average value average_
+        bool setAverage_;
+
+        //- Average value the mapped field is adjusted to maintain if
+        //  setAverage_ is set true
+        Type average_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("directMappedNamedFixedValue");
+
+
+    // Constructors
+
+        //- Construct from patch and internal field
+        directMappedNamedFixedValueFvPatchField
+        (
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&
+        );
+
+        //- Construct from patch, internal field and dictionary
+        directMappedNamedFixedValueFvPatchField
+        (
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&,
+            const dictionary&
+        );
+
+        //- Construct by mapping given directMappedNamedFixedValueFvPatchField
+        //  onto a new patch
+        directMappedNamedFixedValueFvPatchField
+        (
+            const directMappedNamedFixedValueFvPatchField<Type>&,
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&,
+            const fvPatchFieldMapper&
+        );
+
+        //- Construct as copy
+        directMappedNamedFixedValueFvPatchField
+        (
+            const directMappedNamedFixedValueFvPatchField<Type>&
+        );
+
+        //- Construct and return a clone
+        virtual tmp<fvPatchField<Type> > clone() const
+        {
+            return tmp<fvPatchField<Type> >
+            (
+                new directMappedNamedFixedValueFvPatchField<Type>(*this)
+            );
+        }
+
+        //- Construct as copy setting internal field reference
+        directMappedNamedFixedValueFvPatchField
+        (
+            const directMappedNamedFixedValueFvPatchField<Type>&,
+            const DimensionedField<Type, volMesh>&
+        );
+
+        //- Construct and return a clone setting internal field reference
+        virtual tmp<fvPatchField<Type> > clone
+        (
+            const DimensionedField<Type, volMesh>& iF
+        ) const
+        {
+            return tmp<fvPatchField<Type> >
+            (
+                new directMappedNamedFixedValueFvPatchField<Type>(*this, iF)
+            );
+        }
+
+
+    // Member functions
+
+        // Evaluation functions
+
+            //- Update the coefficients associated with the patch field
+            virtual void updateCoeffs();
+
+        //- Write
+        virtual void write(Ostream&) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#   include "directMappedNamedFixedValueFvPatchField.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/directMappedNamedFixedValue/directMappedNamedFixedValueFvPatchFields.C b/src/regionModels/regionModel/derivedFvPatchFields/directMappedNamedFixedValue/directMappedNamedFixedValueFvPatchFields.C
new file mode 100644
index 0000000000000000000000000000000000000000..5725af6d74a10c3a5a05392632c8a01045b559f9
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/directMappedNamedFixedValue/directMappedNamedFixedValueFvPatchFields.C
@@ -0,0 +1,44 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "directMappedNamedFixedValueFvPatchFields.H"
+#include "volMesh.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+makePatchFields(directMappedNamedFixedValue);
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/directMappedNamedFixedValue/directMappedNamedFixedValueFvPatchFields.H b/src/regionModels/regionModel/derivedFvPatchFields/directMappedNamedFixedValue/directMappedNamedFixedValueFvPatchFields.H
new file mode 100644
index 0000000000000000000000000000000000000000..cd61e50493f495de7fb343e954741c87ba7cdf00
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/directMappedNamedFixedValue/directMappedNamedFixedValueFvPatchFields.H
@@ -0,0 +1,50 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef directMappedNamedFixedValueFvPatchFields_H
+#define directMappedNamedFixedValueFvPatchFields_H
+
+#include "directMappedNamedFixedValueFvPatchField.H"
+#include "fieldTypes.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+makePatchTypeFieldTypedefs(directMappedNamedFixedValue)
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/directMappedNamedFixedValue/directMappedNamedFixedValueFvPatchFieldsFwd.H b/src/regionModels/regionModel/derivedFvPatchFields/directMappedNamedFixedValue/directMappedNamedFixedValueFvPatchFieldsFwd.H
new file mode 100644
index 0000000000000000000000000000000000000000..75e3046e2451c83a13be7249b83a63ada9c22cb5
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/directMappedNamedFixedValue/directMappedNamedFixedValueFvPatchFieldsFwd.H
@@ -0,0 +1,51 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef directMappedNamedFixedValueFvPatchFieldsFwd_H
+#define directMappedNamedFixedValueFvPatchFieldsFwd_H
+
+#include "fieldTypes.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+template<class Type> class directMappedNamedFixedValueFvPatchField;
+
+makePatchTypeFieldTypedefs(directMappedNamedFixedValue)
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/directMappedNamedFixedValue/directMappedNamesFixedValueFvPatchFieldsFwd.H b/src/regionModels/regionModel/derivedFvPatchFields/directMappedNamedFixedValue/directMappedNamesFixedValueFvPatchFieldsFwd.H
new file mode 100644
index 0000000000000000000000000000000000000000..75e3046e2451c83a13be7249b83a63ada9c22cb5
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/directMappedNamedFixedValue/directMappedNamesFixedValueFvPatchFieldsFwd.H
@@ -0,0 +1,51 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef directMappedNamedFixedValueFvPatchFieldsFwd_H
+#define directMappedNamedFixedValueFvPatchFieldsFwd_H
+
+#include "fieldTypes.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+template<class Type> class directMappedNamedFixedValueFvPatchField;
+
+makePatchTypeFieldTypedefs(directMappedNamedFixedValue)
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/filmMappedFixedInternalValue/regionMappedFixedInternalValueFvPatchField.C b/src/regionModels/regionModel/derivedFvPatchFields/filmMappedFixedInternalValue/regionMappedFixedInternalValueFvPatchField.C
new file mode 100644
index 0000000000000000000000000000000000000000..733e1568620e2dd70729fedd91c5d60ead2c3d4b
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/filmMappedFixedInternalValue/regionMappedFixedInternalValueFvPatchField.C
@@ -0,0 +1,170 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "regionMappedFixedInternalValueFvPatchField.H"
+#include "UIndirectList.H"
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+template<class Type>
+Foam::regionMappedFixedInternalValueFvPatchField<Type>::
+regionMappedFixedInternalValueFvPatchField
+(
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF
+)
+:
+    fixedValueFvPatchField<Type>(p, iF)
+{}
+
+
+template<class Type>
+Foam::regionMappedFixedInternalValueFvPatchField<Type>::
+regionMappedFixedInternalValueFvPatchField
+(
+    const regionMappedFixedInternalValueFvPatchField<Type>& ptf,
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF,
+    const fvPatchFieldMapper& mapper
+)
+:
+    fixedValueFvPatchField<Type>(ptf, p, iF, mapper)
+{}
+
+
+template<class Type>
+Foam::regionMappedFixedInternalValueFvPatchField<Type>::
+regionMappedFixedInternalValueFvPatchField
+(
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF,
+    const dictionary& dict
+)
+:
+    fixedValueFvPatchField<Type>(p, iF, dict)
+{}
+
+
+template<class Type>
+Foam::regionMappedFixedInternalValueFvPatchField<Type>::
+regionMappedFixedInternalValueFvPatchField
+(
+    const regionMappedFixedInternalValueFvPatchField<Type>& ptf
+)
+:
+    fixedValueFvPatchField<Type>(ptf)
+{}
+
+
+template<class Type>
+Foam::regionMappedFixedInternalValueFvPatchField<Type>::
+regionMappedFixedInternalValueFvPatchField
+(
+    const regionMappedFixedInternalValueFvPatchField<Type>& ptf,
+    const DimensionedField<Type, volMesh>& iF
+)
+:
+    fixedValueFvPatchField<Type>(ptf, iF)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class Type>
+void Foam::regionMappedFixedInternalValueFvPatchField<Type>::updateCoeffs()
+{
+    typedef GeometricField<Type, fvPatchField, volMesh> FieldType;
+
+    if (this->updated())
+    {
+        return;
+    }
+
+    const regionModels::regionModel& region =
+        this->db.lookupObject<regionModels::regionModel>
+        (
+            "surfaceFilmProperties"
+        );
+
+    const label regionPatchI = region.regionPatchID(this->patch().index())
+    const directMappedPatchBase& mpp = region.mappedPatches()[patchI];
+
+    // Force recalculation of mapping and schedule
+    const mapDistribute& distMap = mpp.map();
+
+    const polyMesh& nbrMesh = mpp.sampleMesh();
+    const label samplePatchI = mpp.samplePolyPatch().index();
+    const fvPatch& nbrPatch =
+        refCast<const fvMesh>(nbrMesh).boundary()[samplePatchI];
+
+
+    // Retrieve the neighbour field
+    Field<Type> nbrField =
+        nbrPatch.lookupPatchField<FieldType, Type>(fieldName_);
+
+    mapDistribute::distribute
+    (
+        Pstream::defaultCommsType,
+        distMap.schedule(),
+        distMap.constructSize(),
+        distMap.subMap(),           // what to send
+        distMap.constructMap(),     // what to receive
+        nbrField
+    );
+
+    this->operator==(nbrField);
+
+    // Retrieve the neighbour patch internal field
+    Field<Type> nbrIntField = nbrField.patchInternalField();
+    mapDistribute::distribute
+    (
+        Pstream::defaultCommsType,
+        distMap.schedule(),
+        distMap.constructSize(),
+        distMap.subMap(),           // what to send
+        distMap.constructMap(),     // what to receive
+        nbrIntField
+    );
+
+    // Assign (this) patch internal field to its neighbour values
+    Field<Type>& intField = const_cast<Field<Type>&>(this->internalField());
+    UIndirectList<Type>(intFld, this->patch().faceCells()) = nbrIntField;
+
+    fixedValueFvPatchField<Type>::updateCoeffs();
+}
+
+
+template<class Type>
+void Foam::regionMappedFixedInternalValueFvPatchField<Type>::write
+(
+    Ostream& os
+) const
+{
+    fixedValueFvPatchField<Type>::write(os);
+}
+
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/filmMappedFixedInternalValue/regionMappedFixedInternalValueFvPatchField.H b/src/regionModels/regionModel/derivedFvPatchFields/filmMappedFixedInternalValue/regionMappedFixedInternalValueFvPatchField.H
new file mode 100644
index 0000000000000000000000000000000000000000..b9d149f88d72ebd320936461df4daca98a48e8c0
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/filmMappedFixedInternalValue/regionMappedFixedInternalValueFvPatchField.H
@@ -0,0 +1,162 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::regionMappedFixedInternalValueFvPatchField
+
+Description
+    Recycles the boundary and internal values of a neighbour patch field to
+    the boundary and internal values of *this.
+
+SourceFiles
+    regionMappedFixedInternalValueFvPatchField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef regionMappedFixedInternalValueFvPatchField_H
+#define regionMappedFixedInternalValueFvPatchField_H
+
+#include "fixedValueFvPatchFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+         Class regionMappedFixedInternalValueFvPatchField Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class Type>
+class regionMappedFixedInternalValueFvPatchField
+:
+    public fixedValueFvPatchField<Type>
+{
+
+protected:
+
+    // Protected Data
+
+        //- Name of communicating region
+        word regionName_;
+
+        //- Name of communicating field
+        word fieldName_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("directMappedFixedInternalValue");
+
+
+    // Constructors
+
+        //- Construct from patch and internal field
+        regionMappedFixedInternalValueFvPatchField
+        (
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&
+        );
+
+        //- Construct from patch, internal field and dictionary
+        regionMappedFixedInternalValueFvPatchField
+        (
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&,
+            const dictionary&
+        );
+
+        //- Construct by mapping given
+        // regionMappedFixedInternalValueFvPatchField  onto a new patch
+        regionMappedFixedInternalValueFvPatchField
+        (
+            const regionMappedFixedInternalValueFvPatchField<Type>&,
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&,
+            const fvPatchFieldMapper&
+        );
+
+        //- Construct as copy
+        regionMappedFixedInternalValueFvPatchField
+        (
+            const regionMappedFixedInternalValueFvPatchField<Type>&
+        );
+
+        //- Construct and return a clone
+        virtual tmp<fvPatchField<Type> > clone() const
+        {
+            return tmp<fvPatchField<Type> >
+            (
+                new regionMappedFixedInternalValueFvPatchField<Type>(*this)
+            );
+        }
+
+        //- Construct as copy setting internal field reference
+        regionMappedFixedInternalValueFvPatchField
+        (
+            const regionMappedFixedInternalValueFvPatchField<Type>&,
+            const DimensionedField<Type, volMesh>&
+        );
+
+        //- Construct and return a clone setting internal field reference
+        virtual tmp<fvPatchField<Type> > clone
+        (
+            const DimensionedField<Type, volMesh>& iF
+        ) const
+        {
+            return tmp<fvPatchField<Type> >
+            (
+                new regionMappedFixedInternalValueFvPatchField<Type>(*this, iF)
+            );
+        }
+
+
+    // Member functions
+
+        // Evaluation functions
+
+            //- Update the coefficients associated with the patch field
+            virtual void updateCoeffs();
+
+        //- Write
+        virtual void write(Ostream&) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#   include "regionMappedFixedInternalValueFvPatchField.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/filmMappedFixedInternalValue/regionMappedFixedInternalValueFvPatchFields.C b/src/regionModels/regionModel/derivedFvPatchFields/filmMappedFixedInternalValue/regionMappedFixedInternalValueFvPatchFields.C
new file mode 100644
index 0000000000000000000000000000000000000000..b4d84e85e5427753da7916f3fe93bb57ec64e52c
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/filmMappedFixedInternalValue/regionMappedFixedInternalValueFvPatchFields.C
@@ -0,0 +1,44 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "regionMappedFixedInternalValueFvPatchFields.H"
+#include "volMesh.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+makePatchFields(directMappedFixedInternalValue);
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/filmMappedFixedInternalValue/regionMappedFixedInternalValueFvPatchFields.H b/src/regionModels/regionModel/derivedFvPatchFields/filmMappedFixedInternalValue/regionMappedFixedInternalValueFvPatchFields.H
new file mode 100644
index 0000000000000000000000000000000000000000..e19b9722e8ce0947dee2aedc06999adf43d35da8
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/filmMappedFixedInternalValue/regionMappedFixedInternalValueFvPatchFields.H
@@ -0,0 +1,50 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef regionMappedFixedInternalValueFvPatchFields_H
+#define regionMappedFixedInternalValueFvPatchFields_H
+
+#include "regionMappedFixedInternalValueFvPatchField.H"
+#include "fieldTypes.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+makePatchTypeFieldTypedefs(directMappedFixedInternalValue)
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/derivedFvPatchFields/filmMappedFixedInternalValue/regionMappedFixedInternalValueFvPatchFieldsFwd.H b/src/regionModels/regionModel/derivedFvPatchFields/filmMappedFixedInternalValue/regionMappedFixedInternalValueFvPatchFieldsFwd.H
new file mode 100644
index 0000000000000000000000000000000000000000..ce18b9e1585edcf46e602b9155186929c49a5408
--- /dev/null
+++ b/src/regionModels/regionModel/derivedFvPatchFields/filmMappedFixedInternalValue/regionMappedFixedInternalValueFvPatchFieldsFwd.H
@@ -0,0 +1,51 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef regionMappedFixedInternalValueFvPatchFieldsFwd_H
+#define regionMappedFixedInternalValueFvPatchFieldsFwd_H
+
+#include "fieldTypes.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+template<class Type> class regionMappedFixedInternalValueFvPatchField;
+
+makePatchTypeFieldTypedefs(directMappedFixedInternalValue)
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/regionModel/regionModel.C b/src/regionModels/regionModel/regionModel/regionModel.C
new file mode 100644
index 0000000000000000000000000000000000000000..8a62195de398783aecc2cb5fcaed2fc06a36538c
--- /dev/null
+++ b/src/regionModels/regionModel/regionModel/regionModel.C
@@ -0,0 +1,283 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "regionModel.H"
+#include "fvMesh.H"
+#include "Time.H"
+#include "directMappedWallPolyPatch.H"
+#include "zeroGradientFvPatchFields.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+    defineTypeNameAndDebug(regionModel, 0);
+}
+}
+
+// * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * * //
+
+void Foam::regionModels::regionModel::constructMeshObjects()
+{
+    // construct region mesh
+    regionMeshPtr_.reset
+    (
+        new fvMesh
+        (
+            IOobject
+            (
+                lookup("regionName"),
+                time_.timeName(),
+                time_,
+                IOobject::MUST_READ
+            )
+        )
+    );
+}
+
+
+void Foam::regionModels::regionModel::initialise()
+{
+    if (debug)
+    {
+        Pout<< "regionModel::initialise()" << endl;
+    }
+
+    label nBoundaryFaces = 0;
+    DynamicList<label> primaryPatchIDs;
+    DynamicList<label> intCoupledPatchIDs;
+    const polyBoundaryMesh& rbm = regionMesh().boundaryMesh();
+    const polyBoundaryMesh& pbm = primaryMesh().boundaryMesh();
+    mappedPatches_.setSize(rbm.size());
+
+    forAll(rbm, patchI)
+    {
+        const polyPatch& regionPatch = rbm[patchI];
+        if (isA<directMappedWallPolyPatch>(regionPatch))
+        {
+            if (debug)
+            {
+                Pout<< "found " << directMappedWallPolyPatch::typeName
+                    <<  " " << regionPatch.name() << endl;
+            }
+
+            intCoupledPatchIDs.append(patchI);
+
+            nBoundaryFaces += regionPatch.faceCells().size();
+
+            const directMappedWallPolyPatch& dmp =
+                refCast<const directMappedWallPolyPatch>(regionPatch);
+
+            const label primaryPatchI = dmp.samplePolyPatch().index();
+            primaryPatchIDs.append(primaryPatchI);
+
+            mappedPatches_.set
+            (
+                patchI,
+                new directMappedPatchBase
+                (
+                    pbm[primaryPatchI],
+                    regionMesh().name(),
+                    directMappedPatchBase::NEARESTPATCHFACE,
+                    regionPatch.name(),
+                    vector::zero
+                )
+            );
+        }
+    }
+
+    primaryPatchIDs_.transfer(primaryPatchIDs);
+    intCoupledPatchIDs_.transfer(intCoupledPatchIDs);
+//    mappedPatches_.resize(nCoupledPatches);
+
+    if (nBoundaryFaces == 0)
+    {
+        WarningIn("regionModel::initialise()")
+            << "Region model being applied without direct mapped boundary "
+            << "conditions" << endl;
+    }
+}
+
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+bool Foam::regionModels::regionModel::read()
+{
+    if (regIOobject::read())
+    {
+        if (active_)
+        {
+            if (const dictionary* dictPtr = subDictPtr(modelName_ + "Coeffs"))
+            {
+                coeffs_ <<= *dictPtr;
+            }
+
+            infoOutput_.readIfPresent("infoOutput", *this);
+        }
+
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::regionModels::regionModel::regionModel(const fvMesh& mesh)
+:
+    IOdictionary
+    (
+        IOobject
+        (
+            "regionModelProperties",
+            mesh.time().constant(),
+            mesh,
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        )
+    ),
+    primaryMesh_(mesh),
+    time_(mesh.time()),
+    active_(false),
+    infoOutput_(false),
+    modelName_("none"),
+    regionMeshPtr_(NULL),
+    coeffs_(dictionary::null),
+    primaryPatchIDs_(),
+    intCoupledPatchIDs_(),
+    mappedPatches_()
+{}
+
+
+Foam::regionModels::regionModel::regionModel
+(
+    const fvMesh& mesh,
+    const word& regionType,
+    const word& modelName,
+    bool readFields
+)
+:
+    IOdictionary
+    (
+        IOobject
+        (
+            regionType + "Properties",
+            mesh.time().constant(),
+            mesh,
+            IOobject::MUST_READ,
+            IOobject::NO_WRITE
+        )
+    ),
+    primaryMesh_(mesh),
+    time_(mesh.time()),
+    active_(lookup("active")),
+    infoOutput_(true),
+    modelName_(modelName),
+    regionMeshPtr_(NULL),
+    coeffs_(subOrEmptyDict(modelName + "Coeffs")),
+    primaryPatchIDs_(),
+    intCoupledPatchIDs_(),
+    mappedPatches_()
+{
+    if (active_)
+    {
+        constructMeshObjects();
+        initialise();
+
+        if (readFields)
+        {
+            read();
+        }
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::regionModels::regionModel::~regionModel()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+void Foam::regionModels::regionModel::preEvolveRegion()
+{
+    // do nothing
+}
+
+
+void Foam::regionModels::regionModel::evolveRegion()
+{
+    // do nothing
+}
+
+
+void Foam::regionModels::regionModel::evolve()
+{
+    if (active_)
+    {
+        if (primaryMesh_.changing())
+        {
+            FatalErrorIn("regionModel::evolve()")
+                << "Currently not possible to apply " << modelName_
+                << " model to moving mesh cases" << nl << abort(FatalError);
+        }
+
+        Info<< "\nEvolving " << modelName_ << " for region "
+            << regionMesh().name() << endl;
+
+        // Update any input information
+        read();
+
+        // Pre-evolve
+        preEvolveRegion();
+
+        // Increment the region equations up to the new time level
+        evolveRegion();
+
+        // Provide some feedback
+        if (infoOutput_)
+        {
+            Info<< incrIndent;
+            info();
+            Info<< endl << decrIndent;
+        }
+    }
+}
+
+
+void Foam::regionModels::regionModel::info() const
+{
+    // do nothing
+}
+
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/regionModel/regionModel.H b/src/regionModels/regionModel/regionModel/regionModel.H
new file mode 100644
index 0000000000000000000000000000000000000000..12831e16cac81cc5339910801efd82bf48876f77
--- /dev/null
+++ b/src/regionModels/regionModel/regionModel/regionModel.H
@@ -0,0 +1,236 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::regionModel
+
+Description
+    Base class for region models
+
+SourceFiles
+    regionModelI.H
+    regionModel.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef regionModel_H
+#define regionModel_H
+
+#include "IOdictionary.H"
+#include "Switch.H"
+#include "labelList.H"
+#include "volFields.H"
+#include "directMappedPatchBase.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// Forward declaration of classes
+//class fvMesh;
+//class Time;
+
+namespace regionModels
+{
+
+/*---------------------------------------------------------------------------*\
+                       Class regionModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class regionModel
+:
+    public IOdictionary
+{
+
+private:
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        regionModel(const regionModel&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const regionModel&);
+
+        //- Construct region mesh and fields
+        void constructMeshObjects();
+
+        //- Initialise the region
+        void initialise();
+
+
+protected:
+
+    // Protected data
+
+        //- Reference to the primary mesh database
+        const fvMesh& primaryMesh_;
+
+        //- Reference to the time database
+        const Time& time_;
+
+        //- Active flag
+        Switch active_;
+
+        //- Active information output
+        Switch infoOutput_;
+
+        //- Model name
+        const word modelName_;
+
+        //- Pointer to the region mesh database
+        autoPtr<fvMesh> regionMeshPtr_;
+
+        //- Model coefficients dictionary
+        dictionary coeffs_;
+
+
+        // Addressing
+
+            //- List of patch IDs on the primary region coupled to this region
+            labelList primaryPatchIDs_;
+
+            //- List of patch IDs internally coupled with the primary region
+            labelList intCoupledPatchIDs_;
+
+            //- List of patch map info
+            PtrList<directMappedPatchBase> mappedPatches_;
+
+
+    // Protected member functions
+
+        //- Read control parameters from dictionary
+        virtual bool read();
+
+
+public:
+
+    //- Runtime type information
+    TypeName("regionModel");
+
+
+    // Constructors
+
+        //- Construct null
+        regionModel(const fvMesh& mesh);
+
+        //- Construct from mesh, region type and name
+        regionModel
+        (
+            const fvMesh& mesh,
+            const word& regionType,
+            const word& modelName,
+            bool readFields = true
+        );
+
+
+    //- Destructor
+    virtual ~regionModel();
+
+
+    // Member Functions
+
+        // Access
+
+            //- Return the reference to the primary mesh database
+            inline const fvMesh& primaryMesh() const;
+
+            //- Return the reference to the time database
+            inline const Time& time() const;
+
+            //- Return the active flag
+            inline const Switch& active() const;
+
+            //- Return the model name
+            inline const word& modelName() const;
+
+            //- Return the region mesh database
+            inline const fvMesh& regionMesh() const;
+
+            //- Return the region mesh database for manipulation
+            inline fvMesh& regionMesh();
+
+            //- Return the model coefficients dictionary
+            inline const dictionary& coeffs() const;
+
+            //- Return the solution dictionary
+            inline const dictionary& solution() const;
+
+
+            // Addressing
+
+                //- Return true if patchI on the primary region is a coupled
+                //  patch to the local region
+                inline bool isRegionPatch(const label patchI) const;
+
+                //- Return the list of patch IDs on the primary region coupled
+                //  to this region
+                inline const labelList& primaryPatchIDs() const;
+
+                //- Return the list of patch IDs internally coupled with the
+                //  primary region
+                inline const labelList& intCoupledPatchIDs() const;
+
+                //- Return the list of patch map info
+                inline const PtrList<directMappedPatchBase>&
+                    mappedPatches() const;
+
+                //- Return region ID corresponding to primaryPatchID
+                inline label regionPatchID(const label primaryPatchID) const;
+
+
+        // Evolution
+
+            //- Pre-evolve region
+            virtual void preEvolveRegion();
+
+            //- Evolve the region
+            virtual void evolveRegion();
+
+            //- Evolve the film
+            virtual void evolve();
+
+
+        // I-O
+
+            //- Provide some feedback
+            virtual void info() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "regionModelI.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/regionModel/regionModelI.H b/src/regionModels/regionModel/regionModel/regionModelI.H
new file mode 100644
index 0000000000000000000000000000000000000000..f24e77780c44401c0674641c8a3c3007c2d38e83
--- /dev/null
+++ b/src/regionModels/regionModel/regionModel/regionModelI.H
@@ -0,0 +1,154 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "regionModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+inline const Foam::fvMesh&
+Foam::regionModels::regionModel::primaryMesh() const
+{
+    return primaryMesh_;
+}
+
+
+inline const Foam::Time& Foam::regionModels::regionModel::time() const
+{
+    return time_;
+}
+
+
+inline const Foam::Switch& Foam::regionModels::regionModel::active() const
+{
+    return active_;
+}
+
+
+inline const Foam::word& Foam::regionModels::regionModel::modelName() const
+{
+    return modelName_;
+}
+
+
+inline const Foam::fvMesh& Foam::regionModels::regionModel::regionMesh() const
+{
+    if (!regionMeshPtr_.valid())
+    {
+        FatalErrorIn
+        (
+            "inline const Foam::fvMesh&"
+            "Foam::regionModels::regionModel::regionMesh() const"
+        )<< "Region mesh not available" << abort(FatalError);
+    }
+
+    return regionMeshPtr_();
+}
+
+
+inline Foam::fvMesh& Foam::regionModels::regionModel::regionMesh()
+{
+    if (!regionMeshPtr_.valid())
+    {
+        FatalErrorIn
+        (
+            "inline Foam::fvMesh&"
+            "Foam::regionModels::regionModel::regionMesh()"
+        )<< "Region mesh not available" << abort(FatalError);
+    }
+
+    return regionMeshPtr_();
+}
+
+
+inline const Foam::dictionary& Foam::regionModels::regionModel::coeffs() const
+{
+    return coeffs_;
+}
+
+
+inline const Foam::dictionary&
+Foam::regionModels::regionModel::solution() const
+{
+    return regionMesh().solutionDict();
+}
+
+
+inline bool Foam::regionModels::regionModel::isRegionPatch
+(
+    const label patchI
+) const
+{
+    forAll(primaryPatchIDs_, i)
+    {
+        if (primaryPatchIDs_[i] == patchI)
+        {
+            return true;
+        }
+    }
+
+    return false;
+}
+
+
+inline const Foam::labelList&
+Foam::regionModels::regionModel::primaryPatchIDs() const
+{
+    return primaryPatchIDs_;
+}
+
+
+inline const Foam::labelList&
+Foam::regionModels::regionModel::intCoupledPatchIDs() const
+{
+    return intCoupledPatchIDs_;
+}
+
+
+inline const Foam::PtrList<Foam::directMappedPatchBase>&
+Foam::regionModels::regionModel::mappedPatches() const
+{
+    return mappedPatches_;
+}
+
+
+inline Foam::label Foam::regionModels::regionModel::regionPatchID
+(
+    const label primaryPatchID
+) const
+{
+    forAll(primaryPatchIDs_, i)
+    {
+        if (primaryPatchIDs_[i] == primaryPatchID)
+        {
+            return intCoupledPatchIDs_[i];
+        }
+    }
+
+    return -1;
+}
+
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/regionModel1D/regionModel1D.C b/src/regionModels/regionModel/regionModel1D/regionModel1D.C
new file mode 100644
index 0000000000000000000000000000000000000000..205b19b2c77458cda42fe9914a2ffa2a844d424d
--- /dev/null
+++ b/src/regionModels/regionModel/regionModel1D/regionModel1D.C
@@ -0,0 +1,308 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "regionModel1D.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+    defineTypeNameAndDebug(regionModel1D, 0);
+}
+}
+
+// * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * * //
+
+void Foam::regionModels::regionModel1D::constructMeshObjects()
+{
+    const fvMesh& regionMesh = regionMeshPtr_();
+
+    nMagSfPtr_.reset
+    (
+        new surfaceScalarField
+        (
+            IOobject
+            (
+                "nMagSf",
+                time().timeName(),
+                regionMesh,
+                IOobject::NO_READ,
+                IOobject::NO_WRITE
+            ),
+            regionMesh,
+            dimensionedScalar("zero", dimArea, 0.0)
+        )
+    );
+}
+
+
+void Foam::regionModels::regionModel1D::initialise()
+{
+    if (debug)
+    {
+        Pout<< "regionModel1D::initialise()" << endl;
+    }
+
+    // Calculate boundaryFaceFaces and boundaryFaceCells
+
+    DynamicList<label> faceIDs;
+    DynamicList<label> cellIDs;
+
+    label localPyrolysisFaceI = 0;
+
+    const polyBoundaryMesh& rbm = regionMesh().boundaryMesh();
+
+    forAll(intCoupledPatchIDs_, i)
+    {
+        const label patchI = intCoupledPatchIDs_[i];
+        const polyPatch& ppCoupled = rbm[patchI];
+        forAll(ppCoupled, localFaceI)
+        {
+            label faceI = ppCoupled.start() + localFaceI;
+            label cellI = -1;
+            label nFaces = 0;
+            label nCells = 0;
+            do
+            {
+                label ownCellI = regionMesh().faceOwner()[faceI];
+                if (ownCellI != cellI)
+                {
+                    cellI = ownCellI;
+                }
+                else
+                {
+                    cellI = regionMesh().faceNeighbour()[faceI];
+                }
+                nCells++;
+                cellIDs.append(cellI);
+                const cell& cFaces = regionMesh().cells()[cellI];
+                faceI = cFaces.opposingFaceLabel(faceI, regionMesh().faces());
+                faceIDs.append(faceI);
+                nFaces++;
+            } while (regionMesh().isInternalFace(faceI));
+
+            boundaryFaceOppositeFace_[localPyrolysisFaceI] = faceI;
+            faceIDs.remove(); //remove boundary face.
+            nFaces--;
+
+            boundaryFaceFaces_[localPyrolysisFaceI].transfer(faceIDs);
+            boundaryFaceCells_[localPyrolysisFaceI].transfer(cellIDs);
+
+            localPyrolysisFaceI++;
+        }
+    }
+
+    boundaryFaceOppositeFace_.setSize(localPyrolysisFaceI);
+
+    surfaceScalarField& nMagSf = nMagSfPtr_();
+
+    forAll(intCoupledPatchIDs_, i)
+    {
+        const label patchI = intCoupledPatchIDs_[i];
+        const polyPatch& ppCoupled = rbm[patchI];
+        const vectorField& pNormals = ppCoupled.faceNormals();
+        nMagSf.boundaryField()[patchI] =
+            regionMesh().Sf().boundaryField()[patchI] & pNormals;
+        forAll(pNormals, localFaceI)
+        {
+            const vector& n = pNormals[localFaceI];
+            const labelList& faces = boundaryFaceFaces_[localFaceI];
+            forAll (faces, faceI)
+            {
+                const label faceID = faces[faceI];
+                nMagSf[faceID] = regionMesh().Sf()[faceID] & n;
+            }
+        }
+    }
+}
+
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+bool Foam::regionModels::regionModel1D::read()
+{
+    if (regionModel::read())
+    {
+        moveMesh_.readIfPresent("moveMesh", coeffs_);
+
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+
+Foam::tmp<Foam::labelField> Foam::regionModels::regionModel1D::moveMesh
+(
+    const scalarList& deltaV,
+    const scalar minDelta
+)
+{
+    tmp<labelField> tcellMoveMap(new labelField(regionMesh().nCells(), 0));
+    labelField& cellMoveMap = tcellMoveMap();
+
+    if (!moveMesh_)
+    {
+        return cellMoveMap;
+    }
+
+    pointField oldPoints = regionMesh().points();
+    pointField newPoints = oldPoints;
+
+    const polyBoundaryMesh& bm = regionMesh().boundaryMesh();
+
+    forAll(intCoupledPatchIDs_, localPatchI)
+    {
+        label patchI = intCoupledPatchIDs_[localPatchI];
+        const polyPatch pp = bm[patchI];
+        const vectorField& cf = regionMesh().Cf().boundaryField()[patchI];
+
+        forAll(pp, patchFaceI)
+        {
+            const labelList& faces = boundaryFaceFaces_[patchFaceI];
+            const labelList& cells = boundaryFaceCells_[patchFaceI];
+            const vector n = pp.faceNormals()[patchFaceI];
+            const vector sf = pp.faceAreas()[patchFaceI];
+
+            List<point> oldCf(faces.size() + 1);
+            oldCf[0] = cf[patchFaceI];
+            forAll(faces, i)
+            {
+                oldCf[i + 1] = regionMesh().faceCentres()[faces[i]];
+            }
+
+            vector newDelta = vector::zero;
+            point nbrCf = oldCf[0];
+
+            forAll(faces, i)
+            {
+                const label faceI = faces[i];
+                const label cellI = cells[i];
+
+                const face f = regionMesh().faces()[faceI];
+
+                newDelta += (deltaV[cellI]/mag(sf))*n;
+
+                vector localDelta = vector::zero;
+                forAll(f, pti)
+                {
+                    const label pointI = f[pti];
+
+                    if
+                    (
+                        ((nbrCf - (oldPoints[pointI] + newDelta)) & n)
+                      > minDelta
+                    )
+                    {
+                        newPoints[pointI] = oldPoints[pointI] + newDelta;
+                        localDelta = newDelta;
+                        cellMoveMap[cellI] = 1;
+                    }
+                }
+                nbrCf = oldCf[i + 1] + localDelta;
+            }
+
+            // Modify boundary
+            const label bFaceI = boundaryFaceOppositeFace_[patchFaceI];
+            const face f = regionMesh().faces()[bFaceI];
+            const label cellI = cells[cells.size() - 1];
+            newDelta += (deltaV[cellI]/mag(sf))*n;
+            forAll(f, pti)
+            {
+                const label pointI = f[pti];
+
+                if
+                (
+                    ((nbrCf - (oldPoints[pointI] + newDelta)) & n)
+                  > minDelta
+                )
+                {
+                    newPoints[pointI] = oldPoints[pointI] + newDelta;
+                    cellMoveMap[cellI] = 1;
+                }
+            }
+        }
+    }
+
+    // Move points
+    regionMesh().movePoints(newPoints);
+
+    return tcellMoveMap;
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::regionModels::regionModel1D::regionModel1D(const fvMesh& mesh)
+:
+    regionModel(mesh),
+    boundaryFaceFaces_(),
+    boundaryFaceCells_(),
+    boundaryFaceOppositeFace_(),
+    nMagSfPtr_(NULL),
+    moveMesh_(false)
+{}
+
+
+Foam::regionModels::regionModel1D::regionModel1D
+(
+    const fvMesh& mesh,
+    const word& regionType,
+    const word& modelName,
+    bool readFields
+)
+:
+    regionModel(mesh, regionType, modelName, false),
+    boundaryFaceFaces_(regionMesh().nCells()),
+    boundaryFaceCells_(regionMesh().nCells()),
+    boundaryFaceOppositeFace_(regionMesh().nCells()),
+    nMagSfPtr_(NULL),
+    moveMesh_(true)
+{
+    if (active_)
+    {
+        constructMeshObjects();
+        initialise();
+
+        if (readFields)
+        {
+            read();
+        }
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::regionModels::regionModel1D::~regionModel1D()
+{}
+
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/regionModel1D/regionModel1D.H b/src/regionModels/regionModel/regionModel1D/regionModel1D.H
new file mode 100644
index 0000000000000000000000000000000000000000..82b5a0b6208d841759d674d7910172a05ce5c1ef
--- /dev/null
+++ b/src/regionModels/regionModel/regionModel1D/regionModel1D.H
@@ -0,0 +1,176 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::regionModel1D
+
+Description
+    Base class for 1-D region models
+
+SourceFiles
+    regionModel1D.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef regionModel1D_H
+#define regionModel1D_H
+
+#include "regionModel.H"
+#include "surfaceFields.H"
+#include "labelList.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+
+/*---------------------------------------------------------------------------*\
+                       Class regionModel1D Declaration
+\*---------------------------------------------------------------------------*/
+
+class regionModel1D
+:
+    public regionModel
+{
+
+private:
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        regionModel1D(const regionModel1D&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const regionModel1D&);
+
+        //- Construct region mesh and fields
+        void constructMeshObjects();
+
+        //- Initialise the region
+        void initialise();
+
+
+protected:
+
+    // Protected data
+
+        // Region addressing - per internally coupled patch face walking out
+
+            //- Global face IDs
+            labelListList boundaryFaceFaces_;
+
+            //- Global cell IDs
+            labelListList boundaryFaceCells_;
+
+            //- Global boundary face IDs oppossite coupled patch
+            labelList boundaryFaceOppositeFace_;
+
+
+        // Geometry
+
+            //- Face area magnitude normal to patch
+            autoPtr<surfaceScalarField> nMagSfPtr_;
+
+            //- Flag to allow mesh movement
+            Switch moveMesh_;
+
+
+    // Protected member functions
+
+        //- Read control parameters from dictionary
+        virtual bool read();
+
+        //- Move mesh points according to change in cell volumes
+        //  Returns map ordered by cell where 1 = cell moved, 0 = cell unchanged
+        tmp<labelField> moveMesh
+        (
+            const scalarList& deltaV,
+            const scalar minDelta = 0.0
+        );
+
+
+public:
+
+    //- Runtime type information
+    TypeName("regionModel");
+
+
+    // Constructors
+
+        //- Construct null
+        regionModel1D(const fvMesh& mesh);
+
+        //- Construct from mesh, region type and name
+        regionModel1D
+        (
+            const fvMesh& mesh,
+            const word& regionType,
+            const word& modelName,
+            bool readFields = true
+        );
+
+
+    //- Destructor
+    virtual ~regionModel1D();
+
+
+    // Member Functions
+
+        // Access
+
+            // Addressing
+
+                //- Return the global face IDs
+                inline const labelListList& boundaryFaceFaces() const;
+
+                //- Return the global cell IDs
+                inline const labelListList& boundaryFaceCells() const;
+
+                //- Return the global boundary face IDs oppossite coupled patch
+                inline const labelList& boundaryFaceOppositeFace() const;
+
+
+            // Geometry
+
+                //- Return the face area magnitudes / [m2]
+                inline const surfaceScalarField& nMagSf() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "regionModel1DI.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/regionModel1D/regionModel1DI.H b/src/regionModels/regionModel/regionModel1D/regionModel1DI.H
new file mode 100644
index 0000000000000000000000000000000000000000..6a32b2b4775e71a9d138e5153c89f15e2b0ad38d
--- /dev/null
+++ b/src/regionModels/regionModel/regionModel1D/regionModel1DI.H
@@ -0,0 +1,68 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "regionModel1D.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+inline const Foam::labelListList&
+Foam::regionModels::regionModel1D::boundaryFaceFaces() const
+{
+    return boundaryFaceFaces_;
+}
+
+
+inline const Foam::labelListList&
+Foam::regionModels::regionModel1D::boundaryFaceCells() const
+{
+    return boundaryFaceCells_;
+}
+
+
+inline const Foam::labelList&
+Foam::regionModels::regionModel1D::boundaryFaceOppositeFace() const
+{
+    return boundaryFaceOppositeFace_;
+}
+
+
+inline const Foam::surfaceScalarField&
+Foam::regionModels::regionModel1D::nMagSf() const
+{
+    if (!nMagSfPtr_.valid())
+    {
+        FatalErrorIn
+        (
+            "inline const Foam::surfaceScalarField&"
+            "Foam::regionModel1Ds::regionModel1D::nMagSf() const"
+        )<< "Face normal areas not available" << abort(FatalError);
+    }
+
+    return nMagSfPtr_();
+}
+
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/singleLayerRegion/singleLayerRegion.C b/src/regionModels/regionModel/singleLayerRegion/singleLayerRegion.C
new file mode 100644
index 0000000000000000000000000000000000000000..52c451b740a9bb386821e5c28e421ae44cb300d9
--- /dev/null
+++ b/src/regionModels/regionModel/singleLayerRegion/singleLayerRegion.C
@@ -0,0 +1,238 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "singleLayerRegion.H"
+#include "fvMesh.H"
+#include "Time.H"
+#include "directMappedWallPolyPatch.H"
+#include "zeroGradientFvPatchFields.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+    defineTypeNameAndDebug(singleLayerRegion, 0);
+}
+}
+
+// * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * * //
+
+void Foam::regionModels::singleLayerRegion::constructMeshObjects()
+{
+    // construct patch normal vectors
+    nHatPtr_.reset
+    (
+        new volVectorField
+        (
+            IOobject
+            (
+                "nHat",
+                time_.timeName(),
+                regionMesh(),
+                IOobject::READ_IF_PRESENT,
+                NO_WRITE
+            ),
+            regionMesh(),
+            dimensionedVector("zero", dimless, vector::zero),
+            zeroGradientFvPatchField<vector>::typeName
+        )
+    );
+
+    // construct patch areas
+    magSfPtr_.reset
+    (
+        new volScalarField
+        (
+            IOobject
+            (
+                "magSf",
+                time_.timeName(),
+                regionMesh(),
+                IOobject::READ_IF_PRESENT,
+                NO_WRITE
+            ),
+            regionMesh(),
+            dimensionedScalar("zero", dimArea, 0.0),
+            zeroGradientFvPatchField<scalar>::typeName
+        )
+    );
+}
+
+
+void Foam::regionModels::singleLayerRegion::initialise()
+{
+    if (debug)
+    {
+        Pout<< "singleLayerRegion::initialise()" << endl;
+    }
+
+    label nBoundaryFaces = 0;
+    const polyBoundaryMesh& rbm = regionMesh().boundaryMesh();
+    volVectorField& nHat = nHatPtr_();
+    volScalarField& magSf = magSfPtr_();
+    forAll(intCoupledPatchIDs_, i)
+    {
+        const label patchI = intCoupledPatchIDs_[i];
+        const polyPatch& pp = rbm[patchI];
+        const labelList& fCells = pp.faceCells();
+
+        nBoundaryFaces += fCells.size();
+
+        UIndirectList<vector>(nHat, fCells) = pp.faceNormals();
+        UIndirectList<scalar>(magSf, fCells) = mag(pp.faceAreas());
+    }
+    nHat.correctBoundaryConditions();
+    magSf.correctBoundaryConditions();
+
+    if (nBoundaryFaces != regionMesh().nCells())
+    {
+        FatalErrorIn("singleLayerRegion::initialise()")
+            << "Number of primary region coupled boundary faces not equal to "
+            << "the number of cells in the local region" << nl << nl
+            << "Number of cells = " << regionMesh().nCells() << nl
+            << "Boundary faces  = " << nBoundaryFaces << nl
+            << abort(FatalError);
+    }
+
+    scalarField passiveMagSf(magSf.size(), 0.0);
+    passivePatchIDs_.setSize(intCoupledPatchIDs_.size(), -1);
+    forAll(intCoupledPatchIDs_, i)
+    {
+        const label patchI = intCoupledPatchIDs_[i];
+        const polyPatch& ppIntCoupled = rbm[patchI];
+        if (ppIntCoupled.size() > 0)
+        {
+            label cellId = rbm[patchI].faceCells()[0];
+            const cell& cFaces = regionMesh().cells()[cellId];
+
+            label faceI = ppIntCoupled.start();
+            label faceO = cFaces.opposingFaceLabel(faceI, regionMesh().faces());
+
+            label passivePatchI = rbm.whichPatch(faceO);
+            passivePatchIDs_[i] = passivePatchI;
+            const polyPatch& ppPassive = rbm[passivePatchI];
+            UIndirectList<scalar>(passiveMagSf, ppPassive.faceCells()) =
+                mag(ppPassive.faceAreas());
+        }
+    }
+
+    Pstream::listCombineGather(passivePatchIDs_, maxEqOp<label>());
+    Pstream::listCombineScatter(passivePatchIDs_);
+
+    magSf.field() = 0.5*(magSf + passiveMagSf);
+    magSf.correctBoundaryConditions();
+}
+
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+bool Foam::regionModels::singleLayerRegion::read()
+{
+    return regionModel::read();
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::regionModels::singleLayerRegion::singleLayerRegion(const fvMesh& mesh)
+:
+    regionModel(mesh),
+    nHatPtr_(NULL),
+    magSfPtr_(NULL),
+    passivePatchIDs_()
+{}
+
+
+Foam::regionModels::singleLayerRegion::singleLayerRegion
+(
+    const fvMesh& mesh,
+    const word& regionType,
+    const word& modelName,
+    bool readFields
+)
+:
+    regionModel(mesh, regionType, modelName, false),
+    nHatPtr_(NULL),
+    magSfPtr_(NULL),
+    passivePatchIDs_()
+{
+    if (active_)
+    {
+        constructMeshObjects();
+        initialise();
+
+        if (readFields)
+        {
+            read();
+        }
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::regionModels::singleLayerRegion::~singleLayerRegion()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+const Foam::volVectorField& Foam::regionModels::singleLayerRegion::nHat() const
+{
+    if (!nHatPtr_.valid())
+    {
+        FatalErrorIn("const fvMesh& singleLayerRegion::nHat() const")
+            << "Region patch normal vectors not available"
+            << abort(FatalError);
+    }
+
+    return nHatPtr_();
+}
+
+
+const Foam::volScalarField& Foam::regionModels::singleLayerRegion::magSf() const
+{
+    if (!magSfPtr_.valid())
+    {
+        FatalErrorIn("const fvMesh& singleLayerRegion::magSf() const")
+            << "Region patch areas not available"
+            << abort(FatalError);
+    }
+
+    return magSfPtr_();
+}
+
+
+const Foam::labelList&
+Foam::regionModels::singleLayerRegion::passivePatchIDs() const
+{
+    return passivePatchIDs_;
+}
+
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/singleLayerRegion/singleLayerRegion.H b/src/regionModels/regionModel/singleLayerRegion/singleLayerRegion.H
new file mode 100644
index 0000000000000000000000000000000000000000..fd66b75b5490ab8a1e7564bebdec8cca45dcb066
--- /dev/null
+++ b/src/regionModels/regionModel/singleLayerRegion/singleLayerRegion.H
@@ -0,0 +1,174 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::singleLayerRegion
+
+Description
+    Base class for single layer region models
+
+SourceFiles
+    singleLayerRegion.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef singleLayerRegion_H
+#define singleLayerRegion_H
+
+#include "regionModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+
+/*---------------------------------------------------------------------------*\
+                      Class singleLayerRegion Declaration
+\*---------------------------------------------------------------------------*/
+
+class singleLayerRegion
+:
+    public regionModel
+{
+
+private:
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        singleLayerRegion(const singleLayerRegion&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const singleLayerRegion&);
+
+        //- Construct region mesh and fields
+        void constructMeshObjects();
+
+        //- Initialise the region
+        void initialise();
+
+
+protected:
+
+    // Protected data
+
+        // Region addressing
+
+            //- Patch normal vectors
+            autoPtr<volVectorField> nHatPtr_;
+
+            //- Face area magnitudes / [m2]
+            autoPtr<volScalarField> magSfPtr_;
+
+
+        // Addressing
+
+            //- List of patch IDs opposite to internally coupled patches
+            labelList passivePatchIDs_;
+
+
+    // Protected member functions
+
+        //- Read control parameters from dictionary
+        virtual bool read();
+
+
+public:
+
+    //- Runtime type information
+    TypeName("regionModel");
+
+
+    // Constructors
+
+        //- Construct null
+        singleLayerRegion(const fvMesh& mesh);
+
+        //- Construct from mesh, region type and name
+        singleLayerRegion
+        (
+            const fvMesh& mesh,
+            const word& regionType,
+            const word& modelName,
+            bool readFields = true
+        );
+
+
+    //- Destructor
+    virtual ~singleLayerRegion();
+
+
+    // Member Functions
+
+        // Access
+
+            // Region geometry
+
+                //- Return the patch normal vectors
+                virtual const volVectorField& nHat() const;
+
+                //- Return the face area magnitudes / [m2]
+                virtual const volScalarField& magSf() const;
+
+
+            // Addressing
+
+                //- Return the list of patch IDs opposite to internally
+                //  coupled patches
+                virtual const labelList& passivePatchIDs() const;
+
+
+        // Patch type information
+
+            //- Return boundary types for mapped field patches
+            //  Also maps internal field value
+            //  Mapping region prescribed by underlying mapped poly patch
+            template<class Type>
+            wordList mappedFieldAndInternalPatchTypes() const;
+
+            //- Return boundary types for pushed mapped field patches
+            //  Mapping region prescribed by underlying mapped poly patch
+            template<class Type>
+            wordList mappedPushedFieldPatchTypes() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+    #include "singleLayerRegionTemplates.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/regionModel/singleLayerRegion/singleLayerRegionTemplates.C b/src/regionModels/regionModel/singleLayerRegion/singleLayerRegionTemplates.C
new file mode 100644
index 0000000000000000000000000000000000000000..c0628176be4b0a9aff13ced48348924c6931c448
--- /dev/null
+++ b/src/regionModels/regionModel/singleLayerRegion/singleLayerRegionTemplates.C
@@ -0,0 +1,72 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "singleLayerRegion.H"
+#include "zeroGradientFvPatchFields.H"
+#include "directMappedFixedInternalValueFvPatchFields.H"
+#include "directMappedFixedPushedInternalValueFvPatchFields.H"
+
+// * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * * //
+
+template<class Type>
+Foam::wordList
+Foam::regionModels::singleLayerRegion::mappedFieldAndInternalPatchTypes() const
+{
+    wordList bTypes(regionMesh().boundaryMesh().size());
+
+    bTypes = zeroGradientFvPatchField<Type>::typeName;
+
+    forAll(intCoupledPatchIDs_, i)
+    {
+        const label patchI = intCoupledPatchIDs_[i];
+        bTypes[patchI] =
+            directMappedFixedInternalValueFvPatchField<Type>::typeName;
+    }
+
+    return bTypes;
+}
+
+
+template<class Type>
+Foam::wordList
+Foam::regionModels::singleLayerRegion::mappedPushedFieldPatchTypes() const
+{
+    wordList bTypes(regionMesh().boundaryMesh().size());
+
+    bTypes = zeroGradientFvPatchField<Type>::typeName;
+
+    forAll(intCoupledPatchIDs_, i)
+    {
+        const label patchI = intCoupledPatchIDs_[i];
+        bTypes[patchI] =
+            directMappedFixedPushedInternalValueFvPatchField<Type>::typeName;
+    }
+
+    return bTypes;
+}
+
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/Make/files b/src/regionModels/surfaceFilmModels/Make/files
new file mode 100644
index 0000000000000000000000000000000000000000..099a8240e5d3c354a5eb0ac0e96920727e411662
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/Make/files
@@ -0,0 +1,45 @@
+/* Surface film models */
+surfaceFilmModel/surfaceFilmModel.C
+surfaceFilmModel/surfaceFilmModelNew.C
+noFilm/noFilm.C
+kinematicSingleLayer/kinematicSingleLayer.C
+thermoSingleLayer/thermoSingleLayer.C
+
+
+/* Sub-models */
+submodels/subModelBase.C
+
+KINEMATICMODELS=submodels/kinematic
+$(KINEMATICMODELS)/injectionModel/injectionModel/injectionModel.C
+$(KINEMATICMODELS)/injectionModel/injectionModel/injectionModelNew.C
+$(KINEMATICMODELS)/injectionModel/noInjection/noInjection.C
+$(KINEMATICMODELS)/injectionModel/cloudInjection/cloudInjection.C
+$(KINEMATICMODELS)/injectionModel/removeInjection/removeInjection.C
+
+THERMOMODELS=submodels/thermo
+$(THERMOMODELS)/phaseChangeModel/phaseChangeModel/phaseChangeModel.C
+$(THERMOMODELS)/phaseChangeModel/phaseChangeModel/phaseChangeModelNew.C
+$(THERMOMODELS)/phaseChangeModel/noPhaseChange/noPhaseChange.C
+$(THERMOMODELS)/phaseChangeModel/standardPhaseChange/standardPhaseChange.C
+
+$(THERMOMODELS)/heatTransferModel/heatTransferModel/heatTransferModel.C
+$(THERMOMODELS)/heatTransferModel/heatTransferModel/heatTransferModelNew.C
+$(THERMOMODELS)/heatTransferModel/constantHeatTransfer/constantHeatTransfer.C
+$(THERMOMODELS)/heatTransferModel/mappedConvectiveHeatTransfer/mappedConvectiveHeatTransfer.C
+
+$(THERMOMODELS)/filmRadiationModel/filmRadiationModel/filmRadiationModel.C
+$(THERMOMODELS)/filmRadiationModel/filmRadiationModel/filmRadiationModelNew.C
+$(THERMOMODELS)/filmRadiationModel/noRadiation/noRadiation.C
+$(THERMOMODELS)/filmRadiationModel/standardRadiation/standardRadiation.C
+
+
+/* Boundary conditions */
+derivedFvPatchFields/filmHeightInletVelocity/filmHeightInletVelocityFvPatchVectorField.C
+derivedFvPatchFields/htcConv/htcConvFvPatchScalarField.C
+
+/* Wall functions for primary region */
+derivedFvPatchFields/wallFunctions/alphatFilmWallFunction/alphatFilmWallFunctionFvPatchScalarField.C
+derivedFvPatchFields/wallFunctions/mutkFilmWallFunction/mutkFilmWallFunctionFvPatchScalarField.C
+
+
+LIB = $(FOAM_LIBBIN)/libsurfaceFilmModels
diff --git a/src/regionModels/surfaceFilmModels/Make/options b/src/regionModels/surfaceFilmModels/Make/options
new file mode 100644
index 0000000000000000000000000000000000000000..834fa99d5f6e800f04cc54f37b57ade142498fe8
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/Make/options
@@ -0,0 +1,25 @@
+EXE_INC = \
+    -I$(LIB_SRC)/finiteVolume/lnInclude \
+    -I$(LIB_SRC)/meshTools/lnInclude \
+    -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
+    -I$(LIB_SRC)/thermophysicalModels/specie/lnInclude \
+    -I$(LIB_SRC)/thermophysicalModels/liquids/lnInclude \
+    -I$(LIB_SRC)/thermophysicalModels/liquidMixture/lnInclude \
+    -I$(LIB_SRC)/thermophysicalModels/pointSolids/lnInclude \
+    -I$(LIB_SRC)/thermophysicalModels/pointSolidMixture/lnInclude \
+    -I$(LIB_SRC)/thermophysicalModels/pdfs/lnInclude \
+    -I$(LIB_SRC)/thermophysicalModels/SLGThermo/lnInclude \
+    -I$(LIB_SRC)/thermophysicalModels/reactionThermo/lnInclude \
+    -I$(LIB_SRC)/turbulenceModels \
+    -I$(LIB_SRC)/turbulenceModels/compressible/turbulenceModel \
+    -I$(LIB_SRC)/turbulenceModels/compressible/RAS/lnInclude \
+    -I$(LIB_SRC)/regionModels/regionModel/lnInclude
+
+EXE_LIBS = \
+    -lregionModels \
+    -lSLGThermoNew \
+    -lfiniteVolume \
+    -lmeshTools \
+    -lpdf \
+    -lcompressibleRASModels \
+    -lcompressibleLESModels
diff --git a/src/regionModels/surfaceFilmModels/derivedFvPatchFields/filmHeightInletVelocity/filmHeightInletVelocityFvPatchVectorField.C b/src/regionModels/surfaceFilmModels/derivedFvPatchFields/filmHeightInletVelocity/filmHeightInletVelocityFvPatchVectorField.C
new file mode 100644
index 0000000000000000000000000000000000000000..70e507f7148cc1920c2bfe027e571ed262b0dbdc
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/derivedFvPatchFields/filmHeightInletVelocity/filmHeightInletVelocityFvPatchVectorField.C
@@ -0,0 +1,168 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "filmHeightInletVelocityFvPatchVectorField.H"
+#include "addToRunTimeSelectionTable.H"
+#include "volFields.H"
+#include "surfaceFields.H"
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::filmHeightInletVelocityFvPatchVectorField::
+filmHeightInletVelocityFvPatchVectorField
+(
+    const fvPatch& p,
+    const DimensionedField<vector, volMesh>& iF
+)
+:
+    fixedValueFvPatchVectorField(p, iF),
+    phiName_("phi"),
+    rhoName_("rho"),
+    deltafName_("deltaf")
+{}
+
+
+Foam::filmHeightInletVelocityFvPatchVectorField::
+filmHeightInletVelocityFvPatchVectorField
+(
+    const filmHeightInletVelocityFvPatchVectorField& ptf,
+    const fvPatch& p,
+    const DimensionedField<vector, volMesh>& iF,
+    const fvPatchFieldMapper& mapper
+)
+:
+    fixedValueFvPatchVectorField(ptf, p, iF, mapper),
+    phiName_(ptf.phiName_),
+    rhoName_(ptf.rhoName_),
+    deltafName_(ptf.deltafName_)
+{}
+
+
+Foam::filmHeightInletVelocityFvPatchVectorField::
+filmHeightInletVelocityFvPatchVectorField
+(
+    const fvPatch& p,
+    const DimensionedField<vector, volMesh>& iF,
+    const dictionary& dict
+)
+:
+    fixedValueFvPatchVectorField(p, iF),
+    phiName_(dict.lookupOrDefault<word>("phi", "phi")),
+    rhoName_(dict.lookupOrDefault<word>("rho", "rho")),
+    deltafName_(dict.lookupOrDefault<word>("deltaf", "deltaf"))
+{
+    fvPatchVectorField::operator=(vectorField("value", dict, p.size()));
+}
+
+
+Foam::filmHeightInletVelocityFvPatchVectorField::
+filmHeightInletVelocityFvPatchVectorField
+(
+    const filmHeightInletVelocityFvPatchVectorField& fhivpvf
+)
+:
+    fixedValueFvPatchVectorField(fhivpvf),
+    phiName_(fhivpvf.phiName_),
+    rhoName_(fhivpvf.rhoName_),
+    deltafName_(fhivpvf.deltafName_)
+{}
+
+
+Foam::filmHeightInletVelocityFvPatchVectorField::
+filmHeightInletVelocityFvPatchVectorField
+(
+    const filmHeightInletVelocityFvPatchVectorField& fhivpvf,
+    const DimensionedField<vector, volMesh>& iF
+)
+:
+    fixedValueFvPatchVectorField(fhivpvf, iF),
+    phiName_(fhivpvf.phiName_),
+    rhoName_(fhivpvf.rhoName_),
+    deltafName_(fhivpvf.deltafName_)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void Foam::filmHeightInletVelocityFvPatchVectorField::updateCoeffs()
+{
+    if (updated())
+    {
+        return;
+    }
+
+    const fvsPatchField<scalar>& phip =
+        patch().lookupPatchField<surfaceScalarField, scalar>(phiName_);
+
+    const fvPatchField<scalar>& rhop =
+        patch().lookupPatchField<volScalarField, scalar>(rhoName_);
+
+    const fvPatchField<scalar>& deltafp =
+        patch().lookupPatchField<volScalarField, scalar>(deltafName_);
+
+    vectorField n = patch().nf();
+    const scalarField& magSf = patch().magSf();
+
+    operator==(deltafp*n*phip/(rhop*magSf*sqr(deltafp) + ROOTVSMALL));
+
+    fixedValueFvPatchVectorField::updateCoeffs();
+}
+
+
+void Foam::filmHeightInletVelocityFvPatchVectorField::write(Ostream& os) const
+{
+    fvPatchVectorField::write(os);
+    writeEntryIfDifferent<word>(os, "phi", "phi", phiName_);
+    writeEntryIfDifferent<word>(os, "rho", "rho", rhoName_);
+    writeEntryIfDifferent<word>(os, "deltaf", "deltaf", deltafName_);
+    writeEntry("value", os);
+}
+
+
+// * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
+
+void Foam::filmHeightInletVelocityFvPatchVectorField::operator=
+(
+    const fvPatchField<vector>& pvf
+)
+{
+    fvPatchField<vector>::operator=(patch().nf()*(patch().nf() & pvf));
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    makePatchTypeField
+    (
+        fvPatchVectorField,
+        filmHeightInletVelocityFvPatchVectorField
+    );
+}
+
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/derivedFvPatchFields/filmHeightInletVelocity/filmHeightInletVelocityFvPatchVectorField.H b/src/regionModels/surfaceFilmModels/derivedFvPatchFields/filmHeightInletVelocity/filmHeightInletVelocityFvPatchVectorField.H
new file mode 100644
index 0000000000000000000000000000000000000000..82bde6abb50626c4cdce522723a098cc1a8eafd4
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/derivedFvPatchFields/filmHeightInletVelocity/filmHeightInletVelocityFvPatchVectorField.H
@@ -0,0 +1,199 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::filmHeightInletVelocityFvPatchVectorField
+
+Description
+    Velocity inlet boundary condition for patches where the film height is
+    specified. The inflow velocity is obtained from the flux with a direction
+    normal to the patch faces.
+
+SourceFiles
+    filmHeightInletVelocityFvPatchVectorField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef filmHeightInletVelocityFvPatchVectorField_H
+#define filmHeightInletVelocityFvPatchVectorField_H
+
+#include "fvPatchFields.H"
+#include "fixedValueFvPatchFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+         Class filmHeightInletVelocityFvPatchVectorField Declaration
+\*---------------------------------------------------------------------------*/
+
+class filmHeightInletVelocityFvPatchVectorField
+:
+    public fixedValueFvPatchVectorField
+{
+    // Private data
+
+        //- Name of flux field
+        word phiName_;
+
+        //- Name of density field
+        word rhoName_;
+
+        //- Name of film height field
+        word deltafName_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("filmHeightInletVelocity");
+
+
+    // Constructors
+
+        //- Construct from patch and internal field
+        filmHeightInletVelocityFvPatchVectorField
+        (
+            const fvPatch&,
+            const DimensionedField<vector, volMesh>&
+        );
+
+        //- Construct from patch, internal field and dictionary
+        filmHeightInletVelocityFvPatchVectorField
+        (
+            const fvPatch&,
+            const DimensionedField<vector, volMesh>&,
+            const dictionary&
+        );
+
+        //- Construct by mapping given filmHeightInletVelocityFvPatchVectorField
+        //  onto a new patch
+        filmHeightInletVelocityFvPatchVectorField
+        (
+            const filmHeightInletVelocityFvPatchVectorField&,
+            const fvPatch&,
+            const DimensionedField<vector, volMesh>&,
+            const fvPatchFieldMapper&
+        );
+
+        //- Construct as copy
+        filmHeightInletVelocityFvPatchVectorField
+        (
+            const filmHeightInletVelocityFvPatchVectorField&
+        );
+
+        //- Construct and return a clone
+        virtual tmp<fvPatchVectorField> clone() const
+        {
+            return tmp<fvPatchVectorField>
+            (
+                new filmHeightInletVelocityFvPatchVectorField(*this)
+            );
+        }
+
+        //- Construct as copy setting internal field reference
+        filmHeightInletVelocityFvPatchVectorField
+        (
+            const filmHeightInletVelocityFvPatchVectorField&,
+            const DimensionedField<vector, volMesh>&
+        );
+
+        //- Construct and return a clone setting internal field reference
+        virtual tmp<fvPatchVectorField> clone
+        (
+            const DimensionedField<vector, volMesh>& iF
+        ) const
+        {
+            return tmp<fvPatchVectorField>
+            (
+                new filmHeightInletVelocityFvPatchVectorField(*this, iF)
+            );
+        }
+
+
+    // Member functions
+
+        // Access
+
+            //- Return the name of phi
+            const word& phiName() const
+            {
+                return phiName_;
+            }
+
+            //- Return reference to the name of phi to allow adjustment
+            word& phiName()
+            {
+                return phiName_;
+            }
+
+            //- Return the name of rho
+            const word& rhoName() const
+            {
+                return rhoName_;
+            }
+
+            //- Return reference to the name of rho to allow adjustment
+            word& rhoName()
+            {
+                return rhoName_;
+            }
+
+            //- Return the name of deltaf
+            const word& deltafName() const
+            {
+                return deltafName_;
+            }
+
+            //- Return reference to the name of df to allow adjustment
+            word& deltafName()
+            {
+                return deltafName_;
+            }
+
+
+        //- Update the coefficients associated with the patch field
+        virtual void updateCoeffs();
+
+        //- Write
+        virtual void write(Ostream&) const;
+
+
+    // Member operators
+
+        virtual void operator=(const fvPatchField<vector>& pvf);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/derivedFvPatchFields/htcConv/htcConvFvPatchScalarField.C b/src/regionModels/surfaceFilmModels/derivedFvPatchFields/htcConv/htcConvFvPatchScalarField.C
new file mode 100644
index 0000000000000000000000000000000000000000..c42a6fcef6273944a2cb8dacb425299555dae233
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/derivedFvPatchFields/htcConv/htcConvFvPatchScalarField.C
@@ -0,0 +1,166 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "htcConvFvPatchScalarField.H"
+#include "RASModel.H"
+#include "fvPatchFieldMapper.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace compressible
+{
+namespace RASModels
+{
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+htcConvFvPatchScalarField::htcConvFvPatchScalarField
+(
+    const fvPatch& p,
+    const DimensionedField<scalar, volMesh>& iF
+)
+:
+    fixedValueFvPatchScalarField(p, iF),
+    L_(1.0)
+{}
+
+
+htcConvFvPatchScalarField::htcConvFvPatchScalarField
+(
+    const htcConvFvPatchScalarField& ptf,
+    const fvPatch& p,
+    const DimensionedField<scalar, volMesh>& iF,
+    const fvPatchFieldMapper& mapper
+)
+:
+    fixedValueFvPatchScalarField(ptf, p, iF, mapper),
+    L_(ptf.L_)
+{}
+
+
+htcConvFvPatchScalarField::htcConvFvPatchScalarField
+(
+    const fvPatch& p,
+    const DimensionedField<scalar, volMesh>& iF,
+    const dictionary& dict
+)
+:
+    fixedValueFvPatchScalarField(p, iF, dict),
+    L_(readScalar(dict.lookup("L")))
+{}
+
+
+htcConvFvPatchScalarField::htcConvFvPatchScalarField
+(
+    const htcConvFvPatchScalarField& htcpsf
+)
+:
+    fixedValueFvPatchScalarField(htcpsf),
+    L_(htcpsf.L_)
+{}
+
+
+htcConvFvPatchScalarField::htcConvFvPatchScalarField
+(
+    const htcConvFvPatchScalarField& htcpsf,
+    const DimensionedField<scalar, volMesh>& iF
+)
+:
+    fixedValueFvPatchScalarField(htcpsf, iF),
+    L_(htcpsf.L_)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void htcConvFvPatchScalarField::updateCoeffs()
+{
+    if (updated())
+    {
+        return;
+    }
+
+    const label patchI = patch().index();
+
+    const RASModel& rasModel = db().lookupObject<RASModel>("RASProperties");
+    const scalarField alphaEffw = rasModel.alphaEff()().boundaryField()[patchI];
+    const scalarField& muw = rasModel.mu().boundaryField()[patchI];
+    const scalarField& rhow = rasModel.rho().boundaryField()[patchI];
+    const vectorField& Uc = rasModel.U();
+    const vectorField& Uw = rasModel.U().boundaryField()[patchI];
+    const scalarField& Tw = rasModel.thermo().T().boundaryField()[patchI];
+    const scalarField Cpw = rasModel.thermo().Cp(Tw, patchI);
+
+    const scalarField kappaw = Cpw*alphaEffw;
+    const scalarField Pr = muw*Cpw/kappaw;
+
+    scalarField& htc = *this;
+    forAll(htc, faceI)
+    {
+        label faceCellI = patch().faceCells()[faceI];
+
+        scalar Re = rhow[faceI]*mag(Uc[faceCellI] - Uw[faceI])*L_/muw[faceI];
+
+        if (Re < 5.0E+05)
+        {
+            htc[faceI] = 0.664*sqrt(Re)*cbrt(Pr[faceI])*kappaw[faceI]/L_;
+        }
+        else
+        {
+            htc[faceI] = 0.037*pow(Re, 0.8)*cbrt(Pr[faceI])*kappaw[faceI]/L_;
+        }
+    }
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void htcConvFvPatchScalarField::write(Ostream& os) const
+{
+    fvPatchField<scalar>::write(os);
+    os.writeKeyword("L") << L_ << token::END_STATEMENT << nl;
+    writeEntry("value", os);
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+makePatchTypeField
+(
+    fvPatchScalarField,
+    htcConvFvPatchScalarField
+);
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace RASModels
+} // End namespace compressible
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/derivedFvPatchFields/htcConv/htcConvFvPatchScalarField.H b/src/regionModels/surfaceFilmModels/derivedFvPatchFields/htcConv/htcConvFvPatchScalarField.H
new file mode 100644
index 0000000000000000000000000000000000000000..d98c597f0a691e7e028e9ffd6c12b4e3cc1b2e39
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/derivedFvPatchFields/htcConv/htcConvFvPatchScalarField.H
@@ -0,0 +1,160 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::compressible::RASModels::htcConvFvPatchScalarField
+
+Description
+    Convective heat transfer boundary condition
+
+SourceFiles
+    htcConvFvPatchScalarField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef compressibleMutRoughWallFunctionFvPatchScalarField_H
+#define compressibleMutRoughWallFunctionFvPatchScalarField_H
+
+#include "fixedValueFvPatchFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace compressible
+{
+namespace RASModels
+{
+
+/*---------------------------------------------------------------------------*\
+                 Class htcConvFvPatchScalarField Declaration
+\*---------------------------------------------------------------------------*/
+
+class htcConvFvPatchScalarField
+:
+    public fixedValueFvPatchScalarField
+{
+protected:
+
+    // Protected data
+
+        //- L Length scale [m]
+        const scalar L_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("htcConvection");
+
+
+    // Constructors
+
+        //- Construct from patch and internal field
+        htcConvFvPatchScalarField
+        (
+            const fvPatch&,
+            const DimensionedField<scalar, volMesh>&
+        );
+
+        //- Construct from patch, internal field and dictionary
+        htcConvFvPatchScalarField
+        (
+            const fvPatch&,
+            const DimensionedField<scalar, volMesh>&,
+            const dictionary&
+        );
+
+        //- Construct by mapping given
+        //  htcConvFvPatchScalarField
+        //  onto a new patch
+        htcConvFvPatchScalarField
+        (
+            const htcConvFvPatchScalarField&,
+            const fvPatch&,
+            const DimensionedField<scalar, volMesh>&,
+            const fvPatchFieldMapper&
+        );
+
+        //- Construct as copy
+        htcConvFvPatchScalarField
+        (
+            const htcConvFvPatchScalarField&
+        );
+
+        //- Construct and return a clone
+        virtual tmp<fvPatchScalarField> clone() const
+        {
+            return tmp<fvPatchScalarField>
+            (
+                new htcConvFvPatchScalarField(*this)
+            );
+        }
+
+        //- Construct as copy setting internal field reference
+        htcConvFvPatchScalarField
+        (
+            const htcConvFvPatchScalarField&,
+            const DimensionedField<scalar, volMesh>&
+        );
+
+        //- Construct and return a clone setting internal field reference
+        virtual tmp<fvPatchScalarField> clone
+        (
+            const DimensionedField<scalar, volMesh>& iF
+        ) const
+        {
+            return tmp<fvPatchScalarField>
+            (
+                new htcConvFvPatchScalarField(*this, iF)
+            );
+        }
+
+
+    // Member functions
+
+        // Evaluation functions
+
+            //- Update the coefficients associated with the patch field
+            virtual void updateCoeffs();
+
+
+        // I-O
+
+            //- Write
+            virtual void write(Ostream&) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace RASModels
+} // End namespace compressible
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/alphatFilmWallFunction/alphatFilmWallFunctionFvPatchScalarField.C b/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/alphatFilmWallFunction/alphatFilmWallFunctionFvPatchScalarField.C
new file mode 100644
index 0000000000000000000000000000000000000000..4bd6001141a3b05e82bc418bb0370c71dce104cf
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/alphatFilmWallFunction/alphatFilmWallFunctionFvPatchScalarField.C
@@ -0,0 +1,240 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "alphatFilmWallFunctionFvPatchScalarField.H"
+#include "RASModel.H"
+#include "surfaceFilmModel.H"
+#include "fvPatchFieldMapper.H"
+#include "volFields.H"
+#include "addToRunTimeSelectionTable.H"
+#include "directMappedWallPolyPatch.H"
+#include "mapDistribute.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace compressible
+{
+namespace RASModels
+{
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+alphatFilmWallFunctionFvPatchScalarField::
+alphatFilmWallFunctionFvPatchScalarField
+(
+    const fvPatch& p,
+    const DimensionedField<scalar, volMesh>& iF
+)
+:
+    fixedValueFvPatchScalarField(p, iF),
+    B_(5.5),
+    yPlusCrit_(11.05),
+    Cmu_(0.09),
+    kappa_(0.41),
+    Prt_(0.85)
+{}
+
+
+alphatFilmWallFunctionFvPatchScalarField::
+alphatFilmWallFunctionFvPatchScalarField
+(
+    const alphatFilmWallFunctionFvPatchScalarField& ptf,
+    const fvPatch& p,
+    const DimensionedField<scalar, volMesh>& iF,
+    const fvPatchFieldMapper& mapper
+)
+:
+    fixedValueFvPatchScalarField(ptf, p, iF, mapper),
+    B_(ptf.B_),
+    yPlusCrit_(ptf.yPlusCrit_),
+    Cmu_(ptf.Cmu_),
+    kappa_(ptf.kappa_),
+    Prt_(ptf.Prt_)
+{}
+
+
+alphatFilmWallFunctionFvPatchScalarField::
+alphatFilmWallFunctionFvPatchScalarField
+(
+    const fvPatch& p,
+    const DimensionedField<scalar, volMesh>& iF,
+    const dictionary& dict
+)
+:
+    fixedValueFvPatchScalarField(p, iF, dict),
+    B_(dict.lookupOrDefault("B", 5.5)),
+    yPlusCrit_(dict.lookupOrDefault("yPlusCrit", 11.05)),
+    Cmu_(dict.lookupOrDefault("Cmu", 0.09)),
+    kappa_(dict.lookupOrDefault("kappa", 0.41)),
+    Prt_(dict.lookupOrDefault("Prt", 0.85))
+{}
+
+
+alphatFilmWallFunctionFvPatchScalarField::
+alphatFilmWallFunctionFvPatchScalarField
+(
+    const alphatFilmWallFunctionFvPatchScalarField& fwfpsf
+)
+:
+    fixedValueFvPatchScalarField(fwfpsf),
+    B_(fwfpsf.B_),
+    yPlusCrit_(fwfpsf.yPlusCrit_),
+    Cmu_(fwfpsf.Cmu_),
+    kappa_(fwfpsf.kappa_),
+    Prt_(fwfpsf.Prt_)
+{}
+
+
+alphatFilmWallFunctionFvPatchScalarField::
+alphatFilmWallFunctionFvPatchScalarField
+(
+    const alphatFilmWallFunctionFvPatchScalarField& fwfpsf,
+    const DimensionedField<scalar, volMesh>& iF
+)
+:
+    fixedValueFvPatchScalarField(fwfpsf, iF),
+    B_(fwfpsf.B_),
+    yPlusCrit_(fwfpsf.yPlusCrit_),
+    Cmu_(fwfpsf.Cmu_),
+    kappa_(fwfpsf.kappa_),
+    Prt_(fwfpsf.Prt_)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void alphatFilmWallFunctionFvPatchScalarField::updateCoeffs()
+{
+    if (updated())
+    {
+        return;
+    }
+
+    typedef regionModels::surfaceFilmModels::surfaceFilmModel modelType;
+
+    bool ok =
+        db().objectRegistry::foundObject<modelType>("surfaceFilmProperties");
+
+    if (!ok)
+    {
+        // do nothing on construction - film model doesn't exist yet
+        return;
+    }
+
+    const label patchI = patch().index();
+
+    // Retrieve phase change mass from surface film model
+    const modelType& filmModel =
+        db().objectRegistry::lookupObject<modelType>("surfaceFilmProperties");
+
+    const label filmPatchI = filmModel.regionPatchID(patchI);
+
+    const mapDistribute& distMap = filmModel.mappedPatches()[filmPatchI].map();
+
+    scalarField mDotFilm =
+        filmModel.massPhaseChangeForPrimary().boundaryField()[filmPatchI];
+    distMap.distribute(mDotFilm);
+
+    // Retrieve RAS turbulence model
+    const RASModel& rasModel = db().lookupObject<RASModel>("RASProperties");
+
+    const scalarField& y = rasModel.y()[patchI];
+    const scalarField& rhow = rasModel.rho().boundaryField()[patchI];
+    const tmp<volScalarField> tk = rasModel.k();
+    const volScalarField& k = tk();
+    const scalarField& muw = rasModel.mu().boundaryField()[patchI];
+    const scalarField& alphaw = rasModel.alpha().boundaryField()[patchI];
+
+    const scalar Cmu25 = pow(Cmu_, 0.25);
+
+    // Populate alphat field values
+    scalarField& alphat = *this;
+    forAll(alphat, faceI)
+    {
+        label faceCellI = patch().faceCells()[faceI];
+
+        scalar uTau = Cmu25*sqrt(k[faceCellI]);
+
+        scalar yPlus = y[faceI]*uTau/(muw[faceI]/rhow[faceI]);
+
+        scalar Pr = muw[faceI]/alphaw[faceI];
+
+        scalar factor = 0.0;
+        scalar mStar = mDotFilm[faceI]/(y[faceI]*uTau);
+        if (yPlus > yPlusCrit_)
+        {
+            scalar expTerm = exp(min(50.0, yPlusCrit_*mStar*Pr));
+            scalar yPlusRatio = yPlus/yPlusCrit_;
+            scalar powTerm = mStar*Prt_/kappa_;
+            factor =
+                mStar/(expTerm*(pow(yPlusRatio, powTerm)) - 1.0 + ROOTVSMALL);
+        }
+        else
+        {
+            scalar expTerm = exp(min(50.0, yPlus*mStar*Pr));
+            factor = mStar/(expTerm - 1.0 + ROOTVSMALL);
+        }
+
+        scalar dx = patch().deltaCoeffs()[faceI];
+
+        scalar alphaEff = dx*rhow[faceI]*uTau*factor;
+
+        alphat[faceI] = max(alphaEff - alphaw[faceI], 0.0);
+    }
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void alphatFilmWallFunctionFvPatchScalarField::write(Ostream& os) const
+{
+    fvPatchField<scalar>::write(os);
+    os.writeKeyword("B") << B_ << token::END_STATEMENT << nl;
+    os.writeKeyword("yPlusCrit") << yPlusCrit_ << token::END_STATEMENT << nl;
+    os.writeKeyword("Cmu") << Cmu_ << token::END_STATEMENT << nl;
+    os.writeKeyword("kappa") << kappa_ << token::END_STATEMENT << nl;
+    os.writeKeyword("Prt") << Prt_ << token::END_STATEMENT << nl;
+    writeEntry("value", os);
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+makePatchTypeField
+(
+    fvPatchScalarField,
+    alphatFilmWallFunctionFvPatchScalarField
+);
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace RASModels
+} // End namespace compressible
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/alphatFilmWallFunction/alphatFilmWallFunctionFvPatchScalarField.H b/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/alphatFilmWallFunction/alphatFilmWallFunctionFvPatchScalarField.H
new file mode 100644
index 0000000000000000000000000000000000000000..31130335f913183c52d4884b753a6eb1f5bd4b5a
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/alphatFilmWallFunction/alphatFilmWallFunctionFvPatchScalarField.H
@@ -0,0 +1,173 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::compressible::RASModels::alphatFilmWallFunctionFvPatchScalarField
+
+Description
+    Turbulent thermal diffusivity boundary conditions for use with surface
+    film models.
+
+SourceFiles
+    alphatFilmWallFunctionFvPatchScalarField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef compressibleMutRoughWallFunctionFvPatchScalarField_H
+#define compressibleMutRoughWallFunctionFvPatchScalarField_H
+
+#include "fixedValueFvPatchFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace compressible
+{
+namespace RASModels
+{
+
+/*---------------------------------------------------------------------------*\
+          Class alphatFilmWallFunctionFvPatchScalarField Declaration
+\*---------------------------------------------------------------------------*/
+
+class alphatFilmWallFunctionFvPatchScalarField
+:
+    public fixedValueFvPatchScalarField
+{
+protected:
+
+    // Protected data
+
+        //- B Coefficient (default = 5.5)
+        scalar B_;
+
+        //- y+ value for laminar -> turbulent transition (default = 11.05)
+        scalar yPlusCrit_;
+
+        //- Turbulent Cmu coefficient (default = 0.09)
+        scalar Cmu_;
+
+        //- Von-Karman constant (default = 0.41)
+        scalar kappa_;
+
+        //- Turbulent Prandtl number (default = 0.85)
+        scalar Prt_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("alphatFilmWallFunction");
+
+
+    // Constructors
+
+        //- Construct from patch and internal field
+        alphatFilmWallFunctionFvPatchScalarField
+        (
+            const fvPatch&,
+            const DimensionedField<scalar, volMesh>&
+        );
+
+        //- Construct from patch, internal field and dictionary
+        alphatFilmWallFunctionFvPatchScalarField
+        (
+            const fvPatch&,
+            const DimensionedField<scalar, volMesh>&,
+            const dictionary&
+        );
+
+        //- Construct by mapping given
+        //  alphatFilmWallFunctionFvPatchScalarField
+        //  onto a new patch
+        alphatFilmWallFunctionFvPatchScalarField
+        (
+            const alphatFilmWallFunctionFvPatchScalarField&,
+            const fvPatch&,
+            const DimensionedField<scalar, volMesh>&,
+            const fvPatchFieldMapper&
+        );
+
+        //- Construct as copy
+        alphatFilmWallFunctionFvPatchScalarField
+        (
+            const alphatFilmWallFunctionFvPatchScalarField&
+        );
+
+        //- Construct and return a clone
+        virtual tmp<fvPatchScalarField> clone() const
+        {
+            return tmp<fvPatchScalarField>
+            (
+                new alphatFilmWallFunctionFvPatchScalarField(*this)
+            );
+        }
+
+        //- Construct as copy setting internal field reference
+        alphatFilmWallFunctionFvPatchScalarField
+        (
+            const alphatFilmWallFunctionFvPatchScalarField&,
+            const DimensionedField<scalar, volMesh>&
+        );
+
+        //- Construct and return a clone setting internal field reference
+        virtual tmp<fvPatchScalarField> clone
+        (
+            const DimensionedField<scalar, volMesh>& iF
+        ) const
+        {
+            return tmp<fvPatchScalarField>
+            (
+                new alphatFilmWallFunctionFvPatchScalarField(*this, iF)
+            );
+        }
+
+
+    // Member functions
+
+        // Evaluation functions
+
+            //- Update the coefficients associated with the patch field
+            virtual void updateCoeffs();
+
+
+        // I-O
+
+            //- Write
+            virtual void write(Ostream&) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace RASModels
+} // End namespace compressible
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/mutkFilmWallFunction/mutkFilmWallFunctionFvPatchScalarField.C b/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/mutkFilmWallFunction/mutkFilmWallFunctionFvPatchScalarField.C
new file mode 100644
index 0000000000000000000000000000000000000000..566104c73254a4b71ff4e9d1b515efef628bae6f
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/mutkFilmWallFunction/mutkFilmWallFunctionFvPatchScalarField.C
@@ -0,0 +1,238 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 "mutkFilmWallFunctionFvPatchScalarField.H"
+#include "fvPatchFieldMapper.H"
+#include "volFields.H"
+#include "RASModel.H"
+#include "addToRunTimeSelectionTable.H"
+#include "surfaceFilmModel.H"
+#include "directMappedWallPolyPatch.H"
+#include "mapDistribute.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace compressible
+{
+namespace RASModels
+{
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+tmp<scalarField> mutkFilmWallFunctionFvPatchScalarField::calcUTau
+(
+    const scalarField& magGradU
+) const
+{
+    tmp<scalarField> tuTau(new scalarField(patch().size(), 0.0));
+    scalarField& uTau = tuTau();
+
+    typedef regionModels::surfaceFilmModels::surfaceFilmModel modelType;
+
+    bool ok =
+        db().objectRegistry::foundObject<modelType>("surfaceFilmProperties");
+
+    if (!ok)
+    {
+        // do nothing on construction - film model doesn't exist yet
+        return tuTau;
+    }
+
+    const label patchI = patch().index();
+
+    // Retrieve phase change mass from surface film model
+    const modelType& filmModel =
+        db().objectRegistry::lookupObject<modelType>("surfaceFilmProperties");
+
+    const label filmPatchI = filmModel.regionPatchID(patchI);
+
+    const mapDistribute& distMap = filmModel.mappedPatches()[filmPatchI].map();
+
+    scalarField mDotFilm =
+        filmModel.massPhaseChangeForPrimary().boundaryField()[filmPatchI];
+    distMap.distribute(mDotFilm);
+
+
+    // Retrieve RAS turbulence model
+    const RASModel& rasModel = db().lookupObject<RASModel>("RASProperties");
+    const scalarField& y = rasModel.y()[patchI];
+    const fvPatchScalarField& rhow = rasModel.rho().boundaryField()[patchI];
+    const fvPatchScalarField& muw = rasModel.mu().boundaryField()[patchI];
+    const tmp<volScalarField> tk = rasModel.k();
+    const volScalarField& k = tk();
+
+    const scalar Cmu25 = pow(Cmu_, 0.25);
+
+    forAll(uTau, faceI)
+    {
+        label faceCellI = patch().faceCells()[faceI];
+
+        scalar ut = Cmu25*sqrt(k[faceCellI]);
+
+        scalar yPlus = y[faceI]*ut/(muw[faceI]/rhow[faceI]);
+
+        scalar mStar = mDotFilm[faceI]/(y[faceI]*ut);
+
+        scalar factor = 0.0;
+        if (yPlus > yPlusCrit_)
+        {
+            scalar expTerm = exp(min(50.0, B_*mStar));
+            scalar powTerm = pow(yPlus, mStar/kappa_);
+            factor = mStar/(expTerm*powTerm - 1.0 + ROOTVSMALL);
+        }
+        else
+        {
+            scalar expTerm = exp(min(50.0, mStar));
+            factor = mStar/(expTerm*yPlus - 1.0 + ROOTVSMALL);
+        }
+
+        uTau[faceI] = sqrt(max(0, magGradU[faceI]*ut*factor));
+    }
+
+    return tuTau;
+}
+
+
+tmp<scalarField> mutkFilmWallFunctionFvPatchScalarField::calcMut() const
+{
+    const label patchI = patch().index();
+
+    const RASModel& rasModel = db().lookupObject<RASModel>("RASProperties");
+    const fvPatchVectorField& Uw = rasModel.U().boundaryField()[patchI];
+    const scalarField magGradU = mag(Uw.snGrad());
+    const scalarField& rhow = rasModel.rho().boundaryField()[patchI];
+    const scalarField& muw = rasModel.mu().boundaryField()[patchI];
+
+    return max
+    (
+        scalar(0),
+        rhow*sqr(calcUTau(magGradU))/(magGradU + ROOTVSMALL) - muw
+    );
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+mutkFilmWallFunctionFvPatchScalarField::mutkFilmWallFunctionFvPatchScalarField
+(
+    const fvPatch& p,
+    const DimensionedField<scalar, volMesh>& iF
+)
+:
+    mutkWallFunctionFvPatchScalarField(p, iF),
+    B_(5.5),
+    yPlusCrit_(11.05)
+{}
+
+
+mutkFilmWallFunctionFvPatchScalarField::mutkFilmWallFunctionFvPatchScalarField
+(
+    const mutkFilmWallFunctionFvPatchScalarField& ptf,
+    const fvPatch& p,
+    const DimensionedField<scalar, volMesh>& iF,
+    const fvPatchFieldMapper& mapper
+)
+:
+    mutkWallFunctionFvPatchScalarField(ptf, p, iF, mapper),
+    B_(5.5),
+    yPlusCrit_(11.05)
+{}
+
+
+mutkFilmWallFunctionFvPatchScalarField::mutkFilmWallFunctionFvPatchScalarField
+(
+    const fvPatch& p,
+    const DimensionedField<scalar, volMesh>& iF,
+    const dictionary& dict
+)
+:
+    mutkWallFunctionFvPatchScalarField(p, iF, dict),
+    B_(dict.lookupOrDefault("B", 5.5)),
+    yPlusCrit_(dict.lookupOrDefault("yPlusCrit", 11.05))
+{}
+
+
+mutkFilmWallFunctionFvPatchScalarField::mutkFilmWallFunctionFvPatchScalarField
+(
+    const mutkFilmWallFunctionFvPatchScalarField& wfpsf
+)
+:
+    mutkWallFunctionFvPatchScalarField(wfpsf),
+    B_(wfpsf.B_),
+    yPlusCrit_(wfpsf.yPlusCrit_)
+{}
+
+
+mutkFilmWallFunctionFvPatchScalarField::mutkFilmWallFunctionFvPatchScalarField
+(
+    const mutkFilmWallFunctionFvPatchScalarField& wfpsf,
+    const DimensionedField<scalar, volMesh>& iF
+)
+:
+    mutkWallFunctionFvPatchScalarField(wfpsf, iF),
+    B_(wfpsf.B_),
+    yPlusCrit_(wfpsf.yPlusCrit_)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+tmp<scalarField> mutkFilmWallFunctionFvPatchScalarField::yPlus() const
+{
+    const label patchI = patch().index();
+
+    const RASModel& rasModel = db().lookupObject<RASModel>("RASProperties");
+    const scalarField& y = rasModel.y()[patchI];
+    const fvPatchVectorField& Uw = rasModel.U().boundaryField()[patchI];
+    const scalarField& rhow = rasModel.rho().boundaryField()[patchI];
+    const scalarField& muw = rasModel.mu().boundaryField()[patchI];
+
+    return y*calcUTau(mag(Uw.snGrad()))/(muw/rhow);
+}
+
+
+void mutkFilmWallFunctionFvPatchScalarField::write(Ostream& os) const
+{
+    fvPatchField<scalar>::write(os);
+    writeLocalEntries(os);
+    os.writeKeyword("B") << B_ << token::END_STATEMENT << nl;
+    os.writeKeyword("yPlusCrit") << yPlusCrit_ << token::END_STATEMENT << nl;
+    writeEntry("value", os);
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+makePatchTypeField(fvPatchScalarField, mutkFilmWallFunctionFvPatchScalarField);
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace RASModels
+} // End namespace compressible
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/mutkFilmWallFunction/mutkFilmWallFunctionFvPatchScalarField.H b/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/mutkFilmWallFunction/mutkFilmWallFunctionFvPatchScalarField.H
new file mode 100644
index 0000000000000000000000000000000000000000..c261e3d16a31aceaf55e6178b1fb145185b1f460
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/mutkFilmWallFunction/mutkFilmWallFunctionFvPatchScalarField.H
@@ -0,0 +1,172 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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::compressible::RASModels::
+    mutkFilmWallFunctionFvPatchScalarField
+
+Description
+    Wall function boundary condition for use with surface film models.
+
+SourceFiles
+    mutkFilmWallFunctionFvPatchScalarField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef compressibleMutSpalartAllmarasWallFunctionFvPatchScalarField_H
+#define compressibleMutSpalartAllmarasWallFunctionFvPatchScalarField_H
+
+#include "mutkWallFunctionFvPatchScalarField.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace compressible
+{
+namespace RASModels
+{
+
+/*---------------------------------------------------------------------------*\
+         Class mutkFilmWallFunctionFvPatchScalarField Declaration
+\*---------------------------------------------------------------------------*/
+
+class mutkFilmWallFunctionFvPatchScalarField
+:
+    public mutkWallFunctionFvPatchScalarField
+{
+protected:
+
+    // Protected data
+
+        //- B Coefficient (default = 5.5)
+        scalar B_;
+
+        //- y+ value for laminar -> turbulent transition (default = 11.05)
+        scalar yPlusCrit_;
+
+
+    // Protected member functions
+
+        //- Calculate the turbulence viscosity
+        virtual tmp<scalarField> calcMut() const;
+
+        //- Calculate the friction velocity
+        virtual tmp<scalarField> calcUTau(const scalarField& magGradU) const;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("mutkFilmWallFunction");
+
+
+    // Constructors
+
+        //- Construct from patch and internal field
+        mutkFilmWallFunctionFvPatchScalarField
+        (
+            const fvPatch&,
+            const DimensionedField<scalar, volMesh>&
+        );
+
+        //- Construct from patch, internal field and dictionary
+        mutkFilmWallFunctionFvPatchScalarField
+        (
+            const fvPatch&,
+            const DimensionedField<scalar, volMesh>&,
+            const dictionary&
+        );
+
+        //- Construct by mapping given
+        //  mutkFilmWallFunctionFvPatchScalarField
+        //  onto a new patch
+        mutkFilmWallFunctionFvPatchScalarField
+        (
+            const mutkFilmWallFunctionFvPatchScalarField&,
+            const fvPatch&,
+            const DimensionedField<scalar, volMesh>&,
+            const fvPatchFieldMapper&
+        );
+
+        //- Construct as copy
+        mutkFilmWallFunctionFvPatchScalarField
+        (
+            const mutkFilmWallFunctionFvPatchScalarField&
+        );
+
+        //- Construct and return a clone
+        virtual tmp<fvPatchScalarField> clone() const
+        {
+            return tmp<fvPatchScalarField>
+            (
+                new mutkFilmWallFunctionFvPatchScalarField(*this)
+            );
+        }
+
+        //- Construct as copy setting internal field reference
+        mutkFilmWallFunctionFvPatchScalarField
+        (
+            const mutkFilmWallFunctionFvPatchScalarField&,
+            const DimensionedField<scalar, volMesh>&
+        );
+
+        //- Construct and return a clone setting internal field reference
+        virtual tmp<fvPatchScalarField> clone
+        (
+            const DimensionedField<scalar, volMesh>& iF
+        ) const
+        {
+            return tmp<fvPatchScalarField>
+            (
+                new mutkFilmWallFunctionFvPatchScalarField(*this, iF)
+            );
+        }
+
+
+    // Member functions
+
+        // Evaluation functions
+
+            //- Calculate and return the yPlus at the boundary
+            virtual tmp<scalarField> yPlus() const;
+
+
+        // I-O
+
+            //- Write
+            virtual void write(Ostream& os) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace RASModels
+} // End namespace compressible
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayer.C b/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayer.C
new file mode 100644
index 0000000000000000000000000000000000000000..4ced00b1d9fd5f949cda9b36063f974b493bf337
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayer.C
@@ -0,0 +1,1135 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "kinematicSingleLayer.H"
+#include "fvm.H"
+#include "fvcDiv.H"
+#include "fvcLaplacian.H"
+#include "fvcSnGrad.H"
+#include "fvcReconstruct.H"
+#include "fvcVolumeIntegrate.H"
+#include "addToRunTimeSelectionTable.H"
+#include "directMappedWallPolyPatch.H"
+#include "mapDistribute.H"
+
+// Sub-models
+#include "injectionModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(kinematicSingleLayer, 0);
+
+addToRunTimeSelectionTable(surfaceFilmModel, kinematicSingleLayer, mesh);
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+bool kinematicSingleLayer::read()
+{
+    if (surfaceFilmModel::read())
+    {
+        const dictionary& solution = this->solution().subDict("PISO");
+        solution.lookup("momentumPredictor") >> momentumPredictor_;
+        solution.lookup("nOuterCorr") >> nOuterCorr_;
+        solution.lookup("nCorr") >> nCorr_;
+        solution.lookup("nNonOrthCorr") >> nNonOrthCorr_;
+
+        coeffs_.lookup("Cf") >> Cf_;
+        coeffs_.lookup("deltaStable") >> deltaStable_;
+
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+
+void kinematicSingleLayer::correctThermoFields()
+{
+    if (thermoModel_ == tmConstant)
+    {
+        rho_ == dimensionedScalar(coeffs_.lookup("rho0"));
+        mu_ == dimensionedScalar(coeffs_.lookup("mu0"));
+        sigma_ == dimensionedScalar(coeffs_.lookup("sigma0"));
+    }
+    else
+    {
+        FatalErrorIn
+        (
+            "void Foam::surfaceFilmModels::kinematicSingleLayer::"
+            "correctThermo()"
+        )   << "Kinematic surface film must use "
+            << thermoModelTypeNames_[thermoModel_] << "thermodynamics" << endl;
+    }
+}
+
+
+void kinematicSingleLayer::resetPrimaryRegionSourceTerms()
+{
+    rhoSpPrimary_ == dimensionedScalar("zero", rhoSp_.dimensions(), 0.0);
+    USpPrimary_ == dimensionedVector("zero", USp_.dimensions(), vector::zero);
+    pSpPrimary_ == dimensionedScalar("zero", pSp_.dimensions(), 0.0);
+}
+
+
+void kinematicSingleLayer::transferPrimaryRegionThermoFields()
+{
+    // Update fields from primary region via direct mapped
+    // (coupled) boundary conditions
+    UPrimary_.correctBoundaryConditions();
+    pPrimary_.correctBoundaryConditions();
+    rhoPrimary_.correctBoundaryConditions();
+    muPrimary_.correctBoundaryConditions();
+}
+
+
+void kinematicSingleLayer::transferPrimaryRegionSourceFields()
+{
+    // Retrieve the source fields from the primary region via direct mapped
+    // (coupled) boundary conditions
+    // - fields require transfer of values for both patch AND to push the
+    //   values into the first layer of internal cells
+    rhoSp_.correctBoundaryConditions();
+    USp_.correctBoundaryConditions();
+    pSp_.correctBoundaryConditions();
+
+    // Convert accummulated source terms into per unit area per unit time
+    // Note: boundary values will still have original (neat) values
+    const scalar deltaT = time_.deltaTValue();
+    rhoSp_.field() /= magSf()*deltaT;
+    USp_.field() /= magSf()*deltaT;
+    pSp_.field() /= magSf()*deltaT;
+
+    // reset transfer to primary fields
+    massForPrimary_ == dimensionedScalar("zero", dimMass, 0.0);
+    diametersForPrimary_ == dimensionedScalar("zero", dimLength, -1.0);
+}
+
+
+tmp<volScalarField> kinematicSingleLayer::pu()
+{
+    return tmp<volScalarField>
+    (
+        new volScalarField
+        (
+            IOobject
+            (
+                "pu",
+                time_.timeName(),
+                regionMesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE
+            ),
+            pPrimary_                  // pressure (mapped from primary region)
+          + pSp_                           // accumulated particle impingement
+          - fvc::laplacian(sigma_, delta_) // surface tension
+        )
+    );
+}
+
+
+tmp<volScalarField> kinematicSingleLayer::pp()
+{
+    return tmp<volScalarField>
+    (
+        new volScalarField
+        (
+            IOobject
+            (
+                "pp",
+                time_.timeName(),
+                regionMesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE
+            ),
+           -rho_*gNormClipped() // hydrostatic effect only
+        )
+    );
+}
+
+
+void kinematicSingleLayer::correctDetachedFilm()
+{
+    tmp<volScalarField> tgNorm(this->gNorm());
+    const scalarField& gNorm = tgNorm();
+    const scalarField& magSf = this->magSf();
+
+    forAll(gNorm, i)
+    {
+        if (gNorm[i] > SMALL)
+        {
+            const scalar ddelta = max(0.0, delta_[i] - deltaStable_.value());
+            massForPrimary_[i] =
+                max
+                (
+                    0.0,
+                    ddelta*rho_[i]*magSf[i] - massPhaseChangeForPrimary_[i]
+                );
+        }
+    }
+}
+
+
+void kinematicSingleLayer::updateSubmodels()
+{
+    correctDetachedFilm();
+
+    // Update injection model - mass returned is actual mass injected
+    injection_->correct(massForPrimary_, diametersForPrimary_);
+
+    // Update cumulative detached mass counter
+    injectedMassTotal_ += sum(massForPrimary_.field());
+
+    // Push values to boundaries ready for transfer to the primary region
+    massForPrimary_.correctBoundaryConditions();
+    diametersForPrimary_.correctBoundaryConditions();
+
+    // Update source fields
+    const dimensionedScalar deltaT = time().deltaT();
+    rhoSp_ -= (massForPrimary_ + massPhaseChangeForPrimary_)/magSf()/deltaT;
+}
+
+
+void kinematicSingleLayer::continuityCheck()
+{
+    const volScalarField deltaRho0 = deltaRho_;
+
+    solveContinuity();
+
+    if (debug)
+    {
+        const volScalarField mass(deltaRho_*magSf());
+        const dimensionedScalar totalMass =
+            fvc::domainIntegrate(mass)
+          + dimensionedScalar("SMALL", dimMass*dimVolume, ROOTVSMALL);
+
+        const scalar sumLocalContErr =
+            (
+                fvc::domainIntegrate(mag(mass - magSf()*deltaRho0))/totalMass
+            ).value();
+
+        const scalar globalContErr =
+            (
+                fvc::domainIntegrate(mass - magSf()*deltaRho0)/totalMass
+            ).value();
+
+        cumulativeContErr_ += globalContErr;
+
+        Info<< "Surface film: " << type() << nl
+            << "    time step continuity errors: sum local = "
+            << sumLocalContErr << ", global = " << globalContErr
+            << ", cumulative = " << cumulativeContErr_ << endl;
+    }
+}
+
+
+void kinematicSingleLayer::solveContinuity()
+{
+    if (debug)
+    {
+        Info<< "kinematicSingleLayer::solveContinuity()" << endl;
+    }
+
+    solve
+    (
+        fvm::ddt(deltaRho_)
+      + fvc::div(phi_)
+     ==
+        rhoSp_
+    );
+}
+
+
+void kinematicSingleLayer::updateSurfaceVelocities()
+{
+    // Push boundary film velocity values into internal field
+    for (label i=0; i<intCoupledPatchIDs_.size(); i++)
+    {
+        label patchI = intCoupledPatchIDs_[i];
+        const polyPatch& pp = regionMesh().boundaryMesh()[patchI];
+        UIndirectList<vector>(Uw_, pp.faceCells()) =
+            U_.boundaryField()[patchI];
+    }
+    Uw_ -= nHat()*(Uw_ & nHat());
+    Uw_.correctBoundaryConditions();
+
+    // TODO: apply quadratic profile to determine surface velocity
+    Us_ = U_;
+    Us_.correctBoundaryConditions();
+}
+
+
+tmp<fvVectorMatrix> kinematicSingleLayer::tau(volVectorField& U) const
+{
+    // Calculate shear stress
+    volScalarField Cs("Cs", rho_*Cf_*mag(Us_ - U));
+    volScalarField Cw
+    (
+        "Cw",
+        mu_/(0.3333*(delta_ + dimensionedScalar("SMALL", dimLength, SMALL)))
+    );
+    Cw.min(1.0e+06);
+
+    return
+    (
+       - fvm::Sp(Cs, U) + Cs*Us_
+       - fvm::Sp(Cw, U) + Cw*Uw_
+    );
+}
+
+
+tmp<Foam::fvVectorMatrix> kinematicSingleLayer::solveMomentum
+(
+    const volScalarField& pu,
+    const volScalarField& pp
+)
+{
+    if (debug)
+    {
+        Info<< "kinematicSingleLayer::solveMomentum()" << endl;
+    }
+
+    updateSurfaceVelocities();
+
+    // Momentum
+    tmp<fvVectorMatrix> tUEqn
+    (
+        fvm::ddt(deltaRho_, U_)
+      + fvm::div(phi_, U_)
+     ==
+        USp_
+      + tau(U_)
+      + fvc::grad(sigma_)
+      - fvm::Sp
+        (
+            (massForPrimary_ + massPhaseChangeForPrimary_)
+           /magSf()/time().deltaT(),
+            U_
+        )
+    );
+
+    fvVectorMatrix& UEqn = tUEqn();
+
+    UEqn.relax();
+
+    if (momentumPredictor_)
+    {
+        solve
+        (
+            UEqn
+         ==
+            fvc::reconstruct
+            (
+              - fvc::interpolate(delta_)
+              * (
+                    regionMesh().magSf()
+                  * (
+                        fvc::snGrad(pu, "snGrad(p)")
+                      + fvc::snGrad(pp, "snGrad(p)")*fvc::interpolate(delta_)
+                      + fvc::snGrad(delta_)*fvc::interpolate(pp)
+                    )
+                  - (fvc::interpolate(rho_*gTan()) & regionMesh().Sf())
+                )
+            )
+        );
+
+        // Remove any patch-normal components of velocity
+        U_ -= nHat()*(nHat() & U_);
+        U_.correctBoundaryConditions();
+    }
+
+    return tUEqn;
+}
+
+
+void kinematicSingleLayer::solveThickness
+(
+    const volScalarField& pu,
+    const volScalarField& pp,
+    const fvVectorMatrix& UEqn
+)
+{
+    if (debug)
+    {
+        Info<< "kinematicSingleLayer::solveThickness()" << endl;
+    }
+
+    volScalarField rUA(1.0/UEqn.A());
+    U_ = rUA*UEqn.H();
+
+    surfaceScalarField deltarUAf(fvc::interpolate(delta_*rUA));
+    surfaceScalarField rhof(fvc::interpolate(rho_));
+
+    surfaceScalarField phiAdd
+    (
+        "phiAdd",
+        regionMesh().magSf()
+      * (
+            fvc::snGrad(pu, "snGrad(p)")
+          + fvc::snGrad(pp, "snGrad(p)")*fvc::interpolate(delta_)
+        )
+      - (fvc::interpolate(rho_*gTan()) & regionMesh().Sf())
+    );
+    constrainFilmField(phiAdd, 0.0);
+
+    surfaceScalarField phid
+    (
+        "phid",
+        (fvc::interpolate(U_*rho_) & regionMesh().Sf())
+      - deltarUAf*phiAdd*rhof
+    );
+    constrainFilmField(phid, 0.0);
+
+    surfaceScalarField ddrhorUAppf
+    (
+        fvc::interpolate(delta_)*deltarUAf*rhof*fvc::interpolate(pp)
+    );
+//    constrainFilmField(ddrhorUAppf, 0.0);
+
+    for (int nonOrth=0; nonOrth<=nNonOrthCorr_; nonOrth++)
+    {
+        // Film thickness equation
+        fvScalarMatrix deltaEqn
+        (
+            fvm::ddt(rho_, delta_)
+          + fvm::div(phid, delta_)
+          - fvm::laplacian(ddrhorUAppf, delta_)
+         ==
+            rhoSp_
+        );
+
+        deltaEqn.solve();
+
+        if (nonOrth == nNonOrthCorr_)
+        {
+            phiAdd +=
+                fvc::interpolate(pp)
+              * fvc::snGrad(delta_)
+              * regionMesh().magSf();
+
+            phi_ == deltaEqn.flux();
+        }
+    }
+
+    // Bound film thickness by a minimum of zero
+    delta_.max(0.0);
+
+    // Update U field
+    U_ -= fvc::reconstruct(deltarUAf*phiAdd);
+
+    // Remove any patch-normal components of velocity
+    U_ -= nHat()*(nHat() & U_);
+
+    U_.correctBoundaryConditions();
+
+    // Continuity check
+    continuityCheck();
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+kinematicSingleLayer::kinematicSingleLayer
+(
+    const word& modelType,
+    const fvMesh& mesh,
+    const dimensionedVector& g,
+    const bool readFields
+)
+:
+    surfaceFilmModel(modelType, mesh, g),
+
+    momentumPredictor_(solution().subDict("PISO").lookup("momentumPredictor")),
+    nOuterCorr_(readLabel(solution().subDict("PISO").lookup("nOuterCorr"))),
+    nCorr_(readLabel(solution().subDict("PISO").lookup("nCorr"))),
+    nNonOrthCorr_(readLabel(solution().subDict("PISO").lookup("nNonOrthCorr"))),
+
+    cumulativeContErr_(0.0),
+
+    Cf_(readScalar(coeffs().lookup("Cf"))),
+    deltaStable_(coeffs().lookup("deltaStable")),
+
+    rho_
+    (
+        IOobject
+        (
+            "rhof",
+            time().timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::AUTO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar("zero", dimDensity, 0.0),
+        zeroGradientFvPatchScalarField::typeName
+    ),
+    mu_
+    (
+        IOobject
+        (
+            "muf",
+            time().timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::AUTO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar("zero", dimPressure*dimTime, 0.0),
+        zeroGradientFvPatchScalarField::typeName
+    ),
+    sigma_
+    (
+        IOobject
+        (
+            "sigmaf",
+            time().timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::AUTO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar("zero", dimMass/sqr(dimTime), 0.0),
+        zeroGradientFvPatchScalarField::typeName
+    ),
+
+    delta_
+    (
+        IOobject
+        (
+            "deltaf",
+            time().timeName(),
+            regionMesh(),
+            IOobject::MUST_READ,
+            IOobject::AUTO_WRITE
+        ),
+        regionMesh()
+    ),
+    U_
+    (
+        IOobject
+        (
+            "Uf",
+            time().timeName(),
+            regionMesh(),
+            IOobject::MUST_READ,
+            IOobject::AUTO_WRITE
+        ),
+        regionMesh()
+    ),
+    Us_
+    (
+        IOobject
+        (
+            "Usf",
+            time().timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        U_,
+        zeroGradientFvPatchScalarField::typeName
+    ),
+    Uw_
+    (
+        IOobject
+        (
+            "Uwf",
+            time().timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        U_,
+        zeroGradientFvPatchScalarField::typeName
+    ),
+    deltaRho_
+    (
+        IOobject
+        (
+            delta_.name() + "*" + rho_.name(),
+            time().timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar("zero", delta_.dimensions()*rho_.dimensions(), 0.0),
+        zeroGradientFvPatchScalarField::typeName
+    ),
+
+    phi_
+    (
+        IOobject
+        (
+            "phi",
+            time().timeName(),
+            regionMesh(),
+            IOobject::READ_IF_PRESENT,
+            IOobject::AUTO_WRITE
+        ),
+        regionMesh(),
+        dimLength*dimMass/dimTime
+    ),
+
+    massForPrimary_
+    (
+        IOobject
+        (
+            "massForPrimary",
+            time().timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar("zero", dimMass, 0.0),
+        zeroGradientFvPatchScalarField::typeName
+    ),
+    diametersForPrimary_
+    (
+        IOobject
+        (
+            "diametersForPrimary",
+            time().timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar("zero", dimLength, -1.0),
+        zeroGradientFvPatchScalarField::typeName
+    ),
+    massPhaseChangeForPrimary_
+    (
+        IOobject
+        (
+            "massPhaseChangeForPrimary",
+            time().timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar("zero", dimMass, 0),
+        zeroGradientFvPatchScalarField::typeName
+    ),
+
+    USp_
+    (
+        IOobject
+        (
+            "USpf",
+            time().timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        regionMesh(),
+        dimensionedVector
+        (
+            "zero", dimMass*dimVelocity/dimArea/dimTime, vector::zero
+        ),
+        this->mappedPushedFieldPatchTypes<vector>()
+    ),
+    pSp_
+    (
+        IOobject
+        (
+            "pSpf",
+            time_.timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar("zero", dimPressure, 0.0),
+        this->mappedPushedFieldPatchTypes<scalar>()
+    ),
+    rhoSp_
+    (
+        IOobject
+        (
+            "rhoSpf",
+            time_.timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar("zero", dimMass/dimTime/dimArea, 0.0),
+        this->mappedPushedFieldPatchTypes<scalar>()
+    ),
+
+    USpPrimary_
+    (
+        IOobject
+        (
+            USp_.name(), // must have same name as USp_ to enable mapping
+            time().timeName(),
+            primaryMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        primaryMesh(),
+        dimensionedVector("zero", USp_.dimensions(), vector::zero)
+    ),
+    pSpPrimary_
+    (
+        IOobject
+        (
+            pSp_.name(), // must have same name as pSp_ to enable mapping
+            time().timeName(),
+            primaryMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        primaryMesh(),
+        dimensionedScalar("zero", pSp_.dimensions(), 0.0)
+    ),
+    rhoSpPrimary_
+    (
+        IOobject
+        (
+            rhoSp_.name(), // must have same name as rhoSp_ to enable mapping
+            time().timeName(),
+            primaryMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        primaryMesh(),
+        dimensionedScalar("zero", rhoSp_.dimensions(), 0.0)
+    ),
+
+    UPrimary_
+    (
+        IOobject
+        (
+            "U", // must have same name as U to enable mapping
+            time().timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        regionMesh(),
+        dimensionedVector("zero", dimVelocity, vector::zero),
+        this->mappedFieldAndInternalPatchTypes<vector>()
+    ),
+    pPrimary_
+    (
+        IOobject
+        (
+            "p", // must have same name as p to enable mapping
+            time().timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar("zero", dimPressure, 0.0),
+        this->mappedFieldAndInternalPatchTypes<scalar>()
+    ),
+    rhoPrimary_
+    (
+        IOobject
+        (
+            "rho", // must have same name as rho to enable mapping
+            time().timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar("zero", dimDensity, 0.0),
+        this->mappedFieldAndInternalPatchTypes<scalar>()
+    ),
+    muPrimary_
+    (
+        IOobject
+        (
+            "mu", // must have same name as mu to enable mapping
+            time().timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar("zero", dimPressure*dimTime, 0.0),
+        this->mappedFieldAndInternalPatchTypes<scalar>()
+    ),
+
+    injection_(injectionModel::New(*this, coeffs_)),
+
+    addedMassTotal_(0.0),
+    injectedMassTotal_(0.0)
+{
+    if (readFields)
+    {
+        transferPrimaryRegionThermoFields();
+
+        correctThermoFields();
+
+        deltaRho_ == delta_*rho_;
+        phi_ = fvc::interpolate(deltaRho_*U_) & regionMesh().Sf();
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+kinematicSingleLayer::~kinematicSingleLayer()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+void kinematicSingleLayer::addSources
+(
+    const label patchI,
+    const label faceI,
+    const scalar massSource,
+    const vector& momentumSource,
+    const scalar pressureSource,
+    const scalar energySource
+)
+{
+    if (debug)
+    {
+        Info<< "\nSurface film: " << type() << ": adding to film source:" << nl
+            << "    mass     = " << massSource << nl
+            << "    momentum = " << momentumSource << nl
+            << "    pressure = " << pressureSource << endl;
+    }
+
+    rhoSpPrimary_.boundaryField()[patchI][faceI] += massSource;
+    USpPrimary_.boundaryField()[patchI][faceI] += momentumSource;
+    pSpPrimary_.boundaryField()[patchI][faceI] += pressureSource;
+
+    addedMassTotal_ += massSource;
+}
+
+
+void kinematicSingleLayer::preEvolveRegion()
+{
+    transferPrimaryRegionThermoFields();
+
+    correctThermoFields();
+
+    transferPrimaryRegionSourceFields();
+}
+
+
+void kinematicSingleLayer::evolveRegion()
+{
+    updateSubmodels();
+
+    // Solve continuity for deltaRho_
+    solveContinuity();
+
+    // Implicit pressure source coefficient
+    tmp<volScalarField> tpp(this->pp());
+
+    for (int oCorr=0; oCorr<nOuterCorr_; oCorr++)
+    {
+        // Explicit pressure source contribution - varies with delta_
+        tmp<volScalarField> tpu(this->pu());
+
+        // Solve for momentum for U_
+        tmp<fvVectorMatrix> UEqn = solveMomentum(tpu(), tpp());
+
+        // Film thickness correction loop
+        for (int corr=1; corr<=nCorr_; corr++)
+        {
+            // Solve thickness for delta_
+            solveThickness(tpu(), tpp(), UEqn());
+        }
+    }
+
+    // Update deltaRho_ with new delta_
+    deltaRho_ == delta_*rho_;
+
+    // Update film wall and surface velocities
+    updateSurfaceVelocities();
+
+    // Reset source terms for next time integration
+    resetPrimaryRegionSourceTerms();
+}
+
+
+scalar kinematicSingleLayer::CourantNumber() const
+{
+    scalar CoNum = 0.0;
+
+    if (regionMesh().nInternalFaces() > 0)
+    {
+        const scalar deltaT = time_.deltaTValue();
+
+        const surfaceScalarField SfUfbyDelta =
+            regionMesh().surfaceInterpolation::deltaCoeffs()*mag(phi_);
+        const surfaceScalarField rhoDelta = fvc::interpolate(rho_*delta_);
+        const surfaceScalarField& magSf = regionMesh().magSf();
+
+        forAll(rhoDelta, i)
+        {
+            if (rhoDelta[i] > ROOTVSMALL)
+            {
+                CoNum = max(CoNum, SfUfbyDelta[i]/rhoDelta[i]/magSf[i]*deltaT);
+            }
+        }
+    }
+
+    reduce(CoNum, maxOp<scalar>());
+
+    Info<< "Film max Courant number: " << CoNum << endl;
+
+    return CoNum;
+}
+
+
+const volVectorField& kinematicSingleLayer::U() const
+{
+    return U_;
+}
+
+
+const volVectorField& kinematicSingleLayer::Us() const
+{
+    return Us_;
+}
+
+
+const volVectorField& kinematicSingleLayer::Uw() const
+{
+    return Uw_;
+}
+
+
+const volScalarField& kinematicSingleLayer::rho() const
+{
+    return rho_;
+}
+
+
+const volScalarField& kinematicSingleLayer::T() const
+{
+    FatalErrorIn
+    (
+        "const volScalarField& kinematicSingleLayer::T() const"
+    )   << "T field not available for " << type() << abort(FatalError);
+
+    return volScalarField::null();
+}
+
+
+const volScalarField& kinematicSingleLayer::Ts() const
+{
+    FatalErrorIn
+    (
+        "const volScalarField& kinematicSingleLayer::Ts() const"
+    )   << "Ts field not available for " << type() << abort(FatalError);
+
+    return volScalarField::null();
+}
+
+
+const volScalarField& kinematicSingleLayer::Tw() const
+{
+    FatalErrorIn
+    (
+        "const volScalarField& kinematicSingleLayer::Tw() const"
+    )   << "Tw field not available for " << type() << abort(FatalError);
+
+    return volScalarField::null();
+}
+
+
+const volScalarField& kinematicSingleLayer::Cp() const
+{
+    FatalErrorIn
+    (
+        "const volScalarField& kinematicSingleLayer::Cp() const"
+    )   << "Cp field not available for " << type() << abort(FatalError);
+
+    return volScalarField::null();
+}
+
+
+const volScalarField& kinematicSingleLayer::kappa() const
+{
+    FatalErrorIn
+    (
+        "const volScalarField& kinematicSingleLayer::kappa() const"
+    )   << "kappa field not available for " << type() << abort(FatalError);
+
+    return volScalarField::null();
+}
+
+
+const volScalarField& kinematicSingleLayer::massForPrimary() const
+{
+    return massForPrimary_;
+}
+
+
+const volScalarField& kinematicSingleLayer::diametersForPrimary() const
+{
+    return diametersForPrimary_;
+}
+
+
+const volScalarField& kinematicSingleLayer::massPhaseChangeForPrimary() const
+{
+    return massPhaseChangeForPrimary_;
+}
+
+
+void kinematicSingleLayer::info() const
+{
+    Info<< "\nSurface film: " << type() << endl;
+
+    Info<< indent << "added mass         = "
+        << returnReduce<scalar>(addedMassTotal_, sumOp<scalar>()) << nl
+        << indent << "current mass       = "
+        << gSum((deltaRho_*magSf())()) << nl
+        << indent << "injected mass      = "
+        << returnReduce<scalar>(injectedMassTotal_, sumOp<scalar>()) << nl
+        << indent << "min/max(mag(U))    = " << min(mag(U_)).value() << ", "
+        << max(mag(U_)).value() << nl
+        << indent << "min/max(delta)     = " << min(delta_).value() << ", "
+        << max(delta_).value() << nl;
+}
+
+
+tmp<DimensionedField<scalar, volMesh> >  kinematicSingleLayer::Srho() const
+{
+    tmp<DimensionedField<scalar, volMesh> > tSrho
+    (
+        new DimensionedField<scalar, volMesh>
+        (
+            IOobject
+            (
+                "kinematicSingleLayer::Srho",
+                time().timeName(),
+                primaryMesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            primaryMesh(),
+            dimensionedScalar("zero", dimMass/dimVolume/dimTime, 0.0)
+        )
+    );
+
+    scalarField& Srho = tSrho();
+    const scalarField& V = primaryMesh().V();
+    const scalar dt = time_.deltaTValue();
+
+    forAll(intCoupledPatchIDs(), i)
+    {
+        const label filmPatchI = intCoupledPatchIDs()[i];
+        const mapDistribute& distMap = mappedPatches_[filmPatchI].map();
+
+        scalarField patchMass =
+            massPhaseChangeForPrimary_.boundaryField()[filmPatchI];
+        distMap.distribute(patchMass);
+
+        const label primaryPatchI = primaryPatchIDs()[i];
+        const unallocLabelList& cells =
+            primaryMesh().boundaryMesh()[primaryPatchI].faceCells();
+
+        forAll(patchMass, j)
+        {
+            Srho[cells[j]] = patchMass[j]/(V[cells[j]]*dt);
+        }
+    }
+
+    return tSrho;
+}
+
+
+tmp<DimensionedField<scalar, volMesh> > kinematicSingleLayer::Srho
+(
+    const label
+) const
+{
+    return tmp<DimensionedField<scalar, volMesh> >
+    (
+        new DimensionedField<scalar, volMesh>
+        (
+            IOobject
+            (
+                "kinematicSingleLayer::Srho(i)",
+                time().timeName(),
+                primaryMesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            primaryMesh(),
+            dimensionedScalar("zero", dimMass/dimVolume/dimTime, 0.0)
+        )
+    );
+}
+
+
+tmp<DimensionedField<scalar, volMesh> > kinematicSingleLayer::Sh() const
+{
+    return tmp<DimensionedField<scalar, volMesh> >
+    (
+        new DimensionedField<scalar, volMesh>
+        (
+            IOobject
+            (
+                "kinematicSingleLayer::Sh",
+                time().timeName(),
+                primaryMesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            primaryMesh(),
+            dimensionedScalar("zero", dimEnergy/dimVolume/dimTime, 0.0)
+        )
+    );
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayer.H b/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayer.H
new file mode 100644
index 0000000000000000000000000000000000000000..e53efa44bf6f01b3ae07f8cddf13c1355600cacb
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayer.H
@@ -0,0 +1,524 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::kinematicSingleLayer
+
+Description
+    Kinematic form of single-cell layer surface film model
+
+SourceFiles
+    kinematicSingleLayer.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef kinematicSingleLayer_H
+#define kinematicSingleLayer_H
+
+#include "surfaceFilmModel.H"
+#include "fvMesh.H"
+#include "volFields.H"
+#include "surfaceFields.H"
+#include "fvMatrices.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// Forward declaration of classes
+class injectionModel;
+
+/*---------------------------------------------------------------------------*\
+                   Class kinematicSingleLayer Declaration
+\*---------------------------------------------------------------------------*/
+
+class kinematicSingleLayer
+:
+    public surfaceFilmModel
+{
+private:
+
+    // Private member functions
+
+        //- Disallow default bitwise copy construct
+        kinematicSingleLayer(const kinematicSingleLayer&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const kinematicSingleLayer&);
+
+
+protected:
+
+    // Protected data
+
+        // Solution parameters
+
+            //- Momentum predictor
+            Switch momentumPredictor_;
+
+            //- Number of outer correctors
+            label nOuterCorr_;
+
+            //- Number of PISO-like correctors
+            label nCorr_;
+
+            //- Number of non-orthogonal correctors
+            label nNonOrthCorr_;
+
+            //- Cumulative continuity error
+            scalar cumulativeContErr_;
+
+
+        // Model parameters
+
+            //- Skin frition coefficient for film/primary region interface
+            scalar Cf_;
+
+            //- Stable film thickness - film cannot detach until this is reached
+            dimensionedScalar deltaStable_;
+
+
+        // Thermo properties
+
+            // Fields
+
+                //- Density / [kg/m3]
+                volScalarField rho_;
+
+                //- Dynamic viscosity / [Pa.s]
+                volScalarField mu_;
+
+                //- Surface tension / [m/s2]
+                volScalarField sigma_;
+
+
+        // Fields
+
+            //- Film thickness / [m]
+            volScalarField delta_;
+
+            //- Velocity - mean / [m/s]
+            volVectorField U_;
+
+            //- Velocity - surface / [m/s]
+            volVectorField Us_;
+
+            //- Velocity - wall / [m/s]
+            volVectorField Uw_;
+
+            //- Film thickness*density (helper field) / [kg/m2]
+            volScalarField deltaRho_;
+
+            //- Mass flux (includes film thickness) / [kg.m/s]
+            surfaceScalarField phi_;
+
+
+            // Transfer fields - to the primary region
+
+                //- Film mass available for transfer
+                volScalarField massForPrimary_;
+
+                //- Parcel diameters originating from film
+                volScalarField diametersForPrimary_;
+
+                //- Film mass evolved via phase change
+                volScalarField massPhaseChangeForPrimary_;
+
+
+        // Source term fields
+
+            // Film region - registered to the film region mesh
+            // Note: need boundary value mapped from primary region, and then
+            // pushed into the patch internal field
+
+                //- Momementum / [kg/m/s2]
+                volVectorField USp_;
+
+                //- Pressure / [Pa]
+                volScalarField pSp_;
+
+                //- Mass / [kg/m2/s]
+                volScalarField rhoSp_;
+
+
+            // Primary region - registered to the primary region mesh
+            // Internal use only - not read-in
+
+                //- Momementum / [kg/m/s2]
+                volVectorField USpPrimary_;
+
+                //- Pressure / [Pa]
+                volScalarField pSpPrimary_;
+
+                //- Mass / [kg/m2/s]
+                volScalarField rhoSpPrimary_;
+
+
+        // Fields mapped from primary region - registered to the film region
+        // Note: need both boundary AND patch internal fields to be mapped
+
+            //- Velocity / [m/s]
+            volVectorField UPrimary_;
+
+            //- Pressure / [Pa]
+            volScalarField pPrimary_;
+
+            //- Density / [kg/m3]
+            volScalarField rhoPrimary_;
+
+            //- Viscosity / [Pa.s]
+            volScalarField muPrimary_;
+
+
+        // Sub-models
+
+            //- Injection
+            autoPtr<injectionModel> injection_;
+
+
+       // Checks
+
+           //- Cumulative mass added via sources [kg]
+           scalar addedMassTotal_;
+
+
+       // Detached surface properties
+
+           //- Cumulative mass detached [kg]
+           scalar injectedMassTotal_;
+
+
+    // Protected member functions
+
+        //- Read control parameters from dictionary
+        virtual bool read();
+
+        //- Correct the thermo fields
+        virtual void correctThermoFields();
+
+        //- Reset source term fields
+        virtual void resetPrimaryRegionSourceTerms();
+
+        //- Transfer thermo fields from the primary region to the film region
+        virtual void transferPrimaryRegionThermoFields();
+
+        //- Transfer source fields from the primary region to the film region
+        virtual void transferPrimaryRegionSourceFields();
+
+        //- Correct the source terms for film that detaches from film region
+        virtual void correctDetachedFilm();
+
+        // Explicit pressure source contribution
+        virtual tmp<volScalarField> pu();
+
+        // Implicit pressure source coefficient
+        virtual tmp<volScalarField> pp();
+
+        //- Update the film sub-models
+        virtual void updateSubmodels();
+
+        //- Continuity check
+        virtual void continuityCheck();
+
+        //- Update film surface velocities
+        virtual void updateSurfaceVelocities();
+
+        //- Return the stress term for the momentum equation
+        virtual tmp<fvVectorMatrix> tau(volVectorField& dU) const;
+
+        //- Constrain a film region master/slave boundaries of a field to a
+        //  given value
+        template<class Type>
+        void constrainFilmField
+        (
+            Type& field,
+            const typename Type::cmptType& value
+        );
+
+
+        // Equations
+
+            //- Solve continuity equation
+            virtual void solveContinuity();
+
+            //- Solve for film velocity
+            virtual tmp<fvVectorMatrix> solveMomentum
+            (
+                const volScalarField& pu,
+                const volScalarField& pp
+            );
+
+            //- Solve coupled velocity-thickness equations
+            virtual void solveThickness
+            (
+                const volScalarField& pu,
+                const volScalarField& pp,
+                const fvVectorMatrix& UEqn
+            );
+
+
+public:
+
+    //- Runtime type information
+    TypeName("kinematicSingleLayer");
+
+
+    // Constructors
+
+        //- Construct from components
+        kinematicSingleLayer
+        (
+            const word& modelType,
+            const fvMesh& mesh,
+            const dimensionedVector& g,
+            const bool readFields = true
+        );
+
+
+    //- Destructor
+    virtual ~kinematicSingleLayer();
+
+
+    // Member Functions
+
+        // Solution parameters
+
+            //- Courant number evaluation
+            virtual scalar CourantNumber() const;
+
+            //- Return the momentum predictor
+            inline const Switch& momentumPredictor() const;
+
+            //- Return the number of outer correctors
+            inline label nOuterCorr() const;
+
+            //- Return the number of PISO correctors
+            inline label nCorr() const;
+
+            //- Return the number of non-orthogonal correctors
+            inline label nNonOrthCorr() const;
+
+
+        // Model parameters
+
+            //- Return the skin friction coefficient
+            inline scalar Cf() const;
+
+
+        // Thermo properties
+
+            //- Return const access to the dynamic viscosity / [Pa.s]
+            inline const volScalarField& mu() const;
+
+            //- Return const access to the surface tension / [m/s2]
+            inline const volScalarField& sigma() const;
+
+
+        // Fields
+
+            //- Return const access to the film thickness / [m]
+            inline const volScalarField& delta() const;
+
+            //- Return the film velocity [m/s]
+            virtual const volVectorField& U() const;
+
+            //- Return the film surface velocity [m/s]
+            virtual const volVectorField& Us() const;
+
+            //- Return the film wall velocity [m/s]
+            virtual const volVectorField& Uw() const;
+
+            //- Return the film density [kg/m3]
+            virtual const volScalarField& rho() const;
+
+            //- Return the film mean temperature [K]
+            virtual const volScalarField& T() const;
+
+            //- Return the film surface temperature [K]
+            virtual const volScalarField& Ts() const;
+
+            //- Return the film wall temperature [K]
+            virtual const volScalarField& Tw() const;
+
+            //- Return the film specific heat capacity [J/kg/K]
+            virtual const volScalarField& Cp() const;
+
+            //- Return the film thermal conductivity [W/m/K]
+            virtual const volScalarField& kappa() const;
+
+
+           // Transfer fields - to the primary region
+
+               //- Return the film mass available for transfer
+               virtual const volScalarField& massForPrimary() const;
+
+               //- Return the parcel diameters originating from film
+               virtual const volScalarField& diametersForPrimary() const;
+
+               //- Return the film mass evolved via phase change
+               virtual const volScalarField& massPhaseChangeForPrimary() const;
+
+
+        // External helper functions
+
+            //- External hook to add sources to the film
+            virtual void addSources
+            (
+                const label patchI,            // patchI on primary region
+                const label faceI,             // faceI of patchI
+                const scalar massSource,       // [kg]
+                const vector& momentumSource,  // [kg.m/s] (tangential momentum)
+                const scalar pressureSource,   // [kg.m/s] (normal momentum)
+                const scalar energySource = 0  // [J]
+            );
+
+
+         // Source fields (read/write access)
+
+            // Primary region
+
+                //- Momementum / [kg/m/s2]
+                inline volVectorField& USpPrimary();
+
+                //- Pressure / [Pa]
+                inline volScalarField& pSpPrimary();
+
+                //- Mass / [kg/m2/s]
+                inline volScalarField& rhoSpPrimary();
+
+
+            // Film region
+
+                //- Momentum / [kg/m/s2]
+                inline volVectorField& USp();
+
+                //- Pressure / [Pa]
+                inline volScalarField& pSp();
+
+                //- Mass / [kg/m2/s]
+                inline volScalarField& rhoSp();
+
+                //- Momentum / [kg/m/s2]
+                inline const volVectorField& USp() const;
+
+                //- Pressure / [Pa]
+                inline const volScalarField& pSp() const;
+
+                //- Mass / [kg/m2/s]
+                inline const volScalarField& rhoSp() const;
+
+
+        // Fields mapped from primary region
+
+            //- Velocity / [m/s]
+            inline const volVectorField& UPrimary() const;
+
+            //- Pressure / [Pa]
+            inline const volScalarField& pPrimary() const;
+
+            //- Density / [kg/m3]
+            inline const volScalarField& rhoPrimary() const;
+
+            //- Viscosity / [Pa.s]
+            inline const volScalarField& muPrimary() const;
+
+
+        // Sub-models
+
+            //- Injection
+            inline injectionModel& injection();
+
+
+        // Helper functions
+
+            //- Return the gravity tangential component contributions
+            inline tmp<volVectorField> gTan() const;
+
+            //- Return the gravity normal-to-patch component contribution
+            inline tmp<volScalarField> gNorm() const;
+
+            //- Return the gravity normal-to-patch component contribution
+            //  Clipped so that only non-zero if g & nHat_ < 0
+            inline tmp<volScalarField> gNormClipped() const;
+
+
+        // Evolution
+
+            //- Pre-evolve film hook
+            virtual void preEvolveRegion();
+
+            //- Evolve the film equations
+            virtual void evolveRegion();
+
+
+        // Source fields
+
+            // Mapped into primary region
+
+                //- Return total mass source - Eulerian phase only
+                virtual tmp<DimensionedField<scalar, volMesh> > Srho() const;
+
+                //- Return mass source for specie i - Eulerian phase only
+                virtual tmp<DimensionedField<scalar, volMesh> > Srho
+                (
+                    const label i
+                ) const;
+
+                //- Return enthalpy source - Eulerian phase only
+                virtual tmp<DimensionedField<scalar, volMesh> > Sh() const;
+
+
+       // I-O
+
+            //- Provide some feedback
+            virtual void info() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#   include "kinematicSingleLayerTemplates.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "kinematicSingleLayerI.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayerI.H b/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayerI.H
new file mode 100644
index 0000000000000000000000000000000000000000..a124ee95d4d989b87c92608ab85ac5a0a418d3d6
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayerI.H
@@ -0,0 +1,250 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "kinematicSingleLayer.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+inline const Switch& kinematicSingleLayer::momentumPredictor() const
+{
+    return momentumPredictor_;
+}
+
+
+inline label kinematicSingleLayer::nOuterCorr() const
+{
+    return nOuterCorr_;
+}
+
+
+inline label kinematicSingleLayer::nCorr() const
+{
+    return nCorr_;
+}
+
+
+inline label kinematicSingleLayer::nNonOrthCorr() const
+{
+    return nNonOrthCorr_;
+}
+
+
+inline scalar kinematicSingleLayer::Cf() const
+{
+    return Cf_;
+}
+
+
+inline const volScalarField& kinematicSingleLayer::mu() const
+{
+    return mu_;
+}
+
+
+inline const volScalarField& kinematicSingleLayer::sigma() const
+{
+    return sigma_;
+}
+
+
+inline const volScalarField& kinematicSingleLayer::delta() const
+{
+    return delta_;
+}
+
+
+inline volVectorField& kinematicSingleLayer::USpPrimary()
+{
+    return USpPrimary_;
+}
+
+
+inline volScalarField& kinematicSingleLayer::pSpPrimary()
+{
+    return pSpPrimary_;
+}
+
+
+inline volScalarField& kinematicSingleLayer::rhoSpPrimary()
+{
+    return rhoSpPrimary_;
+}
+
+
+inline volVectorField& kinematicSingleLayer::USp()
+{
+    return USp_;
+}
+
+
+inline volScalarField& kinematicSingleLayer::pSp()
+{
+    return pSp_;
+}
+
+
+inline volScalarField& kinematicSingleLayer::rhoSp()
+{
+    return rhoSp_;
+}
+
+
+inline const volVectorField& kinematicSingleLayer::USp() const
+{
+    return USp_;
+}
+
+
+inline const volScalarField& kinematicSingleLayer::pSp() const
+{
+    return pSp_;
+}
+
+
+inline const volScalarField& kinematicSingleLayer::rhoSp() const
+{
+    return rhoSp_;
+}
+
+
+inline const volVectorField& kinematicSingleLayer::UPrimary() const
+{
+    return UPrimary_;
+}
+
+
+inline const volScalarField& kinematicSingleLayer::pPrimary() const
+{
+    return pPrimary_;
+}
+
+
+inline const volScalarField& kinematicSingleLayer::rhoPrimary() const
+{
+    return rhoPrimary_;
+}
+
+
+inline const volScalarField& kinematicSingleLayer::muPrimary() const
+{
+    return muPrimary_;
+}
+
+
+inline injectionModel& kinematicSingleLayer::injection()
+{
+    return injection_();
+}
+
+
+inline tmp<volScalarField> kinematicSingleLayer::gNorm() const
+{
+    tmp<volScalarField> tgNorm
+    (
+        new volScalarField
+        (
+            IOobject
+            (
+                "gNorm",
+                time().timeName(),
+                regionMesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE
+            ),
+            g_ & nHat(),
+            zeroGradientFvPatchScalarField::typeName
+        )
+    );
+
+    return tgNorm;
+}
+
+
+inline tmp<volScalarField> kinematicSingleLayer::gNormClipped() const
+{
+    tmp<volScalarField> tgNormClipped
+    (
+        new volScalarField
+        (
+            IOobject
+            (
+                "gNormClipped",
+                time().timeName(),
+                regionMesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE
+            ),
+            g_ & nHat(),
+            zeroGradientFvPatchScalarField::typeName
+        )
+    );
+
+    volScalarField& gNormClipped = tgNormClipped();
+    gNormClipped.min(0.0);
+
+    return tgNormClipped;
+}
+
+
+inline tmp<volVectorField> kinematicSingleLayer::gTan() const
+{
+    tmp<volVectorField> tgTan
+    (
+        new volVectorField
+        (
+            IOobject
+            (
+                "gTan",
+                time().timeName(),
+                regionMesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE
+            ),
+            g_ - nHat()*gNorm(),
+            zeroGradientFvPatchVectorField::typeName
+        )
+    );
+
+    return tgTan;
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayerTemplates.C b/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayerTemplates.C
new file mode 100644
index 0000000000000000000000000000000000000000..d0657b782c172ee0ae31c0a15a6c056b36f1cbd9
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayerTemplates.C
@@ -0,0 +1,78 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "kinematicSingleLayer.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+template<class Type>
+void kinematicSingleLayer::constrainFilmField
+(
+    Type& field,
+    const typename Type::cmptType& value
+)
+{
+    forAll(intCoupledPatchIDs_, i)
+    {
+        label patchI = intCoupledPatchIDs_[i];
+        field.boundaryField()[patchI] = value;
+        if (debug)
+        {
+            Info<< "Constraining " << field.name()
+                << " boundary " << field.boundaryField()[patchI].patch().name()
+                << " to " << value << endl;
+        }
+    }
+    forAll(passivePatchIDs_, i)
+    {
+        label patchI = passivePatchIDs_[i];
+        field.boundaryField()[patchI] = value;
+        if (debug)
+        {
+            Info<< "Constraining " << field.name()
+                << " boundary " << field.boundaryField()[patchI].patch().name()
+                << " to " << value << endl;
+        }
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // end namespace Foam
+} // end namespace regionModels
+} // end namespace surfaceFilmModels
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/noFilm/noFilm.C b/src/regionModels/surfaceFilmModels/noFilm/noFilm.C
new file mode 100644
index 0000000000000000000000000000000000000000..cc7d7a7d08c723d55ed781739f1aa52f3f45d5aa
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/noFilm/noFilm.C
@@ -0,0 +1,291 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "noFilm.H"
+#include "addToRunTimeSelectionTable.H"
+#include "volFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(noFilm, 0);
+addToRunTimeSelectionTable(surfaceFilmModel, noFilm, mesh);
+
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+bool noFilm::read()
+{
+    if (surfaceFilmModel::read())
+    {
+        // no additional info to read
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+noFilm::noFilm
+(
+    const word&,
+    const fvMesh& mesh,
+    const dimensionedVector&
+)
+:
+    surfaceFilmModel(mesh)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+noFilm::~noFilm()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+void noFilm::addSources
+(
+    const label,
+    const label,
+    const scalar,
+    const vector&,
+    const scalar,
+    const scalar
+)
+{
+    // do nothing
+}
+
+
+const volScalarField& noFilm::delta() const
+{
+    FatalErrorIn("const volScalarField& noFilm::delta() const")
+        << "delta field not available for " << type() << abort(FatalError);
+
+    return volScalarField::null();
+}
+
+
+const volVectorField& noFilm::U() const
+{
+    FatalErrorIn("const volVectorField& noFilm::U() const")
+        << "U field not available for " << type() << abort(FatalError);
+
+    return volVectorField::null();
+}
+
+
+const volVectorField& noFilm::Us() const
+{
+    FatalErrorIn("const volVectorField& noFilm::Us() const")
+        << "Us field not available for " << type() << abort(FatalError);
+
+    return volVectorField::null();
+}
+
+
+const volVectorField& noFilm::Uw() const
+{
+    FatalErrorIn("const volVectorField& noFilm::Uw() const")
+        << "Uw field not available for " << type() << abort(FatalError);
+
+    return volVectorField::null();
+}
+
+
+const volScalarField& noFilm::rho() const
+{
+    FatalErrorIn("const volScalarField& noFilm::rho() const")
+        << "rho field not available for " << type() << abort(FatalError);
+
+    return volScalarField::null();
+}
+
+
+const volScalarField& noFilm::T() const
+{
+    FatalErrorIn("const volScalarField& noFilm::T() const")
+        << "T field not available for " << type() << abort(FatalError);
+
+    return volScalarField::null();
+}
+
+
+const volScalarField& noFilm::Ts() const
+{
+    FatalErrorIn("const volScalarField& noFilm::Ts() const")
+        << "Ts field not available for " << type() << abort(FatalError);
+
+    return volScalarField::null();
+}
+
+
+const volScalarField& noFilm::Tw() const
+{
+    FatalErrorIn("const volScalarField& noFilm::Tw() const")
+        << "Tw field not available for " << type() << abort(FatalError);
+
+    return volScalarField::null();
+}
+
+
+const volScalarField& noFilm::Cp() const
+{
+    FatalErrorIn("const volScalarField& noFilm::Cp() const")
+        << "Cp field not available for " << type() << abort(FatalError);
+
+    return volScalarField::null();
+}
+
+
+const volScalarField& noFilm::kappa() const
+{
+    FatalErrorIn("const volScalarField& noFilm::kappa() const")
+        << "kappa field not available for " << type() << abort(FatalError);
+
+    return volScalarField::null();
+}
+
+
+const volScalarField& noFilm::massForPrimary() const
+{
+    FatalErrorIn("const volScalarField& noFilm::massForPrimary() const")
+        << "massForPrimary field not available for " << type()
+        << abort(FatalError);
+
+    return volScalarField::null();
+}
+
+
+const volScalarField& noFilm::diametersForPrimary() const
+{
+    FatalErrorIn("const volScalarField& noFilm::diametersForPrimary() const")
+        << "diametersForPrimary field not available for " << type()
+        << abort(FatalError);
+
+    return volScalarField::null();
+}
+
+
+const volScalarField& noFilm::massPhaseChangeForPrimary() const
+{
+    FatalErrorIn
+    (
+        "const volScalarField& noFilm::massPhaseChangeForPrimary() const"
+    )   << "massPhaseChange field not available for " << type()
+        << abort(FatalError);
+
+    return volScalarField::null();
+}
+
+
+tmp<DimensionedField<scalar, volMesh> > noFilm::Srho() const
+{
+    return tmp<DimensionedField<scalar, volMesh> >
+    (
+        new DimensionedField<scalar, volMesh>
+        (
+            IOobject
+            (
+                "noFilm::Srho",
+                time().timeName(),
+                primaryMesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            primaryMesh(),
+            dimensionedScalar("zero", dimMass/dimVolume/dimTime, 0.0)
+        )
+    );
+}
+
+
+tmp<DimensionedField<scalar, volMesh> > noFilm::Srho(const label) const
+{
+    return tmp<DimensionedField<scalar, volMesh> >
+    (
+        new DimensionedField<scalar, volMesh>
+        (
+            IOobject
+            (
+                "noFilm::Srho(i)",
+                time().timeName(),
+                primaryMesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            primaryMesh(),
+            dimensionedScalar("zero", dimMass/dimVolume/dimTime, 0.0)
+        )
+    );
+}
+
+
+tmp<DimensionedField<scalar, volMesh> > noFilm::Sh() const
+{
+    return tmp<DimensionedField<scalar, volMesh> >
+    (
+        new DimensionedField<scalar, volMesh>
+        (
+            IOobject
+            (
+                "noFilm::Sh",
+                time().timeName(),
+                primaryMesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            primaryMesh(),
+            dimensionedScalar("zero", dimEnergy/dimVolume/dimTime, 0.0)
+        )
+    );
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/noFilm/noFilm.H b/src/regionModels/surfaceFilmModels/noFilm/noFilm.H
new file mode 100644
index 0000000000000000000000000000000000000000..dbbfdbff074ca93c9742bfae504bb080ffa4c1df
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/noFilm/noFilm.H
@@ -0,0 +1,187 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::noFilm
+
+Description
+    Dummy surface film model for 'none'
+
+SourceFiles
+    noFilm.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef noFilm_H
+#define noFilm_H
+
+#include "surfaceFilmModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+/*---------------------------------------------------------------------------*\
+                          Class noFilm Declaration
+\*---------------------------------------------------------------------------*/
+
+class noFilm
+:
+    public surfaceFilmModel
+{
+private:
+
+    // Private member functions
+
+        //- Disallow default bitwise copy construct
+        noFilm(const noFilm&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const noFilm&);
+
+
+protected:
+
+    // Protected member functions
+
+        //- Read control parameters from dictionary
+        virtual bool read();
+
+
+public:
+
+    //- Runtime type information
+    TypeName("none");
+
+
+    // Constructors
+
+        //- Construct from components
+        noFilm
+        (
+            const word& modelType,
+            const fvMesh& mesh,
+            const dimensionedVector& g
+        );
+
+
+    //- Destructor
+    virtual ~noFilm();
+
+
+    // Member Functions
+
+        // Access
+
+            //- External hook to add sources to the film
+            virtual void addSources
+            (
+                const label patchI,
+                const label faceI,
+                const scalar massSource,
+                const vector& momentumSource,
+                const scalar pressureSource,
+                const scalar energySource
+            );
+
+
+       // Fields
+
+           //- Return the film thickness [m]
+           virtual const volScalarField& delta() const;
+
+           //- Return the film velocity [m/s]
+           virtual const volVectorField& U() const;
+
+           //- Return the film density [kg/m3]
+           virtual const volScalarField& rho() const;
+
+           //- Return the film surface velocity [m/s]
+           virtual const volVectorField& Us() const;
+
+           //- Return the film wall velocity [m/s]
+           virtual const volVectorField& Uw() const;
+
+           //- Return the film mean temperature [K]
+           virtual const volScalarField& T() const;
+
+           //- Return the film surface temperature [K]
+           virtual const volScalarField& Ts() const;
+
+           //- Return the film wall temperature [K]
+           virtual const volScalarField& Tw() const;
+
+           //- Return the film specific heat capacity [J/kg/K]
+           virtual const volScalarField& Cp() const;
+
+           //- Return the film thermal conductivity [W/m/K]
+           virtual const volScalarField& kappa() const;
+
+
+           // Transfer fields - to the primary region
+
+               //- Return the film mass available for transfer
+               virtual const volScalarField& massForPrimary() const;
+
+               //- Return the parcel diameters originating from film
+               virtual const volScalarField& diametersForPrimary() const;
+
+               //- Return the film mass evolved via phase change
+               virtual const volScalarField& massPhaseChangeForPrimary() const;
+
+
+        // Source fields
+
+            // Mapped into primary region
+
+                //- Return total mass source - Eulerian phase only
+                virtual tmp<DimensionedField<scalar, volMesh> > Srho() const;
+
+                //- Return mass source for specie i - Eulerian phase only
+                virtual tmp<DimensionedField<scalar, volMesh> > Srho
+                (
+                    const label i
+                ) const;
+
+                //- Return enthalpy source - Eulerian phase only
+                virtual tmp<DimensionedField<scalar, volMesh> > Sh() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/cloudInjection/cloudInjection.C b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/cloudInjection/cloudInjection.C
new file mode 100644
index 0000000000000000000000000000000000000000..35cec1d716fbfc807e586578b10bf8c4389ebc4d
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/cloudInjection/cloudInjection.C
@@ -0,0 +1,118 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "cloudInjection.H"
+#include "addToRunTimeSelectionTable.H"
+#include "fvMesh.H"
+#include "Time.H"
+#include "mathematicalConstants.H"
+#include "Random.H"
+#include "volFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(cloudInjection, 0);
+addToRunTimeSelectionTable(injectionModel, cloudInjection, dictionary);
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+cloudInjection::cloudInjection
+(
+    const surfaceFilmModel& owner,
+    const dictionary& dict
+)
+:
+    injectionModel(type(), owner, dict),
+    particlesPerParcel_(readScalar(coeffs_.lookup("particlesPerParcel"))),
+    rndGen_(label(0), -1),
+    parcelPDF_(pdfs::pdf::New(coeffs_.subDict("parcelPDF"), rndGen_)),
+    diameter_(owner.regionMesh().nCells(), 0.0)
+{
+    forAll(diameter_, faceI)
+    {
+        diameter_[faceI] = parcelPDF_->sample();
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+cloudInjection::~cloudInjection()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+void cloudInjection::correct
+(
+    scalarField& massToInject,
+    scalarField& diameterToInject
+)
+{
+    const scalar pi = constant::mathematical::pi;
+    const scalarField& rhoFilm = owner().rho();
+
+    // Collect the data to be transferred
+    forAll(massToInject, cellI)
+    {
+        scalar rho = rhoFilm[cellI];
+        scalar diam = diameter_[cellI];
+        scalar minMass = particlesPerParcel_*rho*pi/6*pow3(diam);
+
+        if (massToInject[cellI] > minMass)
+        {
+            // All mass can be injected - set particle diameter
+            diameterToInject[cellI] = diameter_[cellI];
+
+            // Retrieve new particle diameter sample
+            diameter_[cellI] = parcelPDF_->sample();
+        }
+        else
+        {
+            // Mass below minimum threshold - cannot be injected
+            massToInject[cellI] = 0.0;
+            diameterToInject[cellI] = -1.0;
+        }
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/cloudInjection/cloudInjection.H b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/cloudInjection/cloudInjection.H
new file mode 100644
index 0000000000000000000000000000000000000000..860053078d4d017081cc6e0dcbd4efb88d8e510b
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/cloudInjection/cloudInjection.H
@@ -0,0 +1,126 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::cloudInjection
+
+Description
+    Cloud injection model
+
+SourceFiles
+    cloudInjection.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef cloudInjection_H
+#define cloudInjection_H
+
+#include "injectionModel.H"
+#include "pdf.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+/*---------------------------------------------------------------------------*\
+                        Class cloudInjection Declaration
+\*---------------------------------------------------------------------------*/
+
+class cloudInjection
+:
+    public injectionModel
+{
+private:
+
+    // Private member functions
+
+        //- Disallow default bitwise copy construct
+        cloudInjection(const cloudInjection&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const cloudInjection&);
+
+
+protected:
+
+    // Protected data
+
+        //- Number of particles per parcel
+        scalar particlesPerParcel_;
+
+        //- Random number generator
+        cachedRandom rndGen_;
+
+        //- Parcel size PDF model
+        const autoPtr<pdfs::pdf> parcelPDF_;
+
+        //- Diameters of particles to inject into the cloud
+        scalarList diameter_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("cloudInjection");
+
+
+    // Constructors
+
+        //- Construct from surface film model
+        cloudInjection(const surfaceFilmModel& owner, const dictionary& dict);
+
+
+    //- Destructor
+    virtual ~cloudInjection();
+
+
+    // Member Functions
+
+        // Evolution
+
+            //- Correct
+            virtual void correct
+            (
+                scalarField& massToInject,
+                scalarField& diameterToInject
+            );
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/injectionModel/injectionModel.C b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/injectionModel/injectionModel.C
new file mode 100644
index 0000000000000000000000000000000000000000..203c50f29c55164e15e3524b0bc7fd1a2e6a3f04
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/injectionModel/injectionModel.C
@@ -0,0 +1,74 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "injectionModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(injectionModel, 0);
+defineRunTimeSelectionTable(injectionModel, dictionary);
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+injectionModel::injectionModel(const surfaceFilmModel& owner)
+:
+    subModelBase(owner)
+{}
+
+
+injectionModel::injectionModel
+(
+    const word& type,
+    const surfaceFilmModel& owner,
+    const dictionary& dict
+)
+:
+    subModelBase(type, owner, dict)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+injectionModel::~injectionModel()
+{}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/injectionModel/injectionModel.H b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/injectionModel/injectionModel.H
new file mode 100644
index 0000000000000000000000000000000000000000..bdcf22e7c0a4a0a4bed1b6f07814f8e778355efd
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/injectionModel/injectionModel.H
@@ -0,0 +1,143 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::injectionModel
+
+Description
+    Base class for film injection models
+
+SourceFiles
+    injectionModel.C
+    injectionModelNew.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef injectionModel_H
+#define injectionModel_H
+
+#include "subModelBase.H"
+#include "runTimeSelectionTables.H"
+#include "scalarField.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+/*---------------------------------------------------------------------------*\
+                      Class injectionModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class injectionModel
+:
+    public subModelBase
+{
+private:
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        injectionModel(const injectionModel&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const injectionModel&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("injectionModel");
+
+
+    // Declare runtime constructor selection table
+
+         declareRunTimeSelectionTable
+         (
+             autoPtr,
+             injectionModel,
+             dictionary,
+             (
+                const surfaceFilmModel& owner,
+                const dictionary& dict
+             ),
+             (owner, dict)
+         );
+
+    // Constructors
+
+        //- Construct null
+        injectionModel(const surfaceFilmModel& owner);
+
+        //- Construct from type name, dictionary and surface film model
+        injectionModel
+        (
+            const word& type,
+            const surfaceFilmModel& owner,
+            const dictionary& dict
+        );
+
+
+    // Selectors
+
+        //- Return a reference to the selected injection model
+        static autoPtr<injectionModel> New
+        (
+            const surfaceFilmModel& owner,
+            const dictionary& dict
+        );
+
+
+    //- Destructor
+    virtual ~injectionModel();
+
+
+    // Member Functions
+
+        // Evolution
+
+            //- Correct
+            virtual void correct
+            (
+                scalarField& massToInject,
+                scalarField& diameterToInject
+            ) = 0;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/injectionModel/injectionModelNew.C b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/injectionModel/injectionModelNew.C
new file mode 100644
index 0000000000000000000000000000000000000000..7164d1edb01d49c2a203f3e517a3d995c20e9b1b
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/injectionModel/injectionModelNew.C
@@ -0,0 +1,74 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "injectionModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * //
+
+autoPtr<injectionModel> injectionModel::New
+(
+    const surfaceFilmModel& model,
+    const dictionary& dict
+)
+{
+    word modelType(dict.lookup("injectionModel"));
+
+    Info<< "    Selecting injectionModel " << modelType << endl;
+
+    dictionaryConstructorTable::iterator cstrIter =
+        dictionaryConstructorTablePtr_->find(modelType);
+
+    if (cstrIter == dictionaryConstructorTablePtr_->end())
+    {
+        FatalErrorIn
+        (
+            "injectionModel::New(const surfaceFilmModel&, const dictionary&)"
+        )   << "Unknown injectionModel type " << modelType
+            << nl << nl << "Valid injectionModel types are:" << nl
+            << dictionaryConstructorTablePtr_->toc()
+            << exit(FatalError);
+    }
+
+    return autoPtr<injectionModel>(cstrIter()(model, dict));
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/noInjection/noInjection.C b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/noInjection/noInjection.C
new file mode 100644
index 0000000000000000000000000000000000000000..552483004c9852bdda90afcdb04dd5734b8d275a
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/noInjection/noInjection.C
@@ -0,0 +1,81 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "noInjection.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(noInjection, 0);
+addToRunTimeSelectionTable(injectionModel, noInjection, dictionary);
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+noInjection::noInjection
+(
+    const surfaceFilmModel& owner,
+    const dictionary&
+)
+:
+    injectionModel(owner)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+noInjection::~noInjection()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+void noInjection::correct
+(
+    scalarField& massToInject,
+    scalarField& diameterToInject
+)
+{
+    // no mass injected
+    massToInject = 0.0;
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/noInjection/noInjection.H b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/noInjection/noInjection.H
new file mode 100644
index 0000000000000000000000000000000000000000..aca548d35042ea959575a2059a744047fd1a97f5
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/noInjection/noInjection.H
@@ -0,0 +1,108 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::noInjection
+
+Description
+    Dummy injection model for 'none'
+
+SourceFiles
+    noInjection.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef noInjection_H
+#define noInjection_H
+
+#include "injectionModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+/*---------------------------------------------------------------------------*\
+                        Class noInjection Declaration
+\*---------------------------------------------------------------------------*/
+
+class noInjection
+:
+    public injectionModel
+{
+private:
+
+    // Private member functions
+
+        //- Disallow default bitwise copy construct
+        noInjection(const noInjection&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const noInjection&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("none");
+
+
+    // Constructors
+
+        //- Construct from surface film model
+        noInjection(const surfaceFilmModel& owner, const dictionary& dict);
+
+
+    //- Destructor
+    virtual ~noInjection();
+
+
+    // Member Functions
+
+        // Evolution
+
+            //- Correct
+            virtual void correct
+            (
+                scalarField& massToInject,
+                scalarField& diameterToInject
+            );
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/removeInjection/removeInjection.C b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/removeInjection/removeInjection.C
new file mode 100644
index 0000000000000000000000000000000000000000..14f32b7f2ff67f64dba1fe1db4a713b93f0efb85
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/removeInjection/removeInjection.C
@@ -0,0 +1,80 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "removeInjection.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(removeInjection, 0);
+addToRunTimeSelectionTable(injectionModel, removeInjection, dictionary);
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+removeInjection::removeInjection
+(
+    const surfaceFilmModel& owner,
+    const dictionary&
+)
+:
+    injectionModel(owner)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+removeInjection::~removeInjection()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+void removeInjection::correct
+(
+    scalarField&,
+    scalarField&
+)
+{
+    // do nothing - all mass available to be removed
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/removeInjection/removeInjection.H b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/removeInjection/removeInjection.H
new file mode 100644
index 0000000000000000000000000000000000000000..bb4a0c2b948b6c87ea59f39bb3b50423eabc9123
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/removeInjection/removeInjection.H
@@ -0,0 +1,108 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::removeInjection
+
+Description
+    All mass available to be removed from the system is removed.
+
+SourceFiles
+    removeInjection.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef removeInjection_H
+#define removeInjection_H
+
+#include "injectionModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+/*---------------------------------------------------------------------------*\
+                      Class removeInjection Declaration
+\*---------------------------------------------------------------------------*/
+
+class removeInjection
+:
+    public injectionModel
+{
+private:
+
+    // Private member functions
+
+        //- Disallow default bitwise copy construct
+        removeInjection(const removeInjection&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const removeInjection&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("removeInjection");
+
+
+    // Constructors
+
+        //- Construct from surface film model
+        removeInjection(const surfaceFilmModel& owner, const dictionary& dict);
+
+
+    //- Destructor
+    virtual ~removeInjection();
+
+
+    // Member Functions
+
+        // Evolution
+
+            //- Correct
+            virtual void correct
+            (
+                scalarField& massToInject,
+                scalarField& diameterToInject
+            );
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/subModelBase.C b/src/regionModels/surfaceFilmModels/submodels/subModelBase.C
new file mode 100644
index 0000000000000000000000000000000000000000..6314f4a02ae61c9d297456d413870545a37ec659
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/subModelBase.C
@@ -0,0 +1,71 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "subModelBase.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+subModelBase::subModelBase(const surfaceFilmModel& owner)
+:
+    owner_(owner),
+    coeffs_(dictionary::null)
+{}
+
+
+subModelBase::subModelBase
+(
+    const word& type,
+    const surfaceFilmModel& owner,
+    const dictionary& dict
+)
+:
+    owner_(owner),
+    coeffs_(dict.subDict(type + "Coeffs"))
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+subModelBase::~subModelBase()
+{}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/subModelBase.H b/src/regionModels/surfaceFilmModels/submodels/subModelBase.H
new file mode 100644
index 0000000000000000000000000000000000000000..d04889a0e1c017a584585943fcf6dd7c75f5ef09
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/subModelBase.H
@@ -0,0 +1,125 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::subModelBase
+
+Description
+    Base class for surface film sub-models
+
+SourceFiles
+    subModelBaseI.H
+    subModelBase.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef subModelBase_H
+#define subModelBase_H
+
+#include "surfaceFilmModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+/*---------------------------------------------------------------------------*\
+                      Class subModelBase Declaration
+\*---------------------------------------------------------------------------*/
+
+class subModelBase
+{
+private:
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        subModelBase(const subModelBase&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const subModelBase&);
+
+
+protected:
+
+    // Protected data
+
+        //- Reference to the owner surface film model
+        const surfaceFilmModel& owner_;
+
+        //- Model coefficients dictionary
+        dictionary coeffs_;
+
+
+public:
+
+    // Constructors
+
+        //- Construct null
+        subModelBase(const surfaceFilmModel& owner);
+
+        //- Construct from type name, dictionary and surface film model
+        subModelBase
+        (
+            const word& type,
+            const surfaceFilmModel& owner,
+            const dictionary& dict
+        );
+
+
+    //- Destructor
+    virtual ~subModelBase();
+
+
+    // Member Functions
+
+        // Access
+
+            //- Return the reference to the owner surface film model
+            inline const surfaceFilmModel& owner() const;
+
+            //- Return the model coefficients dictionary
+            inline const dictionary& coeffs() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "subModelBaseI.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/subModelBaseI.H b/src/regionModels/surfaceFilmModels/submodels/subModelBaseI.H
new file mode 100644
index 0000000000000000000000000000000000000000..19671efe0ad25875fa5270927422a232a7c55c96
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/subModelBaseI.H
@@ -0,0 +1,58 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "subModelBase.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+inline const surfaceFilmModel& subModelBase::owner() const
+{
+    return owner_;
+}
+
+
+inline const dictionary& subModelBase::coeffs() const
+{
+    return coeffs_;
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/thermo/filmRadiationModel/filmRadiationModel/filmRadiationModel.C b/src/regionModels/surfaceFilmModels/submodels/thermo/filmRadiationModel/filmRadiationModel/filmRadiationModel.C
new file mode 100644
index 0000000000000000000000000000000000000000..92c6c2dc4bf683d6d9e113bd8ac3e5cf3b980551
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/thermo/filmRadiationModel/filmRadiationModel/filmRadiationModel.C
@@ -0,0 +1,77 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "filmRadiationModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(filmRadiationModel, 0);
+defineRunTimeSelectionTable(filmRadiationModel, dictionary);
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+filmRadiationModel::filmRadiationModel
+(
+    const surfaceFilmModel& owner
+)
+:
+    subModelBase(owner)
+{}
+
+
+filmRadiationModel::filmRadiationModel
+(
+    const word& type,
+    const surfaceFilmModel& owner,
+    const dictionary& dict
+)
+:
+    subModelBase(type, owner, dict)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+filmRadiationModel::~filmRadiationModel()
+{}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/thermo/filmRadiationModel/filmRadiationModel/filmRadiationModel.H b/src/regionModels/surfaceFilmModels/submodels/thermo/filmRadiationModel/filmRadiationModel/filmRadiationModel.H
new file mode 100644
index 0000000000000000000000000000000000000000..65b0dc63312805a956fd2f3a52443fecd38b395c
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/thermo/filmRadiationModel/filmRadiationModel/filmRadiationModel.H
@@ -0,0 +1,141 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::filmRadiationModel
+
+Description
+    Base class for film radiation models
+
+SourceFiles
+    filmRadiationModel.C
+    filmRadiationModelNew.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef filmRadiationModel_H
+#define filmRadiationModel_H
+
+#include "subModelBase.H"
+#include "runTimeSelectionTables.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+/*---------------------------------------------------------------------------*\
+                    Class filmRadiationModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class filmRadiationModel
+:
+    public subModelBase
+{
+private:
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        filmRadiationModel(const filmRadiationModel&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const filmRadiationModel&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("radiationModel");
+
+
+    // Declare runtime constructor selection table
+
+         declareRunTimeSelectionTable
+         (
+             autoPtr,
+             filmRadiationModel,
+             dictionary,
+             (
+                 const surfaceFilmModel& owner,
+                 const dictionary& dict
+             ),
+             (owner, dict)
+         );
+
+    // Constructors
+
+        //- Construct null
+        filmRadiationModel(const surfaceFilmModel& owner);
+
+        //- Construct from type name, dictionary and surface film model
+        filmRadiationModel
+        (
+            const word& type,
+            const surfaceFilmModel& owner,
+            const dictionary& dict
+        );
+
+
+    // Selectors
+
+        //- Return a reference to the selected phase change model
+        static autoPtr<filmRadiationModel> New
+        (
+            const surfaceFilmModel& owner,
+            const dictionary& dict
+        );
+
+
+    //- Destructor
+    virtual ~filmRadiationModel();
+
+
+    // Member Functions
+
+        // Evolution
+
+            //- Correct
+            virtual void correct() = 0;
+
+            //- Return the radiation sensible enthalpy source
+            virtual tmp<volScalarField> Shs() = 0;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/thermo/filmRadiationModel/filmRadiationModel/filmRadiationModelNew.C b/src/regionModels/surfaceFilmModels/submodels/thermo/filmRadiationModel/filmRadiationModel/filmRadiationModelNew.C
new file mode 100644
index 0000000000000000000000000000000000000000..2be8e977fbaa00ced90942560334260613a0f964
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/thermo/filmRadiationModel/filmRadiationModel/filmRadiationModelNew.C
@@ -0,0 +1,78 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "filmRadiationModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * //
+
+autoPtr<filmRadiationModel> filmRadiationModel::New
+(
+    const surfaceFilmModel& model,
+    const dictionary& dict
+)
+{
+    word modelType(dict.lookup("radiationModel"));
+
+    Info<< "    Selecting radiationModel " << modelType << endl;
+
+    dictionaryConstructorTable::iterator cstrIter =
+        dictionaryConstructorTablePtr_->find(modelType);
+
+    if (cstrIter == dictionaryConstructorTablePtr_->end())
+    {
+        FatalErrorIn
+        (
+            "filmRadiationModel::New"
+            "("
+                "const surfaceFilmModel&, "
+                "const dictionary&"
+            ")"
+        )   << "Unknown radiationModel type " << modelType << nl << nl
+            << "Valid filmRadiationModel types are:" << nl
+            << dictionaryConstructorTablePtr_->toc()
+            << exit(FatalError);
+    }
+
+    return autoPtr<filmRadiationModel>(cstrIter()(model, dict));
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/thermo/filmRadiationModel/noRadiation/noRadiation.C b/src/regionModels/surfaceFilmModels/submodels/thermo/filmRadiationModel/noRadiation/noRadiation.C
new file mode 100644
index 0000000000000000000000000000000000000000..85c86e4d4a2166670ef8c4a2e6e2299a85b59916
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/thermo/filmRadiationModel/noRadiation/noRadiation.C
@@ -0,0 +1,106 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "noRadiation.H"
+#include "volFields.H"
+#include "addToRunTimeSelectionTable.H"
+#include "zeroGradientFvPatchFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(noRadiation, 0);
+
+addToRunTimeSelectionTable
+(
+    filmRadiationModel,
+    noRadiation,
+    dictionary
+);
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+noRadiation::noRadiation
+(
+    const surfaceFilmModel& owner,
+    const dictionary& dict
+)
+:
+    filmRadiationModel(owner)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+noRadiation::~noRadiation()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+void noRadiation::correct()
+{
+    // do nothing
+}
+
+
+tmp<volScalarField> noRadiation::Shs()
+{
+    return tmp<volScalarField>
+    (
+        new volScalarField
+        (
+            IOobject
+            (
+                typeName + "::Shs",
+                owner().time().timeName(),
+                owner().regionMesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE
+            ),
+            owner().regionMesh(),
+            dimensionedScalar("zero", dimMass/pow3(dimTime), 0.0),
+            zeroGradientFvPatchScalarField::typeName
+        )
+    );
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/thermo/filmRadiationModel/noRadiation/noRadiation.H b/src/regionModels/surfaceFilmModels/submodels/thermo/filmRadiationModel/noRadiation/noRadiation.H
new file mode 100644
index 0000000000000000000000000000000000000000..d6b5749a8ff2363b8f86305a3fdd8e99fb142d80
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/thermo/filmRadiationModel/noRadiation/noRadiation.H
@@ -0,0 +1,112 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::noRadiation
+
+Description
+    Dummy radiation model for 'none' option
+
+SourceFiles
+    noRadiation.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef noRadiation_H
+#define noRadiation_H
+
+#include "filmRadiationModel.H"
+#include "volFieldsFwd.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+/*---------------------------------------------------------------------------*\
+                         Class noRadiation Declaration
+\*---------------------------------------------------------------------------*/
+
+class noRadiation
+:
+    public filmRadiationModel
+{
+private:
+
+    // Private member functions
+
+        //- Disallow default bitwise copy construct
+        noRadiation(const noRadiation&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const noRadiation&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("none");
+
+
+    // Constructors
+
+        //- Construct from surface film model and dictionary
+        noRadiation
+        (
+            const surfaceFilmModel& owner,
+            const dictionary& dict
+        );
+
+
+    //- Destructor
+    virtual ~noRadiation();
+
+
+    // Member Functions
+
+        // Evolution
+
+            //- Correct
+            virtual void correct();
+
+            //- Return the radiation sensible enthalpy source
+            virtual tmp<volScalarField> Shs();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/thermo/filmRadiationModel/standardRadiation/standardRadiation.C b/src/regionModels/surfaceFilmModels/submodels/thermo/filmRadiationModel/standardRadiation/standardRadiation.C
new file mode 100644
index 0000000000000000000000000000000000000000..76db3d70abe4ced82eaa9a842f0a5c866750b62d
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/thermo/filmRadiationModel/standardRadiation/standardRadiation.C
@@ -0,0 +1,151 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "standardRadiation.H"
+#include "volFields.H"
+#include "addToRunTimeSelectionTable.H"
+#include "zeroGradientFvPatchFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(standardRadiation, 0);
+
+addToRunTimeSelectionTable
+(
+    filmRadiationModel,
+    standardRadiation,
+    dictionary
+);
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+standardRadiation::standardRadiation
+(
+    const surfaceFilmModel& owner,
+    const dictionary& dict
+)
+:
+    filmRadiationModel(typeName, owner, dict),
+    QrPrimary_
+    (
+        IOobject
+        (
+            "Qr", // same name as Qr on primary region to enable mapping
+            owner.time().timeName(),
+            owner.regionMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        owner.regionMesh(),
+        dimensionedScalar("zero", dimMass/pow3(dimTime), 0.0),
+        owner.mappedPushedFieldPatchTypes<scalar>()
+    ),
+    QrNet_
+    (
+        IOobject
+        (
+            "QrNet",
+            owner.time().timeName(),
+            owner.regionMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        owner.regionMesh(),
+        dimensionedScalar("zero", dimMass/pow3(dimTime), 0.0),
+        zeroGradientFvPatchScalarField::typeName
+    ),
+    delta_(owner.delta()),
+    deltaMin_(readScalar(coeffs_.lookup("deltaMin"))),
+    beta_(readScalar(coeffs_.lookup("beta"))),
+    kappaBar_(readScalar(coeffs_.lookup("kappaBar")))
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+standardRadiation::~standardRadiation()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+void standardRadiation::correct()
+{
+    // Transfer Qr from primary region
+    QrPrimary_.correctBoundaryConditions();
+}
+
+
+tmp<volScalarField> standardRadiation::Shs()
+{
+    tmp<volScalarField> tShs
+    (
+        new volScalarField
+        (
+            IOobject
+            (
+                typeName + "::Shs",
+                owner().time().timeName(),
+                owner().regionMesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE
+            ),
+            owner().regionMesh(),
+            dimensionedScalar("zero", dimMass/pow3(dimTime), 0.0),
+            zeroGradientFvPatchScalarField::typeName
+        )
+    );
+
+    scalarField& Shs = tShs();
+    const scalarField& QrP = QrPrimary_.internalField();
+    const scalarField& delta = delta_.internalField();
+
+    Shs = beta_*(QrP*pos(delta - deltaMin_))*(1.0 - exp(-kappaBar_*delta));
+
+    // Update net Qr on local region
+    QrNet_.internalField() = QrP - Shs;
+    QrNet_.correctBoundaryConditions();
+
+    return tShs;
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/thermo/filmRadiationModel/standardRadiation/standardRadiation.H b/src/regionModels/surfaceFilmModels/submodels/thermo/filmRadiationModel/standardRadiation/standardRadiation.H
new file mode 100644
index 0000000000000000000000000000000000000000..1205625bd8c9b47cf3fcb5b029257538c50e9053
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/thermo/filmRadiationModel/standardRadiation/standardRadiation.H
@@ -0,0 +1,137 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::standardRadiation
+
+Description
+    Standard radiation model
+
+SourceFiles
+    standardRadiation.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef standardRadiation_H
+#define standardRadiation_H
+
+#include "filmRadiationModel.H"
+#include "volFieldsFwd.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+/*---------------------------------------------------------------------------*\
+                     Class standardRadiation Declaration
+\*---------------------------------------------------------------------------*/
+
+class standardRadiation
+:
+    public filmRadiationModel
+{
+private:
+
+    // Private data
+
+        //- Radiative flux mapped from  the primary region / [kg/s3]
+        volScalarField QrPrimary_;
+
+        //- Remaining radiative flux after removing local contribution
+        volScalarField QrNet_;
+
+        //- Reference to the film thickness field / [m]
+        const volScalarField& delta_;
+
+
+        // Model coefficients
+
+            //- Minimum thickness to apply radiation model
+            scalar deltaMin_;
+
+            //- Beta coefficient
+            scalar beta_;
+
+            //- Bar(kappa) coefficient
+            scalar kappaBar_;
+
+
+    // Private member functions
+
+        //- Disallow default bitwise copy construct
+        standardRadiation(const standardRadiation&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const standardRadiation&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("standardRadiation");
+
+
+    // Constructors
+
+        //- Construct from surface film model and dictionary
+        standardRadiation
+        (
+            const surfaceFilmModel& owner,
+            const dictionary& dict
+        );
+
+
+    //- Destructor
+    virtual ~standardRadiation();
+
+
+    // Member Functions
+
+        // Evolution
+
+            //- Correct
+            virtual void correct();
+
+            //- Return the radiation sensible enthalpy source
+            //  Also updates QrNet
+            virtual tmp<volScalarField> Shs();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/thermo/heatTransferModel/constantHeatTransfer/constantHeatTransfer.C b/src/regionModels/surfaceFilmModels/submodels/thermo/heatTransferModel/constantHeatTransfer/constantHeatTransfer.C
new file mode 100644
index 0000000000000000000000000000000000000000..5c09db40b720e698f82c22f2334bb4cead747e7e
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/thermo/heatTransferModel/constantHeatTransfer/constantHeatTransfer.C
@@ -0,0 +1,113 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "constantHeatTransfer.H"
+#include "volFields.H"
+#include "addToRunTimeSelectionTable.H"
+#include "zeroGradientFvPatchFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(constantHeatTransfer, 0);
+
+addToRunTimeSelectionTable
+(
+    heatTransferModel,
+    constantHeatTransfer,
+    dictionary
+);
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+constantHeatTransfer::constantHeatTransfer
+(
+    const surfaceFilmModel& owner,
+    const dictionary& dict
+)
+:
+    heatTransferModel(typeName, owner, dict),
+    c0_(readScalar(coeffs_.lookup("c0")))
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+constantHeatTransfer::~constantHeatTransfer()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+void constantHeatTransfer::correct()
+{
+    // do nothing
+}
+
+
+tmp<volScalarField> constantHeatTransfer::h() const
+{
+    return tmp<volScalarField>
+    (
+        new volScalarField
+        (
+            IOobject
+            (
+                "htc",
+                owner_.time().timeName(),
+                owner_.regionMesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            owner_.regionMesh(),
+            dimensionedScalar
+            (
+                "c0",
+                dimEnergy/dimTime/sqr(dimLength)/dimTemperature,
+                c0_
+            ),
+            zeroGradientFvPatchScalarField::typeName
+        )
+    );
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/thermo/heatTransferModel/constantHeatTransfer/constantHeatTransfer.H b/src/regionModels/surfaceFilmModels/submodels/thermo/heatTransferModel/constantHeatTransfer/constantHeatTransfer.H
new file mode 100644
index 0000000000000000000000000000000000000000..58f11359000f86f68a96e439b6f93748e68444a0
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/thermo/heatTransferModel/constantHeatTransfer/constantHeatTransfer.H
@@ -0,0 +1,118 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::constantHeatTransfer
+
+Description
+    Constant heat transfer model
+
+SourceFiles
+    constantHeatTransfer.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef constantHeatTransfer_H
+#define constantHeatTransfer_H
+
+#include "heatTransferModel.H"
+#include "volFieldsFwd.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+/*---------------------------------------------------------------------------*\
+                        Class constantHeatTransfer Declaration
+\*---------------------------------------------------------------------------*/
+
+class constantHeatTransfer
+:
+    public heatTransferModel
+{
+private:
+
+    // Private data
+
+        //- Constant heat transfer coefficient [W/m2/K]
+        scalar c0_;
+
+
+    // Private member functions
+
+        //- Disallow default bitwise copy construct
+        constantHeatTransfer(const constantHeatTransfer&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const constantHeatTransfer&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("constant");
+
+
+    // Constructors
+
+        //- Construct from surface film model and dictionary
+        constantHeatTransfer
+        (
+            const surfaceFilmModel& owner,
+            const dictionary& dict
+        );
+
+
+    //- Destructor
+    virtual ~constantHeatTransfer();
+
+
+    // Member Functions
+
+        // Evolution
+
+            //- Correct
+            virtual void correct();
+
+            //- Return the heat transfer coefficient [W/m2/K]
+            virtual tmp<volScalarField> h() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/thermo/heatTransferModel/heatTransferModel/heatTransferModel.C b/src/regionModels/surfaceFilmModels/submodels/thermo/heatTransferModel/heatTransferModel/heatTransferModel.C
new file mode 100644
index 0000000000000000000000000000000000000000..bb10591baee67fe2f8d3e4a0626dbf5119b5d6f7
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/thermo/heatTransferModel/heatTransferModel/heatTransferModel.C
@@ -0,0 +1,77 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "heatTransferModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(heatTransferModel, 0);
+defineRunTimeSelectionTable(heatTransferModel, dictionary);
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+heatTransferModel::heatTransferModel
+(
+    const surfaceFilmModel& owner
+)
+:
+    subModelBase(owner)
+{}
+
+
+heatTransferModel::heatTransferModel
+(
+    const word& type,
+    const surfaceFilmModel& owner,
+    const dictionary& dict
+)
+:
+    subModelBase(type, owner, dict)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+heatTransferModel::~heatTransferModel()
+{}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/thermo/heatTransferModel/heatTransferModel/heatTransferModel.H b/src/regionModels/surfaceFilmModels/submodels/thermo/heatTransferModel/heatTransferModel/heatTransferModel.H
new file mode 100644
index 0000000000000000000000000000000000000000..38ea73e229238eb809a6a2a9a5119ffe8898d80c
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/thermo/heatTransferModel/heatTransferModel/heatTransferModel.H
@@ -0,0 +1,141 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::heatTransferModel
+
+Description
+    Base class for film heat transfer models
+
+SourceFiles
+    heatTransferModel.C
+    heatTransferModelNew.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef heatTransferModel_H
+#define heatTransferModel_H
+
+#include "subModelBase.H"
+#include "runTimeSelectionTables.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+/*---------------------------------------------------------------------------*\
+                      Class heatTransferModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class heatTransferModel
+:
+    public subModelBase
+{
+private:
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        heatTransferModel(const heatTransferModel&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const heatTransferModel&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("heatTransferModel");
+
+
+    // Declare runtime constructor selection table
+
+         declareRunTimeSelectionTable
+         (
+             autoPtr,
+             heatTransferModel,
+             dictionary,
+             (
+                 const surfaceFilmModel& owner,
+                 const dictionary& dict
+             ),
+             (owner, dict)
+         );
+
+    // Constructors
+
+        //- Construct null
+        heatTransferModel(const surfaceFilmModel& owner);
+
+        //- Construct from type name, dictionary and surface film model
+        heatTransferModel
+        (
+            const word& type,
+            const surfaceFilmModel& owner,
+            const dictionary& dict
+        );
+
+
+    // Selectors
+
+        //- Return a reference to the selected phase change model
+        static autoPtr<heatTransferModel> New
+        (
+            const surfaceFilmModel& owner,
+            const dictionary& dict
+        );
+
+
+    //- Destructor
+    virtual ~heatTransferModel();
+
+
+    // Member Functions
+
+        // Evolution
+
+            //- Correct
+            virtual void correct() = 0;
+
+            //- Return the heat transfer coefficient [W/m2/K]
+            virtual tmp<volScalarField> h() const = 0;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/thermo/heatTransferModel/heatTransferModel/heatTransferModelNew.C b/src/regionModels/surfaceFilmModels/submodels/thermo/heatTransferModel/heatTransferModel/heatTransferModelNew.C
new file mode 100644
index 0000000000000000000000000000000000000000..c4422a75572f5db45a046573535d90ef10347fd6
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/thermo/heatTransferModel/heatTransferModel/heatTransferModelNew.C
@@ -0,0 +1,74 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "heatTransferModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * //
+
+autoPtr<heatTransferModel> heatTransferModel::New
+(
+    const surfaceFilmModel& model,
+    const dictionary& dict
+)
+{
+    word modelType(dict.lookup("heatTransferModel"));
+
+    Info<< "    Selecting heatTransferModel " << modelType << endl;
+
+    dictionaryConstructorTable::iterator cstrIter =
+        dictionaryConstructorTablePtr_->find(modelType);
+
+    if (cstrIter == dictionaryConstructorTablePtr_->end())
+    {
+        FatalErrorIn
+        (
+            "heatTransferModel::New(const surfaceFilmModel&, const dictionary&)"
+        )   << "Unknown heatTransferModel type " << modelType << nl << nl
+            << "Valid heatTransferModel types are:" << nl
+            << dictionaryConstructorTablePtr_->toc()
+            << exit(FatalError);
+    }
+
+    return autoPtr<heatTransferModel>(cstrIter()(model, dict));
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/thermo/heatTransferModel/mappedConvectiveHeatTransfer/mappedConvectiveHeatTransfer.C b/src/regionModels/surfaceFilmModels/submodels/thermo/heatTransferModel/mappedConvectiveHeatTransfer/mappedConvectiveHeatTransfer.C
new file mode 100644
index 0000000000000000000000000000000000000000..262b9d331367f178e0dca9f1e3475bc4707e6df0
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/thermo/heatTransferModel/mappedConvectiveHeatTransfer/mappedConvectiveHeatTransfer.C
@@ -0,0 +1,126 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "mappedConvectiveHeatTransfer.H"
+#include "zeroGradientFvPatchFields.H"
+#include "addToRunTimeSelectionTable.H"
+#include "kinematicSingleLayer.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(mappedConvectiveHeatTransfer, 0);
+
+addToRunTimeSelectionTable
+(
+    heatTransferModel,
+    mappedConvectiveHeatTransfer,
+    dictionary
+);
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+mappedConvectiveHeatTransfer::mappedConvectiveHeatTransfer
+(
+    const surfaceFilmModel& owner,
+    const dictionary& dict
+)
+:
+    heatTransferModel(owner),
+    htcConvPrimary_
+    (
+        IOobject
+        (
+            "htcConv",
+            owner.time().timeName(),
+            owner.primaryMesh(),
+            IOobject::MUST_READ,
+            IOobject::AUTO_WRITE
+        ),
+        owner.primaryMesh()
+    ),
+    htcConvFilm_
+    (
+        IOobject
+        (
+            htcConvPrimary_.name(), // must have same name as above for mapping
+            owner.time().timeName(),
+            owner.regionMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        owner.regionMesh(),
+        dimensionedScalar("zero", dimMass/pow3(dimTime)/dimTemperature, 0.0),
+        refCast<const kinematicSingleLayer>(owner).pSp().boundaryField().types()
+    )
+{
+    // Update the primary-side convective heat transfer coefficient
+    htcConvPrimary_.correctBoundaryConditions();
+
+    // Pull the data from the primary region via direct mapped BCs
+    htcConvFilm_.correctBoundaryConditions();
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+mappedConvectiveHeatTransfer::~mappedConvectiveHeatTransfer()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+void mappedConvectiveHeatTransfer::correct()
+{
+    // Update the primary-side convective heat transfer coefficient
+    htcConvPrimary_.correctBoundaryConditions();
+
+    // Pull the data from the primary region via direct mapped BCs
+    htcConvFilm_.correctBoundaryConditions();
+}
+
+
+tmp<volScalarField> mappedConvectiveHeatTransfer::h() const
+{
+    return htcConvFilm_;
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/thermo/heatTransferModel/mappedConvectiveHeatTransfer/mappedConvectiveHeatTransfer.H b/src/regionModels/surfaceFilmModels/submodels/thermo/heatTransferModel/mappedConvectiveHeatTransfer/mappedConvectiveHeatTransfer.H
new file mode 100644
index 0000000000000000000000000000000000000000..a6583a79c3da8a6d98b681e318aefca6f604ec80
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/thermo/heatTransferModel/mappedConvectiveHeatTransfer/mappedConvectiveHeatTransfer.H
@@ -0,0 +1,124 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::mappedConvectiveHeatTransfer
+
+Description
+    Convective heat transfer model based on a re-working of a Nusselt number
+    correlation
+
+SourceFiles
+    mappedConvectiveHeatTransfer.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef mappedConvectiveHeatTransfer_H
+#define mappedConvectiveHeatTransfer_H
+
+#include "heatTransferModel.H"
+#include "volFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+/*---------------------------------------------------------------------------*\
+                Class mappedConvectiveHeatTransfer Declaration
+\*---------------------------------------------------------------------------*/
+
+class mappedConvectiveHeatTransfer
+:
+    public heatTransferModel
+{
+private:
+
+    // Private data
+
+        //- Heat transfer coefficient - primary region [W/m2/K]
+        volScalarField htcConvPrimary_;
+
+        //- Heat transfer coefficient - film region [W/m2/K]
+        //  Assumes that the primary regtion to film region boundaries are
+        //  described as directMappedPushed types
+        volScalarField htcConvFilm_;
+
+
+    // Private member functions
+
+        //- Disallow default bitwise copy construct
+        mappedConvectiveHeatTransfer(const mappedConvectiveHeatTransfer&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const mappedConvectiveHeatTransfer&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("mappedConvectiveHeatTransfer");
+
+
+    // Constructors
+
+        //- Construct from surface film model and dictionary
+        mappedConvectiveHeatTransfer
+        (
+            const surfaceFilmModel& owner,
+            const dictionary& dict
+        );
+
+
+    //- Destructor
+    virtual ~mappedConvectiveHeatTransfer();
+
+
+    // Member Functions
+
+        // Evolution
+
+            //- Correct
+            virtual void correct();
+
+            //- Return the heat transfer coefficient [W/m2/K]
+            virtual tmp<volScalarField> h() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/thermo/phaseChangeModel/noPhaseChange/noPhaseChange.C b/src/regionModels/surfaceFilmModels/submodels/thermo/phaseChangeModel/noPhaseChange/noPhaseChange.C
new file mode 100644
index 0000000000000000000000000000000000000000..5892c1fb9bc2a23ad53f5f8ef1370c33b705a5b2
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/thermo/phaseChangeModel/noPhaseChange/noPhaseChange.C
@@ -0,0 +1,81 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "noPhaseChange.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(noPhaseChange, 0);
+addToRunTimeSelectionTable(phaseChangeModel, noPhaseChange, dictionary);
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+noPhaseChange::noPhaseChange
+(
+    const surfaceFilmModel& owner,
+    const dictionary&
+)
+:
+    phaseChangeModel(owner)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+noPhaseChange::~noPhaseChange()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+void noPhaseChange::correct
+(
+    const scalar,
+    scalarField&,
+    scalarField&
+)
+{
+    // do nothing
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/thermo/phaseChangeModel/noPhaseChange/noPhaseChange.H b/src/regionModels/surfaceFilmModels/submodels/thermo/phaseChangeModel/noPhaseChange/noPhaseChange.H
new file mode 100644
index 0000000000000000000000000000000000000000..45bee3597da5a12cd266c87c3f2c731570914a3d
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/thermo/phaseChangeModel/noPhaseChange/noPhaseChange.H
@@ -0,0 +1,109 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::noPhaseChange
+
+Description
+    Dummy phase change model for 'none'
+
+SourceFiles
+    noPhaseChange.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef noPhaseChange_H
+#define noPhaseChange_H
+
+#include "phaseChangeModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+/*---------------------------------------------------------------------------*\
+                        Class noPhaseChange Declaration
+\*---------------------------------------------------------------------------*/
+
+class noPhaseChange
+:
+    public phaseChangeModel
+{
+private:
+
+    // Private member functions
+
+        //- Disallow default bitwise copy construct
+        noPhaseChange(const noPhaseChange&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const noPhaseChange&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("none");
+
+
+    // Constructors
+
+        //- Construct from surface film model
+        noPhaseChange(const surfaceFilmModel& owner, const dictionary& dict);
+
+
+    //- Destructor
+    virtual ~noPhaseChange();
+
+
+    // Member Functions
+
+        // Evolution
+
+            //- Correct
+            virtual void correct
+            (
+                const scalar dt,
+                scalarField& dMass,
+                scalarField& dEnergy
+            );
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/thermo/phaseChangeModel/phaseChangeModel/phaseChangeModel.C b/src/regionModels/surfaceFilmModels/submodels/thermo/phaseChangeModel/phaseChangeModel/phaseChangeModel.C
new file mode 100644
index 0000000000000000000000000000000000000000..152d02b40eac08cef7709a2d2982c901d9a279a9
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/thermo/phaseChangeModel/phaseChangeModel/phaseChangeModel.C
@@ -0,0 +1,77 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "phaseChangeModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(phaseChangeModel, 0);
+defineRunTimeSelectionTable(phaseChangeModel, dictionary);
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+phaseChangeModel::phaseChangeModel
+(
+    const surfaceFilmModel& owner
+)
+:
+    subModelBase(owner)
+{}
+
+
+phaseChangeModel::phaseChangeModel
+(
+    const word& type,
+    const surfaceFilmModel& owner,
+    const dictionary& dict
+)
+:
+    subModelBase(type, owner, dict)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+phaseChangeModel::~phaseChangeModel()
+{}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // end namespace surfaceFilmModels
+} // end namespace regionModels
+} // end namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/thermo/phaseChangeModel/phaseChangeModel/phaseChangeModel.H b/src/regionModels/surfaceFilmModels/submodels/thermo/phaseChangeModel/phaseChangeModel/phaseChangeModel.H
new file mode 100644
index 0000000000000000000000000000000000000000..42568e90ffaf72ba2cbae227ec3c8469d2d9772b
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/thermo/phaseChangeModel/phaseChangeModel/phaseChangeModel.H
@@ -0,0 +1,144 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::phaseChangeModel
+
+Description
+    Base class for surface film phase change models
+
+SourceFiles
+    phaseChangeModel.C
+    phaseChangeModelNew.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef phaseChangeModel_H
+#define phaseChangeModel_H
+
+#include "subModelBase.H"
+#include "runTimeSelectionTables.H"
+#include "scalarField.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+/*---------------------------------------------------------------------------*\
+                      Class phaseChangeModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class phaseChangeModel
+:
+    public subModelBase
+{
+private:
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        phaseChangeModel(const phaseChangeModel&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const phaseChangeModel&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("phaseChangeModel");
+
+
+    // Declare runtime constructor selection table
+
+         declareRunTimeSelectionTable
+         (
+             autoPtr,
+             phaseChangeModel,
+             dictionary,
+             (
+                const surfaceFilmModel& owner,
+                const dictionary& dict
+             ),
+             (owner, dict)
+         );
+
+    // Constructors
+
+        //- Construct null
+        phaseChangeModel(const surfaceFilmModel& owner);
+
+        //- Construct from type name, dictionary and surface film model
+        phaseChangeModel
+        (
+            const word& type,
+            const surfaceFilmModel& owner,
+            const dictionary& dict
+        );
+
+
+    // Selectors
+
+        //- Return a reference to the selected phase change model
+        static autoPtr<phaseChangeModel> New
+        (
+            const surfaceFilmModel& owner,
+            const dictionary& dict
+        );
+
+
+    //- Destructor
+    virtual ~phaseChangeModel();
+
+
+    // Member Functions
+
+        // Evolution
+
+            //- Correct
+            virtual void correct
+            (
+                const scalar dt,
+                scalarField& dMass,
+                scalarField& dEnergy
+            ) = 0;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/thermo/phaseChangeModel/phaseChangeModel/phaseChangeModelNew.C b/src/regionModels/surfaceFilmModels/submodels/thermo/phaseChangeModel/phaseChangeModel/phaseChangeModelNew.C
new file mode 100644
index 0000000000000000000000000000000000000000..a8e034fe4c88a99a7ecff6344e7aeb1ad0a31aab
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/thermo/phaseChangeModel/phaseChangeModel/phaseChangeModelNew.C
@@ -0,0 +1,74 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "phaseChangeModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * //
+
+autoPtr<phaseChangeModel> phaseChangeModel::New
+(
+    const surfaceFilmModel& model,
+    const dictionary& dict
+)
+{
+    word modelType(dict.lookup("phaseChangeModel"));
+
+    Info<< "    Selecting phaseChangeModel " << modelType << endl;
+
+    dictionaryConstructorTable::iterator cstrIter =
+        dictionaryConstructorTablePtr_->find(modelType);
+
+    if (cstrIter == dictionaryConstructorTablePtr_->end())
+    {
+        FatalErrorIn
+        (
+            "phaseChangeModel::New(const surfaceFilmModel&, const dictionary&)"
+        )   << "Unknown phaseChangeModel type " << modelType
+            << nl << nl << "Valid phaseChangeModel types are:" << nl
+            << dictionaryConstructorTablePtr_->toc()
+            << exit(FatalError);
+    }
+
+    return autoPtr<phaseChangeModel>(cstrIter()(model, dict));
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // end namespace surfaceFilmModels
+} // end namespace regionModels
+} // end namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/thermo/phaseChangeModel/standardPhaseChange/standardPhaseChange.C b/src/regionModels/surfaceFilmModels/submodels/thermo/phaseChangeModel/standardPhaseChange/standardPhaseChange.C
new file mode 100644
index 0000000000000000000000000000000000000000..6453e691ed93fc6bbe9c6930e56d48bd4943c5c2
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/thermo/phaseChangeModel/standardPhaseChange/standardPhaseChange.C
@@ -0,0 +1,224 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "standardPhaseChange.H"
+#include "addToRunTimeSelectionTable.H"
+#include "thermoSingleLayer.H"
+#include "specie.H"
+#include "heatTransferModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(standardPhaseChange, 0);
+
+addToRunTimeSelectionTable
+(
+    phaseChangeModel,
+    standardPhaseChange,
+    dictionary
+);
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+scalar standardPhaseChange::Sh
+(
+    const scalar Re,
+    const scalar Sc
+) const
+{
+    if (Re < 5.0E+05)
+    {
+        return 0.664*sqrt(Re)*cbrt(Sc);
+    }
+    else
+    {
+        return 0.037*pow(Re, 0.8)*cbrt(Sc);
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+standardPhaseChange::standardPhaseChange
+(
+    const surfaceFilmModel& owner,
+    const dictionary& dict
+)
+:
+    phaseChangeModel(typeName, owner, dict),
+    Tb_(readScalar(coeffs_.lookup("Tb"))),
+    deltaMin_(readScalar(coeffs_.lookup("deltaMin"))),
+    L_(readScalar(coeffs_.lookup("L"))),
+    TbFactor_(coeffs_.lookupOrDefault<scalar>("TbFactor", 1.1)),
+    totalMass_(0.0),
+    vapourRate_(0.0)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+standardPhaseChange::~standardPhaseChange()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+void standardPhaseChange::correct
+(
+    const scalar dt,
+    scalarField& dMass,
+    scalarField& dEnergy
+)
+{
+    const thermoSingleLayer& film = refCast<const thermoSingleLayer>(owner_);
+
+    // set local thermo properties
+    const SLGThermo& thermo = film.thermo();
+    const label liqId = film.liquidId();
+    const liquid& liq = thermo.liquids().properties()[liqId];
+    const label vapId = thermo.carrierId(thermo.liquids().components()[liqId]);
+
+    // retrieve fields from film model
+    const scalarField& delta = film.delta();
+    const scalarField& YInf = film.YPrimary()[vapId];
+    const scalarField& pInf = film.pPrimary();
+    const scalarField& T = film.T();
+    const scalarField& Tw = film.Tw();
+    const scalarField& rho = film.rho();
+    const scalarField& TInf = film.TPrimary();
+    const scalarField& rhoInf = film.rhoPrimary();
+    const scalarField& muInf = film.muPrimary();
+    const scalarField& magSf = film.magSf();
+    const scalarField hInf = film.htcs().h();
+    const scalarField hFilm = film.htcw().h();
+    const vectorField dU = film.UPrimary() - film.Us();
+    const scalarField availableMass = (delta - deltaMin_)*rho*magSf;
+
+
+    forAll(dMass, cellI)
+    {
+        if (delta[cellI] > deltaMin_)
+        {
+            // cell pressure [Pa]
+            const scalar pc = pInf[cellI];
+
+            // local temperature - impose lower limit of 200 K for stability
+            const scalar Tloc = min(TbFactor_*Tb_, max(200.0, T[cellI]));
+
+            // saturation pressure [Pa]
+            const scalar pSat = liq.pv(pc, Tloc);
+
+            // latent heat [J/kg]
+            const scalar hVap = liq.hl(pc, Tloc);
+
+            // calculate mass transfer
+            if (pSat >= 0.95*pc)
+            {
+                // boiling
+                const scalar qDotInf = hInf[cellI]*(TInf[cellI] - T[cellI]);
+                const scalar qDotFilm = hFilm[cellI]*(T[cellI] - Tw[cellI]);
+
+                const scalar Cp = liq.Cp(pc, Tloc);
+                const scalar Tcorr = max(0.0, T[cellI] - Tb_);
+                const scalar qCorr = availableMass[cellI]*Cp*(Tcorr);
+
+                dMass[cellI] =
+                    dt*magSf[cellI]/hVap*(qDotInf + qDotFilm)
+                  + qCorr/hVap;
+            }
+            else
+            {
+                // Primary region density [kg/m3]
+                const scalar rhoInfc = rhoInf[cellI];
+
+                // Primary region viscosity [Pa.s]
+                const scalar muInfc = muInf[cellI];
+
+                // Reynolds number
+                const scalar Re = rhoInfc*mag(dU[cellI])*L_/muInfc;
+
+                // molecular weight of vapour [kg/kmol]
+                const scalar Wvap = thermo.carrier().W(vapId);
+
+                // molecular weight of liquid [kg/kmol]
+                const scalar Wliq = liq.W();
+
+                // vapour mass fraction at interface
+                const scalar Ys = Wliq*pSat/(Wliq*pSat + Wvap*(pc - pSat));
+
+                // vapour diffusivity [m2/s]
+                const scalar Dab = liq.D(pc, Tloc);
+
+                // Schmidt number
+                const scalar Sc = muInfc/(rhoInfc*(Dab + ROOTVSMALL));
+
+                // Sherwood number
+                const scalar Sh = this->Sh(Re, Sc);
+
+                // mass transfer coefficient [m/s]
+                const scalar hm = Sh*Dab/(L_ + ROOTVSMALL);
+
+                // add mass contribution to source
+                dMass[cellI] =
+                    dt*magSf[cellI]*rhoInfc*hm*(Ys - YInf[cellI])/(1.0 - Ys);
+            }
+
+            dMass[cellI] = min(availableMass[cellI], max(0.0, dMass[cellI]));
+            dEnergy[cellI] = dMass[cellI]*hVap;
+        }
+    }
+
+    const scalar sumdMass = sum(dMass);
+    totalMass_ += sumdMass;
+    vapourRate_ = sumdMass/owner().time().deltaTValue();
+}
+
+
+void standardPhaseChange::info() const
+{
+    Info<< indent << "mass phase change  = "
+        << returnReduce(totalMass_, sumOp<scalar>()) << nl
+        << indent << "vapourisation rate = "
+        << returnReduce(vapourRate_, sumOp<scalar>()) << nl;
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/thermo/phaseChangeModel/standardPhaseChange/standardPhaseChange.H b/src/regionModels/surfaceFilmModels/submodels/thermo/phaseChangeModel/standardPhaseChange/standardPhaseChange.H
new file mode 100644
index 0000000000000000000000000000000000000000..19b6e54fa41decc6baf9245c767bb22a27f1b34d
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/thermo/phaseChangeModel/standardPhaseChange/standardPhaseChange.H
@@ -0,0 +1,149 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::standardPhaseChange
+
+Description
+    Standard phase change model with modification for boiling
+
+SourceFiles
+    standardPhaseChange.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef standardPhaseChange_H
+#define standardPhaseChange_H
+
+#include "phaseChangeModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+/*---------------------------------------------------------------------------*\
+                    Class standardPhaseChange Declaration
+\*---------------------------------------------------------------------------*/
+
+class standardPhaseChange
+:
+    public phaseChangeModel
+{
+private:
+
+    // Private member functions
+
+        //- Disallow default bitwise copy construct
+        standardPhaseChange(const standardPhaseChange&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const standardPhaseChange&);
+
+
+protected:
+
+    // Protected data
+
+        //- Boiling temperature / [K]
+        const scalar Tb_;
+
+        //- Minimum film height for model to be active
+        const scalar deltaMin_;
+
+        //- Length scale / [m]
+        const scalar L_;
+
+        //- Boiling temperature factor / []
+        //  Used to set max limit on temperature to Tb*TbFactor
+        const scalar TbFactor_;
+
+        //- Total mass evolved / [kg]
+        scalar totalMass_;
+
+        //- Vapouristaion rate / kg/s
+        scalar vapourRate_;
+
+
+    // Protected member functions
+
+        //- Return Sherwood number as a function of Reynolds and Schmidt numbers
+        scalar Sh(const scalar Re, const scalar Sc) const;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("standardPhaseChange");
+
+
+    // Constructors
+
+        //- Construct from surface film model
+        standardPhaseChange
+        (
+            const surfaceFilmModel& owner,
+            const dictionary& dict
+        );
+
+
+    //- Destructor
+    virtual ~standardPhaseChange();
+
+
+    // Member Functions
+
+        // Evolution
+
+            //- Correct
+            virtual void correct
+            (
+                const scalar dt,
+                scalarField& dMass,
+                scalarField& dEnergy
+            );
+
+
+        // Input/output
+
+            //- Output model statistics
+            virtual void info() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/surfaceFilmModel/surfaceFilmModel.C b/src/regionModels/surfaceFilmModels/surfaceFilmModel/surfaceFilmModel.C
new file mode 100644
index 0000000000000000000000000000000000000000..9dee81273434c468ff34c05030bb4debeb8739dc
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/surfaceFilmModel/surfaceFilmModel.C
@@ -0,0 +1,166 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "surfaceFilmModel.H"
+#include "fvMesh.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+template<>
+const char* Foam::NamedEnum
+<
+    Foam::regionModels::surfaceFilmModels::surfaceFilmModel::thermoModelType,
+    2
+>::names[] =
+{
+    "constant",
+    "singleComponent"
+};
+
+
+const Foam::NamedEnum
+<
+    Foam::regionModels::surfaceFilmModels::surfaceFilmModel::thermoModelType,
+    2
+>
+Foam::regionModels::surfaceFilmModels::surfaceFilmModel::thermoModelTypeNames_;
+
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(surfaceFilmModel, 0);
+defineRunTimeSelectionTable(surfaceFilmModel, mesh);
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+bool surfaceFilmModel::read()
+{
+    if (singleLayerRegion::read())
+    {
+        thermoModel_ =
+            thermoModelTypeNames_.read(coeffs_.lookup("thermoModel"));
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+surfaceFilmModel::surfaceFilmModel(const fvMesh& mesh)
+:
+    singleLayerRegion(mesh),
+    g_(vector::zero),
+    thermoModel_(tmConstant)
+{}
+
+
+surfaceFilmModel::surfaceFilmModel
+(
+    const word& modelType,
+    const fvMesh& mesh,
+    const dimensionedVector& g
+)
+:
+    singleLayerRegion(mesh, "surfaceFilm", modelType),
+    g_(g),
+    thermoModel_(tmConstant)
+{
+    if (active_)
+    {
+        read();
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+surfaceFilmModel::~surfaceFilmModel()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+Foam::scalar surfaceFilmModel::CourantNumber() const
+{
+    return ROOTVSMALL;
+}
+
+
+tmp<DimensionedField<scalar, volMesh> > surfaceFilmModel::Srho() const
+{
+    notImplemented
+    (
+        "tmp<DimensionedField<scalar, volMesh> > surfaceFilmModel::Srho() const"
+    )
+
+    return tmp<DimensionedField<scalar, volMesh> >(NULL);
+}
+
+
+tmp<DimensionedField<scalar, volMesh> >
+surfaceFilmModel::Srho(const label) const
+{
+    notImplemented
+    (
+        "tmp<DimensionedField<scalar, volMesh> > surfaceFilmModel::Srho"
+        "(const label) const"
+    )
+
+    return tmp<DimensionedField<scalar, volMesh> >(NULL);
+}
+
+
+tmp<DimensionedField<scalar, volMesh> > surfaceFilmModel::Sh() const
+{
+    notImplemented
+    (
+        "tmp<DimensionedField<scalar, volMesh> > surfaceFilmModel::Sh() const"
+    )
+
+    return tmp<DimensionedField<scalar, volMesh> >(NULL);
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/surfaceFilmModel/surfaceFilmModel.H b/src/regionModels/surfaceFilmModels/surfaceFilmModel/surfaceFilmModel.H
new file mode 100644
index 0000000000000000000000000000000000000000..a8549f60c9ccb4e588d9ffc06a65dfe7907829e6
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/surfaceFilmModel/surfaceFilmModel.H
@@ -0,0 +1,263 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::surfaceFilmModel
+
+Description
+    Base class for surface film models
+
+SourceFiles
+    surfaceFilmModelI.H
+    surfaceFilmModel.C
+    surfaceFilmModelNew.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef surfaceFilmModel_H
+#define surfaceFilmModel_H
+
+#include "singleLayerRegion.H"
+
+#include "dimensionedVector.H"
+#include "runTimeSelectionTables.H"
+#include "volFieldsFwd.H"
+#include "DimensionedField.H"
+#include "labelList.H"
+#include "NamedEnum.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+/*---------------------------------------------------------------------------*\
+                      Class surfaceFilmModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class surfaceFilmModel
+:
+    public singleLayerRegion
+{
+public:
+
+    // Data types
+
+        //- Enumeration listing the possible thermo types
+        enum thermoModelType
+        {
+            tmConstant,
+            tmSingleComponent
+        };
+
+        //- Named enumeration for the thermoType
+        static const NamedEnum<thermoModelType, 2> thermoModelTypeNames_;
+
+
+private:
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        surfaceFilmModel(const surfaceFilmModel&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const surfaceFilmModel&);
+
+
+protected:
+
+    // Protected data
+
+
+        //- Acceleration due to gravity [m/s2]
+        const dimensionedVector& g_;
+
+        //- Thermo type
+        thermoModelType thermoModel_;
+
+
+    // Protected member functions
+
+        //- Read control parameters from dictionary
+        virtual bool read();
+
+
+public:
+
+    //- Runtime type information
+    TypeName("surfaceFilmModel");
+
+
+    // Declare runtime constructor selection table
+
+         declareRunTimeSelectionTable
+         (
+             autoPtr,
+             surfaceFilmModel,
+             mesh,
+             (
+                const word& modelType,
+                const fvMesh& mesh,
+                const dimensionedVector& g
+             ),
+             (modelType, mesh, g)
+         );
+
+    // Constructors
+
+        //- Construct null
+        surfaceFilmModel(const fvMesh& mesh);
+
+        //- Construct from type name, mesh and gravity vector
+        surfaceFilmModel
+        (
+            const word& modelType,
+            const fvMesh& mesh,
+            const dimensionedVector& g
+        );
+
+
+    // Selectors
+
+        //- Return a reference to the selected surface film model
+        static autoPtr<surfaceFilmModel> New
+        (
+            const fvMesh& mesh,
+            const dimensionedVector& g
+        );
+
+
+    //- Destructor
+    virtual ~surfaceFilmModel();
+
+
+    // Member Functions
+
+        // Access
+
+            //- Return the thermo type
+            inline const thermoModelType& thermoModel() const;
+
+            //- External hook to add sources to the film
+            virtual void addSources
+            (
+                const label patchI,
+                const label faceI,
+                const scalar massSource,
+                const vector& momentumSource,
+                const scalar pressureSource,
+                const scalar energySource
+            ) = 0;
+
+
+       // Solution parameters
+
+            //- Courant number evaluation
+            virtual scalar CourantNumber() const;
+
+
+        // Fields
+
+           //- Return the film thickness [m]
+           virtual const volScalarField& delta() const = 0;
+
+           //- Return the film velocity [m/s]
+           virtual const volVectorField& U() const = 0;
+
+           //- Return the film surface velocity [m/s]
+           virtual const volVectorField& Us() const = 0;
+
+           //- Return the film wall velocity [m/s]
+           virtual const volVectorField& Uw() const = 0;
+
+           //- Return the film density [kg/m3]
+           virtual const volScalarField& rho() const = 0;
+
+           //- Return the film mean temperature [K]
+           virtual const volScalarField& T() const = 0;
+
+           //- Return the film surface temperature [K]
+           virtual const volScalarField& Ts() const = 0;
+
+           //- Return the film wall temperature [K]
+           virtual const volScalarField& Tw() const = 0;
+
+            //- Return the film specific heat capacity [J/kg/K]
+           virtual const volScalarField& Cp() const = 0;
+
+           //- Return the film thermal conductivity [W/m/K]
+           virtual const volScalarField& kappa() const = 0;
+
+
+           // Transfer fields - to the primary region
+
+               //- Return the film mass available for transfer
+               virtual const volScalarField& massForPrimary() const = 0;
+
+               //- Return the parcel diameters originating from film
+               virtual const volScalarField& diametersForPrimary() const = 0;
+
+               //- Return the film mass evolved via phase change
+               virtual const volScalarField& massPhaseChangeForPrimary()
+                   const = 0;
+
+
+        // Source fields
+
+            // Mapped into primary region
+
+                //- Return total mass source - Eulerian phase only
+                virtual tmp<DimensionedField<scalar, volMesh> > Srho() const;
+
+                //- Return mass source for specie i - Eulerian phase only
+                virtual tmp<DimensionedField<scalar, volMesh> > Srho
+                (
+                    const label i
+                ) const;
+
+                //- Return enthalpy source - Eulerian phase only
+                virtual tmp<DimensionedField<scalar, volMesh> > Sh() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "surfaceFilmModelI.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/surfaceFilmModel/surfaceFilmModelI.H b/src/regionModels/surfaceFilmModels/surfaceFilmModel/surfaceFilmModelI.H
new file mode 100644
index 0000000000000000000000000000000000000000..b6fc1d3baf2a9228254e1aa7992edf51d82f9996
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/surfaceFilmModel/surfaceFilmModelI.H
@@ -0,0 +1,53 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "surfaceFilmModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+inline const surfaceFilmModel::thermoModelType&
+surfaceFilmModel::thermoModel() const
+{
+    return thermoModel_;
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/surfaceFilmModel/surfaceFilmModelNew.C b/src/regionModels/surfaceFilmModels/surfaceFilmModel/surfaceFilmModelNew.C
new file mode 100644
index 0000000000000000000000000000000000000000..4fac62488f19a014dca30be1b57201ae113d6a5e
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/surfaceFilmModel/surfaceFilmModelNew.C
@@ -0,0 +1,93 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "surfaceFilmModel.H"
+#include "fvMesh.H"
+#include "Time.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * //
+
+autoPtr<surfaceFilmModel> surfaceFilmModel::New
+(
+    const fvMesh& mesh,
+    const dimensionedVector& g
+)
+{
+    word modelType;
+
+    {
+        IOdictionary surfaceFilmPropertiesDict
+        (
+            IOobject
+            (
+                "surfaceFilmProperties",
+                mesh.time().constant(),
+                mesh,
+                IOobject::MUST_READ,
+                IOobject::NO_WRITE,
+                false
+            )
+        );
+
+        surfaceFilmPropertiesDict.lookup("surfaceFilmModel") >> modelType;
+    }
+
+    Info<< "Selecting surfaceFilmModel " << modelType << endl;
+
+    meshConstructorTable::iterator cstrIter =
+        meshConstructorTablePtr_->find(modelType);
+
+    if (cstrIter == meshConstructorTablePtr_->end())
+    {
+        FatalErrorIn
+        (
+            "surfaceFilmModel::New(const fvMesh&, const dimensionedVector&)"
+        )   << "Unknown surfaceFilmModel type " << modelType
+            << nl << nl << "Valid surfaceFilmModel types are:" << nl
+            << meshConstructorTablePtr_->toc()
+            << exit(FatalError);
+    }
+
+    return autoPtr<surfaceFilmModel>(cstrIter()(modelType, mesh, g));
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/thermoSingleLayer/thermoSingleLayer.C b/src/regionModels/surfaceFilmModels/thermoSingleLayer/thermoSingleLayer.C
new file mode 100644
index 0000000000000000000000000000000000000000..6eb64cbd91e41c9bca47931a1d07e31fed2078a6
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/thermoSingleLayer/thermoSingleLayer.C
@@ -0,0 +1,741 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "thermoSingleLayer.H"
+#include "fvcDiv.H"
+#include "fvcLaplacian.H"
+#include "fvm.H"
+#include "addToRunTimeSelectionTable.H"
+#include "zeroGradientFvPatchFields.H"
+#include "directMappedFieldFvPatchField.H"
+#include "mapDistribute.H"
+
+// Sub-models
+#include "heatTransferModel.H"
+#include "phaseChangeModel.H"
+#include "filmRadiationModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(thermoSingleLayer, 0);
+
+addToRunTimeSelectionTable(surfaceFilmModel, thermoSingleLayer, mesh);
+
+// * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * * //
+
+wordList thermoSingleLayer::hsBoundaryTypes()
+{
+    wordList bTypes(T_.boundaryField().types());
+    forAll(bTypes, patchI)
+    {
+        if (bTypes[patchI] == directMappedFieldFvPatchField<scalar>::typeName)
+        {
+            bTypes[patchI] = fixedValueFvPatchField<scalar>::typeName;
+        }
+    }
+
+    return bTypes;
+}
+
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+bool thermoSingleLayer::read()
+{
+    // no additional properties to read
+    return kinematicSingleLayer::read();
+}
+
+
+void thermoSingleLayer::resetPrimaryRegionSourceTerms()
+{
+    kinematicSingleLayer::resetPrimaryRegionSourceTerms();
+
+    hsSpPrimary_ == dimensionedScalar("zero", hsSp_.dimensions(), 0.0);
+}
+
+
+void thermoSingleLayer::correctThermoFields()
+{
+    switch (thermoModel_)
+    {
+        case tmConstant:
+        {
+            rho_ == dimensionedScalar(coeffs_.lookup("rho0"));
+            mu_ == dimensionedScalar(coeffs_.lookup("mu0"));
+            sigma_ == dimensionedScalar(coeffs_.lookup("sigma0"));
+            Cp_ == dimensionedScalar(coeffs_.lookup("Cp0"));
+            kappa_ == dimensionedScalar(coeffs_.lookup("kappa0"));
+
+            break;
+        }
+        case tmSingleComponent:
+        {
+            const liquid& liq = thermo_.liquids().properties()[liquidId_];
+            forAll(rho_, cellI)
+            {
+                const scalar T = T_[cellI];
+                const scalar p = pPrimary_[cellI];
+                rho_[cellI] = liq.rho(p, T);
+                mu_[cellI] = liq.mu(p, T);
+                sigma_[cellI] = liq.sigma(p, T);
+                Cp_[cellI] = liq.Cp(p, T);
+                kappa_[cellI] = liq.K(p, T);
+            }
+
+            rho_.correctBoundaryConditions();
+            mu_.correctBoundaryConditions();
+            sigma_.correctBoundaryConditions();
+            Cp_.correctBoundaryConditions();
+            kappa_.correctBoundaryConditions();
+
+            break;
+        }
+        default:
+        {
+            FatalErrorIn
+            (
+                "void thermoSingleLayer::"
+                "correctThermoFields()"
+            )   << "Unknown thermoType enumeration" << abort(FatalError);
+        }
+    }
+}
+
+
+void thermoSingleLayer::correctHsForMappedT()
+{
+    T_.correctBoundaryConditions();
+
+    forAll(T_.boundaryField(), patchI)
+    {
+        const fvPatchField<scalar>& Tp = T_.boundaryField()[patchI];
+        if (isA<directMappedFieldFvPatchField<scalar> >(Tp))
+        {
+            hs_.boundaryField()[patchI] == hs(Tp, patchI);
+        }
+    }
+}
+
+
+void thermoSingleLayer::updateSurfaceTemperatures()
+{
+    correctHsForMappedT();
+
+    // Push boundary film temperature into wall temperature internal field
+    for (label i=0; i<intCoupledPatchIDs_.size(); i++)
+    {
+        label patchI = intCoupledPatchIDs_[i];
+        const polyPatch& pp = regionMesh().boundaryMesh()[patchI];
+        UIndirectList<scalar>(Tw_, pp.faceCells()) =
+            T_.boundaryField()[patchI];
+    }
+    Tw_.correctBoundaryConditions();
+
+    // Update film surface temperature
+    Ts_ = T_;
+    Ts_.correctBoundaryConditions();
+}
+
+
+void thermoSingleLayer::transferPrimaryRegionThermoFields()
+{
+    kinematicSingleLayer::transferPrimaryRegionThermoFields();
+
+    // Update primary region fields on local region via direct mapped (coupled)
+    // boundary conditions
+    TPrimary_.correctBoundaryConditions();
+    forAll(YPrimary_, i)
+    {
+        YPrimary_[i].correctBoundaryConditions();
+    }
+}
+
+
+void thermoSingleLayer::transferPrimaryRegionSourceFields()
+{
+    kinematicSingleLayer::transferPrimaryRegionSourceFields();
+
+    // Retrieve the source fields from the primary region via direct mapped
+    // (coupled) boundary conditions
+    // - fields require transfer of values for both patch AND to push the
+    //   values into the first layer of internal cells
+    hsSp_.correctBoundaryConditions();
+
+    // Convert accummulated source terms into per unit area per unit time
+    // Note: boundary values will still have original (neat) values
+    const scalar deltaT = time_.deltaTValue();
+    hsSp_.field() /= magSf()*deltaT;
+}
+
+
+void thermoSingleLayer::updateSubmodels()
+{
+    // Update heat transfer coefficient sub-models
+    htcs_->correct();
+    htcw_->correct();
+
+    // Update phase change
+    massPhaseChangeForPrimary_.internalField() = 0.0;
+    energyPhaseChangeForPrimary_.internalField() = 0.0;
+
+    phaseChange_->correct
+    (
+        time_.deltaTValue(),
+        massPhaseChangeForPrimary_,
+        energyPhaseChangeForPrimary_
+    );
+    massPhaseChangeForPrimary_.correctBoundaryConditions();
+    totalMassPhaseChange_ += sum(massPhaseChangeForPrimary_).value();
+
+    // Update radiation
+    radiation_->correct();
+
+    // Update kinematic sub-models
+    kinematicSingleLayer::updateSubmodels();
+
+    // Update source fields
+    hsSp_ -= energyPhaseChangeForPrimary_/magSf()/time().deltaT();
+}
+
+
+tmp<fvScalarMatrix> thermoSingleLayer::q
+(
+    volScalarField& hs
+) const
+{
+    dimensionedScalar Tstd("Tstd", dimTemperature, 298.15);
+
+    return
+    (
+      - fvm::Sp(htcs_->h()/Cp_, hs) - htcs_->h()*(Tstd - TPrimary_)
+      - fvm::Sp(htcw_->h()/Cp_, hs) - htcw_->h()*(Tstd - Tw_)
+    );
+}
+
+
+void thermoSingleLayer::solveEnergy()
+{
+    if (debug)
+    {
+        Info<< "thermoSingleLayer::solveEnergy()" << endl;
+    }
+
+    updateSurfaceTemperatures();
+
+    dimensionedScalar hs0("SMALL", hs_.dimensions(), SMALL);
+
+    solve
+    (
+        fvm::ddt(deltaRho_, hs_)
+      + fvm::div(phi_, hs_)
+     ==
+        fvm::Sp(hsSp_/(hs_ + hs0), hs_)
+      + q(hs_)
+      + radiation_->Shs()
+      - fvm::Sp(massForPrimary_/magSf()/time().deltaT(), hs_)
+    );
+
+    correctThermoFields();
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+thermoSingleLayer::thermoSingleLayer
+(
+    const word& modelType,
+    const fvMesh& mesh,
+    const dimensionedVector& g,
+    const bool readFields
+)
+:
+    kinematicSingleLayer(modelType, mesh, g, false),
+    thermo_(mesh.lookupObject<SLGThermo>("SLGThermo")),
+    liquidId_(thermo_.liquidId(coeffs_.lookup("liquid"))),
+    Cp_
+    (
+        IOobject
+        (
+            "Cp",
+            time().timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::AUTO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar("Cp", dimEnergy/dimMass/dimTemperature, 0.0),
+        zeroGradientFvPatchScalarField::typeName
+    ),
+    kappa_
+    (
+        IOobject
+        (
+            "kappa",
+            time().timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::AUTO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar
+        (
+            "kappa",
+            dimEnergy/dimTime/dimLength/dimTemperature,
+            0.0
+        ),
+        zeroGradientFvPatchScalarField::typeName
+    ),
+
+    T_
+    (
+        IOobject
+        (
+            "Tf",
+            time().timeName(),
+            regionMesh(),
+            IOobject::MUST_READ,
+            IOobject::AUTO_WRITE
+        ),
+        regionMesh()
+    ),
+    Ts_
+    (
+        IOobject
+        (
+            "Tsf",
+            time().timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        T_,
+        zeroGradientFvPatchScalarField::typeName
+    ),
+    Tw_
+    (
+        IOobject
+        (
+            "Twf",
+            time().timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        T_,
+        zeroGradientFvPatchScalarField::typeName
+    ),
+    hs_
+    (
+        IOobject
+        (
+            "hsf",
+            time().timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar("zero", dimEnergy/dimMass, 0.0),
+//        T_.boundaryField().types()
+        hsBoundaryTypes()
+    ),
+
+    hsSp_
+    (
+        IOobject
+        (
+            "hsSp",
+            time().timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar("zero", dimEnergy/dimArea/dimTime, 0.0),
+        this->mappedPushedFieldPatchTypes<scalar>()
+    ),
+
+    hsSpPrimary_
+    (
+        IOobject
+        (
+            hsSp_.name(), // must have same name as hSp_ to enable mapping
+            time().timeName(),
+            primaryMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        primaryMesh(),
+        dimensionedScalar("zero", hsSp_.dimensions(), 0.0)
+    ),
+
+    TPrimary_
+    (
+        IOobject
+        (
+            "T", // same name as T on primary region to enable mapping
+            time().timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar("zero", dimTemperature, 0.0),
+        this->mappedFieldAndInternalPatchTypes<scalar>()
+    ),
+
+    YPrimary_(),
+
+    htcs_
+    (
+        heatTransferModel::New(*this, coeffs().subDict("upperSurfaceModels"))
+    ),
+    htcw_
+    (
+        heatTransferModel::New(*this, coeffs().subDict("lowerSurfaceModels"))
+    ),
+    phaseChange_(phaseChangeModel::New(*this, coeffs())),
+    radiation_(filmRadiationModel::New(*this, coeffs())),
+    totalMassPhaseChange_(0.0),
+    energyPhaseChangeForPrimary_
+    (
+        IOobject
+        (
+            "energyPhaseChangeForPrimary",
+            time().timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        regionMesh(),
+        dimensionedScalar("zero", dimEnergy, 0),
+        zeroGradientFvPatchScalarField::typeName
+    )
+{
+    if (thermo_.hasMultiComponentCarrier())
+    {
+        YPrimary_.setSize(thermo_.carrier().species().size());
+
+        forAll(thermo_.carrier().species(), i)
+        {
+            YPrimary_.set
+            (
+                i,
+                new volScalarField
+                (
+                    IOobject
+                    (
+                        thermo_.carrier().species()[i],
+                        time().timeName(),
+                        regionMesh(),
+                        IOobject::NO_READ,
+                        IOobject::NO_WRITE
+                    ),
+                    regionMesh(),
+                    dimensionedScalar("zero", dimless, 0.0),
+                    pSp_.boundaryField().types()
+                )
+            );
+        }
+    }
+
+    if (readFields)
+    {
+        transferPrimaryRegionThermoFields();
+        correctThermoFields();
+
+        // Update derived fields
+        hs_ == hs(T_);
+        deltaRho_ == delta_*rho_;
+        phi_ = fvc::interpolate(deltaRho_*U_) & regionMesh().Sf();
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+thermoSingleLayer::~thermoSingleLayer()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+void thermoSingleLayer::addSources
+(
+    const label patchI,
+    const label faceI,
+    const scalar massSource,
+    const vector& momentumSource,
+    const scalar pressureSource,
+    const scalar energySource
+)
+{
+    kinematicSingleLayer::addSources
+    (
+        patchI,
+        faceI,
+        massSource,
+        momentumSource,
+        pressureSource,
+        energySource
+    );
+
+    if (debug)
+    {
+        Info<< "    energy   = " << energySource << nl << endl;
+    }
+
+    hsSpPrimary_.boundaryField()[patchI][faceI] += energySource;
+}
+
+
+void thermoSingleLayer::preEvolveRegion()
+{
+    transferPrimaryRegionThermoFields();
+
+//    correctHsForMappedT();
+
+    correctThermoFields();
+
+    transferPrimaryRegionSourceFields();
+}
+
+
+void thermoSingleLayer::evolveRegion()
+{
+    updateSubmodels();
+
+    // Solve continuity for deltaRho_
+    solveContinuity();
+
+    for (int oCorr=0; oCorr<nOuterCorr_; oCorr++)
+    {
+        // Explicit pressure source contribution
+        tmp<volScalarField> tpu(this->pu());
+
+        // Implicit pressure source coefficient
+        tmp<volScalarField> tpp(this->pp());
+
+        // Solve for momentum for U_
+        tmp<fvVectorMatrix> UEqn = solveMomentum(tpu(), tpp());
+
+        // Solve energy for hs_ - also updates thermo
+        solveEnergy();
+
+        // Film thickness correction loop
+        for (int corr=1; corr<=nCorr_; corr++)
+        {
+            // Solve thickness for delta_
+            solveThickness(tpu(), tpp(), UEqn());
+        }
+    }
+
+    // Update deltaRho_ with new delta_
+    deltaRho_ == delta_*rho_;
+
+    // Update temperature using latest hs_
+    T_ == T(hs_);
+
+    // Update film wall and surface velocities
+    updateSurfaceVelocities();
+
+    // Update film wall and surface temperatures
+    updateSurfaceTemperatures();
+
+    // Reset source terms for next time integration
+    resetPrimaryRegionSourceTerms();
+}
+
+
+const volScalarField& thermoSingleLayer::Cp() const
+{
+    return Cp_;
+}
+
+
+const volScalarField& thermoSingleLayer::kappa() const
+{
+    return kappa_;
+}
+
+
+const volScalarField& thermoSingleLayer::T() const
+{
+    return T_;
+}
+
+
+const volScalarField& thermoSingleLayer::Ts() const
+{
+    return Ts_;
+}
+
+
+const volScalarField& thermoSingleLayer::Tw() const
+{
+    return Tw_;
+}
+
+
+const volScalarField& thermoSingleLayer::hs() const
+{
+    return hs_;
+}
+
+
+void thermoSingleLayer::info() const
+{
+    kinematicSingleLayer::info();
+
+    Info<< indent << "min/max(T)         = " << min(T_).value() << ", "
+        << max(T_).value() << nl
+        << indent << "mass phase change  = "
+        << returnReduce(totalMassPhaseChange_, sumOp<scalar>()) << nl
+        << indent << "vapourisation rate = "
+        << sum(massPhaseChangeForPrimary_).value()/time_.deltaTValue() << nl;
+}
+
+
+tmp<DimensionedField<scalar, volMesh> > thermoSingleLayer::Srho
+(
+    const label i
+) const
+{
+    const label vapId =
+        thermo_.carrierId(thermo_.liquids().components()[liquidId_]);
+
+    tmp<DimensionedField<scalar, volMesh> > tSrho
+    (
+        new DimensionedField<scalar, volMesh>
+        (
+            IOobject
+            (
+                "thermoSingleLayer::Srho(i)",
+                time_.timeName(),
+                primaryMesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            primaryMesh(),
+            dimensionedScalar("zero", dimMass/dimVolume/dimTime, 0.0)
+        )
+    );
+
+    if (vapId == i)
+    {
+        scalarField& Srho = tSrho();
+        const scalarField& V = primaryMesh().V();
+        const scalar dt = time().deltaTValue();
+
+        forAll(intCoupledPatchIDs_, i)
+        {
+            const label filmPatchI = intCoupledPatchIDs_[i];
+            const mapDistribute& distMap = mappedPatches_[filmPatchI].map();
+
+            scalarField patchMass =
+                massPhaseChangeForPrimary_.boundaryField()[filmPatchI];
+            distMap.distribute(patchMass);
+
+            const label primaryPatchI = primaryPatchIDs()[i];
+            const unallocLabelList& cells =
+                primaryMesh().boundaryMesh()[primaryPatchI].faceCells();
+
+            forAll(patchMass, j)
+            {
+                Srho[cells[j]] = patchMass[j]/(V[cells[j]]*dt);
+            }
+        }
+    }
+
+    return tSrho;
+}
+
+
+tmp<DimensionedField<scalar, volMesh> > thermoSingleLayer::Sh() const
+{
+    tmp<DimensionedField<scalar, volMesh> > tSh
+    (
+        new DimensionedField<scalar, volMesh>
+        (
+            IOobject
+            (
+                "thermoSingleLayer::Sh",
+                time().timeName(),
+                primaryMesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            primaryMesh(),
+            dimensionedScalar("zero", dimEnergy/dimVolume/dimTime, 0.0)
+        )
+    );
+/*
+    scalarField& Sh = tSh();
+    const scalarField& V = mesh_.V();
+    const scalar dt = time_.deltaTValue();
+
+    forAll(intCoupledPatchIDs_, i)
+    {
+        const label filmPatchI = intCoupledPatchIDs_[i];
+        const mapDistribute& distMap = mappedPatches_[filmPatchI].map();
+
+        scalarField patchEnergy =
+            energyPhaseChangeForPrimary_.boundaryField()[filmPatchI];
+        distMap.distribute(patchEnergy);
+
+        const label primaryPatchI = primaryPatchIDs()[i];
+        const unallocLabelList& cells =
+            primaryMesh().boundaryMesh()[primaryPatchI].faceCells();
+
+        forAll(patchMass, j)
+        {
+            Sh[cells[j]] += patchEnergy[j]/(V[cells[j]]*dt);
+        }
+    }
+*/
+    return tSh;
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // end namespace Foam
+} // end namespace regionModels
+} // end namespace surfaceFilmModels
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/thermoSingleLayer/thermoSingleLayer.H b/src/regionModels/surfaceFilmModels/thermoSingleLayer/thermoSingleLayer.H
new file mode 100644
index 0000000000000000000000000000000000000000..d9d43e99bda9840eec581bffb5ee706ebc60ffca
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/thermoSingleLayer/thermoSingleLayer.H
@@ -0,0 +1,379 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::thermoSingleLayer
+
+Description
+    Thermodynamic form of single-cell layer surface film model
+
+    Note: defining enthalpy as Cp(T - Tstd) - when using liquids from the
+    thermophysical library, their enthalpies are calculated similarly, where
+    Tstd = 298.15 K
+
+SourceFiles
+    thermoSingleLayer.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef thermoSingleLayer_H
+#define thermoSingleLayer_H
+
+#include "kinematicSingleLayer.H"
+#include "SLGThermo.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// Forward declaration of classes
+class heatTransferModel;
+class phaseChangeModel;
+class filmRadiationModel;
+
+/*---------------------------------------------------------------------------*\
+                      Class thermoSingleLayer Declaration
+\*---------------------------------------------------------------------------*/
+
+class thermoSingleLayer
+:
+    public kinematicSingleLayer
+{
+private:
+
+    // Private member functions
+
+        //- Disallow default bitwise copy construct
+        thermoSingleLayer(const thermoSingleLayer&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const thermoSingleLayer&);
+
+        //- Return boundary types for sensible enthalpy field
+        wordList hsBoundaryTypes();
+
+
+protected:
+
+    // Protected data
+
+        // Thermo properties
+
+            //- Reference to the SLGThermo
+            const SLGThermo& thermo_;
+
+            // Single component
+
+                //- Id of component in thermo database
+                label liquidId_;
+
+
+            // Fields
+
+                //- Specific heat capacity / [J/kg/K]
+                volScalarField Cp_;
+
+                //- Thermal conductivity / [W/m/K]
+                volScalarField kappa_;
+
+                //- Temperature - mean / [K]
+                volScalarField T_;
+
+                //- Temperature - surface / [K]
+                volScalarField Ts_;
+
+                //- Temperature - wall / [K]
+                volScalarField Tw_;
+
+                //- Sensible enthalpy / [J/kg]
+                volScalarField hs_;
+
+
+        // Source term fields
+
+            // Film region - registered to the film region mesh
+            // Note: need boundary value mapped from primary region, and then
+            // pushed into the patch internal field
+
+                //- Energy / [J/m2/s]
+                volScalarField hsSp_;
+
+
+            // Primary region - registered to the primary region mesh
+            // Internal use only - not read-in
+
+                //- Energy / [J/m2/s]
+                volScalarField hsSpPrimary_;
+
+
+        // Fields mapped from primary region - registered to the film region
+        // Note: need both boundary AND patch internal fields to be mapped
+
+            //- Temperature / [K]
+            volScalarField TPrimary_;
+
+            //- List of specie mass fractions / [0-1]
+            PtrList<volScalarField> YPrimary_;
+
+
+        // Sub-models
+
+            //- Heat transfer coefficient bewteen film surface and primary
+            //  region [W/m2/K]
+            autoPtr<heatTransferModel> htcs_;
+
+            //- Heat transfer coefficient bewteen wall and film [W/m2/K]
+            autoPtr<heatTransferModel> htcw_;
+
+            //- Phase change
+            autoPtr<phaseChangeModel> phaseChange_;
+
+            //- Radiation
+            autoPtr<filmRadiationModel> radiation_;
+
+            //- Total mass transferred to primary region [kg]
+            scalar totalMassPhaseChange_;
+
+            //- Film energy evolved via phase change
+            volScalarField energyPhaseChangeForPrimary_;
+
+
+    // Protected member functions
+
+        //- Read control parameters from dictionary
+        virtual bool read();
+
+        //- Correct the thermo fields
+        virtual void correctThermoFields();
+
+        //- Correct sensible enthalpy for mapped temperature fields
+        virtual void correctHsForMappedT();
+
+        //- Correct the film surface and wall temperatures
+        virtual void updateSurfaceTemperatures();
+
+        //- Reset source term fields
+        virtual void resetPrimaryRegionSourceTerms();
+
+        //- Transfer thermo fields from the primary region to the film region
+        virtual void transferPrimaryRegionThermoFields();
+
+        //- Transfer source fields from the primary region to the film region
+        virtual void transferPrimaryRegionSourceFields();
+
+        //- Update the film sub-models
+        virtual void updateSubmodels();
+
+        //- Return the wall/surface heat transfer term for the enthalpy equation
+        virtual tmp<fvScalarMatrix> q(volScalarField& hs) const;
+
+
+        // Equations
+
+            //- Solve energy equation
+            virtual void solveEnergy();
+
+
+public:
+
+    //- Runtime type information
+    TypeName("thermoSingleLayer");
+
+
+    // Constructors
+
+        //- Construct from components
+        thermoSingleLayer
+        (
+            const word& modelType,
+            const fvMesh& mesh,
+            const dimensionedVector& g,
+            const bool readFields = true
+        );
+
+
+    //- Destructor
+    virtual ~thermoSingleLayer();
+
+
+    // Member Functions
+
+        // Thermo properties
+
+            //- Return const reference to the SLGThermo object
+            inline const SLGThermo& thermo() const;
+
+            // Single component
+
+                //- Return the Id of component in thermo database
+                inline label liquidId() const;
+
+
+            // Fields
+
+                //- Return the film specific heat capacity [J/kg/K]
+                virtual const volScalarField& Cp() const;
+
+                //- Return the film thermal conductivity [W/m/K]
+                virtual const volScalarField& kappa() const;
+
+                //- Return the film mean temperature [K]
+                virtual const volScalarField& T() const;
+
+                //- Return the film surface temperature [K]
+                virtual const volScalarField& Ts() const;
+
+                //- Return the film wall temperature [K]
+                virtual const volScalarField& Tw() const;
+
+                //- Return the film sensible enthalpy [J/kg]
+                virtual const volScalarField& hs() const;
+
+
+            // Helper functions
+
+                //- Return sensible enthalpy as a function of temperature
+                //  for a patch
+                inline tmp<scalarField> hs
+                (
+                    const scalarField& T,
+                    const label patchI
+                ) const;
+
+                //- Return sensible enthalpy as a function of temperature
+                inline tmp<volScalarField> hs
+                (
+                    const volScalarField& T
+                ) const;
+
+                //- Return temperature as a function of sensible enthalpy
+                inline tmp<volScalarField> T
+                (
+                    const volScalarField& hs
+                ) const;
+
+
+         // Source fields (read/write access)
+
+            //- External hook to add sources to the film
+            virtual void addSources
+            (
+                const label patchI,            // patchI on primary region
+                const label faceI,             // faceI of patchI
+                const scalar massSource,       // [kg]
+                const vector& momentumSource,  // [kg.m/s] (tangential momentum)
+                const scalar pressureSource,   // [kg.m/s] (normal momentum)
+                const scalar energySource      // [J]
+            );
+
+
+        // Source term fields
+
+            // Film region
+
+                //- Energy / [J/m2/s]
+                inline const volScalarField& hsSp() const;
+
+
+            // Primary region
+
+                //- Energy / [J/m2/s]
+                inline const volScalarField& hsSpPrimary() const;
+
+
+        // Fields mapped from the primary region
+
+            //- Temperature / [K]
+            inline const volScalarField& TPrimary() const;
+
+            //- Specie mass fractions / [0-1]
+            inline const PtrList<volScalarField>& YPrimary() const;
+
+
+
+        // Sub-models
+
+            //- Return const access to the (surface) heat transfer model
+            inline const heatTransferModel& htcs() const;
+
+            //- Return const access to the (wall) heat transfer model
+            inline const heatTransferModel& htcw() const;
+
+            //- Return const access to the phase change model
+            inline const phaseChangeModel& phaseChange() const;
+
+            //- Return const access to the radiation model
+            inline const filmRadiationModel& radiation() const;
+
+
+        // Evolution
+
+            //- Pre-evolve film hook
+            virtual void preEvolveRegion();
+
+            //- Evolve the film equations
+            virtual void evolveRegion();
+
+
+        // Source fields
+
+            // Mapped into primary region
+
+                //- Return mass source for specie i - Eulerian phase only
+                virtual tmp<DimensionedField<scalar, volMesh> > Srho
+                (
+                    const label i
+                ) const;
+
+                //- Return enthalpy source - Eulerian phase only
+                virtual tmp<DimensionedField<scalar, volMesh> > Sh() const;
+
+
+       // I-O
+
+            //- Provide some feedback
+            virtual void info() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "thermoSingleLayerI.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/thermoSingleLayer/thermoSingleLayerI.H b/src/regionModels/surfaceFilmModels/thermoSingleLayer/thermoSingleLayerI.H
new file mode 100644
index 0000000000000000000000000000000000000000..c247bbcc75b3183494acf97ab34793fcf529006c
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/thermoSingleLayer/thermoSingleLayerI.H
@@ -0,0 +1,165 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2010 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "thermoSingleLayer.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+inline const SLGThermo& thermoSingleLayer::thermo() const
+{
+    return thermo_;
+}
+
+
+inline label thermoSingleLayer::liquidId() const
+{
+    return liquidId_;
+}
+
+
+inline tmp<scalarField> thermoSingleLayer::hs
+(
+    const scalarField& T,
+    const label patchI
+) const
+{
+    const scalarField& Cp = Cp_.boundaryField()[patchI];
+    return Cp*(T - 298.15);
+}
+
+
+inline tmp<volScalarField> thermoSingleLayer::hs
+(
+    const volScalarField& T
+) const
+{
+    return tmp<volScalarField>
+    (
+        new volScalarField
+        (
+            IOobject
+            (
+                "hs(" + T.name() + ")",
+                time().timeName(),
+                regionMesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE
+            ),
+            Cp_*(T - (dimensionedScalar("Tstd", dimTemperature, 298.15))),
+            zeroGradientFvPatchScalarField::typeName
+        )
+    );
+}
+
+
+inline tmp<volScalarField> thermoSingleLayer::T
+(
+    const volScalarField& hs
+) const
+{
+    return tmp<volScalarField>
+    (
+        new volScalarField
+        (
+            IOobject
+            (
+                "T(" + hs.name() + ")",
+                time().timeName(),
+                regionMesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE
+            ),
+            hs/Cp_ + dimensionedScalar("Tstd", dimTemperature, 298.15),
+            zeroGradientFvPatchScalarField::typeName
+        )
+    );
+}
+
+
+inline const volScalarField& thermoSingleLayer::hsSp() const
+{
+    return hsSp_;
+}
+
+
+inline const volScalarField& thermoSingleLayer::hsSpPrimary() const
+{
+    return hsSpPrimary_;
+}
+
+
+inline const volScalarField& thermoSingleLayer::TPrimary() const
+{
+    return TPrimary_;
+}
+
+
+inline const PtrList<volScalarField>& thermoSingleLayer::YPrimary() const
+{
+    return YPrimary_;
+}
+
+
+inline const heatTransferModel& thermoSingleLayer::htcs() const
+{
+    return htcs_();
+}
+
+
+inline const heatTransferModel& thermoSingleLayer::htcw() const
+{
+    return htcw_();
+}
+
+
+inline const phaseChangeModel& thermoSingleLayer::phaseChange() const
+{
+    return phaseChange_();
+}
+
+
+inline const filmRadiationModel& thermoSingleLayer::radiation() const
+{
+    return radiation_();
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //