diff --git a/applications/solvers/incompressible/channelOodles/createGradP.H b/applications/solvers/incompressible/channelOodles/createGradP.H
index c1dd63f92baa3f1165c2f6ab1dfcb0bd8969cf65..9bb9bb0ba28f974c967e9f82a2b649fc2a032ebb 100644
--- a/applications/solvers/incompressible/channelOodles/createGradP.H
+++ b/applications/solvers/incompressible/channelOodles/createGradP.H
@@ -8,7 +8,7 @@
 
     IFstream gradPFile
     (
-        runTime.path()/runTime.timeName()/"gradP.raw"
+        runTime.path()/runTime.timeName()/"uniform"/"gradP.raw"
     );
 
     if(gradPFile.good())
diff --git a/applications/solvers/incompressible/channelOodles/writeGradP.H b/applications/solvers/incompressible/channelOodles/writeGradP.H
index 99eb5a01fa845907c545c63a9d8ca6c227f8d5d1..c82dd534740b6c8db6258f572768b5c081a7e735 100644
--- a/applications/solvers/incompressible/channelOodles/writeGradP.H
+++ b/applications/solvers/incompressible/channelOodles/writeGradP.H
@@ -2,7 +2,7 @@
     {
         OFstream gradPFile
         (
-            runTime.path()/runTime.timeName()/"gradP.raw"
+            runTime.path()/runTime.timeName()/"uniform"/"gradP.raw"
         );
 
         if(gradPFile.good())
@@ -13,7 +13,7 @@
         {
             FatalErrorIn(args.executable())
                 << "Cannot open file "
-                << runTime.path()/runTime.timeName()/"gradP.raw"
+                << runTime.path()/runTime.timeName()/"uniform"/"gradP.raw"
                 << exit(FatalError);
         };
     };
diff --git a/applications/utilities/mesh/conversion/fluent3DMeshToFoam/fluent3DMeshToFoam.L b/applications/utilities/mesh/conversion/fluent3DMeshToFoam/fluent3DMeshToFoam.L
index a8cb5dbb98c5fd559d4001b5b981f99057f00295..46eb810e0549e4f980e2aa626fcb433c663cbd52 100644
--- a/applications/utilities/mesh/conversion/fluent3DMeshToFoam/fluent3DMeshToFoam.L
+++ b/applications/utilities/mesh/conversion/fluent3DMeshToFoam/fluent3DMeshToFoam.L
@@ -187,21 +187,21 @@ time                       ({digit}{digit}":"{digit}{digit}":"{digit}{digit})
 
 versionNumber              ({digit}|".")*
 
-header                     {spaceNl}"(1"{some_space}
-dimension                  {spaceNl}"(2"{some_space}
-points                     {spaceNl}"(10"{some_space}
-faces                      {spaceNl}"(13"{some_space}
-cells                      {spaceNl}"(12"{some_space}
-zoneVariant1               {spaceNl}"(39"{some_space}
-zoneVariant2               {spaceNl}"(45"{some_space}
-faceTree                   {spaceNl}"(59"{some_space}
-
-comment                    "0"{some_space}
-unknownPeriodicFace        "17"{some_space}
-periodicFace               "18"{some_space}
-cellTree                   "58"{some_space}
-faceParents                "61"{some_space}
-ignoreBlocks               ("4"|"37"|"38"|"41"|"60"|"64"){some_space}
+header                     {spaceNl}"(1"{space}
+dimension                  {spaceNl}"(2"{space}
+points                     {spaceNl}"(10"{space}
+faces                      {spaceNl}"(13"{space}
+cells                      {spaceNl}"(12"{space}
+zoneVariant1               {spaceNl}"(39"{space}
+zoneVariant2               {spaceNl}"(45"{space}
+faceTree                   {spaceNl}"(59"{space}
+
+comment                    "0"{space}
+unknownPeriodicFace        "17"{space}
+periodicFace               "18"{space}
+cellTree                   "58"{space}
+faceParents                "61"{space}
+ignoreBlocks               ("4"|"37"|"38"|"41"|"60"|"64"){space}
 
 redundantBlock             {spaceNl}({comment}|{unknownPeriodicFace}|{periodicFace}|{cellTree}|{faceParents}|{ignoreBlocks}){space}
 
diff --git a/applications/utilities/postProcessing/dataConversion/foamToEnsight/ensightField.C b/applications/utilities/postProcessing/dataConversion/foamToEnsight/ensightField.C
index 5238e9ed2655cf6d33aba06970cbc1e9492f6b40..ef1db03c6c745e27727da37a6dadc60d65cce7de 100644
--- a/applications/utilities/postProcessing/dataConversion/foamToEnsight/ensightField.C
+++ b/applications/utilities/postProcessing/dataConversion/foamToEnsight/ensightField.C
@@ -405,9 +405,9 @@ void writePatchField
 {
     const Time& runTime = eMesh.mesh().time();
 
-    const List<faceSets>& boundaryFaceSets = eMesh.boundaryFaceSets;
-    const HashTable<labelList>& allPatchNames = eMesh.allPatchNames;
-    const HashTable<label>& patchIndices = eMesh.patchIndices;
+    const List<faceSets>& boundaryFaceSets = eMesh.boundaryFaceSets();
+    const HashTable<labelList>& allPatchNames = eMesh.allPatchNames();
+    const HashTable<label>& patchIndices = eMesh.patchIndices();
     const HashTable<ensightMesh::nFacePrimitives>&
         nPatchPrims = eMesh.nPatchPrims();
 
diff --git a/applications/utilities/postProcessing/dataConversion/foamToEnsight/ensightMesh.H b/applications/utilities/postProcessing/dataConversion/foamToEnsight/ensightMesh.H
index d37fd18b75e3c910d7f0c128eb2af982affb4d89..cd37367cbe9e74fb7969dc9c1a4d71c8e25e9a7d 100644
--- a/applications/utilities/postProcessing/dataConversion/foamToEnsight/ensightMesh.H
+++ b/applications/utilities/postProcessing/dataConversion/foamToEnsight/ensightMesh.H
@@ -88,9 +88,6 @@ class ensightMesh
 
         List<faceSets> boundaryFaceSets_;
 
-
-
-
         HashTable<labelList> allPatchNames_;
 
         HashTable<label> patchIndices_;
@@ -246,9 +243,8 @@ public:
         ensightMesh(const fvMesh&, const argList& args, const bool binary);
 
 
-    // Destructor
-
-        ~ensightMesh();
+    //- Destructor
+    ~ensightMesh();
 
 
     // Member Functions
diff --git a/applications/utilities/postProcessing/miscellaneous/postChannel/postChannelDict b/applications/utilities/postProcessing/miscellaneous/postChannel/postChannelDict
index 1785207adc50cfd66ffb6d0eb1fcfe4660b4d437..4c528ea24303edeb7b3d0e8f9abd296a1303be56 100644
--- a/applications/utilities/postProcessing/miscellaneous/postChannel/postChannelDict
+++ b/applications/utilities/postProcessing/miscellaneous/postChannel/postChannelDict
@@ -15,11 +15,13 @@ FoamFile
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-Nx    40;
-Ny
-(
-    50
-);
-Nz    30;
+Nx 40; 
+Ny 
+( 
+ 25 
+ 25 
+); 
+Nz 30; 
+ 
 
 // ************************************************************************* //
diff --git a/bin/mpirunDebug b/bin/mpirunDebug
index eec151343913e5d51231b27460339c41203956e2..013a63997fb00b09004726d0183314f8deb4d40c 100755
--- a/bin/mpirunDebug
+++ b/bin/mpirunDebug
@@ -76,9 +76,9 @@ echo "run $args" > $HOME/gdbCommands
 echo "where" >> $HOME/gdbCommands
 echo "Constructed gdb initialization file $HOME/gdbCommands"
 
-$ECHO "Choose running method: 1)gdb+xterm  2)gdb  3)log  4)xterm+valgrind: \c"
+$ECHO "Choose running method: 1)gdb+xterm  2)gdb  3)log  4)log+xterm  5)xterm+valgrind: \c"
 read method
-if [ "$method" -ne 1 -a "$method" -ne 2 -a "$method" -ne 3 -a "$method" -ne 4 ]; then
+if [ "$method" -ne 1 -a "$method" -ne 2 -a "$method" -ne 3 -a "$method" -ne 4 -a "$method" -ne 5 ]; then
     printUsage
     exit 1
 fi
@@ -152,6 +152,9 @@ do
         echo "$sourceFoam; cd $PWD; $exec $args >& $procLog" >> $procCmdFile
         echo "${node}$procCmdFile" >> $HOME/mpirun.schema
     elif [ "$method" -eq 4 ]; then
+        echo "$sourceFoam; cd $PWD; $exec $args 2>&1 | tee $procLog; read dummy" >> $procCmdFile
+        echo "${node}xterm -font fixed -title 'processor'$proc $geom -e $procCmdFile" >> $HOME/mpirun.schema
+    elif [ "$method" -eq 5 ]; then
         echo "$sourceFoam; cd $PWD; valgrind $exec $args; read dummy" >> $procCmdFile
         echo "${node}xterm -font fixed -title 'processor'$proc $geom -e $procCmdFile" >> $HOME/mpirun.schema
     fi
diff --git a/etc/controlDict b/etc/controlDict
index 2cf2ce334aa2cd0eb35f458097263ae8741d56ed..9651981ac9852cb2d85746a8c2425871fe409b5b 100644
--- a/etc/controlDict
+++ b/etc/controlDict
@@ -808,7 +808,7 @@ OptimisationSwitches
 {
     fileModificationSkew 10;
     commsType       nonBlocking; //scheduled; //blocking;
-    floatTransfer   1;
+    floatTransfer   0;
     nProcsSimpleSum 0;
 }
 
diff --git a/src/OpenFOAM/containers/HashTables/HashSet/HashSet.C b/src/OpenFOAM/containers/HashTables/HashSet/HashSet.C
new file mode 100644
index 0000000000000000000000000000000000000000..b5c199e9be56c9c400dea606830266d043b9e656
--- /dev/null
+++ b/src/OpenFOAM/containers/HashTables/HashSet/HashSet.C
@@ -0,0 +1,90 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2008 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the
+    Free Software Foundation; either version 2 of the License, or (at your
+    option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM; if not, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef HashSet_C
+#define HashSet_C
+
+#include "HashSet.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
+
+template<class Key, class Hash>
+bool HashSet<Key, Hash>::operator==(const HashSet<Key, Hash>& ht) const
+{
+    const HashTable<empty, Key, Hash>& a = *this;
+
+    // Are all my elements in ht?
+    for
+    (
+        typename HashTable<empty, Key, Hash>::const_iterator iter = a.begin();
+        iter != a.end();
+        ++iter
+    )
+    {
+        if (!ht.found(iter.key()))
+        {
+            return false;
+        }
+    }
+
+    // Are all ht elements in me?
+    for
+    (
+        typename HashTable<empty, Key, Hash>::const_iterator iter = ht.begin();
+        iter != ht.end();
+        ++iter
+    )
+    {
+        if (!found(iter.key()))
+        {
+            return false;
+        }
+    }
+    return true;
+}
+
+
+template<class Key, class Hash>
+bool HashSet<Key, Hash>::operator!=(const HashSet<Key, Hash>& ht) const
+{
+    return !(operator==(ht));
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * Friend Operators  * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/containers/HashTables/HashSet/HashSet.H b/src/OpenFOAM/containers/HashTables/HashSet/HashSet.H
index 654b743add6a5bbf96b03a8a3a8f148a8a623bb1..3985e574fbd9a8b1f729f065ff562844c02df348 100644
--- a/src/OpenFOAM/containers/HashTables/HashSet/HashSet.H
+++ b/src/OpenFOAM/containers/HashTables/HashSet/HashSet.H
@@ -100,6 +100,17 @@ public:
             {
                 return HashTable<empty, Key, Hash>::insert(key, empty());
             }
+
+
+    // Member Operators
+
+        //- Equality. Two hashtables are equal if all contents of first are
+        //  also in second and vice versa. So does not depend on table size or
+        //  order!
+        bool operator==(const HashSet<Key, Hash>&) const;
+
+        //- The opposite of the equality operation.
+        bool operator!=(const HashSet<Key, Hash>&) const;
 };
 
 
@@ -112,6 +123,12 @@ typedef HashSet<> wordHashSet;
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
+#ifdef NoRepository
+#   include "HashSet.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
 #endif
 
 // ************************************************************************* //
diff --git a/src/OpenFOAM/containers/Lists/List/List.C b/src/OpenFOAM/containers/Lists/List/List.C
index ed38924cf7f281ceeb80dd6509c0cd1a75299a16..249d1fcf2b1783584c278b23d6fb8d341caf4656 100644
--- a/src/OpenFOAM/containers/Lists/List/List.C
+++ b/src/OpenFOAM/containers/Lists/List/List.C
@@ -321,7 +321,7 @@ List<T>::List(const BiIndirectList<T>& idl)
 template<class T>
 List<T>::~List()
 {
-    if (this->size_) delete[] this->v_;
+    if (this->v_) delete[] this->v_;
 }
 
 
@@ -367,9 +367,8 @@ void List<T>::setSize(const label newSize)
                     register T* av = &nv[i];
                     while (i--) *--av = *--vv;
                 }
-
-                delete[] this->v_;
             }
