diff --git a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/rhoEqn.H b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/rhoEqn.H
index b1770a5a9d56b0b94c6431caf2b1d1adeadf3cb4..33b7943cadd9e1ecb3433927e4e1a5db4fb543df 100644
--- a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/rhoEqn.H
+++ b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/rhoEqn.H
@@ -39,8 +39,6 @@ Description
       + massSource.SuTot()
     );
 
-    rhoEqn.relax();
-
     rhoEqn.solve();
 }
 
diff --git a/applications/utilities/mesh/generation/extrude/extrudeToRegionMesh/createShellMesh.C b/applications/utilities/mesh/generation/extrude/extrudeToRegionMesh/createShellMesh.C
index e57db9f9b3bbe9f7778ccb0f5f96c14a3bf943fb..c2bce48a7a3cd438a3e3d8a5bb38a6f4d67935e7 100644
--- a/applications/utilities/mesh/generation/extrude/extrudeToRegionMesh/createShellMesh.C
+++ b/applications/utilities/mesh/generation/extrude/extrudeToRegionMesh/createShellMesh.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2010-2010 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2010-2011 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -453,6 +453,7 @@ void Foam::createShellMesh::setRefinement
             label region0 = pointRegions_[eFaces[0]][fp0];
             label region1 = pointRegions_[eFaces[0]][fp1];
 
+            // Pick up points with correct normal
             if (layerI == 0)
             {
                 newF[0] = f[fp0];
@@ -468,6 +469,22 @@ void Foam::createShellMesh::setRefinement
                 newF[3] = addedPoints[nLayers*region0+layerI];
             }
 
+            // Optionally rotate so e[0] is always 0th vertex. Note that
+            // this normally is automatically done by coupled face ordering
+            // but with NOORDERING we have to do it ourselves.
+            if (f[fp0] != e[0])
+            {
+                // rotate one back to get newF[1] (originating from e[0])
+                // into newF[0]
+                label v0 = newF[0];
+                for (label i = 0; i < newF.size()-1; i++)
+                {
+                    newF[i] = newF[newF.fcIndex(i)];
+                }
+                newF.last() = v0;
+            }
+
+
             label minCellI = addedCells[nLayers*eFaces[0]+layerI];
             label maxCellI;
             label patchI;
@@ -569,6 +586,21 @@ void Foam::createShellMesh::setRefinement
                         newF[3] = addedPoints[nLayers*region0+layerI];
                     }
 
+
+                    // Optionally rotate so e[0] is always 0th vertex. Note that
+                    // this normally is automatically done by coupled face
+                    // ordering but with NOORDERING we have to do it ourselves.
+                    if (f[fp0] != e[0])
+                    {
+                        // rotate one back to get newF[1] (originating
+                        // from e[0]) into newF[0].
+                        label v0 = newF[0];
+                        for (label i = 0; i < newF.size()-1; i++)
+                        {
+                            newF[i] = newF[newF.fcIndex(i)];
+                        }
+                        newF.last() = v0;
+                    }
                     ////if (ePatches.size() == 0)
                     //{
                     //    Pout<< "Adding from MULTI face:"
diff --git a/etc/controlDict b/etc/controlDict
index cc454666721a383e6ecfe7b7e80af1b24a57cbe9..f34834ca55fef862bff8de4ca87c8712cd66b28b 100644
--- a/etc/controlDict
+++ b/etc/controlDict
@@ -492,6 +492,7 @@ DebugSwitches
     geomCellLooper      0;
     geometricSurfacePatch   0;
     global              0;
+    globalIndexAndTransform 0;
     globalMeshData      0;
     globalPoints        0;
     gnuplot             0;
diff --git a/src/OpenFOAM/algorithms/indexedOctree/indexedOctree.C b/src/OpenFOAM/algorithms/indexedOctree/indexedOctree.C
index 6020d24d196faa3a8075cfe3ddd09a0e5381ad64..10cb44fa272e2d7581a50d0a6083019745358525 100644
--- a/src/OpenFOAM/algorithms/indexedOctree/indexedOctree.C
+++ b/src/OpenFOAM/algorithms/indexedOctree/indexedOctree.C
@@ -2282,7 +2282,7 @@ void Foam::indexedOctree<Type>::writeOBJ
     {
         subBb = nodes_[getNode(index)].bb_;
     }
-    else if (isContent(index))
+    else if (isContent(index) || isEmpty(index))
     {
         subBb = nodes_[nodeI].bb_.subBbox(octant);
     }
@@ -2290,17 +2290,21 @@ void Foam::indexedOctree<Type>::writeOBJ
     Pout<< "dumpContentNode : writing node:" << nodeI << " octant:" << octant
         << " to " << str.name() << endl;
 
-    label vertI = 0;
-
     // Dump bounding box
     pointField bbPoints(subBb.points());
 
-    label pointVertI = vertI;
+    forAll(bbPoints, i)
+    {
+        const point& pt = bbPoints[i];
+
+        str<< "v " << pt.x() << ' ' << pt.y() << ' ' << pt.z() << endl;
+    }
+
     forAll(treeBoundBox::edges, i)
     {
         const edge& e = treeBoundBox::edges[i];
 
-        str<< "l " << e[0]+pointVertI+1 << ' ' << e[1]+pointVertI+1 << nl;
+        str<< "l " << e[0] + 1 << ' ' << e[1] + 1 << nl;
     }
 }
 
@@ -2852,6 +2856,11 @@ void Foam::indexedOctree<Type>::print
         {
             const labelList& indices = contents_[getContent(index)];
 
+            if (debug)
+            {
+                writeOBJ(nodeI, octant);
+            }
+
             os  << "octant:" << octant
                 << " content: n:" << indices.size()
                 << " bb:" << subBb;
@@ -2868,6 +2877,11 @@ void Foam::indexedOctree<Type>::print
         }
         else
         {
+            if (debug)
+            {
+                writeOBJ(nodeI, octant);
+            }
+
             os  << "octant:" << octant << " empty:" << subBb << endl;
         }
     }
diff --git a/src/OpenFOAM/meshes/meshShapes/face/face.C b/src/OpenFOAM/meshes/meshShapes/face/face.C
index 4060404af7e5e8323f2497a364368e4e0df247d0..4128afc9a9036a0a8f79528c2ce6d7ca16f2ecb4 100644
--- a/src/OpenFOAM/meshes/meshShapes/face/face.C
+++ b/src/OpenFOAM/meshes/meshShapes/face/face.C
@@ -499,7 +499,7 @@ Foam::point Foam::face::centre(const pointField& points) const
     const label nPoints = size();
 
     // If the face is a triangle, do a direct calculation
-    if (nPoints)
+    if (nPoints == 3)
     {
         return
             (1.0/3.0)
diff --git a/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransform.C b/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransform.C
index 7032e74a745ca5558ae13f043bfd7f4faa787565..b73020d735a8a6344a57fbd562da6be77b57fd44 100644
--- a/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransform.C
+++ b/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransform.C
@@ -24,11 +24,12 @@ License
 \*---------------------------------------------------------------------------*/
 
 #include "globalIndexAndTransform.H"
-#include "coupledPolyPatch.H"
 #include "cyclicPolyPatch.H"
 
 // * * * * * * * * * * * * Private Static Data Members * * * * * * * * * * * //
 
+defineTypeNameAndDebug(Foam::globalIndexAndTransform, 0);
+
 const Foam::label Foam::globalIndexAndTransform::base_ = 32;
 
 
@@ -478,6 +479,41 @@ Foam::globalIndexAndTransform::globalIndexAndTransform
     determineTransformPermutations();
 
     determinePatchTransformSign();
+
+    if (debug && transforms_.size() > 1)
+    {
+        Info<< "Determined global transforms :" << endl;
+        Info<< "\t\ttranslation\trotation" << endl;
+        forAll(transforms_, i)
+        {
+            Info<< '\t' << i << '\t';
+            if (transforms_[i].hasR())
+            {
+                 Info<< transforms_[i].t() << '\t' << transforms_[i].R();
+            }
+            else
+            {
+                 Info<< transforms_[i].t() << '\t' << "---";
+            }
+            Info<< endl;
+        }
+        Info<< endl;
+
+        const polyBoundaryMesh& patches = mesh_.boundaryMesh();
+
+        Info<< "\tpatch\ttransform\tsign" << endl;
+        forAll(patchTransformSign_, patchI)
+        {
+            if (patchTransformSign_[patchI].first() != -1)
+            {
+                Info<< '\t' << patches[patchI].name()
+                    << '\t' << patchTransformSign_[patchI].first()
+                    << '\t' << patchTransformSign_[patchI].second()
+                    << endl;
+            }
+        }
+        Info<< endl;
+    }
 }
 
 
diff --git a/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransform.H b/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransform.H
index d9919309fef7ff61e54d38a8311a1e0ddf61197f..0e3cc3f455e1b5f012cb5af8317ae93baf6d0937 100644
--- a/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransform.H
+++ b/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransform.H
@@ -164,6 +164,10 @@ public:
         friend class globalPoints;
 
 
+    // Declare name of the class and its debug switch
+    ClassName("globalIndexAndTransform");
+
+
     // Constructors
 
         //- Construct from components
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/hexRef8.H b/src/dynamicMesh/polyTopoChange/polyTopoChange/hexRef8.H
index 240e8ace42d9bdc55f73faf8dcb2b218ef8f42c5..2f4d4adc43cb34968a6b801dbc27059d8c13a215 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/hexRef8.H
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/hexRef8.H
@@ -344,6 +344,11 @@ public:
 
         // Access
 
+            const polyMesh& mesh() const
+            {
+                return mesh_;
+            }
+
             const labelIOList& cellLevel() const
             {
                 return cellLevel_;
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/refinementHistory.C b/src/dynamicMesh/polyTopoChange/polyTopoChange/refinementHistory.C
index 9f3911b164ff874264257680fb3ad0f777c6f461..ccd822d49960af02c7a4756179216645f4be3b64 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/refinementHistory.C
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/refinementHistory.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2004-2010 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2004-2011 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -690,9 +690,9 @@ void Foam::refinementHistory::distribute(const mapDistributePolyMesh& map)
     // Remove unreferenced history.
     compact();
 
-    Pout<< nl << "--BEFORE:" << endl;
-    writeDebug();
-    Pout<< "---------" << nl << endl;
+    //Pout<< nl << "--BEFORE:" << endl;
+    //writeDebug();
+    //Pout<< "---------" << nl << endl;
 
 
     // Distribution is only partially functional.
@@ -746,18 +746,18 @@ void Foam::refinementHistory::distribute(const mapDistributePolyMesh& map)
         }
     }
 