+            if (this->v_) delete[] this->v_;
 
             this->size_ = newSize;
             this->v_ = nv;
@@ -400,7 +399,7 @@ void List<T>::setSize(const label newSize, const T& a)
 template<class T>
 void List<T>::clear()
 {
-    if (this->size_) delete[] this->v_;
+    if (this->v_) delete[] this->v_;
     this->size_ = 0;
     this->v_ = 0;
 }
@@ -411,7 +410,7 @@ void List<T>::clear()
 template<class T>
 void List<T>::transfer(List<T>& a)
 {
-    if (this->size_) delete[] this->v_;
+    if (this->v_) delete[] this->v_;
 
     this->size_ = a.size_;
     this->v_ = a.v_;
@@ -457,7 +456,8 @@ void List<T>::operator=(const UList<T>& a)
 {
     if (a.size_ != this->size_)
     {
-        if (this->size_) delete[] this->v_;
+        if (this->v_) delete[] this->v_;
+        this->v_ = 0;
         this->size_ = a.size_;
         if (this->size_) this->v_ = new T[this->size_];
     }
@@ -503,7 +503,8 @@ void List<T>::operator=(const SLList<T>& sll)
 {
     if (sll.size() != this->size_)
     {
-        if (this->size_) delete[] this->v_;
+        if (this->v_) delete[] this->v_;
+        this->v_ = 0;
         this->size_ = sll.size();
         if (this->size_) this->v_ = new T[this->size_];
     }
@@ -530,7 +531,8 @@ void List<T>::operator=(const IndirectList<T>& idl)
 {
     if (idl.size() != this->size_)
     {
-        if (this->size_) delete[] this->v_;
+        if (this->v_) delete[] this->v_;
+        this->v_ = 0;
         this->size_ = idl.size();
         if (this->size_) this->v_ = new T[this->size_];
     }
@@ -551,7 +553,8 @@ void List<T>::operator=(const BiIndirectList<T>& idl)
 {
     if (idl.size() != this->size_)
     {
-        if (this->size_) delete[] this->v_;
+        if (this->v_) delete[] this->v_;
+        this->v_ = 0;
         this->size_ = idl.size();
         if (this->size_) this->v_ = new T[this->size_];
     }
diff --git a/src/OpenFOAM/containers/Lists/List/List.H b/src/OpenFOAM/containers/Lists/List/List.H
index 02130ce7066844aa6a2ef15f0cac07284bde6be4..3ee814a0f60501e79b39365d9e7f13d936196c5d 100644
--- a/src/OpenFOAM/containers/Lists/List/List.H
+++ b/src/OpenFOAM/containers/Lists/List/List.H
@@ -137,6 +137,9 @@ public:
         //- Return a null List
         static const List<T>& null();
 
+        //- Return the number of elements in the UList.
+        inline label size() const;
+
 
         // Edit
 
@@ -156,6 +159,10 @@ public:
             //- Return subscript-checked element of UList.
             inline T& newElmt(const label);
 
+            //- Override size to be inconsistent with allocated storage.
+            //  Use with care.
+            inline label& size();
+
 
     // Member operators
 
diff --git a/src/OpenFOAM/containers/Lists/List/ListI.H b/src/OpenFOAM/containers/Lists/List/ListI.H
index a7a9ffa4cfb08dfbe3b28f6c140bb9c7bb68992b..d39b19f8841b615c99587f804e4223f665a3a129 100644
--- a/src/OpenFOAM/containers/Lists/List/ListI.H
+++ b/src/OpenFOAM/containers/Lists/List/ListI.H
@@ -52,6 +52,20 @@ inline T& Foam::List<T>::newElmt(const label i)
 }
 
 
+template<class T>
+inline Foam::label Foam::List<T>::size() const
+{
+    return UList<T>::size_;
+}
+
+
+template<class T>
+inline Foam::label& Foam::List<T>::size()
+{
+    return UList<T>::size_;
+}
+
+
 // * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
 
 template<class T>
diff --git a/src/OpenFOAM/meshes/polyMesh/polyPatches/polyPatch/polyPatch.C b/src/OpenFOAM/meshes/polyMesh/polyPatches/polyPatch/polyPatch.C
index 59f67a08f5482327ad52897be4c3a8c6366f518c..18ebdeba95cb4b806395c7663e1cf2231974c1e0 100644
--- a/src/OpenFOAM/meshes/polyMesh/polyPatches/polyPatch/polyPatch.C
+++ b/src/OpenFOAM/meshes/polyMesh/polyPatches/polyPatch/polyPatch.C
@@ -282,8 +282,7 @@ const Foam::labelList& Foam::polyPatch::meshEdges() const
                 primitivePatch::meshEdges
                 (
                     boundaryMesh().mesh().edges(),
-                    boundaryMesh().mesh().cellEdges(),
-                    faceCells()
+                    boundaryMesh().mesh().pointEdges()
                 )
             );
     }
diff --git a/src/OpenFOAM/meshes/polyMesh/syncTools/syncTools.C b/src/OpenFOAM/meshes/polyMesh/syncTools/syncTools.C
index db392d9137355c9047c326214041e68c5f3100a0..bc9794e06af9ce08d0cf62e55cd9f52cfd84a5bb 100644
--- a/src/OpenFOAM/meshes/polyMesh/syncTools/syncTools.C
+++ b/src/OpenFOAM/meshes/polyMesh/syncTools/syncTools.C
@@ -169,7 +169,7 @@ Foam::PackedList<1> Foam::syncTools::getMasterPoints(const polyMesh& mesh)
             else
             {
                 FatalErrorIn("syncTools::getMasterPoints(const polyMesh&)")
-                    << "Cannot handle patch " << patches[patchI].name()
+                    << "Cannot handle coupled patch " << patches[patchI].name()
                     << " of type " <<  patches[patchI].type()
                     << abort(FatalError);
             }
@@ -290,7 +290,7 @@ Foam::PackedList<1> Foam::syncTools::getMasterEdges(const polyMesh& mesh)
             else
             {
                 FatalErrorIn("syncTools::getMasterEdges(const polyMesh&)")
-                    << "Cannot handle patch " << patches[patchI].name()
+                    << "Cannot handle coupled patch " << patches[patchI].name()
                     << " of type " <<  patches[patchI].type()
                     << abort(FatalError);
             }
@@ -314,6 +314,54 @@ Foam::PackedList<1> Foam::syncTools::getMasterEdges(const polyMesh& mesh)
 }
 
 
+// Determines for every face whether it is coupled and if so sets only one.
+Foam::PackedList<1> Foam::syncTools::getMasterFaces(const polyMesh& mesh)
+{
+    PackedList<1> isMasterFace(mesh.nFaces(), 1);
+
+    const polyBoundaryMesh& patches = mesh.boundaryMesh();
+
+    forAll(patches, patchI)
+    {
+        if (patches[patchI].coupled())
+        {
+            if (Pstream::parRun() && isA<processorPolyPatch>(patches[patchI]))
+            {
+                const processorPolyPatch& pp =
+                    refCast<const processorPolyPatch>(patches[patchI]);
+
+                if (!pp.owner())
+                {
+                    forAll(pp, i)
+                    {
+                        isMasterFace.set(pp.start()+i, 0);
+                    }
+                }
+            }
+            else if (isA<cyclicPolyPatch>(patches[patchI]))
+            {
+                const cyclicPolyPatch& pp =
+                    refCast<const cyclicPolyPatch>(patches[patchI]);
+
+                for (label i = pp.size()/2; i < pp.size(); i++)
+                {
+                    isMasterFace.set(pp.start()+i, 0);
+                }
+            }
+            else
+            {
+                FatalErrorIn("syncTools::getMasterFaces(const polyMesh&)")
+                    << "Cannot handle coupled patch " << patches[patchI].name()
+                    << " of type " <<  patches[patchI].type()
+                    << abort(FatalError);
+            }
+        }
+    }
+
+    return isMasterFace;
+}
+
+
 template <>
 void Foam::syncTools::separateList
 (
diff --git a/src/OpenFOAM/meshes/polyMesh/syncTools/syncTools.H b/src/OpenFOAM/meshes/polyMesh/syncTools/syncTools.H
index 608d3bd2ba53c02d3f712084cbac27f34eb1f2fe..7312e08e551a539c729f67280a2bfb24d2eef5e1 100644
--- a/src/OpenFOAM/meshes/polyMesh/syncTools/syncTools.H
+++ b/src/OpenFOAM/meshes/polyMesh/syncTools/syncTools.H
@@ -226,9 +226,12 @@ public:
             //- Get per point whether is it master (of a coupled set of points)
             static PackedList<1> getMasterPoints(const polyMesh&);
 
-            //- Get per edge whether is it master (of a coupled set of edge)
+            //- Get per edge whether is it master (of a coupled set of edges)
             static PackedList<1> getMasterEdges(const polyMesh&);
 
+            //- Get per face whether is it master (of a coupled set of faces)
+            static PackedList<1> getMasterFaces(const polyMesh&);
+
 };
 
 
diff --git a/src/OpenFOAM/meshes/polyMesh/zones/faceZone/faceZone.C b/src/OpenFOAM/meshes/polyMesh/zones/faceZone/faceZone.C
index 0ce9de38a8bdd49a5203d82e31893d6dab5f202b..acc3b0dcf99574b49b3ab987bdaace28972a2208 100644
--- a/src/OpenFOAM/meshes/polyMesh/zones/faceZone/faceZone.C
+++ b/src/OpenFOAM/meshes/polyMesh/zones/faceZone/faceZone.C
@@ -362,16 +362,27 @@ const Foam::labelList& Foam::faceZone::meshEdges() const
 {
     if (!mePtr_)
     {
-        labelList faceCells(size());
-
-        const labelList& own = zoneMesh().mesh().faceOwner();
-
-        const labelList& faceLabels = *this;
-
-        forAll (faceCells, faceI)
-        {
-            faceCells[faceI] = own[faceLabels[faceI]];
-        }
+        //labelList faceCells(size());
+        //
+        //const labelList& own = zoneMesh().mesh().faceOwner();
+        //
+        //const labelList& faceLabels = *this;
+        //
+        //forAll (faceCells, faceI)
+        //{
+        //    faceCells[faceI] = own[faceLabels[faceI]];
+        //}
+        //
+        //mePtr_ =
+        //    new labelList
+        //    (
+        //        operator()().meshEdges
+        //        (
+        //            zoneMesh().mesh().edges(),
+        //            zoneMesh().mesh().cellEdges(),
+        //            faceCells
+        //        )
+        //    );
 
         mePtr_ =
             new labelList
@@ -379,8 +390,7 @@ const Foam::labelList& Foam::faceZone::meshEdges() const
                 operator()().meshEdges
                 (
                     zoneMesh().mesh().edges(),
-                    zoneMesh().mesh().cellEdges(),
-                    faceCells
+                    zoneMesh().mesh().pointEdges()
                 )
             );
     }
diff --git a/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatch.H b/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatch.H
index 49b3be82605cdfdaeb2dec835779ea2225d7794b..e7d4a410fa462879d4225659e2aeede47db0448f 100644
--- a/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatch.H
+++ b/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatch.H
@@ -348,7 +348,8 @@ public:
                 //  index in the edge list.  If the edge is not found, return -1
                 label whichEdge(const edge& e) const;
 
-                //- Return labels of patch edges in the global edge list
+                //- Return labels of patch edges in the global edge list using
+                //  cell addressing
                 labelList meshEdges
                 (
                     const edgeList& allEdges,
@@ -356,6 +357,14 @@ public:
                     const labelList& faceCells
                 ) const;
 
+                //- Return labels of patch edges in the global edge list using
+                //  basic edge addressing.
+                labelList meshEdges
+                (
+                    const edgeList& allEdges,
+                    const labelListList& pointEdges
+                ) const;
+
                 //- Return face normals for patch
                 const Field<PointType>& faceNormals() const;
 
diff --git a/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatchMeshEdges.C b/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatchMeshEdges.C
index be5c6adb9e1ef8f9079bffafd4dad3a71bf5f093..96c017fbdc9bddc6261a8e8766b24c04ead54cfa 100644
--- a/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatchMeshEdges.C
+++ b/src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatchMeshEdges.C
@@ -111,6 +111,60 @@ labelList PrimitivePatch<Face, FaceList, PointField, PointType>::meshEdges
 }
 
 
+template
+<
+    class Face,
+    template<class> class FaceList,
+    class PointField,
+    class PointType
+>
+
+labelList PrimitivePatch<Face, FaceList, PointField, PointType>::meshEdges
+(
+    const edgeList& allEdges,
+    const labelListList& pointEdges
+) const
+{
+    if (debug)
+    {
+        Info<< "labelList PrimitivePatch<Face, FaceList, PointField, PointType>"
+            << "::meshEdges() : "
+            << "calculating labels of patch edges in mesh edge list"
+            << endl;
+    }
+
+    // get reference to the list of edges on the patch 
+    const edgeList& PatchEdges = edges();
+
+    // create the storage
+    labelList meshEdges(PatchEdges.size());
+
+    // get reference to the points on the patch
+    const labelList& pp = meshPoints();
+
+    // WARNING: Remember that local edges address into local point list;
+    // local-to-global point label translation is necessary
+    forAll (PatchEdges, edgeI)
+    {
+        const label globalPointI = pp[PatchEdges[edgeI].start()];
+        const edge curEdge(globalPointI, pp[PatchEdges[edgeI].end()]);
+
+        const labelList& pe = pointEdges[globalPointI];
+
+        forAll (pe, i)
+        {
+            if (allEdges[pe[i]] == curEdge)
+            {
+                meshEdges[edgeI] = pe[i];
+                break;
+            } 
+        }
+    }
+
+    return meshEdges;
+}
+
+
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template
diff --git a/src/OpenFOAM/meshes/primitiveMesh/primitiveMesh.C b/src/OpenFOAM/meshes/primitiveMesh/primitiveMesh.C
index dcbf6d0b16c4d96e7501d901732919fe159bafa4..8c210172690c9e581f4997b11e3aa751aa2b4729 100644
--- a/src/OpenFOAM/meshes/primitiveMesh/primitiveMesh.C
+++ b/src/OpenFOAM/meshes/primitiveMesh/primitiveMesh.C
@@ -66,6 +66,9 @@ primitiveMesh::primitiveMesh()
     ppPtr_(NULL),
     cpPtr_(NULL),
 
+    allocSize_(0),
+    labels_(0),
+
     cellCentresPtr_(NULL),
     faceCentresPtr_(NULL),
     cellVolumesPtr_(NULL),
@@ -106,6 +109,9 @@ primitiveMesh::primitiveMesh
     ppPtr_(NULL),
     cpPtr_(NULL),
 
+    allocSize_(0),
+    labels_(0),
+
     cellCentresPtr_(NULL),
     faceCentresPtr_(NULL),
     cellVolumesPtr_(NULL),