-Pout<< "refinementHistory::distribute :"
-    << " splitCellProc:" << splitCellProc << endl;
-
-Pout<< "refinementHistory::distribute :"
-    << " splitCellNum:" << splitCellNum << endl;
+    //Pout<< "refinementHistory::distribute :"
+    //    << " splitCellProc:" << splitCellProc << endl;
+    //
+    //Pout<< "refinementHistory::distribute :"
+    //    << " splitCellNum:" << splitCellNum << endl;
 
 
     // Create subsetted refinement tree consisting of all parents that
     // move in their whole to other processor.
     for (label procI = 0; procI < Pstream::nProcs(); procI++)
     {
-        Pout<< "-- Subetting for processor " << procI << endl;
+        //Pout<< "-- Subetting for processor " << procI << endl;
 
         // From uncompacted to compacted splitCells.
         labelList oldToNew(splitCells_.size(), -1);
@@ -781,10 +781,10 @@ Pout<< "refinementHistory::distribute :"
                 oldToNew[index] = newSplitCells.size();
                 newSplitCells.append(splitCells_[index]);
 
-                Pout<< "Added oldCell " << index
-                    << " info " << newSplitCells.last()
-                    << " at position " << newSplitCells.size()-1
-                    << endl;
+                //Pout<< "Added oldCell " << index
+                //    << " info " << newSplitCells.last()
+                //    << " at position " << newSplitCells.size()-1
+                //    << endl;
             }
         }
 
@@ -797,9 +797,9 @@ Pout<< "refinementHistory::distribute :"
             {
                 label parent = splitCells_[index].parent_;
 
-                Pout<< "Adding refined cell " << cellI
-                    << " since moves to "
-                    << procI << " old parent:" << parent << endl;
+                //Pout<< "Adding refined cell " << cellI
+                //    << " since moves to "
+                //    << procI << " old parent:" << parent << endl;
 
                 // Create new splitCell with parent
                 oldToNew[index] = newSplitCells.size();
@@ -891,8 +891,8 @@ Pout<< "refinementHistory::distribute :"
         // renumbering can be done here.
         label offset = splitCells_.size();
 
-        Pout<< "**Renumbering data from proc " << procI << " with offset "
-            << offset << endl;
+        //Pout<< "**Renumbering data from proc " << procI << " with offset "
+        //    << offset << endl;
 
         forAll(newSplitCells, index)
         {
@@ -929,9 +929,9 @@ Pout<< "refinementHistory::distribute :"
     }
     splitCells_.shrink();
 
-    Pout<< nl << "--AFTER:" << endl;
-    writeDebug();
-    Pout<< "---------" << nl << endl;
+    //Pout<< nl << "--AFTER:" << endl;
+    //writeDebug();
+    //Pout<< "---------" << nl << endl;
 }
 
 
diff --git a/src/finiteVolume/Make/files b/src/finiteVolume/Make/files
index 854c89211b42cb1a94c0772af9309573bd49c2b6..817381be6194ccea96d53281d062c83777b8b642 100644
--- a/src/finiteVolume/Make/files
+++ b/src/finiteVolume/Make/files
@@ -204,8 +204,8 @@ $(interpolation)/interpolationCellPoint/makeInterpolationCellPoint.C
 $(interpolation)/interpolationCellPointFace/makeInterpolationCellPointFace.C
 $(interpolation)/interpolationCellPointWallModified/cellPointWeightWallModified/cellPointWeightWallModified.C
 $(interpolation)/interpolationCellPointWallModified/makeInterpolationCellPointWallModified.C
-$(interpolation)/interpolationPoint/pointMVCWeight.C
-$(interpolation)/interpolationPoint/makeInterpolationPoint.C
+$(interpolation)/interpolationPointMVC/pointMVCWeight.C
+$(interpolation)/interpolationPointMVC/makeInterpolationPointMVC.C
 
 volPointInterpolation = interpolation/volPointInterpolation
 $(volPointInterpolation)/volPointInterpolation.C
diff --git a/src/finiteVolume/fvMesh/fvMesh.H b/src/finiteVolume/fvMesh/fvMesh.H
index 6a98e07ed22a29ada56727df5b822b28b7f3a077..976c8e46c965c9b9d426df574f6024519888911e 100644
--- a/src/finiteVolume/fvMesh/fvMesh.H
+++ b/src/finiteVolume/fvMesh/fvMesh.H
@@ -42,16 +42,6 @@ SourceFiles
     fvMesh.C
     fvMeshGeometry.C
 
-See Also
-    hmm
-
-Usage
-    oeuoeuoeu
-
-ToDo
-    oeuoeuoeu
-    oeueouoeu
-
 \*---------------------------------------------------------------------------*/
 
 #ifndef fvMesh_H
diff --git a/src/finiteVolume/interpolation/interpolation/interpolationPoint/interpolationPoint.C b/src/finiteVolume/interpolation/interpolation/interpolationPointMVC/interpolationPointMVC.C
similarity index 90%
rename from src/finiteVolume/interpolation/interpolation/interpolationPoint/interpolationPoint.C
rename to src/finiteVolume/interpolation/interpolation/interpolationPointMVC/interpolationPointMVC.C
index 516bb142db564bf6d58cc0a185ab857f4d2c09e1..592b9bf47fd8f3da88ff8787f037e20dd95fb7cf 100644
--- a/src/finiteVolume/interpolation/interpolation/interpolationPoint/interpolationPoint.C
+++ b/src/finiteVolume/interpolation/interpolation/interpolationPointMVC/interpolationPointMVC.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2004-2010 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2010-2011 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -23,13 +23,13 @@ License
 
 \*---------------------------------------------------------------------------*/
 
-#include "interpolationPoint.H"
+#include "interpolationPointMVC.H"
 #include "volPointInterpolation.H"
 
 // * * * * * * * * * * * * * * * * Constructor * * * * * * * * * * * * * * * //
 
 template<class Type>
-Foam::interpolationPoint<Type>::interpolationPoint
+Foam::interpolationPointMVC<Type>::interpolationPointMVC
 (
     const GeometricField<Type, fvPatchField, volMesh>& psi
 )
diff --git a/src/finiteVolume/interpolation/interpolation/interpolationPoint/interpolationPoint.H b/src/finiteVolume/interpolation/interpolation/interpolationPointMVC/interpolationPointMVC.H
similarity index 88%
rename from src/finiteVolume/interpolation/interpolation/interpolationPoint/interpolationPoint.H
rename to src/finiteVolume/interpolation/interpolation/interpolationPointMVC/interpolationPointMVC.H
index 013ca766169707658d169db980d0375f13c8c708..8b7ba07fae1d060025a527c2926ee5bf10ab2a39 100644
--- a/src/finiteVolume/interpolation/interpolation/interpolationPoint/interpolationPoint.H
+++ b/src/finiteVolume/interpolation/interpolation/interpolationPointMVC/interpolationPointMVC.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2004-2010 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2010-2011 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -22,7 +22,7 @@ License
     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
 
 Class
-    Foam::interpolationPoint
+    Foam::interpolationPointMVC
 
 Description
     Given cell centre values interpolates to vertices and uses these to
@@ -30,8 +30,8 @@ Description
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef interpolationPoint_H
-#define interpolationPoint_H
+#ifndef interpolationPointMVC_H
+#define interpolationPointMVC_H
 
 #include "interpolation.H"
 #include "pointMVCWeight.H"