diff --git a/src/OpenFOAM/meshes/primitiveMesh/primitiveMesh.H b/src/OpenFOAM/meshes/primitiveMesh/primitiveMesh.H
index 0609c453d35d92074fa06f230ddf04133cef04bc..3868ba2b25bc638c6c656b6ea0d3d5ee0b0ad58b 100644
--- a/src/OpenFOAM/meshes/primitiveMesh/primitiveMesh.H
+++ b/src/OpenFOAM/meshes/primitiveMesh/primitiveMesh.H
@@ -155,6 +155,17 @@ class primitiveMesh
             mutable labelListList* cpPtr_;
 
 
+        // On-the-fly edge addresing storage
+
+            //- Temporary storage for addressing. allocSize is the real size
+            //  of the labelList.
+            mutable label allocSize_;
+            mutable labelList labels_;
+
+            //- Temporary storage for addressing
+            mutable labelHashSet labelSet_;
+
+
         // Geometric data
 
             //- Cell centres
@@ -209,8 +220,14 @@ class primitiveMesh
             (
                 List<DynamicList<label> >&,
                 DynamicList<edge>&,
-                const label pA,
-                const label pB
+                const label,
+                const label
+            );
+            //- For on-the-fly addressing calculation
+            static label findFirstCommonElementFromSortedLists
+            ( 
+                const labelList&,
+                const labelList&
             );
 
 
@@ -667,6 +684,55 @@ public:
             //- Print a list of all the currently allocated mesh data
             void printAllocated() const;
 
+            // Per storage whether allocated
+            inline bool hasCellShapes() const;
+            inline bool hasEdges() const;
+            inline bool hasCellCells() const;
+            inline bool hasEdgeCells() const;
+            inline bool hasPointCells() const;
+            inline bool hasCells() const;
+            inline bool hasEdgeFaces() const;
+            inline bool hasPointFaces() const;
+            inline bool hasCellEdges() const;
+            inline bool hasFaceEdges() const;
+            inline bool hasPointEdges() const;
+            inline bool hasPointPoints() const;
+            inline bool hasCellPoints() const;
+            inline bool hasCellCentres() const;
+            inline bool hasFaceCentres() const;
+            inline bool hasCellVolumes() const;
+            inline bool hasFaceAreas() const;
+
+            // On-the-fly addressing calculation. These functions return either
+            // a reference to the full addressing (if already calculated) or
+            // a reference to member data labels_ so be careful when not storing
+            // result.
+
+            //- cellCells using cells
+            const labelList& cellCells(const label cellI) const;
+
+            //- cellPoints using cells
+            const labelList& cellPoints(const label cellI) const;
+
+            //- pointCells using pointFaces
+            const labelList& pointCells(const label pointI) const;
+
+            //- pointPoints using edges, pointEdges
+            const labelList& pointPoints(const label pointI) const;
+
+            //- faceEdges using pointFaces, edges, pointEdges
+            const labelList& faceEdges(const label faceI) const;
+
+            //- edgeFaces using pointFaces, edges, pointEdges
+            const labelList& edgeFaces(const label edgeI) const;
+
+            //- edgeCells using pointFaces, edges, pointEdges
+            const labelList& edgeCells(const label edgeI) const;
+
+            //- cellEdges using cells, pointFaces, edges, pointEdges
+            const labelList& cellEdges(const label cellI) const;
+
+
             //- Clear geometry
             void clearGeom();
 
diff --git a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCellCells.C b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCellCells.C
index d17228c7bd47851d9e9f3eec78656fa0c1cd7de3..3c8f896bbeb827f37f06a89046e77a7f28ab1c2e 100644
--- a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCellCells.C
+++ b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCellCells.C
@@ -105,6 +105,53 @@ const labelListList& primitiveMesh::cellCells() const
 }
 
 
+const labelList& primitiveMesh::cellCells(const label cellI) const
+{
+    if (hasCellCells())
+    {
+        return cellCells()[cellI];
+    }
+    else
+    {
+        const labelList& own = faceOwner();
+        const labelList& nei = faceNeighbour();
+        const cell& cFaces = cells()[cellI];
+
+        labels_.size() = allocSize_;
+
+        if (cFaces.size() > allocSize_)
+        {
+            labels_.clear();
+            allocSize_ = cFaces.size();
+            labels_.setSize(allocSize_);
+        }
+
+        label n = 0;
+
+        forAll(cFaces, i)
+        {
+            label faceI = cFaces[i];
+
+            if (faceI < nInternalFaces())
+            {
+                if (own[faceI] == cellI)
+                {
+                    labels_[n++] = nei[faceI];
+                }
+                else
+                {
+                    labels_[n++] = own[faceI];
+                }
+            }
+        }
+
+        labels_.size() = n;
+
+        return labels_;
+    }
+}
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCellPoints.C b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCellPoints.C
index 542952019be11121f4f4daad931a06c5dc35133f..c8f63e1eef66b839ae0cd0dc99eff5dc80f0e5a8 100644
--- a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCellPoints.C
+++ b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCellPoints.C
@@ -53,6 +53,52 @@ const labelListList& primitiveMesh::cellPoints() const
 }
 
 
+const labelList& primitiveMesh::cellPoints(const label cellI) const
+{
+    if (hasCellPoints())
+    {
+        return cellPoints()[cellI];
+    }
+    else
+    {
+        const faceList& fcs = faces();
+        const labelList& cFaces = cells()[cellI];
+
+        labelSet_.clear();
+
+        forAll(cFaces, i)
+        {
+            const labelList& f = fcs[cFaces[i]];
+
+            forAll(f, fp)
+            {
+                labelSet_.insert(f[fp]);    
+            }
+        }
+
+        labels_.size() = allocSize_;
+
+        if (labelSet_.size() > allocSize_)
+        {
+            labels_.clear();
+            allocSize_ = labelSet_.size();
+            labels_.setSize(allocSize_);
+        }
+
+        label n = 0;
+
+        forAllConstIter(labelHashSet, labelSet_, iter)
+        {
+            labels_[n++] = iter.key();
+        }
+
+        labels_.size() = n;
+
+        return labels_;
+    }
+}
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCheck/primitiveMeshCheck.C b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCheck/primitiveMeshCheck.C
index fd56846ebb0a448172763cf6c401c9ffeb08f4f9..47360d4cf112863e8961ec3b3ddf3a1cab07e14a 100644
--- a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCheck/primitiveMeshCheck.C
+++ b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCheck/primitiveMeshCheck.C
@@ -771,11 +771,12 @@ bool primitiveMesh::checkPoints
         }
     }
 
-    const labelListList& pc = pointCells();
 
-    forAll (pc, pointI)
+    forAll (pf, pointI)
     {
-        if (pc[pointI].size() == 0)
+        const labelList& pc = pointCells(pointI);
+
+        if (pc.size() == 0)
         {
             if (setPtr)
             {
diff --git a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshEdgeCells.C b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshEdgeCells.C
index 46173628d845b2e56c0f6e2ea490d39c79f16016..6a2f309dd31bf7693c45ed9b32f94196e66e0f38 100644
--- a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshEdgeCells.C
+++ b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshEdgeCells.C
@@ -51,6 +51,86 @@ const labelListList& primitiveMesh::edgeCells() const
 }
 
 
+const labelList& primitiveMesh::edgeCells(const label edgeI) const
+{
+    if (hasEdgeCells())
+    {
+        return edgeCells()[edgeI];
+    }
+    else
+    {
+        const labelList& own = faceOwner();
+        const labelList& nei = faceNeighbour();
+
+        // edge faces can either return labels_ or reference in edgeLabels.
+        labelList labelsCopy;
+        if (!hasEdgeFaces())
+        {
+            labelsCopy = edgeFaces(edgeI);
+        }
+
+        const labelList& eFaces =
+        (
+            hasEdgeFaces()
+          ? edgeFaces()[edgeI]
+          : labelsCopy
+        );
+
+        labels_.size() = allocSize_;
+
+        // labels_ should certainly be big enough for edge cells.
+        label n = 0;
+
+        // Do quadratic insertion.
+        forAll(eFaces, i)
+        {
+            label faceI = eFaces[i];
+
+            {
+                label ownCellI = own[faceI];
+
+                // Check if not already in labels_
+                for (label j = 0; j < n; j++)
+                {
+                    if (labels_[j] == ownCellI)
+                    {
+                        ownCellI = -1;
+                        break;
+                    }
+                }
+
+                if (ownCellI != -1)
+                {
+                    labels_[n++] = ownCellI;
+                }
+            }
+
+            if (isInternalFace(faceI))
+            {
+                label neiCellI = nei[faceI];
+
+                for (label j = 0; j < n; j++)
+                {
+                    if (labels_[j] == neiCellI)
+                    {
+                        neiCellI = -1;
+                        break;
+                    }
+                }
+
+                if (neiCellI != -1)
+                {
+                    labels_[n++] = neiCellI;
+                }
+            }
+        }
+
+        labels_.size() = n;
+
+        return labels_;
+    }
+}
+
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
diff --git a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshEdgeFaces.C b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshEdgeFaces.C
index 30390ce4ebe1e40e375bea7d6f270f814d6450b0..99536bcd335fe3cae6a3081aa48532adab9f3d8f 100644
--- a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshEdgeFaces.C
+++ b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshEdgeFaces.C
@@ -51,6 +51,59 @@ const labelListList& primitiveMesh::edgeFaces() const
     return *efPtr_;
 }
 
+
+const labelList& primitiveMesh::edgeFaces(const label edgeI) const
+{
+    if (hasEdgeFaces())
+    {
+        return edgeFaces()[edgeI];
+    }
+    else
+    {
+        // Use the fact that pointEdges are sorted in incrementing edge order
+        const edge& e = edges()[edgeI];
+        const labelList& pFaces0 = pointFaces()[e[0]];
+        const labelList& pFaces1 = pointFaces()[e[1]];
+
+        label i0 = 0;
+        label i1 = 0;
+        label n = 0;
+
+        labels_.size() = allocSize_;
+
+        while (i0 < pFaces0.size() && i1 < pFaces1.size())
+        {
+            if (pFaces0[i0] < pFaces1[i1])
+            {
+                ++i0;
+            }
+            else if (pFaces0[i0] > pFaces1[i1])
+            {
+                ++i1;
+            }
+            else
+            {
+                // Equal. Append.
+                if (n == allocSize_)
+                {
+                    // Have setSize copy contents so far
+                    labels_.size() = n;
+                    allocSize_ = allocSize_*2 + 1;
+                    labels_.setSize(allocSize_);
+                }
+                labels_[n++] = pFaces0[i0];
+                ++i0;
+                ++i1;
+            }
+        }
+
+        labels_.size() = n;
+
+        return labels_;
+    }
+}
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshEdges.C b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshEdges.C
index 6b3039ff308d0ba521ff8fafd46d84e9080b9480..b60b366079fa843427c6ca77f35dea3be449780b 100644
--- a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshEdges.C
+++ b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshEdges.C
@@ -461,6 +461,46 @@ void primitiveMesh::calcEdges(const bool doFaceEdges) const
 }
 
 
+label primitiveMesh::findFirstCommonElementFromSortedLists
+( 
+    const labelList& list1,
+    const labelList& list2
+)
+{
+    label result = -1;
+
+    labelList::const_iterator iter1 = list1.begin();
+    labelList::const_iterator iter2 = list2.begin();
+
+    while (iter1 != list1.end() && iter2 != list2.end())
+    {
+        if( *iter1 < *iter2)
+        {
+            ++iter1;
+        }
+        else if (*iter1 > *iter2)
+        {
+            ++iter2;
+        }
+        else
+        {
+            result = *iter1;
+            break;
+        }
+    }
+    if (result == -1)
+    {
+        FatalErrorIn
+        (
+            "primitiveMesh::findFirstCommonElementFromSortedLists"
+            "(const labelList&, const labelList&)"
+        )   << "No common elements in lists " << list1 << " and " << list2
+            << abort(FatalError);        
+    }
+    return result;
+}
+
+
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 const edgeList& primitiveMesh::edges() const
@@ -542,6 +582,91 @@ void primitiveMesh::clearOutEdges()
     deleteDemandDrivenData(edgesPtr_);
     deleteDemandDrivenData(pePtr_);
     deleteDemandDrivenData(fePtr_);
+    labels_.clear();
+    allocSize_ = 0;
+}
+
+
+const labelList& primitiveMesh::faceEdges(const label faceI) const
+{
+    if (hasFaceEdges())
+    {
+        return faceEdges()[faceI];
+    }
+    else
+    {
+        const labelListList& pointEs = pointEdges();
+        const face& f = faces()[faceI];
+
+        labels_.size() = allocSize_;
+
+        if (f.size() > allocSize_)
+        {
+            labels_.clear();
+            allocSize_ = f.size();
+            labels_.setSize(allocSize_);
+        }
+
+        label n = 0;
+
+        forAll(f, fp)
+        {
+            labels_[n++] = findFirstCommonElementFromSortedLists
+            (
+                pointEs[f[fp]],
+                pointEs[f.nextLabel(fp)]
+            );
+        }
+
+        labels_.size() = n;
+
+        return labels_;
+    }
+}
+
+
+const labelList& primitiveMesh::cellEdges(const label cellI) const
+{
+    if (hasCellEdges())
+    {
+        return cellEdges()[cellI];
+    }
+    else
+    {
+        const labelList& cFaces = cells()[cellI];
+
+        labelSet_.clear();
+
+        forAll(cFaces, i)
+        {
+            const labelList& fe = faceEdges(cFaces[i]);
+
+            forAll(fe, feI)
+            {
+                labelSet_.insert(fe[feI]);    
+            }
+        }
+
+        labels_.size() = allocSize_;
+
+        if (labelSet_.size() > allocSize_)
+        {
+            labels_.clear();
+            allocSize_ = labelSet_.size();
+            labels_.setSize(allocSize_);
+        }
+
+        label n =0;
+
+        forAllConstIter(labelHashSet, labelSet_, iter)
+        {
+            labels_[n++] = iter.key();
+        }
+
+        labels_.size() = n;
+
+        return labels_;
+    }
 }
 
 
diff --git a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshI.H b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshI.H
index fdaea6d1fc0c2b35181e0c7c2a7f9bf607d3aa9c..98b32af1fcc51947b95466cbccec0bc8b21d22a9 100644
--- a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshI.H
+++ b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshI.H
@@ -104,6 +104,108 @@ inline bool primitiveMesh::isInternalFace(const label faceIndex) const
 }
 
 
+inline bool primitiveMesh::hasCellShapes() const
+{
+    return cellShapesPtr_;
+}
+
+
+inline bool primitiveMesh::hasEdges() const
+{
+    return edgesPtr_;
+}
+
+
+inline bool primitiveMesh::hasCellCells() const
+{
+    return ccPtr_;
+}
+
+
+inline bool primitiveMesh::hasEdgeCells() const
+{
+    return ecPtr_;
+}
+
+
+inline bool primitiveMesh::hasPointCells() const
+{
+    return pcPtr_;
+}
+
+
+inline bool primitiveMesh::hasCells() const
+{
+    return cfPtr_;
+}
+
+
+inline bool primitiveMesh::hasEdgeFaces() const
+{
+    return efPtr_;
+}
+
+
+inline bool primitiveMesh::hasPointFaces() const
+{
+    return pfPtr_;
+}
+
+
+inline bool primitiveMesh::hasCellEdges() const
+{
+    return cePtr_;
+}
+
+
+inline bool primitiveMesh::hasFaceEdges() const
+{
+    return fePtr_;
+}
+
+
+inline bool primitiveMesh::hasPointEdges() const
+{
+    return pePtr_;
+}
+
+
+inline bool primitiveMesh::hasPointPoints() const
+{
+    return ppPtr_;
+}
+
+
+inline bool primitiveMesh::hasCellPoints() const
+{
+    return cpPtr_;
+}
+
+
+inline bool primitiveMesh::hasCellCentres() const
+{
+    return cellCentresPtr_;
+}
+
+
+inline bool primitiveMesh::hasFaceCentres() const
+{
+    return faceCentresPtr_;
+}
+
+
+inline bool primitiveMesh::hasCellVolumes() const
+{
+    return cellVolumesPtr_;
+}
+
+
+inline bool primitiveMesh::hasFaceAreas() const
+{
+    return faceAreasPtr_;
+}
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshPointCells.C b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshPointCells.C
index 55d877902a6fa1e9301d77ce429a3adf71717a33..6d7af72e0b8e2c1553922f0ad5b617fe12fd7012 100644
--- a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshPointCells.C
+++ b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshPointCells.C
@@ -114,6 +114,70 @@ const labelListList& primitiveMesh::pointCells() const
 }
 
 
+const labelList& primitiveMesh::pointCells(const label pointI) const
+{
+    if (hasPointCells())
+    {
+        return pointCells()[pointI];
+    }
+    else
+    {
+        const labelList& own = faceOwner();
+        const labelList& nei = faceNeighbour();
+        const labelList& pFaces = pointFaces()[pointI];
+
+        labels_.size() = allocSize_;
+
+        label n = 0;
+
+        forAll(pFaces, i)
+        {
+            const label faceI = pFaces[i];
+
+            // Append owner
+            if (n == allocSize_)
+            {
+                labels_.size() = n;
+                allocSize_ = allocSize_*2 + 1;
+                labels_.setSize(allocSize_);
+            }
+            labels_[n++] = own[faceI];
+
+            // Append neighbour
+            if (faceI < nInternalFaces())
+            {
+                if (n == allocSize_)
+                {
+                    labels_.size() = n;
+                    allocSize_ = allocSize_*2 + 1;
+                    labels_.setSize(allocSize_);
+                }
+                labels_[n++] = nei[faceI];
+            }
+        }
+        labels_.size() = n;
+
+
+        // Filter duplicates
+        sort(labels_);
+
+        n = 1;
+
+        for (label i = 1; i < labels_.size(); i++)
+        {
+            if (labels_[i] != labels_[i-1])
+            {
+                labels_[n++] = labels_[i];
+            }
+        }
+
+        labels_.size() = n;
+
+        return labels_;
+    }
+}
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshPointPoints.C b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshPointPoints.C
index c5df74a4faa3e9a5fe2f10e282c112a46326f2fa..099e2669418d7ed4310d673caeb7adb3e2f8003a 100644
--- a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshPointPoints.C
+++ b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshPointPoints.C
@@ -97,6 +97,40 @@ const labelListList& primitiveMesh::pointPoints() const
 }
 
 