@@ -42,11 +42,11 @@ namespace Foam
 {
 
 /*---------------------------------------------------------------------------*\
-                   Class interpolationPoint Declaration
+                   Class interpolationPointMVC Declaration
 \*---------------------------------------------------------------------------*/
 
 template<class Type>
-class interpolationPoint
+class interpolationPointMVC
 :
     public interpolation<Type>
 {
@@ -57,16 +57,17 @@ protected:
         //- Interpolated volfield
         const GeometricField<Type, pointPatchField, pointMesh> psip_;
 
+
 public:
 
     //- Runtime type information
-    TypeName("point");
+    TypeName("pointMVC");
 
 
     // Constructors
 
         //- Construct from components
-        interpolationPoint
+        interpolationPointMVC
         (
             const GeometricField<Type, fvPatchField, volMesh>& psi
         );
@@ -93,12 +94,12 @@ public:
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-#include "interpolationPointI.H"
+#include "interpolationPointMVCI.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 #ifdef NoRepository
-#   include "interpolationPoint.C"
+#   include "interpolationPointMVC.C"
 #endif
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/finiteVolume/interpolation/interpolation/interpolationPoint/interpolationPointI.H b/src/finiteVolume/interpolation/interpolation/interpolationPointMVC/interpolationPointMVCI.H
similarity index 89%
rename from src/finiteVolume/interpolation/interpolation/interpolationPoint/interpolationPointI.H
rename to src/finiteVolume/interpolation/interpolation/interpolationPointMVC/interpolationPointMVCI.H
index a3f47c3a0ae22b2082120d77e61cf05b8e0589ee..7d2a79f86fd06847699bbeec598cda34186b1b26 100644
--- a/src/finiteVolume/interpolation/interpolation/interpolationPoint/interpolationPointI.H
+++ b/src/finiteVolume/interpolation/interpolation/interpolationPointMVC/interpolationPointMVCI.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2004-2010 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2010-2011 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -26,7 +26,7 @@ License
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class Type>
-inline Type Foam::interpolationPoint<Type>::interpolate
+inline Type Foam::interpolationPointMVC<Type>::interpolate
 (
     const pointMVCWeight& cpw
 ) const
@@ -36,7 +36,7 @@ inline Type Foam::interpolationPoint<Type>::interpolate
 
 
 template<class Type>
-inline Type Foam::interpolationPoint<Type>::interpolate
+inline Type Foam::interpolationPointMVC<Type>::interpolate
 (
     const vector& position,
     const label cellI,
diff --git a/src/finiteVolume/interpolation/interpolation/interpolationPoint/makeInterpolationPoint.C b/src/finiteVolume/interpolation/interpolation/interpolationPointMVC/makeInterpolationPointMVC.C
similarity index 89%
rename from src/finiteVolume/interpolation/interpolation/interpolationPoint/makeInterpolationPoint.C
rename to src/finiteVolume/interpolation/interpolation/interpolationPointMVC/makeInterpolationPointMVC.C
index b27f807019f6ae81e4f55ada603b8724a1ae8670..a5882e17e725c6af85af66e644b2098aac3b552d 100644
--- a/src/finiteVolume/interpolation/interpolation/interpolationPoint/makeInterpolationPoint.C
+++ b/src/finiteVolume/interpolation/interpolation/interpolationPointMVC/makeInterpolationPointMVC.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2004-2010 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2010-2011 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -23,13 +23,13 @@ License
 
 \*---------------------------------------------------------------------------*/
 
-#include "interpolationPoint.H"
+#include "interpolationPointMVC.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 namespace Foam
 {
-    makeInterpolation(interpolationPoint);
+    makeInterpolation(interpolationPointMVC);
 }
 
 // ************************************************************************* //
diff --git a/src/finiteVolume/interpolation/interpolation/interpolationPoint/pointMVCWeight.C b/src/finiteVolume/interpolation/interpolation/interpolationPointMVC/pointMVCWeight.C
similarity index 88%
rename from src/finiteVolume/interpolation/interpolation/interpolationPoint/pointMVCWeight.C
rename to src/finiteVolume/interpolation/interpolation/interpolationPointMVC/pointMVCWeight.C
index f011d5e6fb2eb0f0d742e28879c97d6cacd2c01b..3ff902c397021c638320e37c3187e16c68f2d26e 100644
--- a/src/finiteVolume/interpolation/interpolation/interpolationPoint/pointMVCWeight.C
+++ b/src/finiteVolume/interpolation/interpolation/interpolationPointMVC/pointMVCWeight.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2004-2010 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2010-2011 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -56,7 +56,7 @@ void Foam::pointMVCWeight::calcWeights
     forAll(f, j)
     {
         label jPlus1 = f.fcIndex(j);
-        scalar l = mag(u[j]-u[jPlus1]);
+        scalar l = mag(u[j] - u[jPlus1]);
         theta[j] = 2.0*Foam::asin(l/2.0);
     }
 
@@ -68,7 +68,7 @@ void Foam::pointMVCWeight::calcWeights
         weights[pid] =
             1.0
           / dist[pid]
-          * (Foam::tan(theta[jMin1]/2.0)+Foam::tan(theta[j]/2.0));
+          * (Foam::tan(theta[jMin1]/2.0) + Foam::tan(theta[j]/2.0));
         sumWeight += weights[pid];
     }
 
@@ -132,11 +132,10 @@ void Foam::pointMVCWeight::calcWeights
             //Pout<< "    uj:" << u[j] << " ujPlus1:" << u[jPlus1]
             //    << " temp:" << temp << endl;
 
-            scalar l = mag(u[j]-u[jPlus1]);
+            scalar l = min(mag(u[j] - u[jPlus1]), 2.0);
             scalar angle = 2.0*Foam::asin(l/2.0);
 
-            //Pout<< "    j:" << j << " l:" << l
-            //    << " angle:" << angle << endl;
+            //Pout<< "    j:" << j << " l:" << l << " angle:" << angle << endl;
 
             v += 0.5*angle*temp;
         }
@@ -145,14 +144,14 @@ void Foam::pointMVCWeight::calcWeights
         v /= vNorm;
 
         // Make sure v points towards the polygon
-//if (((v&u[0]) < 0) != (mesh.faceOwner()[faceI] != cellIndex_))
-//{
-//    FatalErrorIn("pointMVCWeight::calcWeights(..)")
-//        << "v:" << v << " u[0]:" << u[0]
-//        << exit(FatalError);
-//}
-
-        if ((v&u[0]) < 0)
+        //if (((v&u[0]) < 0) != (mesh.faceOwner()[faceI] != cellIndex_))
+        //{
+        //    FatalErrorIn("pointMVCWeight::calcWeights(..)")
+        //        << "v:" << v << " u[0]:" << u[0]
+        //        << exit(FatalError);
+        //}
+
+        if ((v & u[0]) < 0)
         {
             v = -v;
         }
@@ -165,22 +164,22 @@ void Foam::pointMVCWeight::calcWeights
             label jPlus1 = f.fcIndex(j);
             //Pout<< "    uj:" << u[j] << " ujPlus1:" << u[jPlus1] << endl;
 
-            vector n0 = u[j] ^ v;
+            vector n0 = u[j]^v;
             n0 /= mag(n0);
-            vector n1 = u[jPlus1] ^ v;
+            vector n1 = u[jPlus1]^v;
             n1 /= mag(n1);
 
-            scalar l = mag(n0-n1);
+            scalar l = min(mag(n0 - n1), 2.0);
             //Pout<< "    l:" << l << endl;
             alpha(j) = 2.0*Foam::asin(l/2.0);
 
-            vector temp = n0 ^ n1;
+            vector temp = n0^n1;
             if ((temp&v) < 0.0)
             {
                 alpha[j] = -alpha[j];
             }
 
-            l = mag(u[j]-v);
+            l = min(mag(u[j] - v), 2.0);
             //Pout<< "    l:" << l << endl;
             theta(j) = 2.0*Foam::asin(l/2.0);
         }
@@ -211,7 +210,7 @@ void Foam::pointMVCWeight::calcWeights
             sum +=
                 1.0
               / Foam::tan(theta[j])
-              * (Foam::tan(alpha[j]/2.0)+Foam::tan(alpha[jMin1]/2.0));
+              * (Foam::tan(alpha[j]/2.0) + Foam::tan(alpha[jMin1]/2.0));
         }
 
         // The special case when x lies on the polygon, handle it using 2D mvc.
@@ -234,7 +233,7 @@ void Foam::pointMVCWeight::calcWeights
               / sum
               / dist[pid]
               / Foam::sin(theta[j])
-              * (Foam::tan(alpha[j]/2.0)+Foam::tan(alpha[jMin1]/2.0));
+              * (Foam::tan(alpha[j]/2.0) + Foam::tan(alpha[jMin1]/2.0));
         }
     }
 
diff --git a/src/finiteVolume/interpolation/interpolation/interpolationPoint/pointMVCWeight.H b/src/finiteVolume/interpolation/interpolation/interpolationPointMVC/pointMVCWeight.H
similarity index 98%
rename from src/finiteVolume/interpolation/interpolation/interpolationPoint/pointMVCWeight.H
rename to src/finiteVolume/interpolation/interpolation/interpolationPointMVC/pointMVCWeight.H
index 285114de4b47854319bd4d5139786173efefccf2..cc16c1dfbb1253188349359501701a074c5c816f 100644
--- a/src/finiteVolume/interpolation/interpolation/interpolationPoint/pointMVCWeight.H
+++ b/src/finiteVolume/interpolation/interpolation/interpolationPointMVC/pointMVCWeight.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2004-2010 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2010-2011 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
diff --git a/src/finiteVolume/interpolation/interpolation/interpolationPoint/pointMVCWeightI.H b/src/finiteVolume/interpolation/interpolation/interpolationPointMVC/pointMVCWeightI.H
similarity index 96%
rename from src/finiteVolume/interpolation/interpolation/interpolationPoint/pointMVCWeightI.H
rename to src/finiteVolume/interpolation/interpolation/interpolationPointMVC/pointMVCWeightI.H
index b2f1fc554585767ce3976976eada1215907028e2..329b6fb3418bd1f19dab36fa040091428c7f2bda 100644
--- a/src/finiteVolume/interpolation/interpolation/interpolationPoint/pointMVCWeightI.H
+++ b/src/finiteVolume/interpolation/interpolation/interpolationPointMVC/pointMVCWeightI.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2004-2010 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2010-2011 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.C
index e4bb8b187890b4aca161abeadc67bb487340e487..639276e7cd30be160380372fb13d6fb31ede9e98 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.C
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.C
@@ -89,12 +89,12 @@ Foam::CloudFunctionObjectList<CloudType>::CloudFunctionObjectList
 template<class CloudType>
 Foam::CloudFunctionObjectList<CloudType>::CloudFunctionObjectList
 (
-    const CloudFunctionObjectList& ppm
+    const CloudFunctionObjectList& cfol
 )
 :
-    PtrList<CloudFunctionObject<CloudType> >(ppm),
-    owner_(ppm.owner_),
-    dict_(ppm.dict_)
+    PtrList<CloudFunctionObject<CloudType> >(cfol),
+    owner_(cfol.owner_),
+    dict_(cfol.dict_)
 {}
 
 
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.C
index b3cdad013e61c74f57e3b800bbe0f9c341bbc1a3..024f4396661b89408ea96f4f97b2305f2183a59f 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.C
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.C
@@ -66,10 +66,9 @@ void Foam::FacePostProcessing<CloudType>::write()
     const label procI = Pstream::myProcNo();
 
     scalarListList allProcMass(Pstream::nProcs());
-    allProcMass[procI].setSize(massTotal_.size());
     allProcMass[procI] = massTotal_;
     Pstream::gatherList(allProcMass);
-    scalarList allMass
+    scalarField allMass
     (
         ListListOps::combine<scalarList>
         (
@@ -78,10 +77,9 @@ void Foam::FacePostProcessing<CloudType>::write()
     );
 
     scalarListList allProcMassFlux(Pstream::nProcs());
-    allProcMassFlux[procI].setSize(massFlux_.size());
     allProcMassFlux[procI] = massFlux_;
     Pstream::gatherList(allProcMassFlux);
-    scalarList allMassFlux
+    scalarField allMassFlux
     (
         ListListOps::combine<scalarList>
         (
@@ -109,16 +107,8 @@ void Foam::FacePostProcessing<CloudType>::write()
 
         pointField uniquePoints(mesh.points(), uniqueMeshPointLabels);
         List<pointField> allProcPoints(Pstream::nProcs());
-        allProcPoints[procI].setSize(uniquePoints.size());
         allProcPoints[procI] = uniquePoints;
         Pstream::gatherList(allProcPoints);
-        pointField allPoints
-        (
-            ListListOps::combine<pointField>
-            (
-                allProcPoints, accessOp<pointField>()
-            )
-        );
 
         faceList faces(fZone_().localFaces());
         forAll(faces, i)
@@ -126,20 +116,27 @@ void Foam::FacePostProcessing<CloudType>::write()
             inplaceRenumber(pointToGlobal, faces[i]);
         }
         List<faceList> allProcFaces(Pstream::nProcs());
-        allProcFaces[procI].setSize(faces.size());
         allProcFaces[procI] = faces;
         Pstream::gatherList(allProcFaces);
-        faceList allFaces
-        (
-            ListListOps::combine<faceList>
-            (
-                allProcFaces, accessOp<faceList>()
-            )
-        );
-
 
         if (Pstream::master())
         {
+            pointField allPoints
+            (
+                ListListOps::combine<pointField>
+                (
+                    allProcPoints, accessOp<pointField>()
+                )
+            );
+
+            faceList allFaces
+            (
+                ListListOps::combine<faceList>
+                (
+                    allProcFaces, accessOp<faceList>()
+                )
+            );
+
             fileName outputDir = mesh.time().path();
 
             if (Pstream::parRun())
@@ -165,7 +162,7 @@ void Foam::FacePostProcessing<CloudType>::write()
                 allPoints,
                 allFaces,
                 "massTotal",
-                massTotal_,
+                allMass,
                 false
             );
             writer->write
@@ -175,7 +172,7 @@ void Foam::FacePostProcessing<CloudType>::write()
                 allPoints,
                 allFaces,
                 "massFlux",
-                massFlux_,
+                allMassFlux,
                 false
             );
         }