+const labelList& primitiveMesh::pointPoints(const label pointI) const
+{
+    if (hasPointPoints())
+    {
+        return pointPoints()[pointI];
+    }
+    else
+    {
+        const edgeList& edges = this->edges();
+        const labelList& pEdges = pointEdges()[pointI];
+
+        labels_.size() = allocSize_;
+
+        if (pEdges.size() > allocSize_)
+        {
+            // Set size() so memory allocation behaves as normal.
+            labels_.clear();
+            allocSize_ = pEdges.size();
+            labels_.setSize(allocSize_);
+        }
+
+        label n = 0;
+
+        forAll(pEdges, i)
+        {
+            labels_[n++] = edges[pEdges[i]].otherVertex(pointI);
+        }
+
+        labels_.size() = n;
+
+        return labels_;
+    }
+}
+
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
diff --git a/src/OpenFOAM/primitives/contiguous/contiguous.H b/src/OpenFOAM/primitives/contiguous/contiguous.H
index 2413b67127ad43397e1b76d797512d705d342e08..d634bb0b603178f45e7d81c7351e931314761279 100644
--- a/src/OpenFOAM/primitives/contiguous/contiguous.H
+++ b/src/OpenFOAM/primitives/contiguous/contiguous.H
@@ -47,34 +47,52 @@ namespace Foam
 
 // Assume the data associated with type T is not contiguous
 template<class T>
-inline bool contiguous()              {return false;}
+inline bool contiguous()                        {return false;}
 
 
 // Specify data associated with primitive types is contiguous
 
 template<>
-inline bool contiguous<bool>()        {return true;}
+inline bool contiguous<bool>()                  {return true;}
 
 template<>
-inline bool contiguous<char>()        {return true;}
+inline bool contiguous<char>()                  {return true;}
 
 template<>
-inline bool contiguous<short>()       {return true;}
+inline bool contiguous<unsigned char>()         {return true;}
 
 template<>
-inline bool contiguous<int>()         {return true;}
+inline bool contiguous<short>()                 {return true;}
 
 template<>
-inline bool contiguous<long>()        {return true;}
+inline bool contiguous<unsigned short>()        {return true;}
 
 template<>
-inline bool contiguous<float>()       {return true;}
+inline bool contiguous<int>()                   {return true;}
 
 template<>
-inline bool contiguous<double>()      {return true;}
+inline bool contiguous<unsigned int>()          {return true;}
 
 template<>
-inline bool contiguous<long double>() {return true;}
+inline bool contiguous<long>()                  {return true;}
+
+template<>
+inline bool contiguous<unsigned long>()         {return true;}
+
+template<>
+inline bool contiguous<long long>()             {return true;}
+
+template<>
+inline bool contiguous<unsigned long long>()    {return true;}
+
+template<>
+inline bool contiguous<float>()                 {return true;}
+
+template<>
+inline bool contiguous<double>()                {return true;}
+
+template<>
+inline bool contiguous<long double>()           {return true;}
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/conversion/polyDualMesh/polyDualMesh.C b/src/conversion/polyDualMesh/polyDualMesh.C
index 10434aba22d9eac92409c6251e10996a723ad7be..6a776e3b8319a9aa7c3d075d3894913b69174c2e 100644
--- a/src/conversion/polyDualMesh/polyDualMesh.C
+++ b/src/conversion/polyDualMesh/polyDualMesh.C
@@ -746,8 +746,7 @@ void Foam::polyDualMesh::calcDual
         allBoundary.meshEdges
         (
             mesh.edges(),
-            mesh.cellEdges(),
-            SubList<label>(mesh.faceOwner(), allBoundary.size(), nIntFaces)
+            mesh.pointEdges()
         )
     );
 
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.C b/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.C
index bfe18f3363a80f2b0530bf7d53b039c38b8f691e..08e9566e48a2342025271b492b1eb7765af2c35a 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.C
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.C
@@ -1295,7 +1295,7 @@ void Foam::polyTopoChange::calcFaceInflationMaps
                     selectFaces
                     (
                         mesh,
-                        mesh.edgeFaces()[iter()],
+                        mesh.edgeFaces(iter()),
                         true
                     )
                 );
@@ -1309,7 +1309,7 @@ void Foam::polyTopoChange::calcFaceInflationMaps
                     selectFaces
                     (
                         mesh,
-                        mesh.edgeFaces()[iter()],
+                        mesh.edgeFaces(iter()),
                         false
                     )
                 );
diff --git a/src/finiteVolume/Make/files b/src/finiteVolume/Make/files
index 6789ff84f6262c4e8c6b0fb13a34ce7443a960dd..3b93c79619db733ca2e351be16a501c1db34c7d9 100644
--- a/src/finiteVolume/Make/files
+++ b/src/finiteVolume/Make/files
@@ -187,6 +187,8 @@ $(limitedSchemes)/MC/MC.C
 $(limitedSchemes)/Phi/Phi.C
 $(limitedSchemes)/filteredLinear/filteredLinear.C
 $(limitedSchemes)/filteredLinear2/filteredLinear2.C
+$(limitedSchemes)/filteredLinear3/filteredLinear3.C
+$(limitedSchemes)/limitWith/limitWith.C
 
 multivariateSchemes = $(surfaceInterpolation)/multivariateSchemes
 $(multivariateSchemes)/multivariateSurfaceInterpolationScheme/multivariateSurfaceInterpolationSchemes.C
diff --git a/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/filteredLinear3/filteredLinear3.C b/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/filteredLinear3/filteredLinear3.C
new file mode 100644
index 0000000000000000000000000000000000000000..e1da4b7106602ac3b781eb31e317fba7a9c05129
--- /dev/null
+++ b/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/filteredLinear3/filteredLinear3.C
@@ -0,0 +1,48 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2008 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the
+    Free Software Foundation; either version 2 of the License, or (at your
+    option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM; if not, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "LimitedScheme.H"
+#include "filteredLinear3.H"
+#include "filteredLinear3V.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    makeLimitedSurfaceInterpolationScheme
+    (
+        filteredLinear3,
+        filteredLinear3Limiter
+    )
+
+    makeLimitedVSurfaceInterpolationScheme
+    (
+        filteredLinear3V,
+        filteredLinear3VLimiter
+    )
+}
+
+// ************************************************************************* //
diff --git a/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/filteredLinear3/filteredLinear3.H b/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/filteredLinear3/filteredLinear3.H
new file mode 100644
index 0000000000000000000000000000000000000000..b368192b310cdd6117266450711fa10e8d7c2038
--- /dev/null
+++ b/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/filteredLinear3/filteredLinear3.H
@@ -0,0 +1,120 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2008 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the
+    Free Software Foundation; either version 2 of the License, or (at your
+    option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM; if not, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::filteredLinear3Limiter
+
+Description
+    Class to generate weighting factors for the filtered-linear-3
+    differencing scheme.
+
+    The aim is to remove high-frequency modes with "staggering"
+    characteristics by comparing the face gradient with both neighbouring
+    cell gradients and introduce small amounts of upwind in order to damp
+    these modes.
+
+    Used in conjunction with the template class LimitedScheme.
+
+SourceFiles
+    filteredLinear3.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef filteredLinear3_H
+#define filteredLinear3_H
+
+#include "vector.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                     Class filteredLinear3Limiter Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class LimiterFunc>
+class filteredLinear3Limiter
+:
+    public LimiterFunc
+{
+    // Private data
+
+        // Scaling corefficient for the gradient ratio,
+        // 0 = linear
+        // 1 = fully limited
+        scalar k_;
+
+public:
+
+    filteredLinear3Limiter(Istream& is)
+    :
+        k_(readScalar(is))
+    {
+        if (k_ < 0 || k_ > 1)
+        {
+            FatalIOErrorIn("filteredLinear3Limiter(Istream& is)", is)
+                << "coefficient = " << k_
+                << " should be >= 0 and <= 1"
+                << exit(FatalIOError);
+        }    
+    }
+
+    scalar limiter
+    (
+        const scalar cdWeight,
+        const scalar faceFlux,
+        const typename LimiterFunc::phiType& phiP,
+        const typename LimiterFunc::phiType& phiN,
+        const typename LimiterFunc::gradPhiType& gradcP,
+        const typename LimiterFunc::gradPhiType& gradcN,
+        const vector& d
+    ) const
+    {
+        // Difference across face
+        scalar df = phiN - phiP;
+
+        // Twice the differences across face-neighbour cells
+        scalar dP = 2*(d & gradcP);
+        scalar dN = 2*(d & gradcN);
+
+        // Calculate the limiter
+        scalar limiter = 1 - k_*(dN - df)*(dP - df)/max(sqr(dN + dP), SMALL);
+
+        // Limit the limiter between linear and upwind
+        return max(min(limiter, 1), 0);
+    }
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/filteredLinear3/filteredLinear3V.H b/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/filteredLinear3/filteredLinear3V.H
new file mode 100644
index 0000000000000000000000000000000000000000..e44c334a1a745160603f8073f03027c3fa561c51
--- /dev/null
+++ b/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/filteredLinear3/filteredLinear3V.H
@@ -0,0 +1,123 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2008 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the
+    Free Software Foundation; either version 2 of the License, or (at your
+    option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM; if not, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::filteredLinear3VLimiter
+
+Description
+    Class to generate weighting factors for the filteredLinear3V differencing
+    scheme.  The aim is to remove high-frequency modes with "staggering"
+    characteristics from vector fields by comparing the face gradient in the
+    direction of maximum gradient with both neighbouring cell gradients and
+    introduce small amounts of upwind in order to damp these modes.
+
+    Used in conjunction with the template class LimitedScheme.
+
+SourceFiles
+    filteredLinear3V.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef filteredLinear3V_H
+#define filteredLinear3V_H
+
+#include "vector.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                 Class filteredLinear3VLimiter Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class LimiterFunc>
+class filteredLinear3VLimiter
+:
+    public LimiterFunc
+{
+    // Private data
+
+        // Scaling corefficient for the gradient ratio,
+        // 0 = linear
+        // 1 = fully limited
+        scalar k_;
+
+public:
+
+    filteredLinear3VLimiter(Istream& is)
+    :
+        k_(readScalar(is))
+    {
+        if (k_ < 0 || k_ > 1)
+        {
+            FatalIOErrorIn("filteredLinear3VLimiter(Istream& is)", is)
+                << "coefficient = " << k_
+                << " should be >= 0 and <= 1"
+                << exit(FatalIOError);
+        }    
+    }
+
+    scalar limiter
+    (
+        const scalar cdWeight,
+        const scalar faceFlux,
+        const typename LimiterFunc::phiType& phiP,
+        const typename LimiterFunc::phiType& phiN,
+        const typename LimiterFunc::gradPhiType& gradcP,
+        const typename LimiterFunc::gradPhiType& gradcN,
+        const vector& d
+    ) const
+    {
+        // Difference across face
+        vector dfV = phiN - phiP;
+
+        // Scalar difference across the face
+        // in the direction in which the difference is largest
+        scalar df = dfV & dfV;
+
+        // Twice differences across face-neighbour cells
+        // in the direction in which the face-difference is largest
+        scalar dP = 2*(dfV & (d & gradcP));
+        scalar dN = 2*(dfV & (d & gradcN));
+
+        // Calculate the limiter
+        scalar limiter = 1 - k_*(dN - df)*(dP - df)/max(sqr(dN + dP), SMALL);
+
+        // Limit the limiter between linear and upwind
+        return max(min(limiter, 1), 0);
+    }
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/limitWith/limitWith.C b/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/limitWith/limitWith.C
new file mode 100644
index 0000000000000000000000000000000000000000..b7af793b391f59f8aef4fa0ae0efba475f41884e
--- /dev/null
+++ b/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/limitWith/limitWith.C
@@ -0,0 +1,37 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2008 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the
+    Free Software Foundation; either version 2 of the License, or (at your
+    option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM; if not, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "fvMesh.H"
+#include "limitWith.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    makeSurfaceInterpolationScheme(limitWith)
+}
+
+// ************************************************************************* //
diff --git a/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/limitWith/limitWith.H b/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/limitWith/limitWith.H
new file mode 100644
index 0000000000000000000000000000000000000000..090f91353d98906175aeb523ae43d801030bb609
--- /dev/null
+++ b/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/limitWith/limitWith.H
@@ -0,0 +1,161 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2008 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the
+    Free Software Foundation; either version 2 of the License, or (at your
+    option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM; if not, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::limitWith
+
+Description
+    limitWith differencing scheme limits the specified scheme with the
+    specified limiter.
+
+SourceFiles
+    limitWith.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef limitWith_H
+#define limitWith_H
+
+#include "surfaceInterpolationScheme.H"
+#include "limitedSurfaceInterpolationScheme.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                           Class limitWith Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class Type>
+class limitWith
+:
+    public surfaceInterpolationScheme<Type>
+{
+    // Private Member Functions
+
+        //- Interpolation scheme
+        tmp<surfaceInterpolationScheme<Type> > tInterp_;
+
+        //- Limiter
+        tmp<limitedSurfaceInterpolationScheme<Type> > tLimiter_;
+
+
+        //- Disallow default bitwise copy construct
+        limitWith(const limitWith&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const limitWith&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("limitWith");
+
+
+    // Constructors
+
+        //- Construct from mesh and Istream.
+        //  The name of the flux field is read from the Istream and looked-up
+        //  from the mesh objectRegistry
+        limitWith
+        (
+            const fvMesh& mesh,
+            Istream& is
+        )
+        :
+            surfaceInterpolationScheme<Type>(mesh),
+            tInterp_
+            (
+                surfaceInterpolationScheme<Type>::New(mesh, is)
+            ),
+            tLimiter_
+            (
+                limitedSurfaceInterpolationScheme<Type>::New(mesh, is)
+            )
+        {}
+
+        //- Construct from mesh, faceFlux and Istream
+        limitWith
+        (
+            const fvMesh& mesh,
+            const surfaceScalarField& faceFlux,
+            Istream& is
+        )
+        :
+            surfaceInterpolationScheme<Type>(mesh),
+            tInterp_
+            (
+                surfaceInterpolationScheme<Type>::New(mesh, faceFlux, is)
+            ),
+            tLimiter_
+            (
+                limitedSurfaceInterpolationScheme<Type>::New(mesh, faceFlux, is)
+            )
+        {}
+
+
+    // Member Functions
+
+        //- Return the interpolation weighting factors
+        virtual tmp<surfaceScalarField> weights
+        (
+            const GeometricField<Type, fvPatchField, volMesh>& vf
+        ) const
+        {
+            return tLimiter_().weights
+            (
+                vf,
+                tInterp_().weights(vf),
+                tLimiter_().limiter(vf)
+            );
+        }
+
+        //- Return true if this scheme uses an explicit correction
+        virtual bool corrected() const
+        {
+            return tInterp_().corrected();
+        }
+
+        //- Return the explicit correction to the face-interpolate
+        //  for the given field
+        virtual tmp<GeometricField<Type, fvsPatchField, surfaceMesh> >
+        correction(const GeometricField<Type, fvPatchField, volMesh>& vf) const
+        {
+            return tLimiter_().limiter(vf)*tInterp_().correction(vf);
+        }
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/limitedSurfaceInterpolationScheme/limitedSurfaceInterpolationScheme.C b/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/limitedSurfaceInterpolationScheme/limitedSurfaceInterpolationScheme.C
index c865fe022dbe681ae5e5ee7c014623fd0a5fa70b..458324b6ccdb0c7683a0e0832f496235ae73cd3e 100644
--- a/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/limitedSurfaceInterpolationScheme/limitedSurfaceInterpolationScheme.C
+++ b/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/limitedSurfaceInterpolationScheme/limitedSurfaceInterpolationScheme.C
@@ -22,9 +22,6 @@ License
     along with OpenFOAM; if not, write to the Free Software Foundation,
     Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 
-Description
-    Abstract base class for surface interpolation schemes.
-
 \*---------------------------------------------------------------------------*/
 
 #include "limitedSurfaceInterpolationScheme.H"
@@ -39,7 +36,6 @@ namespace Foam
 
 // * * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * //
 
-// Return weighting factors for scheme given by name in dictionary
 template<class Type>
 tmp<limitedSurfaceInterpolationScheme<Type> >
 limitedSurfaceInterpolationScheme<Type>::New
@@ -160,17 +156,14 @@ limitedSurfaceInterpolationScheme<Type>::~limitedSurfaceInterpolationScheme()
 template<class Type>
 tmp<surfaceScalarField> limitedSurfaceInterpolationScheme<Type>::weights
 (
-    const GeometricField<Type, fvPatchField, volMesh>& phi
+    const GeometricField<Type, fvPatchField, volMesh>& phi,
+    const surfaceScalarField& CDweights,
+    tmp<surfaceScalarField> tLimiter
 ) const
 {
-    const fvMesh& mesh = this->mesh();
-
     // Note that here the weights field is initialised as the limiter
     // from which the weight is calculated using the limiter value
-    tmp<surfaceScalarField> tWeights(this->limiter(phi));
-    surfaceScalarField& Weights = tWeights();
-
-    const surfaceScalarField& CDweights = mesh.surfaceInterpolation::weights();
+    surfaceScalarField& Weights = tLimiter();
 
     scalarField& pWeights = Weights.internalField();
 
@@ -199,9 +192,22 @@ tmp<surfaceScalarField> limitedSurfaceInterpolationScheme<Type>::weights
         }
     }
 
-    return tWeights;
+    return tLimiter;
 }
 
+template<class Type>
+tmp<surfaceScalarField> limitedSurfaceInterpolationScheme<Type>::weights
+(
+    const GeometricField<Type, fvPatchField, volMesh>& phi
+) const
+{
+    return this->weights
+    (
+        phi,
+        this->mesh().surfaceInterpolation::weights(),
+        this->limiter(phi)
+    );
+}
 
 template<class Type>
 tmp<GeometricField<Type, fvsPatchField, surfaceMesh> >
diff --git a/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/limitedSurfaceInterpolationScheme/limitedSurfaceInterpolationScheme.H b/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/limitedSurfaceInterpolationScheme/limitedSurfaceInterpolationScheme.H
index 569b942e5395ba9d61097ed9b03663f662237187..875ac7e6b158bc879d51c0d229b8930e09f0b372 100644
--- a/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/limitedSurfaceInterpolationScheme/limitedSurfaceInterpolationScheme.H
+++ b/src/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/limitedSurfaceInterpolationScheme/limitedSurfaceInterpolationScheme.H
@@ -26,7 +26,7 @@ Class
     Foam::limitedSurfaceInterpolationScheme
 
 Description
-    Abstract base class for surface interpolation schemes.
+    Abstract base class for limited surface interpolation schemes.
 
 SourceFiles
     limitedSurfaceInterpolationScheme.C
@@ -119,7 +119,7 @@ public:
         {}
 
 
-        //- Construct from mesh and Istream. 
+        //- Construct from mesh and Istream.
         //  The name of the flux field is read from the Istream and looked-up
         //  from the mesh objectRegistry
         limitedSurfaceInterpolationScheme
@@ -170,6 +170,15 @@ public:
             const GeometricField<Type, fvPatchField, volMesh>&
         ) const = 0;
 
+        //- Return the interpolation weighting factors for the given field,
+        //  by limiting the given weights with the given limiter
+        tmp<surfaceScalarField> weights
+        (
+            const GeometricField<Type, fvPatchField, volMesh>&,
+            const surfaceScalarField& CDweights,
+            tmp<surfaceScalarField> tLimiter
+        ) const;
+
         //- Return the interpolation weighting factors for the given field
         virtual tmp<surfaceScalarField> weights
         (
diff --git a/src/meshTools/meshTools/meshTools.C b/src/meshTools/meshTools/meshTools.C
index 49a06cf868a8dce2cf3da5a297d3919b0f5d5474..352de0feec295f0b5b466738a5962f1dcaac5b38 100644
--- a/src/meshTools/meshTools/meshTools.C
+++ b/src/meshTools/meshTools/meshTools.C
@@ -182,7 +182,7 @@ Foam::vectorField Foam::meshTools::calcBoxPointNormals(const primitivePatch& pp)
                     "Foam::meshTools::calcBoxPointNormals"
                     "(const primitivePatch& pp)"
                 )   << "No visible octant for point:" << pp.meshPoints()[pointI]
-                    << " cooord:" << pp.localPoints()[pointI] << nl
+                    << " cooord:" << pp.points()[pp.meshPoints()[pointI]] << nl
                     << "Normal set to " << pn[pointI] << endl;
             }
         }
@@ -299,7 +299,7 @@ bool Foam::meshTools::edgeOnCell
     const label edgeI
 )
 {
-    return findIndex(mesh.edgeCells()[edgeI], cellI) != -1;
+    return findIndex(mesh.edgeCells(edgeI), cellI) != -1;
 }        
 
 
@@ -310,7 +310,7 @@ bool Foam::meshTools::edgeOnFace
     const label edgeI
 )
 {
-    return findIndex(mesh.faceEdges()[faceI], edgeI) != -1;
+    return findIndex(mesh.faceEdges(faceI), edgeI) != -1;
 }        
 
 