diff --git a/src/meshTools/indexedOctree/treeDataPrimitivePatch.C b/src/meshTools/indexedOctree/treeDataPrimitivePatch.C
index e6b485d6f42ef124d53ebf4c47f8dcb0b93d8e25..ac73884fa4801103aed139d25234d3e6d67b0ce4 100644
--- a/src/meshTools/indexedOctree/treeDataPrimitivePatch.C
+++ b/src/meshTools/indexedOctree/treeDataPrimitivePatch.C
@@ -307,7 +307,7 @@ getVolumeType
 
             forAll(eFaces, i)
             {
-                edgeNormal += patch_.faceNormal()[eFaces[i]];
+                edgeNormal += patch_.faceNormals()[eFaces[i]];
             }
 
             if (debug & 2)
diff --git a/src/meshTools/octree/octree.C b/src/meshTools/octree/octree.C
index 86c2ffc62a1f3faadfbaa2af2e03c3ddea948093..8731f0ef1ffa6eaec3b967d59c6e9932ea40871b 100644
--- a/src/meshTools/octree/octree.C
+++ b/src/meshTools/octree/octree.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2004-2010 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2004-2011 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -149,6 +149,7 @@ Foam::octree<Type>::octree
     //  - has some guaranteed maximum size (maxShapeRatio)
 
     label oldNLeaves = -1;  // make test below pass first time.
+    label oldNNodes  = -1;
     deepestLevel_ = 1;
     while
     (
@@ -169,11 +170,11 @@ Foam::octree<Type>::octree
             break;
         }
 
-        if (oldNLeaves == nLeaves())
+        if ((oldNLeaves == nLeaves()) && (oldNNodes == nNodes()))
         {
             if (debug & 1)
             {
-                Pout<< "octree : exiting since nLeaves does not change"
+                Pout<< "octree : exiting since nLeaves and nNodes do not change"
                     << endl;
             }
             break;
@@ -185,6 +186,7 @@ Foam::octree<Type>::octree
         }
 
         oldNLeaves = nLeaves();