@@ -403,7 +403,6 @@ Foam::label Foam::meshTools::getSharedEdge
     const labelList& f0Edges = mesh.faceEdges()[f0];
     const labelList& f1Edges = mesh.faceEdges()[f1];
 
-
     forAll(f0Edges, f0EdgeI)
     {
         label edge0 = f0Edges[f0EdgeI];
@@ -481,7 +480,7 @@ void Foam::meshTools::getEdgeFaces
     label& face1
 )
 {
-    const labelList& eFaces = mesh.edgeFaces()[edgeI];
+    const labelList& eFaces = mesh.edgeFaces(edgeI);
 
     face0 = -1;
     face1 = -1;
@@ -619,7 +618,7 @@ Foam::label Foam::meshTools::walkFace
     const label nEdges
 )
 {
-    const labelList& fEdges = mesh.faceEdges()[faceI];
+    const labelList& fEdges = mesh.faceEdges(faceI);
 
     label edgeI = startEdgeI;
 
@@ -790,13 +789,4 @@ Foam::label Foam::meshTools::cutDirToEdge
 }
 
 
-// * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
-
-
-// * * * * * * * * * * * * * * * Friend Functions  * * * * * * * * * * * * * //
-
-
-// * * * * * * * * * * * * * * * Friend Operators  * * * * * * * * * * * * * //
-
-
 // ************************************************************************* //
diff --git a/tutorials/MRFSimpleFoam/mixerVessel2D/constant/polyMesh/blockMeshDict.m4 b/tutorials/MRFSimpleFoam/mixerVessel2D/constant/polyMesh/blockMeshDict.m4
index 899b4ccbec0533e9f0037943ef14439454f12f9e..eaa448596c06a89b270603aaabd722cf44fa7f3e 100644
--- a/tutorials/MRFSimpleFoam/mixerVessel2D/constant/polyMesh/blockMeshDict.m4
+++ b/tutorials/MRFSimpleFoam/mixerVessel2D/constant/polyMesh/blockMeshDict.m4
@@ -8,7 +8,7 @@
 FoamFile
 {
     version     2.0;
-    format      ascii;
+    `format'      ascii;
     class       dictionary;
     object      blockMeshDict;
 }
@@ -420,7 +420,7 @@ vertices
     vert(4, 7, Zt) vlabel(R7st)
 );
 
-blocks          
+blocks
 (
     // block0
     hex2D(r0, r1, rb1, rb0)
@@ -692,7 +692,7 @@ edges
     arc R7t R0t evert(4, 7, Zt)
 );
 
-patches         
+patches
 (
     wall rotor
     (
diff --git a/tutorials/interDyMFoam/sloshingTank2D3DoF/constant/polyMesh/blockMeshDict.m4 b/tutorials/interDyMFoam/sloshingTank2D3DoF/constant/polyMesh/blockMeshDict.m4
index ad753abc5629d10e631b0b69a54495ce58509d2c..5f286a9a6bc642bbb0b92f586a0ecc76fe67bcc8 100644
--- a/tutorials/interDyMFoam/sloshingTank2D3DoF/constant/polyMesh/blockMeshDict.m4
+++ b/tutorials/interDyMFoam/sloshingTank2D3DoF/constant/polyMesh/blockMeshDict.m4
@@ -8,7 +8,7 @@
 FoamFile
 {
     version     2.0;
-    format      ascii;
+    `format'      ascii;
     class       dictionary;
     object      blockMeshDict;
 }
diff --git a/tutorials/interDyMFoam/sloshingTank3D/constant/polyMesh/blockMeshDict.m4 b/tutorials/interDyMFoam/sloshingTank3D/constant/polyMesh/blockMeshDict.m4
index 5e355fd7025a748a668cd3d55bfe9bd984c78869..d00110499198e0a49652f9797f09c7baff05a112 100644
--- a/tutorials/interDyMFoam/sloshingTank3D/constant/polyMesh/blockMeshDict.m4
+++ b/tutorials/interDyMFoam/sloshingTank3D/constant/polyMesh/blockMeshDict.m4
@@ -8,7 +8,7 @@
 FoamFile
 {
     version     2.0;
-    format      ascii;
+    `format'      ascii;
     class       dictionary;
     object      blockMeshDict;
 }
diff --git a/tutorials/interDyMFoam/sloshingTank3D3DoF/constant/polyMesh/blockMeshDict.m4 b/tutorials/interDyMFoam/sloshingTank3D3DoF/constant/polyMesh/blockMeshDict.m4
index cc851f6503f90da326a66561c0ccac74fb36f5dc..0b91b83dd263a10bcc2c7ba94513c8076109fae1 100644
--- a/tutorials/interDyMFoam/sloshingTank3D3DoF/constant/polyMesh/blockMeshDict.m4
+++ b/tutorials/interDyMFoam/sloshingTank3D3DoF/constant/polyMesh/blockMeshDict.m4
@@ -8,7 +8,7 @@
 FoamFile
 {
     version     2.0;
-    format      ascii;
+    `format'      ascii;
     class       dictionary;
     object      blockMeshDict;
 }
diff --git a/tutorials/interDyMFoam/sloshingTank3D6DoF/constant/polyMesh/blockMeshDict.m4 b/tutorials/interDyMFoam/sloshingTank3D6DoF/constant/polyMesh/blockMeshDict.m4
index cc851f6503f90da326a66561c0ccac74fb36f5dc..0b91b83dd263a10bcc2c7ba94513c8076109fae1 100644
--- a/tutorials/interDyMFoam/sloshingTank3D6DoF/constant/polyMesh/blockMeshDict.m4
+++ b/tutorials/interDyMFoam/sloshingTank3D6DoF/constant/polyMesh/blockMeshDict.m4
@@ -8,7 +8,7 @@
 FoamFile
 {
     version     2.0;
-    format      ascii;
+    `format'      ascii;
     class       dictionary;
     object      blockMeshDict;
 }
diff --git a/tutorials/rhoPimpleFoam/angledDuct/constant/polyMesh/blockMeshDict.m4 b/tutorials/rhoPimpleFoam/angledDuct/constant/polyMesh/blockMeshDict.m4
index eb610e5209a34c94f645a7e8908a14ea0664cae8..c9b482f117dadfdcf2a2bd8c17ccfaf830c64d2f 100644
--- a/tutorials/rhoPimpleFoam/angledDuct/constant/polyMesh/blockMeshDict.m4
+++ b/tutorials/rhoPimpleFoam/angledDuct/constant/polyMesh/blockMeshDict.m4
@@ -8,7 +8,7 @@
 FoamFile
 {
     version     2.0;
-    format      ascii;
+    `format'      ascii;
     class       dictionary;
     object      blockMeshDict;
 }
diff --git a/tutorials/rhoPorousSimpleFoam/angledDuctImplicit/constant/polyMesh/blockMeshDict.m4 b/tutorials/rhoPorousSimpleFoam/angledDuctImplicit/constant/polyMesh/blockMeshDict.m4
index eb610e5209a34c94f645a7e8908a14ea0664cae8..c9b482f117dadfdcf2a2bd8c17ccfaf830c64d2f 100644
--- a/tutorials/rhoPorousSimpleFoam/angledDuctImplicit/constant/polyMesh/blockMeshDict.m4
+++ b/tutorials/rhoPorousSimpleFoam/angledDuctImplicit/constant/polyMesh/blockMeshDict.m4
@@ -8,7 +8,7 @@
 FoamFile
 {
     version     2.0;
-    format      ascii;
+    `format'      ascii;
     class       dictionary;
     object      blockMeshDict;
 }