+        oldNNodes  = nNodes();
 
         topNode_->redistribute
         (
diff --git a/src/postProcessing/functionObjects/IO/Make/files b/src/postProcessing/functionObjects/IO/Make/files
index a3517e560f1e3a3349b3dee8930ec12a8e420086..a00b7575f1818723bb0aca82ae027f402b1fd8d7 100644
--- a/src/postProcessing/functionObjects/IO/Make/files
+++ b/src/postProcessing/functionObjects/IO/Make/files
@@ -1,3 +1,6 @@
+partialWrite/partialWrite.C
+partialWrite/partialWriteFunctionObject.C
+
 writeRegisteredObject/writeRegisteredObject.C
 writeRegisteredObject/writeRegisteredObjectFunctionObject.C
 
diff --git a/src/postProcessing/functionObjects/IO/controlDict b/src/postProcessing/functionObjects/IO/controlDict
new file mode 100644
index 0000000000000000000000000000000000000000..4daa3a1c15873c3967e51b137689fbc934bd7894
--- /dev/null
+++ b/src/postProcessing/functionObjects/IO/controlDict
@@ -0,0 +1,88 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  1.7.1                                 |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application     icoFoam;
+
+startFrom       startTime;
+
+startTime       0;
+
+stopAt          endTime;
+
+endTime         0.5;
+
+deltaT          0.005;
+
+writeControl    timeStep;
+
+writeInterval   20;
+
+purgeWrite      0;
+
+writeFormat     ascii;
+
+writePrecision  6;
+
+writeCompression uncompressed;
+
+timeFormat      general;
+
+timePrecision   6;
+
+runTimeModifiable yes;
+
+functions
+{
+    partialWrite
+    {
+        // Write some registered objects more often than others.
+        // Above writeControl determines most frequent dump.
+
+        type            partialWrite;
+
+        // Where to load it from
+        functionObjectLibs ("libIOFunctionObjects.so");
+
+        // Execute upon outputTime
+        outputControl   outputTime;
+
+        // Objects to write every outputTime
+        objectNames    (p);
+        // Write as normal every writeInterval'th outputTime.
+        writeInterval   3;
+    }
+
+    dumpObjects
+    {
+        // Forcibly write registered objects. E.g. fields that have been
+        // created with NO_READ.
+
+        type            writeRegisteredObject;
+
+        // Where to load it from
+        functionObjectLibs ("libIOFunctionObjects.so");
+
+        // Execute upon outputTime
+        outputControl   outputTime;
+
+        // Objects to write
+        objectNames    ();
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/IO/partialWrite/IOpartialWrite.H b/src/postProcessing/functionObjects/IO/partialWrite/IOpartialWrite.H
new file mode 100644
index 0000000000000000000000000000000000000000..961f2b6d558559b4d3d4d46ac589fd6f4cf30864
--- /dev/null
+++ b/src/postProcessing/functionObjects/IO/partialWrite/IOpartialWrite.H
@@ -0,0 +1,49 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Typedef
+    Foam::IOpartialWrite
+
+Description
+    Instance of the generic IOOutputFilter for partialWrite.
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef IOpartialWrite_H
+#define IOpartialWrite_H
+
+#include "partialWrite.H"
+#include "IOOutputFilter.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    typedef IOOutputFilter<partialWrite> IOpartialWrite;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/IO/partialWrite/partialWrite.C b/src/postProcessing/functionObjects/IO/partialWrite/partialWrite.C
new file mode 100644
index 0000000000000000000000000000000000000000..327c7b804ad0d93fc54b8f600780cd00d5475126
--- /dev/null
+++ b/src/postProcessing/functionObjects/IO/partialWrite/partialWrite.C
@@ -0,0 +1,142 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "partialWrite.H"
+#include "dictionary.H"
+#include "Time.H"
+#include "IOobjectList.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTypeNameAndDebug(partialWrite, 0);
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::partialWrite::partialWrite
+(
+    const word& name,
+    const objectRegistry& obr,
+    const dictionary& dict,
+    const bool loadFromFiles
+)
+:
+    name_(name),
+    obr_(obr)
+{
+    read(dict);
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::partialWrite::~partialWrite()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void Foam::partialWrite::read(const dictionary& dict)
+{
+    dict.lookup("objectNames") >> objectNames_;
+    dict.lookup("writeInterval") >> writeInterval_;
+    writeInstance_ = 0;
+
+    Info<< type() << " " << name() << ":" << nl
+        << "    dumping every outputTime :";
+    forAllConstIter(HashSet<word>, objectNames_, iter)
+    {
+        Info<< ' ' << iter.key();
+    }
+    Info<< nl
+        << "    dumping all other fields every "
+        << writeInterval_ << "th outputTime" << nl
+        << endl;
+
+    if (writeInterval_ < 1)
+    {
+        FatalIOErrorIn("partialWrite::read(const dictionary&)", dict)
+            << "Illegal value for writeInterval " << writeInterval_
+            << ". It should be >= 1."
+            << exit(FatalIOError);
+    }
+}
+
+
+void Foam::partialWrite::execute()
+{
+    //Pout<< "execute at time " << obr_.time().timeName()
+    //    << " index:" << obr_.time().timeIndex() << endl;
+}
+
+
+void Foam::partialWrite::end()
+{
+    //Pout<< "end at time " << obr_.time().timeName() << endl;
+    // Do nothing - only valid on write
+}
+
+
+void Foam::partialWrite::write()
+{
+    //Pout<< "write at time " << obr_.time().timeName() << endl;
+    if (obr_.time().outputTime())
+    {
+        // Above check so it can be used both with
+        //  outputControl   timeStep;
+        //  outputInterval  1;
+        // or with
+        //  outputControl   outputTime;
+
+        writeInstance_++;
+
+        if (writeInstance_ == writeInterval_)
+        {
+            // Normal dump
+            writeInstance_ = 0;
+        }
+        else
+        {
+            // Delete all but marked objects
+            IOobjectList objects(obr_, obr_.time().timeName());
+
+            forAllConstIter(HashPtrTable<IOobject>, objects, iter)
+            {
+                if (!objectNames_.found(iter()->name()))
+                {
+                    const fileName f = obr_.time().timePath()/iter()->name();
+                    //Pout<< "   rm " << f << endl;
+                    rm(f);
+                }
+            }
+        }
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/IO/partialWrite/partialWrite.H b/src/postProcessing/functionObjects/IO/partialWrite/partialWrite.H
new file mode 100644
index 0000000000000000000000000000000000000000..b51b9d1741594aa15bacfffe7975b5f811ac3ea3
--- /dev/null
+++ b/src/postProcessing/functionObjects/IO/partialWrite/partialWrite.H
@@ -0,0 +1,156 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::partialWrite
+
+Description
+    Allows some fields/registered objects to be written more often than others.
+
+    Works in the opposite way: deletes at intermediate times all
+    but selected fields.
+
+SourceFiles
+    partialWrite.C
+    IOpartialWrite.H
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef partialWrite_H
+#define partialWrite_H
+
+#include "pointFieldFwd.H"
+#include "HashSet.H"
+#include "DynamicList.H"
+#include "runTimeSelectionTables.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// Forward declaration of classes
+class objectRegistry;
+class dictionary;
+class mapPolyMesh;
+
+/*---------------------------------------------------------------------------*\
+                   Class partialWrite Declaration
+\*---------------------------------------------------------------------------*/
+
+class partialWrite
+{
+protected:
+
+    // Private data
+
+        //- Name of this set of partialWrite
+        word name_;
+
+        const objectRegistry& obr_;
+
+
+        // Read from dictionary
+
+            //- Names of objects to dump always
+            HashSet<word> objectNames_;
+
+            //- Write interval for restart dump
+            label writeInterval_;
+
+
+        //- Current dump instance. If reaches writeInterval do a full write.
+        label writeInstance_;
+
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        partialWrite(const partialWrite&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const partialWrite&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("partialWrite");
+
+
+    // Constructors
+
+        //- Construct for given objectRegistry and dictionary.
+        //  Allow the possibility to load fields from files
+        partialWrite
+        (
+            const word& name,
+            const objectRegistry&,
+            const dictionary&,
+            const bool loadFromFiles = false
+        );
+
+
+    //- Destructor
+    virtual ~partialWrite();
+
+
+    // Member Functions
+
+        //- Return name of the partialWrite
+        virtual const word& name() const
+        {
+            return name_;
+        }
+
+        //- Read the partialWrite data
+        virtual void read(const dictionary&);
+
+        //- Execute, currently does nothing
+        virtual void execute();
+
+        //- Execute at the final time-loop, currently does nothing
+        virtual void end();
+
+        //- Write the partialWrite
+        virtual void write();
+
+        //- Update for changes of mesh
+        virtual void updateMesh(const mapPolyMesh&)
+        {}
+
+        //- Update for changes of mesh
+        virtual void movePoints(const pointField&)
+        {}
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/IO/partialWrite/partialWriteFunctionObject.C b/src/postProcessing/functionObjects/IO/partialWrite/partialWriteFunctionObject.C
new file mode 100644
index 0000000000000000000000000000000000000000..5c98c82580c201c97f82c2cccd0caec369980b23
--- /dev/null
+++ b/src/postProcessing/functionObjects/IO/partialWrite/partialWriteFunctionObject.C
@@ -0,0 +1,46 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "partialWriteFunctionObject.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineNamedTemplateTypeNameAndDebug
+    (
+        partialWriteFunctionObject,
+        0
+    );
+
+    addToRunTimeSelectionTable
+    (
+        functionObject,
+        partialWriteFunctionObject,
+        dictionary
+    );
+}
+
+// ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/IO/partialWrite/partialWriteFunctionObject.H b/src/postProcessing/functionObjects/IO/partialWrite/partialWriteFunctionObject.H
new file mode 100644
index 0000000000000000000000000000000000000000..315a5c22829eee726ce8f2fc6dc54c714bf0d9c7
--- /dev/null
+++ b/src/postProcessing/functionObjects/IO/partialWrite/partialWriteFunctionObject.H
@@ -0,0 +1,54 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Typedef
+    Foam::partialWriteFunctionObject
+
+Description
+    FunctionObject wrapper around partialWrite to allow them to be
+    created via the functions list within controlDict.
+
+SourceFiles
+    partialWriteFunctionObject.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef partialWriteFunctionObject_H
+#define partialWriteFunctionObject_H
+
+#include "partialWrite.H"
+#include "OutputFilterFunctionObject.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    typedef OutputFilterFunctionObject<partialWrite>
+        partialWriteFunctionObject;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/IO/writeRegisteredObject/writeRegisteredObject.C b/src/postProcessing/functionObjects/IO/writeRegisteredObject/writeRegisteredObject.C
index ab24cecb1a3a4e7ab19f49c735b1fb8ef7371bfc..0ec6bf753409263d52e3593243fe56da3a92010f 100644
--- a/src/postProcessing/functionObjects/IO/writeRegisteredObject/writeRegisteredObject.C
+++ b/src/postProcessing/functionObjects/IO/writeRegisteredObject/writeRegisteredObject.C
@@ -44,7 +44,6 @@ Foam::writeRegisteredObject::writeRegisteredObject
 :
     name_(name),
     obr_(obr),
-    active_(true),
     objectNames_()
 {
     read(dict);
@@ -61,10 +60,7 @@ Foam::writeRegisteredObject::~writeRegisteredObject()
 
 void Foam::writeRegisteredObject::read(const dictionary& dict)
 {
-    if (active_)
-    {
-        dict.lookup("objectNames") >> objectNames_;
-    }
+    dict.lookup("objectNames") >> objectNames_;
 }
 
 
@@ -82,32 +78,29 @@ void Foam::writeRegisteredObject::end()
 
 void Foam::writeRegisteredObject::write()
 {
-    if (active_)
+    forAll(objectNames_, i)
     {
-        forAll(objectNames_, i)
+        if (obr_.foundObject<regIOobject>(objectNames_[i]))
         {
-            if (obr_.foundObject<regIOobject>(objectNames_[i]))
-            {
-                regIOobject& obj =
-                    const_cast<regIOobject&>
-                    (
-                        obr_.lookupObject<regIOobject>(objectNames_[i])
-                    );
-                // Switch off automatic writing to prevent double write
-                obj.writeOpt() = IOobject::NO_WRITE;
-                obj.write();
-            }
-            else
-            {
-                WarningIn
+            regIOobject& obj =
+                const_cast<regIOobject&>
                 (
-                    "Foam::writeRegisteredObject::read(const dictionary&)"
-                )   << "Object " << objectNames_[i] << " not found in "
-                    << "database. Available objects:" << nl << obr_.sortedToc()
-                    << endl;
-            }
-
+                    obr_.lookupObject<regIOobject>(objectNames_[i])
+                );
+            // Switch off automatic writing to prevent double write
+            obj.writeOpt() = IOobject::NO_WRITE;
+            obj.write();
         }
+        else
+        {
+            WarningIn
+            (
+                "Foam::writeRegisteredObject::read(const dictionary&)"
+            )   << "Object " << objectNames_[i] << " not found in "
+                << "database. Available objects:" << nl << obr_.sortedToc()
+                << endl;
+        }
+
     }
 }
 
diff --git a/src/postProcessing/functionObjects/IO/writeRegisteredObject/writeRegisteredObject.H b/src/postProcessing/functionObjects/IO/writeRegisteredObject/writeRegisteredObject.H
index 9a65acea9d00c9f1e5fc5b81dc13c8dd619a56ca..ecd96e5390f4e223d9201126b3f473a7f30c0807 100644
--- a/src/postProcessing/functionObjects/IO/writeRegisteredObject/writeRegisteredObject.H
+++ b/src/postProcessing/functionObjects/IO/writeRegisteredObject/writeRegisteredObject.H
@@ -65,10 +65,6 @@ protected:
 
         const objectRegistry& obr_;
 
-        //- On/off switch
-        bool active_;
-
-
         // Read from dictionary
 
             //- Names of objects to control
diff --git a/src/regionModels/surfaceFilmModels/Make/files b/src/regionModels/surfaceFilmModels/Make/files
index a0e33184d6825d646d82263fa32d478500d183c9..12f80a7ce78a673b74feb8a81651f9450fa1161c 100644
--- a/src/regionModels/surfaceFilmModels/Make/files
+++ b/src/regionModels/surfaceFilmModels/Make/files
@@ -10,6 +10,13 @@ thermoSingleLayer/thermoSingleLayer.C
 submodels/subModelBase.C
 
 KINEMATICMODELS=submodels/kinematic
+$(KINEMATICMODELS)/force/force/force.C
+$(KINEMATICMODELS)/force/force/forceNew.C
+$(KINEMATICMODELS)/force/forceList/forceList.C
+$(KINEMATICMODELS)/force/contactAngleForce/contactAngleForce.C
+$(KINEMATICMODELS)/force/surfaceShearForce/surfaceShearForce.C
+$(KINEMATICMODELS)/force/thermocapillaryForce/thermocapillaryForce.C
+
 $(KINEMATICMODELS)/injectionModel/injectionModel/injectionModel.C
 $(KINEMATICMODELS)/injectionModel/injectionModel/injectionModelNew.C
 $(KINEMATICMODELS)/injectionModel/injectionModelList/injectionModelList.C
diff --git a/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayer.C b/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayer.C
index cecacd2dfb046dd01b53eb54be9e7c1a914c45ad..add680dc790f3e3b5358eaf415dceedbad2d83e4 100644
--- a/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayer.C
+++ b/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayer.C
@@ -34,6 +34,10 @@ License
 #include "directMappedWallPolyPatch.H"
 #include "mapDistribute.H"
 
+#include "cachedRandom.H"
+#include "normal.H"
+#include "mathematicalConstants.H"
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 namespace Foam
@@ -61,8 +65,6 @@ bool kinematicSingleLayer::read()
         solution.lookup("nCorr") >> nCorr_;
         solution.lookup("nNonOrthCorr") >> nNonOrthCorr_;
 
-        coeffs_.lookup("Cf") >> Cf_;
-
         return true;
     }
     else
@@ -76,9 +78,10 @@ void kinematicSingleLayer::correctThermoFields()
 {
     if (thermoModel_ == tmConstant)
     {
-        rho_ == dimensionedScalar(coeffs_.lookup("rho0"));
-        mu_ == dimensionedScalar(coeffs_.lookup("mu0"));
-        sigma_ == dimensionedScalar(coeffs_.lookup("sigma0"));
+        const dictionary& constDict(coeffs_.subDict("constantThermoCoeffs"));
+        rho_ == dimensionedScalar(constDict.lookup("rho0"));
+        mu_ == dimensionedScalar(constDict.lookup("mu0"));
+        sigma_ == dimensionedScalar(constDict.lookup("sigma0"));
     }
     else
     {
@@ -273,25 +276,6 @@ void kinematicSingleLayer::updateSurfaceVelocities()
 }
 
 
-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_ // surface contribution
-       - fvm::Sp(Cw, U) + Cw*Uw_ // wall contribution
-    );
-}
-
-
 tmp<Foam::fvVectorMatrix> kinematicSingleLayer::solveMomentum
 (
     const volScalarField& pu,
@@ -312,9 +296,8 @@ tmp<Foam::fvVectorMatrix> kinematicSingleLayer::solveMomentum
       + fvm::div(phi_, U_)
      ==
       - USp_
-      + tau(U_)
-      + fvc::grad(sigma_)
       - fvm::SuSp(rhoSp_, U_)
+      + forces_.correct(U_)
     );
 
     fvVectorMatrix& UEqn = tUEqn();
@@ -459,8 +442,6 @@ kinematicSingleLayer::kinematicSingleLayer
 
     cumulativeContErr_(0.0),
 
-    Cf_(readScalar(coeffs().lookup("Cf"))),
-
     rho_
     (
         IOobject
@@ -773,6 +754,8 @@ kinematicSingleLayer::kinematicSingleLayer
 
     injection_(*this, coeffs_),
 
+    forces_(*this, coeffs_),
+
     addedMassTotal_(0.0)
 {
     if (readFields)
diff --git a/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayer.H b/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayer.H
index 765f617719d3721dc2e81fd6dc95680bfeba100c..5dea0a63294abe4763c4fd109eeed41cb00f5203 100644
--- a/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayer.H
+++ b/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayer.H
@@ -42,6 +42,7 @@ SourceFiles
 #include "fvMatrices.H"
 
 #include "injectionModelList.H"
+#include "forceList.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -93,12 +94,6 @@ protected:
             scalar cumulativeContErr_;
 
 
-        // Model parameters
-
-            //- Skin frition coefficient for film/primary region interface
-            scalar Cf_;
-
-
         // Thermo properties
 
             // Fields
@@ -199,6 +194,9 @@ protected:
             //- Cloud injection
             injectionModelList injection_;
 
+            //- List of film forces
+            forceList forces_;
+
 
        // Checks
 
@@ -238,9 +236,6 @@ protected:
         //- 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>
@@ -314,12 +309,6 @@ public:
             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]
diff --git a/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayerI.H b/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayerI.H
index 1777984af2435e18d8f698487a5c436452b98756..6e55827a97146d943aa864cfe6ca2a12402344c0 100644
--- a/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayerI.H
+++ b/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayerI.H
@@ -61,12 +61,6 @@ inline label kinematicSingleLayer::nNonOrthCorr() const
 }
 
 
-inline scalar kinematicSingleLayer::Cf() const
-{
-    return Cf_;
-}
-
-
 inline const volScalarField& kinematicSingleLayer::mu() const
 {
     return mu_;
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/force/contactAngleForce/contactAngleForce.C b/src/regionModels/surfaceFilmModels/submodels/kinematic/force/contactAngleForce/contactAngleForce.C
new file mode 100644
index 0000000000000000000000000000000000000000..5604859dee62f00c6c3c8427aebeb475737b9da8
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/force/contactAngleForce/contactAngleForce.C
@@ -0,0 +1,164 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "contactAngleForce.H"
+#include "addToRunTimeSelectionTable.H"
+#include "fvcGrad.H"
+#include "unitConversion.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(contactAngleForce, 0);
+addToRunTimeSelectionTable(force, contactAngleForce, dictionary);
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+contactAngleForce::contactAngleForce
+(
+    const surfaceFilmModel& owner,
+    const dictionary& dict
+)
+:
+    force(typeName, owner, dict),
+    deltaWet_(readScalar(coeffs_.lookup("deltaWet"))),
+    Ccf_(readScalar(coeffs_.lookup("Ccf"))),
+    rndGen_(label(0), -1),
+    distribution_
+    (
+        distributionModels::distributionModel::New
+        (
+            coeffs_.subDict("contactAngleDistribution"),
+            rndGen_
+        )
+    )
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+contactAngleForce::~contactAngleForce()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+tmp<fvVectorMatrix> contactAngleForce::correct(volVectorField& U)
+{
+    tmp<volVectorField> tForce
+    (
+        new volVectorField
+        (
+            IOobject
+            (
+                "contactForce",
+                owner_.time().timeName(),
+                owner_.regionMesh(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE
+            ),
+            owner_.regionMesh(),
+            dimensionedVector("zero", dimForce/dimArea, vector::zero)
+        )
+    );
+
+    vectorField& force = tForce().internalField();
+
+    const labelUList& own = owner_.regionMesh().owner();
+    const labelUList& nbr = owner_.regionMesh().neighbour();
+
+    const scalarField& magSf = owner_.magSf();
+
+    const volScalarField& delta = owner_.delta();
+    const volScalarField& sigma = owner_.sigma();
+
+    volScalarField alpha
+    (
+        "alpha",
+        pos(delta - dimensionedScalar("deltaWet", dimLength, deltaWet_))
+    );
+    volVectorField gradAlpha(fvc::grad(alpha));
+
+    scalarField nHits(force.size(), 0.0);
+
+    forAll(nbr, faceI)
+    {
+        const label cellO = own[faceI];
+        const label cellN = nbr[faceI];
+
+        label cellI = -1;
+        if ((delta[cellO] > deltaWet_) && (delta[cellN] < deltaWet_))
+        {
+            cellI = cellO;
+        }
+        else if ((delta[cellO] < deltaWet_) && (delta[cellN] > deltaWet_))
+        {
+            cellI = cellN;
+        }
+
+        if (cellI != -1)
+        {
+//            const scalar dx = Foam::sqrt(magSf[cellI]);
+            const scalar dx = owner_.regionMesh().deltaCoeffs()[faceI];
+            const vector n =
+                gradAlpha[cellI]/(mag(gradAlpha[cellI]) + ROOTVSMALL);
+            scalar theta = cos(degToRad(distribution_->sample()));
+            force[cellI] += Ccf_*n*sigma[cellI]*(1.0 - theta)/dx;
+            nHits[cellI]++;
+        }
+    }
+
+    nHits = max(nHits, 1.0);
+    force /= (nHits*magSf);
+
+    if (owner_.regionMesh().time().outputTime())
+    {
+        tForce().write();
+    }
+
+    tmp<fvVectorMatrix>
+        tfvm(new fvVectorMatrix(U, dimForce/dimArea*dimVolume));
+
+    tfvm() += tForce;
+
+    return tfvm;
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/force/contactAngleForce/contactAngleForce.H b/src/regionModels/surfaceFilmModels/submodels/kinematic/force/contactAngleForce/contactAngleForce.H
new file mode 100644
index 0000000000000000000000000000000000000000..e2a7acd3053ab263a5bfd60e896ce3f2d42d93fa
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/force/contactAngleForce/contactAngleForce.H
@@ -0,0 +1,125 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::contactAngleForce
+
+Description
+    Film contact angle force
+
+SourceFiles
+    contactAngleForce.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef contactAngleForce_H
+#define contactAngleForce_H
+
+#include "force.H"
+#include "distributionModel.H"
+#include "cachedRandom.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+/*---------------------------------------------------------------------------*\
+                      Class contactAngleForce Declaration
+\*---------------------------------------------------------------------------*/
+
+class contactAngleForce
+:
+    public force
+{
+private:
+
+    // Private Data
+
+        //- Threshold film thickness beyon which the film is 'wet'
+        scalar deltaWet_;
+
+        //- Coefficient applied to the contact angle force
+        scalar Ccf_;
+
+        //- Random number generator
+        cachedRandom rndGen_;
+
+        //- Parcel size PDF model
+        const autoPtr<distributionModels::distributionModel> distribution_;
+
+
+
+    // Private member functions
+
+        //- Disallow default bitwise copy construct
+        contactAngleForce(const contactAngleForce&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const contactAngleForce&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("contactAngle");
+
+
+    // Constructors
+
+        //- Construct from surface film model
+        contactAngleForce
+        (
+            const surfaceFilmModel& owner,
+            const dictionary& dict
+        );
+
+
+    //- Destructor
+    virtual ~contactAngleForce();
+
+
+    // Member Functions
+
+        // Evolution
+
+            //- Correct
+            virtual tmp<fvVectorMatrix> correct(volVectorField& U);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/force/force/force.C b/src/regionModels/surfaceFilmModels/submodels/kinematic/force/force/force.C
new file mode 100644
index 0000000000000000000000000000000000000000..4ea3112e43696998052cd12ad8964f8dce60f32d
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/force/force/force.C
@@ -0,0 +1,73 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "force.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(force, 0);
+defineRunTimeSelectionTable(force, dictionary);
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+force::force(const surfaceFilmModel& owner)
+:
+    subModelBase(owner)
+{}
+
+
+force::force
+(
+    const word& type,
+    const surfaceFilmModel& owner,
+    const dictionary& dict
+)
+:
+    subModelBase(type, owner, dict)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+force::~force()
+{}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/force/force/force.H b/src/regionModels/surfaceFilmModels/submodels/kinematic/force/force/force.H
new file mode 100644
index 0000000000000000000000000000000000000000..57dcc40bcab8c7f81a466f270d65cfb23e5808fc
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/force/force/force.H
@@ -0,0 +1,138 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::force
+
+Description
+    Base class for film (stress-based) force models
+
+SourceFiles
+    force.C
+    forceNew.C
+\*---------------------------------------------------------------------------*/
+
+#ifndef force_H
+#define force_H
+
+#include "subModelBase.H"
+#include "runTimeSelectionTables.H"
+#include "fvMatrices.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+/*---------------------------------------------------------------------------*\
+                          Class force Declaration
+\*---------------------------------------------------------------------------*/
+
+class force
+:
+    public subModelBase
+{
+private:
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        force(const force&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const force&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("force");
+
+
+    // Declare runtime constructor selection table
+
+         declareRunTimeSelectionTable
+         (
+             autoPtr,
+             force,
+             dictionary,
+             (
+                const surfaceFilmModel& owner,
+                const dictionary& dict
+             ),
+             (owner, dict)
+         );
+
+    // Constructors
+
+        //- Construct null
+        force(const surfaceFilmModel& owner);
+
+        //- Construct from type name, dictionary and surface film model
+        force
+        (
+            const word& type,
+            const surfaceFilmModel& owner,
+            const dictionary& dict
+        );
+
+
+    // Selectors
+
+        //- Return a reference to the selected force model
+        static autoPtr<force> New
+        (
+            const surfaceFilmModel& owner,
+            const dictionary& dict,
+            const word& mdoelType
+        );
+
+
+    //- Destructor
+    virtual ~force();
+
+
+    // Member Functions
+
+        // Evolution
+
+            //- Correct
+            virtual tmp<fvVectorMatrix> correct(volVectorField& U) = 0;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/force/force/forceNew.C b/src/regionModels/surfaceFilmModels/submodels/kinematic/force/force/forceNew.C
new file mode 100644
index 0000000000000000000000000000000000000000..a4ada7ed14d4da0690d0c1bc2c1a58d595231b7c
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/force/force/forceNew.C
@@ -0,0 +1,77 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "force.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * //
+
+autoPtr<force> force::New
+(
+    const surfaceFilmModel& model,
+    const dictionary& dict,
+    const word& modelType
+)
+{
+    Info<< "        " << modelType << endl;
+
+    dictionaryConstructorTable::iterator cstrIter =
+        dictionaryConstructorTablePtr_->find(modelType);
+
+    if (cstrIter == dictionaryConstructorTablePtr_->end())
+    {
+        FatalErrorIn
+        (
+            "force::New"
+            "("
+                "const surfaceFilmModel&, "
+                "const dictionary&, "
+                "const word&"
+            ")"
+        )   << "Unknown force type " << modelType
+            << nl << nl << "Valid force types are:" << nl
+            << dictionaryConstructorTablePtr_->toc()
+            << exit(FatalError);
+    }
+
+    return autoPtr<force>(cstrIter()(model, dict));
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/force/forceList/forceList.C b/src/regionModels/surfaceFilmModels/submodels/kinematic/force/forceList/forceList.C
new file mode 100644
index 0000000000000000000000000000000000000000..80c4d31e2f760dd571e7c6a08ba4f18057fbf00c
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/force/forceList/forceList.C
@@ -0,0 +1,101 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "forceList.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+forceList::forceList(const surfaceFilmModel& owner)
+:
+    PtrList<force>()
+{}
+
+
+forceList::forceList
+(
+    const surfaceFilmModel& owner,
+    const dictionary& dict
+)
+:
+    PtrList<force>()
+{
+    const wordList models(dict.lookup("forces"));
+
+    Info<< "    Selecting film force models" << endl;
+    if (models.size() > 0)
+    {
+        this->setSize(models.size());
+
+        forAll(models, i)
+        {
+            set(i, force::New(owner, dict, models[i]));
+        }
+    }
+    else
+    {
+        Info<< "        none" << endl;
+    }
+}
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+forceList::~forceList()
+{}
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+tmp<fvVectorMatrix> forceList::correct(volVectorField& U)
+{
+    tmp<fvVectorMatrix> tResult
+    (
+        new fvVectorMatrix(U, dimForce/dimArea*dimVolume)
+    );
+    fvVectorMatrix& result = tResult();
+
+    forAll(*this, i)
+    {
+        result += this->operator[](i).correct(U);
+    }
+
+    return tResult;
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/force/forceList/forceList.H b/src/regionModels/surfaceFilmModels/submodels/kinematic/force/forceList/forceList.H
new file mode 100644
index 0000000000000000000000000000000000000000..b1d19145c04f605eebed71cc62119030fa561d88
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/force/forceList/forceList.H
@@ -0,0 +1,95 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::forceList
+
+Description
+    List container for film sources
+
+SourceFiles
+    forceList.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef forceList_H
+#define forceList_H
+
+#include "PtrList.H"
+#include "force.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+/*---------------------------------------------------------------------------*\
+                       Class forceList Declaration
+\*---------------------------------------------------------------------------*/
+
+class forceList
+:
+    public PtrList<force>
+{
+public:
+
+    // Constructors
+
+        //- Construct null
+        forceList(const surfaceFilmModel& owner);
+
+        //- Construct from type name, dictionary and surface film model
+        forceList
+        (
+            const surfaceFilmModel& owner,
+            const dictionary& dict
+        );
+
+
+    //- Destructor
+    virtual ~forceList();
+
+
+    // Member functions
+
+        //- Return (net) force system
+        tmp<fvVectorMatrix> correct(volVectorField& U);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/force/surfaceShearForce/surfaceShearForce.C b/src/regionModels/surfaceFilmModels/submodels/kinematic/force/surfaceShearForce/surfaceShearForce.C
new file mode 100644
index 0000000000000000000000000000000000000000..c65549f3d736e472b86c674afc223d9054d680c5
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/force/surfaceShearForce/surfaceShearForce.C
@@ -0,0 +1,100 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "surfaceShearForce.H"
+#include "addToRunTimeSelectionTable.H"
+#include "fvmSup.H"
+#include "kinematicSingleLayer.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(surfaceShearForce, 0);
+addToRunTimeSelectionTable(force, surfaceShearForce, dictionary);
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+surfaceShearForce::surfaceShearForce
+(
+    const surfaceFilmModel& owner,
+    const dictionary& dict
+)
+:
+    force(typeName, owner, dict),
+    Cf_(readScalar(coeffs_.lookup("Cf")))
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+surfaceShearForce::~surfaceShearForce()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+tmp<fvVectorMatrix> surfaceShearForce::correct(volVectorField& U)
+{
+    const kinematicSingleLayer& film =
+        static_cast<const kinematicSingleLayer&>(owner_);
+
+    const volScalarField& rho = film.rho();
+    const volScalarField& mu = film.mu();
+    const volVectorField& Us = film.Us();
+    const volVectorField& Uw = film.Uw();
+    const volScalarField& delta = film.delta();
+
+    // 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 // surface contribution
+       - fvm::Sp(Cw, U) + Cw*Uw // wall contribution
+    );
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/force/surfaceShearForce/surfaceShearForce.H b/src/regionModels/surfaceFilmModels/submodels/kinematic/force/surfaceShearForce/surfaceShearForce.H
new file mode 100644
index 0000000000000000000000000000000000000000..06b73ba34738e373a743da62029ebd1c2ab7ceaa
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/force/surfaceShearForce/surfaceShearForce.H
@@ -0,0 +1,114 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::surfaceShearForce
+
+Description
+    Film surface shear force
+
+SourceFiles
+    surfaceShearForce.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef surfaceShearForce_H
+#define surfaceShearForce_H
+
+#include "force.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+/*---------------------------------------------------------------------------*\
+                      Class surfaceShearForce Declaration
+\*---------------------------------------------------------------------------*/
+
+class surfaceShearForce
+:
+    public force
+{
+private:
+
+    // Private Data
+
+        //- Surface roughness coefficient
+        scalar Cf_;
+
+
+
+    // Private member functions
+
+        //- Disallow default bitwise copy construct
+        surfaceShearForce(const surfaceShearForce&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const surfaceShearForce&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("surfaceShear");
+
+
+    // Constructors
+
+        //- Construct from surface film model
+        surfaceShearForce
+        (
+            const surfaceFilmModel& owner,
+            const dictionary& dict
+        );
+
+
+    //- Destructor
+    virtual ~surfaceShearForce();
+
+
+    // Member Functions
+
+        // Evolution
+
+            //- Correct
+            virtual tmp<fvVectorMatrix> correct(volVectorField& U);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/force/thermocapillaryForce/thermocapillaryForce.C b/src/regionModels/surfaceFilmModels/submodels/kinematic/force/thermocapillaryForce/thermocapillaryForce.C
new file mode 100644
index 0000000000000000000000000000000000000000..186b9625c8e679c6388814b99b578bf769b01e96
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/force/thermocapillaryForce/thermocapillaryForce.C
@@ -0,0 +1,83 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "thermocapillaryForce.H"
+#include "addToRunTimeSelectionTable.H"
+#include "fvcGrad.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(thermocapillaryForce, 0);
+addToRunTimeSelectionTable(force, thermocapillaryForce, dictionary);
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+thermocapillaryForce::thermocapillaryForce
+(
+    const surfaceFilmModel& owner,
+    const dictionary& dict
+)
+:
+    force(owner)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+thermocapillaryForce::~thermocapillaryForce()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+tmp<fvVectorMatrix> thermocapillaryForce::correct(volVectorField& U)
+{
+    const volScalarField& sigma = owner_.sigma();
+
+    tmp<fvVectorMatrix>
+        tfvm(new fvVectorMatrix(U, dimForce/dimArea*dimVolume));
+
+    tfvm() += fvc::grad(sigma);
+
+    return tfvm;
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/force/thermocapillaryForce/thermocapillaryForce.H b/src/regionModels/surfaceFilmModels/submodels/kinematic/force/thermocapillaryForce/thermocapillaryForce.H
new file mode 100644
index 0000000000000000000000000000000000000000..bfd3f9552e751c12c377627626aba0398f78455e
--- /dev/null
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/force/thermocapillaryForce/thermocapillaryForce.H
@@ -0,0 +1,107 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2011 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::thermocapillaryForce
+
+Description
+    Thermocapillary force
+
+SourceFiles
+    thermocapillaryForce.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef thermocapillaryForce_H
+#define thermocapillaryForce_H
+
+#include "force.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace regionModels
+{
+namespace surfaceFilmModels
+{
+
+/*---------------------------------------------------------------------------*\
+                  Class thermocapillaryForce Declaration
+\*---------------------------------------------------------------------------*/
+
+class thermocapillaryForce
+:
+    public force
+{
+private:
+
+    // Private member functions
+
+        //- Disallow default bitwise copy construct
+        thermocapillaryForce(const thermocapillaryForce&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const thermocapillaryForce&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("thermocapillary");
+
+
+    // Constructors
+
+        //- Construct from surface film model
+        thermocapillaryForce
+        (
+            const surfaceFilmModel& owner,
+            const dictionary& dict
+        );
+
+
+    //- Destructor
+    virtual ~thermocapillaryForce();
+
+
+    // Member Functions
+
+        // Evolution
+
+            //- Correct
+            virtual tmp<fvVectorMatrix> correct(volVectorField& U);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace surfaceFilmModels
+} // End namespace regionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/thermoSingleLayer/thermoSingleLayer.C b/src/regionModels/surfaceFilmModels/thermoSingleLayer/thermoSingleLayer.C
index 9a6ddee82b4244d3c440c0ded967d66427948b4f..83d1223d4a9c9a01572b991afbc38dbeacc8ad3b 100644
--- a/src/regionModels/surfaceFilmModels/thermoSingleLayer/thermoSingleLayer.C
+++ b/src/regionModels/surfaceFilmModels/thermoSingleLayer/thermoSingleLayer.C
@@ -97,11 +97,13 @@ void thermoSingleLayer::correctThermoFields()
     {
         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"));
+            const dictionary&
+                constDict(coeffs_.subDict("constantThermoCoeffs"));
+            rho_ == dimensionedScalar(constDict.lookup("rho0"));
+            mu_ == dimensionedScalar(constDict.lookup("mu0"));
+            sigma_ == dimensionedScalar(constDict.lookup("sigma0"));
+            Cp_ == dimensionedScalar(constDict.lookup("Cp0"));
+            kappa_ == dimensionedScalar(constDict.lookup("kappa0"));
 
             break;
         }
diff --git a/src/transportModels/incompressible/viscosityModels/HerschelBulkley/HerschelBulkley.C b/src/transportModels/incompressible/viscosityModels/HerschelBulkley/HerschelBulkley.C
index 52085f8b694aa5093e32c32a47e53923e51a96b9..c1b4132323ebded70dc7dc3ea56c2cba8d98c3c9 100644
--- a/src/transportModels/incompressible/viscosityModels/HerschelBulkley/HerschelBulkley.C
+++ b/src/transportModels/incompressible/viscosityModels/HerschelBulkley/HerschelBulkley.C
@@ -52,10 +52,28 @@ Foam::viscosityModels::HerschelBulkley::calcNu() const
 {
     dimensionedScalar tone("tone", dimTime, 1.0);
     dimensionedScalar rtone("rtone", dimless/dimTime, 1.0);
+
     tmp<volScalarField> sr(strainRate());
-    return (min(nu0_,(tau0_ + k_* rtone *( pow(tone * sr(), n_)
-        - pow(tone*tau0_/nu0_,n_))) / (max(sr(), dimensionedScalar
-        ("VSMALL", dimless/dimTime, VSMALL)))));
+
+ // return
+ // (
+ //     min
+ //     (
+ //         nu0_,
+ //         (tau0_ + k_*rtone*(pow(tone*sr(), n_) - pow(tone*tau0_/nu0_, n_)))
+ //        /max(sr(), dimensionedScalar("VSMALL", dimless/dimTime, VSMALL))
+ //     )
+ // );
+
+    return
+    (
+        min
+        (
+            nu0_,
+            (tau0_ + k_*rtone*pow(tone*sr(), n_))
+           /(max(sr(), dimensionedScalar ("VSMALL", dimless/dimTime, VSMALL)))
+        )
+    );
 }
 
 
diff --git a/src/transportModels/incompressible/viscosityModels/viscosityModel/viscosityModel.C b/src/transportModels/incompressible/viscosityModels/viscosityModel/viscosityModel.C
index 493cb89df693c887ba1760199766983277acae58..57be63e30e790108f5d5b151daad1c6fb4a23690 100644
--- a/src/transportModels/incompressible/viscosityModels/viscosityModel/viscosityModel.C
+++ b/src/transportModels/incompressible/viscosityModels/viscosityModel/viscosityModel.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2004-2010 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2004-2011 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -57,7 +57,7 @@ Foam::viscosityModel::viscosityModel
 
 Foam::tmp<Foam::volScalarField> Foam::viscosityModel::strainRate() const
 {
-    return mag(symm(fvc::grad(U_)));
+    return sqrt(2.0)*mag(symm(fvc::grad(U_)));
 }
 
 
diff --git a/tutorials/heatTransfer/chtMultiRegionFoam/multiRegionLiquidHeater/system/bottomWater/fvSolution b/tutorials/heatTransfer/chtMultiRegionFoam/multiRegionLiquidHeater/system/bottomWater/fvSolution
index 48dae067cb1f5d74b838ad535f602657994ef013..5004b930128306b2f5d0e559b3f5c53da0bddb38 100644
--- a/tutorials/heatTransfer/chtMultiRegionFoam/multiRegionLiquidHeater/system/bottomWater/fvSolution
+++ b/tutorials/heatTransfer/chtMultiRegionFoam/multiRegionLiquidHeater/system/bottomWater/fvSolution
@@ -77,7 +77,7 @@ PIMPLE
 
 relaxationFactors
 {
-    "h.*            1;
+    "h.*"           1;
     "U.*"           1;
 }
 
diff --git a/tutorials/incompressible/simpleFoam/motorBike/0.org/U b/tutorials/incompressible/simpleFoam/motorBike/0.org/U
index 0e62e1551fe3c11c8c331608c8b26dfe21ad788c..c1fb7eec0af63be41c2ebbc071fc960eb614b660 100644
--- a/tutorials/incompressible/simpleFoam/motorBike/0.org/U
+++ b/tutorials/incompressible/simpleFoam/motorBike/0.org/U
@@ -35,7 +35,7 @@ boundaryField
     lowerWall
     {
         type            fixedValue;
-        value           uniform (20 0 0);
+        value           $internalField;
     }
 
     "motorBike_.*"
diff --git a/tutorials/lagrangian/reactingParcelFilmFoam/cylinder/constant/surfaceFilmProperties b/tutorials/lagrangian/reactingParcelFilmFoam/cylinder/constant/surfaceFilmProperties
index 075dc96cef0b1cbe3c86ae3db9c532b7c7698bd5..1b428031a3a4955df1516142172da20c988849b5 100644
--- a/tutorials/lagrangian/reactingParcelFilmFoam/cylinder/constant/surfaceFilmProperties
+++ b/tutorials/lagrangian/reactingParcelFilmFoam/cylinder/constant/surfaceFilmProperties
@@ -15,34 +15,27 @@ FoamFile
 }
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-//surfaceFilmModel kinematicSingleLayer;
 surfaceFilmModel thermoSingleLayer;
 
 regionName      wallFilmRegion;
 
 active          true;
 
-kinematicSingleLayerCoeffs
-{
-    thermoModel constant;
-    rho0        rho0 [1 -3 0 0 0] 1000;
-    mu0         mu0 [1 -1 -1 0 0] 1e-3;
-    sigma0      sigma0 [1 0 -2 0 0] 0.07;
-
-    deltaStable deltaStable [0 1 0 0 0] 0;
-    Cf          0.005;
-
-    injectionModels ();
-}
-
-
 thermoSingleLayerCoeffs
 {
     thermoModel singleComponent;
     liquid      H2O;
 
-    deltaStable deltaStable [0 1 0 0 0] 0;
-    Cf          0.005;
+    forces
+    (
+        surfaceShear
+        thermocapillary
+    );
+
+    surfaceShearCoeffs
+    {
+        Cf          0.005;
+    }
 
     injectionModels ();
 
diff --git a/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/constant/surfaceFilmProperties b/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/constant/surfaceFilmProperties
index 0944bef4da8f807ef5289834c96303aaa2290c6b..4203d9b46937dcefaa8c49955b9ca86ebefd7f5d 100644
--- a/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/constant/surfaceFilmProperties
+++ b/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/constant/surfaceFilmProperties
@@ -25,9 +25,8 @@ active          true;
 thermoSingleLayerCoeffs
 {
     thermoModel singleComponent; // constant
-    liquid      H2O;
 
-    Cf          0.005;
+    liquid      H2O;
 
     radiationModel  none;
 
@@ -52,6 +51,35 @@ thermoSingleLayerCoeffs
         }
     }
 
+    forces
+    (
+        surfaceShear
+        thermocapillary
+        contactAngle
+    );
+
+    surfaceShearCoeffs
+    {
+        Cf          0.005;
+    }
+
+    contactAngleCoeffs
+    {
+        deltaWet        1e-4;
+        Ccf             0.085;
+        contactAngleDistribution
+        {
+            type            normal;
+            normalDistribution
+            {
+                minValue        50;
+                maxValue        100;
+                expectation     75;
+                variance        100;
+            }
+        }
+    }
+
     injectionModels
     (
         curvatureSeparation
diff --git a/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/system/wallFilmRegion.org/fvSchemes b/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/system/wallFilmRegion.org/fvSchemes
index 76501b635234831dd4919447900adb21c3c3ba47..453a4c20bf8065f99a282f33bf4dd94f2cb94831 100644
--- a/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/system/wallFilmRegion.org/fvSchemes
+++ b/tutorials/lagrangian/reactingParcelFilmFoam/hotBoxes/system/wallFilmRegion.org/fvSchemes
@@ -42,6 +42,7 @@ gradSchemes
     snGradCorr(pp) Gauss linear;
     snGradCorr(pu) Gauss linear;
     grad(nHat)  Gauss linear;
+    grad(alpha) Gauss linear;
 }
 
 laplacianSchemes
diff --git a/tutorials/lagrangian/reactingParcelFilmFoam/splashPanel/constant/surfaceFilmProperties b/tutorials/lagrangian/reactingParcelFilmFoam/splashPanel/constant/surfaceFilmProperties
index 4edff7efd20cda8826ca2c2f749f90341e697429..09b1f8c939e4d745e7c683292a9b099bde3a1054 100644
--- a/tutorials/lagrangian/reactingParcelFilmFoam/splashPanel/constant/surfaceFilmProperties
+++ b/tutorials/lagrangian/reactingParcelFilmFoam/splashPanel/constant/surfaceFilmProperties
@@ -15,32 +15,28 @@ FoamFile
 }
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-//surfaceFilmModel kinematicSingleLayer;
 surfaceFilmModel thermoSingleLayer;
 
 regionName      wallFilmRegion;
 
 active          true;
 
-kinematicSingleLayerCoeffs
-{
-    thermoModel constant;
-    rho0        rho0 [1 -3 0 0 0] 1000;
-    mu0         mu0 [1 -1 -1 0 0] 1e-3;
-    sigma0      sigma0 [1 0 -2 0 0] 0.07;
-
-    Cf          0.005;
-
-    injectionModels ();
-}
-
-
 thermoSingleLayerCoeffs
 {
     thermoModel singleComponent;
+
     liquid      H2O;
 
-    Cf          0.005;
+    forces
+    (
+        surfaceShear
+        thermocapillary
+    );
+
+    surfaceShearCoeffs
+    {
+        Cf          0.005;
+    }
 
     injectionModels
     ();
diff --git a/tutorials/mesh/snappyHexMesh/flange/Allclean b/tutorials/mesh/snappyHexMesh/flange/Allclean
index 884d713e5fedd6303575897115ee9c9414fc8d62..abb949539e952db42aa6e3dd4a7c754385a0b406 100755
--- a/tutorials/mesh/snappyHexMesh/flange/Allclean
+++ b/tutorials/mesh/snappyHexMesh/flange/Allclean
@@ -5,7 +5,7 @@ cd ${0%/*} || exit 1    # run from this directory
 . $WM_PROJECT_DIR/bin/tools/CleanFunctions
 
 rm -rf 0 > /dev/null 2>&1
-rm -f ./*.obj > /dev/null 2>&1
+rm -f ./flange ./*.obj > /dev/null 2>&1
 rm -rf constant/extendedFeatureEdgeMesh > /dev/null 2>&1
 rm -f constant/triSurface/flange.eMesh > /dev/null 2>&1
 rm -f constant/polyMesh/boundary