From f847a7927ece06052f0ad38a2b0c0a6906d95731 Mon Sep 17 00:00:00 2001
From: mattijs <mattijs>
Date: Thu, 14 Jan 2010 12:13:01 +0000
Subject: [PATCH] builds again

---
 src/OpenFOAM/Make/files                       |   3 +
 src/OpenFOAM/containers/Lists/UList/UList.H   |  20 +-
 src/OpenFOAM/containers/Lists/UList/UListI.H  |  14 +
 .../processor/processorPointPatchField.C      | 122 +---
 .../processor/processorPointPatchField.H      |   4 +-
 .../processorCyclicPointPatchField.C          | 267 ++++++++
 .../processorCyclicPointPatchField.H          | 194 ++++++
 .../processorCyclicPointPatchFields.C         |  44 ++
 .../processorCyclicPointPatchFields.H         |  50 ++
 .../LUscalarMatrix/procLduInterface.H         |   2 +-
 .../matrices/LUscalarMatrix/procLduMatrix.C   |   2 +-
 .../lduAddressing/lduInterface/lduInterface.H |   2 +-
 .../lduInterface/processorLduInterface.C      |  12 +
 .../lduInterface/processorLduInterface.H      |  62 +-
 .../processorLduInterfaceTemplates.C          | 402 ++++++------
 .../cyclicLduInterfaceField.C                 |   2 +-
 .../processorLduInterfaceField.C              |  29 +-
 .../processorLduInterfaceField.H              |  22 +-
 .../lduMatrix/solvers/GAMG/GAMGSolver.H       |   2 +-
 .../GAMG/GAMGSolverAgglomerateMatrix.C        |   4 +-
 src/OpenFOAM/meshes/boundBox/boundBox.C       |  20 +
 src/OpenFOAM/meshes/boundBox/boundBox.H       |   2 +
 .../meshes/meshShapes/cell/oppositeCellFace.C |   2 +-
 .../constraint/cyclic/cyclicPointPatch.C      |   2 +-
 .../processor/processorPointPatch.H           |   4 +-
 .../processorCyclicPointPatch.C               | 399 ++++++++++++
 .../processorCyclicPointPatch.H               | 146 +++++
 .../polyMesh/globalMeshData/globalMeshData.C  |  16 +-
 src/OpenFOAM/meshes/polyMesh/polyMesh.C       |  17 -
 src/OpenFOAM/meshes/polyMesh/polyMesh.H       |   4 -
 .../basic/coupled/coupledPolyPatch.C          |  30 +-
 .../basic/coupled/coupledPolyPatch.H          |  28 +-
 .../constraint/cyclic/cyclicPolyPatch.C       |  23 +-
 .../constraint/cyclic/cyclicPolyPatch.H       |  16 +-
 .../constraint/processor/processorPolyPatch.C | 584 ++++++------------
 .../constraint/processor/processorPolyPatch.H | 247 ++------
 .../processorCyclicPolyPatch.C                | 227 +++++++
 .../processorCyclicPolyPatch.H                | 339 ++++++++++
 .../polyPatches/polyPatch/polyPatch.H         |   4 +-
 .../meshes/polyMesh/syncTools/syncTools.H     |   3 +
 .../polyMesh/syncTools/syncToolsTemplates.C   | 570 ++++++-----------
 .../parMetisDecomp/parMetisDecomp.C           |   2 +-
 .../attachDetach/attachInterface.C            |  23 +-
 .../attachDetach/detachInterface.C            |  24 +-
 src/dynamicMesh/boundaryMesh/boundaryMesh.C   |   2 +-
 src/dynamicMesh/boundaryPatch/boundaryPatch.H |   2 +-
 .../fvMeshAdder/fvMeshAdderTemplates.C        |  16 +-
 .../fvMeshDistribute/fvMeshDistribute.C       |  65 +-
 .../fvMeshDistribute/fvMeshDistribute.H       |   1 -
 .../fvMeshDistributeTemplates.C               |   2 +-
 .../layerAdditionRemoval/addCellLayer.C       | 151 ++---
 .../layerAdditionRemoval/removeCellLayer.C    |  54 +-
 .../layerAdditionRemoval/setLayerPairing.C    |   4 +-
 src/dynamicMesh/meshCut/cellCuts/cellCuts.H   |   6 +-
 .../meshCut/cellLooper/cellLooper.C           |   2 -
 .../meshCut/cellLooper/cellLooper.H           |   2 +-
 .../directions/directionInfo/directionInfo.C  |  10 +-
 .../directions/directionInfo/directionInfo.H  |   4 +-
 .../directions/directionInfo/directionInfoI.H |   2 +-
 .../meshCut/directions/directions.C           |   4 +-
 .../meshCut/directions/directions.H           |   2 +-
 .../meshCut/edgeVertex/edgeVertex.C           |   2 -
 .../meshCut/edgeVertex/edgeVertex.H           |   6 +-
 .../boundaryCutter/boundaryCutter.C           |  97 ++-
 .../boundaryCutter/boundaryCutter.H           |   2 +-
 .../meshCutAndRemove/meshCutAndRemove.C       | 100 ++-
 .../meshCutAndRemove/meshCutAndRemove.H       |  10 +-
 .../meshModifiers/meshCutter/meshCutter.C     |  50 +-
 .../meshModifiers/meshCutter/meshCutter.H     |   2 +-
 .../multiDirRefinement/multiDirRefinement.C   |   4 +-
 .../multiDirRefinement/multiDirRefinement.H   |   2 +-
 .../refinementIterator/refinementIterator.C   |   4 +-
 .../refinementIterator/refinementIterator.H   |   2 +-
 .../meshCut/refineCell/refineCell.C           |   5 -
 .../wallNormalInfo/wallNormalInfoI.H          |   4 +-
 .../motionSmoother/motionSmoother.C           |   6 +-
 .../motionSmoother/motionSmoother.H           |   2 +-
 .../motionSmoother/motionSmootherTemplates.C  |  11 +-
 .../polyMeshGeometry/polyMeshGeometry.C       |   2 +-
 src/dynamicMesh/motionSolver/motionSolver.C   |   2 +-
 src/dynamicMesh/motionSolver/motionSolver.H   |   2 +-
 .../perfectInterface/perfectInterface.C       |   2 +-
 .../polyMeshAdder/faceCoupleInfo.C            |   4 +-
 .../polyMeshAdder/faceCoupleInfo.H            |   4 +-
 .../polyTopoChange/addObject/polyAddFace.H    |  38 +-
 .../polyTopoChange/addPatchCellLayer.C        |  10 +-
 .../polyTopoChange/addPatchCellLayer.H        |   2 +-
 .../polyTopoChange/combineFaces.C             |  49 +-
 .../polyTopoChange/duplicatePoints.C          |  34 +-
 .../polyTopoChange/edgeCollapser.C            |  23 +-
 .../polyTopoChange/faceCollapser.C            |  17 +-
 .../polyTopoChange/polyTopoChange/hexRef8.C   | 148 ++---
 .../polyTopoChange/polyTopoChange/hexRef8.H   |   2 +-
 .../polyTopoChange/localPointRegion.C         |   1 -
 .../modifyObject/polyModifyFace.H             |  61 +-
 .../polyTopoChange/polyTopoChange.C           |  73 ++-
 .../polyTopoChange/polyTopoChange.H           |  14 +-
 .../polyTopoChange/polyTopoChangeTemplates.C  |   2 -
 .../polyTopoChange/refinementDataI.H          |   2 +-
 .../polyTopoChange/refinementDistanceDataI.H  |   2 +-
 .../polyTopoChange/refinementHistory.C        |   2 +-
 .../polyTopoChange/removeCells.C              |  11 +-
 .../polyTopoChange/removeFaces.C              |  42 +-
 .../polyTopoChange/removeFaces.H              |   5 +-
 .../polyTopoChange/removePoints.C             |  19 +-
 .../polyTopoChanger/polyTopoChanger.C         |  10 +-
 .../repatchPolyTopoChanger.C                  |  30 +-
 .../repatchPolyTopoChanger.H                  |   2 +-
 src/dynamicMesh/setUpdater/setUpdater.H       |   2 +-
 .../setUpdater/setUpdaterTemplates.C          |   2 +-
 .../slidingInterface/coupleSlidingInterface.C |  59 +-
 .../decoupleSlidingInterface.C                |  60 +-
 .../enrichedPatch/enrichedPatch.C             |   2 -
 .../enrichedPatch/enrichedPatchFaces.C        |   8 +-
 .../enrichedPatch/enrichedPatchMasterPoints.C |   2 -
 .../enrichedPatch/enrichedPatchPointMap.C     |   2 -
 .../enrichedPatch/enrichedPatchPointPoints.C  |   2 -
 .../slidingInterface/slidingInterface.C       |  16 +-
 .../slidingInterfaceAttachedAddressing.C      |  10 +-
 .../slidingInterfaceProjectPoints.C           |  16 +-
 .../compressible/compressibleCourantNo.H      |   2 +-
 .../cfdTools/general/MRF/MRFZone.C            |   1 +
 .../SRF/SRFModel/SRFModel/newSRFModel.C       |   2 -
 .../cfdTools/general/adjustPhi/adjustPhi.C    |   2 +-
 .../include/readGravitationalAcceleration.H   |   2 +-
 .../cfdTools/general/porousMedia/porousZone.H |   2 +-
 .../cfdTools/incompressible/CourantNo.H       |   2 +-
 .../basic/coupled/coupledFvPatchField.C       | 213 +++----
 .../basic/coupled/coupledFvPatchField.H       | 232 +++----
 .../basic/sliced/slicedFvPatchField.C         |   2 +-
 .../basic/transform/transformFvPatchField.C   |   2 +-
 .../constraint/cyclic/cyclicFvPatchField.C    | 388 ++++++------
 .../constraint/cyclic/cyclicFvPatchField.H    | 116 ++--
 .../jumpCyclic/jumpCyclicFvPatchField.H       |   2 +-
 .../processor/processorFvPatchField.C         | 333 +---------
 .../processor/processorFvPatchField.H         |  98 +--
 .../processorCyclic/processorFvPatchField.C   | 546 ++++++++++++++++
 .../processorCyclic/processorFvPatchField.H   | 323 ++++++++++
 .../processorCyclic/processorFvPatchFields.C  |  45 ++
 .../processorCyclic/processorFvPatchFields.H  |  50 ++
 .../processorFvPatchFieldsFwd.H               |  51 ++
 .../processorFvPatchScalarField.C}            |  93 ++-
 .../processorFvPatchScalarField.H}            |  86 +--
 .../constraint/wedge/wedgeFvPatchField.C      |   2 +-
 .../derived/fan/fanFvPatchField.H             |   2 +-
 .../derived/fan/fanFvPatchFields.C            |   2 +-
 .../freestreamPressureFvPatchScalarField.C    |   4 +-
 .../partialSlip/partialSlipFvPatchField.C     |   2 +-
 ...ureInletOutletVelocityFvPatchVectorField.C |   2 +-
 .../rotatingTotalPressureFvPatchScalarField.C |   2 +-
 .../supersonicFreestreamFvPatchVectorField.H  |   2 +-
 ...urfaceNormalFixedValueFvPatchVectorField.H |   2 +-
 .../syringePressureFvPatchScalarField.C       |  18 +-
 .../AverageIOFields.C                         |   2 -
 .../totalTemperatureFvPatchScalarField.C      |   2 +-
 .../totalTemperatureFvPatchScalarField.H      |   2 +-
 .../gaussConvectionSchemes.C                  |   2 -
 .../multivariateGaussConvectionSchemes.C      |   2 -
 .../EulerD2dt2Scheme/EulerD2dt2Schemes.C      |   2 -
 .../steadyStateD2dt2Schemes.C                 |   2 -
 .../CoEulerDdtScheme/CoEulerDdtSchemes.C      |   2 +-
 .../CrankNicholsonDdtSchemes.C                |   2 -
 .../EulerDdtScheme/EulerDdtSchemes.C          |   2 +-
 .../ddtSchemes/SLTSDdtScheme/SLTSDdtSchemes.C |   2 +-
 .../backwardDdtScheme/backwardDdtSchemes.C    |   2 +-
 .../steadyStateDdtSchemes.C                   |   2 -
 .../gaussDivScheme/gaussDivScheme.C           |   2 +-
 .../gaussDivScheme/gaussDivSchemes.C          |   2 +-
 src/finiteVolume/finiteVolume/fv/fv.C         |   2 -
 .../finiteVolume/fvc/fvcAverage.C             |   4 +-
 src/finiteVolume/finiteVolume/fvc/fvcCurl.C   |   7 +-
 src/finiteVolume/finiteVolume/fvc/fvcD2dt2.C  |   3 -
 src/finiteVolume/finiteVolume/fvc/fvcDDt.C    |   3 -
 src/finiteVolume/finiteVolume/fvc/fvcFlux.C   |   3 -
 .../finiteVolume/fvc/fvcMagSqrGradGrad.C      |   3 -
 .../extendedLeastSquaresGrads.C               |   2 +-
 .../extendedLeastSquaresVectors.C             |   8 +-
 .../gradSchemes/fourthGrad/fourthGrads.C      |   8 +-
 .../leastSquaresGrad/leastSquaresGrads.C      |   2 -
 .../cellLimitedGrad/cellLimitedGrad.H         |   2 +-
 .../cellMDLimitedGrad/cellMDLimitedGrad.H     |   2 +-
 .../limitedSnGrad/limitedSnGrad.C             |   2 +-
 .../quadraticFitSnGradData.C                  |  15 +-
 .../quadraticFitSnGrad/quadraticFitSnGrads.C  |   2 +-
 .../fvMatrices/fvMatrix/fvMatrix.C            |   2 +-
 .../fvMatrices/fvMatrix/fvMatrixSolve.C       |   2 +-
 .../fvMatrices/solvers/MULES/MULESTemplates.C |   8 +-
 .../fullStencils/CFCCellToCellStencil.C       |   6 +-
 .../fullStencils/cellToCellStencil.H          |   4 +-
 .../extendedUpwindCellToFaceStencil.C         |   2 +-
 .../fullStencils/CECCellToFaceStencil.H       |   9 -
 .../fullStencils/CFCCellToFaceStencil.H       |   8 -
 .../fullStencils/CPCCellToFaceStencil.H       |   9 -
 .../fullStencils/FECCellToFaceStencil.H       |   7 -
 .../fullStencils/CFCFaceToCellStencil.H       |   5 -
 .../fvMesh/fvBoundaryMesh/fvBoundaryMesh.C    |   2 +-
 src/finiteVolume/fvMesh/fvMesh.C              |   8 +-
 src/finiteVolume/fvMesh/fvMeshGeometry.C      |   4 +-
 .../fvMesh/fvMeshMapper/fvSurfaceMapper.C     |   2 +-
 .../fvMesh/fvMeshSubset/fvMeshSubset.C        |   2 +-
 .../fvMesh/fvMeshSubset/fvMeshSubset.H        |   4 +-
 .../fvMeshSubset/fvMeshSubsetInterpolate.C    |   6 +-
 .../constraint/processor/processorFvPatch.C   | 147 ++---
 .../constraint/processor/processorFvPatch.H   |  55 +-
 .../constraint/symmetry/symmetryFvPatch.C     |   2 -
 .../fvPatches/constraint/wedge/wedgeFvPatch.C |   2 -
 .../fvPatches/derived/wall/wallFvPatch.C      |   2 -
 .../fvMesh/fvPatches/fvPatch/fvPatch.H        |   2 +-
 .../singleCellFvMesh/singleCellFvMesh.C       |   4 +-
 src/lagrangian/basic/Particle/Particle.C      |  38 +-
 .../meshRefinement/meshRefinement.C           |   3 +-
 .../meshRefinement/meshRefinementBaffles.C    |  18 +-
 src/mesh/blockMesh/Make/files                 |  12 +-
 .../blockDescriptor/blockDescriptor.C         |   9 +-
 .../blockDescriptor/blockDescriptorEdges.C    |   4 +-
 src/mesh/blockMesh/blockMesh/blockMesh.H      |   8 +-
 .../blockMesh/blockMesh/blockMeshTopology.C   |  49 +-
 src/mesh/blockMesh/curvedEdges/BSpline.C      | 142 ++---
 src/mesh/blockMesh/curvedEdges/BSpline.H      |  56 +-
 .../blockMesh/curvedEdges/CatmullRomSpline.C  | 141 +++++
 ...{simpleSplineEdge.H => CatmullRomSpline.H} |  98 +--
 src/mesh/blockMesh/curvedEdges/arcEdge.C      |  15 +-
 src/mesh/blockMesh/curvedEdges/arcEdge.H      |  17 +-
 src/mesh/blockMesh/curvedEdges/curvedEdge.C   |  16 +-
 src/mesh/blockMesh/curvedEdges/curvedEdge.H   |  33 +-
 src/mesh/blockMesh/curvedEdges/curvedEdgeI.H  |   3 -
 src/mesh/blockMesh/curvedEdges/lineDivide.H   |   4 +-
 src/mesh/blockMesh/curvedEdges/lineEdge.C     |  18 +-
 src/mesh/blockMesh/curvedEdges/lineEdge.H     |  24 +-
 src/mesh/blockMesh/curvedEdges/polyLine.C     | 141 +++--
 src/mesh/blockMesh/curvedEdges/polyLine.H     |  46 +-
 src/mesh/blockMesh/curvedEdges/polyLineEdge.C |  14 +-
 src/mesh/blockMesh/curvedEdges/polyLineEdge.H |  14 +-
 .../blockMesh/curvedEdges/polySplineEdge.C    | 150 -----
 .../{simpleSplineEdge.C => splineEdge.C}      |  62 +-
 .../{polySplineEdge.H => splineEdge.H}        |  62 +-
 .../polyMeshZipUpCells/polyMeshZipUpCells.C   |  43 +-
 .../sampledSurface/isoSurface/isoSurface.C    |  78 +--
 238 files changed, 5468 insertions(+), 4308 deletions(-)
 create mode 100644 src/OpenFOAM/fields/pointPatchFields/constraint/processorCyclic/processorCyclicPointPatchField.C
 create mode 100644 src/OpenFOAM/fields/pointPatchFields/constraint/processorCyclic/processorCyclicPointPatchField.H
 create mode 100644 src/OpenFOAM/fields/pointPatchFields/constraint/processorCyclic/processorCyclicPointPatchFields.C
 create mode 100644 src/OpenFOAM/fields/pointPatchFields/constraint/processorCyclic/processorCyclicPointPatchFields.H
 create mode 100644 src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/processorCyclic/processorCyclicPointPatch.C
 create mode 100644 src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/processorCyclic/processorCyclicPointPatch.H
 create mode 100644 src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/processorCyclic/processorCyclicPolyPatch.C
 create mode 100644 src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/processorCyclic/processorCyclicPolyPatch.H
 create mode 100644 src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchField.C
 create mode 100644 src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchField.H
 create mode 100644 src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchFields.C
 create mode 100644 src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchFields.H
 create mode 100644 src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchFieldsFwd.H
 rename src/{mesh/blockMesh/curvedEdges/spline.C => finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchScalarField.C} (54%)
 rename src/{mesh/blockMesh/curvedEdges/spline.H => finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchScalarField.H} (52%)
 create mode 100644 src/mesh/blockMesh/curvedEdges/CatmullRomSpline.C
 rename src/mesh/blockMesh/curvedEdges/{simpleSplineEdge.H => CatmullRomSpline.H} (50%)
 delete mode 100644 src/mesh/blockMesh/curvedEdges/polySplineEdge.C
 rename src/mesh/blockMesh/curvedEdges/{simpleSplineEdge.C => splineEdge.C} (62%)
 rename src/mesh/blockMesh/curvedEdges/{polySplineEdge.H => splineEdge.H} (64%)

diff --git a/src/OpenFOAM/Make/files b/src/OpenFOAM/Make/files
index fcb43aeef4e..640df13e7e9 100644
--- a/src/OpenFOAM/Make/files
+++ b/src/OpenFOAM/Make/files
@@ -335,6 +335,7 @@ $(constraintPolyPatches)/empty/emptyPolyPatch.C
 $(constraintPolyPatches)/symmetry/symmetryPolyPatch.C
 $(constraintPolyPatches)/wedge/wedgePolyPatch.C
 $(constraintPolyPatches)/cyclic/cyclicPolyPatch.C
+$(constraintPolyPatches)/processorCyclic/processorCyclicPolyPatch.C
 $(constraintPolyPatches)/processor/processorPolyPatch.C
 
 derivedPolyPatches = $(polyPatches)/derived
@@ -446,6 +447,7 @@ $(constraintPointPatches)/symmetry/symmetryPointPatch.C
 $(constraintPointPatches)/wedge/wedgePointPatch.C
 $(constraintPointPatches)/cyclic/cyclicPointPatch.C
 $(constraintPointPatches)/processor/processorPointPatch.C
+$(constraintPointPatches)/processorCyclic/processorCyclicPointPatch.C
 
 derivedPointPatches = $(pointPatches)/derived
 $(derivedPointPatches)/coupled/coupledFacePointPatch.C
@@ -501,6 +503,7 @@ $(constraintPointPatchFields)/symmetry/symmetryPointPatchFields.C
 $(constraintPointPatchFields)/wedge/wedgePointPatchFields.C
 $(constraintPointPatchFields)/cyclic/cyclicPointPatchFields.C
 $(constraintPointPatchFields)/processor/processorPointPatchFields.C
+$(constraintPointPatchFields)/processorCyclic/processorCyclicPointPatchFields.C
 
 derivedPointPatchFields = $(pointPatchFields)/derived
 $(derivedPointPatchFields)/slip/slipPointPatchFields.C
diff --git a/src/OpenFOAM/containers/Lists/UList/UList.H b/src/OpenFOAM/containers/Lists/UList/UList.H
index b829c99ea5f..b9332d04c2e 100644
--- a/src/OpenFOAM/containers/Lists/UList/UList.H
+++ b/src/OpenFOAM/containers/Lists/UList/UList.H
@@ -132,7 +132,7 @@ public:
             inline label fcIndex(const label i) const;
 
             //- Return the reverse circular index, i.e. the previous index
-            //  which returns to the last at the begining of the list
+            //  which returns to the last at the beginning of the list
             inline label rcIndex(const label i) const;
 
             //- Return the binary size in number of characters of the UList
@@ -151,6 +151,18 @@ public:
             //  This can be used (with caution) when interfacing with C code.
             inline T* data();
 
+            //- Return the first element of the list.
+            inline T& first();
+
+            //- Return first element of the list.
+            inline const T& first() const;
+
+            //- Return the last element of the list.
+            inline T& last();
+
+            //- Return the last element of the list.
+            inline const T& last() const;
+
 
         // Check
 
@@ -184,12 +196,6 @@ public:
         //  an out-of-range element returns false without any ill-effects
         inline const T& operator[](const label) const;
 
-        //- Return last element of UList.
-        inline T& last();
-
-        //- Return last element of UList.
-        inline const T& last() const;
-
         //- Allow cast to a const List<T>&
         inline operator const Foam::List<T>&() const;
 
diff --git a/src/OpenFOAM/containers/Lists/UList/UListI.H b/src/OpenFOAM/containers/Lists/UList/UListI.H
index aa7d396f105..fb68f29ee86 100644
--- a/src/OpenFOAM/containers/Lists/UList/UListI.H
+++ b/src/OpenFOAM/containers/Lists/UList/UListI.H
@@ -114,6 +114,20 @@ inline void Foam::UList<T>::checkIndex(const label i) const
 }
 
 
+template<class T>
+inline T& Foam::UList<T>::first()
+{
+    return this->operator[](0);
+}
+
+
+template<class T>
+inline const T& Foam::UList<T>::first() const
+{
+    return this->operator[](0);
+}
+
+
 template<class T>
 inline T& Foam::UList<T>::last()
 {
diff --git a/src/OpenFOAM/fields/pointPatchFields/constraint/processor/processorPointPatchField.C b/src/OpenFOAM/fields/pointPatchFields/constraint/processor/processorPointPatchField.C
index b1e96234907..4a822d9de09 100644
--- a/src/OpenFOAM/fields/pointPatchFields/constraint/processor/processorPointPatchField.C
+++ b/src/OpenFOAM/fields/pointPatchFields/constraint/processor/processorPointPatchField.C
@@ -25,7 +25,7 @@ License
 \*---------------------------------------------------------------------------*/
 
 #include "processorPointPatchField.H"
-#include "transformField.H"
+//#include "transformField.H"
 #include "processorPolyPatch.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -131,125 +131,7 @@ void processorPointPatchField<Type>::swapAdd(Field<Type>& pField) const
 
         if (doTransform())
         {
-            const processorPolyPatch& ppp = procPatch_.procPolyPatch();
-            const labelList& nonGlobalPatchPoints =
-                procPatch_.nonGlobalPatchPoints();
-
-            // Mark patch that transformed point:
-            // -3  : global patch point so handled in different patch
-            // -2  : nonGlobalPatchPoints, initial value
-            // -1  : originating from internal face, no transform necessary
-            // >=0 : originating from coupled patch
-            labelList hasTransformed(ppp.nPoints(), -3);
-            forAll(nonGlobalPatchPoints, i)
-            {
-                hasTransformed[nonGlobalPatchPoints[i]] = -2;
-            }
-
-            forAll(ppp.patchIDs(), subI)
-            {
-                label patchI = ppp.patchIDs()[subI];
-
-                if (patchI == -1)
-                {
-                    for
-                    (
-                        label faceI = ppp.starts()[subI];
-                        faceI < ppp.starts()[subI+1];
-                        faceI++
-                    )
-                    {
-                        const face& f = ppp.localFaces()[faceI];
-
-                        forAll(f, fp)
-                        {
-                            label pointI = f[fp];
-
-                            if (hasTransformed[pointI] == -3)
-                            {
-                                // special point, handled elsewhere
-                            }
-                            else if (hasTransformed[pointI] == -2)
-                            {
-                                // first visit. Just mark.
-                                hasTransformed[pointI] = patchI;
-                            }
-                            else if (hasTransformed[pointI] == patchI)
-                            {
-                                // already done
-                            }
-                            else
-                            {
-                                FatalErrorIn
-                                (
-                                    "processorPointPatchField<Type>::"
-                                    "swapAdd(Field<Type>& pField) const"
-                                )   << "Point " << pointI
-                                    << " on patch " << ppp.name()
-                                    << " already transformed by patch "
-                                    << hasTransformed[pointI]
-                                    << abort(FatalError);
-                            }
-                        }
-                    }
-                }
-                else if 
-                (
-                   !refCast<const coupledPolyPatch>
-                    (
-                        ppp.boundaryMesh()[patchI]
-                    ).parallel()
-                )
-                {
-                    const tensor& T = refCast<const coupledPolyPatch>
-                    (
-                        ppp.boundaryMesh()[patchI]
-                    ).forwardT();
-
-                    for
-                    (
-                        label faceI = ppp.starts()[subI];
-                        faceI < ppp.starts()[subI+1];
-                        faceI++
-                    )
-                    {
-                        const face& f = ppp.localFaces()[faceI];
-
-                        forAll(f, fp)
-                        {
-                            label pointI = f[fp];
-
-                            if (hasTransformed[pointI] == -3)
-                            {
-                                // special point, handled elsewhere
-                            }
-                            else if (hasTransformed[pointI] == -2)
-                            {
-                                pnf[pointI] = transform(T, pnf[pointI]);
-
-                                hasTransformed[pointI] = patchI;
-                            }
-                            else if (hasTransformed[pointI] == patchI)
-                            {
-                                // already done
-                            }
-                            else
-                            {
-                                FatalErrorIn
-                                (
-                                    "processorPointPatchField<Type>::"
-                                    "swapAdd(Field<Type>& pField) const"
-                                )   << "Point " << pointI
-                                    << " on patch " << ppp.name()
-                                    << " subPatch " << patchI
-                                    << " already transformed by patch "
-                                    << hasTransformed[pointI]
-                                    << abort(FatalError);
-                            }
-                        }
-                    }
-                }
-            }
+            procPatch_.procPolyPatch().transform(pnf);
         }
 
         addToInternalField(pField, pnf);
diff --git a/src/OpenFOAM/fields/pointPatchFields/constraint/processor/processorPointPatchField.H b/src/OpenFOAM/fields/pointPatchFields/constraint/processor/processorPointPatchField.H
index 750f5a9fb32..c59e585ed5e 100644
--- a/src/OpenFOAM/fields/pointPatchFields/constraint/processor/processorPointPatchField.H
+++ b/src/OpenFOAM/fields/pointPatchFields/constraint/processor/processorPointPatchField.H
@@ -149,13 +149,13 @@ public:
                 }
             }
 
-            //- Does the patch field perform the transfromation
+            //- Does the patch field perform the transformation
             virtual bool doTransform() const
             {
                 return
                    !(
                         pTraits<Type>::rank == 0
-                     || procPatch_.procPolyPatch().parallel()
+                     || procPatch_.procPolyPatch().doTransform()
                     );
             }
 
diff --git a/src/OpenFOAM/fields/pointPatchFields/constraint/processorCyclic/processorCyclicPointPatchField.C b/src/OpenFOAM/fields/pointPatchFields/constraint/processorCyclic/processorCyclicPointPatchField.C
new file mode 100644
index 00000000000..67839a23ccf
--- /dev/null
+++ b/src/OpenFOAM/fields/pointPatchFields/constraint/processorCyclic/processorCyclicPointPatchField.C
@@ -0,0 +1,267 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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 "processorCyclicPointPatchField.H"
+#include "transformField.H"
+#include "processorPolyPatch.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+template<class Type>
+processorCyclicPointPatchField<Type>::processorCyclicPointPatchField
+(
+    const pointPatch& p,
+    const DimensionedField<Type, pointMesh>& iF
+)
+:
+    coupledPointPatchField<Type>(p, iF),
+    procPatch_(refCast<const processorCyclicPointPatch>(p))
+{}
+
+
+template<class Type>
+processorCyclicPointPatchField<Type>::processorCyclicPointPatchField
+(
+    const pointPatch& p,
+    const DimensionedField<Type, pointMesh>& iF,
+    const dictionary& dict
+)
+:
+    coupledPointPatchField<Type>(p, iF, dict),
+    procPatch_(refCast<const processorCyclicPointPatch>(p))
+{}
+
+
+template<class Type>
+processorCyclicPointPatchField<Type>::processorCyclicPointPatchField
+(
+    const processorCyclicPointPatchField<Type>& ptf,
+    const pointPatch& p,
+    const DimensionedField<Type, pointMesh>& iF,
+    const pointPatchFieldMapper& mapper
+)
+:
+    coupledPointPatchField<Type>(ptf, p, iF, mapper),
+    procPatch_(refCast<const processorCyclicPointPatch>(ptf.patch()))
+{}
+
+
+template<class Type>
+processorCyclicPointPatchField<Type>::processorCyclicPointPatchField
+(
+    const processorCyclicPointPatchField<Type>& ptf,
+    const DimensionedField<Type, pointMesh>& iF
+)
+:
+    coupledPointPatchField<Type>(ptf, iF),
+    procPatch_(refCast<const processorCyclicPointPatch>(ptf.patch()))
+{}
+
+
+// * * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * //
+
+template<class Type>
+processorCyclicPointPatchField<Type>::~processorCyclicPointPatchField()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class Type>
+void processorCyclicPointPatchField<Type>::initSwapAdd(Field<Type>& pField)
+const
+{
+    if (Pstream::parRun())
+    {
+        // Get internal field into my point order
+        Field<Type> pf(this->patchInternalField(pField));
+
+        OPstream::write
+        (
+            Pstream::blocking,
+            procPatch_.neighbProcNo(),
+            reinterpret_cast<const char*>(pf.begin()),
+            pf.byteSize()
+        );
+    }
+}
+
+
+template<class Type>
+void processorCyclicPointPatchField<Type>::swapAdd(Field<Type>& pField) const
+{
+    if (Pstream::parRun())
+    {
+        Field<Type> pnf(this->size());
+
+        IPstream::read
+        (
+            Pstream::blocking,
+            procPatch_.neighbProcNo(),
+            reinterpret_cast<char*>(pnf.begin()),
+            pnf.byteSize()
+        );
+
+        if (doTransform())
+        {
+            procPatch_.procPolyPatch().transform(pnf);
+
+            //const processorPolyPatch& ppp = procPatch_.procPolyPatch();
+            //const labelList& nonGlobalPatchPoints =
+            //    procPatch_.nonGlobalPatchPoints();
+            //
+            //// Mark patch that transformed point:
+            //// -3  : global patch point so handled in different patch
+            //// -2  : nonGlobalPatchPoints, initial value
+            //// -1  : originating from internal face, no transform necessary
+            //// >=0 : originating from coupled patch
+            //labelList hasTransformed(ppp.nPoints(), -3);
+            //forAll(nonGlobalPatchPoints, i)
+            //{
+            //    hasTransformed[nonGlobalPatchPoints[i]] = -2;
+            //}
+            //
+            //forAll(ppp.patchIDs(), subI)
+            //{
+            //    label patchI = ppp.patchIDs()[subI];
+            //
+            //    if (patchI == -1)
+            //    {
+            //        for
+            //        (
+            //            label faceI = ppp.starts()[subI];
+            //            faceI < ppp.starts()[subI+1];
+            //            faceI++
+            //        )
+            //        {
+            //            const face& f = ppp.localFaces()[faceI];
+            //
+            //            forAll(f, fp)
+            //            {
+            //                label pointI = f[fp];
+            //
+            //                if (hasTransformed[pointI] == -3)
+            //                {
+            //                    // special point, handled elsewhere
+            //                }
+            //                else if (hasTransformed[pointI] == -2)
+            //                {
+            //                    // first visit. Just mark.
+            //                    hasTransformed[pointI] = patchI;
+            //                }
+            //                else if (hasTransformed[pointI] == patchI)
+            //                {
+            //                    // already done
+            //                }
+            //                else
+            //                {
+            //                    FatalErrorIn
+            //                    (
+            //                        "processorCyclicPointPatchField<Type>::"
+            //                        "swapAdd(Field<Type>& pField) const"
+            //                    )   << "Point " << pointI
+            //                        << " on patch " << ppp.name()
+            //                        << " already transformed by patch "
+            //                        << hasTransformed[pointI]
+            //                        << abort(FatalError);
+            //                }
+            //            }
+            //        }
+            //    }
+            //    else if 
+            //    (
+            //       !refCast<const coupledPolyPatch>
+            //        (
+            //            ppp.boundaryMesh()[patchI]
+            //        ).parallel()
+            //    )
+            //    {
+            //        const tensor& T = refCast<const coupledPolyPatch>
+            //        (
+            //            ppp.boundaryMesh()[patchI]
+            //        ).forwardT();
+            //
+            //        for
+            //        (
+            //            label faceI = ppp.starts()[subI];
+            //            faceI < ppp.starts()[subI+1];
+            //            faceI++
+            //        )
+            //        {
+            //            const face& f = ppp.localFaces()[faceI];
+            //
+            //            forAll(f, fp)
+            //            {
+            //                label pointI = f[fp];
+            //
+            //                if (hasTransformed[pointI] == -3)
+            //                {
+            //                    // special point, handled elsewhere
+            //                }
+            //                else if (hasTransformed[pointI] == -2)
+            //                {
+            //                    pnf[pointI] = transform(T, pnf[pointI]);
+            //
+            //                    hasTransformed[pointI] = patchI;
+            //                }
+            //                else if (hasTransformed[pointI] == patchI)
+            //                {
+            //                    // already done
+            //                }
+            //                else
+            //                {
+            //                    FatalErrorIn
+            //                    (
+            //                        "processorCyclicPointPatchField<Type>::"
+            //                        "swapAdd(Field<Type>& pField) const"
+            //                    )   << "Point " << pointI
+            //                        << " on patch " << ppp.name()
+            //                        << " subPatch " << patchI
+            //                        << " already transformed by patch "
+            //                        << hasTransformed[pointI]
+            //                        << abort(FatalError);
+            //                }
+            //            }
+            //        }
+            //    }
+            //}
+        }
+
+        addToInternalField(pField, pnf);
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/fields/pointPatchFields/constraint/processorCyclic/processorCyclicPointPatchField.H b/src/OpenFOAM/fields/pointPatchFields/constraint/processorCyclic/processorCyclicPointPatchField.H
new file mode 100644
index 00000000000..d0ece8d33ac
--- /dev/null
+++ b/src/OpenFOAM/fields/pointPatchFields/constraint/processorCyclic/processorCyclicPointPatchField.H
@@ -0,0 +1,194 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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::processorCyclicPointPatchField
+
+Description
+    Foam::processorCyclicPointPatchField
+
+SourceFiles
+    processorCyclicPointPatchField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef processorCyclicPointPatchField_H
+#define processorCyclicPointPatchField_H
+
+#include "coupledPointPatchField.H"
+#include "processorCyclicPointPatch.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                 Class processorCyclicPointPatchField Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class Type>
+class processorCyclicPointPatchField
+:
+    public coupledPointPatchField<Type>
+{
+    // Private data
+
+        //- Local reference to processor patch
+        const processorCyclicPointPatch& procPatch_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName(processorCyclicPointPatch::typeName_());
+
+
+    // Constructors
+
+        //- Construct from patch and internal field
+        processorCyclicPointPatchField
+        (
+            const pointPatch&,
+            const DimensionedField<Type, pointMesh>&
+        );
+
+        //- Construct from patch, internal field and dictionary
+        processorCyclicPointPatchField
+        (
+            const pointPatch&,
+            const DimensionedField<Type, pointMesh>&,
+            const dictionary&
+        );
+
+        //- Construct by mapping given patchField<Type> onto a new patch
+        processorCyclicPointPatchField
+        (
+            const processorCyclicPointPatchField<Type>&,
+            const pointPatch&,
+            const DimensionedField<Type, pointMesh>&,
+            const pointPatchFieldMapper&
+        );
+
+        //- Construct and return a clone
+        virtual autoPtr<pointPatchField<Type> > clone() const
+        {
+            return autoPtr<pointPatchField<Type> >
+            (
+                new processorCyclicPointPatchField<Type>
+                (
+                    *this
+                )
+            );
+        }
+
+        //- Construct as copy setting internal field reference
+        processorCyclicPointPatchField
+        (
+            const processorCyclicPointPatchField<Type>&,
+            const DimensionedField<Type, pointMesh>&
+        );
+
+        //- Construct and return a clone setting internal field reference
+        virtual autoPtr<pointPatchField<Type> > clone
+        (
+            const DimensionedField<Type, pointMesh>& iF
+        ) const
+        {
+            return autoPtr<pointPatchField<Type> >
+            (
+                new processorCyclicPointPatchField<Type>
+                (
+                    *this,
+                    iF
+                )
+            );
+        }
+
+
+    // Destructor
+
+        ~processorCyclicPointPatchField();
+
+
+    // Member functions
+
+        // Access
+
+            //- Return true if running parallel
+            virtual bool coupled() const
+            {
+                if (Pstream::parRun())
+                {
+                    return true;
+                }
+                else
+                {
+                    return false;
+                }
+            }
+
+            //- Does the patch field perform the transfromation
+            virtual bool doTransform() const
+            {
+                return
+                   !(
+                        pTraits<Type>::rank == 0
+                     || procPatch_.procPolyPatch().parallel()
+                    );
+            }
+
+
+        // Evaluation functions
+
+            //- Evaluate the patch field
+            virtual void evaluate
+            (
+                const Pstream::commsTypes commsType=Pstream::blocking
+            )
+            {}
+
+            //- Initialise swap of patch point values
+            virtual void initSwapAdd(Field<Type>&) const;
+
+            //- Complete swap of patch point values and add to local values
+            virtual void swapAdd(Field<Type>&) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#    include "processorCyclicPointPatchField.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/fields/pointPatchFields/constraint/processorCyclic/processorCyclicPointPatchFields.C b/src/OpenFOAM/fields/pointPatchFields/constraint/processorCyclic/processorCyclicPointPatchFields.C
new file mode 100644
index 00000000000..5708849d87d
--- /dev/null
+++ b/src/OpenFOAM/fields/pointPatchFields/constraint/processorCyclic/processorCyclicPointPatchFields.C
@@ -0,0 +1,44 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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 "processorCyclicPointPatchFields.H"
+#include "pointPatchFields.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+makePointPatchFields(processorCyclic);
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/fields/pointPatchFields/constraint/processorCyclic/processorCyclicPointPatchFields.H b/src/OpenFOAM/fields/pointPatchFields/constraint/processorCyclic/processorCyclicPointPatchFields.H
new file mode 100644
index 00000000000..697cf9adff9
--- /dev/null
+++ b/src/OpenFOAM/fields/pointPatchFields/constraint/processorCyclic/processorCyclicPointPatchFields.H
@@ -0,0 +1,50 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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 processorCyclicPointPatchFields_H
+#define processorCyclicPointPatchFields_H
+
+#include "processorCyclicPointPatchField.H"
+#include "fieldTypes.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+makePointPatchFieldTypedefs(processorCyclic);
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/matrices/LUscalarMatrix/procLduInterface.H b/src/OpenFOAM/matrices/LUscalarMatrix/procLduInterface.H
index 8be581fb524..97013c52de6 100644
--- a/src/OpenFOAM/matrices/LUscalarMatrix/procLduInterface.H
+++ b/src/OpenFOAM/matrices/LUscalarMatrix/procLduInterface.H
@@ -91,7 +91,7 @@ public:
         {
             return autoPtr<procLduInterface>(new procLduInterface(is));
         }
-            
+
 
     // Ostream operator
 
diff --git a/src/OpenFOAM/matrices/LUscalarMatrix/procLduMatrix.C b/src/OpenFOAM/matrices/LUscalarMatrix/procLduMatrix.C
index 4f76c4bfcd4..097d41fd899 100644
--- a/src/OpenFOAM/matrices/LUscalarMatrix/procLduMatrix.C
+++ b/src/OpenFOAM/matrices/LUscalarMatrix/procLduMatrix.C
@@ -97,7 +97,7 @@ Foam::Ostream& Foam::operator<<(Ostream& os, const procLduMatrix& cldum)
         << cldum.upper_
         << cldum.lower_
         << cldum.interfaces_;
-    
+
     return os;
 }
 
diff --git a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/lduInterface.H b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/lduInterface.H
index 4d07f283346..a7075d47e5e 100644
--- a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/lduInterface.H
+++ b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/lduInterface.H
@@ -28,7 +28,7 @@ Class
 Description
     An abstract base class for implicitly-coupled interfaces
     e.g. processor and cyclic patches.
-    
+
 SourceFiles
     lduInterface.C
 
diff --git a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/processorLduInterface.C b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/processorLduInterface.C
index c6310aaf07b..46373627acf 100644
--- a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/processorLduInterface.C
+++ b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/processorLduInterface.C
@@ -36,6 +36,18 @@ namespace Foam
 
 // * * * * * * * * * * * * * Private Member Functions *  * * * * * * * * * * //
 
+void Foam::processorLduInterface::resizeBuf
+(
+    List<char>& buf,
+    const label size
+) const
+{
+    if (buf.size() < size)
+    {
+        buf.setSize(size);
+    }
+}
+
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
diff --git a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/processorLduInterface.H b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/processorLduInterface.H
index de54787e025..ed40c9ccd8e 100644
--- a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/processorLduInterface.H
+++ b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/processorLduInterface.H
@@ -61,6 +61,9 @@ class processorLduInterface
         //  Only sized and used when compressed or non-blocking comms used.
         mutable List<char> receiveBuf_;
 
+        //- Resize the buffer if required
+        void resizeBuf(List<char>& buf, const label size) const;
+
 
 public:
 
@@ -89,17 +92,20 @@ public:
             //- Return neigbour processor number
             virtual int neighbProcNo() const = 0;
 
-            //- Set send buffer to sufficient size to hold List<Type>(nElems).
-            //  Returns reference to buffer (note:buffer.size() is number
-            //  of characters, not nElems)
-            template<class Type>
-            List<Type>& setSendBuf(const label nElems) const;
+            //- Return face transformation tensor
+            virtual const tensor& forwardT() const = 0;
 
-            //- Set receive buffer to sufficient size to hold List<Type>(nElems)
-            //  Returns reference to buffer (note:buffer.size() is number
-            //  of characters, not nElems)
-            template<class Type>
-            List<Type>& setReceiveBuf(const label nElems) const;
+//             //- Set send buffer to sufficient size to hold List<Type>(nElems).
+//             //  Returns reference to buffer (note:buffer.size() is number
+//             //  of characters, not nElems)
+//             template<class Type>
+//             List<Type>& setSendBuf(const label nElems) const;
+// 
+//             //- Set receive buffer to sufficient size to hold List<Type>(nElems)
+//             //  Returns reference to buffer (note:buffer.size() is number
+//             //  of characters, not nElems)
+//             template<class Type>
+//             List<Type>& setReceiveBuf(const label nElems) const;
 
 
         // Transfer functions
@@ -154,24 +160,24 @@ public:
             ) const;
 
 
-            //- Raw field send function of internal send buffer with data
-            //  compression.
-            template<class Type>
-            void compressedBufferSend
-            (
-                const Pstream::commsTypes commsType
-            ) const;
-
-            //- Raw field receive function of internal receive buffer with data
-            //  compression.
-            //  Returns reference to buffer (note:buffer.size() is number
-            //  of characters, not size)
-            template<class Type>
-            const List<Type>& compressedBufferReceive
-            (
-                const Pstream::commsTypes commsType,
-                const label size
-            ) const;
+//             //- Raw field send function of internal send buffer with data
+//             //  compression.
+//             template<class Type>
+//             void compressedBufferSend
+//             (
+//                 const Pstream::commsTypes commsType
+//             ) const;
+// 
+//             //- Raw field receive function of internal receive buffer with data
+//             //  compression.
+//             //  Returns reference to buffer (note:buffer.size() is number
+//             //  of characters, not size)
+//             template<class Type>
+//             const List<Type>& compressedBufferReceive
+//             (
+//                 const Pstream::commsTypes commsType,
+//                 const label size
+//             ) const;
 };
 
 
diff --git a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/processorLduInterfaceTemplates.C b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/processorLduInterfaceTemplates.C
index b114d6d0149..98ca57342c4 100644
--- a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/processorLduInterfaceTemplates.C
+++ b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterface/processorLduInterfaceTemplates.C
@@ -30,47 +30,47 @@ License
 
 // * * * * * * * * * * * * * * * Member Functions * * *  * * * * * * * * * * //
 
-template<class Type>
-Foam::List<Type>& Foam::processorLduInterface::setSendBuf(const label nElems)
-const
-{
-    if (!contiguous<Type>())
-    {
-        FatalErrorIn("processorLduInterface::setSendBuf(const label) const")
-            << "Cannot return the binary size of a list of "
-               "non-primitive elements"
-            << abort(FatalError);
-    }
-
-    label nBytes = nElems*sizeof(Type);
-    sendBuf_.setSize(nBytes);
-
-    return reinterpret_cast<List<Type>&>(sendBuf_);
-}
-
-
-template<class Type>
-Foam::List<Type>& Foam::processorLduInterface::setReceiveBuf
-(
-    const label nElems
-) const
-{
-    if (!contiguous<Type>())
-    {
-        FatalErrorIn("processorLduInterface::setReceiveBuf(const label) const")
-            << "Cannot return the binary size of a list of "
-               "non-primitive elements"
-            << abort(FatalError);
-    }
-
-    label nBytes = nElems*sizeof(Type);
-
-    //receiveBuf_.setSize(nBytes, '\0');    // necessary because of expanding
-                                            // compression?
-    receiveBuf_.setSize(nBytes);
-
-    return reinterpret_cast<List<Type>&>(receiveBuf_);
-}
+// template<class Type>
+// Foam::List<Type>& Foam::processorLduInterface::setSendBuf(const label nElems)
+// const
+// {
+//     if (!contiguous<Type>())
+//     {
+//         FatalErrorIn("processorLduInterface::setSendBuf(const label) const")
+//             << "Cannot return the binary size of a list of "
+//                "non-primitive elements"
+//             << abort(FatalError);
+//     }
+// 
+//     label nBytes = nElems*sizeof(Type);
+//     sendBuf_.setSize(nBytes);
+// 
+//     return reinterpret_cast<List<Type>&>(sendBuf_);
+// }
+// 
+// 
+// template<class Type>
+// Foam::List<Type>& Foam::processorLduInterface::setReceiveBuf
+// (
+//     const label nElems
+// ) const
+// {
+//     if (!contiguous<Type>())
+//     {
+//         FatalErrorIn("processorLduInterface::setReceiveBuf(const label) const")
+//             << "Cannot return the binary size of a list of "
+//                "non-primitive elements"
+//             << abort(FatalError);
+//     }
+// 
+//     label nBytes = nElems*sizeof(Type);
+// 
+//     //receiveBuf_.setSize(nBytes, '\0');    // necessary because of expanding
+//                                             // compression?
+//     receiveBuf_.setSize(nBytes);
+// 
+//     return reinterpret_cast<List<Type>&>(receiveBuf_);
+// }
 
 
 template<class Type>
@@ -92,17 +92,19 @@ void Foam::processorLduInterface::send
     }
     else if (commsType == Pstream::nonBlocking)
     {
-        setReceiveBuf<Type>(f.size());
+        //setReceiveBuf<Type>(f.size());
+        resizeBuf(receiveBuf_, f.size()*sizeof(Type));
 
         IPstream::read
         (
             commsType,
             neighbProcNo(),
             receiveBuf_.begin(),
-            f.byteSize()
+            receiveBuf_.size()
         );
 
-        setSendBuf<Type>(f.size());
+        //setSendBuf<Type>(f.size());
+        resizeBuf(sendBuf_, f.byteSize());
         memcpy(sendBuf_.begin(), f.begin(), f.byteSize());
 
         OPstream::write
@@ -182,7 +184,8 @@ void Foam::processorLduInterface::compressedSend
 
         const scalar *sArray = reinterpret_cast<const scalar*>(f.begin());
         const scalar *slast = &sArray[nm1];
-        setSendBuf<float>(nFloats);
+        //setSendBuf<float>(nFloats);
+        resizeBuf(sendBuf_, nBytes);
         float *fArray = reinterpret_cast<float*>(sendBuf_.begin());
 
         for (register label i=0; i<nm1; i++)
@@ -204,7 +207,8 @@ void Foam::processorLduInterface::compressedSend
         }
         else if (commsType == Pstream::nonBlocking)
         {
-            setReceiveBuf<float>(nFloats);
+            //setReceiveBuf<float>(nFloats);
+            resizeBuf(receiveBuf_, nBytes);
 
             IPstream::read
             (
@@ -235,7 +239,6 @@ void Foam::processorLduInterface::compressedSend
     }
 }
 
-
 template<class Type>
 void Foam::processorLduInterface::compressedReceive
 (
@@ -249,17 +252,19 @@ void Foam::processorLduInterface::compressedReceive
         label nm1 = (f.size() - 1)*nCmpts;
         label nlast = sizeof(Type)/sizeof(float);
         label nFloats = nm1 + nlast;
+        label nBytes = nFloats*sizeof(float);
 
         if (commsType == Pstream::blocking || commsType == Pstream::scheduled)
         {
-            setReceiveBuf<float>(nFloats);
+            //setReceiveBuf<float>(nFloats);
+            resizeBuf(receiveBuf_, nBytes);
 
             IPstream::read
             (
                 commsType,
                 neighbProcNo(),
                 receiveBuf_.begin(),
-                receiveBuf_.size()
+                nBytes
             );
         }
         else if (commsType != Pstream::nonBlocking)
@@ -286,7 +291,6 @@ void Foam::processorLduInterface::compressedReceive
     }
 }
 
-
 template<class Type>
 Foam::tmp<Foam::Field<Type> > Foam::processorLduInterface::compressedReceive
 (
@@ -300,155 +304,155 @@ Foam::tmp<Foam::Field<Type> > Foam::processorLduInterface::compressedReceive
 }
 
 
-template<class Type>
-void Foam::processorLduInterface::compressedBufferSend
-(
-    const Pstream::commsTypes commsType
-) const
-{
-    // Optionally inline compress sendBuf
-    if
-    (
-        sizeof(scalar) > sizeof(float)
-     && sendBuf_.size()
-     && Pstream::floatTransfer
-    )
-    {
-        const List<Type>& f = reinterpret_cast<const List<Type>&>(sendBuf_);
-        label fSize = f.size()/sizeof(Type);
-
-        // Inplace compress
-        static const label nCmpts = sizeof(Type)/sizeof(scalar);
-        label nm1 = (fSize - 1)*nCmpts;
-        label nlast = sizeof(Type)/sizeof(float);
-        label nFloats = nm1 + nlast;
-
-        const scalar *sArray = reinterpret_cast<const scalar*>(f.begin());
-        const scalar *slast = &sArray[nm1];
-        float *fArray = reinterpret_cast<float*>(sendBuf_.begin());
-
-        for (register label i=0; i<nm1; i++)
-        {
-            fArray[i] = sArray[i] - slast[i%nCmpts];
-        }
-
-        reinterpret_cast<Type&>(fArray[nm1]) = f[fSize - 1];
-
-        // Trim
-        setSendBuf<float>(nFloats);
-    }
-
-    // Send sendBuf
-    if (commsType == Pstream::blocking || commsType == Pstream::scheduled)
-    {
-        OPstream::write
-        (
-            commsType,
-            neighbProcNo(),
-            sendBuf_.begin(),
-            sendBuf_.size()
-        );
-    }
-    else if (commsType == Pstream::nonBlocking)
-    {
-        setReceiveBuf<char>(sendBuf_.size());
-
-        IPstream::read
-        (
-            commsType,
-            neighbProcNo(),
-            receiveBuf_.begin(),
-            receiveBuf_.size()
-        );
-
-        OPstream::write
-        (
-            commsType,
-            neighbProcNo(),
-            sendBuf_.begin(),
-            sendBuf_.size()
-        );
-    }
-    else
-    {
-        FatalErrorIn("processorLduInterface::compressedBufferSend")
-            << "Unsupported communications type " << commsType
-            << exit(FatalError);
-    }
-}
-
-
-template<class Type>
-const Foam::List<Type>& Foam::processorLduInterface::compressedBufferReceive
-(
-    const Pstream::commsTypes commsType,
-    const label size
-) const
-{
-    if (sizeof(scalar) > sizeof(float) && size && Pstream::floatTransfer)
-    {
-        static const label nCmpts = sizeof(Type)/sizeof(scalar);
-        label nm1 = (size - 1)*nCmpts;
-        label nlast = sizeof(Type)/sizeof(float);
-        label nFloats = nm1 + nlast;
-
-        if (commsType == Pstream::blocking || commsType == Pstream::scheduled)
-        {
-            setReceiveBuf<float>(nFloats);
-
-            IPstream::read
-            (
-                commsType,
-                neighbProcNo(),
-                receiveBuf_.begin(),
-                receiveBuf_.size()
-            );
-        }
-        else if (commsType != Pstream::nonBlocking)
-        {
-            FatalErrorIn("processorLduInterface::compressedBufferReceive")
-                << "Unsupported communications type " << commsType
-                << exit(FatalError);
-        }
-
-        // Inline expand
-        List<Type>& f = setReceiveBuf<Type>(size);
-        label fSize = f.size()/sizeof(Type);
-
-        const float *fArray =
-            reinterpret_cast<const float*>(receiveBuf_.begin());
-        f[fSize - 1] = reinterpret_cast<const Type&>(fArray[nm1]);
-        scalar *sArray = reinterpret_cast<scalar*>(f.begin());
-        const scalar *slast = &sArray[nm1];
-
-        for (register label i=0; i<nm1; i++)
-        {
-            sArray[i] = fArray[i] + slast[i%nCmpts];
-        }
-    }
-    else
-    {
-        if (commsType == Pstream::blocking || commsType == Pstream::scheduled)
-        {
-            setReceiveBuf<Type>(size);
-
-            IPstream::read
-            (
-                commsType,
-                neighbProcNo(),
-                receiveBuf_.begin(),
-                receiveBuf_.size()
-            );
-        }
-        else if (commsType != Pstream::nonBlocking)
-        {
-            FatalErrorIn("processorLduInterface::compressedBufferReceive")
-                << "Unsupported communications type " << commsType
-                << exit(FatalError);
-        }
-    }
-    return reinterpret_cast<List<Type>&>(receiveBuf_);
-}
+// template<class Type>
+// void Foam::processorLduInterface::compressedBufferSend
+// (
+//     const Pstream::commsTypes commsType
+// ) const
+// {
+//     // Optionally inline compress sendBuf
+//     if
+//     (
+//         sizeof(scalar) > sizeof(float)
+//      && sendBuf_.size()
+//      && Pstream::floatTransfer
+//     )
+//     {
+//         const List<Type>& f = reinterpret_cast<const List<Type>&>(sendBuf_);
+//         label fSize = f.size()/sizeof(Type);
+// 
+//         // Inplace compress
+//         static const label nCmpts = sizeof(Type)/sizeof(scalar);
+//         label nm1 = (fSize - 1)*nCmpts;
+//         label nlast = sizeof(Type)/sizeof(float);
+//         label nFloats = nm1 + nlast;
+// 
+//         const scalar *sArray = reinterpret_cast<const scalar*>(f.begin());
+//         const scalar *slast = &sArray[nm1];
+//         float *fArray = reinterpret_cast<float*>(sendBuf_.begin());
+// 
+//         for (register label i=0; i<nm1; i++)
+//         {
+//             fArray[i] = sArray[i] - slast[i%nCmpts];
+//         }
+// 
+//         reinterpret_cast<Type&>(fArray[nm1]) = f[fSize - 1];
+// 
+//         // Trim
+//         setSendBuf<float>(nFloats);
+//     }
+// 
+//     // Send sendBuf
+//     if (commsType == Pstream::blocking || commsType == Pstream::scheduled)
+//     {
+//         OPstream::write
+//         (
+//             commsType,
+//             neighbProcNo(),
+//             sendBuf_.begin(),
+//             sendBuf_.size()
+//         );
+//     }
+//     else if (commsType == Pstream::nonBlocking)
+//     {
+//         setReceiveBuf<char>(sendBuf_.size());
+// 
+//         IPstream::read
+//         (
+//             commsType,
+//             neighbProcNo(),
+//             receiveBuf_.begin(),
+//             receiveBuf_.size()
+//         );
+// 
+//         OPstream::write
+//         (
+//             commsType,
+//             neighbProcNo(),
+//             sendBuf_.begin(),
+//             sendBuf_.size()
+//         );
+//     }
+//     else
+//     {
+//         FatalErrorIn("processorLduInterface::compressedBufferSend")
+//             << "Unsupported communications type " << commsType
+//             << exit(FatalError);
+//     }
+// }
+// 
+// 
+// template<class Type>
+// const Foam::List<Type>& Foam::processorLduInterface::compressedBufferReceive
+// (
+//     const Pstream::commsTypes commsType,
+//     const label size
+// ) const
+// {
+//     if (sizeof(scalar) > sizeof(float) && size && Pstream::floatTransfer)
+//     {
+//         static const label nCmpts = sizeof(Type)/sizeof(scalar);
+//         label nm1 = (size - 1)*nCmpts;
+//         label nlast = sizeof(Type)/sizeof(float);
+//         label nFloats = nm1 + nlast;
+// 
+//         if (commsType == Pstream::blocking || commsType == Pstream::scheduled)
+//         {
+//             setReceiveBuf<float>(nFloats);
+// 
+//             IPstream::read
+//             (
+//                 commsType,
+//                 neighbProcNo(),
+//                 receiveBuf_.begin(),
+//                 receiveBuf_.size()
+//             );
+//         }
+//         else if (commsType != Pstream::nonBlocking)
+//         {
+//             FatalErrorIn("processorLduInterface::compressedBufferReceive")
+//                 << "Unsupported communications type " << commsType
+//                 << exit(FatalError);
+//         }
+// 
+//         // Inline expand
+//         List<Type>& f = setReceiveBuf<Type>(size);
+//         label fSize = f.size()/sizeof(Type);
+// 
+//         const float *fArray =
+//             reinterpret_cast<const float*>(receiveBuf_.begin());
+//         f[fSize - 1] = reinterpret_cast<const Type&>(fArray[nm1]);
+//         scalar *sArray = reinterpret_cast<scalar*>(f.begin());
+//         const scalar *slast = &sArray[nm1];
+// 
+//         for (register label i=0; i<nm1; i++)
+//         {
+//             sArray[i] = fArray[i] + slast[i%nCmpts];
+//         }
+//     }
+//     else
+//     {
+//         if (commsType == Pstream::blocking || commsType == Pstream::scheduled)
+//         {
+//             setReceiveBuf<Type>(size);
+// 
+//             IPstream::read
+//             (
+//                 commsType,
+//                 neighbProcNo(),
+//                 receiveBuf_.begin(),
+//                 receiveBuf_.size()
+//             );
+//         }
+//         else if (commsType != Pstream::nonBlocking)
+//         {
+//             FatalErrorIn("processorLduInterface::compressedBufferReceive")
+//                 << "Unsupported communications type " << commsType
+//                 << exit(FatalError);
+//         }
+//     }
+//     return reinterpret_cast<List<Type>&>(receiveBuf_);
+// }
 
 
 // ************************************************************************* //
diff --git a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/cyclicLduInterfaceField/cyclicLduInterfaceField.C b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/cyclicLduInterfaceField/cyclicLduInterfaceField.C
index e872f2cc59f..53d86db023c 100644
--- a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/cyclicLduInterfaceField/cyclicLduInterfaceField.C
+++ b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/cyclicLduInterfaceField/cyclicLduInterfaceField.C
@@ -51,7 +51,7 @@ void Foam::cyclicLduInterfaceField::transformCoupleField
 {
     if (doTransform())
     {
-        scalar forwardScale = 
+        scalar forwardScale =
             pow(diag(forwardT()).component(cmpt), rank());
 
         pnf *= forwardScale;
diff --git a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/processorLduInterfaceField/processorLduInterfaceField.C b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/processorLduInterfaceField/processorLduInterfaceField.C
index 3109aac9cb8..05e8691f2e7 100644
--- a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/processorLduInterfaceField/processorLduInterfaceField.C
+++ b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/processorLduInterfaceField/processorLduInterfaceField.C
@@ -43,24 +43,17 @@ Foam::processorLduInterfaceField::~processorLduInterfaceField()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-//void Foam::processorLduInterfaceField::transformCoupleField
-//(
-//    scalarField& f,
-//    const direction cmpt
-//) const
-//{
-//    if (doTransform())
-//    {
-//        if (forwardT().size() == 1)
-//        {
-//            f *= pow(diag(forwardT()[0]).component(cmpt), rank());
-//        }
-//        else
-//        {
-//            f *= pow(diag(forwardT())().component(cmpt), rank());
-//        }
-//    }
-//}
+void Foam::processorLduInterfaceField::transformCoupleField
+(
+    scalarField& f,
+    const direction cmpt
+) const
+{
+    if (doTransform())
+    {
+        f *= pow(diag(forwardT()).component(cmpt), rank());
+    }
+}
 
 
 // ************************************************************************* //
diff --git a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/processorLduInterfaceField/processorLduInterfaceField.H b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/processorLduInterfaceField/processorLduInterfaceField.H
index 59be5d1c2bc..fd0b02f060e 100644
--- a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/processorLduInterfaceField/processorLduInterfaceField.H
+++ b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/processorLduInterfaceField/processorLduInterfaceField.H
@@ -79,22 +79,22 @@ public:
             //- Return neigbour processor number
             virtual int neighbProcNo() const = 0;
 
-//            //- Is the transform required
-//            virtual bool doTransform() const = 0;
-//
-//            //- Return face transformation tensor
-//            virtual const tensorField& forwardT() const = 0;
+            //- Is the transform required
+            virtual bool doTransform() const = 0;
+
+            //- Return face transformation tensor
+            virtual const tensor& forwardT() const = 0;
 
             //- Return rank of component for transform
             virtual int rank() const = 0;
 
 
-//        //- Transform given patch component field
-//        virtual void transformCoupleField
-//        (
-//            scalarField& f,
-//            const direction cmpt
-//        ) const = 0;
+        //- Transform given patch component field
+        void transformCoupleField
+        (
+            scalarField& f,
+            const direction cmpt
+        ) const;
 };
 
 
diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolver.H b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolver.H
index cc46f7931b0..4570b7dd095 100644
--- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolver.H
+++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolver.H
@@ -147,7 +147,7 @@ class GAMGSolver
         //- Calculate and return the scaling factor from Acf, coarseSource
         //  and coarseField.
         //  At the same time do a Jacobi iteration on the coarseField using
-        //  the Acf provided after the coarseField values are used for the 
+        //  the Acf provided after the coarseField values are used for the
         //  scaling factor.
         scalar scalingFactor
         (
diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverAgglomerateMatrix.C b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverAgglomerateMatrix.C
index 7641d2c9373..6d7a6bfb97d 100644
--- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverAgglomerateMatrix.C
+++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverAgglomerateMatrix.C
@@ -96,7 +96,7 @@ void Foam::GAMGSolver::agglomerateMatrix(const label fineLevelIndex)
     {
         if (fineInterfaces.set(inti))
         {
-            const GAMGInterface& coarseInterface = 
+            const GAMGInterface& coarseInterface =
                 refCast<const GAMGInterface>
                 (
                     agglomeration_.interfaceLevel(fineLevelIndex + 1)[inti]
@@ -182,7 +182,7 @@ void Foam::GAMGSolver::agglomerateMatrix(const label fineLevelIndex)
             }
         }
     }
-    else // ... Otherwise it is symmetric so agglomerate just the upper 
+    else // ... Otherwise it is symmetric so agglomerate just the upper
     {
         // Get off-diagonal matrix coefficients
         const scalarField& fineUpper = fineMatrix.upper();
diff --git a/src/OpenFOAM/meshes/boundBox/boundBox.C b/src/OpenFOAM/meshes/boundBox/boundBox.C
index 15de6f2cf7f..eb8ec29866d 100644
--- a/src/OpenFOAM/meshes/boundBox/boundBox.C
+++ b/src/OpenFOAM/meshes/boundBox/boundBox.C
@@ -110,6 +110,26 @@ Foam::boundBox::boundBox(Istream& is)
 }
 
 
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+Foam::tmp<Foam::pointField> Foam::boundBox::corners() const
+{
+    tmp<pointField> tPts = tmp<pointField>(new pointField(8));
+    pointField& pt = tPts();
+
+    pt[0] = min_;                                   // min-x, min-y, min-z
+    pt[1] = point(max_.x(), min_.y(), min_.z());    // max-x, min-y, min-z
+    pt[2] = point(max_.x(), max_.y(), min_.z());    // max-x, max-y, min-z
+    pt[3] = point(min_.x(), max_.y(), min_.z());    // min-x, max-y, min-z
+    pt[4] = point(min_.x(), min_.y(), max_.z());    // min-x, min-y, max-z
+    pt[5] = point(max_.x(), min_.y(), max_.z());    // max-x, min-y, max-z
+    pt[6] = max_;                                   // max-x, max-y, max-z
+    pt[7] = point(min_.x(), max_.y(), max_.z());    // min-x, max-y, max-z
+
+    return tPts;
+}
+
+
 // * * * * * * * * * * * * * * * Ostream Operator  * * * * * * * * * * * * * //
 
 Foam::Ostream& Foam::operator<<(Ostream& os, const boundBox& bb)
diff --git a/src/OpenFOAM/meshes/boundBox/boundBox.H b/src/OpenFOAM/meshes/boundBox/boundBox.H
index 38b852ef66a..29cfa1fe299 100644
--- a/src/OpenFOAM/meshes/boundBox/boundBox.H
+++ b/src/OpenFOAM/meshes/boundBox/boundBox.H
@@ -171,6 +171,8 @@ public:
                 return cmptAv(span());
             }
 
+            //- Return corner points in an order corresponding to a 'hex' cell
+            tmp<pointField> corners() const;
 
         // Query
 
diff --git a/src/OpenFOAM/meshes/meshShapes/cell/oppositeCellFace.C b/src/OpenFOAM/meshes/meshShapes/cell/oppositeCellFace.C
index a103772bb0d..ed9c7057cc9 100644
--- a/src/OpenFOAM/meshes/meshShapes/cell/oppositeCellFace.C
+++ b/src/OpenFOAM/meshes/meshShapes/cell/oppositeCellFace.C
@@ -99,7 +99,7 @@ Foam::label Foam::cell::opposingFaceLabel
                 {
                     // There has already been an opposite face.
                     // Non-prismatic cell
-                    Info<< "Multiple faces not sharing vertex: " 
+                    Info<< "Multiple faces not sharing vertex: "
                         << oppositeFaceLabel << " and "
                         << curFaceLabels[faceI] << endl;
                     return -1;
diff --git a/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/cyclic/cyclicPointPatch.C b/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/cyclic/cyclicPointPatch.C
index 6f65c70764b..4a888315322 100644
--- a/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/cyclic/cyclicPointPatch.C
+++ b/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/cyclic/cyclicPointPatch.C
@@ -76,7 +76,7 @@ void Foam::cyclicPointPatch::calcGeometry(PstreamBuffers&)
     else
     {
         // Get reference to shared points
-        const labelList& sharedPoints = 
+        const labelList& sharedPoints =
             boundaryMesh().globalPatch().meshPoints();
 
         nonGlobalPatchPoints_.setSize(mp.size());
diff --git a/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/processor/processorPointPatch.H b/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/processor/processorPointPatch.H
index 373416ac0a4..df7b8d96a3e 100644
--- a/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/processor/processorPointPatch.H
+++ b/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/processor/processorPointPatch.H
@@ -73,11 +73,11 @@ class processorPointPatch
         //- Calculate the patch geometry
         virtual void calcGeometry(PstreamBuffers&);
 
-        //- Initialise the points on this patch which are should also be 
+        //- Initialise the points on this patch which are should also be
         //  on a neighbouring patch but are not part of faces of that patch
         void initPatchPatchPoints(PstreamBuffers&);
 
-        //- Calculate the points on this patch which are should also be 
+        //- Calculate the points on this patch which are should also be
         //  on a neighbouring patch but are not part of faces of that patch
         void calcPatchPatchPoints(PstreamBuffers&);
 
diff --git a/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/processorCyclic/processorCyclicPointPatch.C b/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/processorCyclic/processorCyclicPointPatch.C
new file mode 100644
index 00000000000..684580aaf6c
--- /dev/null
+++ b/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/processorCyclic/processorCyclicPointPatch.C
@@ -0,0 +1,399 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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 "processorCyclicPointPatch.H"
+#include "pointBoundaryMesh.H"
+#include "addToRunTimeSelectionTable.H"
+//#include "pointMesh.H"
+//#include "globalPointPatch.H"
+//#include "faceList.H"
+//#include "primitiveFacePatch.H"
+//#include "emptyPolyPatch.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(processorCyclicPointPatch, 0);
+
+addToRunTimeSelectionTable
+(
+    facePointPatch,
+    processorCyclicPointPatch,
+    polyPatch
+);
+
+
+// * * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * //
+
+//void Foam::processorCyclicPointPatch::initGeometry(PstreamBuffers& pBufs)
+//{
+//    // Algorithm:
+//    // Depending on whether the patch is a master or a slave, get the primitive
+//    // patch points and filter away the points from the global patch.
+//
+//    if (isMaster())
+//    {
+//        meshPoints_ = procPolyPatch_.meshPoints();
+//    }
+//    else
+//    {
+//        // Slave side. Create the reversed patch and pick up its points
+//        // so that the order is correct
+//        const polyPatch& pp = patch();
+//
+//        faceList masterFaces(pp.size());
+//
+//        forAll (pp, faceI)
+//        {
+//            masterFaces[faceI] = pp[faceI].reverseFace();
+//        }
+//
+//        meshPoints_ = primitiveFacePatch
+//        (
+//            masterFaces,
+//            pp.points()
+//        ).meshPoints();
+//    }
+//
+//    if (Pstream::parRun())
+//    {
+//        initPatchPatchPoints(pBufs);
+//    }
+//}
+//
+//
+//void Foam::processorCyclicPointPatch::calcGeometry(PstreamBuffers& pBufs)
+//{
+//    if (Pstream::parRun())
+//    {
+//        calcPatchPatchPoints(pBufs);
+//    }
+//
+//    // If it is not runing parallel or there are no global points
+//    // create a 1->1 map
+//    if
+//    (
+//        !Pstream::parRun()
+//     || !boundaryMesh().mesh().globalData().nGlobalPoints()
+//    )
+//    {
+//        nonGlobalPatchPoints_.setSize(meshPoints_.size());
+//        forAll(nonGlobalPatchPoints_, i)
+//        {
+//            nonGlobalPatchPoints_[i] = i;
+//        }
+//    }
+//    else
+//    {
+//        // Get reference to shared points
+//        const labelList& sharedPoints =
+//            boundaryMesh().globalPatch().meshPoints();
+//
+//        nonGlobalPatchPoints_.setSize(meshPoints_.size());
+//
+//        label noFiltPoints = 0;
+//
+//        forAll (meshPoints_, pointI)
+//        {
+//            label curP = meshPoints_[pointI];
+//
+//            bool found = false;
+//
+//            forAll (sharedPoints, sharedI)
+//            {
+//                if (sharedPoints[sharedI] == curP)
+//                {
+//                    found = true;
+//                    break;
+//                }
+//            }
+//
+//            if (!found)
+//            {
+//                nonGlobalPatchPoints_[noFiltPoints] = pointI;
+//                meshPoints_[noFiltPoints] = curP;
+//                noFiltPoints++;
+//            }
+//        }
+//
+//        nonGlobalPatchPoints_.setSize(noFiltPoints);
+//        meshPoints_.setSize(noFiltPoints);
+//    }
+//}
+//
+//
+//void processorCyclicPointPatch::initPatchPatchPoints(PstreamBuffers& pBufs)
+//{
+//    if (debug)
+//    {
+//        Info<< "processorCyclicPointPatch::initPatchPatchPoints(PstreamBuffers&) : "
+//            << "constructing patch-patch points"
+//            << endl;
+//    }
+//
+//    const polyBoundaryMesh& bm = boundaryMesh().mesh()().boundaryMesh();
+//
+//    // Get the mesh points for this patch corresponding to the faces
+//    const labelList& ppmp = meshPoints();
+//
+//    // Create a HashSet of the point labels for this patch
+//    Map<label> patchPointSet(2*ppmp.size());
+//
+//    forAll (ppmp, ppi)
+//    {
+//        patchPointSet.insert(ppmp[ppi], ppi);
+//    }
+//
+//
+//    // Create the lists of patch-patch points
+//    labelListList patchPatchPoints(bm.size());
+//
+//    // Create the lists of patch-patch point normals
+//    List<List<vector> > patchPatchPointNormals(bm.size());
+//
+//    // Loop over all patches looking for other patches that share points
+//    forAll(bm, patchi)
+//    {
+//        if
+//        (
+//            patchi != index()                 // Ignore self-self
+//         && !isA<emptyPolyPatch>(bm[patchi])  // Ignore empty
+//         && !bm[patchi].coupled()             // Ignore other couples
+//        )
+//        {
+//            // Get the meshPoints for the other patch
+//            const labelList& meshPoints = bm[patchi].meshPoints();
+//
+//            // Get the normals for the other patch
+//            const vectorField& normals = bm[patchi].pointNormals();
+//
+//            label pppi = 0;
+//            forAll(meshPoints, pointi)
+//            {
+//                label ppp = meshPoints[pointi];
+//
+//                // Check to see if the point of the other patch is shared with
+//                // this patch
+//                Map<label>::iterator iter = patchPointSet.find(ppp);
+//
+//                if (iter != patchPointSet.end())
+//                {
+//                    // If it is shared initialise the patchPatchPoints for this
+//                    // patch
+//                    if (!patchPatchPoints[patchi].size())
+//                    {
+//                        patchPatchPoints[patchi].setSize(ppmp.size());
+//                        patchPatchPointNormals[patchi].setSize(ppmp.size());
+//                    }
+//
+//                    // and add the entry
+//                    patchPatchPoints[patchi][pppi] = iter();
+//                    patchPatchPointNormals[patchi][pppi] = normals[pointi];
+//                    pppi++;
+//                }
+//            }
+//
+//            // Resise the list of shared points and normals for the patch
+//            // being considerd
+//            patchPatchPoints[patchi].setSize(pppi);
+//            patchPatchPointNormals[patchi].setSize(pppi);
+//        }
+//    }
+//
+//    // Send the patchPatchPoints to the neighbouring processor
+//
+//    UOPstream toNeighbProc(neighbProcNo(), pBufs);
+//
+//    toNeighbProc
+//        << ppmp.size()              // number of points for checking
+//        << patchPatchPoints
+//        << patchPatchPointNormals;
+//
+//    if (debug)
+//    {
+//        Info<< "processorCyclicPointPatch::initPatchPatchPoints() : "
+//            << "constructed patch-patch points"
+//            << endl;
+//    }
+//}
+//
+//
+//void Foam::processorCyclicPointPatch::calcPatchPatchPoints(PstreamBuffers& pBufs)
+//{
+//    // Get the patchPatchPoints from the neighbouring processor
+//    UIPstream fromNeighbProc(neighbProcNo(), pBufs);
+//
+//    label nbrNPoints(readLabel(fromNeighbProc));
+//    labelListList patchPatchPoints(fromNeighbProc);
+//    List<List<vector> > patchPatchPointNormals(fromNeighbProc);
+//
+//    pointBoundaryMesh& pbm = const_cast<pointBoundaryMesh&>(boundaryMesh());
+//    const labelList& ppmp = meshPoints();
+//
+//    // Simple check for the very rare situation when not the same number
+//    // of points on both sides. This can happen with decomposed cyclics.
+//    // If on one side the cyclic shares a point with proc faces coming from
+//    // internal faces it will have a different number of points from
+//    // the situation where the cyclic and the 'normal' proc faces are fully
+//    // separate.
+//    if (nbrNPoints != ppmp.size())
+//    {
+//        WarningIn("processorCyclicPointPatch::calcPatchPatchPoints(PstreamBuffers&)")
+//            << "Processor patch " << name()
+//            << " has " << ppmp.size() << " points; coupled patch has "
+//            << nbrNPoints << " points." << endl
+//            << "   (usually due to decomposed cyclics)."
+//            << " This might give problems" << endl
+//            << "    when using point fields (interpolation, mesh motion)."
+//            << endl;
+//    }
+//
+//
+//
+//    // Loop over the patches looking for other patches that share points
+//    forAll(patchPatchPoints, patchi)
+//    {
+//        const labelList& patchPoints = patchPatchPoints[patchi];
+//        const List<vector>& patchPointNormals = patchPatchPointNormals[patchi];
+//
+//        // If there are potentially shared points for the patch being considered
+//        if (patchPoints.size())
+//        {
+//            // Get the current meshPoints list for the patch
+//            facePointPatch& fpp = refCast<facePointPatch>(pbm[patchi]);
+//            const labelList& fmp = fpp.meshPoints();
+//            labelList& mp = fpp.meshPoints_;
+//
+//            const vectorField& fnormals = fpp.pointNormals();
+//            vectorField& normals = fpp.pointNormals_;
+//
+//            // Create a HashSet of the point labels for the patch
+//            Map<label> patchPointSet(2*fmp.size());
+//
+//            forAll (fmp, ppi)
+//            {
+//                patchPointSet.insert(fmp[ppi], ppi);
+//            }
+//
+//            label nPoints = mp.size();
+//            label lpi = 0;
+//            bool resized = false;
+//
+//            // For each potentially shared point...
+//            forAll(patchPoints, ppi)
+//            {
+//                // Check if it is not already in the patch,
+//                // i.e. not part of a face of the patch
+//                if (!patchPointSet.found(ppmp[patchPoints[ppi]]))
+//                {
+//                    // If it isn't already in the patch check if the local
+//                    // meshPoints is already set and if not initialise the
+//                    // meshPoints_ and pointNormals_
+//                    if (!resized)
+//                    {
+//                        if (!mp.size() && fmp.size())
+//                        {
+//                            mp = fmp;
+//                            normals = fnormals;
+//
+//                            nPoints = mp.size();
+//                        }
+//
+//                        mp.setSize(nPoints + patchPoints.size());
+//                        loneMeshPoints_.setSize(patchPoints.size());
+//                        normals.setSize(nPoints + patchPoints.size());
+//                        resized = true;
+//                    }
+//
+//                    // Add the new point to the patch
+//                    mp[nPoints] = ppmp[patchPoints[ppi]];
+//                    loneMeshPoints_[lpi++] = ppmp[patchPoints[ppi]];
+//                    normals[nPoints++] = patchPointNormals[ppi];
+//                }
+//            }
+//
+//            // If the lists have been resized points have been added.
+//            // Shrink the lists to the current size.
+//            if (resized)
+//            {
+//                mp.setSize(nPoints);
+//                loneMeshPoints_.setSize(lpi);
+//                normals.setSize(nPoints);
+//            }
+//        }
+//    }
+//}
+
+
+//void processorCyclicPointPatch::initMovePoints(PstreamBuffers&, const pointField&)
+//{}
+//
+//
+//void processorCyclicPointPatch::movePoints(PstreamBuffers&, const pointField&)
+//{}
+//
+//
+//void processorCyclicPointPatch::initUpdateMesh(PstreamBuffers& pBufs)
+//{
+//    facePointPatch::initUpdateMesh(pBufs);
+//    processorCyclicPointPatch::initGeometry(pBufs);
+//}
+//
+//
+//void processorCyclicPointPatch::updateMesh(PstreamBuffers& pBufs)
+//{
+//    facePointPatch::updateMesh(pBufs);
+//    processorCyclicPointPatch::calcGeometry(pBufs);
+//}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+processorCyclicPointPatch::processorCyclicPointPatch
+(
+    const polyPatch& patch,
+    const pointBoundaryMesh& bm
+)
+:
+    processorPointPatch(patch, bm)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+processorCyclicPointPatch::~processorCyclicPointPatch()
+{}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/processorCyclic/processorCyclicPointPatch.H b/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/processorCyclic/processorCyclicPointPatch.H
new file mode 100644
index 00000000000..12e10840388
--- /dev/null
+++ b/src/OpenFOAM/meshes/pointMesh/pointPatches/constraint/processorCyclic/processorCyclicPointPatch.H
@@ -0,0 +1,146 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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::processorCyclicPointPatch
+
+Description
+    Processor patch boundary needs to be such that the ordering of
+    points in the patch is the same on both sides.
+
+    Looking at the creation of the faces on both sides of the processor
+    patch they need to be identical on both sides with the normals pointing
+    in opposite directions.  This is achieved by calling the reverseFace
+    function in the decomposition.  It is therefore possible to re-create
+    the ordering of patch points on the slave side by reversing all the
+    patch faces of the owner.
+
+SourceFiles
+    processorCyclicPointPatch.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef processorCyclicPointPatch_H
+#define processorCyclicPointPatch_H
+
+#include "processorPointPatch.H"
+#include "processorCyclicPolyPatch.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                      Class processorCyclicPointPatch Declaration
+\*---------------------------------------------------------------------------*/
+
+class processorCyclicPointPatch
+:
+    public processorPointPatch
+{
+
+        //- Disallow default construct as copy
+        processorCyclicPointPatch(const processorCyclicPointPatch&);
+
+        //- Disallow default assignment
+        void operator=(const processorCyclicPointPatch&);
+
+public:
+
+    //- Runtime type information
+    TypeName(processorCyclicPolyPatch::typeName_());
+
+
+    // Constructors
+
+        //- Construct from components
+        processorCyclicPointPatch
+        (
+            const polyPatch& patch,
+            const pointBoundaryMesh& bm
+        );
+
+
+    // Destructor
+
+        virtual ~processorCyclicPointPatch();
+
+
+    // Member functions
+
+//        //- Return true if running parallel
+//        virtual bool coupled() const
+//        {
+//            if (Pstream::parRun())
+//            {
+//                return true;
+//            }
+//            else
+//            {
+//                return false;
+//            }
+//        }
+//
+//        //- Return processor number
+//        int myProcNo() const
+//        {
+//            return procPolyPatch_.myProcNo();
+//        }
+//
+//        //- Return neigbour processor number
+//        int neighbProcNo() const
+//        {
+//            return procPolyPatch_.neighbProcNo();
+//        }
+//
+//        //- Is this a master patch
+//        bool isMaster() const
+//        {
+//            return myProcNo() < neighbProcNo();
+//        }
+//
+//        //- Is this a slave patch
+//        bool isSlave() const
+//        {
+//            return !isMaster();
+//        }
+//
+//        //- Return the underlying processorPolyPatch
+//        const processorPolyPatch& procPolyPatch() const
+//        {
+//            return procPolyPatch_;
+//        }
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalMeshData.C b/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalMeshData.C
index 1742c9765a6..2cd1d6d950a 100644
--- a/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalMeshData.C
+++ b/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalMeshData.C
@@ -747,20 +747,10 @@ void Foam::globalMeshData::updateMesh()
     {
         label patchI = processorPatches_[i];
 
-        const processorPolyPatch& procPatch =
-            refCast<const processorPolyPatch>(mesh_.boundaryMesh()[patchI]);
-
-        if (Pstream::myProcNo() > procPatch.neighbProcNo())
+        if (isType<processorPolyPatch>(mesh_.boundaryMesh()[patchI]))
         {
-            forAll(procPatch.patchIDs(), i)
-            {
-                if (procPatch.patchIDs()[i] == -1)
-                {
-                    // Normal, unseparated processor patch. Remove duplicates.
-                    label sz = procPatch.starts()[i+1]-procPatch.starts()[i];
-                    nTotalFaces_ -= sz;
-                }
-            }
+            // Normal, unseparated processor patch. Remove duplicates.
+            nTotalFaces_ -= mesh_.boundaryMesh()[patchI].size();
         }
     }
     reduce(nTotalFaces_, sumOp<label>());
diff --git a/src/OpenFOAM/meshes/polyMesh/polyMesh.C b/src/OpenFOAM/meshes/polyMesh/polyMesh.C
index be66167ded4..e8b1ae5998d 100644
--- a/src/OpenFOAM/meshes/polyMesh/polyMesh.C
+++ b/src/OpenFOAM/meshes/polyMesh/polyMesh.C
@@ -654,8 +654,6 @@ void Foam::polyMesh::resetPrimitives
     const Xfer<labelList>& neighbour,
     const labelList& patchSizes,
     const labelList& patchStarts,
-    const labelListList& subPatches,
-    const labelListList& subPatchStarts,
     const bool validBoundary
 )
 {
@@ -697,17 +695,6 @@ void Foam::polyMesh::resetPrimitives
             patchI,
             boundary_
         );
-
-        if (isA<processorPolyPatch>(boundary_[patchI]))
-        {
-            // Set the sub-patch information
-            processorPolyPatch& ppp = refCast<processorPolyPatch>
-            (
-                boundary_[patchI]
-            );
-            const_cast<labelList&>(ppp.patchIDs()) = subPatches[patchI];
-            const_cast<labelList&>(ppp.starts()) = subPatchStarts[patchI];
-        }
     }
 
 
@@ -731,8 +718,6 @@ void Foam::polyMesh::resetPrimitives
                 "    const Xfer<labelList>& neighbour,\n"
                 "    const labelList& patchSizes,\n"
                 "    const labelList& patchStarts\n"
-                "    const labelListList& subPatches,\n"
-                "    const labelListList& subPatchStarts,\n"
                 "    const bool validBoundary\n"
                 ")\n"
             )   << "Face " << faceI << " contains vertex labels out of range: "
@@ -772,8 +757,6 @@ void Foam::polyMesh::resetPrimitives
                 "    const Xfer<labelList>& neighbour,\n"
                 "    const labelList& patchSizes,\n"
                 "    const labelList& patchStarts\n"
-                "    const labelListList& subPatches,\n"
-                "    const labelListList& subPatchStarts,\n"
                 "    const bool validBoundary\n"
                 ")\n"
             )   << "no points or no cells in mesh" << endl;
diff --git a/src/OpenFOAM/meshes/polyMesh/polyMesh.H b/src/OpenFOAM/meshes/polyMesh/polyMesh.H
index b5bb2417aaf..1c31d2a7158 100644
--- a/src/OpenFOAM/meshes/polyMesh/polyMesh.H
+++ b/src/OpenFOAM/meshes/polyMesh/polyMesh.H
@@ -471,8 +471,6 @@ public:
             //- Reset mesh primitive data. Assumes all patch info correct
             //  (so does e.g. parallel communication). If not use
             //  validBoundary=false
-            //  (still assumes patchStarts[0] = nInternalFaces and last
-            //  patch ends at nActiveFaces) and change patches with addPatches.
             void resetPrimitives
             (
                 const Xfer<pointField>& points,
@@ -481,8 +479,6 @@ public:
                 const Xfer<labelList>& neighbour,
                 const labelList& patchSizes,
                 const labelList& patchStarts,
-                const labelListList& subPatches,
-                const labelListList& subPatchStarts,
                 const bool validBoundary = true
             );
 
diff --git a/src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.C b/src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.C
index 230874388dd..3a7c7eebc19 100644
--- a/src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.C
+++ b/src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.C
@@ -112,21 +112,21 @@ void Foam::coupledPolyPatch::writeOBJ
 }
 
 
-Foam::pointField Foam::coupledPolyPatch::calcFaceCentres
-(
-    const UList<face>& faces,
-    const pointField& points
-)
-{
-    pointField ctrs(faces.size());
-
-    forAll(faces, faceI)
-    {
-        ctrs[faceI] = faces[faceI].centre(points);
-    }
-
-    return ctrs;
-}
+//Foam::pointField Foam::coupledPolyPatch::calcFaceCentres
+//(
+//    const UList<face>& faces,
+//    const pointField& points
+//)
+//{
+//    pointField ctrs(faces.size());
+//
+//    forAll(faces, faceI)
+//    {
+//        ctrs[faceI] = faces[faceI].centre(points);
+//    }
+//
+//    return ctrs;
+//}
 
 
 Foam::pointField Foam::coupledPolyPatch::getAnchorPoints
diff --git a/src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.H b/src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.H
index 1b3a2caade8..b71155b3ba9 100644
--- a/src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.H
+++ b/src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.H
@@ -126,13 +126,6 @@ protected:
             label& vertI
         );
 
-        //- Calculate face centres
-        static pointField calcFaceCentres
-        (
-            const UList<face>&,
-            const pointField&
-        );
-
         //- Get f[0] for all faces
         static pointField getAnchorPoints
         (
@@ -242,8 +235,9 @@ public:
                 return true;
             }
 
-            //- Transform a patch-based field.
+            //- Transform a patch-based field from other side to this side.
             //!! TDB with macros?
+            virtual bool doTransform() const;
             virtual void transform(scalarField& l) const = 0;
             virtual void transform(vectorField& l) const = 0;
             virtual void transform(sphericalTensorField& l) const = 0;
@@ -251,7 +245,7 @@ public:
             virtual void transform(symmTensorField& l) const = 0;
             virtual void transform(tensorField& l) const = 0;
 
-            //- Transform a patch-based position
+            //- Transform a patch-based position from other side to this side
             virtual void transformPosition(pointField& l) const = 0;
 
             // Low level geometric information
@@ -272,14 +266,14 @@ public:
                 virtual const tensor& reverseT() const = 0;
 
 
-        //- Initialise the calculation of the patch geometry
-        virtual void initGeometry
-        (
-            const primitivePatch& referPatch,
-            UList<point>& nbrCtrs,
-            UList<point>& nbrAreas,
-            UList<point>& nbrCc
-        ) = 0;
+//        //- Initialise the calculation of the patch geometry
+//        virtual void initGeometry
+//        (
+//            const primitivePatch& referPatch,
+//            UList<point>& nbrCtrs,
+//            UList<point>& nbrAreas,
+//            UList<point>& nbrCc
+//        ) = 0;
 
         //- Calculate the patch geometry
         virtual void calcGeometry
diff --git a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.C b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.C
index 9b68c1ff720..d35ab9ccdf6 100644
--- a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.C
+++ b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.C
@@ -93,7 +93,7 @@ void Foam::cyclicPolyPatch::calcTransforms()
 
         const cyclicPolyPatch& half0 = *this;
 
-        pointField half0Ctrs(calcFaceCentres(half0, half0.points()));
+        const pointField& half0Ctrs = half0.faceCentres();
 
         if (debug)
         {
@@ -118,7 +118,7 @@ void Foam::cyclicPolyPatch::calcTransforms()
 
         const cyclicPolyPatch& half1 = neighbPatch();
 
-        pointField half1Ctrs(calcFaceCentres(half1, half1.points()));
+        const pointField& half1Ctrs = half1.faceCentres();
 
         // Dump halves
         if (debug)
@@ -282,9 +282,9 @@ void Foam::cyclicPolyPatch::getCentresAndAnchors
 ) const
 {
     // Get geometric data on both halves.
-    half0Ctrs = calcFaceCentres(pp0, pp0.points());
+    half0Ctrs = pp0.faceCentres();
     anchors0 = getAnchorPoints(pp0, pp0.points());
-    half1Ctrs = calcFaceCentres(pp1, pp1.points());
+    half1Ctrs = pp1.faceCentres();
 
     switch (transform_)
     {
@@ -585,13 +585,14 @@ Foam::cyclicPolyPatch::cyclicPolyPatch
 )
 :
     coupledPolyPatch(pp, bm, index, mapAddressing, newStart),
-    coupledPointsPtr_(NULL),
-    coupledEdgesPtr_(NULL),
-    featureCos_(pp.featureCos_),
+    neighbPatchName_(pp.neighbPatchName_),
+    neighbPatchID_(-1),
     transform_(pp.transform_),
     rotationAxis_(pp.rotationAxis_),
     rotationCentre_(pp.rotationCentre_),
-    separationVector_(pp.separationVector_)
+    separationVector_(pp.separationVector_),
+    coupledPointsPtr_(NULL),
+    coupledEdgesPtr_(NULL)
 {}
 
 
@@ -611,11 +612,11 @@ void Foam::cyclicPolyPatch::transformPosition(pointField& l) const
 {
     if (!parallel())
     {
-        Foam::transform(reverseT_, l);
+        Foam::transform(forwardT_, l);
     }
     else if (separated())
     {
-        l += separation_;
+        l -= separation_;
     }
 }
 
@@ -647,7 +648,7 @@ void Foam::cyclicPolyPatch::calcGeometry
     const UList<point>& nbrCc
 )
 {
-    polyPatch::calcGeometry();
+    //polyPatch::calcGeometry();
 
 Pout<< "cyclicPolyPatch::calcGeometry : name:" << name()
     << " referred from:" << referPatch.size() << endl;
diff --git a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.H b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.H
index eeed11b7961..166de53c1d2 100644
--- a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.H
+++ b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.H
@@ -48,8 +48,6 @@ SourceFiles
 #define cyclicPolyPatch_H
 
 #include "coupledPolyPatch.H"
-//#include "SubField.H"
-//#include "FixedList.H"
 #include "edgeList.H"
 //#include "transform.H"
 #include "polyBoundaryMesh.H"
@@ -373,16 +371,21 @@ public:
         //  calculation!
         const edgeList& coupledEdges() const;
 
-        //- Transform a patch-based field on this side to a field on the
-        //  other side.
+        //- Transform a patch-based field from other side to this side.
         template<class T>
         void transform(Field<T>& l) const
         {
             if (!parallel())
             {
-                transform(reverseT_, l);
+                transform(forwardT_, l);
             }
         }
+
+
+        virtual bool doTransform() const
+        {
+            return !parallel();
+        }
         virtual void transform(scalarField& l) const
         {
             transform(l);
@@ -408,8 +411,7 @@ public:
             transform(l);
         }
 
-        //- Transform a patch-based position on this side to a position
-        //  the other side.
+        //- Transform a patch-based position from other side to this side
         virtual void transformPosition(pointField& l) const;
 
 
diff --git a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/processor/processorPolyPatch.C b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/processor/processorPolyPatch.C
index 27e85e1cb98..472cf1300a5 100644
--- a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/processor/processorPolyPatch.C
+++ b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/processor/processorPolyPatch.C
@@ -45,46 +45,6 @@ namespace Foam
 }
 
 
-// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
-
-void Foam::processorPolyPatch::checkSubPatches() const
-{
-    if (starts_.size() != patchIDs_.size()+1)
-    {
-        FatalErrorIn("processorPolyPatch::checkPatches() const")
-            << "starts should have one more element than patchIDs." << endl
-            << "starts:" << starts_ << " patchIDs:" << patchIDs_
-            << exit(FatalError);
-    }
-    if (starts_[0] != 0)
-    {
-        FatalErrorIn("processorPolyPatch::checkPatches() const")
-            << "starts[0] should be 0." << endl
-            << "starts:" << starts_ << " patchIDs:" << patchIDs_
-            << exit(FatalError);
-    }
-    if (starts_[starts_.size()-1] != size())
-    {
-        FatalErrorIn("processorPolyPatch::checkPatches() const")
-            << "Last element in starts should be the size." << endl
-            << "starts:" << starts_ << " size:" << size()
-            << exit(FatalError);
-    }
-    // If there are any faces from internal they should be first.
-    for (label i = 1; i < patchIDs_.size(); i++)
-    {
-        if (patchIDs_[i] == -1)
-        {
-            FatalErrorIn("processorPolyPatch::checkPatches() const")
-            << "Faces originating from internal faces (subPatch is -1)"
-            << " should always be first in the patch."
-            << " The current list of subpatches " << patchIDs_
-            << exit(FatalError);
-        }
-    }
-}
-
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 Foam::processorPolyPatch::processorPolyPatch
@@ -95,24 +55,18 @@ Foam::processorPolyPatch::processorPolyPatch
     const label index,
     const polyBoundaryMesh& bm,
     const int myProcNo,
-    const int neighbProcNo,
-    const labelList& patchIDs,
-    const labelList& starts
+    const int neighbProcNo
 )
 :
     coupledPolyPatch(name, size, start, index, bm),
     myProcNo_(myProcNo),
     neighbProcNo_(neighbProcNo),
-    patchIDs_(patchIDs),
-    starts_(starts),
     neighbFaceCentres_(),
     neighbFaceAreas_(),
     neighbFaceCellCentres_()
 //    neighbPointsPtr_(NULL),
 //    neighbEdgesPtr_(NULL)
-{
-    checkSubPatches();
-}
+{}
 
 
 Foam::processorPolyPatch::processorPolyPatch
@@ -126,16 +80,12 @@ Foam::processorPolyPatch::processorPolyPatch
     coupledPolyPatch(name, dict, index, bm),
     myProcNo_(readLabel(dict.lookup("myProcNo"))),
     neighbProcNo_(readLabel(dict.lookup("neighbProcNo"))),
-    patchIDs_(dict.lookup("patchIDs")),
-    starts_(dict.lookup("starts")),
     neighbFaceCentres_(),
     neighbFaceAreas_(),
     neighbFaceCellCentres_()
 //    neighbPointsPtr_(NULL),
 //    neighbEdgesPtr_(NULL)
-{
-    checkSubPatches();
-}
+{}
 
 
 Foam::processorPolyPatch::processorPolyPatch
@@ -147,8 +97,6 @@ Foam::processorPolyPatch::processorPolyPatch
     coupledPolyPatch(pp, bm),
     myProcNo_(pp.myProcNo_),
     neighbProcNo_(pp.neighbProcNo_),
-    patchIDs_(pp.patchIDs_),
-    starts_(pp.starts_),
     neighbFaceCentres_(),
     neighbFaceAreas_(),
     neighbFaceCellCentres_()
@@ -163,24 +111,18 @@ Foam::processorPolyPatch::processorPolyPatch
     const polyBoundaryMesh& bm,
     const label index,
     const label newSize,
-    const label newStart,
-    const labelList& patchIDs,
-    const labelList& starts
+    const label newStart
 )
 :
     coupledPolyPatch(pp, bm, index, newSize, newStart),
     myProcNo_(pp.myProcNo_),
     neighbProcNo_(pp.neighbProcNo_),
-    patchIDs_(patchIDs),
-    starts_(starts),
     neighbFaceCentres_(),
     neighbFaceAreas_(),
     neighbFaceCellCentres_()
 //    neighbPointsPtr_(NULL),
 //    neighbEdgesPtr_(NULL)
-{
-    checkSubPatches();
-}
+{}
 
 
 Foam::processorPolyPatch::processorPolyPatch
@@ -188,7 +130,7 @@ Foam::processorPolyPatch::processorPolyPatch
     const processorPolyPatch& pp,
     const polyBoundaryMesh& bm,
     const label index,
-     const unallocLabelList& mapAddressing,
+    const unallocLabelList& mapAddressing,
     const label newStart
 )
 :
@@ -197,9 +139,9 @@ Foam::processorPolyPatch::processorPolyPatch
     neighbProcNo_(pp.neighbProcNo_),
     neighbFaceCentres_(),
     neighbFaceAreas_(),
-    neighbFaceCellCentres_(),
-    neighbPointsPtr_(NULL),
-    neighbEdgesPtr_(NULL)
+    neighbFaceCellCentres_()
+//    neighbPointsPtr_(NULL),
+//    neighbEdgesPtr_(NULL)
 {}
 
 
@@ -207,90 +149,24 @@ Foam::processorPolyPatch::processorPolyPatch
 
 Foam::processorPolyPatch::~processorPolyPatch()
 {
-//    deleteDemandDrivenData(neighbPointsPtr_);
-//    deleteDemandDrivenData(neighbEdgesPtr_);
+    neighbPointsPtr_.clear();
+    neighbEdgesPtr_.clear();
 }
 
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-void Foam::processorPolyPatch::transformPosition(pointField& l) const
-{
-    if (l.size() != size())
-    {
-        FatalErrorIn("processorPolyPatch::transformPosition(pointField&) const")
-            << "Size of field " << l.size() << " differs from patch size "
-            << size() << abort(FatalError);
-    }
-
-    forAll(patchIDs_, subI)
-    {
-        label patchI = patchIDs_[subI];
-
-        if (patchI != -1)
-        {
-            // Get field on patch
-            SubField<point> subFld(subSlice(l, subI));
-
-            refCast<const coupledPolyPatch>
-            (
-                boundaryMesh()[patchI]
-            ).transformPosition(reinterpret_cast<pointField&>(subFld));
-        }
-    }
-}
-
-
 void Foam::processorPolyPatch::initGeometry(PstreamBuffers& pBufs)
 {
 Pout<< "**processorPolyPatch::initGeometry()" << endl;
     if (Pstream::parRun())
     {
-        pointField fc(size());
-        vectorField fa(size());
-        pointField cc(size());
-
-        forAll(patchIDs_, i)
-        {
-            label patchI = patchIDs_[i];
-
-            autoPtr<primitivePatch> subPp = subPatch(i);
-
-            SubField<point> subFc(subSlice(fc, i));
-            SubField<vector> subFa(subSlice(fa, i));
-            SubField<point> subCc(subSlice(cc, i));
-
-            subFc.assign(subSlice(faceCentres(), i));
-            subFa.assign(subSlice(faceAreas(), i));
-            subCc.assign(subSlice(faceCellCentres()(), i));
-
-            if (patchI != -1)
-            {
-                coupledPolyPatch& pp = const_cast<coupledPolyPatch&>
-                (
-                    refCast<const coupledPolyPatch>
-                    (
-                        boundaryMesh()[patchI]
-                    )
-                );
-
-                Pout<< name() << " calling initGeometry on " << pp.name()
-                    << endl;
-
-                pp.initGeometry(subPp, subFc, subFa, subCc);
-
-                Pout<< name() << " from patchI:" << patchI
-                    << " calculated fc:" << subFc
-                    << " fa:" << subFa << " subCC:" << subCc << endl;
-                Pout<< name() << " fc:" << fc << endl;
-            }
-        }
-
-        Pout<< name() << " fc:" << fc << " fa:" << fa << " cc:" << cc << endl;
-
         UOPstream toNeighbProc(neighbProcNo(), pBufs);
 
-        toNeighbProc << fc << fa << cc;
+        toNeighbProc
+            << faceCentres()
+            << faceAreas()
+            << faceCellCentres();
     }
 }
 
@@ -312,41 +188,16 @@ Pout<< "processorPolyPatch::calcGeometry() for " << name() << endl;
 Pout<< "processorPolyPatch::calcGeometry() : received data for "
     << neighbFaceCentres_.size() << " faces." << endl;
 
-        forAll(patchIDs_, i)
-        {
-            label patchI = patchIDs_[i];
-
-            if (patchI == -1)
-            {
-                // Anything needs doing for ex-internal faces?
-            }
-            else
-            {
-                coupledPolyPatch& pp = const_cast<coupledPolyPatch&>
-                (
-                    refCast<const coupledPolyPatch>
-                    (
-                        boundaryMesh()[patchI]
-                    )
-                );
-
-Pout<< "processorPolyPatch::calcGeometry() : referring to " << pp.name()
-    << " for faces size:" << starts_[i+1]-starts_[i]
-    << " start:" << starts_[i]
-    << endl;
-
-                pp.calcGeometry
-                (
-                    subPatch(i),
-                    subSlice(faceCentres(), i),
-                    subSlice(faceAreas(), i),
-                    subSlice(faceCellCentres()(), i),
-                    subSlice(neighbFaceCentres_, i),
-                    subSlice(neighbFaceAreas_, i),
-                    subSlice(neighbFaceCellCentres_, i)
-                );
-            }
-        }
+        calcGeometry
+        (
+            *this,
+            faceCentres(),
+            faceAreas(),
+            faceCellCentres()(),
+            neighbFaceCentres_,
+            neighbFaceAreas_,
+            neighbFaceCellCentres_
+        );
     }
 Pout<< "**neighbFaceCentres_:" << neighbFaceCentres_ << endl;
 Pout<< "**neighbFaceAreas_:" << neighbFaceAreas_ << endl;
@@ -380,56 +231,46 @@ void Foam::processorPolyPatch::initUpdateMesh(PstreamBuffers& pBufs)
 {
     polyPatch::initUpdateMesh(pBufs);
 
-//    deleteDemandDrivenData(neighbPointsPtr_);
-//    deleteDemandDrivenData(neighbEdgesPtr_);
-//
-//    if (Pstream::parRun())
-//    {
-//        // Express all points as patch face and index in face.
-//        labelList pointFace(nPoints());
-//        labelList pointIndex(nPoints());
-//
-//        for (label patchPointI = 0; patchPointI < nPoints(); patchPointI++)
-//        {
-//            label faceI = pointFaces()[patchPointI][0];
-//
-//            pointFace[patchPointI] = faceI;
-//
-//            const face& f = localFaces()[faceI];
-//
-//            pointIndex[patchPointI] = findIndex(f, patchPointI);
-//        }
-//
-//        // Express all edges as patch face and index in face.
-//        labelList edgeFace(nEdges());
-//        labelList edgeIndex(nEdges());
-//
-//        for (label patchEdgeI = 0; patchEdgeI < nEdges(); patchEdgeI++)
-//        {
-//            label faceI = edgeFaces()[patchEdgeI][0];
-//
-//            edgeFace[patchEdgeI] = faceI;
-//
-//            const labelList& fEdges = faceEdges()[faceI];
-//
-//            edgeIndex[patchEdgeI] = findIndex(fEdges, patchEdgeI);
-//        }
-//
-//        OPstream toNeighbProc
-//        (
-//            Pstream::blocking,
-//            neighbProcNo(),
-//            8*sizeof(label)             // four headers of labelList
-//          + 2*nPoints()*sizeof(label)   // two point-based labellists
-//          + 2*nEdges()*sizeof(label)    // two edge-based labelLists
-//        );
-//
-//        toNeighbProc
-//            << pointFace
-//            << pointIndex
-//            << edgeFace
-//            << edgeIndex;
-//    }
+    if (Pstream::parRun())
+    {
+        // Express all points as patch face and index in face.
+        labelList pointFace(nPoints());
+        labelList pointIndex(nPoints());
+
+        for (label patchPointI = 0; patchPointI < nPoints(); patchPointI++)
+        {
+            label faceI = pointFaces()[patchPointI][0];
+
+            pointFace[patchPointI] = faceI;
+
+            const face& f = localFaces()[faceI];
+
+            pointIndex[patchPointI] = findIndex(f, patchPointI);
+        }
+
+        // Express all edges as patch face and index in face.
+        labelList edgeFace(nEdges());
+        labelList edgeIndex(nEdges());
+
+        for (label patchEdgeI = 0; patchEdgeI < nEdges(); patchEdgeI++)
+        {
+            label faceI = edgeFaces()[patchEdgeI][0];
+
+            edgeFace[patchEdgeI] = faceI;
+
+            const labelList& fEdges = faceEdges()[faceI];
+
+            edgeIndex[patchEdgeI] = findIndex(fEdges, patchEdgeI);
+        }
+
+        UOPstream toNeighbProc(neighbProcNo(), pBufs);
+
+        toNeighbProc
+            << pointFace
+            << pointIndex
+            << edgeFace
+            << edgeIndex;
+    }
 }
 
 
@@ -438,187 +279,126 @@ void Foam::processorPolyPatch::updateMesh(PstreamBuffers& pBufs)
     // For completeness
     polyPatch::updateMesh(pBufs);
 
-//    if (Pstream::parRun())
-//    {
-//        labelList nbrPointFace;
-//        labelList nbrPointIndex;
-//        labelList nbrEdgeFace;
-//        labelList nbrEdgeIndex;
-//
-//        {
-//            // Note cannot predict exact size since opposite nPoints might
-//            // be different from one over here.
-//            IPstream fromNeighbProc(Pstream::blocking, neighbProcNo());
-//
-//            fromNeighbProc
-//                >> nbrPointFace
-//                >> nbrPointIndex
-//                >> nbrEdgeFace
-//                >> nbrEdgeIndex;
-//        }
-//
-//        // Convert neighbour faces and indices into face back into
-//        // my edges and points.
-//
-//        // Convert points.
-//        // ~~~~~~~~~~~~~~~
-//
-//        neighbPointsPtr_ = new labelList(nPoints(), -1);
-//        labelList& neighbPoints = *neighbPointsPtr_;
-//
-//        forAll(nbrPointFace, nbrPointI)
-//        {
-//            // Find face and index in face on this side.
-//            const face& f = localFaces()[nbrPointFace[nbrPointI]];
-//            label index = (f.size() - nbrPointIndex[nbrPointI]) % f.size();
-//            label patchPointI = f[index];
-//
-//            if (neighbPoints[patchPointI] == -1)
-//            {
-//                // First reference of point
-//                neighbPoints[patchPointI] = nbrPointI;
-//            }
-//            else if (neighbPoints[patchPointI] >= 0)
-//            {
-//                // Point already visited. Mark as duplicate.
-//                neighbPoints[patchPointI] = -2;
-//            }
-//        }
-//
-//        // Reset all duplicate entries to -1.
-//        forAll(neighbPoints, patchPointI)
-//        {
-//            if (neighbPoints[patchPointI] == -2)
-//            {
-//                neighbPoints[patchPointI] = -1;
-//            }
-//        }
-//
-//        // Convert edges.
-//        // ~~~~~~~~~~~~~~
-//
-//        neighbEdgesPtr_ = new labelList(nEdges(), -1);
-//        labelList& neighbEdges = *neighbEdgesPtr_;
-//
-//        forAll(nbrEdgeFace, nbrEdgeI)
-//        {
-//            // Find face and index in face on this side.
-//            const labelList& f = faceEdges()[nbrEdgeFace[nbrEdgeI]];
-//            label index = (f.size() - nbrEdgeIndex[nbrEdgeI] - 1) % f.size();
-//            label patchEdgeI = f[index];
-//
-//            if (neighbEdges[patchEdgeI] == -1)
-//            {
-//                // First reference of edge
-//                neighbEdges[patchEdgeI] = nbrEdgeI;
-//            }
-//            else if (neighbEdges[patchEdgeI] >= 0)
-//            {
-//                // Edge already visited. Mark as duplicate.
-//                neighbEdges[patchEdgeI] = -2;
-//            }
-//        }
-//
-//        // Reset all duplicate entries to -1.
-//        forAll(neighbEdges, patchEdgeI)
-//        {
-//            if (neighbEdges[patchEdgeI] == -2)
-//            {
-//                neighbEdges[patchEdgeI] = -1;
-//            }
-//        }
-//
-//        // Remove any addressing used for shared points/edges calculation
-//        primitivePatch::clearOut();
-//    }
-}
+    neighbPointsPtr_.clear();
+    neighbEdgesPtr_.clear();
 
-
-//const Foam::labelList& Foam::processorPolyPatch::neighbPoints() const
-//{
-//    if (!neighbPointsPtr_)
-//    {
-//        FatalErrorIn("processorPolyPatch::neighbPoints() const")
-//            << "No extended addressing calculated for patch " << name()
-//            << abort(FatalError);
-//    }
-//    return *neighbPointsPtr_;
-//}
-//
-//
-//const Foam::labelList& Foam::processorPolyPatch::neighbEdges() const
-//{
-//    if (!neighbEdgesPtr_)
-//    {
-//        FatalErrorIn("processorPolyPatch::neighbEdges() const")
-//            << "No extended addressing calculated for patch " << name()
-//            << abort(FatalError);
-//    }
-//    return *neighbEdgesPtr_;
-//}
-
-
-const Foam::labelListList& Foam::processorPolyPatch::subMeshPoints() const
-{
-    if (!subMeshPointsPtr_.valid())
+    if (Pstream::parRun())
     {
-        subMeshPointsPtr_.reset(new labelListList(patchIDs_.size()));
-        labelListList& meshPoints = subMeshPointsPtr_();
+        labelList nbrPointFace;
+        labelList nbrPointIndex;
+        labelList nbrEdgeFace;
+        labelList nbrEdgeIndex;
 
-        forAll(patchIDs_, subI)
         {
-            meshPoints[subI] = subPatch(subI)().meshPoints();
+            // Note cannot predict exact size since opposite nPoints might
+            // be different from one over here.
+            IPstream fromNeighbProc(Pstream::blocking, neighbProcNo());
+
+            fromNeighbProc
+                >> nbrPointFace
+                >> nbrPointIndex
+                >> nbrEdgeFace
+                >> nbrEdgeIndex;
         }
-    }
-    return subMeshPointsPtr_();
-}
 
+        // Convert neighbour faces and indices into face back into
+        // my edges and points.
 
-const Foam::labelListList& Foam::processorPolyPatch::reverseSubMeshPoints()
- const
-{
-    if (!reverseSubMeshPointsPtr_.valid())
-    {
-        reverseSubMeshPointsPtr_.reset(new labelListList(patchIDs_.size()));
-        labelListList& meshPoints = reverseSubMeshPointsPtr_();
+        // Convert points.
+        // ~~~~~~~~~~~~~~~
+
+        neighbPointsPtr_.reset(new labelList(nPoints(), -1));
+        labelList& neighbPoints = neighbPointsPtr_();
 
-        forAll(patchIDs_, subI)
+        forAll(nbrPointFace, nbrPointI)
         {
-            label subStart = starts()[subI];
-            label subSize = starts()[subI+1]-subStart;
+            // Find face and index in face on this side.
+            const face& f = localFaces()[nbrPointFace[nbrPointI]];
+            label index = (f.size() - nbrPointIndex[nbrPointI]) % f.size();
+            label patchPointI = f[index];
 
-            faceList reverseFaces(subSize);
-            forAll(reverseFaces, i)
+            if (neighbPoints[patchPointI] == -1)
             {
-                reverseFaces[i] = operator[](subStart+i).reverseFace();
+                // First reference of point
+                neighbPoints[patchPointI] = nbrPointI;
+            }
+            else if (neighbPoints[patchPointI] >= 0)
+            {
+                // Point already visited. Mark as duplicate.
+                neighbPoints[patchPointI] = -2;
+            }
+        }
+
+        // Reset all duplicate entries to -1.
+        forAll(neighbPoints, patchPointI)
+        {
+            if (neighbPoints[patchPointI] == -2)
+            {
+                neighbPoints[patchPointI] = -1;
+            }
+        }
+
+        // Convert edges.
+        // ~~~~~~~~~~~~~~
+
+        neighbEdgesPtr_.reset(new labelList(nEdges(), -1));
+        labelList& neighbEdges = neighbEdgesPtr_();
+
+        forAll(nbrEdgeFace, nbrEdgeI)
+        {
+            // Find face and index in face on this side.
+            const labelList& f = faceEdges()[nbrEdgeFace[nbrEdgeI]];
+            label index = (f.size() - nbrEdgeIndex[nbrEdgeI] - 1) % f.size();
+            label patchEdgeI = f[index];
+
+            if (neighbEdges[patchEdgeI] == -1)
+            {
+                // First reference of edge
+                neighbEdges[patchEdgeI] = nbrEdgeI;
+            }
+            else if (neighbEdges[patchEdgeI] >= 0)
+            {
+                // Edge already visited. Mark as duplicate.
+                neighbEdges[patchEdgeI] = -2;
             }
-            meshPoints[subI] = primitivePatch
-            (
-                faceSubList
-                (
-                    reverseFaces,
-                    reverseFaces.size()
-                ),
-                points()
-            ).meshPoints();
         }
+
+        // Reset all duplicate entries to -1.
+        forAll(neighbEdges, patchEdgeI)
+        {
+            if (neighbEdges[patchEdgeI] == -2)
+            {
+                neighbEdges[patchEdgeI] = -1;
+            }
+        }
+
+        // Remove any addressing used for shared points/edges calculation
+        primitivePatch::clearOut();
     }
-    return reverseSubMeshPointsPtr_();
 }
 
 
-Foam::label Foam::processorPolyPatch::whichSubPatch(const label facei) const
+const Foam::labelList& Foam::processorPolyPatch::neighbPoints() const
 {
-    label index = findSortedIndex(starts_, facei);
+    if (!neighbPointsPtr_.valid())
+    {
+        FatalErrorIn("processorPolyPatch::neighbPoints() const")
+            << "No extended addressing calculated for patch " << name()
+            << abort(FatalError);
+    }
+    return neighbPointsPtr_();
+}
+
 
-    if (index < 0 || index >= starts_.size())
+const Foam::labelList& Foam::processorPolyPatch::neighbEdges() const
+{
+    if (!neighbEdgesPtr_.valid())
     {
-        FatalErrorIn("processorPolyPatch::whichSubPatch(const label) const")
-            << "Illegal local face index " << facei << " for patch " << name()
-            << endl << "Face index should be between 0 and "
-            << starts_[starts_.size()-1]-1 << abort(FatalError);
+        FatalErrorIn("processorPolyPatch::neighbEdges() const")
+            << "No extended addressing calculated for patch " << name()
+            << abort(FatalError);
     }
-    return patchIDs_[index];
+    return neighbEdgesPtr_();
 }
 
 
@@ -645,7 +425,7 @@ void Foam::processorPolyPatch::initOrder
         writeOBJ(nm, pp, pp.points());
 
         // Calculate my face centres
-        pointField ctrs(calcFaceCentres(pp, pp.points()));
+        const pointField& fc = pp.faceCentres();
 
         OFstream localStr
         (
@@ -653,24 +433,22 @@ void Foam::processorPolyPatch::initOrder
            /name() + "_localFaceCentres.obj"
         );
         Pout<< "processorPolyPatch::order : "
-            << "Dumping " << ctrs.size()
+            << "Dumping " << fc.size()
             << " local faceCentres to " << localStr.name() << endl;
 
-        forAll(ctrs, faceI)
+        forAll(fc, faceI)
         {
-            writeOBJ(localStr, ctrs[faceI]);
+            writeOBJ(localStr, fc[faceI]);
         }
     }
 
     if (owner())
     {
-        pointField ctrs(calcFaceCentres(pp, pp.points()));
-
         pointField anchors(getAnchorPoints(pp, pp.points()));
 
         // Now send all info over to the neighbour
         UOPstream toNeighbour(neighbProcNo(), pBufs);
-        toNeighbour << ctrs << anchors;
+        toNeighbour << pp.faceCentres() << anchors;
     }
 }
 
@@ -722,11 +500,8 @@ bool Foam::processorPolyPatch::order
             fromNeighbour >> masterCtrs >> masterAnchors;
         }
 
-        // Calculate my face centres
-        pointField ctrs(calcFaceCentres(pp, pp.points()));
-
         // Calculate typical distance from face centre
-        scalarField tols(calcFaceTol(pp, pp.points(), ctrs));
+        scalarField tols(calcFaceTol(pp, pp.points(), pp.faceCentres()));
 
         if (debug || masterCtrs.size() != pp.size())
         {
@@ -764,7 +539,14 @@ bool Foam::processorPolyPatch::order
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
         // 1. Try existing ordering and transformation
-        bool matchedAll = matchPoints(ctrs, masterCtrs, tols, true, faceMap);
+        bool matchedAll = matchPoints
+        (
+            pp.faceCentres(),
+            masterCtrs,
+            tols,
+            true,
+            faceMap
+        );
 
         if (!matchedAll || debug)
         {
@@ -791,14 +573,14 @@ bool Foam::processorPolyPatch::order
 
             label vertI = 0;
 
-            forAll(ctrs, faceI)
+            forAll(pp.faceCentres(), faceI)
             {
                 label masterFaceI = faceMap[faceI];
 
                 if (masterFaceI != -1)
                 {
                     const point& c0 = masterCtrs[masterFaceI];
-                    const point& c1 = ctrs[faceI];
+                    const point& c1 = pp.faceCentres()[faceI];
                     writeOBJ(ccStr, c0, c1, vertI);
                 }
             }
@@ -814,7 +596,7 @@ bool Foam::processorPolyPatch::order
                 << "Cannot match vectors to faces on both sides of patch"
                 << endl
                 << "    masterCtrs[0]:" << masterCtrs[0] << endl
-                << "    ctrs[0]:" << ctrs[0] << endl
+                << "    ctrs[0]:" << pp.faceCentres()[0] << endl
                 << "    Please check your topology changes or maybe you have"
                 << " multiple separated (from cyclics) processor patches"
                 << endl
@@ -883,10 +665,6 @@ void Foam::processorPolyPatch::write(Ostream& os) const
         << token::END_STATEMENT << nl;
     os.writeKeyword("neighbProcNo") << neighbProcNo_
         << token::END_STATEMENT << nl;
-    os.writeKeyword("patchIDs") << patchIDs_
-        << token::END_STATEMENT << nl;
-    os.writeKeyword("starts") << starts_
-        << token::END_STATEMENT << nl;
 }
 
 
diff --git a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/processor/processorPolyPatch.H b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/processor/processorPolyPatch.H
index 5eb71a9a69a..4c38476facb 100644
--- a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/processor/processorPolyPatch.H
+++ b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/processor/processorPolyPatch.H
@@ -34,7 +34,6 @@ Description
 
 SourceFiles
     processorPolyPatch.C
-    processorPolyPatchMorph.C
 
 \*---------------------------------------------------------------------------*/
 
@@ -63,14 +62,6 @@ class processorPolyPatch
         int myProcNo_;
         int neighbProcNo_;
 
-        // Per patch information
-
-            //- Originating patches
-            labelList patchIDs_;
-
-            //- Slice starts
-            labelList starts_;
-
         //- Processor-neighbbour patch face centres
         vectorField neighbFaceCentres_;
 
@@ -80,20 +71,13 @@ class processorPolyPatch
         //- Processor-neighbbour patch neighbour cell centres
         vectorField neighbFaceCellCentres_;
 
-        //- Corresponding mesh point per local point
-        mutable autoPtr<labelListList> subMeshPointsPtr_;
-
-        //- Corresponding mesh point per local point on reverse patch
-        mutable autoPtr<labelListList> reverseSubMeshPointsPtr_;
-
-//        //- Corresponding neighbouring local edge label for every local edge
-//        //  (so edges()[i] == neighb.edges()[neighbEdges_[i]])
-//        mutable labelList* neighbEdgesPtr_;
-
+        //- Corresponding neighbouring local point label for every local point
+        //  (so localPoints()[i] == neighb.localPoints()[neighbPoints_[i]])
+        mutable autoPtr<labelList> neighbPointsPtr_;
 
-    // Private member functions
-
-        void checkSubPatches() const;
+        //- Corresponding neighbouring local edge label for every local edge
+        //  (so edges()[i] == neighb.edges()[neighbEdges_[i]])
+        mutable autoPtr<labelList> neighbEdgesPtr_;
 
 protected:
 
@@ -102,18 +86,18 @@ protected:
         //- Initialise the calculation of the patch geometry
         void initGeometry(PstreamBuffers&);
 
-        //- Initialise the calculation of the patch geometry with externally
-        //  provided geometry
-        virtual void initGeometry
-        (
-            const primitivePatch& referPatch,
-            UList<point>&,
-            UList<point>&,
-            UList<point>&
-        )
-        {
-            notImplemented("processorPolyPatch::initGeometry(..)");
-        }
+//        //- Initialise the calculation of the patch geometry with externally
+//        //  provided geometry
+//        virtual void initGeometry
+//        (
+//            const primitivePatch& referPatch,
+//            UList<point>&,
+//            UList<point>&,
+//            UList<point>&
+//        )
+//        {
+//            notImplemented("processorPolyPatch::initGeometry(..)");
+//        }
 
         //- Calculate the patch geometry
         void calcGeometry(PstreamBuffers&);
@@ -164,9 +148,7 @@ public:
             const label index,
             const polyBoundaryMesh& bm,
             const int myProcNo,
-            const int neighbProcNo,
-            const labelList& patchIDs,
-            const labelList& starts
+            const int neighbProcNo
         );
 
         //- Construct from dictionary
@@ -179,11 +161,7 @@ public:
         );
 
         //- Construct as copy, resetting the boundary mesh
-        processorPolyPatch
-        (
-            const processorPolyPatch&,
-            const polyBoundaryMesh&
-        );
+        processorPolyPatch(const processorPolyPatch&, const polyBoundaryMesh&);
 
         //- Construct as given the original patch and resetting the
         //  face list and boundary mesh information
@@ -193,9 +171,7 @@ public:
             const polyBoundaryMesh& bm,
             const label index,
             const label newSize,
-            const label newStart,
-            const labelList& patchIDs,
-            const labelList& starts
+            const label newStart
         );
 
         //- Construct given the original patch and a map
@@ -221,9 +197,7 @@ public:
             const polyBoundaryMesh& bm,
             const label index,
             const label newSize,
-            const label newStart,
-            const labelList& patchIDs,
-            const labelList& starts
+            const label newStart
         ) const
         {
             return autoPtr<polyPatch>
@@ -234,9 +208,7 @@ public:
                     bm,
                     index,
                     newSize,
-                    newStart,
-                    patchIDs,
-                    starts
+                    newStart
                 )
             );
         }
@@ -296,16 +268,6 @@ public:
             return !owner();
         }
 
-        const labelList& patchIDs() const
-        {
-            return patchIDs_;
-        }
-
-        const labelList& starts() const
-        {
-            return starts_;
-        }
-
         //- Return processor-neighbbour patch face centres
         const vectorField& neighbFaceCentres() const
         {
@@ -324,37 +286,33 @@ public:
             return neighbFaceCellCentres_;
         }
 
-        //- Transform a patch-based field
-        template<class T>
-        void transform(Field<T>& l) const;
+        //- Return neighbour point labels. WIP.
+        const labelList& neighbPoints() const;
 
-        virtual void transform(scalarField& l) const
+        //- Return neighbour edge labels. WIP.
+        const labelList& neighbEdges() const;
+
+        //- Transform a patch-based field from other side to this side.
+        virtual bool doTransform() const
         {
-            transform(l);
+            return false;
         }
+        virtual void transform(scalarField& l) const
+        {}
         virtual void transform(vectorField& l) const
-        {
-            transform(l);
-        }
+        {}
         virtual void transform(sphericalTensorField& l) const
-        {
-            transform(l);
-        }
+        {}
         virtual void transform(diagTensorField& l) const
-        {
-            transform(l);
-        }
+        {}
         virtual void transform(symmTensorField& l) const
-        {
-            transform(l);
-        }
+        {}
         virtual void transform(tensorField& l) const
-        {
-            transform(l);
-        }
+        {}
 
-        //- Transform a patch-based position
-        virtual void transformPosition(pointField& l) const;
+        //- Transform a patch-based position from other side to this side
+        virtual void transformPosition(pointField& l) const
+        {}
 
         //- Are the planes separated.
         virtual bool separated() const
@@ -373,24 +331,7 @@ public:
         //- Are the cyclic planes parallel.
         virtual bool parallel() const
         {
-            forAll(patchIDs_, i)
-            {
-                label patchI = patchIDs_[i];
-
-                if (patchI != -1)
-                {
-                    if
-                    (
-                       !refCast<const coupledPolyPatch>
-                        (
-                            boundaryMesh()[patchI]
-                        ).parallel()
-                    )
-                    {
-                        return false;
-                    }
-                }
-            }
+            notImplemented("processorPolyPatch::parallel()");
             return true;
         }
 
@@ -408,104 +349,6 @@ public:
             return tensor::zero;
         }
 
-        //- Find sub patch for local face. -1 for internal faces or label of
-        //  cyclic patch.
-        label whichSubPatch(const label facei) const;
-
-        //- Slice patch
-        autoPtr<primitivePatch> subPatch(const label subI) const
-        {
-            const faceList& thisFaces = static_cast<const faceList&>(*this);
-
-            return autoPtr<primitivePatch>
-            (
-                new primitivePatch
-                (
-                    faceSubList
-                    (
-                        thisFaces,
-                        this->starts_[subI+1]-this->starts_[subI],
-                        this->starts_[subI]
-                    ),
-                    this->points()
-                )
-            );
-        }
-
-        //- Slice patchlist to subpatch
-        template<class T>
-        const typename List<T>::subList subSlice
-        (
-            const UList<T>& l,
-            const label subI
-        ) const
-        {
-            return typename List<T>::subList
-            (
-                l,
-                this->starts_[subI+1]-this->starts_[subI],
-                this->starts_[subI]
-            );
-        }
-
-        //- Slice patchlist to subpatch
-        template<class T>
-        typename List<T>::subList subSlice
-        (
-            UList<T>& l,
-            const label subI
-        )
-        {
-            return typename List<T>::subList
-            (
-                l,
-                this->starts_[subI+1]-this->starts_[subI],
-                this->starts_[subI]
-            );
-        }
-
-        //- Slice patchField to subpatch
-        template<class T>
-        const typename Field<T>::subField subSlice
-        (
-            const Field<T>& l,
-            const label subI
-        ) const
-        {
-            return typename Field<T>::subList
-            (
-                l,
-                this->starts_[subI+1]-this->starts_[subI],
-                this->starts_[subI]
-            );
-        }
-
-        //- Slice patchField to subpatch
-        template<class T>
-        typename Field<T>::subField subSlice
-        (
-            Field<T>& l,
-            const label subI
-        )
-        {
-            return typename Field<T>::subList
-            (
-                l,
-                this->starts_[subI+1]-this->starts_[subI],
-                this->starts_[subI]
-            );
-        }
-
-//        //- Return neighbour edge labels. This is for my local edge (-1 or) the
-//        //  corresponding local edge on the other side. See above for -1 cause.
-//        const labelList& neighbEdges() const;
-
-        //- Mesh point labels per local point per sub patch.
-        const labelListList& subMeshPoints() const;
-
-        //- Mesh point labels per local point on reversed faces per sub patch.
-        const labelListList& reverseSubMeshPoints() const;
-
         //- Initialize ordering for primitivePatch. Does not
         //  refer to *this (except for name() and type() etc.)
         virtual void initOrder(PstreamBuffers&, const primitivePatch&) const;
@@ -535,12 +378,6 @@ public:
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-#ifdef NoRepository
-#   include "processorPolyPatchTemplates.C"
-#endif
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
 #endif
 
 // ************************************************************************* //
diff --git a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/processorCyclic/processorCyclicPolyPatch.C b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/processorCyclic/processorCyclicPolyPatch.C
new file mode 100644
index 00000000000..58bc55b0da0
--- /dev/null
+++ b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/processorCyclic/processorCyclicPolyPatch.C
@@ -0,0 +1,227 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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 "processorCyclicPolyPatch.H"
+#include "SubField.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+//namespace Foam
+//{
+//    defineTypeNameAndDebug(processorCyclicPolyPatch, 0);
+//    addToRunTimeSelectionTable(polyPatch, processorCyclicPolyPatch, dictionary);
+//}
+
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+Foam::processorCyclicPolyPatch::processorCyclicPolyPatch
+(
+    const word& name,
+    const label size,
+    const label start,
+    const label index,
+    const polyBoundaryMesh& bm,
+    const int myProcNo,
+    const int neighbProcNo,
+    const word& referPatchName
+)
+:
+    processorPolyPatch(name, size, start, index, bm, myProcNo, neighbProcNo),
+    referPatchName_(referPatchName),
+    referPatchID_(-1)
+{}
+
+
+Foam::processorCyclicPolyPatch::processorCyclicPolyPatch
+(
+    const word& name,
+    const dictionary& dict,
+    const label index,
+    const polyBoundaryMesh& bm
+)
+:
+    processorPolyPatch(name, dict, index, bm),
+    referPatchName_(dict.lookup("referPatch")),
+    referPatchID_(-1)
+{}
+
+
+Foam::processorCyclicPolyPatch::processorCyclicPolyPatch
+(
+    const processorCyclicPolyPatch& pp,
+    const polyBoundaryMesh& bm
+)
+:
+    processorPolyPatch(pp, bm),
+    referPatchName_(pp.referPatchName()),
+    referPatchID_(-1)
+{}
+
+
+Foam::processorCyclicPolyPatch::processorCyclicPolyPatch
+(
+    const processorCyclicPolyPatch& pp,
+    const polyBoundaryMesh& bm,
+    const label index,
+    const label newSize,
+    const label newStart,
+    const word& referPatchName
+)
+:
+    processorPolyPatch(pp, bm, index, newSize, newStart),
+    referPatchName_(referPatchName),
+    referPatchID_(-1)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::processorCyclicPolyPatch::~processorCyclicPolyPatch()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+
+void Foam::processorCyclicPolyPatch::initGeometry(PstreamBuffers& pBufs)
+{
+Pout<< "**processorCyclicPolyPatch::initGeometry()" << endl;
+
+    // Send over processorPolyPatch data
+    processorPolyPatch::initGeometry(pBufs);
+}
+
+
+void Foam::processorCyclicPolyPatch::calcGeometry(PstreamBuffers& pBufs)
+{
+Pout<< "processorCyclicPolyPatch::calcGeometry() for " << name() << endl;
+
+    // Receive and initialise processorPolyPatch data
+    processorPolyPatch::calcGeometry(pBufs);
+
+    if (Pstream::parRun())
+    {
+
+        // Where do we store the calculated transformation?
+        // - on the processor patch?
+        // - on the underlying cyclic patch?
+        // - or do we not auto-calculate the transformation but
+        //   have option of reading it.
+
+        // Update underlying cyclic
+        coupledPolyPatch& pp = const_cast<coupledPolyPatch&>(referPatch());
+
+        Pout<< "updating geometry on refered patch:" << pp.name() << endl;
+
+        pp.calcGeometry
+        (
+            pp,
+            faceCentres(),
+            faceAreas(),
+            faceCellCentres(),
+            neighbFaceCentres(),
+            neighbFaceAreas(),
+            neighbFaceCellCentres()
+        );
+    }
+}
+
+
+void Foam::processorCyclicPolyPatch::initMovePoints
+(
+    PstreamBuffers& pBufs,
+    const pointField& p
+)
+{
+    // Recalculate geometry
+    initGeometry(pBufs);
+}
+
+
+void Foam::processorCyclicPolyPatch::movePoints
+(
+    PstreamBuffers& pBufs,
+    const pointField&
+)
+{
+    calcGeometry(pBufs);
+}
+
+
+void Foam::processorCyclicPolyPatch::initUpdateMesh(PstreamBuffers& pBufs)
+{
+    processorPolyPatch::initUpdateMesh(pBufs);
+}
+
+
+void Foam::processorCyclicPolyPatch::updateMesh(PstreamBuffers& pBufs)
+{
+     referPatchID_ = -1;
+     processorPolyPatch::updateMesh(pBufs);
+}
+
+
+void Foam::processorCyclicPolyPatch::initOrder
+(
+    PstreamBuffers& pBufs,
+    const primitivePatch& pp
+) const
+{
+    // For now use the same algorithm as processorPolyPatch
+    processorPolyPatch::initOrder(pBufs, pp);
+}
+
+
+// Return new ordering. Ordering is -faceMap: for every face index
+// the new face -rotation:for every new face the clockwise shift
+// of the original face. Return false if nothing changes (faceMap
+// is identity, rotation is 0)
+bool Foam::processorCyclicPolyPatch::order
+(
+    PstreamBuffers& pBufs,
+    const primitivePatch& pp,
+    labelList& faceMap,
+    labelList& rotation
+) const
+{
+    // For now use the same algorithm as processorPolyPatch
+    return processorPolyPatch::order(pBufs, pp, faceMap, rotation);
+}
+
+
+void Foam::processorCyclicPolyPatch::write(Ostream& os) const
+{
+    processorPolyPatch::write(os);
+    os.writeKeyword("referPatch") << referPatchName_
+        << token::END_STATEMENT << nl;
+}
+
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/processorCyclic/processorCyclicPolyPatch.H b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/processorCyclic/processorCyclicPolyPatch.H
new file mode 100644
index 00000000000..56eda5801cb
--- /dev/null
+++ b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/processorCyclic/processorCyclicPolyPatch.H
@@ -0,0 +1,339 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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::processorCyclicPolyPatch
+
+Description
+    Neighbour processor patch.
+
+    Note: morph patch face ordering is geometric.
+
+SourceFiles
+    processorCyclicPolyPatch.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef processorCyclicPolyPatch_H
+#define processorCyclicPolyPatch_H
+
+#include "processorPolyPatch.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                           Class processorCyclicPolyPatch Declaration
+\*---------------------------------------------------------------------------*/
+
+class processorCyclicPolyPatch
+:
+    public processorPolyPatch
+{
+    // Private data
+
+        //- Name of originating patch
+        const word referPatchName_;
+
+        //- Index of originating patch
+        mutable label referPatchID_;
+
+
+    // Private member functions
+
+
+protected:
+
+    // Protected Member functions
+
+        //- Initialise the calculation of the patch geometry
+        void initGeometry(PstreamBuffers&);
+
+//        //- Initialise the calculation of the patch geometry with externally
+//        //  provided geometry
+//        virtual void initGeometry
+//        (
+//            const primitivePatch& referPatch,
+//            UList<point>&,
+//            UList<point>&,
+//            UList<point>&
+//        )
+//        {
+//            notImplemented("processorCyclicPolyPatch::initGeometry(..)");
+//        }
+
+        //- Calculate the patch geometry
+        void calcGeometry(PstreamBuffers&);
+
+        //- Calculate the patch geometry with externally
+        //  provided geometry
+        virtual void calcGeometry
+        (
+            const primitivePatch& referPatch,
+            const UList<point>& thisCtrs,
+            const UList<point>& thisAreas,
+            const UList<point>& thisCc,
+            const UList<point>& nbrCtrs,
+            const UList<point>& nbrAreas,
+            const UList<point>& nbrCc
+        )
+        {
+            notImplemented("processorCyclicPolyPatch::calcGeometry(..)");
+        }
+
+        //- Initialise the patches for moving points
+        void initMovePoints(PstreamBuffers&, const pointField&);
+
+        //- Correct patches after moving points
+        void movePoints(PstreamBuffers&, const pointField&);
+
+        //- Initialise the update of the patch topology
+        virtual void initUpdateMesh(PstreamBuffers&);
+
+        //- Update of the patch topology
+        virtual void updateMesh(PstreamBuffers&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("processorCyclic");
+
+
+    // Constructors
+
+        //- Construct from components
+        processorCyclicPolyPatch
+        (
+            const word& name,
+            const label size,
+            const label start,
+            const label index,
+            const polyBoundaryMesh& bm,
+            const int myProcNo,
+            const int neighbProcNo,
+            const word& referPatchName
+        );
+
+        //- Construct from dictionary
+        processorCyclicPolyPatch
+        (
+            const word& name,
+            const dictionary& dict,
+            const label index,
+            const polyBoundaryMesh&
+        );
+
+        //- Construct as copy, resetting the boundary mesh
+        processorCyclicPolyPatch
+        (
+            const processorCyclicPolyPatch&,
+            const polyBoundaryMesh&
+        );
+
+        //- Construct as given the original patch and resetting the
+        //  face list and boundary mesh information
+        processorCyclicPolyPatch
+        (
+            const processorCyclicPolyPatch& pp,
+            const polyBoundaryMesh& bm,
+            const label index,
+            const label newSize,
+            const label newStart,
+            const word& referPatchName
+        );
+
+        //- Construct and return a clone, resetting the boundary mesh
+        virtual autoPtr<polyPatch> clone(const polyBoundaryMesh& bm) const
+        {
+            return autoPtr<polyPatch>(new processorCyclicPolyPatch(*this, bm));
+        }
+
+        //- Construct and return a clone, resetting the face list
+        //  and boundary mesh
+        virtual autoPtr<polyPatch> clone
+        (
+            const polyBoundaryMesh& bm,
+            const label index,
+            const label newSize,
+            const label newStart,
+            const word& referPatchName
+        ) const
+        {
+            return autoPtr<polyPatch>
+            (
+                new processorCyclicPolyPatch
+                (
+                    refCast<const processorCyclicPolyPatch>(*this),
+                    bm,
+                    index,
+                    newSize,
+                    newStart,
+                    referPatchName
+                )
+            );
+        }
+
+
+    // Destructor
+
+        virtual ~processorCyclicPolyPatch();
+
+
+    // Member functions
+
+        const word& referPatchName() const
+        {
+            return referPatchName_;
+        }
+
+        //- Referring patchID.
+        label referPatchID() const
+        {
+            if (referPatchID_ == -1)
+            {
+                referPatchID_ = this->boundaryMesh().findPatchID
+                (
+                    referPatchName_
+                );
+                if (referPatchID_ == -1)
+                {
+                    FatalErrorIn
+                    (
+                        "processorCyclicPolyPatch::referPatchID() const"
+                    )   << "Illegal referPatch name " << referPatchName_
+                        << endl << "Valid patch names are "
+                        << this->boundaryMesh().names()
+                        << exit(FatalError);
+                }
+            }
+            return referPatchID_;
+        }
+
+        const coupledPolyPatch& referPatch() const
+        {
+            const polyPatch& pp = this->boundaryMesh()[referPatchID()];
+            return refCast<const processorCyclicPolyPatch>(pp);
+        }
+
+        //- Transform a patch-based field from other side to this side.
+        virtual bool doTransform() const
+        {
+            return referPatch().doTransform();
+        }
+        virtual void transform(scalarField& l) const
+        {
+            referPatch().transform(l);
+        }
+        virtual void transform(vectorField& l) const
+        {
+            referPatch().transform(l);
+        }
+        virtual void transform(sphericalTensorField& l) const
+        {
+            referPatch().transform(l);
+        }
+        virtual void transform(diagTensorField& l) const
+        {
+            referPatch().transform(l);
+        }
+        virtual void transform(symmTensorField& l) const
+        {
+            referPatch().transform(l);
+        }
+        virtual void transform(tensorField& l) const
+        {
+            referPatch().transform(l);
+        }
+
+        //- Transform a patch-based position from other side to this side
+        virtual void transformPosition(pointField& l) const
+        {
+            referPatch().transform(l);
+        }
+
+        //- Are the planes separated.
+        virtual bool separated() const
+        {
+            return referPatch().separated();
+        }
+
+        //- If the planes are separated the separation vector.
+        virtual const vector& separation() const
+        {
+            return referPatch().separation();
+        }
+
+        //- Are the cyclic planes parallel.
+        virtual bool parallel() const
+        {
+            return referPatch().parallel();
+        }
+
+        //- Return face transformation tensor.
+        virtual const tensor& forwardT() const
+        {
+            return referPatch().forwardT();
+        }
+
+        //- Return neighbour-cell transformation tensor.
+        virtual const tensor& reverseT() const
+        {
+            return referPatch().reverseT();
+        }
+
+        //- Initialize ordering for primitivePatch. Does not
+        //  refer to *this (except for name() and type() etc.)
+        virtual void initOrder(PstreamBuffers&, const primitivePatch&) const;
+
+        //- Return new ordering for primitivePatch.
+        //  Ordering is -faceMap: for every face
+        //  index of the new face -rotation:for every new face the clockwise
+        //  shift of the original face. Return false if nothing changes
+        //  (faceMap is identity, rotation is 0), true otherwise.
+        virtual bool order
+        (
+            PstreamBuffers&,
+            const primitivePatch&,
+            labelList& faceMap,
+            labelList& rotation
+        ) const;
+
+
+        //- Write the polyPatch data as a dictionary
+        virtual void write(Ostream&) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/meshes/polyMesh/polyPatches/polyPatch/polyPatch.H b/src/OpenFOAM/meshes/polyMesh/polyPatches/polyPatch/polyPatch.H
index 5694e538234..951919d2409 100644
--- a/src/OpenFOAM/meshes/polyMesh/polyPatches/polyPatch/polyPatch.H
+++ b/src/OpenFOAM/meshes/polyMesh/polyPatches/polyPatch/polyPatch.H
@@ -90,8 +90,8 @@ class polyPatch
 
     // Private Member Functions
 
-        //- Calculate labels of mesh edges
-        void calcMeshEdges() const;
+//        //- Calculate labels of mesh edges
+//        void calcMeshEdges() const;
 
 
 protected:
diff --git a/src/OpenFOAM/meshes/polyMesh/syncTools/syncTools.H b/src/OpenFOAM/meshes/polyMesh/syncTools/syncTools.H
index bdcf2da482f..d38bd5b2623 100644
--- a/src/OpenFOAM/meshes/polyMesh/syncTools/syncTools.H
+++ b/src/OpenFOAM/meshes/polyMesh/syncTools/syncTools.H
@@ -100,11 +100,14 @@ public:
         class transform
         {
         public:
+            //- Transform Field
             template<class T>
             void operator()(const coupledPolyPatch& cpp, Field<T>& fld) const
             {
                 cpp.transform(fld);
             }
+
+            //- Transform generic container
             template<class T, template<class> class Container>
             void operator()(const coupledPolyPatch& cpp, Container<T>& map)
             const
diff --git a/src/OpenFOAM/meshes/polyMesh/syncTools/syncToolsTemplates.C b/src/OpenFOAM/meshes/polyMesh/syncTools/syncToolsTemplates.C
index e00b85ff166..7a41c7c90bb 100644
--- a/src/OpenFOAM/meshes/polyMesh/syncTools/syncToolsTemplates.C
+++ b/src/OpenFOAM/meshes/polyMesh/syncTools/syncToolsTemplates.C
@@ -114,43 +114,23 @@ void Foam::syncTools::syncPointMap
                 const processorPolyPatch& procPatch =
                     refCast<const processorPolyPatch>(patches[patchI]);
 
-                //TBD: optimisation for single subpatch.
+                // Get data per patchPoint in neighbouring point numbers.
 
-                List<Map<T> > patchInfo(procPatch.patchIDs().size());
+                const labelList& meshPts = procPatch.meshPoints();
+                const labelList& nbrPts = procPatch.neighbPoints();
 
-                forAll(procPatch.patchIDs(), subI)
-                {
-                    label subPatchI = procPatch.patchIDs()[subI];
+                // Extract local values. Create map from nbrPoint to value.
+                // Note: how small initial size?
+                Map<T> patchInfo(meshPts.size() / 20);
 
-                    const labelList& subMeshPts =
-                        procPatch.subMeshPoints()[subI];
+                forAll(meshPts, i)
+                {
+                    typename Map<T>::const_iterator iter =
+                        pointValues.find(meshPts[i]);
 
-                    Map<T>& subPatchInfo = patchInfo[subI];
-                    subPatchInfo.resize(subMeshPts.size()/20);
-                    forAll(subMeshPts, patchPointI)
+                    if (iter != pointValues.end())
                     {
-                        label pointI = subMeshPts[patchPointI];
-
-                        typename Map<T>::const_iterator iter =
-                            pointValues.find(pointI);
-
-                        if (iter != pointValues.end())
-                        {
-                            subPatchInfo.insert(patchPointI, iter());
-                        }
-                    }
-
-                    if (subPatchI != -1)
-                    {
-                        // Apply transform.
-                        top
-                        (
-                            refCast<const coupledPolyPatch>
-                            (
-                                patches[subPatchI]
-                            ),
-                            subPatchInfo
-                        );
+                        patchInfo.insert(nbrPts[i], iter());
                     }
                 }
 
@@ -173,34 +153,29 @@ void Foam::syncTools::syncPointMap
                 const processorPolyPatch& procPatch =
                     refCast<const processorPolyPatch>(patches[patchI]);
 
-                List<Map<T> > nbrPatchInfo;
-                {
-                    IPstream fromNbr
-                    (
-                        Pstream::blocking,
-                        procPatch.neighbProcNo()
-                    );
-                    fromNbr >> nbrPatchInfo;
-                }
+                IPstream fromNb(Pstream::blocking, procPatch.neighbProcNo());
+                Map<T> nbrPatchInfo(fromNb);
 
-                forAll(procPatch.patchIDs(), subI)
-                {
-                    const labelList& subMeshPts =
-                        procPatch.reverseSubMeshPoints()[subI];
+                // Transform
+                top(procPatch, nbrPatchInfo);
 
-                    const Map<T>& nbrSubInfo = nbrPatchInfo[subI];
+                const labelList& meshPts = procPatch.meshPoints();
 
-                    forAllConstIter(typename Map<T>, nbrSubInfo, iter)
-                    {
-                        label meshPointI = subMeshPts[iter.key()];
-                        combine
-                        (
-                            pointValues,
-                            cop,
-                            meshPointI,
-                            iter()
-                        );
-                    }
+                // Only update those values which come from neighbour
+                forAllConstIter
+                (
+                    typename Map<T>,
+                    nbrPatchInfo,
+                    nbrIter
+                )
+                {
+                    combine
+                    (
+                        pointValues,
+                        cop,
+                        meshPts[nbrIter.key()],
+                        nbrIter()
+                    );
                 }
             }
         }
@@ -217,6 +192,7 @@ void Foam::syncTools::syncPointMap
             if (cycPatch.owner())
             {
                 // Owner does all.
+
                 const cyclicPolyPatch& nbrPatch = cycPatch.neighbPatch();
                 const edgeList& coupledPoints = cycPatch.coupledPoints();
                 const labelList& meshPtsA = cycPatch.meshPoints();
@@ -247,9 +223,9 @@ void Foam::syncTools::syncPointMap
                     }
                 }
 
-                // Transform
-                top(cycPatch, half0Values);
-                top(nbrPatch, half1Values);
+                // Transform to receiving side
+                top(cycPatch, half1Values);
+                top(nbrPatch, half0Values);
 
                 forAll(coupledPoints, i)
                 {
@@ -365,7 +341,7 @@ void Foam::syncTools::syncPointMap
             }
             else
             {
-                // Send to master
+                // Slave: send to master
                 {
                     OPstream toMaster(Pstream::blocking, Pstream::masterNo());
                     toMaster << sharedPointValues;
@@ -453,56 +429,27 @@ void Foam::syncTools::syncEdgeMap
                 const processorPolyPatch& procPatch =
                     refCast<const processorPolyPatch>(patches[patchI]);
 
-                // Data per sub patch
-                List<EdgeMap<T> > patchInfo(procPatch.patchIDs().size());
 
-                forAll(procPatch.patchIDs(), subI)
-                {
-                    label subPatchI = procPatch.patchIDs()[subI];
-                    label subStart = procPatch.starts()[subI];
-                    label subSize = procPatch.starts()[subI+1]-subStart;
+                // Get data per patch edge in neighbouring edge.
 
-                    primitivePatch subPatch
-                    (
-                        faceSubList
-                        (
-                            procPatch,
-                            subSize,
-                            subStart
-                        ),
-                        procPatch.points()
-                    );  
-                    const labelList& subMeshPts = subPatch.meshPoints();
-                    const edgeList& subEdges = subPatch.edges();
-
-                    EdgeMap<T>& subPatchInfo = patchInfo[subI];
-                    subPatchInfo.resize(subEdges.size());
-
-                    forAll(subEdges, i)
-                    {
-                        const edge& e = subEdges[i];
-                        const edge meshEdge(subMeshPts[e[0]], subMeshPts[e[1]]);
+                const edgeList& edges = procPatch.edges();
+                const labelList& meshPts = procPatch.meshPoints();
+                const labelList& nbrPts = procPatch.neighbPoints();
 
-                        typename EdgeMap<T>::const_iterator iter =
-                            edgeValues.find(meshEdge);
+                EdgeMap<T> patchInfo(edges.size() / 20);
 
-                        if (iter != edgeValues.end())
-                        {
-                            subPatchInfo.insert(e, iter());
-                        }
-                    }
+                forAll(edges, i)
+                {
+                    const edge& e = edges[i];
+                    const edge meshEdge(meshPts[e[0]], meshPts[e[1]]);
+
+                    typename EdgeMap<T>::const_iterator iter =
+                        edgeValues.find(meshEdge);
 
-                    if (subPatchI != -1)
+                    if (iter != edgeValues.end())
                     {
-                        // Apply transform.
-                        top
-                        (
-                            refCast<const coupledPolyPatch>
-                            (
-                                patches[subPatchI]
-                            ),
-                            subPatchInfo
-                        );
+                        const edge nbrEdge(nbrPts[e[0]], nbrPts[e[1]]);
+                        patchInfo.insert(nbrEdge, iter());
                     }
                 }
 
@@ -525,7 +472,7 @@ void Foam::syncTools::syncEdgeMap
                 const processorPolyPatch& procPatch =
                     refCast<const processorPolyPatch>(patches[patchI]);
 
-                List<EdgeMap<T> > nbrPatchInfo;
+                EdgeMap<T> nbrPatchInfo;
                 {
                     IPstream fromNbr
                     (
@@ -535,26 +482,30 @@ void Foam::syncTools::syncEdgeMap
                     fromNbr >> nbrPatchInfo;
                 }
 
-                forAll(procPatch.patchIDs(), subI)
-                {
-                    const labelList& subMeshPts =
-                        procPatch.subMeshPoints()[subI];
+                // Apply transform to convert to this side properties.
+                top(procPatch, nbrPatchInfo);
 
-                    const EdgeMap<T>& nbrSubInfo = nbrPatchInfo[subI];
 
-                    forAllConstIter(typename EdgeMap<T>, nbrSubInfo, iter)
-                    {
-                        const edge& e = iter.key();
-                        const edge meshEdge(subMeshPts[e[0]], subMeshPts[e[1]]);
+                // Only update those values which come from neighbour
+                const labelList& meshPts = procPatch.meshPoints();
 
-                        combine
-                        (
-                            edgeValues,
-                            cop,
-                            meshEdge,   // edge
-                            iter()      // value
-                        );
-                    }
+                forAllConstIter
+                (
+                    typename EdgeMap<T>,
+                    nbrPatchInfo,
+                    nbrIter
+                )
+                {
+                    const edge& e = nbrIter.key();
+                    const edge meshEdge(meshPts[e[0]], meshPts[e[1]]);
+
+                    combine
+                    (
+                        edgeValues,
+                        cop,
+                        meshEdge,   // edge
+                        nbrIter()   // value
+                    );
                 }
             }
         }
@@ -616,9 +567,9 @@ void Foam::syncTools::syncEdgeMap
                     }
                 }
 
-                // Transform
-                top(cycPatch, half0Values);
-                top(nbrPatch, half1Values);
+                // Transform to this side
+                top(cycPatch, half1Values);
+                top(nbrPatch, half0Values);
 
 
                 // Extract and combine information
@@ -869,38 +820,16 @@ void Foam::syncTools::syncPointList
                 const processorPolyPatch& procPatch =
                     refCast<const processorPolyPatch>(patches[patchI]);
 
-                //TBD: optimisation for single subpatch.
+                // Get data per patchPoint in neighbouring point numbers.
+                Field<T> patchInfo(procPatch.nPoints());
 
-                // Data per sub patch
-                List<List<T> > patchInfo(procPatch.patchIDs().size());
+                const labelList& meshPts = procPatch.meshPoints();
+                const labelList& nbrPts = procPatch.neighbPoints();
 
-                forAll(procPatch.patchIDs(), subI)
+                forAll(nbrPts, pointI)
                 {
-                    label subPatchI = procPatch.patchIDs()[subI];
-
-                    const labelList& subMeshPts =
-                        procPatch.subMeshPoints()[subI];
-
-                    List<T>& subPatchInfo = patchInfo[subI];
-                    subPatchInfo.setSize(subMeshPts.size());
-                    forAll(subPatchInfo, i)
-                    {
-                        subPatchInfo[i] = pointValues[subMeshPts[i]];
-                    }
-
-                    if (subPatchI != -1)
-                    {
-                        // Apply transform.
-                        SubField<T> slice(subPatchInfo, subPatchInfo.size());
-                        top
-                        (
-                            refCast<const coupledPolyPatch>
-                            (
-                                patches[subPatchI]
-                            ),
-                            reinterpret_cast<Field<T>&>(slice)
-                        );
-                    }
+                    label nbrPointI = nbrPts[pointI];
+                    patchInfo[nbrPointI] = pointValues[meshPts[pointI]];
                 }
 
                 OPstream toNbr(Pstream::blocking, procPatch.neighbProcNo());
@@ -922,10 +851,8 @@ void Foam::syncTools::syncPointList
                 const processorPolyPatch& procPatch =
                     refCast<const processorPolyPatch>(patches[patchI]);
 
-                List<List<T> > nbrPatchInfo;
+                Field<T> nbrPatchInfo(procPatch.nPoints());
                 {
-                    // We do not know the number of points on the other side
-                    // so cannot use Pstream::read.
                     IPstream fromNbr
                     (
                         Pstream::blocking,
@@ -934,17 +861,15 @@ void Foam::syncTools::syncPointList
                     fromNbr >> nbrPatchInfo;
                 }
 
-                forAll(procPatch.patchIDs(), subI)
-                {
-                    const labelList& subMeshPts =
-                        procPatch.reverseSubMeshPoints()[subI];
-                    const List<T>& nbrSubInfo = nbrPatchInfo[subI];
+                // Transform to this side
+                top(procPatch, nbrPatchInfo);
 
-                    forAll(subMeshPts, i)
-                    {
-                        label meshPointI = subMeshPts[i];
-                        cop(pointValues[meshPointI], nbrSubInfo[i]);
-                    }
+                const labelList& meshPts = procPatch.meshPoints();
+
+                forAll(meshPts, pointI)
+                {
+                    label meshPointI = meshPts[pointI];
+                    cop(pointValues[meshPointI], nbrPatchInfo[pointI]);
                 }
             }
         }
@@ -979,11 +904,11 @@ void Foam::syncTools::syncPointList
 
                 //SubField<T> slice0(half0Values, half0Values.size());
                 //SubField<T> slice1(half1Values, half1Values.size());
-                //top(cycPatch, reinterpret_cast<Field<T>&>(slice0));
-                //top(nbrPatch, reinterpret_cast<Field<T>&>(slice1));
+                //top(cycPatch, reinterpret_cast<Field<T>&>(slice1));
+                //top(nbrPatch, reinterpret_cast<Field<T>&>(slice0));
 
-                top(cycPatch, half0Values);
-                top(nbrPatch, half1Values);
+                top(cycPatch, half1Values);
+                top(nbrPatch, half0Values);
 
                 forAll(coupledPoints, i)
                 {
@@ -1001,7 +926,7 @@ void Foam::syncTools::syncPointList
     if (pd.nGlobalPoints() > 0)
     {
         // Values on shared points.
-        List<T> sharedPts(pd.nGlobalPoints(), nullValue);
+        Field<T> sharedPts(pd.nGlobalPoints(), nullValue);
 
         forAll(pd.sharedPointLabels(), i)
         {
@@ -1053,7 +978,7 @@ void Foam::syncTools::syncPointList
         return;
     }
 
-    List<T> meshValues(mesh.nPoints(), nullValue);
+    Field<T> meshValues(mesh.nPoints(), nullValue);
 
     forAll(meshPoints, i)
     {
@@ -1120,56 +1045,17 @@ void Foam::syncTools::syncEdgeList
                 const processorPolyPatch& procPatch =
                     refCast<const processorPolyPatch>(patches[patchI]);
 
-                //TBD: optimisation for single subpatch.
+                const labelList& meshEdges = procPatch.meshEdges();
+                const labelList& neighbEdges = procPatch.neighbEdges();
 
-                // Data per sub patch
-                List<List<T> > patchInfo(procPatch.patchIDs().size());
+                // Get region per patch edge in neighbouring edge numbers.
+                Field<T> patchInfo(procPatch.nEdges(), nullValue);
 
-                forAll(procPatch.patchIDs(), subI)
+                forAll(neighbEdges, edgeI)
                 {
-                    label subPatchI = procPatch.patchIDs()[subI];
-                    label subStart = procPatch.starts()[subI];
-                    label subSize = procPatch.starts()[subI+1]-subStart;
-
-                    primitivePatch subPatch
-                    (
-                        faceSubList
-                        (
-                            procPatch,
-                            subSize,
-                            subStart
-                        ),
-                        procPatch.points()
-                    );
-                    labelList subMeshEdges
-                    (
-                        subPatch.meshEdges
-                        (
-                            mesh.edges(),
-                            mesh.pointEdges()
-                        )
-                    );
+                    label nbrEdgeI = neighbEdges[edgeI];
 
-                    List<T>& subPatchInfo = patchInfo[subI];
-                    subPatchInfo.setSize(subMeshEdges.size());
-                    forAll(subPatchInfo, i)
-                    {
-                        subPatchInfo[i] = edgeValues[subMeshEdges[i]];
-                    }
-
-                    if (subPatchI != -1)
-                    {
-                        // Apply transform.
-                        SubField<T> slice(subPatchInfo, subPatchInfo.size());
-                        top
-                        (
-                            refCast<const coupledPolyPatch>
-                            (
-                                patches[subPatchI]
-                            ),
-                            reinterpret_cast<Field<T>&>(slice)
-                        );
-                    }
+                    patchInfo[nbrEdgeI] = edgeValues[meshEdges[edgeI]];
                 }
 
                 OPstream toNbr(Pstream::blocking, procPatch.neighbProcNo());
@@ -1190,8 +1076,11 @@ void Foam::syncTools::syncEdgeList
                 const processorPolyPatch& procPatch =
                     refCast<const processorPolyPatch>(patches[patchI]);
 
-                // Receive from neighbour. 
-                List<List<T> > nbrPatchInfo(procPatch.nEdges());
+                const labelList& meshEdges = procPatch.meshEdges();
+
+                // Receive from neighbour. Is per patch edge the region of the
+                // neighbouring patch edge.
+                Field<T> nbrPatchInfo(procPatch.nEdges());
 
                 {
                     IPstream fromNeighb
@@ -1202,41 +1091,13 @@ void Foam::syncTools::syncEdgeList
                     fromNeighb >> nbrPatchInfo;
                 }
 
-                forAll(procPatch.patchIDs(), subI)
-                {
-                    label subStart = procPatch.starts()[subI];
-                    label subSize = procPatch.starts()[subI+1]-subStart;
+                // Transform to this side
+                top(procPatch, nbrPatchInfo);
 
-                    faceList reverseFaces(subSize);
-                    forAll(reverseFaces, i)
-                    {
-                        reverseFaces[i] = procPatch[subStart+i].reverseFace();
-                    }
-                    primitivePatch subPatch
-                    (
-                        faceSubList
-                        (
-                            reverseFaces,
-                            reverseFaces.size()
-                        ),
-                        procPatch.points()
-                    );
-                    labelList subMeshEdges
-                    (
-                        subPatch.meshEdges
-                        (
-                            mesh.edges(),
-                            mesh.pointEdges()
-                        )
-                    );
-
-                    const List<T>& nbrSubInfo = nbrPatchInfo[subI];
-
-                    forAll(subMeshEdges, i)
-                    {
-                        label meshEdgeI = subMeshEdges[i];
-                        cop(edgeValues[meshEdgeI], nbrSubInfo[i]);
-                    }
+                forAll(meshEdges, edgeI)
+                {
+                    label meshEdgeI = meshEdges[edgeI];
+                    cop(edgeValues[meshEdgeI], nbrPatchInfo[edgeI]);
                 }
             }
         }
@@ -1270,11 +1131,11 @@ void Foam::syncTools::syncEdgeList
 
                 //SubField<T> slice0(half0Values, half0Values.size());
                 //SubField<T> slice1(half1Values, half1Values.size());
-                //top(cycPatch, reinterpret_cast<Field<T>&>(slice0));
-                //top(nbrPatch, reinterpret_cast<Field<T>&>(slice1));
+                //top(cycPatch, reinterpret_cast<Field<T>&>(slice1));
+                //top(nbrPatch, reinterpret_cast<Field<T>&>(slice0));
 
-                top(cycPatch, half0Values);
-                top(nbrPatch, half1Values);
+                top(cycPatch, half1Values);
+                top(nbrPatch, half0Values);
 
                 forAll(coupledEdges, i)
                 {
@@ -1296,7 +1157,7 @@ void Foam::syncTools::syncEdgeList
     if (pd.nGlobalEdges() > 0)
     {
         // Values on shared edges.
-        List<T> sharedPts(pd.nGlobalEdges(), nullValue);
+        Field<T> sharedPts(pd.nGlobalEdges(), nullValue);
 
         forAll(pd.sharedEdgeLabels(), i)
         {
@@ -1382,8 +1243,13 @@ void Foam::syncTools::syncBoundaryFaceList
                 else
                 {
                     OPstream toNbr(Pstream::blocking, procPatch.neighbProcNo());
-                    toNbr <<
-                        SubList<T>(faceValues, procPatch.size(), patchStart);
+                    toNbr << 
+                        SubField<T>
+                        (
+                            faceValues,
+                            procPatch.size(),
+                            patchStart
+                        );
                 }
             }
         }
@@ -1399,17 +1265,17 @@ void Foam::syncTools::syncBoundaryFaceList
              && patches[patchI].size() > 0
             )
             {
-                const processorPolyPatch& ppp =
+                const processorPolyPatch& procPatch =
                     refCast<const processorPolyPatch>(patches[patchI]);
 
-                List<T> nbrPatchInfo(ppp.size());
+                Field<T> nbrPatchInfo(procPatch.size());
 
                 if (contiguous<T>())
                 {
                     IPstream::read
                     (
                         Pstream::blocking,
-                        ppp.neighbProcNo(),
+                        procPatch.neighbProcNo(),
                         reinterpret_cast<char*>(nbrPatchInfo.begin()),
                         nbrPatchInfo.byteSize()
                     );
@@ -1419,33 +1285,14 @@ void Foam::syncTools::syncBoundaryFaceList
                     IPstream fromNeighb
                     (
                         Pstream::blocking,
-                        ppp.neighbProcNo()
+                        procPatch.neighbProcNo()
                     );
                     fromNeighb >> nbrPatchInfo;
                 }
 
-                // Apply any transforms
-                forAll(ppp.patchIDs(), i)
-                {
-                    label subPatchI = ppp.patchIDs()[i];
-                    label subStart = ppp.starts()[i];
-                    label subSize = ppp.starts()[i+1]-subStart;
+                top(procPatch, nbrPatchInfo);
 
-                    if (subPatchI != -1)
-                    {
-                        SubField<T> slice(nbrPatchInfo, subStart, subSize);
-                        top
-                        (
-                            refCast<const coupledPolyPatch>
-                            (
-                                patches[subPatchI]
-                            ),
-                            reinterpret_cast<Field<T>&>(slice)
-                        );
-                    }
-                }
-
-                label bFaceI = ppp.start()-mesh.nInternalFaces();
+                label bFaceI = procPatch.start()-mesh.nInternalFaces();
 
                 forAll(nbrPatchInfo, i)
                 {
@@ -1473,13 +1320,11 @@ void Foam::syncTools::syncBoundaryFaceList
                 label sz = cycPatch.size();
 
                 // Transform (copy of) data on both sides
-                Field<T> ownVals(SubList<T>(faceValues, sz, ownStart));
-                //SubField<T> ownSlice(ownVals, ownVals.size());
-                top(cycPatch, ownVals);
+                Field<T> ownVals(SubField<T>(faceValues, sz, ownStart));
+                top(nbrPatch, ownVals);
 
-                Field<T> nbrVals(SubList<T>(faceValues, sz, nbrStart));
-                //SubField<T> nbrSlice(nbrVals, nbrVals.size());
-                top(nbrPatch, nbrVals);
+                Field<T> nbrVals(SubField<T>(faceValues, sz, nbrStart));
+                top(cycPatch, nbrVals);
 
                 label i0 = ownStart;
                 forAll(nbrVals, i)
@@ -1526,10 +1371,6 @@ void Foam::syncTools::syncFaceList
         return;
     }
 
-    // Patch data (proc patches only) for ease of sending/receiving.
-    // Note:should just send slice of packedList itself.
-    List<List<unsigned int> > patchValues(patches.size());
-
     if (Pstream::parRun())
     {
         // Send
@@ -1545,14 +1386,14 @@ void Foam::syncTools::syncFaceList
                 const processorPolyPatch& procPatch =
                     refCast<const processorPolyPatch>(patches[patchI]);
 
-                patchValues[patchI].setSize(procPatch.size());
+                List<unsigned int> patchInfo(procPatch.size());
                 forAll(procPatch, i)
                 {
-                    patchValues[patchI][i] = faceValues[procPatch.start()+i];
+                    patchInfo[i] = faceValues[procPatch.start()+i];
                 }
 
                 OPstream toNbr(Pstream::blocking, procPatch.neighbProcNo());
-                toNbr << patchValues[patchI];
+                toNbr << patchInfo;
             }
         }
 
@@ -1570,19 +1411,20 @@ void Foam::syncTools::syncFaceList
                 const processorPolyPatch& procPatch =
                     refCast<const processorPolyPatch>(patches[patchI]);
 
+                List<unsigned int> patchInfo(procPatch.size());
                 {
                     IPstream fromNbr
                     (
                         Pstream::blocking,
                         procPatch.neighbProcNo()
                     );
-                    fromNbr >> patchValues[patchI];
+                    fromNbr >> patchInfo;
                 }
 
                 // Combine (bitwise)
                 forAll(procPatch, i)
                 {
-                    unsigned int patchVal = patchValues[patchI][i];
+                    unsigned int patchVal = patchInfo[i];
                     label meshFaceI = procPatch.start()+i;
                     unsigned int faceVal = faceValues[meshFaceI];
                     cop(faceVal, patchVal);
@@ -1679,19 +1521,15 @@ void Foam::syncTools::syncPointList
                 const processorPolyPatch& procPatch =
                     refCast<const processorPolyPatch>(patches[patchI]);
 
-                List<List<unsigned int> > patchInfo(procPatch.patchIDs().size());
+                List<unsigned int> patchInfo(procPatch.nPoints());
 
-                forAll(procPatch.patchIDs(), subI)
-                {
-                    const labelList& subMeshPts =
-                        procPatch.subMeshPoints()[subI];
+                const labelList& meshPts = procPatch.meshPoints();
+                const labelList& nbrPts = procPatch.neighbPoints();
 
-                    List<unsigned int>& subInfo = patchInfo[subI];
-                    subInfo.setSize(subMeshPts.size());
-                    forAll(subInfo, i)
-                    {
-                        subInfo[i] = pointValues[subMeshPts[i]];
-                    }
+                forAll(nbrPts, pointI)
+                {
+                    label nbrPointI = nbrPts[pointI];
+                    patchInfo[nbrPointI] = pointValues[meshPts[pointI]];
                 }
 
                 OPstream toNbr(Pstream::blocking, procPatch.neighbProcNo());
@@ -1713,7 +1551,7 @@ void Foam::syncTools::syncPointList
                 const processorPolyPatch& procPatch =
                     refCast<const processorPolyPatch>(patches[patchI]);
 
-                List<List<unsigned int> > nbrPatchInfo(procPatch.nPoints());
+                List<unsigned int> nbrPatchInfo(procPatch.nPoints());
                 {
                     // We do not know the number of points on the other side
                     // so cannot use Pstream::read.
@@ -1725,19 +1563,14 @@ void Foam::syncTools::syncPointList
                     fromNbr >> nbrPatchInfo;
                 }
 
-                forAll(procPatch.patchIDs(), subI)
-                {
-                    const labelList& subMeshPts =
-                        procPatch.reverseSubMeshPoints()[subI];
-                    const List<unsigned int>& nbrSubInfo = nbrPatchInfo[subI];
+                const labelList& meshPts = procPatch.meshPoints();
 
-                    forAll(subMeshPts, i)
-                    {
-                        label meshPointI = subMeshPts[i];
-                        unsigned int pointVal = pointValues[meshPointI];
-                        cop(pointVal, nbrSubInfo[i]);
-                        pointValues[meshPointI] = pointVal;
-                    }
+                forAll(meshPts, pointI)
+                {
+                    label meshPointI = meshPts[pointI];
+                    unsigned int pointVal = pointValues[meshPointI];
+                    cop(pointVal, nbrPatchInfo[pointI]);
+                    pointValues[meshPointI] = pointVal;
                 }
             }
         }
@@ -1852,38 +1685,15 @@ void Foam::syncTools::syncEdgeList
                 const processorPolyPatch& procPatch =
                     refCast<const processorPolyPatch>(patches[patchI]);
 
-                List<List<unsigned int> > patchInfo(procPatch.patchIDs().size());
+                List<unsigned int> patchInfo(procPatch.nEdges());
 
-                forAll(procPatch.patchIDs(), subI)
-                {
-                    label subStart = procPatch.starts()[subI];
-                    label subSize = procPatch.starts()[subI+1]-subStart;
-
-                    primitivePatch subPatch
-                    (
-                        faceSubList
-                        (
-                            procPatch,
-                            subSize,
-                            subStart
-                        ),
-                        procPatch.points()
-                    );
-                    labelList subMeshEdges
-                    (
-                        subPatch.meshEdges
-                        (
-                            mesh.edges(),
-                            mesh.pointEdges()
-                        )
-                    );
+                const labelList& meshEdges = procPatch.meshEdges();
+                const labelList& neighbEdges = procPatch.neighbEdges();
 
-                    List<unsigned int>& subPatchInfo = patchInfo[subI];
-                    subPatchInfo.setSize(subMeshEdges.size());
-                    forAll(subPatchInfo, i)
-                    {
-                        subPatchInfo[i] = edgeValues[subMeshEdges[i]];
-                    }
+                forAll(neighbEdges, edgeI)
+                {
+                    label nbrEdgeI = neighbEdges[edgeI];
+                    patchInfo[nbrEdgeI] = edgeValues[meshEdges[edgeI]];
                 }
 
                 OPstream toNbr(Pstream::blocking, procPatch.neighbProcNo());
@@ -1906,7 +1716,7 @@ void Foam::syncTools::syncEdgeList
                     refCast<const processorPolyPatch>(patches[patchI]);
 
                 // Receive from neighbour. 
-                List<List<unsigned int> > nbrPatchInfo(procPatch.nEdges());
+                List<unsigned int> nbrPatchInfo(procPatch.nEdges());
 
                 {
                     IPstream fromNeighb
@@ -1917,43 +1727,15 @@ void Foam::syncTools::syncEdgeList
                     fromNeighb >> nbrPatchInfo;
                 }
 
-                forAll(procPatch.patchIDs(), subI)
-                {
-                    label subStart = procPatch.starts()[subI];
-                    label subSize = procPatch.starts()[subI+1]-subStart;
-
-                    faceList reverseFaces(subSize);
-                    forAll(reverseFaces, i)
-                    {
-                        reverseFaces[i] = procPatch[subStart+i].reverseFace();
-                    }
-                    primitivePatch subPatch
-                    (
-                        faceSubList
-                        (
-                            reverseFaces,
-                            reverseFaces.size()
-                        ),
-                        procPatch.points()
-                    );
-                    labelList subMeshEdges
-                    (
-                        subPatch.meshEdges
-                        (
-                            mesh.edges(),
-                            mesh.pointEdges()
-                        )
-                    );
-
-                    const List<unsigned int>& nbrSubInfo = nbrPatchInfo[subI];
+                const labelList& meshEdges = procPatch.meshEdges();
 
-                    forAll(subMeshEdges, i)
-                    {
-                        label meshEdgeI = subMeshEdges[i];
-                        unsigned int edgeVal = edgeValues[meshEdgeI];
-                        cop(edgeVal, nbrSubInfo[i]);
-                        edgeValues[meshEdgeI] = edgeVal;
-                    }
+                forAll(meshEdges, edgeI)
+                {
+                    unsigned int patchVal = nbrPatchInfo[edgeI];
+                    label meshEdgeI = meshEdges[edgeI];
+                    unsigned int edgeVal = edgeValues[meshEdgeI];
+                    cop(edgeVal, patchVal);
+                    edgeValues[meshEdgeI] = edgeVal;
                 }
             }
         }
diff --git a/src/decompositionMethods/parMetisDecomp/parMetisDecomp.C b/src/decompositionMethods/parMetisDecomp/parMetisDecomp.C
index 13998ea4881..1a91c08aec1 100644
--- a/src/decompositionMethods/parMetisDecomp/parMetisDecomp.C
+++ b/src/decompositionMethods/parMetisDecomp/parMetisDecomp.C
@@ -898,7 +898,7 @@ void Foam::parMetisDecomp::calcMetisDistributedCSR
     }
 
     // Get the cell on the other side of coupled patches
-    syncTools::swapBoundaryFaceList(mesh, globalNeighbour, false);
+    syncTools::swapBoundaryFaceList(mesh, globalNeighbour);
 
 
     // Count number of faces (internal + coupled)
diff --git a/src/dynamicMesh/attachDetach/attachInterface.C b/src/dynamicMesh/attachDetach/attachInterface.C
index a140a975603..e09561be886 100644
--- a/src/dynamicMesh/attachDetach/attachInterface.C
+++ b/src/dynamicMesh/attachDetach/attachInterface.C
@@ -119,8 +119,7 @@ void Foam::attachDetach::attachInterface
                     -1,                              // patch for face
                     false,                           // remove from zone
                     faceZoneID_.index(),             // zone for face
-                    mfFlip[faceI],                   // face flip in zone
-                    -1                               // subpatch
+                    mfFlip[faceI]                    // face flip in zone
                 )
             );
         }
@@ -139,8 +138,7 @@ void Foam::attachDetach::attachInterface
                     -1,                           // patch for face
                     false,                        // remove from zone
                     faceZoneID_.index(),          // zone for face
-                    !mfFlip[faceI],               // face flip in zone
-                    -1                            // subpatch
+                    !mfFlip[faceI]                // face flip in zone
                 )
             );
         }
@@ -210,13 +208,10 @@ void Foam::attachDetach::attachInterface
                 ];
         }
 
-        labelPair patchIDs = polyTopoChange::whichPatch
-        (
-            mesh.boundaryMesh(),
-            curFaceID
-        );
+
+        label patchID = mesh.boundaryMesh().whichPatch(curFaceID);
         label neiCell;
-        if (patchIDs[0] == -1)
+        if (patchID == -1)
         {
             neiCell = nei[curFaceID];
         }
@@ -225,6 +220,7 @@ void Foam::attachDetach::attachInterface
             neiCell = -1;
         }
 
+
         // Modify the face
         ref.setAction
         (
@@ -235,11 +231,10 @@ void Foam::attachDetach::attachInterface
                 own[curFaceID],         // owner
                 neiCell,                // neighbour
                 false,                  // face flip
-                patchIDs[0],            // patch for face
+                patchID,                // patch for face
                 false,                  // remove from zone
                 modifiedFaceZone,       // zone for face
-                modifiedFaceZoneFlip,   // face flip in zone
-                patchIDs[1]
+                modifiedFaceZoneFlip    // face flip in zone
             )
         );
     }
@@ -265,7 +260,7 @@ void Foam::attachDetach::modifyMotionPoints
 
     if (debug)
     {
-        Pout<< "void attachDetach::modifyMotionPoints(" 
+        Pout<< "void attachDetach::modifyMotionPoints("
             << "pointField& motionPoints) const "
             << " for object " << name() << " : "
             << "Adjusting motion points." << endl;
diff --git a/src/dynamicMesh/attachDetach/detachInterface.C b/src/dynamicMesh/attachDetach/detachInterface.C
index 230f5db882f..19552171e0c 100644
--- a/src/dynamicMesh/attachDetach/detachInterface.C
+++ b/src/dynamicMesh/attachDetach/detachInterface.C
@@ -47,7 +47,7 @@ void Foam::attachDetach::detachInterface
     //    into the slave patch
     // 3. Create a point renumbering list, giving a new point index for original
     //    points in the face patch
-    // 4. Grab all faces in cells on the master side and renumber them 
+    // 4. Grab all faces in cells on the master side and renumber them
     //    using the point renumbering list.  Exclude the ones that belong to
     //    the master face zone
     //
@@ -211,8 +211,7 @@ void Foam::attachDetach::detachInterface
                     masterPatchID_.index(),         // patch for face
                     false,                          // remove from zone
                     faceZoneID_.index(),            // zone for face
-                    !mfFlip[faceI],                 // face flip in zone
-                    -1                              // sub patch
+                    !mfFlip[faceI]                  // face flip in zone
                 )
             );
 
@@ -231,8 +230,7 @@ void Foam::attachDetach::detachInterface
                     false,                          // flip flux
                     slavePatchID_.index(),          // patch to add the face to
                     -1,                             // zone for face
-                    false,                          // zone flip
-                    -1                              // sub patch
+                    false                           // zone flip
                 )
             );
             //{
@@ -260,8 +258,7 @@ void Foam::attachDetach::detachInterface
                     masterPatchID_.index(),   // patch for face
                     false,                    // remove from zone
                     faceZoneID_.index(),      // zone for face
-                    mfFlip[faceI],            // face flip in zone
-                    -1                        // sub patch
+                    mfFlip[faceI]             // face flip in zone
                 )
             );
 
@@ -280,8 +277,7 @@ void Foam::attachDetach::detachInterface
                     true,                           // flip flux
                     slavePatchID_.index(),          // patch to add the face to
                     -1,                             // zone for face
-                    false,                          // face flip in zone
-                    -1                              // sub patch
+                    false                           // face flip in zone
                 )
             );
             //{
@@ -442,8 +438,7 @@ void Foam::attachDetach::detachInterface
                         -1,                         // patch for face
                         false,                      // remove from zone
                         -1,                         // zone for face
-                        false,                      // face zone flip
-                        -1                          // sub patch
+                        false                       // face zone flip
                     )
                 );
 // Pout << "modifying stick-out face. Internal Old face: " << oldFace << " new face: " << newFace << " own: " << own[curFaceID] << " nei: " << nei[curFaceID] << endl;
@@ -462,12 +457,11 @@ void Foam::attachDetach::detachInterface
                         mesh.boundaryMesh().whichPatch(curFaceID), // patch
                         false,                        // remove from zone
                         -1,                           // zone for face
-                        false,                        // face zone flip
-                        -1                            // sub patch
+                        false                         // face zone flip
                     )
-                );   
+                );
 // Pout << "modifying stick-out face. Boundary Old face: " << oldFace << " new face: " << newFace << " own: " << own[curFaceID] << " patch: " << mesh.boundaryMesh().whichPatch(curFaceID) << endl;
-            }                                                  
+            }
         }
     }
 
diff --git a/src/dynamicMesh/boundaryMesh/boundaryMesh.C b/src/dynamicMesh/boundaryMesh/boundaryMesh.C
index b71e0a569ed..2ca4973e7c1 100644
--- a/src/dynamicMesh/boundaryMesh/boundaryMesh.C
+++ b/src/dynamicMesh/boundaryMesh/boundaryMesh.C
@@ -390,7 +390,7 @@ void Foam::boundaryMesh::markZone
     // Zones on all edges.
     labelList edgeZone(mesh().nEdges(), -1);
 
-    while(1)
+    while (true)
     {
         changedEdges = faceToEdge
         (
diff --git a/src/dynamicMesh/boundaryPatch/boundaryPatch.H b/src/dynamicMesh/boundaryPatch/boundaryPatch.H
index 039b58651e7..14a176d6f16 100644
--- a/src/dynamicMesh/boundaryPatch/boundaryPatch.H
+++ b/src/dynamicMesh/boundaryPatch/boundaryPatch.H
@@ -85,7 +85,7 @@ public:
 
         //- Construct as copy, resetting the index
         boundaryPatch(const boundaryPatch&, const label index);
-   
+
         //- Clone
         autoPtr<boundaryPatch> clone() const;
 
diff --git a/src/dynamicMesh/fvMeshAdder/fvMeshAdderTemplates.C b/src/dynamicMesh/fvMeshAdder/fvMeshAdderTemplates.C
index 37562abc35b..536f7347090 100644
--- a/src/dynamicMesh/fvMeshAdder/fvMeshAdderTemplates.C
+++ b/src/dynamicMesh/fvMeshAdder/fvMeshAdderTemplates.C
@@ -147,7 +147,7 @@ void Foam::fvMeshAdder::MapVolField
             if (newPatchI != -1)
             {
                 labelList newToOld
-                (   
+                (
                     calcPatchMap
                     (
                         oldPatchStarts[patchI],
@@ -209,7 +209,7 @@ void Foam::fvMeshAdder::MapVolField
 
                     // From new patch faces to patch faces on added mesh.
                     labelList newToAdded
-                    (   
+                    (
                         calcPatchMap
                         (
                             oldPatch.start(),
@@ -242,7 +242,7 @@ void Foam::fvMeshAdder::MapVolField
                     // From new patch faces to patch faces on added mesh. This
                     // time keep unmapped elements -1.
                     labelList newToAdded
-                    (   
+                    (
                         calcPatchMap
                         (
                             oldPatch.start(),
@@ -299,7 +299,7 @@ void Foam::fvMeshAdder::MapVolFields
     // It is necessary to enforce that all old-time fields are stored
     // before the mapping is performed.  Otherwise, if the
     // old-time-level field is mapped before the field itself, sizes
-    // will not match.  
+    // will not match.
 
     for
     (
@@ -462,7 +462,7 @@ void Foam::fvMeshAdder::MapSurfaceField
             if (newPatchI != -1)
             {
                 labelList newToOld
-                (   
+                (
                     calcPatchMap
                     (
                         oldPatchStarts[patchI],
@@ -524,7 +524,7 @@ void Foam::fvMeshAdder::MapSurfaceField
 
                     // From new patch faces to patch faces on added mesh.
                     labelList newToAdded
-                    (   
+                    (
                         calcPatchMap
                         (
                             oldPatch.start(),
@@ -557,7 +557,7 @@ void Foam::fvMeshAdder::MapSurfaceField
                     // From new patch faces to patch faces on added mesh. This
                     // time keep unmapped elements -1.
                     labelList newToAdded
-                    (   
+                    (
                         calcPatchMap
                         (
                             oldPatch.start(),
@@ -613,7 +613,7 @@ void Foam::fvMeshAdder::MapSurfaceFields
     // It is necessary to enforce that all old-time fields are stored
     // before the mapping is performed.  Otherwise, if the
     // old-time-level field is mapped before the field itself, sizes
-    // will not match.  
+    // will not match.
 
     for
     (
diff --git a/src/dynamicMesh/fvMeshDistribute/fvMeshDistribute.C b/src/dynamicMesh/fvMeshDistribute/fvMeshDistribute.C
index 574ecb2d29a..848ec35d215 100644
--- a/src/dynamicMesh/fvMeshDistribute/fvMeshDistribute.C
+++ b/src/dynamicMesh/fvMeshDistribute/fvMeshDistribute.C
@@ -448,13 +448,12 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::fvMeshDistribute::deleteProcPatches
 // Repatch the mesh.
 Foam::autoPtr<Foam::mapPolyMesh> Foam::fvMeshDistribute::repatch
 (
-    const labelList& newPatchID,    // per boundary face -1 or new patchID
-    const labelList& newSubPatchID, // ,,                -1 or new subpatchID
+    const labelList& newPatchID,         // per boundary face -1 or new patchID
     labelListList& constructFaceMap
 )
 {
     polyTopoChange meshMod(mesh_);
-    
+
     forAll(newPatchID, bFaceI)
     {
         if (newPatchID[bFaceI] != -1)
@@ -482,8 +481,7 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::fvMeshDistribute::repatch
                     newPatchID[bFaceI],         // patch for face
                     false,                      // remove from zone
                     zoneID,                     // zone for face
-                    zoneFlip,                   // face flip in zone
-                    newSubPatchID
+                    zoneFlip                    // face flip in zone
                 )
             );
         }
@@ -627,8 +625,7 @@ void Foam::fvMeshDistribute::getNeighbourData
     const labelList& distribution,
     labelList& sourceFace,
     labelList& sourceProc,
-    labelList& sourceNewProc,
-    labelList& sourceSubPatch
+    labelList& sourceNewProc
 ) const
 {
     label nBnd = mesh_.nFaces() - mesh_.nInternalFaces();
@@ -736,18 +733,15 @@ void Foam::fvMeshDistribute::subsetBoundaryData
     const labelList& sourceFace,
     const labelList& sourceProc,
     const labelList& sourceNewProc,
-    const labelList& sourceSubPatch,
 
     labelList& subFace,
     labelList& subProc,
-    labelList& subNewProc,
-    labelList& subSubPatch
+    labelList& subNewProc
 )
 {
     subFace.setSize(mesh.nFaces() - mesh.nInternalFaces());
     subProc.setSize(mesh.nFaces() - mesh.nInternalFaces());
     subNewProc.setSize(mesh.nFaces() - mesh.nInternalFaces());
-    subSubPatch.setSize(mesh.nFaces() - mesh.nInternalFaces());
 
     forAll(subFace, newBFaceI)
     {
@@ -760,7 +754,6 @@ void Foam::fvMeshDistribute::subsetBoundaryData
         {
             subFace[newBFaceI] = oldFaceI;
             subProc[newBFaceI] = Pstream::myProcNo();
-            subSubPatch[newBFaceI] = -1;
 
             label oldOwn = oldFaceOwner[oldFaceI];
             label oldNei = oldFaceNeighbour[oldFaceI];
@@ -784,7 +777,6 @@ void Foam::fvMeshDistribute::subsetBoundaryData
             subFace[newBFaceI] = sourceFace[oldBFaceI];
             subProc[newBFaceI] = sourceProc[oldBFaceI];
             subNewProc[newBFaceI] = sourceNewProc[oldBFaceI];
-            subSubPatch[newBFaceI] = sourceSubPatch[oldBFaceI];
         }
     }
 }
@@ -944,7 +936,7 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::fvMeshDistribute::doRemoveCells
 void Foam::fvMeshDistribute::addProcPatches
 (
     const labelList& neighbourNewProc,   // processor that neighbour is on
-    labelList& procPatchID              
+    labelList& procPatchID
 )
 {
     // Now use the neighbourFace/Proc to repatch the mesh. These two lists
@@ -1065,7 +1057,6 @@ void Foam::fvMeshDistribute::sendMesh
     const labelList& sourceFace,
     const labelList& sourceProc,
     const labelList& sourceNewProc,
-    const labelList& sourceSubPatch,
     UOPstream& toDomain
 )
 {
@@ -1201,8 +1192,6 @@ void Foam::fvMeshDistribute::sendMesh
 
         << sourceFace
         << sourceProc
-        << sourceNewProc
-        << sourceSubPatch
         << sourceNewProc;
 
 
@@ -1225,7 +1214,6 @@ Foam::autoPtr<Foam::fvMesh> Foam::fvMeshDistribute::receiveMesh
     labelList& domainSourceFace,
     labelList& domainSourceProc,
     labelList& domainSourceNewProc,
-    labelList& domainSourceSubPatch,
     UIPstream& fromNbr
 )
 {
@@ -1243,13 +1231,12 @@ Foam::autoPtr<Foam::fvMesh> Foam::fvMeshDistribute::receiveMesh
     fromNbr
         >> domainSourceFace
         >> domainSourceProc
-        >> domainSourceNewProc
-        >> domainSourceSubPatch;
+        >> domainSourceNewProc;
 
     // Construct fvMesh
     autoPtr<fvMesh> domainMeshPtr
     (
-        new fvMesh 
+        new fvMesh
         (
             IOobject
             (
@@ -1464,24 +1451,14 @@ Foam::autoPtr<Foam::mapDistributePolyMesh> Foam::fvMeshDistribute::distribute
     //     sourceProc = -1
     //     sourceNewProc = -1
     //     sourceFace = patchID
-    //     sourceSubPatch = -1
     // coupled boundary:
     //     sourceProc = proc
     //     sourceNewProc = distribution[cell on proc]
     //     sourceFace = face
-    //     sourceSubPatch = sub patch (only if processor face)
     labelList sourceFace;
     labelList sourceProc;
     labelList sourceNewProc;
-    labelList sourceSubPatch;
-    getNeighbourData
-    (
-        distribution,
-        sourceFace,
-        sourceProc,
-        sourceNewProc,
-        sourceSubPatch
-    );
+    getNeighbourData(distribution, sourceFace, sourceProc, sourceNewProc);
 
 
     // Remove meshPhi. Since this would otherwise disappear anyway
@@ -1554,7 +1531,6 @@ Foam::autoPtr<Foam::mapDistributePolyMesh> Foam::fvMeshDistribute::distribute
         inplaceReorder(bFaceMap, sourceFace);
         inplaceReorder(bFaceMap, sourceProc);
         inplaceReorder(bFaceMap, sourceNewProc);
-        inplaceReorder(bFaceMap, sourceSubPatch);
     }
 
 
@@ -1658,7 +1634,6 @@ Foam::autoPtr<Foam::mapDistributePolyMesh> Foam::fvMeshDistribute::distribute
             labelList procSourceFace;
             labelList procSourceProc;
             labelList procSourceNewProc;
-            labelList procSourceSubPatch;
 
             subsetBoundaryData
             (
@@ -1674,12 +1649,10 @@ Foam::autoPtr<Foam::mapDistributePolyMesh> Foam::fvMeshDistribute::distribute
                 sourceFace,
                 sourceProc,
                 sourceNewProc,
-                sourceSubPatch,
 
                 procSourceFace,
                 procSourceProc,
-                procSourceNewProc,
-                procSourceSubPatch
+                procSourceNewProc
             );
 
 
@@ -1697,7 +1670,6 @@ Foam::autoPtr<Foam::mapDistributePolyMesh> Foam::fvMeshDistribute::distribute
                 procSourceFace,
                 procSourceProc,
                 procSourceNewProc,
-                procSourceSubPatch,
                 str
             );
             sendFields<volScalarField>(recvProc, volScalars, subsetter, str);
@@ -1733,7 +1705,7 @@ Foam::autoPtr<Foam::mapDistributePolyMesh> Foam::fvMeshDistribute::distribute
                 str
             );
             sendFields<surfaceSphericalTensorField>
-            (   
+            (
                 recvProc,
                 surfSphereTensors,
                 subsetter,
@@ -1801,7 +1773,6 @@ Foam::autoPtr<Foam::mapDistributePolyMesh> Foam::fvMeshDistribute::distribute
         labelList domainSourceFace;
         labelList domainSourceProc;
         labelList domainSourceNewProc;
-        labelList domainSourceSubPatch;
 
         subsetBoundaryData
         (
@@ -1817,18 +1788,15 @@ Foam::autoPtr<Foam::mapDistributePolyMesh> Foam::fvMeshDistribute::distribute
             sourceFace,
             sourceProc,
             sourceNewProc,
-            sourceSubPatch,
 
             domainSourceFace,
             domainSourceProc,
-            domainSourceNewProc,
-            domainSourceSubPatch
+            domainSourceNewProc
         );
 
         sourceFace.transfer(domainSourceFace);
         sourceProc.transfer(domainSourceProc);
         sourceNewProc.transfer(domainSourceNewProc);
-        sourceSubPatch.transfer(domainSourceSubPatch);
     }
 
 
@@ -1882,8 +1850,8 @@ Foam::autoPtr<Foam::mapDistributePolyMesh> Foam::fvMeshDistribute::distribute
             labelList domainSourceFace;
             labelList domainSourceProc;
             labelList domainSourceNewProc;
-            labelList domainSourceSubPatch;
 
+            autoPtr<fvMesh> domainMeshPtr;
             PtrList<volScalarField> vsf;
             PtrList<volVectorField> vvf;
             PtrList<volSphericalTensorField> vsptf;
@@ -1908,7 +1876,6 @@ Foam::autoPtr<Foam::mapDistributePolyMesh> Foam::fvMeshDistribute::distribute
                     domainSourceFace,
                     domainSourceProc,
                     domainSourceNewProc,
-                    domainSourceSubPatch
                     str
                 );
                 fvMesh& domainMesh = domainMeshPtr();
@@ -2079,7 +2046,7 @@ Foam::autoPtr<Foam::mapDistributePolyMesh> Foam::fvMeshDistribute::distribute
             // Update mesh data: sourceFace,sourceProc for added
             // mesh.
 
-            sourceFace = 
+            sourceFace =
                 mapBoundaryData
                 (
                     mesh_,
@@ -2088,7 +2055,7 @@ Foam::autoPtr<Foam::mapDistributePolyMesh> Foam::fvMeshDistribute::distribute
                     domainMesh.nInternalFaces(),
                     domainSourceFace
                 );
-            sourceProc = 
+            sourceProc =
                 mapBoundaryData
                 (
                     mesh_,
@@ -2097,7 +2064,7 @@ Foam::autoPtr<Foam::mapDistributePolyMesh> Foam::fvMeshDistribute::distribute
                     domainMesh.nInternalFaces(),
                     domainSourceProc
                 );
-            sourceNewProc = 
+            sourceNewProc =
                 mapBoundaryData
                 (
                     mesh_,
diff --git a/src/dynamicMesh/fvMeshDistribute/fvMeshDistribute.H b/src/dynamicMesh/fvMeshDistribute/fvMeshDistribute.H
index 0be663b7330..595a53de9c7 100644
--- a/src/dynamicMesh/fvMeshDistribute/fvMeshDistribute.H
+++ b/src/dynamicMesh/fvMeshDistribute/fvMeshDistribute.H
@@ -54,7 +54,6 @@ SourceFiles
 #define fvMeshDistribute_H
 
 #include "Field.H"
-#include "uLabel.H"
 #include "fvMeshSubset.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/dynamicMesh/fvMeshDistribute/fvMeshDistributeTemplates.C b/src/dynamicMesh/fvMeshDistribute/fvMeshDistributeTemplates.C
index 06123db004f..03530154645 100644
--- a/src/dynamicMesh/fvMeshDistribute/fvMeshDistributeTemplates.C
+++ b/src/dynamicMesh/fvMeshDistribute/fvMeshDistributeTemplates.C
@@ -289,7 +289,7 @@ void Foam::fvMeshDistribute::initPatchFields
 //  }
 
 // volVectorField {U {internalField ..; boundaryField ..;}}
-// 
+//
 template<class GeoField>
 void Foam::fvMeshDistribute::sendFields
 (
diff --git a/src/dynamicMesh/layerAdditionRemoval/addCellLayer.C b/src/dynamicMesh/layerAdditionRemoval/addCellLayer.C
index b361e9dc259..a12b79d502e 100644
--- a/src/dynamicMesh/layerAdditionRemoval/addCellLayer.C
+++ b/src/dynamicMesh/layerAdditionRemoval/addCellLayer.C
@@ -167,11 +167,11 @@ void Foam::layerAdditionRemoval::addCellLayer
             (
                 polyAddCell
                 (
-                    -1,         // master point
-                    -1,         // master edge
-                    mf[faceI],  // master face
-                    -1,         // master cell
-                    -1          // zone for cell
+                    -1,           // master point
+                    -1,           // master edge
+                    mf[faceI],    // master face
+                    -1,           // master cell
+                    -1            // zone for cell
                 )
             );
     }
@@ -216,17 +216,16 @@ void Foam::layerAdditionRemoval::addCellLayer
         (
             polyAddFace
             (
-                newFace,                // face
-                mc[faceI],              // owner
-                addedCells[faceI],      // neighbour
-                -1,                     // master point
-                -1,                     // master edge
-                mf[faceI],              // master face for addition
-                flipFaceFlux,           // flux flip
-                -1,                     // patch for face
-                -1,                     // zone for face
-                false,                  // face zone flip
-                -1                      // sub patch for face
+                newFace,               // face
+                mc[faceI],             // owner
+                addedCells[faceI],     // neighbour
+                -1,                    // master point
+                -1,                    // master edge
+                mf[faceI],             // master face for addition
+                flipFaceFlux,          // flux flip
+                -1,                    // patch for face
+                -1,                    // zone for face
+                false                  // face zone flip
             )
         );
 
@@ -241,15 +240,6 @@ void Foam::layerAdditionRemoval::addCellLayer
     {
         const label curfaceID = mf[faceI];
 
-        labelPair patchIDs
-        (
-            polyTopoChange::whichPatch
-            (
-                mesh.boundaryMesh(),
-                curfaceID
-            )
-        );
-
         // If the face is internal, modify its owner to be the newly
         // created cell.  No flip is necessary
         if (!mesh.isInternalFace(curfaceID))
@@ -258,16 +248,15 @@ void Foam::layerAdditionRemoval::addCellLayer
             (
                 polyModifyFace
                 (
-                    faces[curfaceID],           // modified face
-                    curfaceID,                  // label of face being modified
-                    addedCells[faceI],          // owner
-                    -1,                         // neighbour
-                    false,                      // face flip
-                    patchIDs[0],                // patch for face
-                    false,                      // remove from zone
-                    faceZoneID_.index(),        // zone for face
-                    mfFlip[faceI],              // face flip in zone
-                    patchIDs[1]                 // subpatch id
+                    faces[curfaceID],            // modified face
+                    curfaceID,                   // label of face being modified
+                    addedCells[faceI],           // owner
+                    -1,                          // neighbour
+                    false,                       // face flip
+                    mesh.boundaryMesh().whichPatch(curfaceID),// patch for face
+                    false,                       // remove from zone
+                    faceZoneID_.index(),         // zone for face
+                    mfFlip[faceI]                // face flip in zone
                 )
             );
 // Pout << "Modifying a boundary face. Face: " << curfaceID << " flip: " << mfFlip[faceI] << endl;
@@ -282,16 +271,15 @@ void Foam::layerAdditionRemoval::addCellLayer
             (
                 polyModifyFace
                 (
-                    faces[curfaceID],           // modified face
-                    curfaceID,                  // label of face being modified
-                    own[curfaceID],             // owner
-                    addedCells[faceI],          // neighbour
-                    false,                      // face flip
-                    patchIDs[0],                // patch for face
-                    false,                      // remove from zone
-                    faceZoneID_.index(),        // zone for face
-                    mfFlip[faceI],              // face flip in zone
-                    patchIDs[1]                 // subpatch id
+                    faces[curfaceID],            // modified face
+                    curfaceID,                   // label of face being modified
+                    own[curfaceID],              // owner
+                    addedCells[faceI],           // neighbour
+                    false,                       // face flip
+                    mesh.boundaryMesh().whichPatch(curfaceID),// patch for face
+                    false,                       // remove from zone
+                    faceZoneID_.index(),         // zone for face
+                    mfFlip[faceI]                // face flip in zone
                 )
             );
 
@@ -305,15 +293,14 @@ void Foam::layerAdditionRemoval::addCellLayer
                 polyModifyFace
                 (
                     faces[curfaceID].reverseFace(), // modified face
-                    curfaceID,              // label of face being modified
+                    curfaceID,                   // label of face being modified
                     nei[curfaceID],                 // owner
                     addedCells[faceI],              // neighbour
                     true,                           // face flip
-                    patchIDs[0],                    // patch for face
+                    mesh.boundaryMesh().whichPatch(curfaceID), // patch for face
                     false,                          // remove from zone
                     faceZoneID_.index(),            // zone for face
-                    !mfFlip[faceI],                 // face flip in zone
-                    patchIDs[1]                     // subpatch id
+                    !mfFlip[faceI]                  // face flip in zone
                 )
             );
 // Pout << "modify face, with flip " << curfaceID << " own: " << own[curfaceID] << " nei: " << addedCells[faceI] << endl;
@@ -345,17 +332,16 @@ void Foam::layerAdditionRemoval::addCellLayer
         (
             polyAddFace
             (
-                newFace,                                // face
-                addedCells[edgeFaces[curEdgeID][0]],    // owner
-                addedCells[edgeFaces[curEdgeID][1]],    // neighbour
-                -1,                                     // master point
-                meshEdges[curEdgeID],                   // master edge
-                -1,                                     // master face
-                false,                                  // flip flux
-                -1,                                     // patch for face
-                -1,                                     // zone for face
-                false,                                  // face zone flip
-                -1                                      // subpatch id
+                newFace,                               // face
+                addedCells[edgeFaces[curEdgeID][0]],   // owner
+                addedCells[edgeFaces[curEdgeID][1]],   // neighbour
+                -1,                                    // master point
+                meshEdges[curEdgeID],                  // master edge
+                -1,                                    // master face
+                false,                                 // flip flux
+                -1,                                    // patch for face
+                -1,                                    // zone for face
+                false                                  // face zone flip
             )
         );
 
@@ -393,7 +379,7 @@ void Foam::layerAdditionRemoval::addCellLayer
         // Determine the patch for insertion
         const labelList& curFaces = meshEdgeFaces[meshEdges[curEdgeID]];
 
-        labelPair patchIDs(-1, -1);
+        label patchID = -1;
         label zoneID = -1;
 
         forAll (curFaces, faceI)
@@ -406,11 +392,7 @@ void Foam::layerAdditionRemoval::addCellLayer
                 if (zoneMesh.whichZone(cf) != faceZoneID_.index())
                 {
                     // Found the face in a boundary patch which is not in zone
-                    patchIDs = polyTopoChange::whichPatch
-                    (
-                        mesh.boundaryMesh(),
-                        cf
-                    );
+                    patchID = mesh.boundaryMesh().whichPatch(cf);
                     zoneID = mesh.faceZones().whichZone(cf);
 
                     break;
@@ -418,7 +400,7 @@ void Foam::layerAdditionRemoval::addCellLayer
             }
         }
 
-        if (patchIDs[0] < 0)
+        if (patchID < 0)
         {
             FatalErrorIn
             (
@@ -433,17 +415,16 @@ void Foam::layerAdditionRemoval::addCellLayer
         (
             polyAddFace
             (
-                newFace,                                // face
-                addedCells[edgeFaces[curEdgeID][0]],    // owner
-                -1,                                     // neighbour
-                -1,                                     // master point
-                meshEdges[curEdgeID],                   // master edge
-                -1,                                     // master face
-                false,                                  // flip flux
-                patchIDs[0],                            // patch for face
-                zoneID,                                 // zone
-                false,                                  // zone face flip
-                patchIDs[1]                             // subpatch id
+                newFace,                               // face
+                addedCells[edgeFaces[curEdgeID][0]],   // owner
+                -1,                                    // neighbour
+                -1,                                    // master point
+                meshEdges[curEdgeID],                  // master edge
+                -1,                                    // master face
+                false,                                 // flip flux
+                patchID,                               // patch for face
+                zoneID,                                // zone
+                false                                  // zone face flip
             )
         );
 // Pout << "add boundary face: " << newFace << " into patch " << patchID << " own: " << addedCells[edgeFaces[curEdgeID][0]] << endl;
@@ -553,20 +534,13 @@ void Foam::layerAdditionRemoval::addCellLayer
                         -1,                     // patch for face
                         false,                  // remove from zone
                         modifiedFaceZone,       // zone for face
-                        modifiedFaceZoneFlip,   // face flip in zone
-                        -1                      // subpatch ID
+                        modifiedFaceZoneFlip    // face flip in zone
                     )
                 );
 // Pout << "modifying stick-out face. Internal Old face: " << oldFace << " new face: " << newFace << " own: " << own[curFaceID] << " nei: " << nei[curFaceID] << endl;
             }
             else
             {
-                labelPair patchIDs = polyTopoChange::whichPatch
-                (
-                    mesh.boundaryMesh(),
-                    curFaceID
-                );
-
                 ref.setAction
                 (
                     polyModifyFace
@@ -576,11 +550,10 @@ void Foam::layerAdditionRemoval::addCellLayer
                         own[curFaceID],         // owner
                         -1,                     // neighbour
                         false,                  // face flip
-                        patchIDs[0],            // patch for face
+                        mesh.boundaryMesh().whichPatch(curFaceID), // patch for face
                         false,                  // remove from zone
                         modifiedFaceZone,       // zone for face
-                        modifiedFaceZoneFlip,   // face flip in zone
-                        patchIDs[1]             // subpatch
+                        modifiedFaceZoneFlip    // face flip in zone
                     )
                 );
 // Pout << "modifying stick-out face. Boundary Old face: " << oldFace << " new face: " << newFace << " own: " << own[curFaceID] << " patch: " << mesh.boundaryMesh().whichPatch(curFaceID) << endl;
diff --git a/src/dynamicMesh/layerAdditionRemoval/removeCellLayer.C b/src/dynamicMesh/layerAdditionRemoval/removeCellLayer.C
index 05010c71ba4..b782b6a6481 100644
--- a/src/dynamicMesh/layerAdditionRemoval/removeCellLayer.C
+++ b/src/dynamicMesh/layerAdditionRemoval/removeCellLayer.C
@@ -235,9 +235,9 @@ void Foam::layerAdditionRemoval::removeCellLayer
                     mesh.faceZones()[modifiedFaceZone].whichFace(curFaceID)
                 ];
         }
-        
+
         label newNei;
-        
+
         if (curFaceID < mesh.nInternalFaces())
         {
             newNei = nei[curFaceID];
@@ -247,12 +247,6 @@ void Foam::layerAdditionRemoval::removeCellLayer
             newNei = -1;
         }
 
-        labelPair patchIDs = polyTopoChange::whichPatch
-        (
-            mesh.boundaryMesh(),
-            curFaceID
-        );
-
         // Modify the face
         ref.setAction
         (
@@ -263,11 +257,10 @@ void Foam::layerAdditionRemoval::removeCellLayer
                 own[curFaceID],         // owner
                 newNei,                 // neighbour
                 false,                  // face flip
-                patchIDs[0],            // patch for face
+                mesh.boundaryMesh().whichPatch(curFaceID),// patch for face
                 false,                  // remove from zone
                 modifiedFaceZone,       // zone for face
-                modifiedFaceZoneFlip,   // face flip in zone
-                patchIDs[1]             // subpatch
+                modifiedFaceZoneFlip    // face flip in zone
             )
         );
     }
@@ -303,14 +296,12 @@ void Foam::layerAdditionRemoval::removeCellLayer
         label newOwner = -1;
         label newNeighbour = -1;
         bool flipFace = false;
-        labelPair newPatchIDs(-1, -1);
-        //label newPatchID = -1;
-        //label newSubPatchID = -1;
+        label newPatchID = -1;
         label newZoneID = -1;
 
         // Is any of the faces a boundary face?  If so, grab the patch
         // A boundary-to-boundary collapse is checked for in validCollapse()
-        // and cannot happen here.  
+        // and cannot happen here.
 
         if (!mesh.isInternalFace(mf[faceI]))
         {
@@ -318,11 +309,7 @@ void Foam::layerAdditionRemoval::removeCellLayer
             newOwner = slaveSideCell;
             newNeighbour = -1;
             flipFace = false;
-            newPatchIDs = polyTopoChange::whichPatch
-            (
-                mesh.boundaryMesh(),
-                mf[faceI]
-            );
+            newPatchID = mesh.boundaryMesh().whichPatch(mf[faceI]);
             newZoneID = mesh.faceZones().whichZone(mf[faceI]);
         }
         else if (!mesh.isInternalFace(ftc[faceI]))
@@ -341,11 +328,7 @@ void Foam::layerAdditionRemoval::removeCellLayer
                 flipFace = true;
             }
 
-            newPatchIDs = polyTopoChange::whichPatch
-            (
-                mesh.boundaryMesh(),
-                ftc[faceI]
-            );
+            newPatchID = mesh.boundaryMesh().whichPatch(ftc[faceI]);
 
             // The zone of the master face is preserved
             newZoneID = mesh.faceZones().whichZone(mf[faceI]);
@@ -366,7 +349,7 @@ void Foam::layerAdditionRemoval::removeCellLayer
                 flipFace = true;
             }
 
-            newPatchIDs = labelPair(-1, -1);
+            newPatchID = -1;
 
             // The zone of the master face is preserved
             newZoneID = mesh.faceZones().whichZone(mf[faceI]);
@@ -396,16 +379,15 @@ void Foam::layerAdditionRemoval::removeCellLayer
         (
             polyModifyFace
             (
-                newFace,        // modified face
-                mf[faceI],      // label of face being modified
-                newOwner,       // owner
-                newNeighbour,   // neighbour
-                flipFace,       // flip
-                newPatchIDs[0], // patch for face
-                false,          // remove from zone
-                newZoneID,      // new zone
-                zoneFlip,       // face flip in zone
-                newPatchIDs[1]  // subpatch for face
+                newFace,       // modified face
+                mf[faceI],     // label of face being modified
+                newOwner,      // owner
+                newNeighbour,  // neighbour
+                flipFace,      // flip
+                newPatchID,    // patch for face
+                false,         // remove from zone
+                newZoneID,     // new zone
+                zoneFlip       // face flip in zone
             )
         );
     }
diff --git a/src/dynamicMesh/layerAdditionRemoval/setLayerPairing.C b/src/dynamicMesh/layerAdditionRemoval/setLayerPairing.C
index 9fef6798205..472b404cc08 100644
--- a/src/dynamicMesh/layerAdditionRemoval/setLayerPairing.C
+++ b/src/dynamicMesh/layerAdditionRemoval/setLayerPairing.C
@@ -42,7 +42,7 @@ bool Foam::layerAdditionRemoval::setLayerPairing() const
     // This is also the most complex part of the topological change.
     // Therefore it will be calculated here and stored as temporary
     // data until the actual topological change, after which it will
-    // be cleared.  
+    // be cleared.
 
     // Algorithm for point collapse
     // 1)  Go through the master cell layer and for every face of
@@ -212,7 +212,7 @@ void Foam::layerAdditionRemoval::modifyMotionPoints
 {
     if (debug)
     {
-        Pout<< "void layerAdditionRemoval::modifyMotionPoints(" 
+        Pout<< "void layerAdditionRemoval::modifyMotionPoints("
             << "pointField& motionPoints) const for object "
             << name() << " : ";
     }
diff --git a/src/dynamicMesh/meshCut/cellCuts/cellCuts.H b/src/dynamicMesh/meshCut/cellCuts/cellCuts.H
index 50c9b0d0230..5473a3b8c75 100644
--- a/src/dynamicMesh/meshCut/cellCuts/cellCuts.H
+++ b/src/dynamicMesh/meshCut/cellCuts/cellCuts.H
@@ -61,7 +61,7 @@ Description
       - cellAnchorPoints : per cell the vertices on one side which are
         considered the anchor points.
 
-    AnchorPoints: connected loops have to be oriented in the same way to 
+    AnchorPoints: connected loops have to be oriented in the same way to
     be able to grow new internal faces out of the same bottom faces.
     (limitation of the mapping procedure). The loop is cellLoop is oriented
     such that the normal of it points towards the anchorPoints.
@@ -435,7 +435,7 @@ class cellCuts
 
             //- Set orientation of loops
             void orientPlanesAndLoops();
-            
+
             //- top level driver: adressing calculation and loop detection
             void calcLoopsAndAddressing(const labelList& cutCells);
 
@@ -592,7 +592,7 @@ public:
             //- Returns coordinates of points on loop for given cell.
             //  Uses cellLoops_ and edgeWeight_
             pointField loopPoints(const label cellI) const;
-  
+
             //- Invert anchor point selection.
             labelList nonAnchorPoints
             (
diff --git a/src/dynamicMesh/meshCut/cellLooper/cellLooper.C b/src/dynamicMesh/meshCut/cellLooper/cellLooper.C
index 83fb08bc5c1..1c8d83ff203 100644
--- a/src/dynamicMesh/meshCut/cellLooper/cellLooper.C
+++ b/src/dynamicMesh/meshCut/cellLooper/cellLooper.C
@@ -22,8 +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
-
 \*---------------------------------------------------------------------------*/
 
 #include "cellLooper.H"
diff --git a/src/dynamicMesh/meshCut/cellLooper/cellLooper.H b/src/dynamicMesh/meshCut/cellLooper/cellLooper.H
index 206b9cf3ffb..ec2e12226c8 100644
--- a/src/dynamicMesh/meshCut/cellLooper/cellLooper.H
+++ b/src/dynamicMesh/meshCut/cellLooper/cellLooper.H
@@ -173,7 +173,7 @@ public:
         //  Cut along circumference is expressed as cellVertCut,
         //  cellEdgeToWeight. Returns true if succesfull. Still might not
         //  be compatible with existing cuts but this should be handled by
-        //  caller). 
+        //  caller).
         virtual bool cut
         (
             const vector& refDir,
diff --git a/src/dynamicMesh/meshCut/directions/directionInfo/directionInfo.C b/src/dynamicMesh/meshCut/directions/directionInfo/directionInfo.C
index dbffd83da43..d2b605c4337 100644
--- a/src/dynamicMesh/meshCut/directions/directionInfo/directionInfo.C
+++ b/src/dynamicMesh/meshCut/directions/directionInfo/directionInfo.C
@@ -170,7 +170,7 @@ Foam::label Foam::directionInfo::edgeToFaceIndex
         {
             // Both not in face.
             // e is on opposite face. Determine corresponding edge on this face:
-            // - determine two faces using edge (one is the opposite face, 
+            // - determine two faces using edge (one is the opposite face,
             //   one is 'side' face
             // - walk on both these faces to opposite edge
             // - check if this opposite edge is on faceI
@@ -264,7 +264,7 @@ bool Foam::directionInfo::updateCell
             const edge& e = mesh.edges()[edgeI];
 
             // Find face connected to face through edgeI and on same cell.
-            label faceI = 
+            label faceI =
                 meshTools::otherFace
                 (
                     mesh,
@@ -304,7 +304,7 @@ bool Foam::directionInfo::updateCell
     n_ = neighbourInfo.n();
 
     return true;
-}    
+}
 
 
 // Update this face with neighbouring cell information
@@ -351,7 +351,7 @@ bool Foam::directionInfo::updateFace
     n_ = neighbourInfo.n();
 
     return true;
-}    
+}
 
 
 // Merge this with information on same face
@@ -376,7 +376,7 @@ bool Foam::directionInfo::updateFace
 
         return true;
     }
-}    
+}
 
 
 // * * * * * * * * * * * * * * * Friend Operators  * * * * * * * * * * * * * //
diff --git a/src/dynamicMesh/meshCut/directions/directionInfo/directionInfo.H b/src/dynamicMesh/meshCut/directions/directionInfo/directionInfo.H
index 72bc37c2800..381389f8cd3 100644
--- a/src/dynamicMesh/meshCut/directions/directionInfo/directionInfo.H
+++ b/src/dynamicMesh/meshCut/directions/directionInfo/directionInfo.H
@@ -41,7 +41,7 @@ Description
              processors whereas f[0] should correspond to f[0] on other side)
 
     The rule is that if the label is set (-1 or higher) it is used
-    (topological information only), otherwise the vector is used. This makes 
+    (topological information only), otherwise the vector is used. This makes
     sure that we use topological information as much as possible and so a
     hex mesh is cut purely topologically. All other shapes are cut
     geometrically.
@@ -84,7 +84,7 @@ class directionInfo
         // Local n axis
         vector n_;
 
-        
+
     // Private Member Functions
 
         //- edge uses two labels
diff --git a/src/dynamicMesh/meshCut/directions/directionInfo/directionInfoI.H b/src/dynamicMesh/meshCut/directions/directionInfo/directionInfoI.H
index 44a9745977b..1f3a811c78c 100644
--- a/src/dynamicMesh/meshCut/directions/directionInfo/directionInfoI.H
+++ b/src/dynamicMesh/meshCut/directions/directionInfo/directionInfoI.H
@@ -93,7 +93,7 @@ inline void Foam::directionInfo::leaveDomain
 
 // index_ is offset in face on other side. So reverse it here.
 // (Note: f[0] on other domain is connected to f[0] in this domain,
-//        f[1]      ,,                         f[size-1]   ,, 
+//        f[1]      ,,                         f[size-1]   ,,
 // etc.)
 inline void Foam::directionInfo::enterDomain
 (
diff --git a/src/dynamicMesh/meshCut/directions/directions.C b/src/dynamicMesh/meshCut/directions/directions.C
index bc485faf878..b50069d6060 100644
--- a/src/dynamicMesh/meshCut/directions/directions.C
+++ b/src/dynamicMesh/meshCut/directions/directions.C
@@ -181,7 +181,7 @@ Foam::vectorField Foam::directions::propagateDirection
             changedFacesInfo[patchFaceI] =
                 directionInfo
                 (
-                    faceIndex, 
+                    faceIndex,
                     cutDir
                 );
         }
@@ -404,7 +404,7 @@ Foam::directions::directions
 
         if (wantTan1 || wantTan2)
         {
-            tan1Dirs = 
+            tan1Dirs =
                 propagateDirection
                 (
                     mesh,
diff --git a/src/dynamicMesh/meshCut/directions/directions.H b/src/dynamicMesh/meshCut/directions/directions.H
index 9debd4b2103..16be9a6c64e 100644
--- a/src/dynamicMesh/meshCut/directions/directions.H
+++ b/src/dynamicMesh/meshCut/directions/directions.H
@@ -30,7 +30,7 @@ Description
     or one set of directions per cell.
 
     Used in splitting cells.
-    Either all cells have similar refinement direction ('global') or 
+    Either all cells have similar refinement direction ('global') or
     direction is dependent on local cell geometry. Controlled by dictionary.
 
 SourceFiles
diff --git a/src/dynamicMesh/meshCut/edgeVertex/edgeVertex.C b/src/dynamicMesh/meshCut/edgeVertex/edgeVertex.C
index 1ffa0d361e3..dcd4294307e 100644
--- a/src/dynamicMesh/meshCut/edgeVertex/edgeVertex.C
+++ b/src/dynamicMesh/meshCut/edgeVertex/edgeVertex.C
@@ -22,8 +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
-
 \*---------------------------------------------------------------------------*/
 
 #include "edgeVertex.H"
diff --git a/src/dynamicMesh/meshCut/edgeVertex/edgeVertex.H b/src/dynamicMesh/meshCut/edgeVertex/edgeVertex.H
index 2780b12498f..7e1cb47af89 100644
--- a/src/dynamicMesh/meshCut/edgeVertex/edgeVertex.H
+++ b/src/dynamicMesh/meshCut/edgeVertex/edgeVertex.H
@@ -118,7 +118,7 @@ public:
                     << (mesh.nPoints() + mesh.nEdges() - 1)
                     << abort(FatalError);
             }
-            
+
             return eVert >= mesh.nPoints();
         }
         bool isEdge(const label eVert) const
@@ -154,7 +154,7 @@ public:
                     "edgeVertex::getVertex(const primitiveMesh&, const label)"
                 )   << "EdgeVertex " << eVert << " not a vertex"
                     << abort(FatalError);
-            }            
+            }
             return eVert;
         }
         label getVertex(const label eVert) const
@@ -210,7 +210,7 @@ public:
             return coord(mesh_, cut, weight);
         }
 
-        //- Find mesh edge (or -1) between two cuts. 
+        //- Find mesh edge (or -1) between two cuts.
         static label cutPairToEdge
         (
             const primitiveMesh&,
diff --git a/src/dynamicMesh/meshCut/meshModifiers/boundaryCutter/boundaryCutter.C b/src/dynamicMesh/meshCut/meshModifiers/boundaryCutter/boundaryCutter.C
index 18499ebf82d..1fba9056bd7 100644
--- a/src/dynamicMesh/meshCut/meshModifiers/boundaryCutter/boundaryCutter.C
+++ b/src/dynamicMesh/meshCut/meshModifiers/boundaryCutter/boundaryCutter.C
@@ -22,8 +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
-
 \*---------------------------------------------------------------------------*/
 
 #include "boundaryCutter.H"
@@ -39,12 +37,7 @@ Description
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
-namespace Foam
-{
-
-defineTypeNameAndDebug(boundaryCutter, 0);
-
-}
+defineTypeNameAndDebug(Foam::boundaryCutter, 0);
 
 
 // * * * * * * * * * * * * * Private Static Functions  * * * * * * * * * * * //
@@ -55,12 +48,17 @@ defineTypeNameAndDebug(boundaryCutter, 0);
 void Foam::boundaryCutter::getFaceInfo
 (
     const label faceI,
-    labelPair& patchIDs,
+    label& patchID,
     label& zoneID,
     label& zoneFlip
 ) const
 {
-    patchIDs = polyTopoChange::whichPatch(mesh_.boundaryMesh(), faceI);
+    patchID = -1;
+
+    if (!mesh_.isInternalFace(faceI))
+    {
+        patchID = mesh_.boundaryMesh().whichPatch(faceI);
+    }
 
     zoneID = mesh_.faceZones().whichZone(faceI);
 
@@ -150,28 +148,26 @@ void Foam::boundaryCutter::addFace
 ) const
 {
     // Information about old face
-    label zoneID, zoneFlip;
-    labelPair patchIDs;
-    getFaceInfo(faceI, patchIDs, zoneID, zoneFlip);
+    label patchID, zoneID, zoneFlip;
+    getFaceInfo(faceI, patchID, zoneID, zoneFlip);
     label own = mesh_.faceOwner()[faceI];
     label masterPoint = mesh_.faces()[faceI][0];
-    
+
     if (!modifiedFace)
     {
         meshMod.setAction
         (
             polyModifyFace
             (
-                newFace,        // face
+                newFace,       // face
                 faceI,
-                own,            // owner
-                -1,             // neighbour
-                false,          // flux flip
-                patchIDs[0],    // patch for face
-                false,          // remove from zone
-                zoneID,         // zone for face
-                zoneFlip,       // face zone flip
-                patchIDs[1]     // subPatch ID
+                own,           // owner
+                -1,            // neighbour
+                false,         // flux flip
+                patchID,       // patch for face
+                false,         // remove from zone
+                zoneID,        // zone for face
+                zoneFlip       // face zone flip
             )
         );
 
@@ -190,10 +186,9 @@ void Foam::boundaryCutter::addFace
                 -1,            // master edge
                 -1,            // master face for addition
                 false,         // flux flip
-                patchIDs[0],   // patch for face
+                patchID,       // patch for face
                 zoneID,        // zone for face
-                zoneFlip,      // face zone flip
-                patchIDs[1]
+                zoneFlip       // face zone flip
             )
         );
     }
@@ -201,7 +196,7 @@ void Foam::boundaryCutter::addFace
 
 
 
-// Splits a face using the cut edges and modified points 
+// Splits a face using the cut edges and modified points
 bool Foam::boundaryCutter::splitFace
 (
     const label faceI,
@@ -271,6 +266,10 @@ bool Foam::boundaryCutter::splitFace
         // - walk to next cut. Make face
         // - loop until face done.
 
+        // Information about old face
+        label patchID, zoneID, zoneFlip;
+        getFaceInfo(faceI, patchID, zoneID, zoneFlip);
+
         // Get face with new points on cut edges for ease of looping
         face extendedFace(addEdgeCutsToFace(faceI, edgeToAddedPoints));
 
@@ -565,9 +564,8 @@ void Foam::boundaryCutter::setRefinement
         label addedPointI = iter();
 
         // Information about old face
-        labelPair patchIDs;
-        label zoneID, zoneFlip;
-        getFaceInfo(faceI, patchIDs, zoneID, zoneFlip);
+        label patchID, zoneID, zoneFlip;
+        getFaceInfo(faceI, patchID, zoneID, zoneFlip);
         label own = mesh_.faceOwner()[faceI];
         label masterPoint = mesh_.faces()[faceI][0];
 
@@ -595,11 +593,10 @@ void Foam::boundaryCutter::setRefinement
                         own,                        // owner
                         -1,                         // neighbour
                         false,                      // flux flip
-                        patchIDs[0],                // patch for face
+                        patchID,                    // patch for face
                         false,                      // remove from zone
                         zoneID,                     // zone for face
-                        zoneFlip,                   // face zone flip
-                        patchIDs[1]
+                        zoneFlip                    // face zone flip
                     )
                 );
             }
@@ -617,10 +614,9 @@ void Foam::boundaryCutter::setRefinement
                         -1,                         // master edge
                         -1,                         // master face for addition
                         false,                      // flux flip
-                        patchIDs[0],                // patch for face
+                        patchID,                    // patch for face
                         zoneID,                     // zone for face
-                        zoneFlip,                   // face zone flip
-                        patchIDs[1]
+                        zoneFlip                    // face zone flip
                     )
                 );
             }
@@ -651,9 +647,8 @@ void Foam::boundaryCutter::setRefinement
         face newFace(addEdgeCutsToFace(faceI, edgeToAddedPoints));
 
         // Information about old face
-        labelPair patchIDs;
-        label zoneID, zoneFlip;
-        getFaceInfo(faceI, patchIDs, zoneID, zoneFlip);
+        label patchID, zoneID, zoneFlip;
+        getFaceInfo(faceI, patchID, zoneID, zoneFlip);
         label own = mesh_.faceOwner()[faceI];
         label masterPoint = mesh_.faces()[faceI][0];
 
@@ -701,11 +696,10 @@ void Foam::boundaryCutter::setRefinement
                 own,                        // owner
                 -1,                         // neighbour
                 false,                      // flux flip
-                patchIDs[0],                // patch for face
+                patchID,                    // patch for face
                 false,                      // remove from zone
                 zoneID,                     // zone for face
-                zoneFlip,                   // face zone flip
-                patchIDs[1]
+                zoneFlip                    // face zone flip
             )
         );
 
@@ -736,10 +730,9 @@ void Foam::boundaryCutter::setRefinement
                 -1,                         // master edge
                 -1,                         // master face for addition
                 false,                      // flux flip
-                patchIDs[0],                // patch for face
+                patchID,                    // patch for face
                 zoneID,                     // zone for face
-                zoneFlip,                   // face zone flip
-                patchIDs[1]
+                zoneFlip                    // face zone flip
             )
         );
 
@@ -755,7 +748,7 @@ void Foam::boundaryCutter::setRefinement
 
         const labelList& eFaces = mesh_.edgeFaces()[edgeI];
 
-        forAll(eFaces, i)    
+        forAll(eFaces, i)
         {
             label faceI = eFaces[i];
 
@@ -781,7 +774,7 @@ void Foam::boundaryCutter::setRefinement
 
         const labelList& eFaces = mesh_.edgeFaces()[edgeI];
 
-        forAll(eFaces, i)    
+        forAll(eFaces, i)
         {
             label faceI = eFaces[i];
 
@@ -799,9 +792,8 @@ void Foam::boundaryCutter::setRefinement
                     nei = mesh_.faceNeighbour()[faceI];
                 }
 
-                labelPair patchIDs;
-                label zoneID, zoneFlip;
-                getFaceInfo(faceI, patchIDs, zoneID, zoneFlip);
+                label patchID, zoneID, zoneFlip;
+                getFaceInfo(faceI, patchID, zoneID, zoneFlip);
 
                 meshMod.setAction
                 (
@@ -812,11 +804,10 @@ void Foam::boundaryCutter::setRefinement
                         own,                // owner
                         nei,                // neighbour
                         false,              // face flip
-                        patchIDs[0],        // patch for face
+                        patchID,            // patch for face
                         false,              // remove from zone
                         zoneID,             // zone for face
-                        zoneFlip,           // face flip in zone
-                        patchIDs[1]
+                        zoneFlip            // face flip in zone
                     )
                 );
 
diff --git a/src/dynamicMesh/meshCut/meshModifiers/boundaryCutter/boundaryCutter.H b/src/dynamicMesh/meshCut/meshModifiers/boundaryCutter/boundaryCutter.H
index effa2e861dc..299e119bef5 100644
--- a/src/dynamicMesh/meshCut/meshModifiers/boundaryCutter/boundaryCutter.H
+++ b/src/dynamicMesh/meshCut/meshModifiers/boundaryCutter/boundaryCutter.H
@@ -84,7 +84,7 @@ class boundaryCutter
         void getFaceInfo
         (
             const label faceI,
-            labelPair& patchID,
+            label& patchID,
             label& zoneID,
             label& zoneFlip
         ) const;
diff --git a/src/dynamicMesh/meshCut/meshModifiers/meshCutAndRemove/meshCutAndRemove.C b/src/dynamicMesh/meshCut/meshModifiers/meshCutAndRemove/meshCutAndRemove.C
index 0aac8e200de..a8dfe9ffcae 100644
--- a/src/dynamicMesh/meshCut/meshModifiers/meshCutAndRemove/meshCutAndRemove.C
+++ b/src/dynamicMesh/meshCut/meshModifiers/meshCutAndRemove/meshCutAndRemove.C
@@ -183,7 +183,7 @@ void Foam::meshCutAndRemove::faceCells
     const label faceI,
     label& own,
     label& nei,
-    labelPair& patchIDs
+    label& patchID
 ) const
 {
     const labelListList& anchorPts = cuts.cellAnchorPoints();
@@ -211,12 +211,12 @@ void Foam::meshCutAndRemove::faceCells
         }
     }
 
-    patchIDs = polyTopoChange::whichPatch(mesh().boundaryMesh(), faceI);
+    patchID = mesh().boundaryMesh().whichPatch(faceI);
 
-    if (patchIDs[0] == -1 && (own == -1 || nei == -1))
+    if (patchID == -1 && (own == -1 || nei == -1))
     {
         // Face was internal but becomes external
-        patchIDs[0] = exposedPatchI;
+        patchID = exposedPatchI;
     }
 }
 
@@ -250,7 +250,7 @@ void Foam::meshCutAndRemove::addFace
     const face& newFace,
     const label own,
     const label nei,
-    const labelPair& patchIDs
+    const label patchID
 )
 {
     label zoneID;
@@ -266,7 +266,7 @@ void Foam::meshCutAndRemove::addFace
             Pout<< "Adding face " << newFace
                 << " with new owner:" << own
                 << " with new neighbour:" << nei
-                << " patchIDs:" << patchIDs
+                << " patchID:" << patchID
                 << " anchor:" << masterPointI
                 << " zoneID:" << zoneID
                 << " zoneFlip:" << zoneFlip
@@ -284,10 +284,9 @@ void Foam::meshCutAndRemove::addFace
                 -1,                         // master edge
                 -1,                         // master face for addition
                 false,                      // flux flip
-                patchIDs[0],                // patch for face
+                patchID,                    // patch for face
                 zoneID,                     // zone for face
-                zoneFlip,                   // face zone flip
-                patchIDs[1]
+                zoneFlip                    // face zone flip
             )
         );
     }
@@ -299,7 +298,7 @@ void Foam::meshCutAndRemove::addFace
             Pout<< "Adding (reversed) face " << newFace.reverseFace()
                 << " with new owner:" << nei
                 << " with new neighbour:" << own
-                << " patchIDs:" << patchIDs
+                << " patchID:" << patchID
                 << " anchor:" << masterPointI
                 << " zoneID:" << zoneID
                 << " zoneFlip:" << zoneFlip
@@ -317,10 +316,9 @@ void Foam::meshCutAndRemove::addFace
                 -1,                         // master edge
                 -1,                         // master face for addition
                 false,                      // flux flip
-                patchIDs[0],                // patch for face
+                patchID,                    // patch for face
                 zoneID,                     // zone for face
-                zoneFlip,                   // face zone flip
-                patchIDs[1]
+                zoneFlip                    // face zone flip
             )
         );
     }
@@ -335,7 +333,7 @@ void Foam::meshCutAndRemove::modFace
     const face& newFace,
     const label own,
     const label nei,
-    const labelPair& patchIDs
+    const label patchID
 )
 {
     label zoneID;
@@ -360,7 +358,7 @@ void Foam::meshCutAndRemove::modFace
                 << " new vertices:" << newFace
                 << " new owner:" << own
                 << " new neighbour:" << nei
-                << " new patch:" << patchIDs[0]
+                << " new patch:" << patchID
                 << " new zoneID:" << zoneID
                 << " new zoneFlip:" << zoneFlip
                 << endl;
@@ -377,11 +375,10 @@ void Foam::meshCutAndRemove::modFace
                     own,                // owner
                     nei,                // neighbour
                     false,              // face flip
-                    patchIDs[0],        // patch for face
+                    patchID,            // patch for face
                     false,              // remove from zone
                     zoneID,             // zone for face
-                    zoneFlip,           // face flip in zone
-                    patchIDs[1]         // subPatch
+                    zoneFlip            // face flip in zone
                 )
             );
         }
@@ -396,11 +393,10 @@ void Foam::meshCutAndRemove::modFace
                     nei,                    // owner
                     own,                    // neighbour
                     false,                  // face flip
-                    patchIDs[0],            // patch for face
+                    patchID,                // patch for face
                     false,                  // remove from zone
                     zoneID,                 // zone for face
-                    zoneFlip,               // face flip in zone
-                    patchIDs[1]             // subPatch
+                    zoneFlip                // face flip in zone
                 )
             );
         }
@@ -846,8 +842,7 @@ void Foam::meshCutAndRemove::setRefinement
                         false,                  // flux flip
                         cutPatch[cellI],        // patch for face
                         -1,                     // zone for face
-                        false,                  // face zone flip
-                        -1                      //? TBD
+                        false                   // face zone flip
                     )
                 );
 
@@ -1069,11 +1064,11 @@ void Foam::meshCutAndRemove::setRefinement
 
         // If faces were internal but now become external set a patch.
         // If they were external already keep the patch.
-        labelPair patchIDs = polyTopoChange::whichPatch(patches, faceI);
+        label patchID = patches.whichPatch(faceI);
 
-        if (patchIDs[0] == -1)
+        if (patchID == -1)
         {
-            patchIDs[0] = exposedPatchI;
+            patchID = exposedPatchI;
         }
 
 
@@ -1087,7 +1082,7 @@ void Foam::meshCutAndRemove::setRefinement
             if (f0Nei != -1)
             {
                 // f0 becomes external face (note:modFace will reverse face)
-                modFace(meshMod, faceI, f0, f0Own, f0Nei, patchIDs);
+                modFace(meshMod, faceI, f0, f0Own, f0Nei, patchID);
                 modifiedFaceI = true;
             }
         }
@@ -1096,13 +1091,13 @@ void Foam::meshCutAndRemove::setRefinement
             if (f0Nei == -1)
             {
                 // f0 becomes external face
-                modFace(meshMod, faceI, f0, f0Own, f0Nei, patchIDs);
+                modFace(meshMod, faceI, f0, f0Own, f0Nei, patchID);
                 modifiedFaceI = true;
             }
             else
             {
                 // f0 stays internal face.
-                modFace(meshMod, faceI, f0, f0Own, f0Nei, labelPair(-1, -1));
+                modFace(meshMod, faceI, f0, f0Own, f0Nei, -1);
                 modifiedFaceI = true;
             }
         }
@@ -1121,12 +1116,12 @@ void Foam::meshCutAndRemove::setRefinement
                 // f1 becomes external face (note:modFace will reverse face)
                 if (!modifiedFaceI)
                 {
-                    modFace(meshMod, faceI, f1, f1Own, f1Nei, patchIDs);
+                    modFace(meshMod, faceI, f1, f1Own, f1Nei, patchID);
                     modifiedFaceI = true;
                 }
                 else
                 {
-                    label masterPointI = findPatchFacePoint(f1, patchIDs[0]);
+                    label masterPointI = findPatchFacePoint(f1, patchID);
 
                     addFace
                     (
@@ -1136,7 +1131,7 @@ void Foam::meshCutAndRemove::setRefinement
                         f1,             // vertices of face
                         f1Own,
                         f1Nei,
-                        patchIDs        // patch for new face
+                        patchID         // patch for new face
                     );
                 }
             }
@@ -1148,12 +1143,12 @@ void Foam::meshCutAndRemove::setRefinement
                 // f1 becomes external face
                 if (!modifiedFaceI)
                 {
-                    modFace(meshMod, faceI, f1, f1Own, f1Nei, patchIDs);
+                    modFace(meshMod, faceI, f1, f1Own, f1Nei, patchID);
                     modifiedFaceI = true;
                 }
                 else
                 {
-                    label masterPointI = findPatchFacePoint(f1, patchIDs[0]);
+                    label masterPointI = findPatchFacePoint(f1, patchID);
 
                     addFace
                     (
@@ -1163,7 +1158,7 @@ void Foam::meshCutAndRemove::setRefinement
                         f1,
                         f1Own,
                         f1Nei,
-                        patchIDs
+                        patchID
                     );
                 }
             }
@@ -1172,31 +1167,14 @@ void Foam::meshCutAndRemove::setRefinement
                 // f1 is internal face.
                 if (!modifiedFaceI)
                 {
-                    modFace
-                    (
-                        meshMod,
-                        faceI,
-                        f1,
-                        f1Own,
-                        f1Nei,
-                        labelPair(-1, -1)
-                    );
+                    modFace(meshMod, faceI, f1, f1Own, f1Nei, -1);
                     modifiedFaceI = true;
                 }
                 else
                 {
                     label masterPointI = findPatchFacePoint(f1, -1);
 
-                    addFace
-                    (
-                        meshMod,
-                        faceI,
-                        masterPointI,
-                        f1,
-                        f1Own,
-                        f1Nei,
-                        labelPair(-1, -1)
-                    );
+                    addFace(meshMod, faceI, masterPointI, f1, f1Own, f1Nei, -1);
                 }
             }
         }
@@ -1239,9 +1217,8 @@ void Foam::meshCutAndRemove::setRefinement
                     // borders by edge a cell which has been split.
 
                     // Get (new or original) owner and neighbour of faceI
-                    label own, nei;
-                    labelPair patchIDs;
-                    faceCells(cuts, exposedPatchI, faceI, own, nei, patchIDs);
+                    label own, nei, patchID;
+                    faceCells(cuts, exposedPatchI, faceI, own, nei, patchID);
 
 
                     if (own == -1 && nei == -1)
@@ -1272,7 +1249,7 @@ void Foam::meshCutAndRemove::setRefinement
                             newFace,
                             own,
                             nei,
-                            patchIDs
+                            patchID
                         );
                     }
 
@@ -1296,9 +1273,8 @@ void Foam::meshCutAndRemove::setRefinement
         if (!faceUptodate[faceI])
         {
             // Get (new or original) owner and neighbour of faceI
-            labelPair patchIDs;
-            label own, nei;
-            faceCells(cuts, exposedPatchI, faceI, own, nei, patchIDs);
+            label own, nei, patchID;
+            faceCells(cuts, exposedPatchI, faceI, own, nei, patchID);
 
             if (own == -1 && nei == -1)
             {
@@ -1311,7 +1287,7 @@ void Foam::meshCutAndRemove::setRefinement
             }
             else
             {
-                modFace(meshMod, faceI, faces[faceI], own, nei, patchIDs);
+                modFace(meshMod, faceI, faces[faceI], own, nei, patchID);
             }
 
             faceUptodate[faceI] = true;
diff --git a/src/dynamicMesh/meshCut/meshModifiers/meshCutAndRemove/meshCutAndRemove.H b/src/dynamicMesh/meshCut/meshModifiers/meshCutAndRemove/meshCutAndRemove.H
index fe708c4cbc3..1cb0c816773 100644
--- a/src/dynamicMesh/meshCut/meshModifiers/meshCutAndRemove/meshCutAndRemove.H
+++ b/src/dynamicMesh/meshCut/meshModifiers/meshCutAndRemove/meshCutAndRemove.H
@@ -27,7 +27,7 @@ Class
 
 Description
     like meshCutter but also removes non-anchor side of cell.
-    
+
 SourceFiles
     meshCutAndRemove.C
 
@@ -106,7 +106,7 @@ class meshCutAndRemove
             const label faceI,
             label& own,
             label& nei,
-            labelPair& patchIDs
+            label& patchID
         ) const;
 
         //- Get zone information for face.
@@ -126,10 +126,10 @@ class meshCutAndRemove
             const face& newFace,
             const label owner,
             const label neighbour,
-            const labelPair& patchIDs
+            const label patchID
         );
 
-        //- Modifies existing faceI for either new owner/neighbour or 
+        //- Modifies existing faceI for either new owner/neighbour or
         //  new face points. Checks if anything changed and flips face
         //  if owner>neighbour
         void modFace
@@ -139,7 +139,7 @@ class meshCutAndRemove
             const face& newFace,
             const label owner,
             const label neighbour,
-            const labelPair& patchIDs
+            const label patchID
         );
 
         // Copies face starting from startFp. Jumps cuts. Marks visited
diff --git a/src/dynamicMesh/meshCut/meshModifiers/meshCutter/meshCutter.C b/src/dynamicMesh/meshCut/meshModifiers/meshCutter/meshCutter.C
index 6a578f206a0..c3a9f6d4ba1 100644
--- a/src/dynamicMesh/meshCut/meshModifiers/meshCutter/meshCutter.C
+++ b/src/dynamicMesh/meshCut/meshModifiers/meshCutter/meshCutter.C
@@ -22,8 +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
-
 \*---------------------------------------------------------------------------*/
 
 #include "meshCutter.H"
@@ -177,12 +175,17 @@ void Foam::meshCutter::faceCells
 void Foam::meshCutter::getFaceInfo
 (
     const label faceI,
-    labelPair& patchIDs,
+    label& patchID,
     label& zoneID,
     label& zoneFlip
 ) const
 {
-    patchIDs = polyTopoChange::whichPatch(mesh().boundaryMesh(), faceI);
+    patchID = -1;
+
+    if (!mesh().isInternalFace(faceI))
+    {
+        patchID = mesh().boundaryMesh().whichPatch(faceI);
+    }
 
     zoneID = mesh().faceZones().whichZone(faceI);
 
@@ -207,9 +210,9 @@ void Foam::meshCutter::addFace
     const label nei
 )
 {
-    labelPair patchIDs;
-    label zoneID, zoneFlip;
-    getFaceInfo(faceI, patchIDs, zoneID, zoneFlip);
+    label patchID, zoneID, zoneFlip;
+
+    getFaceInfo(faceI, patchID, zoneID, zoneFlip);
 
     if ((nei == -1) || (own < nei))
     {
@@ -219,7 +222,7 @@ void Foam::meshCutter::addFace
             Pout<< "Adding face " << newFace
                 << " with new owner:" << own
                 << " with new neighbour:" << nei
-                << " patchIDs:" << patchIDs
+                << " patchID:" << patchID
                 << " zoneID:" << zoneID
                 << " zoneFlip:" << zoneFlip
                 << endl;
@@ -236,10 +239,9 @@ void Foam::meshCutter::addFace
                 -1,                         // master edge
                 faceI,                      // master face for addition
                 false,                      // flux flip
-                patchIDs[0],                // patch for face
+                patchID,                    // patch for face
                 zoneID,                     // zone for face
-                zoneFlip,                   // face zone flip
-                patchIDs[1]                 // subPatch
+                zoneFlip                    // face zone flip
             )
         );
     }
@@ -251,7 +253,7 @@ void Foam::meshCutter::addFace
             Pout<< "Adding (reversed) face " << newFace.reverseFace()
                 << " with new owner:" << nei
                 << " with new neighbour:" << own
-                << " patchIDs:" << patchIDs
+                << " patchID:" << patchID
                 << " zoneID:" << zoneID
                 << " zoneFlip:" << zoneFlip
                 << endl;
@@ -268,10 +270,9 @@ void Foam::meshCutter::addFace
                 -1,                         // master edge
                 faceI,                      // master face for addition
                 false,                      // flux flip
-                patchIDs[0],                // patch for face
+                patchID,                    // patch for face
                 zoneID,                     // zone for face
-                zoneFlip,                   // face zone flip
-                patchIDs[1]                 // subPatch
+                zoneFlip                    // face zone flip
             )
         );
     }
@@ -288,9 +289,9 @@ void Foam::meshCutter::modFace
     const label nei
 )
 {
-    labelPair patchIDs;
-    label zoneID, zoneFlip;
-    getFaceInfo(faceI, patchIDs, zoneID, zoneFlip);
+    label patchID, zoneID, zoneFlip;
+
+    getFaceInfo(faceI, patchID, zoneID, zoneFlip);
 
     if
     (
@@ -325,11 +326,10 @@ void Foam::meshCutter::modFace
                     own,                // owner
                     nei,                // neighbour
                     false,              // face flip
-                    patchIDs[0],        // patch for face
+                    patchID,            // patch for face
                     false,              // remove from zone
                     zoneID,             // zone for face
-                    zoneFlip,           // face flip in zone
-                    patchIDs[1]         // subPatch
+                    zoneFlip            // face flip in zone
                 )
             );
         }
@@ -344,11 +344,10 @@ void Foam::meshCutter::modFace
                     nei,                    // owner
                     own,                    // neighbour
                     false,                  // face flip
-                    patchIDs[0],            // patch for face
+                    patchID,                // patch for face
                     false,                  // remove from zone
                     zoneID,                 // zone for face
-                    zoneFlip,               // face flip in zone
-                    patchIDs[1]             // subPatch
+                    zoneFlip                // face flip in zone
                 )
             );
         }
@@ -694,8 +693,7 @@ void Foam::meshCutter::setRefinement
                         false,                  // flux flip
                         -1,                     // patch for face
                         -1,                     // zone for face
-                        false,                  // face zone flip
-                        -1                      // subpatch
+                        false                   // face zone flip
                     )
                 );
 
diff --git a/src/dynamicMesh/meshCut/meshModifiers/meshCutter/meshCutter.H b/src/dynamicMesh/meshCut/meshModifiers/meshCutter/meshCutter.H
index 83b9920ba69..1651c7474b3 100644
--- a/src/dynamicMesh/meshCut/meshModifiers/meshCutter/meshCutter.H
+++ b/src/dynamicMesh/meshCut/meshModifiers/meshCutter/meshCutter.H
@@ -185,7 +185,7 @@ class meshCutter
         void getFaceInfo
         (
             const label faceI,
-            labelPair& patchIDs,
+            label& patchID,
             label& zoneID,
             label& zoneFlip
         ) const;
diff --git a/src/dynamicMesh/meshCut/meshModifiers/multiDirRefinement/multiDirRefinement.C b/src/dynamicMesh/meshCut/meshModifiers/multiDirRefinement/multiDirRefinement.C
index 60a27f53659..ce74b0b8e77 100644
--- a/src/dynamicMesh/meshCut/meshModifiers/multiDirRefinement/multiDirRefinement.C
+++ b/src/dynamicMesh/meshCut/meshModifiers/multiDirRefinement/multiDirRefinement.C
@@ -305,7 +305,7 @@ void Foam::multiDirRefinement::refineHex8
             hexCellSet.insert(hexCells[i], 1);
         }
 
-        // Increment count 
+        // Increment count
         forAll(consistentCells, i)
         {
             label cellI = consistentCells[i];
@@ -495,7 +495,7 @@ void Foam::multiDirRefinement::refineFromDict
         cellWalker.reset(new hexCellLooper(mesh));
     }
 
-    // Construct undoable refinement topology modifier. 
+    // Construct undoable refinement topology modifier.
     //Note: undoability switched off.
     // Might want to reconsider if needs to be possible. But then can always
     // use other constructor.
diff --git a/src/dynamicMesh/meshCut/meshModifiers/multiDirRefinement/multiDirRefinement.H b/src/dynamicMesh/meshCut/meshModifiers/multiDirRefinement/multiDirRefinement.H
index f4bf854bbae..dcc849d7025 100644
--- a/src/dynamicMesh/meshCut/meshModifiers/multiDirRefinement/multiDirRefinement.H
+++ b/src/dynamicMesh/meshCut/meshModifiers/multiDirRefinement/multiDirRefinement.H
@@ -92,7 +92,7 @@ class multiDirRefinement
         //- Given map from original to added cell set the refineCell for
         //  the added cells to be equal to the one on the original cells.
         static void addCells(const Map<label>&, List<refineCell>&);
-        
+
         //- Given map from original to added cell set the vectorField for
         //  the added cells to be equal to the one on the original cells.
         static void update(const Map<label>&, vectorField&);
diff --git a/src/dynamicMesh/meshCut/meshModifiers/refinementIterator/refinementIterator.C b/src/dynamicMesh/meshCut/meshModifiers/refinementIterator/refinementIterator.C
index 4cb35366a38..e1daf928868 100644
--- a/src/dynamicMesh/meshCut/meshModifiers/refinementIterator/refinementIterator.C
+++ b/src/dynamicMesh/meshCut/meshModifiers/refinementIterator/refinementIterator.C
@@ -117,7 +117,7 @@ Foam::Map<Foam::label> Foam::refinementIterator::setRefinement
             if (debug)
             {
                 Pout<< "refinementIterator : exiting iteration since no valid"
-                    << " loops found for " << currentRefCells.size() 
+                    << " loops found for " << currentRefCells.size()
                     << " cells" << endl;
 
 
@@ -146,7 +146,7 @@ Foam::Map<Foam::label> Foam::refinementIterator::setRefinement
 
             break;
         }
-            
+
         if (debug)
         {
             fileName cutsFile("cuts_" + runTime.timeName() + ".obj");
diff --git a/src/dynamicMesh/meshCut/meshModifiers/refinementIterator/refinementIterator.H b/src/dynamicMesh/meshCut/meshModifiers/refinementIterator/refinementIterator.H
index 381ffe0454f..5c0e931de45 100644
--- a/src/dynamicMesh/meshCut/meshModifiers/refinementIterator/refinementIterator.H
+++ b/src/dynamicMesh/meshCut/meshModifiers/refinementIterator/refinementIterator.H
@@ -27,7 +27,7 @@ Class
 
 Description
     Utility class to do iterating meshCutter until all requests satisfied.
- 
+
     Needed since cell cutting can only cut cell once in one go so if
     refinement pattern is not compatible on a cell by cell basis it will
     refuse to cut.
diff --git a/src/dynamicMesh/meshCut/refineCell/refineCell.C b/src/dynamicMesh/meshCut/refineCell/refineCell.C
index 1b2cad2df5e..5fd7256c754 100644
--- a/src/dynamicMesh/meshCut/refineCell/refineCell.C
+++ b/src/dynamicMesh/meshCut/refineCell/refineCell.C
@@ -22,8 +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
-
 \*---------------------------------------------------------------------------*/
 
 #include "refineCell.H"
@@ -31,7 +29,6 @@ Description
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
-// Null
 Foam::refineCell::refineCell()
 :
     cellNo_(-1),
@@ -39,7 +36,6 @@ Foam::refineCell::refineCell()
 {}
 
 
-// from components
 Foam::refineCell::refineCell(const label cellI, const vector& direction)
 :
     cellNo_(cellI),
@@ -61,7 +57,6 @@ Foam::refineCell::refineCell(const label cellI, const vector& direction)
 }
 
 
-// from Istream
 Foam::refineCell::refineCell(Istream& is)
 :
     cellNo_(readLabel(is)),
diff --git a/src/dynamicMesh/meshCut/wallLayerCells/wallNormalInfo/wallNormalInfoI.H b/src/dynamicMesh/meshCut/wallLayerCells/wallNormalInfo/wallNormalInfoI.H
index 1b11fb6624f..3617dda0176 100644
--- a/src/dynamicMesh/meshCut/wallLayerCells/wallNormalInfo/wallNormalInfoI.H
+++ b/src/dynamicMesh/meshCut/wallLayerCells/wallNormalInfo/wallNormalInfoI.H
@@ -52,7 +52,7 @@ inline bool Foam::wallNormalInfo::update(const wallNormalInfo& w2)
         return true;
     }
 }
-    
+
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
@@ -172,7 +172,7 @@ inline bool Foam::wallNormalInfo::updateFace
 )
 {
     return update(neighbourWallInfo);
-}    
+}
 
 
 // * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
diff --git a/src/dynamicMesh/motionSmoother/motionSmoother.C b/src/dynamicMesh/motionSmoother/motionSmoother.C
index 603d032ac77..f24a82cfa82 100644
--- a/src/dynamicMesh/motionSmoother/motionSmoother.C
+++ b/src/dynamicMesh/motionSmoother/motionSmoother.C
@@ -135,7 +135,7 @@ void Foam::motionSmoother::makePatchPatchAddressing()
 
     forAll(bm, patchi)
     {
-        if(!isA<emptyPolyPatch>(bm[patchi]))
+        if (!isA<emptyPolyPatch>(bm[patchi]))
         {
             nPatchPatchPoints += bm[patchi].boundaryPoints().size();
         }
@@ -153,7 +153,7 @@ void Foam::motionSmoother::makePatchPatchAddressing()
 
     forAll(bm, patchi)
     {
-        if(!isA<emptyPolyPatch>(bm[patchi]))
+        if (!isA<emptyPolyPatch>(bm[patchi]))
         {
             const labelList& bp = bm[patchi].boundaryPoints();
             const labelList& meshPoints = bm[patchi].meshPoints();
@@ -1175,7 +1175,7 @@ void Foam::motionSmoother::updateMesh()
 
     forAll(meshPoints, i)
     {
-        isInternalPoint_.set(meshPoints[i], 0);
+        isInternalPoint_.unset(meshPoints[i]);
     }
 
     // Calculate master edge addressing
diff --git a/src/dynamicMesh/motionSmoother/motionSmoother.H b/src/dynamicMesh/motionSmoother/motionSmoother.H
index 944a511cedc..e267a661e6d 100644
--- a/src/dynamicMesh/motionSmoother/motionSmoother.H
+++ b/src/dynamicMesh/motionSmoother/motionSmoother.H
@@ -179,7 +179,7 @@ class motionSmoother
 
     // Private Member Functions
 
-        //- Average value (not positions!) of connected points.
+        //- Average of connected points.
         template <class Type>
         tmp<GeometricField<Type, pointPatchField, pointMesh> > avg
         (
diff --git a/src/dynamicMesh/motionSmoother/motionSmootherTemplates.C b/src/dynamicMesh/motionSmoother/motionSmootherTemplates.C
index 76837c0c4a1..818e2eb4063 100644
--- a/src/dynamicMesh/motionSmoother/motionSmootherTemplates.C
+++ b/src/dynamicMesh/motionSmoother/motionSmootherTemplates.C
@@ -51,7 +51,7 @@ void Foam::motionSmoother::checkConstraints
 
     forAll(bm, patchi)
     {
-        if(!isA<emptyPolyPatch>(bm[patchi]))
+        if (!isA<emptyPolyPatch>(bm[patchi]))
         {
             nPatchPatchPoints += bm[patchi].boundaryPoints().size();
         }
@@ -81,7 +81,7 @@ void Foam::motionSmoother::checkConstraints
 
     forAll(bm, patchi)
     {
-        if(!isA<emptyPolyPatch>(bm[patchi]))
+        if (!isA<emptyPolyPatch>(bm[patchi]))
         {
             const labelList& bp = bm[patchi].boundaryPoints();
             const labelList& meshPoints = bm[patchi].meshPoints();
@@ -93,7 +93,7 @@ void Foam::motionSmoother::checkConstraints
             }
         }
     }
-    
+
 
     // Forward evaluation
 
@@ -106,7 +106,7 @@ void Foam::motionSmoother::checkConstraints
 
     forAll(bm, patchi)
     {
-        if(!isA<emptyPolyPatch>(bm[patchi]))
+        if (!isA<emptyPolyPatch>(bm[patchi]))
         {
             const labelList& bp = bm[patchi].boundaryPoints();
             const labelList& meshPoints = bm[patchi].meshPoints();
@@ -229,6 +229,7 @@ Foam::motionSmoother::avg
         scalar(0)               // null value
     );
 
+
     // Average
     // ~~~~~~~
 
@@ -242,7 +243,7 @@ Foam::motionSmoother::avg
         else
         {
             res[pointI] /= sumWeight[pointI];
-        }        
+        }
     }
 
     res.correctBoundaryConditions();
diff --git a/src/dynamicMesh/motionSmoother/polyMeshGeometry/polyMeshGeometry.C b/src/dynamicMesh/motionSmoother/polyMeshGeometry/polyMeshGeometry.C
index 79646de8398..23f6149a122 100644
--- a/src/dynamicMesh/motionSmoother/polyMeshGeometry/polyMeshGeometry.C
+++ b/src/dynamicMesh/motionSmoother/polyMeshGeometry/polyMeshGeometry.C
@@ -1276,7 +1276,7 @@ bool Foam::polyMeshGeometry::checkFaceAngles
         faceNormal /= mag(faceNormal) + VSMALL;
 
         // Get edge from f[0] to f[size-1];
-        vector ePrev(p[f[0]] - p[f[f.size()-1]]);
+        vector ePrev(p[f.first()] - p[f.last()]);
         scalar magEPrev = mag(ePrev);
         ePrev /= magEPrev + VSMALL;
 
diff --git a/src/dynamicMesh/motionSolver/motionSolver.C b/src/dynamicMesh/motionSolver/motionSolver.C
index 5966679feb7..a8c28ea8752 100644
--- a/src/dynamicMesh/motionSolver/motionSolver.C
+++ b/src/dynamicMesh/motionSolver/motionSolver.C
@@ -78,7 +78,7 @@ Foam::autoPtr<Foam::motionSolver> Foam::motionSolver::New(const polyMesh& mesh)
 
     word solverTypeName(msData);
 
-    Info << "Selecting motion solver: " << solverTypeName << endl;
+    Info<< "Selecting motion solver: " << solverTypeName << endl;
 
     dlLibraryTable::open
     (
diff --git a/src/dynamicMesh/motionSolver/motionSolver.H b/src/dynamicMesh/motionSolver/motionSolver.H
index a7bd50ea73b..e504d50d866 100644
--- a/src/dynamicMesh/motionSolver/motionSolver.H
+++ b/src/dynamicMesh/motionSolver/motionSolver.H
@@ -104,7 +104,7 @@ public:
 
 
     // Member Functions
-        
+
         //- Return reference to mesh
         const polyMesh& mesh() const
         {
diff --git a/src/dynamicMesh/perfectInterface/perfectInterface.C b/src/dynamicMesh/perfectInterface/perfectInterface.C
index ee892b7e873..7501f11da59 100644
--- a/src/dynamicMesh/perfectInterface/perfectInterface.C
+++ b/src/dynamicMesh/perfectInterface/perfectInterface.C
@@ -170,7 +170,7 @@ void Foam::perfectInterface::setRefinement
     // Some aliases
     const edgeList& edges0 = pp0.edges();
     const pointField& pts0 = pp0.localPoints();
-    const pointField& pts1 = pp1.localPoints();    
+    const pointField& pts1 = pp1.localPoints();
     const labelList& meshPts0 = pp0.meshPoints();
     const labelList& meshPts1 = pp1.meshPoints();
 
diff --git a/src/dynamicMesh/polyMeshAdder/faceCoupleInfo.C b/src/dynamicMesh/polyMeshAdder/faceCoupleInfo.C
index bfa9b2ca0c1..4896c0f5535 100644
--- a/src/dynamicMesh/polyMeshAdder/faceCoupleInfo.C
+++ b/src/dynamicMesh/polyMeshAdder/faceCoupleInfo.C
@@ -1,4 +1,4 @@
-/*---------------------------------------------------------------------------*	\
+/*---------------------------------------------------------------------------*\
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
@@ -1790,7 +1790,7 @@ void Foam::faceCoupleInfo::subDivisionMatch
 
             cutPointI = cutEdges[cutEdgeI].otherVertex(cutPointI);
 
-        } while(cutPointI != cutPoint1);
+        } while (cutPointI != cutPoint1);
     }
 
     if (debug)
diff --git a/src/dynamicMesh/polyMeshAdder/faceCoupleInfo.H b/src/dynamicMesh/polyMeshAdder/faceCoupleInfo.H
index fcea7da22bb..a926096e0d8 100644
--- a/src/dynamicMesh/polyMeshAdder/faceCoupleInfo.H
+++ b/src/dynamicMesh/polyMeshAdder/faceCoupleInfo.H
@@ -46,7 +46,7 @@ Description
 
     @verbatim
     e.g. master:
-    
+
         +--+
         |  |
         |  |
@@ -398,7 +398,7 @@ public:
 
         //- Construct from meshes and subset of mesh faces
         //  (i.e. indirectPrimitivePatch addressing)
-        //  All faces in patch are considered matched (but don't have to be 
+        //  All faces in patch are considered matched (but don't have to be
         //  ordered)
         //  perfectMatch : each point/edge/face has corresponding point on other
         //                 side
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/addObject/polyAddFace.H b/src/dynamicMesh/polyTopoChange/polyTopoChange/addObject/polyAddFace.H
index ce03fc0ed16..8ae310fd36d 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/addObject/polyAddFace.H
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/addObject/polyAddFace.H
@@ -86,8 +86,6 @@ class polyAddFace
         //- Face zone flip
         bool zoneFlip_;
 
-        //- Sub patch ID (for proc patches)
-        label subPatchID_;
 
 public:
 
@@ -111,8 +109,7 @@ public:
             flipFaceFlux_(false),
             patchID_(-1),
             zoneID_(-1),
-            zoneFlip_(false),
-            subPatchID_(-1)
+            zoneFlip_(false)
         {}
 
 
@@ -128,8 +125,7 @@ public:
             const bool flipFaceFlux,
             const label patchID,
             const label zoneID,
-            const bool zoneFlip,
-            const label subPatchID
+            const bool zoneFlip
         )
         :
             face_(f),
@@ -141,8 +137,7 @@ public:
             flipFaceFlux_(flipFaceFlux),
             patchID_(patchID),
             zoneID_(zoneID),
-            zoneFlip_(zoneFlip),
-            subPatchID_(subPatchID)
+            zoneFlip_(zoneFlip)
         {
             if (face_.size() < 3)
             {
@@ -159,8 +154,7 @@ public:
                     "    const bool flipFaceFlux,\n"
                     "    const label patchID,\n"
                     "    const label zoneID,\n"
-                    "    const bool zoneFlip,\n"
-                    "    const label subPatchID\n"
+                    "    const bool zoneFlip\n"
                     ")"
                 )   << "Invalid face: less than 3 points.  "
                     << "This is not allowed.\n"
@@ -189,8 +183,7 @@ public:
                     "    const bool flipFaceFlux,\n"
                     "    const label patchID,\n"
                     "    const label zoneID,\n"
-                    "    const bool zoneFlip,\n"
-                    "    const label subPatchID\n"
+                    "    const bool zoneFlip\n"
                     ")"
                 )   << "Face contains invalid vertex ID: " << face_ << ".  "
                     << "This is not allowed.\n"
@@ -219,8 +212,7 @@ public:
                     "    const bool flipFaceFlux,\n"
                     "    const label patchID,\n"
                     "    const label zoneID,\n"
-                    "    const bool zoneFlip,\n"
-                    "    const label subPatchID\n"
+                    "    const bool zoneFlip\n"
                     ")"
                 )   << "Face owner and neighbour are identical.  "
                     << "This is not allowed.\n"
@@ -249,8 +241,7 @@ public:
                     "    const bool flipFaceFlux,\n"
                     "    const label patchID,\n"
                     "    const label zoneID,\n"
-                    "    const bool zoneFlip,\n"
-                    "    const label subPatchID\n"
+                    "    const bool zoneFlip\n"
                     ")"
                 )   << "Patch face has got a neighbour.  Patch ID: " << patchID
                     << ".  This is not allowed.\n"
@@ -278,9 +269,7 @@ public:
                     "    const label masterFaceID,\n"
                     "    const bool flipFaceFlux,\n"
                     "    const label patchID,\n"
-                    "    const label zoneID,\n"
-                    "    const bool zoneFlip,\n"
-                    "    const label subPatchID\n"
+                    "    const label zoneID"
                     ")"
                 )   << "Face has no owner and is not in a zone.  "
                     << "This is not allowed.\n"
@@ -310,9 +299,7 @@ public:
                     "    const bool flipFaceFlux,\n"
                     "    const label patchID,\n"
                     "    const label zoneID,\n"
-                    "    const bool zoneFlip,\n"
-                    "    const label subPatchID\n"
-                    ")"
+                    "    const bool zoneFlip\n"
                     ")"
                 )   << "Specified zone flip for a face that does not  "
                     << "belong to zone.  This is not allowed.\n"
@@ -439,13 +426,6 @@ public:
         {
             return zoneFlip_;
         }
-
-        //- Boundary sub patch ID
-        label subPatchID() const
-        {
-            return subPatchID_;
-        }
-
 };
 
 
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/addPatchCellLayer.C b/src/dynamicMesh/polyTopoChange/polyTopoChange/addPatchCellLayer.C
index 0970237db69..6bbb96ee1ab 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/addPatchCellLayer.C
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/addPatchCellLayer.C
@@ -263,7 +263,7 @@ Foam::labelPair Foam::addPatchCellLayer::getEdgeString
             // - which hasn't been handled yet
             // - with same neighbour
             // - that needs extrusion
-            while(true)
+            while (true)
             {
                 label prevFp = fEdges.rcIndex(startFp);
 
@@ -287,7 +287,7 @@ Foam::labelPair Foam::addPatchCellLayer::getEdgeString
 
             // Search forward for end of string
             endFp = startFp;
-            while(true)
+            while (true)
             {
                 label nextFp = fEdges.fcIndex(endFp);
 
@@ -1276,7 +1276,7 @@ void Foam::addPatchCellLayer::setRefinement
                     doneEdge[fEdges[fp]] = true;
                     fp = f.fcIndex(fp);
                 }
-                stringedVerts[stringedVerts.size()-1] = f[fp];
+                stringedVerts.last() = f[fp];
 
 
                 // Now stringedVerts contains the vertices in order of face f.
@@ -1294,7 +1294,7 @@ void Foam::addPatchCellLayer::setRefinement
 
                 for (label i = 0; i < numEdgeSideFaces; i++)
                 {
-                    label vEnd = stringedVerts[stringedVerts.size()-1];
+                    label vEnd = stringedVerts.last();
                     label vStart = stringedVerts[0];
 
                     // calculate number of points making up a face
@@ -1306,7 +1306,7 @@ void Foam::addPatchCellLayer::setRefinement
                         // faces with more layers.
                         if (addedPoints_[vEnd].size())
                         {
-                            newFp += 
+                            newFp +=
                                 addedPoints_[vEnd].size() - numEdgeSideFaces;
                         }
                         if (addedPoints_[vStart].size())
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/addPatchCellLayer.H b/src/dynamicMesh/polyTopoChange/polyTopoChange/addPatchCellLayer.H
index ebc9380b123..8dfc4450459 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/addPatchCellLayer.H
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/addPatchCellLayer.H
@@ -193,7 +193,7 @@ class addPatchCellLayer
         label addSideFace
         (
             const indirectPrimitivePatch&,
-            const List<labelPair>& patchIDs,
+            const labelList& patchID,
             const labelListList& addedCells,
             const face& newFace,
             const label ownFaceI,
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/combineFaces.C b/src/dynamicMesh/polyTopoChange/polyTopoChange/combineFaces.C
index 236173193b5..3c8f01671b6 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/combineFaces.C
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/combineFaces.C
@@ -62,7 +62,7 @@ bool Foam::combineFaces::convexFace
     n /= mag(n);
 
     // Get edge from f[0] to f[size-1];
-    vector ePrev(points[f[0]] - points[f[f.size()-1]]);
+    vector ePrev(points[f.first()] - points[f.last()]);
     scalar magEPrev = mag(ePrev);
     ePrev /= magEPrev + VSMALL;
 
@@ -658,11 +658,7 @@ void Foam::combineFaces::setRefinement
             zoneFlip = fZone.flipMap()[fZone.whichFace(masterFaceI)];
         }
 
-        labelPair patchIDs = polyTopoChange::whichPatch
-        (
-            mesh_.boundaryMesh(),
-            masterFaceI
-        );
+        label patchI = mesh_.boundaryMesh().whichPatch(masterFaceI);
 
         meshMod.setAction
         (
@@ -673,11 +669,10 @@ void Foam::combineFaces::setRefinement
                 mesh_.faceOwner()[masterFaceI], // owner
                 -1,                             // neighbour
                 false,                          // face flip
-                patchIDs[0],                    // patch for face
+                patchI,                         // patch for face
                 false,                          // remove from zone
                 zoneID,                         // zone for face
-                zoneFlip,                       // face flip in zone
-                patchIDs[1]
+                zoneFlip                        // face flip in zone
             )
         );
 
@@ -961,13 +956,9 @@ void Foam::combineFaces::setUnrefinement
             const faceZone& fZone = mesh_.faceZones()[zoneID];
             zoneFlip = fZone.flipMap()[fZone.whichFace(masterFaceI)];
         }
-        labelPair patchIDs = polyTopoChange::whichPatch
-        (
-            mesh_.boundaryMesh(),
-            masterFaceI
-        );
+        label patchI = mesh_.boundaryMesh().whichPatch(masterFaceI);
 
-        if (mesh_.boundaryMesh()[patchIDs[0]].coupled())
+        if (mesh_.boundaryMesh()[patchI].coupled())
         {
             FatalErrorIn
             (
@@ -975,7 +966,7 @@ void Foam::combineFaces::setUnrefinement
                 "(const labelList&, polyTopoChange&"
                 ", Map<label>&, Map<label>&, Map<label>&)"
             )   << "Master face " << masterFaceI << " is on coupled patch "
-                << mesh_.boundaryMesh()[patchIDs[0]].name()
+                << mesh_.boundaryMesh()[patchI].name()
                 << abort(FatalError);
         }
 
@@ -992,11 +983,10 @@ void Foam::combineFaces::setUnrefinement
                 own,                            // owner
                 -1,                             // neighbour
                 false,                          // face flip
-                patchIDs[0],                    // patch for face
+                patchI,                         // patch for face
                 false,                          // remove from zone
                 zoneID,                         // zone for face
-                zoneFlip,                       // face flip in zone
-                patchIDs[1]                     // subPatchID
+                zoneFlip                        // face flip in zone
             )
         );
 
@@ -1010,17 +1000,16 @@ void Foam::combineFaces::setUnrefinement
             (
                 polyAddFace
                 (
-                    faces[i],                   // vertices
-                    own,                        // owner,
-                    -1,                         // neighbour,
-                    -1,                         // masterPointID,
-                    -1,                         // masterEdgeID,
-                    masterFaceI,                // masterFaceID,
-                    false,                      // flipFaceFlux,
-                    patchIDs[0],                // patchID,
-                    zoneID,                     // zoneID,
-                    zoneFlip,                   // zoneFlip
-                    patchIDs[1]                 // subPatchID
+                    faces[i],        // vertices
+                    own,                    // owner,
+                    -1,                     // neighbour,
+                    -1,                     // masterPointID,
+                    -1,                     // masterEdgeID,
+                    masterFaceI,             // masterFaceID,
+                    false,                  // flipFaceFlux,
+                    patchI,                 // patchID,
+                    zoneID,                 // zoneID,
+                    zoneFlip                // zoneFlip
                 )
             );
         }
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/duplicatePoints.C b/src/dynamicMesh/polyTopoChange/polyTopoChange/duplicatePoints.C
index 22c6682cc84..749dfeb8508 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/duplicatePoints.C
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/duplicatePoints.C
@@ -154,36 +154,34 @@ void Foam::duplicatePoints::setRefinement
             const faceZone& fZone = mesh_.faceZones()[zoneID];
             zoneFlip = fZone.flipMap()[fZone.whichFace(faceI)];
         }
-        labelPair patchIDs = polyTopoChange::whichPatch(patches, faceI);
+
 
         if (mesh_.isInternalFace(faceI))
         {
             meshMod.modifyFace
             (
-                newFace,                        // modified face
-                faceI,                          // label of face being modified
-                mesh_.faceOwner()[faceI],       // owner
+                newFace,                    // modified face
+                faceI,                      // label of face being modified
+                mesh_.faceOwner()[faceI],   // owner
                 mesh_.faceNeighbour()[faceI],   // neighbour
-                false,                          // face flip
-                -1,                             // patch for face
-                zoneID,                         // zone for face
-                zoneFlip,                       // face flip in zone
-                -1                              // subPatch
+                false,                      // face flip
+                -1,                         // patch for face
+                zoneID,                     // zone for face
+                zoneFlip                    // face flip in zone
             );
         }
         else
         {
             meshMod.modifyFace
             (
-                newFace,                        // modified face
-                faceI,                          // label of face being modified
-                mesh_.faceOwner()[faceI],       // owner
-                -1,                             // neighbour
-                false,                          // face flip
-                patchIDs[0],                    // patch for face
-                zoneID,                         // zone for face
-                zoneFlip,                       // face flip in zone
-                patchIDs[1]
+                newFace,                    // modified face
+                faceI,                      // label of face being modified
+                mesh_.faceOwner()[faceI],   // owner
+                -1,                         // neighbour
+                false,                      // face flip
+                patches.whichPatch(faceI),  // patch for face
+                zoneID,                     // zone for face
+                zoneFlip                    // face flip in zone
             );
         }
     }
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/edgeCollapser.C b/src/dynamicMesh/polyTopoChange/polyTopoChange/edgeCollapser.C
index ebbb773d525..2f9a67b9c50 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/edgeCollapser.C
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/edgeCollapser.C
@@ -353,7 +353,7 @@ bool Foam::edgeCollapser::collapseEdge(const label edgeI, const label master)
             // Use the smaller region number for the whole network.
             label minRegion = min(pointRegion0, pointRegion1);
             label maxRegion = max(pointRegion0, pointRegion1);
-    
+
             // Use minRegion as region for combined net, free maxRegion.
             pointRegionMaster_[minRegion] = master;
             pointRegionMaster_[maxRegion] = -1;
@@ -456,7 +456,7 @@ bool Foam::edgeCollapser::setRefinement(polyTopoChange& meshMod)
         {
             break;
         }
-    } while(true);
+    } while (true);
 
 
     // Keep track of faces that have been done already.
@@ -510,7 +510,7 @@ bool Foam::edgeCollapser::setRefinement(polyTopoChange& meshMod)
         }
     }
 
-        
+
 
     // Remove points.
     forAll(pointRegion_, pointI)
@@ -526,7 +526,7 @@ bool Foam::edgeCollapser::setRefinement(polyTopoChange& meshMod)
 
     const polyBoundaryMesh& boundaryMesh = mesh_.boundaryMesh();
     const faceZoneMesh& faceZones = mesh_.faceZones();
-      
+
 
     // Renumber faces that use points
     forAll(pointRegion_, pointI)
@@ -558,16 +558,16 @@ bool Foam::edgeCollapser::setRefinement(polyTopoChange& meshMod)
                     // Get current connectivity
                     label own = faceOwner[faceI];
                     label nei = -1;
-                    labelPair patchIDs = polyTopoChange::whichPatch
-                    (
-                        boundaryMesh,
-                        faceI
-                    );
+                    label patchID = -1;
 
                     if (mesh_.isInternalFace(faceI))
                     {
                         nei = faceNeighbour[faceI];
                     }
+                    else
+                    {
+                        patchID = boundaryMesh.whichPatch(faceI);
+                    }
 
                     meshMod.modifyFace
                     (
@@ -576,10 +576,9 @@ bool Foam::edgeCollapser::setRefinement(polyTopoChange& meshMod)
                         own,                        // owner
                         nei,                        // neighbour
                         false,                      // flipFaceFlux
-                        patchIDs[0],                // patch
+                        patchID,                    // patch
                         zoneID,
-                        zoneFlip,
-                        patchIDs[1]                 // subpatch for face
+                        zoneFlip
                     );
                     meshChanged = true;
                 }
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/faceCollapser.C b/src/dynamicMesh/polyTopoChange/polyTopoChange/faceCollapser.C
index 1fe59cfd915..210b40999fd 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/faceCollapser.C
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/faceCollapser.C
@@ -22,8 +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
-
 \*---------------------------------------------------------------------------*/
 
 #include "faceCollapser.H"
@@ -156,16 +154,16 @@ void Foam::faceCollapser::filterFace
     {
         label nei = -1;
 
-        labelPair patchIDs = polyTopoChange::whichPatch
-        (
-            mesh_.boundaryMesh(),
-            faceI
-        );
+        label patchI = -1;
 
         if (mesh_.isInternalFace(faceI))
         {
             nei = mesh_.faceNeighbour()[faceI];
         }
+        else
+        {
+            patchI = mesh_.boundaryMesh().whichPatch(faceI);
+        }
 
         // Get current zone info
         label zoneID = mesh_.faceZones().whichZone(faceI);
@@ -188,11 +186,10 @@ void Foam::faceCollapser::filterFace
                 mesh_.faceOwner()[faceI],   // owner
                 nei,                        // neighbour
                 false,                      // face flip
-                patchIDs[0],                // patch for face
+                patchI,                     // patch for face
                 false,                      // remove from zone
                 zoneID,                     // zone for face
-                zoneFlip,                   // face flip in zone
-                patchIDs[1]
+                zoneFlip                    // face flip in zone
             )
         );
     }
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/hexRef8.C b/src/dynamicMesh/polyTopoChange/polyTopoChange/hexRef8.C
index 13e7082b848..e72b4471270 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/hexRef8.C
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/hexRef8.C
@@ -97,12 +97,17 @@ void Foam::hexRef8::reorder
 void Foam::hexRef8::getFaceInfo
 (
     const label faceI,
-    labelPair& patchIDs,
+    label& patchID,
     label& zoneID,
     label& zoneFlip
 ) const
 {
-    patchIDs = polyTopoChange::whichPatch(mesh_.boundaryMesh(), faceI);
+    patchID = -1;
+
+    if (!mesh_.isInternalFace(faceI))
+    {
+        patchID = mesh_.boundaryMesh().whichPatch(faceI);
+    }
 
     zoneID = mesh_.faceZones().whichZone(faceI);
 
@@ -127,9 +132,9 @@ Foam::label Foam::hexRef8::addFace
     const label nei
 ) const
 {
-    labelPair patchIDs;
-    label zoneID, zoneFlip;
-    getFaceInfo(faceI, patchIDs, zoneID, zoneFlip);
+    label patchID, zoneID, zoneFlip;
+
+    getFaceInfo(faceI, patchID, zoneID, zoneFlip);
 
     label newFaceI = -1;
 
@@ -147,10 +152,9 @@ Foam::label Foam::hexRef8::addFace
                 -1,                         // master edge
                 faceI,                      // master face for addition
                 false,                      // flux flip
-                patchIDs[0],                // patch for face
+                patchID,                    // patch for face
                 zoneID,                     // zone for face
-                zoneFlip,                   // face zone flip
-                patchIDs[1]                 // subPatch
+                zoneFlip                    // face zone flip
             )
         );
     }
@@ -168,10 +172,9 @@ Foam::label Foam::hexRef8::addFace
                 -1,                         // master edge
                 faceI,                      // master face for addition
                 false,                      // flux flip
-                patchIDs[0],                // patch for face
+                patchID,                    // patch for face
                 zoneID,                     // zone for face
-                zoneFlip,                   // face zone flip
-                patchIDs[1]                 // subPatch
+                zoneFlip                    // face zone flip
             )
         );
     }
@@ -210,8 +213,7 @@ Foam::label Foam::hexRef8::addInternalFace
                 false,                      // flux flip
                 -1,                         // patch for face
                 -1,                         // zone for face
-                false,                      // face zone flip
-                -1                          // subPatch
+                false                       // face zone flip
             )
         );
     }
@@ -239,8 +241,7 @@ Foam::label Foam::hexRef8::addInternalFace
                 false,                      // flux flip
                 -1,                         // patch for face
                 -1,                         // zone for face
-                false,                      // face zone flip
-                -1                          // subPatch
+                false                       // face zone flip
             )
         );
 
@@ -275,8 +276,7 @@ Foam::label Foam::hexRef8::addInternalFace
         //        false,                      // flux flip
         //        -1,                         // patch for face
         //        -1,                         // zone for face
-        //        false,                      // face zone flip
-        //        -1                          // subPatch
+        //        false                       // face zone flip
         //    )
         //);
     }
@@ -293,9 +293,9 @@ void Foam::hexRef8::modFace
     const label nei
 ) const
 {
-    labelPair patchIDs;
-    label zoneID, zoneFlip;
-    getFaceInfo(faceI, patchIDs, zoneID, zoneFlip);
+    label patchID, zoneID, zoneFlip;
+
+    getFaceInfo(faceI, patchID, zoneID, zoneFlip);
 
     if
     (
@@ -318,11 +318,10 @@ void Foam::hexRef8::modFace
                     own,                // owner
                     nei,                // neighbour
                     false,              // face flip
-                    patchIDs[0],        // patch for face
+                    patchID,            // patch for face
                     false,              // remove from zone
                     zoneID,             // zone for face
-                    zoneFlip,           // face flip in zone
-                    patchIDs[1]         // subPatch
+                    zoneFlip            // face flip in zone
                 )
             );
         }
@@ -337,11 +336,10 @@ void Foam::hexRef8::modFace
                     nei,                    // owner
                     own,                    // neighbour
                     false,                  // face flip
-                    patchIDs[0],            // patch for face
+                    patchID,                // patch for face
                     false,                  // remove from zone
                     zoneID,                 // zone for face
-                    zoneFlip,               // face flip in zone
-                    patchIDs[1]             // subPatch
+                    zoneFlip                // face flip in zone
                 )
             );
         }
@@ -1585,11 +1583,11 @@ Foam::label Foam::hexRef8::faceConsistentRefinement
         {
             if (maxSet)
             {
-                refineCell.set(nei, 1);
+                refineCell.set(nei);
             }
             else
             {
-                refineCell.set(own, 0);
+                refineCell.unset(own);
             }
             nChanged++;
         }
@@ -1597,11 +1595,11 @@ Foam::label Foam::hexRef8::faceConsistentRefinement
         {
             if (maxSet)
             {
-                refineCell.set(own, 1);
+                refineCell.set(own);
             }
             else
             {
-                refineCell.set(nei, 0);
+                refineCell.unset(nei);
             }
             nChanged++;
         }
@@ -1632,7 +1630,7 @@ Foam::label Foam::hexRef8::faceConsistentRefinement
         {
             if (!maxSet)
             {
-                refineCell.set(own, 0);
+                refineCell.unset(own);
                 nChanged++;
             }
         }
@@ -1640,7 +1638,7 @@ Foam::label Foam::hexRef8::faceConsistentRefinement
         {
             if (maxSet)
             {
-                refineCell.set(own, 1);
+                refineCell.set(own);
                 nChanged++;
             }
         }
@@ -1659,7 +1657,7 @@ void Foam::hexRef8::checkWantedRefinementLevels
     PackedBoolList refineCell(mesh_.nCells());
     forAll(cellsToRefine, i)
     {
-        refineCell.set(cellsToRefine[i], 1);
+        refineCell.set(cellsToRefine[i]);
     }
 
     for (label faceI = 0; faceI < mesh_.nInternalFaces(); faceI++)
@@ -2044,7 +2042,7 @@ Foam::labelList Foam::hexRef8::consistentRefinement
     PackedBoolList refineCell(mesh_.nCells());
     forAll(cellsToRefine, i)
     {
-        refineCell.set(cellsToRefine[i], 1);
+        refineCell.set(cellsToRefine[i]);
     }
 
     while (true)
@@ -2072,7 +2070,7 @@ Foam::labelList Foam::hexRef8::consistentRefinement
 
     forAll(refineCell, cellI)
     {
-        if (refineCell.get(cellI) == 1)
+        if (refineCell.get(cellI))
         {
             nRefined++;
         }
@@ -2083,7 +2081,7 @@ Foam::labelList Foam::hexRef8::consistentRefinement
 
     forAll(refineCell, cellI)
     {
-        if (refineCell.get(cellI) == 1)
+        if (refineCell.get(cellI))
         {
             newCellsToRefine[nRefined++] = cellI;
         }
@@ -2223,7 +2221,7 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement
                     faceCount
                 )
             );
-            allFaceInfo[faceI] = seedFacesInfo[seedFacesInfo.size()-1];
+            allFaceInfo[faceI] = seedFacesInfo.last();
         }
         else
         {
@@ -2239,7 +2237,7 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement
                     faceCount
                 )
             );
-            allFaceInfo[faceI] = seedFacesInfo[seedFacesInfo.size()-1];
+            allFaceInfo[faceI] = seedFacesInfo.last();
         }
     }
 
@@ -2320,7 +2318,7 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement
         allCellInfo
     );
 
-    while(true)
+    while (true)
     {
         if (debug)
         {
@@ -2895,7 +2893,7 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
 
         if (wanted > cellLevel_[cellI]+1)
         {
-            refineCell.set(cellI, 1);
+            refineCell.set(cellI);
         }
     }
     faceConsistentRefinement(true, refineCell);
@@ -2924,7 +2922,7 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
 
     forAll(refineCell, cellI)
     {
-        if (refineCell.get(cellI) == 1)
+        if (refineCell.get(cellI))
         {
             nRefined++;
         }
@@ -2935,7 +2933,7 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
 
     forAll(refineCell, cellI)
     {
-        if (refineCell.get(cellI) == 1)
+        if (refineCell.get(cellI))
         {
             newCellsToRefine[nRefined++] = cellI;
         }
@@ -2968,7 +2966,7 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
         PackedBoolList refineCell(mesh_.nCells());
         forAll(newCellsToRefine, i)
         {
-            refineCell.set(newCellsToRefine[i], 1);
+            refineCell.set(newCellsToRefine[i]);
         }
         const PackedBoolList savedRefineCell(refineCell);
 
@@ -2981,7 +2979,7 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
             );
             forAll(refineCell, cellI)
             {
-                if (refineCell.get(cellI) == 1)
+                if (refineCell.get(cellI))
                 {
                     cellsOut2.insert(cellI);
                 }
@@ -2996,11 +2994,7 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
         {
             forAll(refineCell, cellI)
             {
-                if
-                (
-                    refineCell.get(cellI) == 1
-                 && savedRefineCell.get(cellI) == 0
-                )
+                if (refineCell.get(cellI) && !savedRefineCell.get(cellI))
                 {
                     dumpCell(cellI);
                     FatalErrorIn
@@ -3602,7 +3596,7 @@ Foam::labelListList Foam::hexRef8::setRefinement
 
                 forAll(cFaces, i)
                 {
-                    affectedFace.set(cFaces[i], 1);
+                    affectedFace.set(cFaces[i]);
                 }
             }
         }
@@ -3611,7 +3605,7 @@ Foam::labelListList Foam::hexRef8::setRefinement
         {
             if (faceMidPoint[faceI] >= 0)
             {
-                affectedFace.set(faceI, 1);
+                affectedFace.set(faceI);
             }
         }
 
@@ -3623,7 +3617,7 @@ Foam::labelListList Foam::hexRef8::setRefinement
 
                 forAll(eFaces, i)
                 {
-                    affectedFace.set(eFaces[i], 1);
+                    affectedFace.set(eFaces[i]);
                 }
             }
         }
@@ -3640,7 +3634,7 @@ Foam::labelListList Foam::hexRef8::setRefinement
 
     forAll(faceMidPoint, faceI)
     {
-        if (faceMidPoint[faceI] >= 0 && affectedFace.get(faceI) == 1)
+        if (faceMidPoint[faceI] >= 0 && affectedFace.get(faceI))
         {
             // Face needs to be split and hasn't yet been done in some way
             // (affectedFace - is impossible since this is first change but
@@ -3761,7 +3755,7 @@ Foam::labelListList Foam::hexRef8::setRefinement
             }
 
             // Mark face as having been handled
-            affectedFace.set(faceI, 0);
+            affectedFace.unset(faceI);
         }
     }
 
@@ -3791,7 +3785,7 @@ Foam::labelListList Foam::hexRef8::setRefinement
             {
                 label faceI = eFaces[i];
 
-                if (faceMidPoint[faceI] < 0 && affectedFace.get(faceI) == 1)
+                if (faceMidPoint[faceI] < 0 && affectedFace.get(faceI))
                 {
                     // Unsplit face. Add edge splits to face.
 
@@ -3872,7 +3866,7 @@ Foam::labelListList Foam::hexRef8::setRefinement
                     modFace(meshMod, faceI, newFace, own, nei);
 
                     // Mark face as having been handled
-                    affectedFace.set(faceI, 0);
+                    affectedFace.unset(faceI);
                 }
             }
         }
@@ -3891,7 +3885,7 @@ Foam::labelListList Foam::hexRef8::setRefinement
 
     forAll(affectedFace, faceI)
     {
-        if (affectedFace.get(faceI) == 1)
+        if (affectedFace.get(faceI))
         {
             const face& f = mesh_.faces()[faceI];
 
@@ -3914,7 +3908,7 @@ Foam::labelListList Foam::hexRef8::setRefinement
             modFace(meshMod, faceI, f, own, nei);
 
             // Mark face as having been handled
-            affectedFace.set(faceI, 0);
+            affectedFace.unset(faceI);
         }
     }
 
@@ -5096,7 +5090,7 @@ Foam::labelList Foam::hexRef8::consistentUnrefinement
     {
         label pointI = pointsToUnrefine[i];
 
-        unrefinePoint.set(pointI, 1);
+        unrefinePoint.set(pointI);
     }
 
 
@@ -5109,13 +5103,13 @@ Foam::labelList Foam::hexRef8::consistentUnrefinement
 
         forAll(unrefinePoint, pointI)
         {
-            if (unrefinePoint.get(pointI) == 1)
+            if (unrefinePoint.get(pointI))
             {
                 const labelList& pCells = mesh_.pointCells(pointI);
 
                 forAll(pCells, j)
                 {
-                    unrefineCell.set(pCells[j], 1);
+                    unrefineCell.set(pCells[j]);
                 }
             }
         }
@@ -5143,17 +5137,24 @@ Foam::labelList Foam::hexRef8::consistentUnrefinement
 
                 if (maxSet)
                 {
-                    unrefineCell.set(nei, 1);
+                    unrefineCell.set(nei);
                 }
                 else
                 {
+                    // could also combine with unset:
+                    // if (!unrefineCell.unset(own))
+                    // {
+                    //     FatalErrorIn("hexRef8::consistentUnrefinement(..)")
+                    //         << "problem cell already unset"
+                    //         << abort(FatalError);
+                    // }
                     if (unrefineCell.get(own) == 0)
                     {
                         FatalErrorIn("hexRef8::consistentUnrefinement(..)")
                             << "problem" << abort(FatalError);
                     }
 
-                    unrefineCell.set(own, 0);
+                    unrefineCell.unset(own);
                 }
                 nChanged++;
             }
@@ -5161,7 +5162,7 @@ Foam::labelList Foam::hexRef8::consistentUnrefinement
             {
                 if (maxSet)
                 {
-                    unrefineCell.set(own, 1);
+                    unrefineCell.set(own);
                 }
                 else
                 {
@@ -5171,7 +5172,7 @@ Foam::labelList Foam::hexRef8::consistentUnrefinement
                             << "problem" << abort(FatalError);
                     }
 
-                    unrefineCell.set(nei, 0);
+                    unrefineCell.unset(nei);
                 }
                 nChanged++;
             }
@@ -5207,7 +5208,7 @@ Foam::labelList Foam::hexRef8::consistentUnrefinement
                             << "problem" << abort(FatalError);
                     }
 
-                    unrefineCell.set(own, 0);
+                    unrefineCell.unset(own);
                     nChanged++;
                 }
             }
@@ -5221,7 +5222,7 @@ Foam::labelList Foam::hexRef8::consistentUnrefinement
                             << "problem" << abort(FatalError);
                     }
 
-                    unrefineCell.set(own, 1);
+                    unrefineCell.set(own);
                     nChanged++;
                 }
             }
@@ -5249,15 +5250,15 @@ Foam::labelList Foam::hexRef8::consistentUnrefinement
         // Knock out any point whose cell neighbour cannot be unrefined.
         forAll(unrefinePoint, pointI)
         {
-            if (unrefinePoint.get(pointI) == 1)
+            if (unrefinePoint.get(pointI))
             {
                 const labelList& pCells = mesh_.pointCells(pointI);
 
                 forAll(pCells, j)
                 {
-                    if (unrefineCell.get(pCells[j]) == 0)
+                    if (!unrefineCell.get(pCells[j]))
                     {
-                        unrefinePoint.set(pointI, 0);
+                        unrefinePoint.unset(pointI);
                         break;
                     }
                 }
@@ -5271,7 +5272,7 @@ Foam::labelList Foam::hexRef8::consistentUnrefinement
 
     forAll(unrefinePoint, pointI)
     {
-        if (unrefinePoint.get(pointI) == 1)
+        if (unrefinePoint.get(pointI))
         {
             nSet++;
         }
@@ -5282,7 +5283,7 @@ Foam::labelList Foam::hexRef8::consistentUnrefinement
 
     forAll(unrefinePoint, pointI)
     {
-        if (unrefinePoint.get(pointI) == 1)
+        if (unrefinePoint.get(pointI))
         {
             newPointsToUnrefine[nSet++] = pointI;
         }
@@ -5320,8 +5321,7 @@ void Foam::hexRef8::setUnrefinement
             {
                 FatalErrorIn
                 (
-                    "hexRef8::setUnrefinement"
-                    "(const labelList&, polyTopoChange&)"
+                    "hexRef8::setUnrefinement(const labelList&, polyTopoChange&)"
                 )   << "Illegal cell level " << cellLevel_[cellI]
                     << " for cell " << cellI
                     << abort(FatalError);
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/hexRef8.H b/src/dynamicMesh/polyTopoChange/polyTopoChange/hexRef8.H
index e88eeff43f2..d986946b578 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/hexRef8.H
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/hexRef8.H
@@ -105,7 +105,7 @@ class hexRef8
         void getFaceInfo
         (
             const label faceI,
-            labelPair& patchIDs,
+            label& patchID,
             label& zoneID,
             label& zoneFlip
         ) const;
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/localPointRegion.C b/src/dynamicMesh/polyTopoChange/polyTopoChange/localPointRegion.C
index 708f2ca1b93..a4b1e754fa0 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/localPointRegion.C
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/localPointRegion.C
@@ -61,7 +61,6 @@ public:
 
 }
 
-
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
 // Are two lists identical either in forward or in reverse order.
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/modifyObject/polyModifyFace.H b/src/dynamicMesh/polyTopoChange/polyTopoChange/modifyObject/polyModifyFace.H
index bdbae2e404e..9da1bf97712 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/modifyObject/polyModifyFace.H
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/modifyObject/polyModifyFace.H
@@ -53,7 +53,7 @@ class polyModifyFace
 {
     // Private data
 
-        //- Face 
+        //- Face
         face face_;
 
         //- Master face ID
@@ -80,9 +80,6 @@ class polyModifyFace
         //- Face zone flip
         bool zoneFlip_;
 
-        //- Sub patch ID (for proc patches)
-        label subPatchID_;
-
 
 public:
 
@@ -105,8 +102,7 @@ public:
             patchID_(-1),
             removeFromZone_(false),
             zoneID_(-1),
-            zoneFlip_(false),
-            subPatchID_(-1)
+            zoneFlip_(false)
         {}
 
         //- Construct from components
@@ -120,8 +116,7 @@ public:
             const label patchID,
             const bool removeFromZone,
             const label zoneID,
-            const bool zoneFlip,
-            const label subPatchID
+            const bool zoneFlip
         )
         :
             face_(f),
@@ -132,8 +127,7 @@ public:
             patchID_(patchID),
             removeFromZone_(removeFromZone),
             zoneID_(zoneID),
-            zoneFlip_(zoneFlip),
-            subPatchID_(subPatchID)
+            zoneFlip_(zoneFlip)
         {
             if (face_.size() < 3)
             {
@@ -149,8 +143,7 @@ public:
                     "    const label patchID,\n"
                     "    const bool removeFromZone,\n"
                     "    const label zoneID,\n"
-                    "    const bool zoneFlip,\n"
-                    "    const label subPatchID\n"
+                    "    const bool zoneFlip\n"
                     ")"
                 )   << "Invalid face: less than 3 points. This is not allowed\n"
                     << "Face: " << face_
@@ -174,8 +167,7 @@ public:
                     "    const label patchID,\n"
                     "    const bool removeFromZone,\n"
                     "    const label zoneID,\n"
-                    "    const bool zoneFlip,\n"
-                    "    const label subPatchID\n"
+                    "    const bool zoneFlip\n"
                     ")"
                 )   << "Face contains invalid vertex ID: " << face_ << ".  "
                     << "This is not allowed.\n"
@@ -199,8 +191,7 @@ public:
                     "    const label patchID,\n"
                     "    const bool removeFromZone,\n"
                     "    const label zoneID,\n"
-                    "    const bool zoneFlip,\n"
-                    "    const label subPatchID\n"
+                    "    const bool zoneFlip\n"
                     ")"
                 )   << "Face owner and neighbour are identical.  "
                     << "This is not allowed.\n"
@@ -225,8 +216,7 @@ public:
                     "    const label patchID,\n"
                     "    const bool removeFromZone,\n"
                     "    const label zoneID,\n"
-                    "    const bool zoneFlip,\n"
-                    "    const label subPatchID\n"
+                    "    const bool zoneFlip\n"
                     ")"
                 )   << "Patch face has got a neighbour  "
                     << "This is not allowed.\n"
@@ -252,8 +242,7 @@ public:
                     "    const label patchID,\n"
                     "    const bool removeFromZone,\n"
                     "    const label zoneID,\n"
-                    "    const bool zoneFlip,\n"
-                    "    const label subPatchID\n"
+                    "    const bool zoneFlip\n"
                     ")"
                 )   << "Specified zone flip for a face that does not  "
                     << "belong to zone.  This is not allowed.\n"
@@ -263,32 +252,6 @@ public:
                     << " neighbour:" << neighbour_
                     << abort(FatalError);
             }
-
-            if (patchID < 0 && subPatchID_ >= 0)
-            {
-                FatalErrorIn
-                (
-                    "polyModifyFace::polyModifyFace\n"
-                    "(\n"
-                    "    const face& f,\n"
-                    "    const label faceID,\n"
-                    "    const label owner,\n"
-                    "    const label neighbour,\n"
-                    "    const bool flipFaceFlux,\n"
-                    "    const label patchID,\n"
-                    "    const bool removeFromZone,\n"
-                    "    const label zoneID,\n"
-                    "    const bool zoneFlip,\n"
-                    "    const label subPatchID\n"
-                    ")"
-                )   << "Specified subPatchID on an internal face (patchID < 0"
-                    << ". This is not allowed.\n"
-                    << "Face: " << face_
-                    << " faceID:" << faceID_
-                    << " owner:" << owner_
-                    << " neighbour:" << neighbour_
-                    << abort(FatalError);
-            }
         }
 
         //- Construct and return a clone
@@ -372,12 +335,6 @@ public:
         {
             return zoneFlip_;
         }
-
-        //- Boundary sub patch ID
-        label subPatchID() const
-        {
-            return subPatchID_;
-        }
 };
 
 
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.C b/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.C
index 1f413e59511..3da4d9f5143 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.C
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.C
@@ -1828,43 +1828,6 @@ Foam::face Foam::polyTopoChange::rotateFace
 }
 
 
-bool Foam::polyTopoChange::orderAndMerge
-(
-    const polyPatch& pp,
-    const primitivePatch& faces,
-    const label start,
-
-    labelList& oldToNew,
-    labelList& rotation
-) const
-{
-    labelList patchFaceMap(faces.size(), -1);
-    labelList patchFaceRotation(faces.size(), 0);
-
-    bool changed = pp.order
-    (
-        faces,
-        patchFaceMap,
-        patchFaceRotation
-    );
-
-    if (changed)
-    {
-        // Merge patch face reordering into mesh face reordering table
-        forAll(patchFaceMap, patchFaceI)
-        {
-            oldToNew[patchFaceI + start] = start + patchFaceMap[patchFaceI];
-        }
-
-        forAll(patchFaceRotation, patchFaceI)
-        {
-            rotation[patchFaceI + start] = patchFaceRotation[patchFaceI];
-        }
-    }
-    return changed;
-}
-    
-
 void Foam::polyTopoChange::reorderCoupledFaces
 (
     const bool syncParallel,
@@ -2244,6 +2207,7 @@ void Foam::polyTopoChange::addMesh
         // Extend
         points_.setCapacity(points_.size() + points.size());
         pointMap_.setCapacity(pointMap_.size() + points.size());
+        reversePointMap_.setCapacity(reversePointMap_.size() + points.size());
         pointZone_.resize(pointZone_.size() + points.size()/100);
 
         // Precalc offset zones
@@ -2283,6 +2247,7 @@ void Foam::polyTopoChange::addMesh
         label nAllCells = mesh.nCells();
 
         cellMap_.setCapacity(cellMap_.size() + nAllCells);
+        reverseCellMap_.setCapacity(reverseCellMap_.size() + nAllCells);
         cellFromPoint_.resize(cellFromPoint_.size() + nAllCells/100);
         cellFromEdge_.resize(cellFromEdge_.size() + nAllCells/100);
         cellFromFace_.resize(cellFromFace_.size() + nAllCells/100);
@@ -2347,6 +2312,7 @@ void Foam::polyTopoChange::addMesh
         faceOwner_.setCapacity(faceOwner_.size() + nAllFaces);
         faceNeighbour_.setCapacity(faceNeighbour_.size() + nAllFaces);
         faceMap_.setCapacity(faceMap_.size() + nAllFaces);
+        reverseFaceMap_.setCapacity(reverseFaceMap_.size() + nAllFaces);
         faceFromPoint_.resize(faceFromPoint_.size() + nAllFaces/100);
         faceFromEdge_.resize(faceFromEdge_.size() + nAllFaces/100);
         flipFaceFlux_.setCapacity(faces_.size() + nAllFaces);
@@ -2431,6 +2397,39 @@ void Foam::polyTopoChange::addMesh
 }
 
 
+void Foam::polyTopoChange::setCapacity
+(
+    const label nPoints,
+    const label nFaces,
+    const label nCells
+)
+{
+    points_.setCapacity(nPoints);
+    pointMap_.setCapacity(nPoints);
+    reversePointMap_.setCapacity(nPoints);
+    pointZone_.resize(pointZone_.size() + nPoints/100);
+
+    faces_.setCapacity(nFaces);
+    region_.setCapacity(nFaces);
+    faceOwner_.setCapacity(nFaces);
+    faceNeighbour_.setCapacity(nFaces);
+    faceMap_.setCapacity(nFaces);
+    reverseFaceMap_.setCapacity(nFaces);
+    faceFromPoint_.resize(faceFromPoint_.size() + nFaces/100);
+    faceFromEdge_.resize(faceFromEdge_.size() + nFaces/100);
+    flipFaceFlux_.setCapacity(nFaces);
+    faceZone_.resize(faceZone_.size() + nFaces/100);
+    faceZoneFlip_.setCapacity(nFaces);
+
+    cellMap_.setCapacity(nCells);
+    reverseCellMap_.setCapacity(nCells);
+    cellFromPoint_.resize(cellFromPoint_.size() + nCells/100);
+    cellFromEdge_.resize(cellFromEdge_.size() + nCells/100);
+    cellFromFace_.resize(cellFromFace_.size() + nCells/100);
+    cellZone_.setCapacity(nCells);
+}
+
+
 Foam::label Foam::polyTopoChange::setAction(const topoAction& action)
 {
     if (isType<polyAddPoint>(action))
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.H b/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.H
index 27b00a518a5..a5ffe331d5a 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.H
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.H
@@ -50,8 +50,9 @@ Description
     To see if point is equal to above value we don't use == (which might give
     problems with roundoff error) but instead compare the individual component
     with >.
-    - coupled patches: the reorderCoupledFaces routine reorders coupled patch
-    faces and uses the cyclicPolyPatch,processorPolyPatch functionality.
+    - coupled patches: the reorderCoupledFaces routine (borrowed from
+    the couplePatches utility) reorders coupled patch faces and
+    uses the cyclicPolyPatch,processorPolyPatch functionality.
 
 SourceFiles
     polyTopoChange.C
@@ -471,6 +472,15 @@ public:
                 const labelList& cellZoneMap
             );
 
+            //- Explicitly pre-size the dynamic storage for expected mesh
+            //  size for if construct-without-mesh
+            void setCapacity
+            (
+                const label nPoints,
+                const label nFaces,
+                const label nCells
+            );
+
             //- Move all points. Incompatible with other topology changes.
             void movePoints(const pointField& newPoints);
 
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChangeTemplates.C b/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChangeTemplates.C
index 53129b262d5..527138ede10 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChangeTemplates.C
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChangeTemplates.C
@@ -22,8 +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
-
 \*---------------------------------------------------------------------------*/
 
 #include "polyTopoChange.H"
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/refinementDataI.H b/src/dynamicMesh/polyTopoChange/polyTopoChange/refinementDataI.H
index 847210e6368..5e442c9e191 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/refinementDataI.H
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/refinementDataI.H
@@ -223,7 +223,7 @@ inline bool Foam::refinementData::updateFace
 
         return true;
     }
-}    
+}
 
 
 // * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/refinementDistanceDataI.H b/src/dynamicMesh/polyTopoChange/polyTopoChange/refinementDistanceDataI.H
index afe234a80f4..44b46562a32 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/refinementDistanceDataI.H
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/refinementDistanceDataI.H
@@ -241,7 +241,7 @@ inline bool Foam::refinementDistanceData::updateFace
     const point& pos = mesh.faceCentres()[thisFaceI];
 
     return update(pos, neighbourInfo, tol);
-}    
+}
 
 
 // * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/refinementHistory.C b/src/dynamicMesh/polyTopoChange/polyTopoChange/refinementHistory.C
index 86be16d7a07..3239c6a8e0e 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/refinementHistory.C
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/refinementHistory.C
@@ -745,7 +745,7 @@ Pout<< "refinementHistory::distribute :"
                 newSplitCells.append(splitCells_[index]);
 
                 Pout<< "Added oldCell " << index
-                    << " info " << newSplitCells[newSplitCells.size()-1]
+                    << " info " << newSplitCells.last()
                     << " at position " << newSplitCells.size()-1
                     << endl;
             }
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/removeCells.C b/src/dynamicMesh/polyTopoChange/polyTopoChange/removeCells.C
index 9eeae51859f..42ef072b299 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/removeCells.C
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/removeCells.C
@@ -342,8 +342,7 @@ void Foam::removeCells::setRefinement
                         newPatchID[faceI],      // patch for face
                         false,                  // remove from zone
                         zoneID,                 // zone for face
-                        zoneFlip,               // face flip in zone
-                        -1
+                        zoneFlip                // face flip in zone
                     )
                 );
             }
@@ -389,8 +388,7 @@ void Foam::removeCells::setRefinement
                     newPatchID[faceI],      // patch for face
                     false,                  // remove from zone
                     zoneID,                 // zone for face
-                    zoneFlip,               // face flip in zone
-                    -1
+                    zoneFlip                // face flip in zone
                 )
             );
         }
@@ -433,8 +431,7 @@ void Foam::removeCells::setRefinement
                             newPatchID[faceI],      // patch for face
                             false,                  // remove from zone
                             zoneID,                 // zone for face
-                            zoneFlip,               // face flip in zone
-                            -1
+                            zoneFlip                // face flip in zone
                         )
                     );
                 }
@@ -484,7 +481,7 @@ void Foam::removeCells::setRefinement
                 faceI++;
             }
         }
-    }    
+    }
 
 
     // Remove points that are no longer used.
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/removeFaces.C b/src/dynamicMesh/polyTopoChange/polyTopoChange/removeFaces.C
index 2a29f8bb75a..4165d56b8ed 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/removeFaces.C
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/removeFaces.C
@@ -330,9 +330,9 @@ void Foam::removeFaces::mergeFaces
         own = cellRegionMaster[cellRegion[own]];
     }
 
-    labelPair patchIDs;
-    label zoneID, zoneFlip;
-    getFaceInfo(faceI, patchIDs, zoneID, zoneFlip);
+    label patchID, zoneID, zoneFlip;
+
+    getFaceInfo(faceI, patchID, zoneID, zoneFlip);
 
     label nei = -1;
 
@@ -390,7 +390,7 @@ void Foam::removeFaces::mergeFaces
         own,                // owner
         nei,                // neighbour
         false,              // face flip
-        patchIDs,           // patch info for face
+        patchID,            // patch for face
         false,              // remove from zone
         zoneID,             // zone for face
         zoneFlip,           // face flip in zone
@@ -416,12 +416,18 @@ void Foam::removeFaces::mergeFaces
 void Foam::removeFaces::getFaceInfo
 (
     const label faceI,
-    labelPair& patchIDs,
+
+    label& patchID,
     label& zoneID,
     label& zoneFlip
 ) const
 {
-    patchIDs = polyTopoChange::whichPatch(mesh_.boundaryMesh(), faceI);
+    patchID = -1;
+
+    if (!mesh_.isInternalFace(faceI))
+    {
+        patchID = mesh_.boundaryMesh().whichPatch(faceI);
+    }
 
     zoneID = mesh_.faceZones().whichZone(faceI);
 
@@ -473,7 +479,7 @@ void Foam::removeFaces::modFace
     const label own,
     const label nei,
     const bool flipFaceFlux,
-    const labelPair& newPatchIDs,
+    const label newPatchID,
     const bool removeFromZone,
     const label zoneID,
     const bool zoneFlip,
@@ -491,7 +497,7 @@ void Foam::removeFaces::modFace
 //                << "  own:" << own
 //                << "  nei:" << nei
 //                << "  flipFaceFlux:" << flipFaceFlux
-//                << "  newPatchIDs:" << newPatchIDs
+//                << "  newPatchID:" << newPatchID
 //                << "  removeFromZone:" << removeFromZone
 //                << "  zoneID:" << zoneID
 //                << "  zoneFlip:" << zoneFlip
@@ -507,11 +513,10 @@ void Foam::removeFaces::modFace
                 own,            // owner
                 nei,            // neighbour
                 flipFaceFlux,   // face flip
-                newPatchIDs[0], // patch for face
+                newPatchID,     // patch for face
                 removeFromZone, // remove from zone
                 zoneID,         // zone for face
-                zoneFlip,       // face flip in zone
-                newPatchIDs[1]
+                zoneFlip        // face flip in zone
             )
         );
     }
@@ -525,7 +530,7 @@ void Foam::removeFaces::modFace
 //                << "  own:" << nei
 //                << "  nei:" << own
 //                << "  flipFaceFlux:" << flipFaceFlux
-//                << "  newPatchIDs:" << newPatchIDs
+//                << "  newPatchID:" << newPatchID
 //                << "  removeFromZone:" << removeFromZone
 //                << "  zoneID:" << zoneID
 //                << "  zoneFlip:" << zoneFlip
@@ -541,11 +546,10 @@ void Foam::removeFaces::modFace
                 nei,            // owner
                 own,            // neighbour
                 flipFaceFlux,   // face flip
-                newPatchIDs[0], // patch for face
+                newPatchID,     // patch for face
                 removeFromZone, // remove from zone
                 zoneID,         // zone for face
-                zoneFlip,       // face flip in zone
-                newPatchIDs[1]
+                zoneFlip        // face flip in zone
             )
         );
     }
@@ -1461,9 +1465,9 @@ void Foam::removeFaces::setRefinement
                 own = cellRegionMaster[cellRegion[own]];
             }
 
-            labelPair patchIDs;
-            label zoneID, zoneFlip;
-            getFaceInfo(faceI, patchIDs, zoneID, zoneFlip);
+            label patchID, zoneID, zoneFlip;
+
+            getFaceInfo(faceI, patchID, zoneID, zoneFlip);
 
             label nei = -1;
 
@@ -1494,7 +1498,7 @@ void Foam::removeFaces::setRefinement
                 own,                // owner
                 nei,                // neighbour
                 false,              // face flip
-                patchIDs,           // patchinfo for face
+                patchID,            // patch for face
                 false,              // remove from zone
                 zoneID,             // zone for face
                 zoneFlip,           // face flip in zone
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/removeFaces.H b/src/dynamicMesh/polyTopoChange/polyTopoChange/removeFaces.H
index 70cec8ae015..e691a4f4e3e 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/removeFaces.H
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/removeFaces.H
@@ -44,7 +44,6 @@ SourceFiles
 #include "Map.H"
 #include "boolList.H"
 #include "indirectPrimitivePatch.H"
-#include "labelPair.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -132,7 +131,7 @@ class removeFaces
             void getFaceInfo
             (
                 const label faceI,
-                labelPair& patchIDs,
+                label& patchID,
                 label& zoneID,
                 label& zoneFlip
             ) const;
@@ -148,7 +147,7 @@ class removeFaces
                 const label own,
                 const label nei,
                 const bool flipFaceFlux,
-                const labelPair& newPatchIDs,
+                const label newPatchID,
                 const bool removeFromZone,
                 const label zoneID,
                 const bool zoneFlip,
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/removePoints.C b/src/dynamicMesh/polyTopoChange/polyTopoChange/removePoints.C
index 2699bbd3d8e..7146aee8123 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/removePoints.C
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/removePoints.C
@@ -106,11 +106,7 @@ void Foam::removePoints::modifyFace
 ) const
 {
     // Get other face data.
-    labelPair patchIDs = polyTopoChange::whichPatch
-    (
-        mesh_.boundaryMesh(),
-        faceI
-    );
+    label patchI = -1;
     label owner = mesh_.faceOwner()[faceI];
     label neighbour = -1;
 
@@ -118,6 +114,10 @@ void Foam::removePoints::modifyFace
     {
         neighbour = mesh_.faceNeighbour()[faceI];
     }
+    else
+    {
+        patchI = mesh_.boundaryMesh().whichPatch(faceI);
+    }
 
     label zoneID = mesh_.faceZones().whichZone(faceI);
 
@@ -139,11 +139,10 @@ void Foam::removePoints::modifyFace
             owner,          // owner
             neighbour,      // neighbour
             false,          // face flip
-            patchIDs[0],    // patch for face
+            patchI,         // patch for face
             false,          // remove from zone
             zoneID,         // zone for face
-            zoneFlip,       // face flip in zone
-            patchIDs[1]
+            zoneFlip        // face flip in zone
         )
     );
 }
@@ -304,7 +303,7 @@ void Foam::removePoints::setRefinement
         savedPoints_.setSize(nDeleted);
         pointToSaved.resize(2*nDeleted);
     }
-    
+
 
     // Remove points
     // ~~~~~~~~~~~~~
@@ -737,7 +736,7 @@ void Foam::removePoints::getUnrefimentSet
     localPoints = localPointsSet.toc();
 
 
-    // Collect all saved faces using any localPointsSet 
+    // Collect all saved faces using any localPointsSet
     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
     labelHashSet localFacesSet(2*undoFaces.size());
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChanger/polyTopoChanger.C b/src/dynamicMesh/polyTopoChange/polyTopoChanger/polyTopoChanger.C
index c89388e3199..6519c0e86de 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChanger/polyTopoChanger.C
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChanger/polyTopoChanger.C
@@ -174,14 +174,14 @@ bool Foam::polyTopoChanger::changeTopology() const
             {
                 Info<< "Modifier " << morphI << " named "
                     << topoChanges[morphI].name();
-                
+
                 if (curTriggerChange)
                 {
-                    Info << " morphing" << endl;
+                    Info<< " morphing" << endl;
                 }
                 else
                 {
-                    Info << " unchanged" << endl;
+                    Info<< " unchanged" << endl;
                 }
             }
 
@@ -195,7 +195,7 @@ bool Foam::polyTopoChanger::changeTopology() const
                     << topoChanges[morphI].name() << " inactive" << endl;
             }
         }
-            
+
     }
 
     return triggerChange;
@@ -252,7 +252,7 @@ void Foam::polyTopoChanger::update(const mapPolyMesh& m)
 
     // Force the mesh modifiers to auto-write.  This allows us to
     // preserve the current state of modifiers corresponding with
-    // the mesh.  
+    // the mesh.
     writeOpt() = IOobject::AUTO_WRITE;
     instance() = mesh_.time().timeName();
 }
diff --git a/src/dynamicMesh/polyTopoChange/repatchPolyTopoChanger/repatchPolyTopoChanger.C b/src/dynamicMesh/polyTopoChange/repatchPolyTopoChanger/repatchPolyTopoChanger.C
index 22f15ed544e..2cb88d9f34d 100644
--- a/src/dynamicMesh/polyTopoChange/repatchPolyTopoChanger/repatchPolyTopoChanger.C
+++ b/src/dynamicMesh/polyTopoChange/repatchPolyTopoChanger/repatchPolyTopoChanger.C
@@ -132,8 +132,7 @@ void Foam::repatchPolyTopoChanger::changePatchID
             patchID,                            // patch ID
             false,                              // remove from zone
             zoneID,                             // zone ID
-            zoneFlip,                           // zone flip
-            -1                                  //? subPatch TBD.
+            zoneFlip                            // zone flip
         )
     );
 }
@@ -165,12 +164,6 @@ void Foam::repatchPolyTopoChanger::setFaceZone
         }
     }
 
-    labelPair patchIDs = polyTopoChange::whichPatch
-    (
-        mesh_.boundaryMesh(),
-        faceID
-    );
-
     meshMod().setAction
     (
         polyModifyFace
@@ -180,11 +173,10 @@ void Foam::repatchPolyTopoChanger::setFaceZone
             mesh_.faceOwner()[faceID],          // owner
             mesh_.faceNeighbour()[faceID],      // neighbour
             false,                              // flip flux
-            patchIDs[0],                        // patch ID
+            mesh_.boundaryMesh().whichPatch(faceID),  // patch ID
             true,                               // remove from zone
             zoneID,                             // zone ID
-            zoneFlip,                           // zone flip
-            patchIDs[1]
+            zoneFlip                            // zone flip
         )
     );
 }
@@ -231,11 +223,7 @@ void Foam::repatchPolyTopoChanger::changeAnchorPoint
             << abort(FatalError);
     }
 
-    labelPair patchIDs = polyTopoChange::whichPatch
-    (
-        mesh_.boundaryMesh(),
-        faceID
-    );
+    label patchID = mesh_.boundaryMesh().whichPatch(faceID);
 
     const label zoneID = mesh_.faceZones().whichZone(faceID);
 
@@ -260,11 +248,10 @@ void Foam::repatchPolyTopoChanger::changeAnchorPoint
                 mesh_.faceOwner()[faceID],          // owner
                 -1,                                 // neighbour
                 false,                              // flip flux
-                patchIDs[0],                        // patch ID
+                patchID,                            // patch ID
                 false,                              // remove from zone
                 zoneID,                             // zone ID
-                zoneFlip,                           // zone flip
-                patchIDs[1]
+                zoneFlip                            // zone flip
             )
         );
     }
@@ -296,11 +283,10 @@ void Foam::repatchPolyTopoChanger::changeAnchorPoint
                 mesh_.faceOwner()[faceID],          // owner
                 -1,                                 // neighbour
                 false,                              // flip flux
-                patchIDs[0],                        // patch ID
+                patchID,                            // patch ID
                 false,                              // remove from zone
                 zoneID,                             // zone ID
-                zoneFlip,                           // zone flip
-                patchIDs[1]
+                zoneFlip                            // zone flip
             )
         );
     }
diff --git a/src/dynamicMesh/polyTopoChange/repatchPolyTopoChanger/repatchPolyTopoChanger.H b/src/dynamicMesh/polyTopoChange/repatchPolyTopoChanger/repatchPolyTopoChanger.H
index a0bd681a6a4..ede3211a22f 100644
--- a/src/dynamicMesh/polyTopoChange/repatchPolyTopoChanger/repatchPolyTopoChanger.H
+++ b/src/dynamicMesh/polyTopoChange/repatchPolyTopoChanger/repatchPolyTopoChanger.H
@@ -28,7 +28,7 @@ Class
 Description
     A mesh which allows changes in the patch distribution of the
     boundary faces.  The change in patching is set using changePatchID. For a
-    boundary face, a new patch ID is given. 
+    boundary face, a new patch ID is given.
 
 SourceFiles
     repatchPolyTopoChanger.C
diff --git a/src/dynamicMesh/setUpdater/setUpdater.H b/src/dynamicMesh/setUpdater/setUpdater.H
index ecdb99d9e6e..2e25527f94e 100644
--- a/src/dynamicMesh/setUpdater/setUpdater.H
+++ b/src/dynamicMesh/setUpdater/setUpdater.H
@@ -55,7 +55,7 @@ class setUpdater
 {
     // Private Member Functions
 
-        //- Updates all sets 
+        //- Updates all sets
         template<class Type>
         void updateSets(const mapPolyMesh& morphMap) const;
 
diff --git a/src/dynamicMesh/setUpdater/setUpdaterTemplates.C b/src/dynamicMesh/setUpdater/setUpdaterTemplates.C
index 668c4be5be2..0239728de2c 100644
--- a/src/dynamicMesh/setUpdater/setUpdaterTemplates.C
+++ b/src/dynamicMesh/setUpdater/setUpdaterTemplates.C
@@ -44,7 +44,7 @@ void setUpdater::updateSets(const mapPolyMesh& morphMap) const
     // Update all sets in memory.
     //
 
-    HashTable<const Type*> memSets = 
+    HashTable<const Type*> memSets =
         morphMap.mesh().objectRegistry::lookupClass<Type>();
 
     for
diff --git a/src/dynamicMesh/slidingInterface/coupleSlidingInterface.C b/src/dynamicMesh/slidingInterface/coupleSlidingInterface.C
index cd4328b4c81..f90e9a036b4 100644
--- a/src/dynamicMesh/slidingInterface/coupleSlidingInterface.C
+++ b/src/dynamicMesh/slidingInterface/coupleSlidingInterface.C
@@ -831,8 +831,7 @@ void Foam::slidingInterface::coupleInterface(polyTopoChange& ref) const
                                 -1,                          // patch ID
                                 false,                       // remove from zone
                                 masterFaceZoneID_.index(),   // zone ID
-                                masterPatchFlip[curMaster],  // zone flip
-                                -1                           // subPatch ID
+                                masterPatchFlip[curMaster]   // zone flip
                             )
                         );
 //                         Pout << "modifying master face. Old master: " << masterPatch[curMaster] << " new face: " << curCutFace.reverseFace() << " own: " << masterFc[curMaster] << " nei: " << slaveFc[curSlave] << endl;
@@ -853,8 +852,7 @@ void Foam::slidingInterface::coupleInterface(polyTopoChange& ref) const
                                 -1,                          // patch ID
                                 false,                       // remove from zone
                                 masterFaceZoneID_.index(),   // zone ID
-                                !masterPatchFlip[curMaster], // zone flip
-                                -1                           // subPatch ID
+                                !masterPatchFlip[curMaster]  // zone flip
                             )
                         );
                     }
@@ -877,8 +875,7 @@ void Foam::slidingInterface::coupleInterface(polyTopoChange& ref) const
                             masterPatchID_.index(),      // patch ID
                             false,                       // remove from zone
                             masterFaceZoneID_.index(),   // zone ID
-                            masterPatchFlip[curMaster],  // zone flip
-                            -1                           // subPatchID - TBD
+                            masterPatchFlip[curMaster]   // zone flip
                         )
                     );
                 }
@@ -925,8 +922,7 @@ void Foam::slidingInterface::coupleInterface(polyTopoChange& ref) const
                                 -1,                          // patch ID
                                 false,                       // remove from zone
                                 slaveFaceZoneID_.index(),    // zone ID
-                                !slavePatchFlip[curMaster],  // zone flip
-                                -1                           // subPatch ID
+                                !slavePatchFlip[curMaster]   // zone flip
                             )
                         );
                     }
@@ -947,8 +943,7 @@ void Foam::slidingInterface::coupleInterface(polyTopoChange& ref) const
                                 -1,                          // patch ID
                                 false,                       // remove from zone
                                 slaveFaceZoneID_.index(),    // zone ID
-                                slavePatchFlip[curSlave],    // zone flip
-                                -1                           // subPatch ID
+                                slavePatchFlip[curSlave]     // zone flip
                             )
                         );
                     }
@@ -971,8 +966,7 @@ void Foam::slidingInterface::coupleInterface(polyTopoChange& ref) const
                             slavePatchID_.index(),       // patch ID
                             false,                       // remove from zone
                             slaveFaceZoneID_.index(),    // zone ID
-                            slavePatchFlip[curSlave],    // zone flip
-                            -1                           // subPatchID - TBD
+                            slavePatchFlip[curSlave]     // zone flip
                         )
                     );
                 }
@@ -1018,8 +1012,7 @@ void Foam::slidingInterface::coupleInterface(polyTopoChange& ref) const
                                 false,                       // flux flip
                                 -1,                          // patch ID
                                 cutFaceZoneID_.index(),      // zone ID
-                                false,                       // zone flip
-                                -1                           // subPatch ID
+                                false                        // zone flip
                             )
                         );
                     }
@@ -1039,8 +1032,7 @@ void Foam::slidingInterface::coupleInterface(polyTopoChange& ref) const
                                 true,                        // flux flip
                                 -1,                          // patch ID
                                 cutFaceZoneID_.index(),      // zone ID
-                                true,                        // zone flip
-                                -1                           // subPatch ID
+                                true                         // zone flip
                             )
                         );
                     }
@@ -1065,8 +1057,7 @@ void Foam::slidingInterface::coupleInterface(polyTopoChange& ref) const
                             false,                       // flux flip
                             masterPatchID_.index(),      // patch ID
                             cutFaceZoneID_.index(),      // zone ID
-                            false,                       // zone flip
-                            -1                           // subPatchID - TBD
+                            false                        // zone flip
                         )
                     );
                 }
@@ -1091,8 +1082,7 @@ void Foam::slidingInterface::coupleInterface(polyTopoChange& ref) const
                         false,                       // flux flip
                         slavePatchID_.index(),       // patch ID
                         cutFaceZoneID_.index(),      // zone ID
-                        false,                       // zone flip
-                        -1                           // subPatchID - TBD
+                        false                        // zone flip
                     )
                 );
 
@@ -1137,8 +1127,7 @@ void Foam::slidingInterface::coupleInterface(polyTopoChange& ref) const
             //        -1,                                 // patch ID
             //        false,                              // remove from zone
             //        masterFaceZoneID_.index(),          // zone ID
-            //        false,                              // zone flip
-            //        -1                                  // subPatch ID
+            //        false                               // zone flip
             //    )
             //);
 
@@ -1169,8 +1158,7 @@ void Foam::slidingInterface::coupleInterface(polyTopoChange& ref) const
             //        -1,                               // patch ID
             //        false,                            // remove from zone
             //        slaveFaceZoneID_.index(),         // zone ID
-            //        false,                            // zone flip
-            //        -1                                // subPatch ID
+            //        false                             // zone flip
             //    )
             //);
 
@@ -1428,12 +1416,6 @@ void Foam::slidingInterface::coupleInterface(polyTopoChange& ref) const
             //Pout << "Modifying master stick-out face " << curFaceID
             //    << " old face: " << oldFace << " new face: " << newFace << endl;
 
-            labelPair patchIDs = polyTopoChange::whichPatch
-            (
-                mesh.boundaryMesh(),
-                curFaceID
-            );
-
             // Modify the face
             if (mesh.isInternalFace(curFaceID))
             {
@@ -1449,8 +1431,7 @@ void Foam::slidingInterface::coupleInterface(polyTopoChange& ref) const
                         -1,                     // patch for face
                         false,                  // remove from zone
                         modifiedFaceZone,       // zone for face
-                        modifiedFaceZoneFlip,   // face flip in zone
-                        patchIDs[1]             // subPatch ID
+                        modifiedFaceZoneFlip    // face flip in zone
                     )
                 );
             }
@@ -1468,8 +1449,7 @@ void Foam::slidingInterface::coupleInterface(polyTopoChange& ref) const
                         mesh.boundaryMesh().whichPatch(curFaceID), // patch for face
                         false,                  // remove from zone
                         modifiedFaceZone,       // zone for face
-                        modifiedFaceZoneFlip,   // face flip in zone
-                        patchIDs[1]             // subPatch ID
+                        modifiedFaceZoneFlip    // face flip in zone
                     )
                 );
             }
@@ -1741,11 +1721,6 @@ void Foam::slidingInterface::coupleInterface(polyTopoChange& ref) const
             newFace.transfer(newFaceLabels);
 
 //             Pout << "Modifying slave stick-out face " << curFaceID << " old face: " << oldFace << " new face: " << newFace << endl;
-            labelPair patchIDs = polyTopoChange::whichPatch
-            (
-                mesh.boundaryMesh(),
-                curFaceID
-            );
 
             // Modify the face
             if (mesh.isInternalFace(curFaceID))
@@ -1762,8 +1737,7 @@ void Foam::slidingInterface::coupleInterface(polyTopoChange& ref) const
                         -1,                     // patch for face
                         false,                  // remove from zone
                         modifiedFaceZone,       // zone for face
-                        modifiedFaceZoneFlip,   // face flip in zone
-                        patchIDs[1]             // subPatch ID
+                        modifiedFaceZoneFlip    // face flip in zone
                     )
                 );
             }
@@ -1781,8 +1755,7 @@ void Foam::slidingInterface::coupleInterface(polyTopoChange& ref) const
                         mesh.boundaryMesh().whichPatch(curFaceID), // patch for face
                         false,                  // remove from zone
                         modifiedFaceZone,       // zone for face
-                        modifiedFaceZoneFlip,   // face flip in zone
-                        patchIDs[1]             // subPatch ID
+                        modifiedFaceZoneFlip    // face flip in zone
                     )
                 );
             }
diff --git a/src/dynamicMesh/slidingInterface/decoupleSlidingInterface.C b/src/dynamicMesh/slidingInterface/decoupleSlidingInterface.C
index 5fce9c815cf..87595375a60 100644
--- a/src/dynamicMesh/slidingInterface/decoupleSlidingInterface.C
+++ b/src/dynamicMesh/slidingInterface/decoupleSlidingInterface.C
@@ -97,16 +97,15 @@ void Foam::slidingInterface::decoupleInterface
         (
             polyModifyFace
             (
-                newFace,                        // new face
-                masterPatchAddr[faceI],         // master face index
-                masterFc[faceI],                // owner
-                -1,                             // neighbour
-                false,                          // flux flip
-                masterPatchID_.index(),         // patch ID
-                false,                          // remove from zone
-                masterFaceZoneID_.index(),      // zone ID
-                false,                          // zone flip.  Face corrected
-                -1                              //?TBD subPatch
+                newFace,                         // new face
+                masterPatchAddr[faceI],          // master face index
+                masterFc[faceI],                 // owner
+                -1,                              // neighbour
+                false,                           // flux flip
+                masterPatchID_.index(),          // patch ID
+                false,                           // remove from zone
+                masterFaceZoneID_.index(),       // zone ID
+                false                            // zone flip.  Face corrected
             )
         );
 //         Pout << "Modifying master patch face no " << masterPatchAddr[faceI] << " face: " << faces[masterPatchAddr[faceI]] << " old owner: " << own[masterPatchAddr[faceI]] << " new owner: " << masterFc[faceI] << endl;
@@ -156,16 +155,15 @@ void Foam::slidingInterface::decoupleInterface
         (
             polyModifyFace
             (
-                newFace,                        // new face
-                slavePatchAddr[faceI],          // master face index
-                slaveFc[faceI],                 // owner
-                -1,                             // neighbour
-                false,                          // flux flip
-                slavePatchID_.index(),          // patch ID
-                false,                          // remove from zone
-                slaveFaceZoneID_.index(),       // zone ID
-                false,                          // zone flip.  Face corrected
-                -1                              //?TBD subPatch
+                newFace,                         // new face
+                slavePatchAddr[faceI],           // master face index
+                slaveFc[faceI],                  // owner
+                -1,                              // neighbour
+                false,                           // flux flip
+                slavePatchID_.index(),           // patch ID
+                false,                           // remove from zone
+                slaveFaceZoneID_.index(),        // zone ID
+                false                            // zone flip.  Face corrected
             )
         );
     }
@@ -233,12 +231,6 @@ void Foam::slidingInterface::decoupleInterface
 
 //             Pout << "Modifying master stick-out face " << curFaceID << " old face: " << oldFace << " new face: " << newFace << endl;
 
-            labelPair patchIDs = polyTopoChange::whichPatch
-            (
-                mesh.boundaryMesh(),
-                curFaceID
-            );
-
             // Modify the face
             ref.setAction
             (
@@ -249,11 +241,10 @@ void Foam::slidingInterface::decoupleInterface
                     own[curFaceID],         // owner
                     nei[curFaceID],         // neighbour
                     false,                  // face flip
-                    patchIDs[0],            // patch for face
+                    mesh.boundaryMesh().whichPatch(curFaceID), // patch for face
                     false,                  // remove from zone
                     modifiedFaceZone,       // zone for face
-                    modifiedFaceZoneFlip,   // face flip in zone
-                    patchIDs[1]
+                    modifiedFaceZoneFlip    // face flip in zone
                 )
             );
         }
@@ -363,12 +354,6 @@ void Foam::slidingInterface::decoupleInterface
 
 //             Pout << "Modifying slave stick-out face " << curFaceID << " old face: " << oldFace << " new face: " << newFace << endl;
 
-            labelPair patchIDs = polyTopoChange::whichPatch
-            (
-                mesh.boundaryMesh(),
-                curFaceID
-            );
-
             // Modify the face
             ref.setAction
             (
@@ -379,11 +364,10 @@ void Foam::slidingInterface::decoupleInterface
                     own[curFaceID],         // owner
                     nei[curFaceID],         // neighbour
                     false,                  // face flip
-                    patchIDs[0],            // patch for face
+                    mesh.boundaryMesh().whichPatch(curFaceID), // patch for face
                     false,                  // remove from zone
                     modifiedFaceZone,       // zone for face
-                    modifiedFaceZoneFlip,   // face flip in zone
-                    patchIDs[1]
+                    modifiedFaceZoneFlip    // face flip in zone
                 )
             );
         }
diff --git a/src/dynamicMesh/slidingInterface/enrichedPatch/enrichedPatch.C b/src/dynamicMesh/slidingInterface/enrichedPatch/enrichedPatch.C
index eb191b3f0f1..d6eec016d67 100644
--- a/src/dynamicMesh/slidingInterface/enrichedPatch/enrichedPatch.C
+++ b/src/dynamicMesh/slidingInterface/enrichedPatch/enrichedPatch.C
@@ -22,8 +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
-
 \*---------------------------------------------------------------------------*/
 
 #include "enrichedPatch.H"
diff --git a/src/dynamicMesh/slidingInterface/enrichedPatch/enrichedPatchFaces.C b/src/dynamicMesh/slidingInterface/enrichedPatch/enrichedPatchFaces.C
index bad4dd118e5..28639c41bcd 100644
--- a/src/dynamicMesh/slidingInterface/enrichedPatch/enrichedPatchFaces.C
+++ b/src/dynamicMesh/slidingInterface/enrichedPatch/enrichedPatchFaces.C
@@ -22,8 +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
-
 \*---------------------------------------------------------------------------*/
 
 #include "enrichedPatch.H"
@@ -91,7 +89,7 @@ void Foam::enrichedPatch::calcEnrichedFaces
     {
         const face oldFace = slavePatch_[faceI];
         const face oldLocalFace = slaveLocalFaces[faceI];
-//         Info << "old slave face " << faceI << ": " << oldFace << endl;
+//         Info<< "old slave face " << faceI << ": " << oldFace << endl;
         const labelList& curEdges = slaveFaceEdges[faceI];
 
         DynamicList<label> newFace(oldFace.size()*enrichedFaceRatio_);
@@ -133,7 +131,7 @@ void Foam::enrichedPatch::calcEnrichedFaces
 
             const labelList& slavePointsOnEdge =
                 pointsIntoSlaveEdges[curEdges[i]];
-//             Info << "slavePointsOnEdge for " << curEdges[i] << ": " << slavePointsOnEdge << endl;
+//             Info<< "slavePointsOnEdge for " << curEdges[i] << ": " << slavePointsOnEdge << endl;
             // If there are no points on the edge, skip everything
             // If there is only one point, no need for sorting
             if (slavePointsOnEdge.size())
@@ -246,7 +244,7 @@ void Foam::enrichedPatch::calcEnrichedFaces
     {
         const face& oldFace = masterPatch_[faceI];
         const face& oldLocalFace = masterLocalFaces[faceI];
-//         Info << "old master face: " << oldFace << endl;
+//         Info<< "old master face: " << oldFace << endl;
         const labelList& curEdges = masterFaceEdges[faceI];
 
         DynamicList<label> newFace(oldFace.size()*enrichedFaceRatio_);
diff --git a/src/dynamicMesh/slidingInterface/enrichedPatch/enrichedPatchMasterPoints.C b/src/dynamicMesh/slidingInterface/enrichedPatch/enrichedPatchMasterPoints.C
index e2815308de9..4c166e43b5f 100644
--- a/src/dynamicMesh/slidingInterface/enrichedPatch/enrichedPatchMasterPoints.C
+++ b/src/dynamicMesh/slidingInterface/enrichedPatch/enrichedPatchMasterPoints.C
@@ -22,8 +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
-
 \*---------------------------------------------------------------------------*/
 
 #include "enrichedPatch.H"
diff --git a/src/dynamicMesh/slidingInterface/enrichedPatch/enrichedPatchPointMap.C b/src/dynamicMesh/slidingInterface/enrichedPatch/enrichedPatchPointMap.C
index 78fa217b6ae..60cc4c8b05c 100644
--- a/src/dynamicMesh/slidingInterface/enrichedPatch/enrichedPatchPointMap.C
+++ b/src/dynamicMesh/slidingInterface/enrichedPatch/enrichedPatchPointMap.C
@@ -22,8 +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
-
 \*---------------------------------------------------------------------------*/
 
 #include "enrichedPatch.H"
diff --git a/src/dynamicMesh/slidingInterface/enrichedPatch/enrichedPatchPointPoints.C b/src/dynamicMesh/slidingInterface/enrichedPatch/enrichedPatchPointPoints.C
index 461306b277b..81c895b6e27 100644
--- a/src/dynamicMesh/slidingInterface/enrichedPatch/enrichedPatchPointPoints.C
+++ b/src/dynamicMesh/slidingInterface/enrichedPatch/enrichedPatchPointPoints.C
@@ -22,8 +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
-
 \*---------------------------------------------------------------------------*/
 
 #include "enrichedPatch.H"
diff --git a/src/dynamicMesh/slidingInterface/slidingInterface.C b/src/dynamicMesh/slidingInterface/slidingInterface.C
index 316dd389b6f..12d99e8083e 100644
--- a/src/dynamicMesh/slidingInterface/slidingInterface.C
+++ b/src/dynamicMesh/slidingInterface/slidingInterface.C
@@ -420,7 +420,7 @@ void Foam::slidingInterface::setRefinement(polyTopoChange& ref) const
         }
 
         coupleInterface(ref);
-        
+
         trigger_ = false;
     }
 }
@@ -430,7 +430,7 @@ void Foam::slidingInterface::modifyMotionPoints(pointField& motionPoints) const
 {
     if (debug)
     {
-        Pout<< "void slidingInterface::modifyMotionPoints(" 
+        Pout<< "void slidingInterface::modifyMotionPoints("
             << "pointField& motionPoints) const for object " << name() << " : "
             << "Adjusting motion points." << endl;
     }
@@ -485,7 +485,7 @@ void Foam::slidingInterface::modifyMotionPoints(pointField& motionPoints) const
             else
             {
                 // A cut point is not a projected slave point.  Therefore, it
-                // must be an edge-to-edge intersection.  
+                // must be an edge-to-edge intersection.
 
                 Map<Pair<edge> >::const_iterator cpepmIter =
                     cpepm.find(cutPoints[pointI]);
@@ -499,7 +499,7 @@ void Foam::slidingInterface::modifyMotionPoints(pointField& motionPoints) const
                     // slidingInterface::coupleInterface.  This is done for
                     // efficiency reasons and avoids multiple creation of
                     // cutting planes.  Please update both simultaneously.
-                    // 
+                    //
                     const edge& globalMasterEdge = cpepmIter().first();
 
                     const label curMasterEdgeIndex =
@@ -582,7 +582,7 @@ void Foam::slidingInterface::modifyMotionPoints(pointField& motionPoints) const
                         if (slaveCut.hit())
                         {
                             // Strict checking of slave cut to avoid capturing
-                            // end points.  
+                            // end points.
                             scalar cutOnSlave =
                                 (
                                     (
@@ -615,7 +615,7 @@ void Foam::slidingInterface::modifyMotionPoints(pointField& motionPoints) const
                                 << cme.line(masterLocalPoints)
                                 << " slave edge: " << curSlaveLine
                                 << " point: " << masterCutPoint
-                                << " weight: " << 
+                                << " weight: " <<
                                 (
                                     (
                                         slaveCut.missPoint()
@@ -657,7 +657,7 @@ void Foam::slidingInterface::updateMesh(const mapPolyMesh& m)
 {
     if (debug)
     {
-        Pout<< "void slidingInterface::updateMesh(const mapPolyMesh& m)" 
+        Pout<< "void slidingInterface::updateMesh(const mapPolyMesh& m)"
             << " const for object " << name() << " : "
             << "Updating topology." << endl;
     }
@@ -771,7 +771,7 @@ void Foam::slidingInterface::write(Ostream& os) const
 
 // To write out all those tolerances
 #define WRITE_NON_DEFAULT(name) \
-    if( name ## _ != name ## Default_ )\
+    if ( name ## _ != name ## Default_ )\
     { \
         os << "    " #name " " <<  name ## _ << token::END_STATEMENT << nl; \
     }
diff --git a/src/dynamicMesh/slidingInterface/slidingInterfaceAttachedAddressing.C b/src/dynamicMesh/slidingInterface/slidingInterfaceAttachedAddressing.C
index 49af1fab16a..3ee23e42309 100644
--- a/src/dynamicMesh/slidingInterface/slidingInterfaceAttachedAddressing.C
+++ b/src/dynamicMesh/slidingInterface/slidingInterfaceAttachedAddressing.C
@@ -205,7 +205,7 @@ void Foam::slidingInterface::calcAttachedAddressing() const
 
 
         // Retired point addressing does not exist at this stage.
-        // It will be filled when the interface is coupled.  
+        // It will be filled when the interface is coupled.
         retiredPointMapPtr_ =
             new Map<label>
             (
@@ -213,7 +213,7 @@ void Foam::slidingInterface::calcAttachedAddressing() const
             );
 
         // Ditto for cut point edge map.  This is a rough guess of its size
-        // 
+        //
         cutPointEdgePairMapPtr_ =
             new Map<Pair<edge> >
             (
@@ -262,7 +262,7 @@ void Foam::slidingInterface::renumberAttachedAddressing
     // The renumbering map is needed the other way around, i.e. giving
     // the new cell number for every old cell next to the interface.
     const labelList& reverseCellMap = m.reverseCellMap();
-    
+
     const labelList& mfc = masterFaceCells();
     const labelList& sfc = slaveFaceCells();
 
@@ -319,7 +319,7 @@ void Foam::slidingInterface::renumberAttachedAddressing
     // Renumber stick-out faces
 
     const labelList& reverseFaceMap = m.reverseFaceMap();
-    
+
     // Master side
     const labelList& msof = masterStickOutFaces();
 
@@ -480,7 +480,7 @@ void Foam::slidingInterface::renumberAttachedAddressing
     clearAttachedAddressing();
 
     deleteDemandDrivenData(projectedSlavePointsPtr_);
-    
+
     masterFaceCellsPtr_ = newMfcPtr;
     slaveFaceCellsPtr_ = newSfcPtr;
 
diff --git a/src/dynamicMesh/slidingInterface/slidingInterfaceProjectPoints.C b/src/dynamicMesh/slidingInterface/slidingInterfaceProjectPoints.C
index cc4643bcdea..ec01953b197 100644
--- a/src/dynamicMesh/slidingInterface/slidingInterfaceProjectPoints.C
+++ b/src/dynamicMesh/slidingInterface/slidingInterfaceProjectPoints.C
@@ -177,14 +177,14 @@ bool Foam::slidingInterface::projectPoints() const
             slaveEdges[edgeI].mag(slaveLocalPoints);
 
         // Do points
-        minSlavePointLength[curEdge.start()] = 
+        minSlavePointLength[curEdge.start()] =
             min
             (
                 minSlavePointLength[curEdge.start()],
                 curLength
             );
 
-        minSlavePointLength[curEdge.end()] = 
+        minSlavePointLength[curEdge.end()] =
             min
             (
                 minSlavePointLength[curEdge.end()],
@@ -420,7 +420,7 @@ bool Foam::slidingInterface::projectPoints() const
 //     scalarField magDiffs(mag(slaveLocalPoints - projectedSlavePoints));
 //     Pout<< "Slave point face hits: " << slavePointFaceHits << nl
 //         << "slave points: " << slaveLocalPoints << nl
-//         << "Projected slave points: " << projectedSlavePoints 
+//         << "Projected slave points: " << projectedSlavePoints
 //         << "diffs: " << magDiffs << endl;
 
     // Merge projected points against master points
@@ -455,7 +455,7 @@ bool Foam::slidingInterface::projectPoints() const
             label mergePoint = -1;
             scalar mergeDist = GREAT;
 
-            // Try all point before deciding on best fit.  
+            // Try all point before deciding on best fit.
             forAll (hitFace, hitPointI)
             {
                 scalar dist =
@@ -554,7 +554,7 @@ bool Foam::slidingInterface::projectPoints() const
                 masterFaceEdges[slavePointFaceHits[pointI].hitObject()];
 
             // Calculate the tolerance
-            const scalar mergeLength = 
+            const scalar mergeLength =
                 min
                 (
                     minSlavePointLength[pointI],
@@ -589,7 +589,7 @@ bool Foam::slidingInterface::projectPoints() const
 
 //                         Pout<< "Moving slave point "
 //                             << slavePatch.meshPoints()[pointI]
-//                             << " (" << pointI 
+//                             << " (" << pointI
 //                             << ") at " << slaveLocalPoints[pointI]
 //                             << " onto master edge " << hitFaceEdges[edgeI]
 //                             << " or ("
@@ -744,7 +744,7 @@ bool Foam::slidingInterface::projectPoints() const
     // sliding intergace coupling in order to allow the point
     // projection to be done separately from the actual cutting.
     // Please change consistently with coupleSlidingInterface.C
-    // 
+    //
 
     if (debug)
     {
@@ -985,7 +985,7 @@ bool Foam::slidingInterface::projectPoints() const
                     // inserted into the edge
 
                     // Strict checking of slave cut to avoid capturing
-                    // end points.  
+                    // end points.
                     scalar cutOnSlave =
                         ((edgeLineHit.hitPoint() - edgeLine.start()) & edgeVec)
                         /sqr(edgeMag);
diff --git a/src/finiteVolume/cfdTools/compressible/compressibleCourantNo.H b/src/finiteVolume/cfdTools/compressible/compressibleCourantNo.H
index 8cc2522e973..611686e8f04 100644
--- a/src/finiteVolume/cfdTools/compressible/compressibleCourantNo.H
+++ b/src/finiteVolume/cfdTools/compressible/compressibleCourantNo.H
@@ -35,7 +35,7 @@ scalar meanCoNum = 0.0;
 
 if (mesh.nInternalFaces())
 {
-    surfaceScalarField SfUfbyDelta = 
+    surfaceScalarField SfUfbyDelta =
         mesh.surfaceInterpolation::deltaCoeffs()*mag(phi)/fvc::interpolate(rho);
 
     CoNum = max(SfUfbyDelta/mesh.magSf())
diff --git a/src/finiteVolume/cfdTools/general/MRF/MRFZone.C b/src/finiteVolume/cfdTools/general/MRF/MRFZone.C
index e94b8c92f3e..3618d87ef5d 100644
--- a/src/finiteVolume/cfdTools/general/MRF/MRFZone.C
+++ b/src/finiteVolume/cfdTools/general/MRF/MRFZone.C
@@ -29,6 +29,7 @@ License
 #include "volFields.H"
 #include "surfaceFields.H"
 #include "fvMatrices.H"
+#include "syncTools.H"
 #include "faceSet.H"
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
diff --git a/src/finiteVolume/cfdTools/general/SRF/SRFModel/SRFModel/newSRFModel.C b/src/finiteVolume/cfdTools/general/SRF/SRFModel/SRFModel/newSRFModel.C
index cc4400dabac..25626f908ee 100644
--- a/src/finiteVolume/cfdTools/general/SRF/SRFModel/SRFModel/newSRFModel.C
+++ b/src/finiteVolume/cfdTools/general/SRF/SRFModel/SRFModel/newSRFModel.C
@@ -22,8 +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
-
 \*---------------------------------------------------------------------------*/
 
 #include "SRFModel.H"
diff --git a/src/finiteVolume/cfdTools/general/adjustPhi/adjustPhi.C b/src/finiteVolume/cfdTools/general/adjustPhi/adjustPhi.C
index dfaef4308e6..439d83e1786 100644
--- a/src/finiteVolume/cfdTools/general/adjustPhi/adjustPhi.C
+++ b/src/finiteVolume/cfdTools/general/adjustPhi/adjustPhi.C
@@ -107,7 +107,7 @@ bool Foam::adjustPhi
         {
             massCorr = (massIn - fixedMassOut)/adjustableMassOut;
         }
-        else if(mag(fixedMassOut - massIn)/totalFlux > 1e-10)
+        else if (mag(fixedMassOut - massIn)/totalFlux > 1e-10)
         {
             FatalErrorIn
             (
diff --git a/src/finiteVolume/cfdTools/general/include/readGravitationalAcceleration.H b/src/finiteVolume/cfdTools/general/include/readGravitationalAcceleration.H
index 2389d0bd2b7..1be4dc52f53 100644
--- a/src/finiteVolume/cfdTools/general/include/readGravitationalAcceleration.H
+++ b/src/finiteVolume/cfdTools/general/include/readGravitationalAcceleration.H
@@ -1,4 +1,4 @@
-    Info << "\nReading g" << endl;
+    Info<< "\nReading g" << endl;
     uniformDimensionedVectorField g
     (
         IOobject
diff --git a/src/finiteVolume/cfdTools/general/porousMedia/porousZone.H b/src/finiteVolume/cfdTools/general/porousMedia/porousZone.H
index 9a3eb151f96..edfbad5efb8 100644
--- a/src/finiteVolume/cfdTools/general/porousMedia/porousZone.H
+++ b/src/finiteVolume/cfdTools/general/porousMedia/porousZone.H
@@ -42,7 +42,7 @@ Description
 
     Darcy-Forchheimer (@e d and @e f parameters)
     @f[
-        S = - (\mu \, d \, U + \frac{\rho |U|}{2} \, f) U
+        S = - (\mu \, d + \frac{\rho |U|}{2} \, f) U
     @f]
 
 
diff --git a/src/finiteVolume/cfdTools/incompressible/CourantNo.H b/src/finiteVolume/cfdTools/incompressible/CourantNo.H
index a8ac950f3db..72a703ba9bf 100644
--- a/src/finiteVolume/cfdTools/incompressible/CourantNo.H
+++ b/src/finiteVolume/cfdTools/incompressible/CourantNo.H
@@ -35,7 +35,7 @@ scalar meanCoNum = 0.0;
 
 if (mesh.nInternalFaces())
 {
-    surfaceScalarField SfUfbyDelta = 
+    surfaceScalarField SfUfbyDelta =
         mesh.surfaceInterpolation::deltaCoeffs()*mag(phi);
 
     CoNum = max(SfUfbyDelta/mesh.magSf())
diff --git a/src/finiteVolume/fields/fvPatchFields/basic/coupled/coupledFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/basic/coupled/coupledFvPatchField.C
index 66772bf69e9..b376b3127df 100644
--- a/src/finiteVolume/fields/fvPatchFields/basic/coupled/coupledFvPatchField.C
+++ b/src/finiteVolume/fields/fvPatchFields/basic/coupled/coupledFvPatchField.C
@@ -110,105 +110,105 @@ coupledFvPatchField<Type>::coupledFvPatchField
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-// Referred patch functionality
-// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-template<class Type>
-void coupledFvPatchField<Type>::patchInternalField
-(
-    Field<Type>& exchangeBuf,
-    const coupledFvPatch& referringPatch,
-    const label size,
-    const label start
-) const
-{
-    if (start+size > referringPatch.size())
-    {
-        FatalErrorIn("coupledFvPatchField<Type>::patchInternalField(..)")
-            << "patch size:" << referringPatch.size()
-            << " start:" << start << " size:" << size
-            << abort(FatalError);
-    }
-
-    const unallocLabelList& faceCells = referringPatch.faceCells();
-
-    exchangeBuf.setSize(this->size());
-
-    label facei = start;
-    forAll(exchangeBuf, i)
-    {
-        exchangeBuf[i] = this->internalField()[faceCells[facei++]];
-    }
-}
-
-
-template<class Type>
-tmp<Field<Type> > coupledFvPatchField<Type>::valueInternalCoeffs
-(
-    const coupledFvPatch& referringPatch,
-    const label size,
-    const label start,
-    const tmp<scalarField>& w
-) const
-{
-    // ? check what is passed in!
-    if (w().size() != size)
-    {
-        FatalErrorIn("coupledFvPatchField<Type>::valueInternalCoeffs(..)")
-            << "Call with correct slice size." << abort(FatalError);
-    }
-    return Type(pTraits<Type>::one)*w;
-}
-
-
-template<class Type>
-tmp<Field<Type> > coupledFvPatchField<Type>::valueBoundaryCoeffs
-(
-    const coupledFvPatch& referringPatch,
-    const label size,
-    const label start,
-    const tmp<scalarField>& w
-) const
-{
-    // ? check what is passed in!
-    if (w().size() != size)
-    {
-        FatalErrorIn("coupledFvPatchField<Type>::valueBoundaryCoeffs(..)")
-            << "Call with correct slice size." << abort(FatalError);
-    }
-    return Type(pTraits<Type>::one)*(1.0 - w);
-}
-
-
-template<class Type>
-tmp<Field<Type> > coupledFvPatchField<Type>::gradientInternalCoeffs
-(
-    const coupledFvPatch& referringPatch,
-    const label size,
-    const label start
-) const
-{
-    SubField<scalar> subDc(referringPatch.deltaCoeffs(), size, start);
-
-    return -Type(pTraits<Type>::one)*subDc;
-}
-
-
-template<class Type>
-tmp<Field<Type> > coupledFvPatchField<Type>::gradientBoundaryCoeffs
-(
-    const coupledFvPatch& referringPatch,
-    const label size,
-    const label start
-) const
-{
-    return -this->gradientInternalCoeffs
-    (
-        referringPatch,
-        size,
-        start
-    );
-}
+// // Referred patch functionality
+// // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// 
+// template<class Type>
+// void coupledFvPatchField<Type>::patchInternalField
+// (
+//     Field<Type>& exchangeBuf,
+//     const coupledFvPatch& referringPatch,
+//     const label size,
+//     const label start
+// ) const
+// {
+//     if (start+size > referringPatch.size())
+//     {
+//         FatalErrorIn("coupledFvPatchField<Type>::patchInternalField(..)")
+//             << "patch size:" << referringPatch.size()
+//             << " start:" << start << " size:" << size
+//             << abort(FatalError);
+//     }
+// 
+//     const unallocLabelList& faceCells = referringPatch.faceCells();
+// 
+//     exchangeBuf.setSize(this->size());
+// 
+//     label facei = start;
+//     forAll(exchangeBuf, i)
+//     {
+//         exchangeBuf[i] = this->internalField()[faceCells[facei++]];
+//     }
+// }
+// 
+// 
+// template<class Type>
+// tmp<Field<Type> > coupledFvPatchField<Type>::valueInternalCoeffs
+// (
+//     const coupledFvPatch& referringPatch,
+//     const label size,
+//     const label start,
+//     const tmp<scalarField>& w
+// ) const
+// {
+//     // ? check what is passed in!
+//     if (w().size() != size)
+//     {
+//         FatalErrorIn("coupledFvPatchField<Type>::valueInternalCoeffs(..)")
+//             << "Call with correct slice size." << abort(FatalError);
+//     }
+//     return Type(pTraits<Type>::one)*w;
+// }
+// 
+// 
+// template<class Type>
+// tmp<Field<Type> > coupledFvPatchField<Type>::valueBoundaryCoeffs
+// (
+//     const coupledFvPatch& referringPatch,
+//     const label size,
+//     const label start,
+//     const tmp<scalarField>& w
+// ) const
+// {
+//     // ? check what is passed in!
+//     if (w().size() != size)
+//     {
+//         FatalErrorIn("coupledFvPatchField<Type>::valueBoundaryCoeffs(..)")
+//             << "Call with correct slice size." << abort(FatalError);
+//     }
+//     return Type(pTraits<Type>::one)*(1.0 - w);
+// }
+// 
+// 
+// template<class Type>
+// tmp<Field<Type> > coupledFvPatchField<Type>::gradientInternalCoeffs
+// (
+//     const coupledFvPatch& referringPatch,
+//     const label size,
+//     const label start
+// ) const
+// {
+//     SubField<scalar> subDc(referringPatch.deltaCoeffs(), size, start);
+// 
+//     return -Type(pTraits<Type>::one)*subDc;
+// }
+// 
+// 
+// template<class Type>
+// tmp<Field<Type> > coupledFvPatchField<Type>::gradientBoundaryCoeffs
+// (
+//     const coupledFvPatch& referringPatch,
+//     const label size,
+//     const label start
+// ) const
+// {
+//     return -this->gradientInternalCoeffs
+//     (
+//         referringPatch,
+//         size,
+//         start
+//     );
+// }
 
 
 // Local patch functionality
@@ -218,10 +218,7 @@ template<class Type>
 tmp<Field<Type> > coupledFvPatchField<Type>::snGrad() const
 {
     return
-        (
-            this->patchNeighbourField()
-          - this->fvPatchField<Type>::patchInternalField()
-        )
+        (this->patchNeighbourField() - this->patchInternalField())
        *this->patch().deltaCoeffs();
 }
 
@@ -246,14 +243,8 @@ void coupledFvPatchField<Type>::evaluate(const Pstream::commsTypes)
 
     Field<Type>::operator=
     (
-        (
-            this->patch().weights()
-          * this->fvPatchField<Type>::patchInternalField()
-        )
-      + (
-            (1.0 - this->patch().weights())
-          * this->patchNeighbourField()
-        )
+        this->patch().weights()*this->patchInternalField()
+      + (1.0 - this->patch().weights())*this->patchNeighbourField()
     );
 
     fvPatchField<Type>::evaluate();
diff --git a/src/finiteVolume/fields/fvPatchFields/basic/coupled/coupledFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/basic/coupled/coupledFvPatchField.H
index f38eb8ab912..b859bd5f687 100644
--- a/src/finiteVolume/fields/fvPatchFields/basic/coupled/coupledFvPatchField.H
+++ b/src/finiteVolume/fields/fvPatchFields/basic/coupled/coupledFvPatchField.H
@@ -121,122 +121,122 @@ public:
 
     // Member functions
 
-
-        // Referred-patch functionality. Get called with a slice (size, start)
-        // of a patch that supplies fields and geometry/topology.
-
-        // Evaluation functions
-
-            //- Return internal field next to patch as patch field
-            virtual void patchInternalField
-            (
-                Field<Type>& exchangeBuf,
-                const coupledFvPatch& referringPatch,
-                const label size,
-                const label start
-            ) const;
-
-            //- Get patch-normal gradient
-            virtual void snGrad
-            (
-                Field<Type>& exchangeBuf,
-                const Field<Type>& subFld,
-                const coupledFvPatch& referringPatch,
-                const label size,
-                const label start
-            ) const = 0;
-
-            //- Initialise the evaluation of the patch field.
-            virtual void initEvaluate
-            (
-                Field<Type>& exchangeBuf,
-                const coupledFvPatch& referringPatch,
-                const label size,
-                const label start
-            ) const = 0;
-
-            //- Evaluate the patch field.
-            virtual void evaluate
-            (
-                Field<Type>& exchangeBuf,
-                const coupledFvPatch& referringPatch,
-                const label size,
-                const label start
-            ) const = 0;
-
-            //- Return the matrix diagonal coefficients corresponding to the
-            //  evaluation of the value of this patchField with given weights
-            virtual tmp<Field<Type> > valueInternalCoeffs
-            (
-                const coupledFvPatch& referringPatch,
-                const label size,
-                const label start,
-                const tmp<scalarField>&
-            ) const;
-
-            //- Return the matrix source coefficients corresponding to the
-            //  evaluation of the value of this patchField with given weights
-            virtual tmp<Field<Type> > valueBoundaryCoeffs
-            (
-                const coupledFvPatch& referringPatch,
-                const label size,
-                const label start,
-                const tmp<scalarField>&
-            ) const;
-
-            //- Return the matrix diagonal coefficients corresponding to the
-            //  evaluation of the gradient of this patchField
-            virtual tmp<Field<Type> > gradientInternalCoeffs
-            (
-                const coupledFvPatch& referringPatch,
-                const label size,
-                const label start
-            ) const;
-
-            //- Return the matrix source coefficients corresponding to the
-            //  evaluation of the gradient of this patchField
-            virtual tmp<Field<Type> > gradientBoundaryCoeffs
-            (
-                const coupledFvPatch& referringPatch,
-                const label size,
-                const label start
-            ) const;
-
-
-        // Coupled interface functionality
-
-            //- Initialise neighbour matrix update
-            virtual void initInterfaceMatrixUpdate
-            (
-                const scalarField& psiInternal,
-                scalarField& result,
-                const lduMatrix& m,
-                const scalarField& coeffs,
-                const direction cmpt,
-                const coupledFvPatch& referringPatch,
-                const label size,
-                const label start,
-                scalarField& exchangeBuf
-            ) const = 0;
-
-            //- Update result field based on interface functionality
-            virtual void updateInterfaceMatrix
-            (
-                const scalarField& psiInternal,
-                scalarField& result,
-                const lduMatrix&,
-                const scalarField& coeffs,
-                const direction,
-                const coupledFvPatch& referringPatch,
-                const label size,
-                const label start,
-                scalarField& exchangeBuf
-            ) const = 0;
-
-        //- Write
-        //?virtual void write(Ostream&) const;
-//XXXX
-
+//
+//        // Referred-patch functionality. Get called with a slice (size, start)
+//        // of a patch that supplies fields and geometry/topology.
+//
+//        // Evaluation functions
+//
+//            //- Return internal field next to patch as patch field
+//            virtual void patchInternalField
+//            (
+//                Field<Type>& exchangeBuf,
+//                const coupledFvPatch& referringPatch,
+//                const label size,
+//                const label start
+//            ) const;
+//
+//            //- Get patch-normal gradient
+//            virtual void snGrad
+//            (
+//                Field<Type>& exchangeBuf,
+//                const Field<Type>& subFld,
+//                const coupledFvPatch& referringPatch,
+//                const label size,
+//                const label start
+//            ) const = 0;
+//
+//            //- Initialise the evaluation of the patch field.
+//            virtual void initEvaluate
+//            (
+//                Field<Type>& exchangeBuf,
+//                const coupledFvPatch& referringPatch,
+//                const label size,
+//                const label start
+//            ) const = 0;
+//
+//            //- Evaluate the patch field.
+//            virtual void evaluate
+//            (
+//                Field<Type>& exchangeBuf,
+//                const coupledFvPatch& referringPatch,
+//                const label size,
+//                const label start
+//            ) const = 0;
+//
+//            //- Return the matrix diagonal coefficients corresponding to the
+//            //  evaluation of the value of this patchField with given weights
+//            virtual tmp<Field<Type> > valueInternalCoeffs
+//            (
+//                const coupledFvPatch& referringPatch,
+//                const label size,
+//                const label start,
+//                const tmp<scalarField>&
+//            ) const;
+//
+//            //- Return the matrix source coefficients corresponding to the
+//            //  evaluation of the value of this patchField with given weights
+//            virtual tmp<Field<Type> > valueBoundaryCoeffs
+//            (
+//                const coupledFvPatch& referringPatch,
+//                const label size,
+//                const label start,
+//                const tmp<scalarField>&
+//            ) const;
+//
+//            //- Return the matrix diagonal coefficients corresponding to the
+//            //  evaluation of the gradient of this patchField
+//            virtual tmp<Field<Type> > gradientInternalCoeffs
+//            (
+//                const coupledFvPatch& referringPatch,
+//                const label size,
+//                const label start
+//            ) const;
+//
+//            //- Return the matrix source coefficients corresponding to the
+//            //  evaluation of the gradient of this patchField
+//            virtual tmp<Field<Type> > gradientBoundaryCoeffs
+//            (
+//                const coupledFvPatch& referringPatch,
+//                const label size,
+//                const label start
+//            ) const;
+//
+//
+//        // Coupled interface functionality
+//
+//            //- Initialise neighbour matrix update
+//            virtual void initInterfaceMatrixUpdate
+//            (
+//                const scalarField& psiInternal,
+//                scalarField& result,
+//                const lduMatrix& m,
+//                const scalarField& coeffs,
+//                const direction cmpt,
+//                const coupledFvPatch& referringPatch,
+//                const label size,
+//                const label start,
+//                scalarField& exchangeBuf
+//            ) const = 0;
+//
+//            //- Update result field based on interface functionality
+//            virtual void updateInterfaceMatrix
+//            (
+//                const scalarField& psiInternal,
+//                scalarField& result,
+//                const lduMatrix&,
+//                const scalarField& coeffs,
+//                const direction,
+//                const coupledFvPatch& referringPatch,
+//                const label size,
+//                const label start,
+//                scalarField& exchangeBuf
+//            ) const = 0;
+//
+//        //- Write
+//        //?virtual void write(Ostream&) const;
+////XXXX
+//
 
 
         // Access
diff --git a/src/finiteVolume/fields/fvPatchFields/basic/sliced/slicedFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/basic/sliced/slicedFvPatchField.C
index 8643dba429d..ef24cbf2aad 100644
--- a/src/finiteVolume/fields/fvPatchFields/basic/sliced/slicedFvPatchField.C
+++ b/src/finiteVolume/fields/fvPatchFields/basic/sliced/slicedFvPatchField.C
@@ -55,7 +55,7 @@ slicedFvPatchField<Type>::slicedFvPatchField
     const DimensionedField<Type, volMesh>& iF
 )
 :
-    fvPatchField<Type>(p, iF)
+    fvPatchField<Type>(p, iF, Field<Type>())
 {}
 
 
diff --git a/src/finiteVolume/fields/fvPatchFields/basic/transform/transformFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/basic/transform/transformFvPatchField.C
index 6016fa83dfb..e2043e27846 100644
--- a/src/finiteVolume/fields/fvPatchFields/basic/transform/transformFvPatchField.C
+++ b/src/finiteVolume/fields/fvPatchFields/basic/transform/transformFvPatchField.C
@@ -130,7 +130,7 @@ tmp<Field<Type> > transformFvPatchField<Type>::gradientInternalCoeffs() const
 template<class Type>
 tmp<Field<Type> > transformFvPatchField<Type>::gradientBoundaryCoeffs() const
 {
-    return 
+    return
         snGrad()
       - cmptMultiply(gradientInternalCoeffs(), this->patchInternalField());
 }
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.C
index 92365d9ae7f..07290f19059 100644
--- a/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.C
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.C
@@ -143,200 +143,200 @@ cyclicFvPatchField<Type>::cyclicFvPatchField
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-// Referred patch functionality
-// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-template<class Type>
-void cyclicFvPatchField<Type>::snGrad
-(
-    Field<Type>& exchangeBuf,
-    const Field<Type>& subFld,
-    const coupledFvPatch& referringPatch,
-    const label size,
-    const label start
-) const
-{
-    if (subFld.size() != size)
-    {
-        FatalErrorIn("cyclicFvPatchField<Type>::snGrad(..)")
-            << "Call with correct slice size." << abort(FatalError);
-    }
-
-    // Slice delta coeffs
-    SubField<scalar> subDc(referringPatch.deltaCoeffs(), size, start);
-
-    // Get internal field
-    tmp<Field<Type> > patchFld(new Field<Type>(size));
-    this->patchInternalField(patchFld(), referringPatch, size, start);
-
-    exchangeBuf = subDc * (subFld - patchFld);
-}
-
-
-template<class Type>
-void cyclicFvPatchField<Type>::initEvaluate
-(
-    Field<Type>& exchangeBuf,
-    const coupledFvPatch& referringPatch,
-    const label size,
-    const label start
-) const
-{
-    //? What about updateCoeffs? What if patch holds face-wise additional
-    // information? Where is it stored? Who updates it?
-//    if (!this->updated())
-//    {
-//        this->updateCoeffs();
-//    }
-
-    if (exchangeBuf.size() != size)
-    {
-        FatalErrorIn("cyclicFvPatchField<Type>::initEvaluate(..)")
-            << "Call with correct slice size." << abort(FatalError);
-    }
-
-    // Get sender side. Equivalent to (1-w)*patchNeighbourField() in non-remote
-    // version (so includes the transformation!).
-
-    //Pout<< "initEvaluate name:" << cyclicPatch_.name()
-    //    << " size:" << size << " start:" << start
-    //    << " referringPatch.weights():" << referringPatch.weights() << endl;
-
-    const SubField<scalar> subWeights
-    (
-        referringPatch.weights(),
-        size,
-        start
-    );
-
-    tmp<Field<Type> > patchFld(new Field<Type>(size));
-    this->patchInternalField(patchFld(), referringPatch, size, start);
-
-    //Pout<< "initEvaluate name:" << cyclicPatch_.name()
-    //    << " patchFld:" << patchFld()
-    //    << " subWeights:" << subWeights << endl;
-
-    if (doTransform())
-    {
-        //Pout<< "initEvaluate name:" << cyclicPatch_.name()
-        //    << " reverseT:" << reverseT() << endl;
-        tmp<Field<Type> > tfld =
-            (1.0-subWeights)
-          * transform(reverseT(), patchFld);
-
-        forAll(tfld(), i)
-        {
-            exchangeBuf[i] = tfld()[i];
-        }
-        //Pout<< "initEvaluate name:" << cyclicPatch_.name()
-        //    << " exchangeBuf:" << exchangeBuf << endl;
-    }
-    else
-    {
-        //Pout<< "initEvaluate name:" << cyclicPatch_.name()
-        //    << " no transform" << endl;
-        tmp<Field<Type> > tfld = (1.0-subWeights)*patchFld;
-
-        forAll(tfld(), i)
-        {
-            exchangeBuf[i] = tfld()[i];
-        }
-        //Pout<< "initEvaluate name:" << cyclicPatch_.name()
-        //    << " exchangeBuf:" << exchangeBuf << endl;
-    }
-}
-
-
-template<class Type>
-void cyclicFvPatchField<Type>::evaluate
-(
-    Field<Type>& exchangeBuf,
-    const coupledFvPatch& referringPatch,
-    const label size,
-    const label start
-) const
-{
-//    if (!this->updated())
-//    {
-//        this->updateCoeffs();
-//    }
-
-    if (exchangeBuf.size() != size)
-    {
-        FatalErrorIn("cyclicFvPatchField<Type>::evaluate(..)")
-            << "Call with correct slice size." << abort(FatalError);
-    }
-
-    const SubField<scalar> subWeights
-    (
-        referringPatch.weights(),
-        size,
-        start
-    );
-
-    tmp<Field<Type> > patchFld(new Field<Type>(size));
-    this->patchInternalField(patchFld(), referringPatch, size, start);
-
-    exchangeBuf += subWeights * patchFld;
-
-    //?? fvPatchField<Type>::evaluate();
-}
-
-
-template<class Type>
-void cyclicFvPatchField<Type>::initInterfaceMatrixUpdate
-(
-    const scalarField& psiInternal,
-    scalarField& result,
-    const lduMatrix&,
-    const scalarField& coeffs,
-    const direction,
-    const coupledFvPatch& referringPatch,
-    const label size,
-    const label start,
-    scalarField& exchangeBuf
-) const
-{
-    const unallocLabelList& faceCells = referringPatch.faceCells();
-
-    label facei = start;
-
-    forAll(exchangeBuf, elemI)
-    {
-        exchangeBuf[elemI] = psiInternal[faceCells[facei++]];
-    }
-}
-
-
-template<class Type>
-void cyclicFvPatchField<Type>::updateInterfaceMatrix
-(
-    const scalarField& psiInternal,
-    scalarField& result,
-    const lduMatrix&,
-    const scalarField& coeffs,
-    const direction cmpt,
-    const coupledFvPatch& referringPatch,
-    const label size,
-    const label start,
-    scalarField& exchangeBuf
-) const
-{
-    // Transform according to the transformation tensor
-    transformCoupleField(exchangeBuf, cmpt);
-
-    // Multiply the field by coefficients and add into the result
-
-    const unallocLabelList& faceCells = referringPatch.faceCells();
-
-    label facei = start;
-
-    forAll(exchangeBuf, elemI)
-    {
-        result[faceCells[facei]] -= coeffs[facei]*exchangeBuf[elemI];
-        facei++;
-    }
-}
+// // Referred patch functionality
+// // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// 
+// template<class Type>
+// void cyclicFvPatchField<Type>::snGrad
+// (
+//     Field<Type>& exchangeBuf,
+//     const Field<Type>& subFld,
+//     const coupledFvPatch& referringPatch,
+//     const label size,
+//     const label start
+// ) const
+// {
+//     if (subFld.size() != size)
+//     {
+//         FatalErrorIn("cyclicFvPatchField<Type>::snGrad(..)")
+//             << "Call with correct slice size." << abort(FatalError);
+//     }
+// 
+//     // Slice delta coeffs
+//     SubField<scalar> subDc(referringPatch.deltaCoeffs(), size, start);
+// 
+//     // Get internal field
+//     tmp<Field<Type> > patchFld(new Field<Type>(size));
+//     this->patchInternalField(patchFld(), referringPatch, size, start);
+// 
+//     exchangeBuf = subDc * (subFld - patchFld);
+// }
+// 
+// 
+// template<class Type>
+// void cyclicFvPatchField<Type>::initEvaluate
+// (
+//     Field<Type>& exchangeBuf,
+//     const coupledFvPatch& referringPatch,
+//     const label size,
+//     const label start
+// ) const
+// {
+//     //? What about updateCoeffs? What if patch holds face-wise additional
+//     // information? Where is it stored? Who updates it?
+// //    if (!this->updated())
+// //    {
+// //        this->updateCoeffs();
+// //    }
+// 
+//     if (exchangeBuf.size() != size)
+//     {
+//         FatalErrorIn("cyclicFvPatchField<Type>::initEvaluate(..)")
+//             << "Call with correct slice size." << abort(FatalError);
+//     }
+// 
+//     // Get sender side. Equivalent to (1-w)*patchNeighbourField() in non-remote
+//     // version (so includes the transformation!).
+// 
+//     //Pout<< "initEvaluate name:" << cyclicPatch_.name()
+//     //    << " size:" << size << " start:" << start
+//     //    << " referringPatch.weights():" << referringPatch.weights() << endl;
+// 
+//     const SubField<scalar> subWeights
+//     (
+//         referringPatch.weights(),
+//         size,
+//         start
+//     );
+// 
+//     tmp<Field<Type> > patchFld(new Field<Type>(size));
+//     this->patchInternalField(patchFld(), referringPatch, size, start);
+// 
+//     //Pout<< "initEvaluate name:" << cyclicPatch_.name()
+//     //    << " patchFld:" << patchFld()
+//     //    << " subWeights:" << subWeights << endl;
+// 
+//     if (doTransform())
+//     {
+//         //Pout<< "initEvaluate name:" << cyclicPatch_.name()
+//         //    << " reverseT:" << reverseT() << endl;
+//         tmp<Field<Type> > tfld =
+//             (1.0-subWeights)
+//           * transform(reverseT(), patchFld);
+// 
+//         forAll(tfld(), i)
+//         {
+//             exchangeBuf[i] = tfld()[i];
+//         }
+//         //Pout<< "initEvaluate name:" << cyclicPatch_.name()
+//         //    << " exchangeBuf:" << exchangeBuf << endl;
+//     }
+//     else
+//     {
+//         //Pout<< "initEvaluate name:" << cyclicPatch_.name()
+//         //    << " no transform" << endl;
+//         tmp<Field<Type> > tfld = (1.0-subWeights)*patchFld;
+// 
+//         forAll(tfld(), i)
+//         {
+//             exchangeBuf[i] = tfld()[i];
+//         }
+//         //Pout<< "initEvaluate name:" << cyclicPatch_.name()
+//         //    << " exchangeBuf:" << exchangeBuf << endl;
+//     }
+// }
+// 
+// 
+// template<class Type>
+// void cyclicFvPatchField<Type>::evaluate
+// (
+//     Field<Type>& exchangeBuf,
+//     const coupledFvPatch& referringPatch,
+//     const label size,
+//     const label start
+// ) const
+// {
+// //    if (!this->updated())
+// //    {
+// //        this->updateCoeffs();
+// //    }
+// 
+//     if (exchangeBuf.size() != size)
+//     {
+//         FatalErrorIn("cyclicFvPatchField<Type>::evaluate(..)")
+//             << "Call with correct slice size." << abort(FatalError);
+//     }
+// 
+//     const SubField<scalar> subWeights
+//     (
+//         referringPatch.weights(),
+//         size,
+//         start
+//     );
+// 
+//     tmp<Field<Type> > patchFld(new Field<Type>(size));
+//     this->patchInternalField(patchFld(), referringPatch, size, start);
+// 
+//     exchangeBuf += subWeights * patchFld;
+// 
+//     //?? fvPatchField<Type>::evaluate();
+// }
+// 
+// 
+// template<class Type>
+// void cyclicFvPatchField<Type>::initInterfaceMatrixUpdate
+// (
+//     const scalarField& psiInternal,
+//     scalarField& result,
+//     const lduMatrix&,
+//     const scalarField& coeffs,
+//     const direction,
+//     const coupledFvPatch& referringPatch,
+//     const label size,
+//     const label start,
+//     scalarField& exchangeBuf
+// ) const
+// {
+//     const unallocLabelList& faceCells = referringPatch.faceCells();
+// 
+//     label facei = start;
+// 
+//     forAll(exchangeBuf, elemI)
+//     {
+//         exchangeBuf[elemI] = psiInternal[faceCells[facei++]];
+//     }
+// }
+// 
+// 
+// template<class Type>
+// void cyclicFvPatchField<Type>::updateInterfaceMatrix
+// (
+//     const scalarField& psiInternal,
+//     scalarField& result,
+//     const lduMatrix&,
+//     const scalarField& coeffs,
+//     const direction cmpt,
+//     const coupledFvPatch& referringPatch,
+//     const label size,
+//     const label start,
+//     scalarField& exchangeBuf
+// ) const
+// {
+//     // Transform according to the transformation tensor
+//     transformCoupleField(exchangeBuf, cmpt);
+// 
+//     // Multiply the field by coefficients and add into the result
+// 
+//     const unallocLabelList& faceCells = referringPatch.faceCells();
+// 
+//     label facei = start;
+// 
+//     forAll(exchangeBuf, elemI)
+//     {
+//         result[faceCells[facei]] -= coeffs[facei]*exchangeBuf[elemI];
+//         facei++;
+//     }
+// }
 
 
 // Local patch functionality
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.H
index ef9057fbfc4..00c24d3b4ac 100644
--- a/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.H
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.H
@@ -151,64 +151,64 @@ public:
 
         // Evaluation functions
 
-        // Referred-patch functionality. Get called with a slice (size, start)
-        // of a patch that supplies fields and geometry/topology.
-
-            //- Get patch-normal gradient
-            virtual void snGrad
-            (
-                Field<Type>& exchangeBuf,
-                const Field<Type>& subFld,
-                const coupledFvPatch& referringPatch,
-                const label size,
-                const label start
-            ) const;
-
-            //- Initialise the evaluation of the patch field.
-            virtual void initEvaluate
-            (
-                Field<Type>& exchangeBuf,
-                const coupledFvPatch& referringPatch,
-                const label size,
-                const label start
-            ) const;
-
-            //- Evaluate the patch field.
-            virtual void evaluate
-            (
-                Field<Type>& exchangeBuf,
-                const coupledFvPatch& referringPatch,
-                const label size,
-                const label start
-            ) const;
-
-            //- Initialise neighbour matrix update
-            virtual void initInterfaceMatrixUpdate
-            (
-                const scalarField& psiInternal,
-                scalarField& result,
-                const lduMatrix& m,
-                const scalarField& coeffs,
-                const direction cmpt,
-                const coupledFvPatch& referringPatch,
-                const label size,
-                const label start,
-                scalarField& exchangeBuf
-            ) const;
-
-            //- Update result field based on interface functionality
-            virtual void updateInterfaceMatrix
-            (
-                const scalarField& psiInternal,
-                scalarField& result,
-                const lduMatrix&,
-                const scalarField& coeffs,
-                const direction,
-                const coupledFvPatch& referringPatch,
-                const label size,
-                const label start,
-                scalarField& exchangeBuf
-            ) const;
+//         // Referred-patch functionality. Get called with a slice (size, start)
+//         // of a patch that supplies fields and geometry/topology.
+// 
+//             //- Get patch-normal gradient
+//             virtual void snGrad
+//             (
+//                 Field<Type>& exchangeBuf,
+//                 const Field<Type>& subFld,
+//                 const coupledFvPatch& referringPatch,
+//                 const label size,
+//                 const label start
+//             ) const;
+// 
+//             //- Initialise the evaluation of the patch field.
+//             virtual void initEvaluate
+//             (
+//                 Field<Type>& exchangeBuf,
+//                 const coupledFvPatch& referringPatch,
+//                 const label size,
+//                 const label start
+//             ) const;
+// 
+//             //- Evaluate the patch field.
+//             virtual void evaluate
+//             (
+//                 Field<Type>& exchangeBuf,
+//                 const coupledFvPatch& referringPatch,
+//                 const label size,
+//                 const label start
+//             ) const;
+// 
+//             //- Initialise neighbour matrix update
+//             virtual void initInterfaceMatrixUpdate
+//             (
+//                 const scalarField& psiInternal,
+//                 scalarField& result,
+//                 const lduMatrix& m,
+//                 const scalarField& coeffs,
+//                 const direction cmpt,
+//                 const coupledFvPatch& referringPatch,
+//                 const label size,
+//                 const label start,
+//                 scalarField& exchangeBuf
+//             ) const;
+// 
+//             //- Update result field based on interface functionality
+//             virtual void updateInterfaceMatrix
+//             (
+//                 const scalarField& psiInternal,
+//                 scalarField& result,
+//                 const lduMatrix&,
+//                 const scalarField& coeffs,
+//                 const direction,
+//                 const coupledFvPatch& referringPatch,
+//                 const label size,
+//                 const label start,
+//                 scalarField& exchangeBuf
+//             ) const;
 
 
             //- Return neighbour coupled given internal cell data
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchField.H
index 340799ffe16..5480406ba3c 100644
--- a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchField.H
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchField.H
@@ -109,7 +109,7 @@ public:
                 return cyclicFvPatchField<Type>::type();
             }
 
-            //- Return the "jump" across the patch as a "half" field 
+            //- Return the "jump" across the patch as a "half" field
             virtual tmp<Field<scalar> > jump() const = 0;
 
 
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchField.C
index d914e2e33d1..b2930077c0e 100644
--- a/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchField.C
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchField.C
@@ -28,41 +28,12 @@ License
 #include "processorFvPatch.H"
 #include "demandDrivenData.H"
 #include "transformField.H"
-#include "diagTensorField.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 namespace Foam
 {
 
-
-// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
-
-template<class Type>
-const coupledFvPatchField<Type>& processorFvPatchField<Type>::patchField
-(
-    const label patchID
-) const
-{
-    //const GeometricField<Type, fvPatchField, volMesh>& field =
-    //this->db().objectRegistry::
-    //lookupObject<GeometricField<Type, fvPatchField, volMesh> >
-    //(
-    //    this->dimensionedInternalField().name()
-    //);
-    const GeometricField<Type, fvPatchField, volMesh>& field =
-        static_cast
-        <
-            const GeometricField<Type, fvPatchField, volMesh>&
-        >(this->dimensionedInternalField());
-
-    return refCast<const coupledFvPatchField<Type> >
-    (
-        field.boundaryField()[patchID]
-    );
-}
-
-
 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
 
 template<class Type>
@@ -204,52 +175,7 @@ void processorFvPatchField<Type>::initEvaluate
 {
     if (Pstream::parRun())
     {
-        const processorPolyPatch& pp = procPatch_.procPolyPatch();
-
-        // Get reference to proc patch built-in buffer
-        List<Type>& sendBuf = procPatch_.setSendBuf<Type>(this->size());
-
-        forAll(pp.patchIDs(), i)
-        {
-            SubField<Type> subSendFld(pp.subSlice(sendBuf, i));
-            Field<Type>& subFld = static_cast<Field<Type>&>
-            (
-                static_cast<UList<Type>&>(subSendFld)
-            );
-
-            label patchI = pp.patchIDs()[i];
-
-            //Pout<< "initEvaluate on "
-            //    << this->dimensionedInternalField().name()
-            //    << " patch:" << pp.name()
-            //    << " subSize:" << (pp.starts()[i+1]-pp.starts()[i])
-            //    << " subStart:" << pp.starts()[i]
-            //    << " subPatch:" << patchI << endl;
-
-            if (patchI == -1)
-            {
-                // Assign internal field
-                this->patchInternalField
-                (
-                    subFld,
-                    procPatch_,
-                    subSendFld.size(),
-                    pp.starts()[i]
-                );
-            }
-            else
-            {
-                // Assign evaluation of referred patch
-                patchField(patchI).initEvaluate
-                (
-                    subFld,
-                    procPatch_,
-                    subSendFld.size(),
-                    pp.starts()[i]
-                );
-            }
-        }
-        procPatch_.compressedBufferSend<Type>(commsType);
+        procPatch_.compressedSend(commsType, this->patchInternalField()());
     }
 }
 
@@ -264,39 +190,9 @@ void processorFvPatchField<Type>::evaluate
     {
         procPatch_.compressedReceive<Type>(commsType, *this);
 
-        const processorPolyPatch& pp = procPatch_.procPolyPatch();
-
-        forAll(pp.patchIDs(), i)
+        if (doTransform())
         {
-            label patchI = pp.patchIDs()[i];
-
-            //Pout<< "evaluate on " << this->dimensionedInternalField().name()
-            //    << " patch:" << pp.name()
-            //    << " subSize:" << (pp.starts()[i+1]-pp.starts()[i])
-            //    << " subStart:" << pp.starts()[i]
-            //    << " subPatch:" << patchI << endl;
-
-            if (patchI == -1)
-            {
-                // No evaluation needed.
-            }
-            else
-            {
-                SubField<Type> subRecvFld(pp.subSlice(*this, i));
-
-                Field<Type>& subFld = static_cast<Field<Type>&>
-                (
-                    static_cast<UList<Type>&>(subRecvFld)
-                );
-
-                patchField(patchI).evaluate
-                (
-                    subFld,
-                    procPatch_,
-                    subRecvFld.size(),
-                    pp.starts()[i]
-                );
-            }
+            transform(*this, procPatch_.forwardT(), *this);
         }
     }
 }
@@ -305,58 +201,7 @@ void processorFvPatchField<Type>::evaluate
 template<class Type>
 tmp<Field<Type> > processorFvPatchField<Type>::snGrad() const
 {
-    tmp<Field<Type> > tpnf(new Field<Type>(this->size()));
-    Field<Type>& pnf = tpnf();
-
-    const processorPolyPatch& pp = procPatch_.procPolyPatch();
-
-    forAll(pp.patchIDs(), i)
-    {
-        label patchI = pp.patchIDs()[i];
-        label subStart = pp.starts()[i];
-        label subSize = pp.starts()[i+1] - pp.starts()[i];
-
-        const SubField<Type> subThis(pp.subSlice(*this, i));
-
-        SubField<Type> subPnf(pp.subSlice(pnf, i));
-        Field<Type>& subFld = static_cast<Field<Type>&>
-        (
-            static_cast<UList<Type>&>(subPnf)
-        );
-
-        //Pout<< "snGrad on " << this->dimensionedInternalField().name()
-        //    << " patch:" << pp.name()
-        //    << " subSize:" << (pp.starts()[i+1]-pp.starts()[i])
-        //    << " subStart:" << pp.starts()[i]
-        //    << " subPatch:" << patchI << endl;
-
-
-        if (patchI == -1)
-        {
-            // Slice delta coeffs
-            const SubField<scalar> subDc
-            (
-                pp.subSlice(procPatch_.deltaCoeffs(), i)
-            );
-            tmp<Field<Type> > subInt(new Field<Type>(subSize));
-            this->patchInternalField(subInt(), procPatch_, subSize, subStart);
-
-            subFld = (subDc*(subThis-subInt))();
-        }
-        else
-        {
-            patchField(patchI).snGrad
-            (
-                subFld,
-                subThis,
-                procPatch_,
-                subSize,
-                subStart
-            );
-        }
-    }
-
-    return tpnf;
+    return this->patch().deltaCoeffs()*(*this - this->patchInternalField());
 }
 
 
@@ -364,181 +209,51 @@ template<class Type>
 void processorFvPatchField<Type>::initInterfaceMatrixUpdate
 (
     const scalarField& psiInternal,
-    scalarField& result,
-    const lduMatrix& m,
-    const scalarField& coeffs,
-    const direction cmpt,
+    scalarField&,
+    const lduMatrix&,
+    const scalarField&,
+    const direction,
     const Pstream::commsTypes commsType
 ) const
 {
-    // Get reference to proc patch built-in buffer
-    List<scalar>& sendFld = procPatch_.setSendBuf<scalar>(this->size());
-
-    const processorPolyPatch& pp = procPatch_.procPolyPatch();
-
-    forAll(pp.patchIDs(), i)
-    {
-        label subStart = pp.starts()[i];
-        label subSize = pp.starts()[i+1] - pp.starts()[i];
-        SubField<scalar> subSendFld(sendFld, subSize, subStart);
-        Field<scalar>& subFld = static_cast<Field<scalar>&>
-        (
-            static_cast<UList<scalar>&>(subSendFld)
-        );
-
-        label patchI = pp.patchIDs()[i];
-
-        //Pout<< "initInterfaceMatrixUpdate on "
-        //    << this->dimensionedInternalField().name()
-        //    << " patch:" << pp.name()
-        //    << " subSize:" << (pp.starts()[i+1]-pp.starts()[i])
-        //    << " subStart:" << pp.starts()[i]
-        //    << " subPatch:" << patchI << endl;
-
-        if (patchI == -1)
-        {
-            const unallocLabelList& faceCells = pp.faceCells();
-
-            label facei = subStart;
-
-            forAll(subFld, i)
-            {
-                subFld[i] = psiInternal[faceCells[facei++]];
-            }
-        }
-        else
-        {
-            patchField(patchI).initInterfaceMatrixUpdate
-            (
-                psiInternal,
-                result,
-                m,
-                coeffs,
-                cmpt,
-                procPatch_,
-                subSize,
-                subStart,
-                subFld
-            );
-        }
-    }
-
-    procPatch_.compressedBufferSend<scalar>(commsType);
+    procPatch_.compressedSend
+    (
+        commsType,
+        this->patch().patchInternalField(psiInternal)()
+    );
 }
 
 
 template<class Type>
 void processorFvPatchField<Type>::updateInterfaceMatrix
 (
-    const scalarField& psiInternal,
+    const scalarField&,
     scalarField& result,
-    const lduMatrix& m,
+    const lduMatrix&,
     const scalarField& coeffs,
     const direction cmpt,
     const Pstream::commsTypes commsType
 ) const
 {
-    const List<scalar>& recvFld = procPatch_.compressedBufferReceive<scalar>
+    scalarField pnf
     (
-        commsType,
-        this->size()
+        procPatch_.compressedReceive<scalar>(commsType, this->size())()
     );
 
-    const processorPolyPatch& pp = procPatch_.procPolyPatch();
+    // Transform according to the transformation tensor
+    transformCoupleField(pnf, cmpt);
 
-    forAll(pp.patchIDs(), i)
-    {
-        label subStart = pp.starts()[i];
-        label subSize = pp.starts()[i+1] - pp.starts()[i];
+    // Multiply the field by coefficients and add into the result
 
-        SubField<scalar> subRecvFld(recvFld, subSize, subStart);
-        Field<scalar>& subFld = static_cast<Field<scalar>&>
-        (
-            static_cast<UList<scalar>&>(subRecvFld)
-        );
-
-        label patchI = pp.patchIDs()[i];
-
-        //Pout<< "updateInterfaceMatrix on "
-        //    << this->dimensionedInternalField().name()
-        //    << " patch:" << pp.name()
-        //    << " subSize:" << (pp.starts()[i+1]-pp.starts()[i])
-        //    << " subStart:" << pp.starts()[i]
-        //    << " subPatch:" << patchI << endl;
-
-        if (patchI == -1)
-        {
-            const unallocLabelList& faceCells = pp.faceCells();
+    const unallocLabelList& faceCells = this->patch().faceCells();
 
-            label facei = subStart;
-
-            forAll(subFld, elemI)
-            {
-                result[faceCells[facei]] -= coeffs[facei]*subFld[elemI];
-
-                facei++;
-            }
-        }
-        else
-        {
-            patchField(patchI).updateInterfaceMatrix
-            (
-                psiInternal,
-                result,
-                m,
-                coeffs,
-                cmpt,
-                procPatch_,
-                subSize,
-                subStart,
-                subFld
-            );
-        }
+    forAll(faceCells, elemI)
+    {
+        result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI];
     }
 }
 
 
-//template<class Type>
-//void Foam::processorFvPatchField<Type>::transformCoupleField
-//(
-//    scalarField& f,
-//    const direction cmpt
-//) const
-//{
-//    if (pTraits<Type>::rank > 0)
-//    {
-//        const processorPolyPatch& pp = procPatch_.procPolyPatch();
-//
-//        forAll(pp.patchIDs(), i)
-//        {
-//            label patchI = pp.patchIDs()[i];
-//
-//            if (patchI == -1)
-//            {
-//                // ? anything needs to be transformed?
-//            }
-//            else
-//            {
-//                const coupledPolyPatch& cpp =
-//                    refCast<const coupledPolyPatch>(pp.boundaryMesh()[patchI]);
-//
-//                if (!cpp.parallel())
-//                {
-//                    const tensor& T = cpp.forwardT();
-//
-//                    SubField<scalar> subFld(pp.subSlice(f, i));
-//                    const scalarField& fld =
-//                        static_cast<const scalarField&>(subFld);
-//
-//                    const_cast<scalarField&>(fld) *=
-//                        pow(diag(T).component(cmpt), rank());
-//                }
-//            }
-//        }
-//    }
-//}
-
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchField.H
index 2829334b14d..820082d7772 100644
--- a/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchField.H
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchField.H
@@ -60,10 +60,7 @@ class processorFvPatchField
         //- Local reference cast into the processor patch
         const processorFvPatch& procPatch_;
 
-    // Private Member Functions
 
-        //- Get other patchfield
-        const coupledFvPatchField<Type>& patchField(const label patchID) const;
 public:
 
     //- Runtime type information
@@ -209,100 +206,23 @@ public:
                 return procPatch_.neighbProcNo();
             }
 
-            //- Return rank of component for transform
-            virtual int rank() const
-            {
-                return pTraits<Type>::rank;
-            }
-
-//            //- Transform given patch component field
-//            void transformCoupleField
-//            (
-//                scalarField& f,
-//                const direction cmpt
-//            ) const;
-
-        // Referred-patch functionality. Get called with a slice (size, start)
-        // of a patch that supplies fields and geometry/topology.
-
-            //- Get patch-normal gradient
-            virtual void snGrad
-            (
-                Field<Type>& exchangeBuf,
-                const Field<Type>& subFld,
-                const coupledFvPatch& referringPatch,
-                const label size,
-                const label start
-            ) const
+            //- Does the patch field perform the transfromation
+            virtual bool doTransform() const
             {
-                notImplemented("processorFvPatchField::snGrad(..)");
+                return !(procPatch_.parallel() || pTraits<Type>::rank == 0);
             }
 
-            //- Initialise the evaluation of the patch field.
-            virtual void initEvaluate
-            (
-                Field<Type>& exchangeBuf,
-                const coupledFvPatch& referringPatch,
-                const label size,
-                const label start
-            ) const
-            {
-                notImplemented("processorFvPatchField::initEvaluate(..)");
-            }
-
-            //- Evaluate the patch field.
-            virtual void evaluate
-            (
-                Field<Type>& exchangeBuf,
-                const coupledFvPatch& referringPatch,
-                const label size,
-                const label start
-            ) const
-            {
-                notImplemented("processorFvPatchField::evaluate(..)");
-            }
-
-            //- Initialise neighbour matrix update
-            virtual void initInterfaceMatrixUpdate
-            (
-                const scalarField& psiInternal,
-                scalarField& result,
-                const lduMatrix& m,
-                const scalarField& coeffs,
-                const direction cmpt,
-                const coupledFvPatch& referringPatch,
-                const label size,
-                const label start,
-                scalarField& exchangeBuf
-            ) const
+            //- Return face transformation tensor
+            virtual const tensor& forwardT() const
             {
-                notImplemented
-                (
-                    "processorFvPatchField::initInterfaceMatrixUpdate(..)"
-                );
+                return procPatch_.forwardT();
             }
 
-            //- Update result field based on interface functionality
-            virtual void updateInterfaceMatrix
-            (
-                const scalarField& psiInternal,
-                scalarField& result,
-                const lduMatrix&,
-                const scalarField& coeffs,
-                const direction,
-                const coupledFvPatch& referringPatch,
-                const label size,
-                const label start,
-                scalarField& exchangeBuf
-            ) const
+            //- Return rank of component for transform
+            virtual int rank() const
             {
-                notImplemented
-                (
-                    "processorFvPatchField::updateInterfaceMatrix(..)"
-                );
+                return pTraits<Type>::rank;
             }
-
-
 };
 
 
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchField.C
new file mode 100644
index 00000000000..d914e2e33d1
--- /dev/null
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchField.C
@@ -0,0 +1,546 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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 "processorFvPatchField.H"
+#include "processorFvPatch.H"
+#include "demandDrivenData.H"
+#include "transformField.H"
+#include "diagTensorField.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+template<class Type>
+const coupledFvPatchField<Type>& processorFvPatchField<Type>::patchField
+(
+    const label patchID
+) const
+{
+    //const GeometricField<Type, fvPatchField, volMesh>& field =
+    //this->db().objectRegistry::
+    //lookupObject<GeometricField<Type, fvPatchField, volMesh> >
+    //(
+    //    this->dimensionedInternalField().name()
+    //);
+    const GeometricField<Type, fvPatchField, volMesh>& field =
+        static_cast
+        <
+            const GeometricField<Type, fvPatchField, volMesh>&
+        >(this->dimensionedInternalField());
+
+    return refCast<const coupledFvPatchField<Type> >
+    (
+        field.boundaryField()[patchID]
+    );
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+template<class Type>
+processorFvPatchField<Type>::processorFvPatchField
+(
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF
+)
+:
+    coupledFvPatchField<Type>(p, iF),
+    procPatch_(refCast<const processorFvPatch>(p))
+{}
+
+
+template<class Type>
+processorFvPatchField<Type>::processorFvPatchField
+(
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF,
+    const Field<Type>& f
+)
+:
+    coupledFvPatchField<Type>(p, iF, f),
+    procPatch_(refCast<const processorFvPatch>(p))
+{}
+
+
+// Construct by mapping given processorFvPatchField<Type>
+template<class Type>
+processorFvPatchField<Type>::processorFvPatchField
+(
+    const processorFvPatchField<Type>& ptf,
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF,
+    const fvPatchFieldMapper& mapper
+)
+:
+    coupledFvPatchField<Type>(ptf, p, iF, mapper),
+    procPatch_(refCast<const processorFvPatch>(p))
+{
+    if (!isType<processorFvPatch>(this->patch()))
+    {
+        FatalErrorIn
+        (
+            "processorFvPatchField<Type>::processorFvPatchField\n"
+            "(\n"
+            "    const processorFvPatchField<Type>& ptf,\n"
+            "    const fvPatch& p,\n"
+            "    const DimensionedField<Type, volMesh>& iF,\n"
+            "    const fvPatchFieldMapper& mapper\n"
+            ")\n"
+        )   << "\n    patch type '" << p.type()
+            << "' not constraint type '" << typeName << "'"
+            << "\n    for patch " << p.name()
+            << " of field " << this->dimensionedInternalField().name()
+            << " in file " << this->dimensionedInternalField().objectPath()
+            << exit(FatalIOError);
+    }
+}
+
+
+template<class Type>
+processorFvPatchField<Type>::processorFvPatchField
+(
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF,
+    const dictionary& dict
+)
+:
+    coupledFvPatchField<Type>(p, iF, dict),
+    procPatch_(refCast<const processorFvPatch>(p))
+{
+    if (!isType<processorFvPatch>(p))
+    {
+        FatalIOErrorIn
+        (
+            "processorFvPatchField<Type>::processorFvPatchField\n"
+            "(\n"
+            "    const fvPatch& p,\n"
+            "    const Field<Type>& field,\n"
+            "    const dictionary& dict\n"
+            ")\n",
+            dict
+        )   << "\n    patch type '" << p.type()
+            << "' not constraint type '" << typeName << "'"
+            << "\n    for patch " << p.name()
+            << " of field " << this->dimensionedInternalField().name()
+            << " in file " << this->dimensionedInternalField().objectPath()
+            << exit(FatalIOError);
+    }
+}
+
+
+template<class Type>
+processorFvPatchField<Type>::processorFvPatchField
+(
+    const processorFvPatchField<Type>& ptf
+)
+:
+    processorLduInterfaceField(),
+    coupledFvPatchField<Type>(ptf),
+    procPatch_(refCast<const processorFvPatch>(ptf.patch()))
+{}
+
+
+template<class Type>
+processorFvPatchField<Type>::processorFvPatchField
+(
+    const processorFvPatchField<Type>& ptf,
+    const DimensionedField<Type, volMesh>& iF
+)
+:
+    coupledFvPatchField<Type>(ptf, iF),
+    procPatch_(refCast<const processorFvPatch>(ptf.patch()))
+{}
+
+
+// * * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * //
+
+template<class Type>
+processorFvPatchField<Type>::~processorFvPatchField()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class Type>
+tmp<Field<Type> > processorFvPatchField<Type>::patchNeighbourField() const
+{
+    return *this;
+}
+
+
+template<class Type>
+void processorFvPatchField<Type>::initEvaluate
+(
+    const Pstream::commsTypes commsType
+)
+{
+    if (Pstream::parRun())
+    {
+        const processorPolyPatch& pp = procPatch_.procPolyPatch();
+
+        // Get reference to proc patch built-in buffer
+        List<Type>& sendBuf = procPatch_.setSendBuf<Type>(this->size());
+
+        forAll(pp.patchIDs(), i)
+        {
+            SubField<Type> subSendFld(pp.subSlice(sendBuf, i));
+            Field<Type>& subFld = static_cast<Field<Type>&>
+            (
+                static_cast<UList<Type>&>(subSendFld)
+            );
+
+            label patchI = pp.patchIDs()[i];
+
+            //Pout<< "initEvaluate on "
+            //    << this->dimensionedInternalField().name()
+            //    << " patch:" << pp.name()
+            //    << " subSize:" << (pp.starts()[i+1]-pp.starts()[i])
+            //    << " subStart:" << pp.starts()[i]
+            //    << " subPatch:" << patchI << endl;
+
+            if (patchI == -1)
+            {
+                // Assign internal field
+                this->patchInternalField
+                (
+                    subFld,
+                    procPatch_,
+                    subSendFld.size(),
+                    pp.starts()[i]
+                );
+            }
+            else
+            {
+                // Assign evaluation of referred patch
+                patchField(patchI).initEvaluate
+                (
+                    subFld,
+                    procPatch_,
+                    subSendFld.size(),
+                    pp.starts()[i]
+                );
+            }
+        }
+        procPatch_.compressedBufferSend<Type>(commsType);
+    }
+}
+
+
+template<class Type>
+void processorFvPatchField<Type>::evaluate
+(
+    const Pstream::commsTypes commsType
+)
+{
+    if (Pstream::parRun())
+    {
+        procPatch_.compressedReceive<Type>(commsType, *this);
+
+        const processorPolyPatch& pp = procPatch_.procPolyPatch();
+
+        forAll(pp.patchIDs(), i)
+        {
+            label patchI = pp.patchIDs()[i];
+
+            //Pout<< "evaluate on " << this->dimensionedInternalField().name()
+            //    << " patch:" << pp.name()
+            //    << " subSize:" << (pp.starts()[i+1]-pp.starts()[i])
+            //    << " subStart:" << pp.starts()[i]
+            //    << " subPatch:" << patchI << endl;
+
+            if (patchI == -1)
+            {
+                // No evaluation needed.
+            }
+            else
+            {
+                SubField<Type> subRecvFld(pp.subSlice(*this, i));
+
+                Field<Type>& subFld = static_cast<Field<Type>&>
+                (
+                    static_cast<UList<Type>&>(subRecvFld)
+                );
+
+                patchField(patchI).evaluate
+                (
+                    subFld,
+                    procPatch_,
+                    subRecvFld.size(),
+                    pp.starts()[i]
+                );
+            }
+        }
+    }
+}
+
+
+template<class Type>
+tmp<Field<Type> > processorFvPatchField<Type>::snGrad() const
+{
+    tmp<Field<Type> > tpnf(new Field<Type>(this->size()));
+    Field<Type>& pnf = tpnf();
+
+    const processorPolyPatch& pp = procPatch_.procPolyPatch();
+
+    forAll(pp.patchIDs(), i)
+    {
+        label patchI = pp.patchIDs()[i];
+        label subStart = pp.starts()[i];
+        label subSize = pp.starts()[i+1] - pp.starts()[i];
+
+        const SubField<Type> subThis(pp.subSlice(*this, i));
+
+        SubField<Type> subPnf(pp.subSlice(pnf, i));
+        Field<Type>& subFld = static_cast<Field<Type>&>
+        (
+            static_cast<UList<Type>&>(subPnf)
+        );
+
+        //Pout<< "snGrad on " << this->dimensionedInternalField().name()
+        //    << " patch:" << pp.name()
+        //    << " subSize:" << (pp.starts()[i+1]-pp.starts()[i])
+        //    << " subStart:" << pp.starts()[i]
+        //    << " subPatch:" << patchI << endl;
+
+
+        if (patchI == -1)
+        {
+            // Slice delta coeffs
+            const SubField<scalar> subDc
+            (
+                pp.subSlice(procPatch_.deltaCoeffs(), i)
+            );
+            tmp<Field<Type> > subInt(new Field<Type>(subSize));
+            this->patchInternalField(subInt(), procPatch_, subSize, subStart);
+
+            subFld = (subDc*(subThis-subInt))();
+        }
+        else
+        {
+            patchField(patchI).snGrad
+            (
+                subFld,
+                subThis,
+                procPatch_,
+                subSize,
+                subStart
+            );
+        }
+    }
+
+    return tpnf;
+}
+
+
+template<class Type>
+void processorFvPatchField<Type>::initInterfaceMatrixUpdate
+(
+    const scalarField& psiInternal,
+    scalarField& result,
+    const lduMatrix& m,
+    const scalarField& coeffs,
+    const direction cmpt,
+    const Pstream::commsTypes commsType
+) const
+{
+    // Get reference to proc patch built-in buffer
+    List<scalar>& sendFld = procPatch_.setSendBuf<scalar>(this->size());
+
+    const processorPolyPatch& pp = procPatch_.procPolyPatch();
+
+    forAll(pp.patchIDs(), i)
+    {
+        label subStart = pp.starts()[i];
+        label subSize = pp.starts()[i+1] - pp.starts()[i];
+        SubField<scalar> subSendFld(sendFld, subSize, subStart);
+        Field<scalar>& subFld = static_cast<Field<scalar>&>
+        (
+            static_cast<UList<scalar>&>(subSendFld)
+        );
+
+        label patchI = pp.patchIDs()[i];
+
+        //Pout<< "initInterfaceMatrixUpdate on "
+        //    << this->dimensionedInternalField().name()
+        //    << " patch:" << pp.name()
+        //    << " subSize:" << (pp.starts()[i+1]-pp.starts()[i])
+        //    << " subStart:" << pp.starts()[i]
+        //    << " subPatch:" << patchI << endl;
+
+        if (patchI == -1)
+        {
+            const unallocLabelList& faceCells = pp.faceCells();
+
+            label facei = subStart;
+
+            forAll(subFld, i)
+            {
+                subFld[i] = psiInternal[faceCells[facei++]];
+            }
+        }
+        else
+        {
+            patchField(patchI).initInterfaceMatrixUpdate
+            (
+                psiInternal,
+                result,
+                m,
+                coeffs,
+                cmpt,
+                procPatch_,
+                subSize,
+                subStart,
+                subFld
+            );
+        }
+    }
+
+    procPatch_.compressedBufferSend<scalar>(commsType);
+}
+
+
+template<class Type>
+void processorFvPatchField<Type>::updateInterfaceMatrix
+(
+    const scalarField& psiInternal,
+    scalarField& result,
+    const lduMatrix& m,
+    const scalarField& coeffs,
+    const direction cmpt,
+    const Pstream::commsTypes commsType
+) const
+{
+    const List<scalar>& recvFld = procPatch_.compressedBufferReceive<scalar>
+    (
+        commsType,
+        this->size()
+    );
+
+    const processorPolyPatch& pp = procPatch_.procPolyPatch();
+
+    forAll(pp.patchIDs(), i)
+    {
+        label subStart = pp.starts()[i];
+        label subSize = pp.starts()[i+1] - pp.starts()[i];
+
+        SubField<scalar> subRecvFld(recvFld, subSize, subStart);
+        Field<scalar>& subFld = static_cast<Field<scalar>&>
+        (
+            static_cast<UList<scalar>&>(subRecvFld)
+        );
+
+        label patchI = pp.patchIDs()[i];
+
+        //Pout<< "updateInterfaceMatrix on "
+        //    << this->dimensionedInternalField().name()
+        //    << " patch:" << pp.name()
+        //    << " subSize:" << (pp.starts()[i+1]-pp.starts()[i])
+        //    << " subStart:" << pp.starts()[i]
+        //    << " subPatch:" << patchI << endl;
+
+        if (patchI == -1)
+        {
+            const unallocLabelList& faceCells = pp.faceCells();
+
+            label facei = subStart;
+
+            forAll(subFld, elemI)
+            {
+                result[faceCells[facei]] -= coeffs[facei]*subFld[elemI];
+
+                facei++;
+            }
+        }
+        else
+        {
+            patchField(patchI).updateInterfaceMatrix
+            (
+                psiInternal,
+                result,
+                m,
+                coeffs,
+                cmpt,
+                procPatch_,
+                subSize,
+                subStart,
+                subFld
+            );
+        }
+    }
+}
+
+
+//template<class Type>
+//void Foam::processorFvPatchField<Type>::transformCoupleField
+//(
+//    scalarField& f,
+//    const direction cmpt
+//) const
+//{
+//    if (pTraits<Type>::rank > 0)
+//    {
+//        const processorPolyPatch& pp = procPatch_.procPolyPatch();
+//
+//        forAll(pp.patchIDs(), i)
+//        {
+//            label patchI = pp.patchIDs()[i];
+//
+//            if (patchI == -1)
+//            {
+//                // ? anything needs to be transformed?
+//            }
+//            else
+//            {
+//                const coupledPolyPatch& cpp =
+//                    refCast<const coupledPolyPatch>(pp.boundaryMesh()[patchI]);
+//
+//                if (!cpp.parallel())
+//                {
+//                    const tensor& T = cpp.forwardT();
+//
+//                    SubField<scalar> subFld(pp.subSlice(f, i));
+//                    const scalarField& fld =
+//                        static_cast<const scalarField&>(subFld);
+//
+//                    const_cast<scalarField&>(fld) *=
+//                        pow(diag(T).component(cmpt), rank());
+//                }
+//            }
+//        }
+//    }
+//}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchField.H
new file mode 100644
index 00000000000..2829334b14d
--- /dev/null
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchField.H
@@ -0,0 +1,323 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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::processorFvPatchField
+
+Description
+    Foam::processorFvPatchField
+
+SourceFiles
+    processorFvPatchField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef processorFvPatchField_H
+#define processorFvPatchField_H
+
+#include "coupledFvPatchField.H"
+#include "processorLduInterfaceField.H"
+#include "processorFvPatch.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                      Class processorFvPatch Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class Type>
+class processorFvPatchField
+:
+    public processorLduInterfaceField,
+    public coupledFvPatchField<Type>
+{
+    // Private data
+
+        //- Local reference cast into the processor patch
+        const processorFvPatch& procPatch_;
+
+    // Private Member Functions
+
+        //- Get other patchfield
+        const coupledFvPatchField<Type>& patchField(const label patchID) const;
+public:
+
+    //- Runtime type information
+    TypeName(processorFvPatch::typeName_());
+
+
+    // Constructors
+
+        //- Construct from patch and internal field
+        processorFvPatchField
+        (
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&
+        );
+
+        //- Construct from patch and internal field and patch field
+        processorFvPatchField
+        (
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&,
+            const Field<Type>&
+        );
+
+        //- Construct from patch, internal field and dictionary
+        processorFvPatchField
+        (
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&,
+            const dictionary&
+        );
+
+        //- Construct by mapping given processorFvPatchField onto a new patch
+        processorFvPatchField
+        (
+            const processorFvPatchField<Type>&,
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&,
+            const fvPatchFieldMapper&
+        );
+
+        //- Construct as copy
+        processorFvPatchField(const processorFvPatchField<Type>&);
+
+        //- Construct and return a clone
+        virtual tmp<fvPatchField<Type> > clone() const
+        {
+            return tmp<fvPatchField<Type> >
+            (
+                new processorFvPatchField<Type>(*this)
+            );
+        }
+
+        //- Construct as copy setting internal field reference
+        processorFvPatchField
+        (
+            const processorFvPatchField<Type>&,
+            const DimensionedField<Type, volMesh>&
+        );
+
+        //- Construct and return a clone setting internal field reference
+        virtual tmp<fvPatchField<Type> > clone
+        (
+            const DimensionedField<Type, volMesh>& iF
+        ) const
+        {
+            return tmp<fvPatchField<Type> >
+            (
+                new processorFvPatchField<Type>(*this, iF)
+            );
+        }
+
+
+    // Destructor
+
+        ~processorFvPatchField();
+
+
+    // Member functions
+
+        // Access
+
+            //- Return true if running parallel
+            virtual bool coupled() const
+            {
+                if (Pstream::parRun())
+                {
+                    return true;
+                }
+                else
+                {
+                    return false;
+                }
+            }
+
+            //- Return neighbour field given internal field
+            tmp<Field<Type> > patchNeighbourField() const;
+
+
+        // Evaluation functions
+
+            //- Initialise the evaluation of the patch field
+            virtual void initEvaluate(const Pstream::commsTypes commsType);
+
+            //- Evaluate the patch field
+            virtual void evaluate(const Pstream::commsTypes commsType);
+
+            //- Return patch-normal gradient
+            virtual tmp<Field<Type> > snGrad() const;
+
+            //- Initialise neighbour matrix update
+            virtual void initInterfaceMatrixUpdate
+            (
+                const scalarField& psiInternal,
+                scalarField& result,
+                const lduMatrix& m,
+                const scalarField& coeffs,
+                const direction cmpt,
+                const Pstream::commsTypes commsType
+            ) const;
+
+            //- Update result field based on interface functionality
+            virtual void updateInterfaceMatrix
+            (
+                const scalarField& psiInternal,
+                scalarField& result,
+                const lduMatrix& m,
+                const scalarField& coeffs,
+                const direction cmpt,
+                const Pstream::commsTypes commsType
+            ) const;
+
+        //- Processor coupled interface functions
+
+            //- Return processor number
+            virtual int myProcNo() const
+            {
+                return procPatch_.myProcNo();
+            }
+
+            //- Return neigbour processor number
+            virtual int neighbProcNo() const
+            {
+                return procPatch_.neighbProcNo();
+            }
+
+            //- Return rank of component for transform
+            virtual int rank() const
+            {
+                return pTraits<Type>::rank;
+            }
+
+//            //- Transform given patch component field
+//            void transformCoupleField
+//            (
+//                scalarField& f,
+//                const direction cmpt
+//            ) const;
+
+        // Referred-patch functionality. Get called with a slice (size, start)
+        // of a patch that supplies fields and geometry/topology.
+
+            //- Get patch-normal gradient
+            virtual void snGrad
+            (
+                Field<Type>& exchangeBuf,
+                const Field<Type>& subFld,
+                const coupledFvPatch& referringPatch,
+                const label size,
+                const label start
+            ) const
+            {
+                notImplemented("processorFvPatchField::snGrad(..)");
+            }
+
+            //- Initialise the evaluation of the patch field.
+            virtual void initEvaluate
+            (
+                Field<Type>& exchangeBuf,
+                const coupledFvPatch& referringPatch,
+                const label size,
+                const label start
+            ) const
+            {
+                notImplemented("processorFvPatchField::initEvaluate(..)");
+            }
+
+            //- Evaluate the patch field.
+            virtual void evaluate
+            (
+                Field<Type>& exchangeBuf,
+                const coupledFvPatch& referringPatch,
+                const label size,
+                const label start
+            ) const
+            {
+                notImplemented("processorFvPatchField::evaluate(..)");
+            }
+
+            //- Initialise neighbour matrix update
+            virtual void initInterfaceMatrixUpdate
+            (
+                const scalarField& psiInternal,
+                scalarField& result,
+                const lduMatrix& m,
+                const scalarField& coeffs,
+                const direction cmpt,
+                const coupledFvPatch& referringPatch,
+                const label size,
+                const label start,
+                scalarField& exchangeBuf
+            ) const
+            {
+                notImplemented
+                (
+                    "processorFvPatchField::initInterfaceMatrixUpdate(..)"
+                );
+            }
+
+            //- Update result field based on interface functionality
+            virtual void updateInterfaceMatrix
+            (
+                const scalarField& psiInternal,
+                scalarField& result,
+                const lduMatrix&,
+                const scalarField& coeffs,
+                const direction,
+                const coupledFvPatch& referringPatch,
+                const label size,
+                const label start,
+                scalarField& exchangeBuf
+            ) const
+            {
+                notImplemented
+                (
+                    "processorFvPatchField::updateInterfaceMatrix(..)"
+                );
+            }
+
+
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#   include "processorFvPatchField.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchFields.C b/src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchFields.C
new file mode 100644
index 00000000000..de2d731b9d9
--- /dev/null
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchFields.C
@@ -0,0 +1,45 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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 "processorFvPatchFields.H"
+#include "addToRunTimeSelectionTable.H"
+#include "volFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+makePatchFields(processor);
+//makePatchTypeField(fvPatchScalarField, processorFvPatchScalarField);
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchFields.H b/src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchFields.H
new file mode 100644
index 00000000000..97df670892e
--- /dev/null
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchFields.H
@@ -0,0 +1,50 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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 processorFvPatchFields_H
+#define processorFvPatchFields_H
+
+#include "processorFvPatchScalarField.H"
+#include "fieldTypes.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+makePatchTypeFieldTypedefs(processor)
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchFieldsFwd.H b/src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchFieldsFwd.H
new file mode 100644
index 00000000000..95306902cdb
--- /dev/null
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchFieldsFwd.H
@@ -0,0 +1,51 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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 processorFvPatchFieldsFwd_H
+#define processorFvPatchFieldsFwd_H
+
+#include "fieldTypes.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+template<class Type> class processorFvPatchField;
+
+makePatchTypeFieldTypedefs(processor)
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/mesh/blockMesh/curvedEdges/spline.C b/src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchScalarField.C
similarity index 54%
rename from src/mesh/blockMesh/curvedEdges/spline.C
rename to src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchScalarField.C
index cddf6fa8eda..3a3f6936fb6 100644
--- a/src/mesh/blockMesh/curvedEdges/spline.C
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchScalarField.C
@@ -24,72 +24,61 @@ License
 
 \*---------------------------------------------------------------------------*/
 
-#include "spline.H"
+#include "processorFvPatchScalarField.H"
 
-// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-Foam::scalar Foam::spline::B(const scalar tau)
+namespace Foam
 {
-    if (tau <= -2.0 || tau >= 2.0)
-    {
-        return 0.0;
-    }
-    else if (tau <= -1.0)
-    {
-        return pow((2.0 + tau), 3.0)/6.0;
-    }
-    else if (tau <= 0.0)
-    {
-        return (4.0 - 6.0*tau*tau - 3.0*tau*tau*tau)/6.0;
-    }
-    else if (tau <= 1.0)
-    {
-        return (4.0 - 6.0*tau*tau + 3.0*tau*tau*tau)/6.0;
-    }
-    else if (tau <= 2.0)
-    {
-        return pow((2.0 - tau), 3.0)/6.0;
-    }
-    else
-    {
-        FatalErrorIn("spline::B(const scalar)")
-            << "Programming error???, "
-            << "tau = " << tau
-            << abort(FatalError);
-    }
 
-    return 0.0;
-}
-
-
-// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
-
-Foam::spline::spline(const pointField& knotPoints)
-:
-    knots_(knotPoints)
-{}
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
+template<>
+void processorFvPatchField<scalar>::initInterfaceMatrixUpdate
+(
+    const scalarField& psiInternal,
+    scalarField&,
+    const lduMatrix&,
+    const scalarField&,
+    const direction,
+    const Pstream::commsTypes commsType
+) const
+{
+    procPatch_.compressedSend
+    (
+        commsType,
+        patch().patchInternalField(psiInternal)()
+    );
+}
 
-// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-Foam::vector Foam::spline::position(const scalar mu) const
+template<>
+void processorFvPatchField<scalar>::updateInterfaceMatrix
+(
+    const scalarField&,
+    scalarField& result,
+    const lduMatrix&,
+    const scalarField& coeffs,
+    const direction,
+    const Pstream::commsTypes commsType
+) const
 {
-    vector loc(vector::zero);
+    scalarField pnf
+    (
+        procPatch_.compressedReceive<scalar>(commsType, this->size())()
+    );
+
+    const unallocLabelList& faceCells = patch().faceCells();
 
-    for (register label i=0; i < knots_.size(); i++)
+    forAll(faceCells, facei)
     {
-        loc += B((knots_.size() - 1)*mu - i)*knots_[i];
+        result[faceCells[facei]] -= coeffs[facei]*pnf[facei];
     }
-
-    return loc;
 }
 
 
-Foam::scalar Foam::spline::length() const
-{
-    notImplemented("spline::length() const");
-    return 1.0;
-}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
+} // End namespace Foam
 
 // ************************************************************************* //
diff --git a/src/mesh/blockMesh/curvedEdges/spline.H b/src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchScalarField.H
similarity index 52%
rename from src/mesh/blockMesh/curvedEdges/spline.H
rename to src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchScalarField.H
index 74e73afdc65..af9ba9bb425 100644
--- a/src/mesh/blockMesh/curvedEdges/spline.H
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/processorCyclic/processorFvPatchScalarField.H
@@ -22,85 +22,49 @@ 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::spline
-
-Description
-    Define a basic spline on nKnots knots.
-
-    The spline does not go anywhere near these knots
-    (will act as a base type for various splines that will have real uses)
-
-SourceFiles
-    spline.C
-
 \*---------------------------------------------------------------------------*/
 
-#ifndef spline_H
-#define spline_H
+#ifndef processorFvPatchScalarField_H
+#define processorFvPatchScalarField_H
 
-#include "pointField.H"
+#include "processorFvPatchField.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 namespace Foam
 {
 
-/*---------------------------------------------------------------------------*\
-                           Class spline Declaration
-\*---------------------------------------------------------------------------*/
-
-class spline
-{
-    // Private data
-
-        //- The knots defining the spline
-        pointField knots_;
-
-    // Private Member Functions
-
-        //- Blending function for constructing spline
-        static scalar B(const scalar);
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-        //- Disallow default bitwise copy construct
-        spline(const spline&);
+template<>
+void processorFvPatchField<scalar>::initInterfaceMatrixUpdate
+(
+    const scalarField&,
+    scalarField&,
+    const lduMatrix&,
+    const scalarField&,
+    const direction,
+    const Pstream::commsTypes commsType
+) const;
 
-        //- Disallow default bitwise assignment
-        void operator=(const spline&);
 
-
-public:
-
-    // Constructors
-
-        //- Construct from components
-        spline(const pointField&);
-
-
-    // Member Functions
-
-        // Access
-
-            //- Return the number of knots in the spline
-            label nKnots() const
-            {
-                return knots_.size();
-            }
-
-
-        //- Return the position of a point on the curve given by
-        //  the parameter 0 <= lambda <= 1
-        vector position(const scalar) const;
-
-        //- Return the length of the spline curve
-        scalar length() const;
-};
+template<>
+void processorFvPatchField<scalar>::updateInterfaceMatrix
+(
+    const scalarField&,
+    scalarField& result,
+    const lduMatrix&,
+    const scalarField& coeffs,
+    const direction,
+    const Pstream::commsTypes commsType
+) const;
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
 
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 #endif
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/wedge/wedgeFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/constraint/wedge/wedgeFvPatchField.C
index cd0d960216e..ad70b0f8c94 100644
--- a/src/finiteVolume/fields/fvPatchFields/constraint/wedge/wedgeFvPatchField.C
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/wedge/wedgeFvPatchField.C
@@ -169,7 +169,7 @@ void wedgeFvPatchField<Type>::evaluate(const Pstream::commsTypes)
 template<class Type>
 tmp<Field<Type> > wedgeFvPatchField<Type>::snGradTransformDiag() const
 {
-    diagTensor diagT = 
+    diagTensor diagT =
         0.5*diag(I - refCast<const wedgeFvPatch>(this->patch()).cellT());
 
     return tmp<Field<Type> >
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/fan/fanFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/derived/fan/fanFvPatchField.H
index 6ad3f73c767..3b8d668c980 100644
--- a/src/finiteVolume/fields/fvPatchFields/derived/fan/fanFvPatchField.H
+++ b/src/finiteVolume/fields/fvPatchFields/derived/fan/fanFvPatchField.H
@@ -132,7 +132,7 @@ public:
 
         // Access
 
-            //- Return the "jump" across the patch as a "half" field 
+            //- Return the "jump" across the patch as a "half" field
             virtual tmp<Field<Type> > jump() const
             {
                 return jump_;
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/fan/fanFvPatchFields.C b/src/finiteVolume/fields/fvPatchFields/derived/fan/fanFvPatchFields.C
index ce005c5683e..2ae16afc957 100644
--- a/src/finiteVolume/fields/fvPatchFields/derived/fan/fanFvPatchFields.C
+++ b/src/finiteVolume/fields/fvPatchFields/derived/fan/fanFvPatchFields.C
@@ -74,7 +74,7 @@ void Foam::fanFvPatchField<Foam::scalar>::updateCoeffs()
                 );
         }
 
-        for(label i=1; i<f_.size(); i++)
+        for (label i=1; i<f_.size(); i++)
         {
             jump_ += f_[i]*pow(Un, i);
         }
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/freestreamPressure/freestreamPressureFvPatchScalarField.C b/src/finiteVolume/fields/fvPatchFields/derived/freestreamPressure/freestreamPressureFvPatchScalarField.C
index 70b49dc5e02..5131e01a430 100644
--- a/src/finiteVolume/fields/fvPatchFields/derived/freestreamPressure/freestreamPressureFvPatchScalarField.C
+++ b/src/finiteVolume/fields/fvPatchFields/derived/freestreamPressure/freestreamPressureFvPatchScalarField.C
@@ -99,13 +99,13 @@ void freestreamPressureFvPatchScalarField::updateCoeffs()
         return;
     }
 
-    const freestreamFvPatchVectorField& Up = 
+    const freestreamFvPatchVectorField& Up =
         refCast<const freestreamFvPatchVectorField>
         (
             patch().lookupPatchField<volVectorField, vector>("U")
         );
 
-    const surfaceScalarField& phi = 
+    const surfaceScalarField& phi =
         db().lookupObject<surfaceScalarField>("phi");
 
     fvsPatchField<scalar>& phip =
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/partialSlip/partialSlipFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/derived/partialSlip/partialSlipFvPatchField.C
index e39d0d33b6e..0dd713799cc 100644
--- a/src/finiteVolume/fields/fvPatchFields/derived/partialSlip/partialSlipFvPatchField.C
+++ b/src/finiteVolume/fields/fvPatchFields/derived/partialSlip/partialSlipFvPatchField.C
@@ -170,7 +170,7 @@ tmp<Field<Type> > partialSlipFvPatchField<Type>::snGradTransformDiag() const
     diag.replace(vector::Y, mag(nHat.component(vector::Y)));
     diag.replace(vector::Z, mag(nHat.component(vector::Z)));
 
-    return 
+    return
         valueFraction_*pTraits<Type>::one
       + (1.0 - valueFraction_)
        *transformFieldMask<Type>(pow<vector, pTraits<Type>::rank>(diag));
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/rotatingPressureInletOutletVelocity/rotatingPressureInletOutletVelocityFvPatchVectorField.C b/src/finiteVolume/fields/fvPatchFields/derived/rotatingPressureInletOutletVelocity/rotatingPressureInletOutletVelocityFvPatchVectorField.C
index 3a7e97c6b4b..d38a962d696 100644
--- a/src/finiteVolume/fields/fvPatchFields/derived/rotatingPressureInletOutletVelocity/rotatingPressureInletOutletVelocityFvPatchVectorField.C
+++ b/src/finiteVolume/fields/fvPatchFields/derived/rotatingPressureInletOutletVelocity/rotatingPressureInletOutletVelocityFvPatchVectorField.C
@@ -40,7 +40,7 @@ void rotatingPressureInletOutletVelocityFvPatchVectorField::
 calcTangentialVelocity()
 {
     vector axisHat = omega_/mag(omega_);
-    vectorField tangentialVelocity = 
+    vectorField tangentialVelocity =
         (-omega_) ^ (patch().Cf() - axisHat*(axisHat & patch().Cf()));
 
     vectorField n = patch().nf();
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/rotatingTotalPressure/rotatingTotalPressureFvPatchScalarField.C b/src/finiteVolume/fields/fvPatchFields/derived/rotatingTotalPressure/rotatingTotalPressureFvPatchScalarField.C
index b41084139e7..cdf8b7b90e9 100644
--- a/src/finiteVolume/fields/fvPatchFields/derived/rotatingTotalPressure/rotatingTotalPressureFvPatchScalarField.C
+++ b/src/finiteVolume/fields/fvPatchFields/derived/rotatingTotalPressure/rotatingTotalPressureFvPatchScalarField.C
@@ -104,7 +104,7 @@ void rotatingTotalPressureFvPatchScalarField::updateCoeffs()
     }
 
     vector axisHat = omega_/mag(omega_);
-    vectorField rotationVelocity = 
+    vectorField rotationVelocity =
         omega_ ^ (patch().Cf() - axisHat*(axisHat & patch().Cf()));
 
     vectorField Up = patch().lookupPatchField<volVectorField, vector>(UName())
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/supersonicFreestream/supersonicFreestreamFvPatchVectorField.H b/src/finiteVolume/fields/fvPatchFields/derived/supersonicFreestream/supersonicFreestreamFvPatchVectorField.H
index 304ea967686..ce6d48772ea 100644
--- a/src/finiteVolume/fields/fvPatchFields/derived/supersonicFreestream/supersonicFreestreamFvPatchVectorField.H
+++ b/src/finiteVolume/fields/fvPatchFields/derived/supersonicFreestream/supersonicFreestreamFvPatchVectorField.H
@@ -179,7 +179,7 @@ public:
                 return TInf_;
             }
 
-            //- Return reference to the temperature at infinity 
+            //- Return reference to the temperature at infinity
             //  to allow adjustment
             scalar& TInf()
             {
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/surfaceNormalFixedValue/surfaceNormalFixedValueFvPatchVectorField.H b/src/finiteVolume/fields/fvPatchFields/derived/surfaceNormalFixedValue/surfaceNormalFixedValueFvPatchVectorField.H
index 53bd327ab08..5820a46c912 100644
--- a/src/finiteVolume/fields/fvPatchFields/derived/surfaceNormalFixedValue/surfaceNormalFixedValueFvPatchVectorField.H
+++ b/src/finiteVolume/fields/fvPatchFields/derived/surfaceNormalFixedValue/surfaceNormalFixedValueFvPatchVectorField.H
@@ -54,7 +54,7 @@ class surfaceNormalFixedValueFvPatchVectorField
     public fixedValueFvPatchVectorField
 {
     // Private data
-    
+
         scalarField refValue_;
 
 
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/syringePressure/syringePressureFvPatchScalarField.C b/src/finiteVolume/fields/fvPatchFields/derived/syringePressure/syringePressureFvPatchScalarField.C
index e449688ffe6..f343d5d2f63 100644
--- a/src/finiteVolume/fields/fvPatchFields/derived/syringePressure/syringePressureFvPatchScalarField.C
+++ b/src/finiteVolume/fields/fvPatchFields/derived/syringePressure/syringePressureFvPatchScalarField.C
@@ -151,31 +151,31 @@ scalar syringePressureFvPatchScalarField::Vs(const scalar t) const
     }
     else if (t < tae_)
     {
-        return 
+        return
             VsI_
           + 0.5*Ap_*Sp_*sqr(t - tas_)/(tae_ - tas_);
     }
     else if (t < tds_)
     {
-        return 
-            VsI_ 
+        return
+            VsI_
           + 0.5*Ap_*Sp_*(tae_ - tas_)
           + Ap_*Sp_*(t - tae_);
     }
     else if (t < tde_)
     {
-        return 
-            VsI_ 
-          + 0.5*Ap_*Sp_*(tae_ - tas_) 
+        return
+            VsI_
+          + 0.5*Ap_*Sp_*(tae_ - tas_)
           + Ap_*Sp_*(tds_ - tae_)
           + Ap_*Sp_*(t - tds_)
           - 0.5*Ap_*Sp_*sqr(t - tds_)/(tde_ - tds_);
     }
     else
     {
-        return 
-            VsI_ 
-          + 0.5*Ap_*Sp_*(tae_ - tas_) 
+        return
+            VsI_
+          + 0.5*Ap_*Sp_*(tae_ - tas_)
           + Ap_*Sp_*(tds_ - tae_)
           + 0.5*Ap_*Sp_*(tde_ - tds_);
     }
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/timeVaryingMappedFixedValue/AverageIOFields.C b/src/finiteVolume/fields/fvPatchFields/derived/timeVaryingMappedFixedValue/AverageIOFields.C
index 066b741abe6..e39cd28d904 100644
--- a/src/finiteVolume/fields/fvPatchFields/derived/timeVaryingMappedFixedValue/AverageIOFields.C
+++ b/src/finiteVolume/fields/fvPatchFields/derived/timeVaryingMappedFixedValue/AverageIOFields.C
@@ -22,8 +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
-
 \*---------------------------------------------------------------------------*/
 
 #include "AverageIOField.H"
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/totalTemperature/totalTemperatureFvPatchScalarField.C b/src/finiteVolume/fields/fvPatchFields/derived/totalTemperature/totalTemperatureFvPatchScalarField.C
index 8c29e5a0e59..402ed3325f5 100644
--- a/src/finiteVolume/fields/fvPatchFields/derived/totalTemperature/totalTemperatureFvPatchScalarField.C
+++ b/src/finiteVolume/fields/fvPatchFields/derived/totalTemperature/totalTemperatureFvPatchScalarField.C
@@ -204,7 +204,7 @@ namespace Foam
 {
     makePatchTypeField
     (
-        fvPatchScalarField, 
+        fvPatchScalarField,
         totalTemperatureFvPatchScalarField
     );
 }
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/totalTemperature/totalTemperatureFvPatchScalarField.H b/src/finiteVolume/fields/fvPatchFields/derived/totalTemperature/totalTemperatureFvPatchScalarField.H
index c73750c428d..37b2d966de7 100644
--- a/src/finiteVolume/fields/fvPatchFields/derived/totalTemperature/totalTemperatureFvPatchScalarField.H
+++ b/src/finiteVolume/fields/fvPatchFields/derived/totalTemperature/totalTemperatureFvPatchScalarField.H
@@ -92,7 +92,7 @@ public:
             const dictionary&
         );
 
-        //- Construct by mapping given totalTemperatureFvPatchScalarField 
+        //- Construct by mapping given totalTemperatureFvPatchScalarField
         //  onto a new patch
         totalTemperatureFvPatchScalarField
         (
diff --git a/src/finiteVolume/finiteVolume/convectionSchemes/gaussConvectionScheme/gaussConvectionSchemes.C b/src/finiteVolume/finiteVolume/convectionSchemes/gaussConvectionScheme/gaussConvectionSchemes.C
index 4e1935af868..71cde15e79f 100644
--- a/src/finiteVolume/finiteVolume/convectionSchemes/gaussConvectionScheme/gaussConvectionSchemes.C
+++ b/src/finiteVolume/finiteVolume/convectionSchemes/gaussConvectionScheme/gaussConvectionSchemes.C
@@ -22,8 +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
-    
 \*---------------------------------------------------------------------------*/
 
 #include "gaussConvectionScheme.H"
diff --git a/src/finiteVolume/finiteVolume/convectionSchemes/multivariateGaussConvectionScheme/multivariateGaussConvectionSchemes.C b/src/finiteVolume/finiteVolume/convectionSchemes/multivariateGaussConvectionScheme/multivariateGaussConvectionSchemes.C
index 6cdb6b1ec65..78c86ba3de9 100644
--- a/src/finiteVolume/finiteVolume/convectionSchemes/multivariateGaussConvectionScheme/multivariateGaussConvectionSchemes.C
+++ b/src/finiteVolume/finiteVolume/convectionSchemes/multivariateGaussConvectionScheme/multivariateGaussConvectionSchemes.C
@@ -22,8 +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
-    
 \*---------------------------------------------------------------------------*/
 
 #include "multivariateGaussConvectionScheme.H"
diff --git a/src/finiteVolume/finiteVolume/d2dt2Schemes/EulerD2dt2Scheme/EulerD2dt2Schemes.C b/src/finiteVolume/finiteVolume/d2dt2Schemes/EulerD2dt2Scheme/EulerD2dt2Schemes.C
index 199638a886c..2684b09cf72 100644
--- a/src/finiteVolume/finiteVolume/d2dt2Schemes/EulerD2dt2Scheme/EulerD2dt2Schemes.C
+++ b/src/finiteVolume/finiteVolume/d2dt2Schemes/EulerD2dt2Scheme/EulerD2dt2Schemes.C
@@ -22,8 +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
-    
 \*---------------------------------------------------------------------------*/
 
 #include "EulerD2dt2Scheme.H"
diff --git a/src/finiteVolume/finiteVolume/d2dt2Schemes/steadyStateD2dt2Scheme/steadyStateD2dt2Schemes.C b/src/finiteVolume/finiteVolume/d2dt2Schemes/steadyStateD2dt2Scheme/steadyStateD2dt2Schemes.C
index 6e7e95f605e..eef9d0672e2 100644
--- a/src/finiteVolume/finiteVolume/d2dt2Schemes/steadyStateD2dt2Scheme/steadyStateD2dt2Schemes.C
+++ b/src/finiteVolume/finiteVolume/d2dt2Schemes/steadyStateD2dt2Scheme/steadyStateD2dt2Schemes.C
@@ -22,8 +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
-    
 \*---------------------------------------------------------------------------*/
 
 #include "steadyStateD2dt2Scheme.H"
diff --git a/src/finiteVolume/finiteVolume/ddtSchemes/CoEulerDdtScheme/CoEulerDdtSchemes.C b/src/finiteVolume/finiteVolume/ddtSchemes/CoEulerDdtScheme/CoEulerDdtSchemes.C
index 02eb8987d9a..0059ed25756 100644
--- a/src/finiteVolume/finiteVolume/ddtSchemes/CoEulerDdtScheme/CoEulerDdtSchemes.C
+++ b/src/finiteVolume/finiteVolume/ddtSchemes/CoEulerDdtScheme/CoEulerDdtSchemes.C
@@ -21,7 +21,7 @@ License
     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 "CoEulerDdtScheme.H"
diff --git a/src/finiteVolume/finiteVolume/ddtSchemes/CrankNicholsonDdtScheme/CrankNicholsonDdtSchemes.C b/src/finiteVolume/finiteVolume/ddtSchemes/CrankNicholsonDdtScheme/CrankNicholsonDdtSchemes.C
index 3217ef3a74f..06bb5e9d388 100644
--- a/src/finiteVolume/finiteVolume/ddtSchemes/CrankNicholsonDdtScheme/CrankNicholsonDdtSchemes.C
+++ b/src/finiteVolume/finiteVolume/ddtSchemes/CrankNicholsonDdtScheme/CrankNicholsonDdtSchemes.C
@@ -22,8 +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
-    
 \*---------------------------------------------------------------------------*/
 
 #include "CrankNicholsonDdtScheme.H"
diff --git a/src/finiteVolume/finiteVolume/ddtSchemes/EulerDdtScheme/EulerDdtSchemes.C b/src/finiteVolume/finiteVolume/ddtSchemes/EulerDdtScheme/EulerDdtSchemes.C
index 584873fe2c9..e5983fb4aaf 100644
--- a/src/finiteVolume/finiteVolume/ddtSchemes/EulerDdtScheme/EulerDdtSchemes.C
+++ b/src/finiteVolume/finiteVolume/ddtSchemes/EulerDdtScheme/EulerDdtSchemes.C
@@ -21,7 +21,7 @@ License
     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 "EulerDdtScheme.H"
diff --git a/src/finiteVolume/finiteVolume/ddtSchemes/SLTSDdtScheme/SLTSDdtSchemes.C b/src/finiteVolume/finiteVolume/ddtSchemes/SLTSDdtScheme/SLTSDdtSchemes.C
index 6dd6048a4bb..96e04b9dc88 100644
--- a/src/finiteVolume/finiteVolume/ddtSchemes/SLTSDdtScheme/SLTSDdtSchemes.C
+++ b/src/finiteVolume/finiteVolume/ddtSchemes/SLTSDdtScheme/SLTSDdtSchemes.C
@@ -21,7 +21,7 @@ License
     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 "SLTSDdtScheme.H"
diff --git a/src/finiteVolume/finiteVolume/ddtSchemes/backwardDdtScheme/backwardDdtSchemes.C b/src/finiteVolume/finiteVolume/ddtSchemes/backwardDdtScheme/backwardDdtSchemes.C
index cb2d4750227..65ba5c81a3d 100644
--- a/src/finiteVolume/finiteVolume/ddtSchemes/backwardDdtScheme/backwardDdtSchemes.C
+++ b/src/finiteVolume/finiteVolume/ddtSchemes/backwardDdtScheme/backwardDdtSchemes.C
@@ -21,7 +21,7 @@ License
     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 "backwardDdtScheme.H"
diff --git a/src/finiteVolume/finiteVolume/ddtSchemes/steadyStateDdtScheme/steadyStateDdtSchemes.C b/src/finiteVolume/finiteVolume/ddtSchemes/steadyStateDdtScheme/steadyStateDdtSchemes.C
index dda464ee32c..498d19945be 100644
--- a/src/finiteVolume/finiteVolume/ddtSchemes/steadyStateDdtScheme/steadyStateDdtSchemes.C
+++ b/src/finiteVolume/finiteVolume/ddtSchemes/steadyStateDdtScheme/steadyStateDdtSchemes.C
@@ -22,8 +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
-    
 \*---------------------------------------------------------------------------*/
 
 #include "steadyStateDdtScheme.H"
diff --git a/src/finiteVolume/finiteVolume/divSchemes/gaussDivScheme/gaussDivScheme.C b/src/finiteVolume/finiteVolume/divSchemes/gaussDivScheme/gaussDivScheme.C
index 466e3220b7c..95e49e4b981 100644
--- a/src/finiteVolume/finiteVolume/divSchemes/gaussDivScheme/gaussDivScheme.C
+++ b/src/finiteVolume/finiteVolume/divSchemes/gaussDivScheme/gaussDivScheme.C
@@ -21,7 +21,7 @@ License
     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 "gaussDivScheme.H"
diff --git a/src/finiteVolume/finiteVolume/divSchemes/gaussDivScheme/gaussDivSchemes.C b/src/finiteVolume/finiteVolume/divSchemes/gaussDivScheme/gaussDivSchemes.C
index a61cf504545..fce991e55e6 100644
--- a/src/finiteVolume/finiteVolume/divSchemes/gaussDivScheme/gaussDivSchemes.C
+++ b/src/finiteVolume/finiteVolume/divSchemes/gaussDivScheme/gaussDivSchemes.C
@@ -21,7 +21,7 @@ License
     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 "gaussDivScheme.H"
diff --git a/src/finiteVolume/finiteVolume/fv/fv.C b/src/finiteVolume/finiteVolume/fv/fv.C
index 4ee12f43c05..cebfc4dfae2 100644
--- a/src/finiteVolume/finiteVolume/fv/fv.C
+++ b/src/finiteVolume/finiteVolume/fv/fv.C
@@ -22,8 +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
-
 \*---------------------------------------------------------------------------*/
 
 #include "fv.H"
diff --git a/src/finiteVolume/finiteVolume/fvc/fvcAverage.C b/src/finiteVolume/finiteVolume/fvc/fvcAverage.C
index 6f59b61631c..757978ab669 100644
--- a/src/finiteVolume/finiteVolume/fvc/fvcAverage.C
+++ b/src/finiteVolume/finiteVolume/fvc/fvcAverage.C
@@ -69,7 +69,7 @@ average
 
     GeometricField<Type, fvPatchField, volMesh>& av = taverage();
 
-    av.internalField() = 
+    av.internalField() =
     (
         surfaceSum(mesh.magSf()*ssf)/surfaceSum(mesh.magSf())
     )().internalField();
@@ -112,7 +112,7 @@ average
 }
 
 
-template<class Type> 
+template<class Type>
 tmp<GeometricField<Type, fvPatchField, volMesh> >
 average
 (
diff --git a/src/finiteVolume/finiteVolume/fvc/fvcCurl.C b/src/finiteVolume/finiteVolume/fvc/fvcCurl.C
index 2966136cbec..d7505d7345a 100644
--- a/src/finiteVolume/finiteVolume/fvc/fvcCurl.C
+++ b/src/finiteVolume/finiteVolume/fvc/fvcCurl.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
-    
-
 \*---------------------------------------------------------------------------*/
 
 #include "fvcCurl.H"
@@ -53,11 +50,11 @@ curl
     word nameCurlVf = "curl(" + vf.name() + ')';
 
     // Gausses theorem curl
-    // tmp<GeometricField<Type, fvPatchField, volMesh> > tcurlVf = 
+    // tmp<GeometricField<Type, fvPatchField, volMesh> > tcurlVf =
     //     fvc::surfaceIntegrate(vf.mesh().Sf() ^ fvc::interpolate(vf));
 
     // Calculate curl as the Hodge dual of the skew-symmetric part of grad
-    tmp<GeometricField<Type, fvPatchField, volMesh> > tcurlVf = 
+    tmp<GeometricField<Type, fvPatchField, volMesh> > tcurlVf =
         2.0*(*skew(fvc::grad(vf, nameCurlVf)));
 
     tcurlVf().rename(nameCurlVf);
diff --git a/src/finiteVolume/finiteVolume/fvc/fvcD2dt2.C b/src/finiteVolume/finiteVolume/fvc/fvcD2dt2.C
index b7135939d84..a1e28e2043b 100644
--- a/src/finiteVolume/finiteVolume/fvc/fvcD2dt2.C
+++ b/src/finiteVolume/finiteVolume/fvc/fvcD2dt2.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
-    
-
 \*---------------------------------------------------------------------------*/
 
 #include "fvcD2dt2.H"
diff --git a/src/finiteVolume/finiteVolume/fvc/fvcDDt.C b/src/finiteVolume/finiteVolume/fvc/fvcDDt.C
index 1493f41d47c..17bc5e92306 100644
--- a/src/finiteVolume/finiteVolume/fvc/fvcDDt.C
+++ b/src/finiteVolume/finiteVolume/fvc/fvcDDt.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
-    
-
 \*---------------------------------------------------------------------------*/
 
 #include "fvcDDt.H"
diff --git a/src/finiteVolume/finiteVolume/fvc/fvcFlux.C b/src/finiteVolume/finiteVolume/fvc/fvcFlux.C
index 247c4247fd6..bde44a1c202 100644
--- a/src/finiteVolume/finiteVolume/fvc/fvcFlux.C
+++ b/src/finiteVolume/finiteVolume/fvc/fvcFlux.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
-    
-
 \*---------------------------------------------------------------------------*/
 
 #include "fvcFlux.H"
diff --git a/src/finiteVolume/finiteVolume/fvc/fvcMagSqrGradGrad.C b/src/finiteVolume/finiteVolume/fvc/fvcMagSqrGradGrad.C
index 8acc71cd59b..dfcd7bd3f5d 100644
--- a/src/finiteVolume/finiteVolume/fvc/fvcMagSqrGradGrad.C
+++ b/src/finiteVolume/finiteVolume/fvc/fvcMagSqrGradGrad.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
-    
-
 \*---------------------------------------------------------------------------*/
 
 #include "fvcMagSqrGradGrad.H"
diff --git a/src/finiteVolume/finiteVolume/gradSchemes/extendedLeastSquaresGrad/extendedLeastSquaresGrads.C b/src/finiteVolume/finiteVolume/gradSchemes/extendedLeastSquaresGrad/extendedLeastSquaresGrads.C
index 4827db9cf16..734b6461b83 100644
--- a/src/finiteVolume/finiteVolume/gradSchemes/extendedLeastSquaresGrad/extendedLeastSquaresGrads.C
+++ b/src/finiteVolume/finiteVolume/gradSchemes/extendedLeastSquaresGrad/extendedLeastSquaresGrads.C
@@ -21,7 +21,7 @@ License
     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"
diff --git a/src/finiteVolume/finiteVolume/gradSchemes/extendedLeastSquaresGrad/extendedLeastSquaresVectors.C b/src/finiteVolume/finiteVolume/gradSchemes/extendedLeastSquaresGrad/extendedLeastSquaresVectors.C
index 86142a70a7c..a1d653d5218 100644
--- a/src/finiteVolume/finiteVolume/gradSchemes/extendedLeastSquaresGrad/extendedLeastSquaresVectors.C
+++ b/src/finiteVolume/finiteVolume/gradSchemes/extendedLeastSquaresGrad/extendedLeastSquaresVectors.C
@@ -135,7 +135,7 @@ void Foam::extendedLeastSquaresVectors::makeLeastSquaresVectors() const
     }
 
     // Visit the boundaries. Coupled boundaries are taken into account
-    // in the construction of d vectors.  
+    // in the construction of d vectors.
     forAll(d.boundaryField(), patchI)
     {
         const fvsPatchVectorField& pd = d.boundaryField()[patchI];
@@ -194,8 +194,8 @@ void Foam::extendedLeastSquaresVectors::makeLeastSquaresVectors() const
                         if (cellj != -1)
                         {
                             vector dCij = (mesh.C()[cellj] - mesh.C()[i]);
-                            
-                            symmTensor ddij = 
+
+                            symmTensor ddij =
                                 dd[i] + (1.0/magSqr(dCij))*sqr(dCij);
 
                             scalar detddij = det(ddij);
@@ -265,7 +265,7 @@ void Foam::extendedLeastSquaresVectors::makeLeastSquaresVectors() const
 
     forAll(additionalCells_, i)
     {
-        vector dCij = 
+        vector dCij =
             mesh.C()[additionalCells_[i][1]] - mesh.C()[additionalCells_[i][0]];
 
         additionalVectors_[i] =
diff --git a/src/finiteVolume/finiteVolume/gradSchemes/fourthGrad/fourthGrads.C b/src/finiteVolume/finiteVolume/gradSchemes/fourthGrad/fourthGrads.C
index d832c1f131f..2d0603e0b50 100644
--- a/src/finiteVolume/finiteVolume/gradSchemes/fourthGrad/fourthGrads.C
+++ b/src/finiteVolume/finiteVolume/gradSchemes/fourthGrad/fourthGrads.C
@@ -22,8 +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
-    
 \*---------------------------------------------------------------------------*/
 
 #include "fvMesh.H"
@@ -35,8 +33,10 @@ namespace Foam
 {
 namespace fv
 {
+
     makeFvGradScheme(fourthGrad)
-}
-}
+
+} // End namespace fv
+} // End namespace Foam
 
 // ************************************************************************* //
diff --git a/src/finiteVolume/finiteVolume/gradSchemes/leastSquaresGrad/leastSquaresGrads.C b/src/finiteVolume/finiteVolume/gradSchemes/leastSquaresGrad/leastSquaresGrads.C
index 4cc67e15850..5df614f628f 100644
--- a/src/finiteVolume/finiteVolume/gradSchemes/leastSquaresGrad/leastSquaresGrads.C
+++ b/src/finiteVolume/finiteVolume/gradSchemes/leastSquaresGrad/leastSquaresGrads.C
@@ -22,8 +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
-    
 \*---------------------------------------------------------------------------*/
 
 #include "fvMesh.H"
diff --git a/src/finiteVolume/finiteVolume/gradSchemes/limitedGradSchemes/cellLimitedGrad/cellLimitedGrad.H b/src/finiteVolume/finiteVolume/gradSchemes/limitedGradSchemes/cellLimitedGrad/cellLimitedGrad.H
index 22083de571e..5c4d711ab30 100644
--- a/src/finiteVolume/finiteVolume/gradSchemes/limitedGradSchemes/cellLimitedGrad/cellLimitedGrad.H
+++ b/src/finiteVolume/finiteVolume/gradSchemes/limitedGradSchemes/cellLimitedGrad/cellLimitedGrad.H
@@ -162,7 +162,7 @@ inline void cellLimitedGrad<Type>::limitFace
     const Type& extrapolate
 )
 {
-    for(direction cmpt=0; cmpt<Type::nComponents; cmpt++)
+    for (direction cmpt=0; cmpt<Type::nComponents; cmpt++)
     {
         cellLimitedGrad<scalar>::limitFace
         (
diff --git a/src/finiteVolume/finiteVolume/gradSchemes/limitedGradSchemes/cellMDLimitedGrad/cellMDLimitedGrad.H b/src/finiteVolume/finiteVolume/gradSchemes/limitedGradSchemes/cellMDLimitedGrad/cellMDLimitedGrad.H
index d9b389d0f54..f48ed450d9a 100644
--- a/src/finiteVolume/finiteVolume/gradSchemes/limitedGradSchemes/cellMDLimitedGrad/cellMDLimitedGrad.H
+++ b/src/finiteVolume/finiteVolume/gradSchemes/limitedGradSchemes/cellMDLimitedGrad/cellMDLimitedGrad.H
@@ -164,7 +164,7 @@ inline void cellMDLimitedGrad<Type>::limitFace
     const vector& dcf
 )
 {
-    for(direction cmpt=0; cmpt<Type::nComponents; cmpt++)
+    for (direction cmpt=0; cmpt<Type::nComponents; cmpt++)
     {
         vector gi(g[cmpt], g[cmpt+3], g[cmpt+6]);
         cellMDLimitedGrad<scalar>::limitFace
diff --git a/src/finiteVolume/finiteVolume/snGradSchemes/limitedSnGrad/limitedSnGrad.C b/src/finiteVolume/finiteVolume/snGradSchemes/limitedSnGrad/limitedSnGrad.C
index eb1144c1d3d..7ebfc2e4f83 100644
--- a/src/finiteVolume/finiteVolume/snGradSchemes/limitedSnGrad/limitedSnGrad.C
+++ b/src/finiteVolume/finiteVolume/snGradSchemes/limitedSnGrad/limitedSnGrad.C
@@ -67,7 +67,7 @@ limitedSnGrad<Type>::correction
     const GeometricField<Type, fvPatchField, volMesh>& vf
 ) const
 {
-    GeometricField<Type, fvsPatchField, surfaceMesh> corr = 
+    GeometricField<Type, fvsPatchField, surfaceMesh> corr =
         correctedSnGrad<Type>(this->mesh()).correction(vf);
 
     surfaceScalarField limiter
diff --git a/src/finiteVolume/finiteVolume/snGradSchemes/quadraticFitSnGrad/quadraticFitSnGradData.C b/src/finiteVolume/finiteVolume/snGradSchemes/quadraticFitSnGrad/quadraticFitSnGradData.C
index e50f3dd40f2..bd65a3fd375 100644
--- a/src/finiteVolume/finiteVolume/snGradSchemes/quadraticFitSnGrad/quadraticFitSnGradData.C
+++ b/src/finiteVolume/finiteVolume/snGradSchemes/quadraticFitSnGrad/quadraticFitSnGradData.C
@@ -28,6 +28,7 @@ License
 #include "surfaceFields.H"
 #include "volFields.H"
 #include "SVD.H"
+#include "syncTools.H"
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
@@ -63,7 +64,7 @@ Foam::quadraticFitSnGradData::quadraticFitSnGradData
 {
     if (debug)
     {
-        Info << "Contructing quadraticFitSnGradData" << endl;
+        Info<< "Contructing quadraticFitSnGradData" << endl;
     }
 
     // check input
@@ -107,7 +108,7 @@ Foam::quadraticFitSnGradData::quadraticFitSnGradData
 
     // find the fit coefficients for every face in the mesh
 
-    for(label faci = 0; faci < mesh.nInternalFaces(); faci++)
+    for (label faci = 0; faci < mesh.nInternalFaces(); faci++)
     {
         snGradPolySize[faci] = calcFit(stencilPoints[faci], faci);
     }
@@ -205,7 +206,7 @@ Foam::label Foam::quadraticFitSnGradData::calcFit
     // calculate the matrix of the polynomial components
     scalarRectangularMatrix B(C.size(), minSize_, scalar(0));
 
-    for(label ip = 0; ip < C.size(); ip++)
+    for (label ip = 0; ip < C.size(); ip++)
     {
         const point& p = C[ip];
 
@@ -253,7 +254,7 @@ Foam::label Foam::quadraticFitSnGradData::calcFit
     const scalar deltaCoeff = mesh().deltaCoeffs()[faci];
 
     bool goodFit = false;
-    for(int iIt = 0; iIt < 10 && !goodFit; iIt++)
+    for (int iIt = 0; iIt < 10 && !goodFit; iIt++)
     {
         SVD svd(B, SMALL);
 
@@ -269,7 +270,7 @@ Foam::label Foam::quadraticFitSnGradData::calcFit
         {
             fit_[faci][0] = fit0;
             fit_[faci][1] = fit1;
-            for(label i = 2; i < stencilSize; i++)
+            for (label i = 2; i < stencilSize; i++)
             {
                 fit_[faci][i] = wts[0]*wts[i]*svd.VSinvUt()[1][i]/scale;
             }
@@ -281,13 +282,13 @@ Foam::label Foam::quadraticFitSnGradData::calcFit
             wts[0] *= 10;
             wts[1] *= 10;
 
-            for(label i = 0; i < B.n(); i++)
+            for (label i = 0; i < B.n(); i++)
             {
                 B[i][0] *= 10;
                 B[i][1] *= 10;
             }
 
-            for(label j = 0; j < B.m(); j++)
+            for (label j = 0; j < B.m(); j++)
             {
                 B[0][j] *= 10;
                 B[1][j] *= 10;
diff --git a/src/finiteVolume/finiteVolume/snGradSchemes/quadraticFitSnGrad/quadraticFitSnGrads.C b/src/finiteVolume/finiteVolume/snGradSchemes/quadraticFitSnGrad/quadraticFitSnGrads.C
index c368d0b85ab..b6eabeeade6 100644
--- a/src/finiteVolume/finiteVolume/snGradSchemes/quadraticFitSnGrad/quadraticFitSnGrads.C
+++ b/src/finiteVolume/finiteVolume/snGradSchemes/quadraticFitSnGrad/quadraticFitSnGrads.C
@@ -23,7 +23,7 @@ License
     Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 
 Description
-    Simple central-difference snGrad scheme with quadratic fit correction from 
+    Simple central-difference snGrad scheme with quadratic fit correction from
     a larger stencil.
 
 \*---------------------------------------------------------------------------*/
diff --git a/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.C b/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.C
index 5e85f505922..9ce8d888c4b 100644
--- a/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.C
+++ b/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.C
@@ -725,7 +725,7 @@ Foam::fvMatrix<Type>::H() const
         )
     );
 
-    for(direction cmpt=0; cmpt<Type::nComponents; cmpt++)
+    for (direction cmpt=0; cmpt<Type::nComponents; cmpt++)
     {
         if (validComponents[cmpt] == -1)
         {
diff --git a/src/finiteVolume/fvMatrices/fvMatrix/fvMatrixSolve.C b/src/finiteVolume/fvMatrices/fvMatrix/fvMatrixSolve.C
index c56899bd62e..a78d6be6cf2 100644
--- a/src/finiteVolume/fvMatrices/fvMatrix/fvMatrixSolve.C
+++ b/src/finiteVolume/fvMatrices/fvMatrix/fvMatrixSolve.C
@@ -90,7 +90,7 @@ Foam::lduMatrix::solverPerformance Foam::fvMatrix<Type>::solve
         )
     );
 
-    for(direction cmpt=0; cmpt<Type::nComponents; cmpt++)
+    for (direction cmpt=0; cmpt<Type::nComponents; cmpt++)
     {
         if (validComponents[cmpt] == -1) continue;
 
diff --git a/src/finiteVolume/fvMatrices/solvers/MULES/MULESTemplates.C b/src/finiteVolume/fvMatrices/solvers/MULES/MULESTemplates.C
index e7193e01811..c551ab48312 100644
--- a/src/finiteVolume/fvMatrices/solvers/MULES/MULESTemplates.C
+++ b/src/finiteVolume/fvMatrices/solvers/MULES/MULESTemplates.C
@@ -34,8 +34,7 @@ License
 #include "fvcSurfaceIntegrate.H"
 #include "slicedSurfaceFields.H"
 #include "syncTools.H"
-
-#include "fvCFD.H"
+#include "fvm.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -142,8 +141,7 @@ void Foam::MULES::implicitSolve
 {
     const fvMesh& mesh = psi.mesh();
 
-    const dictionary& MULEScontrols = 
-       mesh.solverDict(psi.name()).subDict("MULESImplicit");
+    const dictionary& MULEScontrols = mesh.solverDict(psi.name());
 
     label maxIter
     (
@@ -478,7 +476,7 @@ void Foam::MULES::limiter
     scalarField sumlPhip(psiIf.size());
     scalarField mSumlPhim(psiIf.size());
 
-    for(int j=0; j<nLimiterIter; j++)
+    for (int j=0; j<nLimiterIter; j++)
     {
         sumlPhip = 0.0;
         mSumlPhim = 0.0;
diff --git a/src/finiteVolume/fvMesh/extendedStencil/cellToCell/fullStencils/CFCCellToCellStencil.C b/src/finiteVolume/fvMesh/extendedStencil/cellToCell/fullStencils/CFCCellToCellStencil.C
index 0c06565d5be..251e6f25943 100644
--- a/src/finiteVolume/fvMesh/extendedStencil/cellToCell/fullStencils/CFCCellToCellStencil.C
+++ b/src/finiteVolume/fvMesh/extendedStencil/cellToCell/fullStencils/CFCCellToCellStencil.C
@@ -53,7 +53,7 @@ void Foam::CFCCellToCellStencil::calcFaceBoundaryData
             // For coupled faces get the cell on the other side
             forAll(pp, i)
             {
-                label bFaceI = faceI-mesh().nInternalFaces(); 
+                label bFaceI = faceI-mesh().nInternalFaces();
                 neiGlobal[bFaceI] = globalNumbering().toGlobal(own[faceI]);
                 faceI++;
             }
@@ -62,7 +62,7 @@ void Foam::CFCCellToCellStencil::calcFaceBoundaryData
         {
             forAll(pp, i)
             {
-                label bFaceI = faceI-mesh().nInternalFaces(); 
+                label bFaceI = faceI-mesh().nInternalFaces();
                 neiGlobal[bFaceI] = -1;
                 faceI++;
             }
@@ -72,7 +72,7 @@ void Foam::CFCCellToCellStencil::calcFaceBoundaryData
             // For noncoupled faces get the boundary face.
             forAll(pp, i)
             {
-                label bFaceI = faceI-mesh().nInternalFaces(); 
+                label bFaceI = faceI-mesh().nInternalFaces();
                 neiGlobal[bFaceI] =
                     globalNumbering().toGlobal(mesh().nCells()+bFaceI);
                 faceI++;
diff --git a/src/finiteVolume/fvMesh/extendedStencil/cellToCell/fullStencils/cellToCellStencil.H b/src/finiteVolume/fvMesh/extendedStencil/cellToCell/fullStencils/cellToCellStencil.H
index dfa7a06a2ac..f8b94c8d5f2 100644
--- a/src/finiteVolume/fvMesh/extendedStencil/cellToCell/fullStencils/cellToCellStencil.H
+++ b/src/finiteVolume/fvMesh/extendedStencil/cellToCell/fullStencils/cellToCellStencil.H
@@ -41,7 +41,6 @@ SourceFiles
 #include "boolList.H"
 #include "HashSet.H"
 #include "indirectPrimitivePatch.H"
-#include "coupledPolyPatch.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -71,7 +70,7 @@ class cellToCellStencil
         //- Disallow default bitwise assignment
         void operator=(const cellToCellStencil&);
 
-        
+
 protected:
 
         //- Merge two lists.
@@ -141,6 +140,7 @@ public:
 
 };
 
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/finiteVolume/fvMesh/extendedStencil/cellToFace/extendedUpwindCellToFaceStencil.C b/src/finiteVolume/fvMesh/extendedStencil/cellToFace/extendedUpwindCellToFaceStencil.C
index 655cdb1b628..e6c2587f819 100644
--- a/src/finiteVolume/fvMesh/extendedStencil/cellToFace/extendedUpwindCellToFaceStencil.C
+++ b/src/finiteVolume/fvMesh/extendedStencil/cellToFace/extendedUpwindCellToFaceStencil.C
@@ -311,7 +311,7 @@ void Foam::extendedUpwindCellToFaceStencil::transportStencils
 
     // Swap coupled boundary stencil
     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-    
+
     labelListList neiBndStencil(nBnd);
     for (label faceI = mesh_.nInternalFaces(); faceI < mesh_.nFaces(); faceI++)
     {
diff --git a/src/finiteVolume/fvMesh/extendedStencil/cellToFace/fullStencils/CECCellToFaceStencil.H b/src/finiteVolume/fvMesh/extendedStencil/cellToFace/fullStencils/CECCellToFaceStencil.H
index 640c2aa4f47..666c4b1b5d9 100644
--- a/src/finiteVolume/fvMesh/extendedStencil/cellToFace/fullStencils/CECCellToFaceStencil.H
+++ b/src/finiteVolume/fvMesh/extendedStencil/cellToFace/fullStencils/CECCellToFaceStencil.H
@@ -51,15 +51,6 @@ class CECCellToFaceStencil
 :
     public cellToFaceStencil
 {
-    // Private Member Functions
-
-        //- Disallow default bitwise copy construct
-        CECCellToFaceStencil(const CECCellToFaceStencil&);
-
-        //- Disallow default bitwise assignment
-        void operator=(const CECCellToFaceStencil&);
-
-
 public:
 
     // Constructors
diff --git a/src/finiteVolume/fvMesh/extendedStencil/cellToFace/fullStencils/CFCCellToFaceStencil.H b/src/finiteVolume/fvMesh/extendedStencil/cellToFace/fullStencils/CFCCellToFaceStencil.H
index a05b1b7aa6d..6b8dbcaedff 100644
--- a/src/finiteVolume/fvMesh/extendedStencil/cellToFace/fullStencils/CFCCellToFaceStencil.H
+++ b/src/finiteVolume/fvMesh/extendedStencil/cellToFace/fullStencils/CFCCellToFaceStencil.H
@@ -51,14 +51,6 @@ class CFCCellToFaceStencil
 :
     public cellToFaceStencil
 {
-    // Private Member Functions
-
-        //- Disallow default bitwise copy construct
-        CFCCellToFaceStencil(const CFCCellToFaceStencil&);
-
-        //- Disallow default bitwise assignment
-        void operator=(const CFCCellToFaceStencil&);
-
 public:
 
     // Constructors
diff --git a/src/finiteVolume/fvMesh/extendedStencil/cellToFace/fullStencils/CPCCellToFaceStencil.H b/src/finiteVolume/fvMesh/extendedStencil/cellToFace/fullStencils/CPCCellToFaceStencil.H
index a82886e1114..f3e996332de 100644
--- a/src/finiteVolume/fvMesh/extendedStencil/cellToFace/fullStencils/CPCCellToFaceStencil.H
+++ b/src/finiteVolume/fvMesh/extendedStencil/cellToFace/fullStencils/CPCCellToFaceStencil.H
@@ -51,15 +51,6 @@ class CPCCellToFaceStencil
 :
     public cellToFaceStencil
 {
-    // Private Member Functions
-
-        //- Disallow default bitwise copy construct
-        CPCCellToFaceStencil(const CPCCellToFaceStencil&);
-
-        //- Disallow default bitwise assignment
-        void operator=(const CPCCellToFaceStencil&);
-
-
 public:
 
     // Constructors
diff --git a/src/finiteVolume/fvMesh/extendedStencil/cellToFace/fullStencils/FECCellToFaceStencil.H b/src/finiteVolume/fvMesh/extendedStencil/cellToFace/fullStencils/FECCellToFaceStencil.H
index 6a00f702ea9..d08afb8bebc 100644
--- a/src/finiteVolume/fvMesh/extendedStencil/cellToFace/fullStencils/FECCellToFaceStencil.H
+++ b/src/finiteVolume/fvMesh/extendedStencil/cellToFace/fullStencils/FECCellToFaceStencil.H
@@ -65,13 +65,6 @@ class FECCellToFaceStencil
         void calcFaceStencil(labelListList& faceStencil) const;
 
 
-        //- Disallow default bitwise copy construct
-        FECCellToFaceStencil(const FECCellToFaceStencil&);
-
-        //- Disallow default bitwise assignment
-        void operator=(const FECCellToFaceStencil&);
-
-
 public:
 
     // Constructors
diff --git a/src/finiteVolume/fvMesh/extendedStencil/faceToCell/fullStencils/CFCFaceToCellStencil.H b/src/finiteVolume/fvMesh/extendedStencil/faceToCell/fullStencils/CFCFaceToCellStencil.H
index 2bbf9376f43..80086262e16 100644
--- a/src/finiteVolume/fvMesh/extendedStencil/faceToCell/fullStencils/CFCFaceToCellStencil.H
+++ b/src/finiteVolume/fvMesh/extendedStencil/faceToCell/fullStencils/CFCFaceToCellStencil.H
@@ -56,11 +56,6 @@ class CFCFaceToCellStencil
 
         void calcCellStencil(labelListList& globalCellFaces) const;
 
-        //- Disallow default bitwise copy construct
-        CFCFaceToCellStencil(const CFCFaceToCellStencil&);
-
-        //- Disallow default bitwise assignment
-        void operator=(const CFCFaceToCellStencil&);
 
 public:
 
diff --git a/src/finiteVolume/fvMesh/fvBoundaryMesh/fvBoundaryMesh.C b/src/finiteVolume/fvMesh/fvBoundaryMesh/fvBoundaryMesh.C
index c8930e4ab45..2b24d0cd5fc 100644
--- a/src/finiteVolume/fvMesh/fvBoundaryMesh/fvBoundaryMesh.C
+++ b/src/finiteVolume/fvMesh/fvBoundaryMesh/fvBoundaryMesh.C
@@ -48,7 +48,7 @@ void fvBoundaryMesh::addPatches(const polyBoundaryMesh& basicBdry)
     }
 }
 
-    
+
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
 fvBoundaryMesh::fvBoundaryMesh
diff --git a/src/finiteVolume/fvMesh/fvMesh.C b/src/finiteVolume/fvMesh/fvMesh.C
index 55137f1a52b..a605d1c054a 100644
--- a/src/finiteVolume/fvMesh/fvMesh.C
+++ b/src/finiteVolume/fvMesh/fvMesh.C
@@ -354,7 +354,7 @@ Foam::polyMesh::readUpdateState Foam::fvMesh::readUpdate()
     {
         if (debug)
         {
-            Info << "Boundary and topological update" << endl;
+            Info<< "Boundary and topological update" << endl;
         }
 
         boundary_.readUpdate(boundaryMesh());
@@ -366,7 +366,7 @@ Foam::polyMesh::readUpdateState Foam::fvMesh::readUpdate()
     {
         if (debug)
         {
-            Info << "Topological update" << endl;
+            Info<< "Topological update" << endl;
         }
 
         clearOut();
@@ -375,7 +375,7 @@ Foam::polyMesh::readUpdateState Foam::fvMesh::readUpdate()
     {
         if (debug)
         {
-            Info << "Point motion update" << endl;
+            Info<< "Point motion update" << endl;
         }
 
         clearGeom();
@@ -384,7 +384,7 @@ Foam::polyMesh::readUpdateState Foam::fvMesh::readUpdate()
     {
         if (debug)
         {
-            Info << "No update" << endl;
+            Info<< "No update" << endl;
         }
     }
 
diff --git a/src/finiteVolume/fvMesh/fvMeshGeometry.C b/src/finiteVolume/fvMesh/fvMeshGeometry.C
index 7844ebade19..536b21c5655 100644
--- a/src/finiteVolume/fvMesh/fvMeshGeometry.C
+++ b/src/finiteVolume/fvMesh/fvMeshGeometry.C
@@ -94,7 +94,7 @@ void fvMesh::makeMagSf() const
 
     // Note: Added stabilisation for faces with exactly zero area.
     // These should be caught on mesh checking but at least this stops
-    // the code from producing Nans.  
+    // the code from producing Nans.
     magSfPtr_ = new surfaceScalarField
     (
         IOobject
@@ -338,7 +338,7 @@ const surfaceScalarField& fvMesh::phi() const
             << exit(FatalError);
     }
 
-    // Set zero current time 
+    // Set zero current time
     // mesh motion fluxes if the time has been incremented
     if (phiPtr_->timeIndex() != time().timeIndex())
     {
diff --git a/src/finiteVolume/fvMesh/fvMeshMapper/fvSurfaceMapper.C b/src/finiteVolume/fvMesh/fvMeshMapper/fvSurfaceMapper.C
index bfa3eb932de..25081dd8991 100644
--- a/src/finiteVolume/fvMesh/fvMeshMapper/fvSurfaceMapper.C
+++ b/src/finiteVolume/fvMesh/fvMeshMapper/fvSurfaceMapper.C
@@ -89,7 +89,7 @@ void Foam::fvSurfaceMapper::calcAddressing() const
                 scalarListList::subList(faceMap_.weights(), size())
             );
         scalarListList& w = *weightsPtr_;
-        
+
         // Adjust for creation of an internal face from a boundary face
         forAll (addr, faceI)
         {
diff --git a/src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubset.C b/src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubset.C
index 3ecbd0a1972..dc2aec8960d 100644
--- a/src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubset.C
+++ b/src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubset.C
@@ -1341,7 +1341,7 @@ void Foam::fvMeshSubset::setLargeCellSubset
 {
     labelList region(baseMesh().nCells(), 0);
 
-    forAllConstIter (labelHashSet, globalCellMap, iter)
+    forAllConstIter(labelHashSet, globalCellMap, iter)
     {
         region[iter.key()] = 1;
     }
diff --git a/src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubset.H b/src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubset.H
index 9ad70db6473..14fa7b384d6 100644
--- a/src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubset.H
+++ b/src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubset.H
@@ -190,10 +190,10 @@ private:
         bool checkCellSubset() const;
 
         //- Mark points in Map
-        static void markPoints(const labelList&, Map<label>&); 
+        static void markPoints(const labelList&, Map<label>&);
 
         //- Mark points (with 0) in labelList
-        static void markPoints(const labelList&, labelList&); 
+        static void markPoints(const labelList&, labelList&);
 
         //- Adapt nCellsUsingFace for coupled faces becoming 'uncoupled'.
         void doCoupledPatches
diff --git a/src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubsetInterpolate.C b/src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubsetInterpolate.C
index f95b7a9dfef..859c296cac6 100644
--- a/src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubsetInterpolate.C
+++ b/src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubsetInterpolate.C
@@ -56,7 +56,7 @@ tmp<GeometricField<Type, fvPatchField, volMesh> > fvMeshSubset::interpolate
     {
         // Set the first one by hand as it corresponds to the
         // exposed internal faces.  Additional interpolation can be put here
-        // as necessary.  
+        // as necessary.
         if (patchMap[patchI] == -1)
         {
             patchFields.set
@@ -180,7 +180,7 @@ tmp<GeometricField<Type, fvsPatchField, surfaceMesh> > fvMeshSubset::interpolate
     {
         // Set the first one by hand as it corresponds to the
         // exposed internal faces.  Additional interpolation can be put here
-        // as necessary.  
+        // as necessary.
         if (patchMap[patchI] == -1)
         {
             patchFields.set
@@ -313,7 +313,7 @@ fvMeshSubset::interpolate
     {
         // Set the first one by hand as it corresponds to the
         // exposed internal faces.  Additional interpolation can be put here
-        // as necessary.  
+        // as necessary.
         if (patchMap[patchI] == -1)
         {
             patchFields.set
diff --git a/src/finiteVolume/fvMesh/fvPatches/constraint/processor/processorFvPatch.C b/src/finiteVolume/fvMesh/fvPatches/constraint/processor/processorFvPatch.C
index b9f11d54e97..237e99a61f2 100644
--- a/src/finiteVolume/fvMesh/fvPatches/constraint/processor/processorFvPatch.C
+++ b/src/finiteVolume/fvMesh/fvPatches/constraint/processor/processorFvPatch.C
@@ -27,7 +27,6 @@ License
 #include "processorFvPatch.H"
 #include "addToRunTimeSelectionTable.H"
 #include "transformField.H"
-#include "polyBoundaryMesh.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -46,29 +45,16 @@ void processorFvPatch::makeWeights(scalarField& w) const
 {
     if (Pstream::parRun())
     {
-        const processorPolyPatch& pp = procPolyPatch();
-
-//Pout<< name() << " pp.neighbFaceAreas():" << pp.neighbFaceAreas()
-//    << endl;
-//
-//Pout<< name() << " pp.neighbFaceCentres():" << pp.neighbFaceCentres()
-//    << endl;
-//
-//Pout<< name() << " pp.neighbFaceCellCentres():" << pp.neighbFaceCellCentres()
-//    << endl;
-
-
         // The face normals point in the opposite direction on the other side
         scalarField neighbFaceCentresCn
         (
             (
-                pp.neighbFaceAreas()
-               /(mag(pp.neighbFaceAreas()) + VSMALL)
+                procPolyPatch_.neighbFaceAreas()
+               /(mag(procPolyPatch_.neighbFaceAreas()) + VSMALL)
             )
           & (
-              pp.neighbFaceCentres()
-            - pp.neighbFaceCellCentres()
-            )
+              procPolyPatch_.neighbFaceCentres()
+            - procPolyPatch_.neighbFaceCellCentres())
         );
 
         w = neighbFaceCentresCn/((nf()&fvPatch::delta()) + neighbFaceCentresCn);
@@ -77,22 +63,11 @@ void processorFvPatch::makeWeights(scalarField& w) const
     {
         w = 1.0;
     }
-//Pout<< name() << " w:" << w
-//    << endl;
 }
 
 
 void processorFvPatch::makeDeltaCoeffs(scalarField& dc) const
 {
-//Pout<< name() << " fvPatch::delta():" << fvPatch::delta()
-//    << endl;
-//
-//Pout<< name() << " nf():" << nf()
-//    << endl;
-//
-//Pout<< name() << " weights():" << weights()
-//    << endl;
-
     if (Pstream::parRun())
     {
         dc = (1.0 - weights())/(nf() & fvPatch::delta());
@@ -101,71 +76,41 @@ void processorFvPatch::makeDeltaCoeffs(scalarField& dc) const
     {
         dc = 1.0/(nf() & fvPatch::delta());
     }
-//Pout<< name() << " dc:" << dc << endl;
 }
 
 
 tmp<vectorField> processorFvPatch::delta() const
 {
-    tmp<vectorField> deltaFld(fvPatch::delta());
-
     if (Pstream::parRun())
     {
-        // Do the transformation if necessary.
-
-        const processorPolyPatch& pp = procPolyPatch();
-
-        const pointField& nfc = pp.neighbFaceCentres();
-        const pointField& ncc = pp.neighbFaceCellCentres();
-
-        forAll(pp.patchIDs(), i)
+        // To the transformation if necessary
+        if (parallel())
         {
-            const SubField<point> subFc(pp.subSlice(nfc, i));
-            const SubField<point> subCc(pp.subSlice(ncc, i));
-            SubField<vector> subDelta(pp.subSlice(deltaFld(), i));
-            const vectorField& subFld = static_cast<const vectorField&>
-            (
-                subDelta
-            );
-
-            label patchI = pp.patchIDs()[i];
-
-//Pout<< name() << " delta:" << " subFc:" << subFc
-//    << " subCc:" << subCc << " subDelta:" << subDelta
-//    << endl;
-
-            if (patchI == -1)
-            {
-                const_cast<vectorField&>(subFld) -= (subFc - subCc);
-            }
-            else
-            {
-                const coupledPolyPatch& subPatch =
-                    refCast<const coupledPolyPatch>
-                    (
-                        pp.boundaryMesh()[patchI]
-                    );
-
-                if (subPatch.parallel())
-                {
-                    const_cast<vectorField&>(subFld) -= (subFc - subCc);
-                }
-                else
-                {
-                    const_cast<vectorField&>(subFld) -= transform
+            return
+                fvPatch::delta()
+              - (
+                    procPolyPatch_.neighbFaceCentres()
+                  - procPolyPatch_.neighbFaceCellCentres()
+                );
+        }
+        else
+        {
+            return
+                fvPatch::delta()
+              - transform
+                (
+                    forwardT(),
                     (
-                        subPatch.forwardT(),
-                        subFc - subCc
-                    );
-                }
-            }
-//Pout<< name() << " subDelta:" << subDelta
-//    << endl;
-
+                        procPolyPatch_.neighbFaceCentres()
+                      - procPolyPatch_.neighbFaceCellCentres()
+                    )
+                );
         }
     }
-
-    return deltaFld;
+    else
+    {
+        return fvPatch::delta();
+    }
 }
 
 
@@ -178,24 +123,24 @@ tmp<labelField> processorFvPatch::interfaceInternalField
 }
 
 
-//void processorFvPatch::initTransfer
-//(
-//    const Pstream::commsTypes commsType,
-//    const unallocLabelList& interfaceData
-//) const
-//{
-//    send(commsType, interfaceData);
-//}
-//
-//
-//tmp<labelField> processorFvPatch::transfer
-//(
-//    const Pstream::commsTypes commsType,
-//    const unallocLabelList&
-//) const
-//{
-//    return receive<label>(commsType, this->size());
-//}
+void processorFvPatch::initTransfer
+(
+    const Pstream::commsTypes commsType,
+    const unallocLabelList& interfaceData
+) const
+{
+    send(commsType, interfaceData);
+}
+
+
+tmp<labelField> processorFvPatch::transfer
+(
+    const Pstream::commsTypes commsType,
+    const unallocLabelList&
+) const
+{
+    return receive<label>(commsType, this->size());
+}
 
 
 void processorFvPatch::initInternalFieldTransfer
diff --git a/src/finiteVolume/fvMesh/fvPatches/constraint/processor/processorFvPatch.H b/src/finiteVolume/fvMesh/fvPatches/constraint/processor/processorFvPatch.H
index fab90a9ed2a..b1d176b8dd9 100644
--- a/src/finiteVolume/fvMesh/fvPatches/constraint/processor/processorFvPatch.H
+++ b/src/finiteVolume/fvMesh/fvPatches/constraint/processor/processorFvPatch.H
@@ -118,40 +118,36 @@ public:
             return procPolyPatch_;
         }
 
-        //- Are the planes separated.
-        virtual bool separated() const
-        {
-            notImplemented("processorFvPatch::separated() const");
-            return false;
-        }
-
-        //- If the planes are separated the separation vector.
-        virtual const vector& separation() const
-        {
-            notImplemented("processorFvPatch::separation() const");
-            return vector::zero;
-        }
-
+//         //- Are the planes separated.
+//         virtual bool separated() const
+//         {
+//             return procPolyPatch_.separated();
+//         }
+// 
+//         //- If the planes are separated the separation vector.
+//         virtual const vector& separation() const
+//         {
+//             return procPolyPatch_.separation();
+//         }
+// 
         //- Are the cyclic planes parallel
         virtual bool parallel() const
         {
-            notImplemented("processorFvPatch::separated() const");
-            return false;
+            return procPolyPatch_.parallel();
         }
 
         //- Return face transformation tensor
         virtual const tensor& forwardT() const
         {
-            notImplemented("processorFvPatch::forwardT() const");
-            return tensor::zero;
+            return procPolyPatch_.forwardT();
         }
 
-        //- Return neighbour-cell transformation tensor
-        virtual const tensor& reverseT() const
-        {
-            notImplemented("processorFvPatch::reverseT() const");
-            return tensor::zero;
-        }
+//         //- Return neighbour-cell transformation tensor
+//         virtual const tensor& reverseT() const
+//         {
+//             notImplemented("processorFvPatch::reverseT() const");
+//             return tensor::zero;
+//         }
 
 
         //- Return delta (P to N) vectors across coupled patch
@@ -172,21 +168,14 @@ public:
             (
                 const Pstream::commsTypes commsType,
                 const unallocLabelList& interfaceData
-            ) const
-            {
-                notImplemented("processorFvPatch::initTransfer() const");
-            }
+            ) const;
 
             //- Transfer and return neighbour field
             virtual tmp<labelField> transfer
             (
                 const Pstream::commsTypes commsType,
                 const unallocLabelList& interfaceData
-            ) const
-            {
-                notImplemented("processorFvPatch::initTransfer() const");
-                return tmp<labelField>(new labelField());
-            }
+            ) const;
 
             //- Initialise neighbour field transfer
             virtual void initInternalFieldTransfer
diff --git a/src/finiteVolume/fvMesh/fvPatches/constraint/symmetry/symmetryFvPatch.C b/src/finiteVolume/fvMesh/fvPatches/constraint/symmetry/symmetryFvPatch.C
index e802fe5264c..285e71af0ec 100644
--- a/src/finiteVolume/fvMesh/fvPatches/constraint/symmetry/symmetryFvPatch.C
+++ b/src/finiteVolume/fvMesh/fvPatches/constraint/symmetry/symmetryFvPatch.C
@@ -22,8 +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
-
 \*---------------------------------------------------------------------------*/
 
 #include "symmetryFvPatch.H"
diff --git a/src/finiteVolume/fvMesh/fvPatches/constraint/wedge/wedgeFvPatch.C b/src/finiteVolume/fvMesh/fvPatches/constraint/wedge/wedgeFvPatch.C
index d336e194c98..eec22483e2a 100644
--- a/src/finiteVolume/fvMesh/fvPatches/constraint/wedge/wedgeFvPatch.C
+++ b/src/finiteVolume/fvMesh/fvPatches/constraint/wedge/wedgeFvPatch.C
@@ -22,8 +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
-
 \*---------------------------------------------------------------------------*/
 
 #include "wedgeFvPatch.H"
diff --git a/src/finiteVolume/fvMesh/fvPatches/derived/wall/wallFvPatch.C b/src/finiteVolume/fvMesh/fvPatches/derived/wall/wallFvPatch.C
index e8ba3528a42..94dc7ab15b0 100644
--- a/src/finiteVolume/fvMesh/fvPatches/derived/wall/wallFvPatch.C
+++ b/src/finiteVolume/fvMesh/fvPatches/derived/wall/wallFvPatch.C
@@ -22,8 +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
-
 \*---------------------------------------------------------------------------*/
 
 #include "wallFvPatch.H"
diff --git a/src/finiteVolume/fvMesh/fvPatches/fvPatch/fvPatch.H b/src/finiteVolume/fvMesh/fvPatches/fvPatch/fvPatch.H
index 3060f215792..8a69c015591 100644
--- a/src/finiteVolume/fvMesh/fvPatches/fvPatch/fvPatch.H
+++ b/src/finiteVolume/fvMesh/fvPatches/fvPatch/fvPatch.H
@@ -243,7 +243,7 @@ public:
 
             //- Lookup and return the patchField of the named field from the
             //  local objectRegistry.
-            //  N.B.  The dummy pointer arguments are used if this function is 
+            //  N.B.  The dummy pointer arguments are used if this function is
             //  instantiated within a templated function to avoid a bug in gcc.
             //  See inletOutletFvPatchField.C and outletInletFvPatchField.C
             template<class GeometricField, class Type>
diff --git a/src/finiteVolume/fvMesh/singleCellFvMesh/singleCellFvMesh.C b/src/finiteVolume/fvMesh/singleCellFvMesh/singleCellFvMesh.C
index 7e38d098316..c0185600ba3 100644
--- a/src/finiteVolume/fvMesh/singleCellFvMesh/singleCellFvMesh.C
+++ b/src/finiteVolume/fvMesh/singleCellFvMesh/singleCellFvMesh.C
@@ -82,7 +82,7 @@ void Foam::singleCellFvMesh::agglomerateMesh
                 }
             }
         }
-        syncTools::swapBoundaryFaceList(mesh, nbrAgglom, false);
+        syncTools::swapBoundaryFaceList(mesh, nbrAgglom);
 
 
         // Get correspondence between this agglomeration and remote one
@@ -211,7 +211,7 @@ void Foam::singleCellFvMesh::agglomerateMesh
                         )   << "agglomeration does not create a"
                             << " single, non-manifold"
                             << " face for agglomeration " << coarseI
-                            << exit(FatalError);   
+                            << exit(FatalError);
                     }
 
                     patchFaces[coarseI++] = face
diff --git a/src/lagrangian/basic/Particle/Particle.C b/src/lagrangian/basic/Particle/Particle.C
index 6880db5f758..8cc570bb7c3 100644
--- a/src/lagrangian/basic/Particle/Particle.C
+++ b/src/lagrangian/basic/Particle/Particle.C
@@ -114,27 +114,19 @@ void Foam::Particle<ParticleType>::correctAfterParallelTransfer
 
     celli_ = ppp.faceCells()[facei_];
 
-    label subPatchI = ppp.whichSubPatch(facei_);
-
-    if (subPatchI != -1)
+    if (!ppp.parallel())
     {
-        const coupledPolyPatch& cpp =
-            refCast<const coupledPolyPatch>
-            (cloud_.pMesh().boundaryMesh()[subPatchI]);
-
-        // We are on receiving end.
-        if (!cpp.parallel())
-        {
-            const tensor& T = cpp.forwardT();
-            transformPosition(T);
-            static_cast<ParticleType&>(*this).transformProperties(T);
-        }
-        else if (cpp.separated())
-        {
-            const vector d = -cpp.separation();
-            position_ += d;
-            static_cast<ParticleType&>(*this).transformProperties(d);
-        }
+        const tensor& T = ppp.forwardT();
+        transformPosition(T);
+        static_cast<ParticleType&>(*this).transformProperties(T);
+    }
+    else if (ppp.separated())
+    {
+        position_ -= ppp.separation();
+        static_cast<ParticleType&>(*this).transformProperties
+        (
+            -ppp.separation()
+        );
     }
 
     // Reset the face index for the next tracking operation
@@ -196,7 +188,7 @@ Foam::label Foam::Particle<ParticleType>::track
     facei_ = -1;
 
     // Tracks to endPosition or stop on boundary
-    while(!onBoundary() && stepFraction_ < 1.0 - SMALL)
+    while (!onBoundary() && stepFraction_ < 1.0 - SMALL)
     {
         stepFraction_ += trackToFace(endPosition, td)*(1.0 - stepFraction_);
     }
@@ -205,6 +197,7 @@ Foam::label Foam::Particle<ParticleType>::track
 }
 
 
+
 template<class ParticleType>
 Foam::label Foam::Particle<ParticleType>::track(const vector& endPosition)
 {
@@ -212,7 +205,6 @@ Foam::label Foam::Particle<ParticleType>::track(const vector& endPosition)
     return track(endPosition, dummyTd);
 }
 
-
 template<class ParticleType>
 template<class TrackData>
 Foam::scalar Foam::Particle<ParticleType>::trackToFace
@@ -463,7 +455,7 @@ void Foam::Particle<ParticleType>::hitCyclicPatch
     TrackData&
 )
 {
-    // Transform (still on sending side)
+//    label patchFacei_ = cpp.whichFace(facei_);
 
     facei_ = cpp.transformGlobalFace(facei_);
 
diff --git a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.C b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.C
index cc8d16f1d09..7b464fcedd6 100644
--- a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.C
+++ b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.C
@@ -1142,8 +1142,7 @@ Foam::autoPtr<Foam::mapDistributePolyMesh> Foam::meshRefinement::balance
                 (
                     mesh_,
                     blockedFace,
-                    andEqOp<bool>(),    // combine operator
-                    false               // separation
+                    andEqOp<bool>()     // combine operator
                 );
             }
             reduce(nUnblocked, sumOp<label>());
diff --git a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C
index acb0c69290d..62f1a68b209 100644
--- a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C
+++ b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C
@@ -80,8 +80,7 @@ Foam::label Foam::meshRefinement::createBaffle
             ownPatch,                   // patch for face
             false,                      // remove from zone
             zoneID,                     // zone for face
-            zoneFlip,                   // face flip in zone
-            -1                          // sub patch
+            zoneFlip                    // face flip in zone
         )
     );
 
@@ -120,8 +119,7 @@ Foam::label Foam::meshRefinement::createBaffle
                 true,                       // face flip
                 neiPatch,                   // patch for face
                 zoneID,                     // zone for face
-                reverseFlip,                // face flip in zone
-                -1                          // sub patch
+                reverseFlip                 // face flip in zone
             )
         );
     }
@@ -786,8 +784,7 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::mergeBaffles
                     -1,                     // patch for face
                     false,                  // remove from zone
                     zoneID,                 // zone for face
-                    zoneFlip,               // face flip in zone
-                    -1                      // sub patch
+                    zoneFlip                // face flip in zone
                 )
             );
         }
@@ -816,8 +813,7 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::mergeBaffles
                     -1,                     // patch for face
                     false,                  // remove from zone
                     zoneID,                 // zone for face
-                    zoneFlip,               // face flip in zone
-                    -1                      // sub patch
+                    zoneFlip                // face flip in zone
                 )
             );
         }
@@ -2382,8 +2378,7 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::zonify
                     -1,                             // patch for face
                     false,                          // remove from zone
                     surfaceToFaceZone[surfI],       // zone for face
-                    flip,                           // face flip in zone
-                    -1                              // sub patch
+                    flip                            // face flip in zone
                 )
             );
         }
@@ -2461,8 +2456,7 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::zonify
                         patchI,                         // patch for face
                         false,                          // remove from zone
                         surfaceToFaceZone[surfI],       // zone for face
-                        flip,                           // face flip in zone
-                        polyTopoChange::whichSubPatch(pp, faceI)    // sub patch
+                        flip                            // face flip in zone
                     )
                 );
             }
diff --git a/src/mesh/blockMesh/Make/files b/src/mesh/blockMesh/Make/files
index cc7a1c1bb5f..cda173e1f6f 100644
--- a/src/mesh/blockMesh/Make/files
+++ b/src/mesh/blockMesh/Make/files
@@ -1,13 +1,13 @@
+curvedEdges/BSpline.C
+curvedEdges/CatmullRomSpline.C
+curvedEdges/polyLine.C
+
+curvedEdges/arcEdge.C
 curvedEdges/curvedEdge.C
 curvedEdges/lineEdge.C
-curvedEdges/polyLine.C
 curvedEdges/polyLineEdge.C
-curvedEdges/arcEdge.C
-curvedEdges/spline.C
-curvedEdges/BSpline.C
-curvedEdges/simpleSplineEdge.C
-curvedEdges/polySplineEdge.C
 curvedEdges/lineDivide.C
+curvedEdges/splineEdge.C
 
 blockDescriptor/blockDescriptor.C
 blockDescriptor/blockDescriptorEdges.C
diff --git a/src/mesh/blockMesh/blockDescriptor/blockDescriptor.C b/src/mesh/blockMesh/blockDescriptor/blockDescriptor.C
index 599a108c3cb..335fc824b85 100644
--- a/src/mesh/blockMesh/blockDescriptor/blockDescriptor.C
+++ b/src/mesh/blockMesh/blockDescriptor/blockDescriptor.C
@@ -89,7 +89,7 @@ Foam::blockDescriptor::blockDescriptor
     {
         zoneName_ = t.wordToken();
 
-        // Get the next token
+        // Examine next token
         is >> t;
     }
     is.putBack(t);
@@ -129,7 +129,12 @@ Foam::blockDescriptor::blockDescriptor
 
     scalarList expRatios(is);
 
-    if (expRatios.size() == 3)
+    if (expRatios.size() == 1)
+    {
+        // identical in x/y/z-directions
+        expand_ = expRatios[0];
+    }
+    else if (expRatios.size() == 3)
     {
         // x-direction
         expand_[0]  = expRatios[0];
diff --git a/src/mesh/blockMesh/blockDescriptor/blockDescriptorEdges.C b/src/mesh/blockMesh/blockDescriptor/blockDescriptorEdges.C
index 5fcf31f4218..afc8fcd078b 100644
--- a/src/mesh/blockMesh/blockDescriptor/blockDescriptorEdges.C
+++ b/src/mesh/blockMesh/blockDescriptor/blockDescriptorEdges.C
@@ -120,8 +120,8 @@ void Foam::blockDescriptor::setEdge
                 // divide the line
                 lineDivide divEdge(cedge, dim, 1.0/(gExp+SMALL));
 
-                pointField p = divEdge.points();
-                scalarList d = divEdge.lambdaDivisions();
+                const pointField& p = divEdge.points();
+                const scalarList& d = divEdge.lambdaDivisions();
 
                 edgePoints_[edgeI].setSize(p.size());
                 edgeWeights_[edgeI].setSize(d.size());
diff --git a/src/mesh/blockMesh/blockMesh/blockMesh.H b/src/mesh/blockMesh/blockMesh/blockMesh.H
index 5148bbd5655..88fac52b345 100644
--- a/src/mesh/blockMesh/blockMesh/blockMesh.H
+++ b/src/mesh/blockMesh/blockMesh/blockMesh.H
@@ -113,7 +113,6 @@ class blockMesh
         bool readPatches
         (
             const dictionary& meshDescription,
-            const pointField& tmpBlockPoints,
             faceListList& tmpBlocksPatches,
             wordList& patchNames,
             wordList& patchTypes,
@@ -123,16 +122,11 @@ class blockMesh
         bool readBoundary
         (
             const dictionary& meshDescription,
-            const pointField& tmpBlockPoints,
             faceListList& tmpBlocksPatches,
             PtrList<dictionary>& patchDicts
         );
 
-        void createCellShapes
-        (
-            const pointField& tmpBlockPoints,
-            PtrList<cellShape>& tmpBlockCells
-        );
+        void createCellShapes(cellShapeList& tmpBlockCells);
 
         polyMesh* createTopology(IOdictionary&);
         void checkBlockMesh(const polyMesh&) const;
diff --git a/src/mesh/blockMesh/blockMesh/blockMeshTopology.C b/src/mesh/blockMesh/blockMesh/blockMeshTopology.C
index 6a5754d3979..78d479a780c 100644
--- a/src/mesh/blockMesh/blockMesh/blockMeshTopology.C
+++ b/src/mesh/blockMesh/blockMesh/blockMeshTopology.C
@@ -34,7 +34,6 @@ License
 bool Foam::blockMesh::readPatches
 (
     const dictionary& meshDescription,
-    const pointField& tmpBlockPoints,
     faceListList& tmpBlocksPatches,
     wordList& patchNames,
     wordList& patchTypes,
@@ -128,7 +127,7 @@ bool Foam::blockMesh::readPatches
         topologyOK = topologyOK && patchLabelsOK
         (
             nPatches,
-            tmpBlockPoints,
+            blockPointField_,
             tmpBlocksPatches[nPatches]
         );
 
@@ -206,7 +205,6 @@ bool Foam::blockMesh::readPatches
 bool Foam::blockMesh::readBoundary
 (
     const dictionary& meshDescription,
-    const pointField& tmpBlockPoints,
     faceListList& tmpBlocksPatches,
     PtrList<dictionary>& patchDicts
 )
@@ -235,7 +233,7 @@ bool Foam::blockMesh::readBoundary
         topologyOK = topologyOK && patchLabelsOK
         (
             patchI,
-            tmpBlockPoints,
+            blockPointField_,
             tmpBlocksPatches[patchI]
         );
     }
@@ -246,27 +244,22 @@ bool Foam::blockMesh::readBoundary
 
 void Foam::blockMesh::createCellShapes
 (
-    const pointField& tmpBlockPoints,
-    PtrList<cellShape>& tmpBlockCells
+    cellShapeList& tmpBlockCells
 )
 {
     const blockMesh& blocks = *this;
 
     tmpBlockCells.setSize(blocks.size());
-    forAll(blocks, blockLabel)
+    forAll(blocks, blockI)
     {
-        tmpBlockCells.set
-        (
-            blockLabel,
-            new cellShape(blocks[blockLabel].blockDef().blockShape())
-        );
+        tmpBlockCells[blockI] = cellShape(blocks[blockI].blockShape());
 
-        if (tmpBlockCells[blockLabel].mag(tmpBlockPoints) < 0.0)
+        if (tmpBlockCells[blockI].mag(blockPointField_) < 0.0)
         {
             WarningIn
             (
                 "blockMesh::createTopology(IOdictionary&)"
-            )   << "negative volume block : " << blockLabel
+            )   << "negative volume block : " << blockI
                 << ", probably defined inside-out" << endl;
         }
     }
@@ -275,7 +268,7 @@ void Foam::blockMesh::createCellShapes
 
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
-Foam::polyMesh* Foam::blockMesh::createTopology(IOdictionary& dict)
+Foam::polyMesh* Foam::blockMesh::createTopology(IOdictionary& meshDescription)
 {
     bool topologyOK = true;
 
@@ -287,30 +280,30 @@ Foam::polyMesh* Foam::blockMesh::createTopology(IOdictionary& dict)
     // get names/types for the unassigned patch faces
     // this is a bit heavy handed (and ugly), but there is currently
     // no easy way to rename polyMesh patches subsequently
-    if (const dictionary* dictPtr = dict.subDictPtr("defaultPatch"))
+    if (const dictionary* dictPtr = meshDescription.subDictPtr("defaultPatch"))
     {
         dictPtr->readIfPresent("name", defaultPatchName);
         dictPtr->readIfPresent("type", defaultPatchType);
     }
 
     // optional 'convertToMeters' or 'scale'  scaling factor
-    if (!dict.readIfPresent("convertToMeters", scaleFactor_))
+    if (!meshDescription.readIfPresent("convertToMeters", scaleFactor_))
     {
-        dict.readIfPresent("scale", scaleFactor_);
+        meshDescription.readIfPresent("scale", scaleFactor_);
     }
 
 
     //
     // get the non-linear edges in mesh
     //
-    if (dict.found("edges"))
+    if (meshDescription.found("edges"))
     {
         if (verboseOutput)
         {
             Info<< "Creating curved edges" << endl;
         }
 
-        ITstream& is(dict.lookup("edges"));
+        ITstream& is(meshDescription.lookup("edges"));
 
         // read number of edges in mesh
         label nEdges = 0;
@@ -378,7 +371,7 @@ Foam::polyMesh* Foam::blockMesh::createTopology(IOdictionary& dict)
     }
 
     {
-        ITstream& is(dict.lookup("blocks"));
+        ITstream& is(meshDescription.lookup("blocks"));
 
         // read number of blocks in mesh
         label nBlocks = 0;
@@ -467,7 +460,6 @@ Foam::polyMesh* Foam::blockMesh::createTopology(IOdictionary& dict)
         topologyOK = topologyOK && readPatches
         (
             meshDescription,
-            tmpBlockPoints,
             tmpBlocksPatches,
             patchNames,
             patchTypes,
@@ -483,8 +475,8 @@ Foam::polyMesh* Foam::blockMesh::createTopology(IOdictionary& dict)
 
         Info<< nl << "Creating block mesh topology" << endl;
 
-        PtrList<cellShape> tmpBlockCells(blocks.size());
-        createCellShapes(tmpBlockPoints, tmpBlockCells);
+        cellShapeList tmpBlockCells(blocks.size());
+        createCellShapes(tmpBlockCells);
 
 
         Info<< nl << "Reading physicalType from existing boundary file" << endl;
@@ -514,7 +506,7 @@ Foam::polyMesh* Foam::blockMesh::createTopology(IOdictionary& dict)
                 IOobject::NO_WRITE,
                 false
             ),
-            xferMove(tmpBlockPoints),
+            xferCopy(blockPointField_),   // copy these points, do NOT move
             tmpBlockCells,
             tmpBlocksPatches,
             patchNames,
@@ -532,7 +524,6 @@ Foam::polyMesh* Foam::blockMesh::createTopology(IOdictionary& dict)
         topologyOK = topologyOK && readBoundary
         (
             meshDescription,
-            tmpBlockPoints,
             tmpBlocksPatches,
             patchDicts
         );
@@ -547,8 +538,8 @@ Foam::polyMesh* Foam::blockMesh::createTopology(IOdictionary& dict)
 
         Info<< nl << "Creating block mesh topology" << endl;
 
-        PtrList<cellShape> tmpBlockCells(blocks.size());
-        createCellShapes(tmpBlockPoints, tmpBlockCells);
+        cellShapeList tmpBlockCells(blocks.size());
+        createCellShapes(tmpBlockCells);
 
 
         blockMeshPtr = new polyMesh
@@ -562,7 +553,7 @@ Foam::polyMesh* Foam::blockMesh::createTopology(IOdictionary& dict)
                 IOobject::NO_WRITE,
                 false
             ),
-            xferMove(tmpBlockPoints),
+            xferCopy(blockPointField_),   // copy these points, do NOT move
             tmpBlockCells,
             tmpBlocksPatches,
             patchDicts,
diff --git a/src/mesh/blockMesh/curvedEdges/BSpline.C b/src/mesh/blockMesh/curvedEdges/BSpline.C
index 3e166f25cb9..811101c1543 100644
--- a/src/mesh/blockMesh/curvedEdges/BSpline.C
+++ b/src/mesh/blockMesh/curvedEdges/BSpline.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 1991-2009 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2009-2009 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -25,105 +25,109 @@ License
 \*---------------------------------------------------------------------------*/
 
 #include "error.H"
-
 #include "BSpline.H"
-#include "simpleMatrix.H"
 
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
-Foam::pointField Foam::BSpline::findKnots
+Foam::BSpline::BSpline
 (
-    const pointField& allknots,
-    const vector& fstend,
-    const vector& sndend
+    const pointField& knots,
+    const bool closed
 )
-{
-    const label NKnots = allknots.size();
+:
+    polyLine(knots, closed)
+{}
+
 
-    // set up 1/6 and 2/3 which are the matrix elements throughout most
-    // of the matrix
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-    register const scalar oneSixth = 1.0/6.0;
-    register const scalar twoThird = 2.0/3.0;
+Foam::point Foam::BSpline::position(const scalar mu) const
+{
+    // endpoints
+    if (mu < SMALL)
+    {
+        return points().first();
+    }
+    else if (mu > 1 - SMALL)
+    {
+        return points().last();
+    }
 
-    simpleMatrix<vector> M(NKnots+2, 0, vector::zero);
+    scalar lambda = mu;
+    label segment = localParameter(lambda);
+    return position(segment, lambda);
+}
 
-    // set up the matrix
-    M[0][0] = -0.5*scalar(NKnots - 1);
-    M[0][2] =  0.5*scalar(NKnots - 1);
 
-    for (register label i = 1; i <= NKnots; i++)
+Foam::point Foam::BSpline::position
+(
+    const label segment,
+    const scalar mu
+) const
+{
+    // out-of-bounds
+    if (segment < 0)
+    {
+        return points().first();
+    }
+    else if (segment > nSegments())
     {
-        M[i][i-1] = oneSixth;
-        M[i][i] = twoThird;
-        M[i][i+1] = oneSixth;
+        return points().last();
     }
 
-    M[NKnots+1][NKnots-1] = -0.5*scalar(NKnots - 1);
-    M[NKnots+1][NKnots+1] =  0.5*scalar(NKnots - 1);
+    const point& p0 = points()[segment];
+    const point& p1 = points()[segment+1];
 
-    // set up the vector
-    for (register label i = 1; i <= NKnots; i++)
+    // special cases - no calculation needed
+    if (mu <= 0.0)
+    {
+        return p0;
+    }
+    else if (mu >= 1.0)
     {
-        M.source()[i] = allknots[i-1];
+        return p1;
     }
 
-    // set the gradients at the ends:
 
-    if (mag(fstend) < 1e-8)
+    // determine the end points
+    point e0;
+    point e1;
+
+    if (segment == 0)
     {
-        // default : forward differences on the end knots
-        M.source()[0] = allknots[1] - allknots[0];
-        M.source()[0] /= mag(M.source()[0]);
+        // end: simple reflection
+        e0 = 2*p0 - p1;
     }
     else
     {
-        // use the gradient vector provided
-        M.source()[0] = fstend/mag(fstend);
+        e0 = points()[segment-1];
     }
 
-    if (mag(sndend)<1e-8)
+    if (segment+1 == nSegments())
     {
-        // default : forward differences on the end knots
-        M.source()[NKnots+1] = M.source()[NKnots-1] - M.source()[NKnots];
-        M.source()[NKnots+1] /= mag(M.source()[NKnots+1]);
+        // end: simple reflection
+        e1 = 2*p1 - p0;
     }
     else
     {
-        // use the gradient vector provided
-        M.source()[NKnots+1] = sndend/mag(sndend);
+        e1 = points()[segment+2];
     }
 
 
-    // invert the equation to find the control knots
-    return M.solve();
-}
-
-
-// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
-
-Foam::BSpline::BSpline
-(
-    const pointField& Knots,
-    const vector& fstend,
-    const vector& sndend
-)
-:
-    spline(findKnots(Knots, fstend, sndend))
-{}
-
-
-// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
-
-Foam::vector Foam::BSpline::realPosition(const scalar mu) const
-{
-    return spline::position(mu);
-}
-
-
-Foam::vector Foam::BSpline::position(const scalar mu) const
-{
-    return spline::position((1.0/(nKnots() - 1))*(1.0 + mu*(nKnots() - 3)));
+    return 1.0/6.0 *
+    (
+        ( e0 + 4*p0 + p1 )
+      + mu *
+        (
+            ( -3*e0 + 3*p1 )
+          + mu *
+            (
+                ( 3*e0 - 6*p0 + 3*p1 )
+              + mu *
+                ( -e0 + 3*p0 - 3*p1 + e1 )
+            )
+        )
+    );
 }
 
 
diff --git a/src/mesh/blockMesh/curvedEdges/BSpline.H b/src/mesh/blockMesh/curvedEdges/BSpline.H
index ace98b4e210..b26c6887049 100644
--- a/src/mesh/blockMesh/curvedEdges/BSpline.H
+++ b/src/mesh/blockMesh/curvedEdges/BSpline.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 1991-2009 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2009-2009 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -26,7 +26,33 @@ Class
     Foam::BSpline
 
 Description
-    A cubic spline going through all the knots
+    An implementation of B-splines.
+
+    In this implementation, the end tangents are created automatically
+    by reflection.
+
+    In matrix form, the @e local interpolation on the interval t=[0..1] is
+    described as follows:
+    @verbatim
+    P(t) = 1/6 * [ t^3 t^2 t 1 ] * [ -1  3 -3  1 ] * [ P-1 ]
+                                   [  3 -6  3  0 ]   [ P0 ]
+                                   [ -3  0  3  0 ]   [ P1 ]
+                                   [  1  4  1  0 ]   [ P2 ]
+    @endverbatim
+
+    Where P-1 and P2 represent the neighbouring points or the extrapolated
+    end points. Simple reflection is used to automatically create the end
+    points.
+
+    The spline is discretized based on the chord length of the individual
+    segments. In rare cases (sections with very high curvatures), the
+    resulting distribution may be sub-optimal.
+
+SeeAlso
+    CatmullRomSpline
+
+ToDo
+    A future implementation could also handle closed splines.
 
 SourceFiles
     BSpline.C
@@ -36,7 +62,7 @@ SourceFiles
 #ifndef BSpline_H
 #define BSpline_H
 
-#include "spline.H"
+#include "polyLine.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -49,17 +75,10 @@ namespace Foam
 
 class BSpline
 :
-    public spline
+    public polyLine
 {
     // Private Member Functions
 
-        pointField findKnots
-        (
-            const pointField&,
-            const vector& fstend,
-            const vector& sndend
-        );
-
         //- Disallow default bitwise copy construct
         BSpline(const BSpline&);
 
@@ -75,20 +94,19 @@ public:
         BSpline
         (
             const pointField& knots,
-            const vector& fstend = vector::zero,
-            const vector& sndend = vector::zero
+            const bool notImplementedClosed = false
         );
 
 
     // Member Functions
 
-        //- Return the real position of a point on the curve given by
-        //  the parameter 0 <= lambda <= 1
-        vector realPosition(const scalar lambda) const;
+        //- Return the point position corresponding to the curve parameter
+        //  0 <= lambda <= 1
+        point position(const scalar lambda) const;
 
-        //- Return the position of a point on the curve given by
-        //  the parameter 0 <= lambda <= 1
-        vector position(const scalar lambda) const;
+        //- Return the point position corresponding to the local parameter
+        //  0 <= lambda <= 1 on the given segment
+        point position(const label segment, const scalar lambda) const;
 
         //- Return the length of the curve
         scalar length() const;
diff --git a/src/mesh/blockMesh/curvedEdges/CatmullRomSpline.C b/src/mesh/blockMesh/curvedEdges/CatmullRomSpline.C
new file mode 100644
index 00000000000..7b4fd684d24
--- /dev/null
+++ b/src/mesh/blockMesh/curvedEdges/CatmullRomSpline.C
@@ -0,0 +1,141 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2009-2009 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 "error.H"
+#include "CatmullRomSpline.H"
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::CatmullRomSpline::CatmullRomSpline
+(
+    const pointField& knots,
+    const bool closed
+)
+:
+    polyLine(knots, closed)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+Foam::point Foam::CatmullRomSpline::position(const scalar mu) const
+{
+    // endpoints
+    if (mu < SMALL)
+    {
+        return points().first();
+    }
+    else if (mu > 1 - SMALL)
+    {
+        return points().last();
+    }
+
+    scalar lambda = mu;
+    label segment = localParameter(lambda);
+    return position(segment, lambda);
+}
+
+
+Foam::point Foam::CatmullRomSpline::position
+(
+    const label segment,
+    const scalar mu
+) const
+{
+    // out-of-bounds
+    if (segment < 0)
+    {
+        return points().first();
+    }
+    else if (segment > nSegments())
+    {
+        return points().last();
+    }
+
+    const point& p0 = points()[segment];
+    const point& p1 = points()[segment+1];
+
+    // special cases - no calculation needed
+    if (mu <= 0.0)
+    {
+        return p0;
+    }
+    else if (mu >= 1.0)
+    {
+        return p1;
+    }
+
+
+    // determine the end points
+    point e0;
+    point e1;
+
+    if (segment == 0)
+    {
+        // end: simple reflection
+        e0 = 2*p0 - p1;
+    }
+    else
+    {
+        e0 = points()[segment-1];
+    }
+
+    if (segment+1 == nSegments())
+    {
+        // end: simple reflection
+        e1 = 2*p1 - p0;
+    }
+    else
+    {
+        e1 = points()[segment+2];
+    }
+
+
+    return 0.5 *
+    (
+        ( 2*p0 )
+      + mu *
+        (
+            ( -e0 + p1 )
+          + mu *
+            (
+                ( 2*e0 - 5*p0 + 4*p1 - e1 )
+              + mu *
+                ( -e0 + 3*p0 - 3*p1 + e1 )
+            )
+        )
+    );
+}
+
+
+Foam::scalar Foam::CatmullRomSpline::length() const
+{
+    notImplemented("CatmullRomSpline::length() const");
+    return 1.0;
+}
+
+
+// ************************************************************************* //
diff --git a/src/mesh/blockMesh/curvedEdges/simpleSplineEdge.H b/src/mesh/blockMesh/curvedEdges/CatmullRomSpline.H
similarity index 50%
rename from src/mesh/blockMesh/curvedEdges/simpleSplineEdge.H
rename to src/mesh/blockMesh/curvedEdges/CatmullRomSpline.H
index 4c6df2a5095..032180a2caf 100644
--- a/src/mesh/blockMesh/curvedEdges/simpleSplineEdge.H
+++ b/src/mesh/blockMesh/curvedEdges/CatmullRomSpline.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 1991-2009 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2009-2009 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -23,21 +23,48 @@ License
     Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 
 Class
-    Foam::simpleSplineEdge
+    Foam::CatmullRomSpline
 
 Description
-    The actual access class for Bspline
+    An implementation of Catmull-Rom splines
+    (sometimes known as Overhauser splines).
+
+    In this implementation, the end tangents are created automatically
+    by reflection.
+
+    In matrix form, the @e local interpolation on the interval t=[0..1] is
+    described as follows:
+    @verbatim
+    P(t) = 1/2 * [ t^3 t^2 t 1 ] * [ -1  3 -3  1 ] * [ P-1 ]
+                                   [  2 -5  4 -1 ]   [ P0 ]
+                                   [ -1  0  1  0 ]   [ P1 ]
+                                   [  0  2  0  0 ]   [ P2 ]
+    @endverbatim
+
+    Where P-1 and P2 represent the neighbouring points or the extrapolated
+    end points. Simple reflection is used to automatically create the end
+    points.
+
+    The spline is discretized based on the chord length of the individual
+    segments. In rare cases (sections with very high curvatures), the
+    resulting distribution may be sub-optimal.
+
+SeeAlso
+    http://www.algorithmist.net/catmullrom.html provides a nice
+    introduction
+
+ToDo
+    A future implementation could also handle closed splines.
 
 SourceFiles
-    simpleSplineEdge.C
+    CatmullRomSpline.C
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef simpleSplineEdge_H
-#define simpleSplineEdge_H
+#ifndef CatmullRomSpline_H
+#define CatmullRomSpline_H
 
-#include "curvedEdge.H"
-#include "BSpline.H"
+#include "polyLine.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -45,68 +72,45 @@ namespace Foam
 {
 
 /*---------------------------------------------------------------------------*\
-                      Class simpleSplineEdge Declaration
+                      Class CatmullRomSpline Declaration
 \*---------------------------------------------------------------------------*/
 
-class simpleSplineEdge
+class CatmullRomSpline
 :
-    public curvedEdge,
-    public BSpline
+    public polyLine
 {
     // Private Member Functions
 
         //- Disallow default bitwise copy construct
-        simpleSplineEdge(const simpleSplineEdge&);
+        CatmullRomSpline(const CatmullRomSpline&);
 
         //- Disallow default bitwise assignment
-        void operator=(const simpleSplineEdge&);
+        void operator=(const CatmullRomSpline&);
 
 
 public:
 
-    //- Runtime type information
-    TypeName("simpleSpline");
-
-
     // Constructors
 
         //- Construct from components
-        simpleSplineEdge
+        CatmullRomSpline
         (
-            const pointField&,
-            const label start,
-            const label end,
-            const pointField& otherKnots
+            const pointField& knots,
+            const bool notImplementedClosed = false
         );
 
-        //- Construct from components
-        simpleSplineEdge
-        (
-            const pointField&,
-            const label start,
-            const label end,
-            const pointField& otherKnots,
-            const vector& fstend,
-            const vector& sndend
-        );
-
-        //- Construct from Istream setting pointsList
-        simpleSplineEdge(const pointField&, Istream&);
-
-
-    // Destructor
-
-        virtual ~simpleSplineEdge()
-        {}
-
 
     // Member Functions
 
-        //- Return the position of a point on the simple spline curve given by
-        //  the parameter 0 <= lambda <= 1
-        vector position(const scalar mu) const;
+        //- Return the point position corresponding to the curve parameter
+        //  0 <= lambda <= 1
+        point position(const scalar lambda) const;
+
+        //- Return the point position corresponding to the local parameter
+        //  0 <= lambda <= 1 on the given segment
+        point position(const label segment, const scalar lambda) const;
 
-        //- Return the length of the simple spline curve
+        //- Return the length of the curve
         scalar length() const;
 };
 
diff --git a/src/mesh/blockMesh/curvedEdges/arcEdge.C b/src/mesh/blockMesh/curvedEdges/arcEdge.C
index afb62a8f8b4..b1f61077b58 100644
--- a/src/mesh/blockMesh/curvedEdges/arcEdge.C
+++ b/src/mesh/blockMesh/curvedEdges/arcEdge.C
@@ -61,7 +61,7 @@ Foam::cylindricalCS Foam::arcEdge::calcAngle()
 
     scalar fact = 0.5*(bsqr - adotb)/denom;
 
-    vector centre = 0.5*a + fact*((a ^ b) ^ a);
+    point centre = 0.5*a + fact*((a ^ b) ^ a);
 
     centre += p1_;
 
@@ -71,11 +71,10 @@ Foam::cylindricalCS Foam::arcEdge::calcAngle()
     vector r3(p3_ - centre);
 
     // find angles
-    scalar tmp = (r3&r1)/(mag(r3)*mag(r1));
-    angle_ = radToDeg(acos(tmp));
+    angle_ = radToDeg(acos((r3 & r1)/(mag(r3) * mag(r1))));
 
     // check if the vectors define an exterior or an interior arcEdge
-    if (((r1 ^ r2)&(r1 ^ r3)) < 0.0)
+    if (((r1 ^ r2) & (r1 ^ r3)) < 0.0)
     {
         angle_ = 360.0 - angle_;
     }
@@ -99,7 +98,7 @@ Foam::cylindricalCS Foam::arcEdge::calcAngle()
     radius_ = mag(r3);
 
     // set up and return the local coordinate system
-    return cylindricalCS("tmpCS", centre, tempAxis, r1);
+    return cylindricalCS("arcEdgeCS", centre, tempAxis, r1);
 }
 
 
@@ -110,7 +109,7 @@ Foam::arcEdge::arcEdge
     const pointField& points,
     const label start,
     const label end,
-    const vector& pMid
+    const point& pMid
 )
 :
     curvedEdge(points, start, end),
@@ -133,7 +132,7 @@ Foam::arcEdge::arcEdge(const pointField& points, Istream& is)
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-Foam::vector Foam::arcEdge::position(const scalar lambda) const
+Foam::point Foam::arcEdge::position(const scalar lambda) const
 {
     if (lambda < 0 || lambda > 1)
     {
@@ -146,7 +145,7 @@ Foam::vector Foam::arcEdge::position(const scalar lambda) const
     {
         return p1_;
     }
-    else if (lambda > 1-SMALL)
+    else if (lambda > 1 - SMALL)
     {
         return p3_;
     }
diff --git a/src/mesh/blockMesh/curvedEdges/arcEdge.H b/src/mesh/blockMesh/curvedEdges/arcEdge.H
index da96d150fc0..327872caae9 100644
--- a/src/mesh/blockMesh/curvedEdges/arcEdge.H
+++ b/src/mesh/blockMesh/curvedEdges/arcEdge.H
@@ -54,15 +54,16 @@ class arcEdge
 {
     // Private data
 
-        vector p1_, p2_, p3_;
+        point p1_, p2_, p3_;
+        cylindricalCS cs_;
         scalar angle_;
         scalar radius_;
-        cylindricalCS cs_;
-
-        cylindricalCS calcAngle();
 
     // Private Member Functions
 
+        //- Calculate the coordinate system, angle and radius
+        cylindricalCS calcAngle();
+
         //- Disallow default bitwise copy construct
         arcEdge(const arcEdge&);
 
@@ -82,7 +83,7 @@ public:
         (
             const pointField& points,
             const label start, const label end,
-            const vector& pMid
+            const point& pMid
         );
 
         //- Construct from Istream setting pointsList
@@ -96,9 +97,9 @@ public:
 
     // Member Functions
 
-        //- Return the position of a point on the curve given by
-        //  the parameter 0 <= lambda <= 1
-        vector position(const scalar) const;
+        //- Return the point position corresponding to the curve parameter
+        //  0 <= lambda <= 1
+        point position(const scalar) const;
 
         //- Return the length of the curve
         scalar length() const;
diff --git a/src/mesh/blockMesh/curvedEdges/curvedEdge.C b/src/mesh/blockMesh/curvedEdges/curvedEdge.C
index 4b80a221ddd..35e58b7692b 100644
--- a/src/mesh/blockMesh/curvedEdges/curvedEdge.C
+++ b/src/mesh/blockMesh/curvedEdges/curvedEdge.C
@@ -108,27 +108,27 @@ Foam::autoPtr<Foam::curvedEdge> Foam::curvedEdge::New
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-Foam::pointField Foam::curvedEdge::knotlist
+Foam::pointField Foam::curvedEdge::appendEndPoints
 (
     const pointField& points,
     const label start,
     const label end,
-    const pointField& otherknots
+    const pointField& otherKnots
 )
 {
-    pointField newPoints(otherknots.size() + 2);
+    pointField allKnots(otherKnots.size() + 2);
 
     // start/end knots
-    newPoints[0] = points[start];
-    newPoints[otherknots.size() + 1] = points[end];
+    allKnots[0] = points[start];
+    allKnots[otherKnots.size() + 1] = points[end];
 
     // intermediate knots
-    forAll(otherknots, knotI)
+    forAll(otherKnots, knotI)
     {
-        newPoints[knotI+1] = otherknots[knotI];
+        allKnots[knotI+1] = otherKnots[knotI];
     }
 
-    return newPoints;
+    return allKnots;
 }
 
 
diff --git a/src/mesh/blockMesh/curvedEdges/curvedEdge.H b/src/mesh/blockMesh/curvedEdges/curvedEdge.H
index 49ad047e45a..bd1ad3246ad 100644
--- a/src/mesh/blockMesh/curvedEdges/curvedEdge.H
+++ b/src/mesh/blockMesh/curvedEdges/curvedEdge.H
@@ -26,8 +26,8 @@ Class
     Foam::curvedEdge
 
 Description
-    Define a curved edge in space that is parameterised for
-    0<lambda<1 from the beginning to the end point.
+    Define a curved edge that is parameterized for 0<lambda<1
+    between the start and end point.
 
 SourceFiles
     curvedEdge.C
@@ -62,6 +62,19 @@ protected:
         const label start_;
         const label end_;
 
+    // Protected Member Functions
+
+        //- Return a complete point field by appending the start/end points
+        //  to the given list
+        static pointField appendEndPoints
+        (
+            const pointField&,
+            const label start,
+            const label end,
+            const pointField& otherKnots
+        );
+
+
 public:
 
     //- Runtime type information
@@ -136,23 +149,13 @@ public:
         //  - -1: same edge, but different orientation
         inline int compare(const label start, const label end) const;
 
-        //- Return the position of a point on the curve given by
-        //  the parameter 0 <= lambda <= 1
-        virtual vector position(const scalar) const = 0;
+        //- Return the point position corresponding to the curve parameter
+        //  0 <= lambda <= 1
+        virtual point position(const scalar) const = 0;
 
         //- Return the length of the curve
         virtual scalar length() const = 0;
 
-        //- Return a complete knotList by adding the start/end points
-        //  to the given list
-        static pointField knotlist
-        (
-            const pointField&,
-            const label start,
-            const label end,
-            const pointField& otherknots
-        );
-
 
     // Member operators
 
diff --git a/src/mesh/blockMesh/curvedEdges/curvedEdgeI.H b/src/mesh/blockMesh/curvedEdges/curvedEdgeI.H
index 6d3de4e5540..ade7db175bf 100644
--- a/src/mesh/blockMesh/curvedEdges/curvedEdgeI.H
+++ b/src/mesh/blockMesh/curvedEdges/curvedEdgeI.H
@@ -67,7 +67,4 @@ inline int Foam::curvedEdge::compare(const edge& e) const
 }
 
 
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-
 // ************************************************************************* //
diff --git a/src/mesh/blockMesh/curvedEdges/lineDivide.H b/src/mesh/blockMesh/curvedEdges/lineDivide.H
index 37f1d9ba5c3..1b3f33e69da 100644
--- a/src/mesh/blockMesh/curvedEdges/lineDivide.H
+++ b/src/mesh/blockMesh/curvedEdges/lineDivide.H
@@ -55,14 +55,14 @@ class lineDivide
     // Private data
 
         pointField points_;
+
         scalarList divisions_;
 
 public:
 
     // Constructors
 
-        //- Construct from components
-        //  discretization and expansion ration
+        //- Construct from components with discretization and expansion ratio
         lineDivide
         (
             const curvedEdge&,
diff --git a/src/mesh/blockMesh/curvedEdges/lineEdge.C b/src/mesh/blockMesh/curvedEdges/lineEdge.C
index 72e173ea2ce..586d495d491 100644
--- a/src/mesh/blockMesh/curvedEdges/lineEdge.C
+++ b/src/mesh/blockMesh/curvedEdges/lineEdge.C
@@ -46,23 +46,23 @@ Foam::lineEdge::lineEdge
     const label end
 )
 :
-    curvedEdge(points, start, end),
-    startPoint_(points_[start_]),
-    direction_(points_[end_] - points_[start_])
+    curvedEdge(points, start, end)
 {}
 
 
 Foam::lineEdge::lineEdge(const pointField& points, Istream& is)
 :
-    curvedEdge(points, is),
-    startPoint_(points_[start_]),
-    direction_(points_[end_] - points_[start_])
+    curvedEdge(points, is)
 {}
 
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * * //
+
+Foam::lineEdge::~lineEdge()
+{}
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-Foam::vector Foam::lineEdge::position(const scalar lambda) const
+Foam::point Foam::lineEdge::position(const scalar lambda) const
 {
     if (lambda < 0 || lambda > 1)
     {
@@ -71,13 +71,13 @@ Foam::vector Foam::lineEdge::position(const scalar lambda) const
             << abort(FatalError);
     }
 
-    return startPoint_ + lambda*direction_;
+    return points_[start_] + lambda * (points_[end_] - points_[start_]);
 }
 
 
 Foam::scalar Foam::lineEdge::length() const
 {
-    return mag(direction_);
+    return mag(points_[end_] - points_[start_]);
 }
 
 
diff --git a/src/mesh/blockMesh/curvedEdges/lineEdge.H b/src/mesh/blockMesh/curvedEdges/lineEdge.H
index a601830f7f7..3d295912325 100644
--- a/src/mesh/blockMesh/curvedEdges/lineEdge.H
+++ b/src/mesh/blockMesh/curvedEdges/lineEdge.H
@@ -26,7 +26,7 @@ Class
     Foam::lineEdge
 
 Description
-    Defines a straight line between the start point and the end point.
+    A straight edge between the start point and the end point.
 
 SourceFiles
     lineEdge.C
@@ -52,14 +52,6 @@ class lineEdge
 :
     public curvedEdge
 {
-    // Private data
-
-        //- Avoid repetitive calculation of the start point
-        const vector startPoint_;
-
-        //- Avoid repetitive calculation of the direction (end - start)
-        const vector direction_;
-
     // Private Member Functions
 
         //- Disallow default bitwise copy construct
@@ -68,7 +60,6 @@ class lineEdge
         //- Disallow default bitwise assignment
         void operator=(const lineEdge&);
 
-
 public:
 
     //- Runtime type information
@@ -79,20 +70,19 @@ public:
         //- Construct from components
         lineEdge(const pointField&, const label start, const label end);
 
-        //- Construct from Istream setting pointsList
+        //- Construct from Istream with a pointField
         lineEdge(const pointField&, Istream&);
 
 
-    // Destructor
-
-        virtual ~lineEdge(){}
+        //- Destructor
+        virtual ~lineEdge();
 
 
     // Member Functions
 
-        //- Return the position of a point on the curve given by
-        //  the parameter 0 <= lambda <= 1
-        vector position(const scalar) const;
+        //- Return the point position corresponding to the curve parameter
+        //  0 <= lambda <= 1
+        point position(const scalar) const;
 
         //- Return the length of the curve
         scalar length() const;
diff --git a/src/mesh/blockMesh/curvedEdges/polyLine.C b/src/mesh/blockMesh/curvedEdges/polyLine.C
index e8872de6a2b..183aa1a2b80 100644
--- a/src/mesh/blockMesh/curvedEdges/polyLine.C
+++ b/src/mesh/blockMesh/curvedEdges/polyLine.C
@@ -29,29 +29,26 @@ License
 
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
-// calcDistances generates the distances_ lookup table (cumulative
-// distance along the line) from the individual vectors to the points
-
-void Foam::polyLine::calcDistances()
+void Foam::polyLine::calcParam()
 {
-    distances_.setSize(controlPoints_.size());
+    param_.setSize(points_.size());
 
-    if (distances_.size())
+    if (param_.size())
     {
-        distances_[0] = 0.0;
+        param_[0] = 0.0;
 
-        for (label i=1; i<distances_.size(); i++)
+        for (label i=1; i < param_.size(); i++)
         {
-            distances_[i] = distances_[i-1] +
-                mag(controlPoints_[i] - controlPoints_[i-1]);
+            param_[i] = param_[i-1] + mag(points_[i] - points_[i-1]);
         }
 
-        // normalize
-        lineLength_ = distances_[distances_.size()-1];
-        for (label i=1; i<distances_.size(); i++)
+        // normalize on the interval 0-1
+        lineLength_ = param_.last();
+        for (label i=1; i < param_.size() - 1; i++)
         {
-            distances_[i] /= lineLength_;
+            param_[i] /= lineLength_;
         }
+        param_.last() = 1.0;
     }
     else
     {
@@ -63,61 +60,117 @@ void Foam::polyLine::calcDistances()
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
-Foam::polyLine::polyLine(const pointField& ps)
+Foam::polyLine::polyLine(const pointField& ps, const bool)
 :
-    controlPoints_(ps),
-    distances_(0),
-    lineLength_(0.0)
+    points_(ps),
+    lineLength_(0.0),
+    param_(0)
 {
-    calcDistances();
+    calcParam();
 }
 
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-Foam::vector Foam::polyLine::position(const scalar lambda) const
+const Foam::pointField& Foam::polyLine::points() const
 {
-    // check range of lambda
+    return points_;
+}
 
-    if (lambda < 0 || lambda > 1)
-    {
-        FatalErrorIn("polyLine::position(const scalar)")
-            << "Parameter out of range, "
-            << "lambda = " << lambda
-            << abort(FatalError);
-    }
 
-    // Quick calc of endpoints
+Foam::label Foam::polyLine::nSegments() const
+{
+    return points_.size()-1;
+}
+
 
+Foam::label Foam::polyLine::localParameter(scalar& lambda) const
+{
+    // check endpoints
     if (lambda < SMALL)
     {
-        return controlPoints_[0];
+        lambda = 0;
+        return 0;
     }
     else if (lambda > 1 - SMALL)
     {
-        return controlPoints_[controlPoints_.size()-1];
+        lambda = 1;
+        return nSegments();
     }
 
+    // search table of cumulative distances to find which line-segment
+    // we are on. Check the upper bound.
 
-    // search table of cumulative distance to find which linesegment we
-    // are on
+    label segmentI = 1;
+    while (param_[segmentI] < lambda)
+    {
+        segmentI++;
+    }
+    segmentI--;   // we want the corresponding lower bound
+
+    // the local parameter [0-1] on this line segment
+    lambda =
+    (
+        ( lambda - param_[segmentI] )
+      / ( param_[segmentI+1] - param_[segmentI] )
+    );
+
+    return segmentI;
+}
 
-    label i(0);
-    do
+
+Foam::point Foam::polyLine::position(const scalar mu) const
+{
+    // check endpoints
+    if (mu < SMALL)
+    {
+        return points_.first();
+    }
+    else if (mu > 1 - SMALL)
     {
-        i++;
-    } while (distances_[i] < lambda);
+        return points_.last();
+    }
+
+
+    scalar lambda = mu;
+    label segment = localParameter(lambda);
+    return position(segment, lambda);
+}
 
-    i--;               // we overshot!
 
-    // construct position vector
-    scalar offsetDist =
-        (lambda - distances_[i])
-       /(distances_[i+1] - distances_[i]);
+Foam::point Foam::polyLine::position
+(
+    const label segment,
+    const scalar mu
+) const
+{
+    // out-of-bounds
+    if (segment < 0)
+    {
+        return points_.first();
+    }
+    else if (segment > nSegments())
+    {
+        return points_.last();
+    }
 
-    vector offsetV = controlPoints_[i+1] - controlPoints_[i];
+    const point& p0 = points()[segment];
+    const point& p1 = points()[segment+1];
 
-    return controlPoints_[i] + offsetDist*offsetV;
+    // special cases - no calculation needed
+    if (mu <= 0.0)
+    {
+        return p0;
+    }
+    else if (mu >= 1.0)
+    {
+        return p1;
+    }
+    else
+    {
+        // linear interpolation
+        return points_[segment] + mu * (p1 - p0);
+    }
 }
 
 
diff --git a/src/mesh/blockMesh/curvedEdges/polyLine.H b/src/mesh/blockMesh/curvedEdges/polyLine.H
index 4ef97f30525..4834eb590d0 100644
--- a/src/mesh/blockMesh/curvedEdges/polyLine.H
+++ b/src/mesh/blockMesh/curvedEdges/polyLine.H
@@ -26,10 +26,11 @@ Class
     Foam::polyLine
 
 Description
-    Defines a curvedEdge in terms of a series of straight line segments.
+    A series of straight line segments, which can also be interpreted as
+    a series of control points for splines, etc.
 
-    This is the basic polyLine class which implements just the line
-    (no topology - it is not derived from curvedEdge)
+ToDo
+    A future implementation could also handle a closed polyLine.
 
 SourceFiles
     polyLine.C
@@ -66,28 +67,53 @@ protected:
 
     // Protected data
 
-        pointField controlPoints_;
-        scalarList distances_;
+        //- The control points or ends of each segments
+        pointField points_;
+
+        //- The real line length
         scalar lineLength_;
 
+        //- The rational (0-1) cumulative parameter value for each point
+        scalarList param_;
+
     // Protected member functions
 
-        void calcDistances();
+        //- Precalculate the rational cumulative parameter value
+        //  and the line-length
+        void calcParam();
+
 
+        //- Return the line segment and the local parameter [0..1]
+        //  corresponding to the global lambda [0..1]
+        label localParameter(scalar& lambda) const;
 
 public:
 
     // Constructors
 
         //- Construct from components
-        polyLine(const pointField&);
+        polyLine
+        (
+            const pointField&,
+            const bool notImplementedClosed = false
+        );
 
 
     // Member Functions
 
-        //- Return the position of a point on the curve given by
-        //  the parameter 0 <= lambda <= 1
-        vector position(const scalar) const;
+        //- Return const-access to the control-points
+        const pointField& points() const;
+
+        //- Return the number of line segments
+        label nSegments() const;
+
+        //- Return the point position corresponding to the curve parameter
+        //  0 <= lambda <= 1
+        point position(const scalar) const;
+
+        //- Return the point position corresponding to the local parameter
+        //  0 <= lambda <= 1 on the given segment
+        point position(const label segment, const scalar) const;
 
         //- Return the length of the curve
         scalar length() const;
diff --git a/src/mesh/blockMesh/curvedEdges/polyLineEdge.C b/src/mesh/blockMesh/curvedEdges/polyLineEdge.C
index 89029d1af97..1f038a78a85 100644
--- a/src/mesh/blockMesh/curvedEdges/polyLineEdge.C
+++ b/src/mesh/blockMesh/curvedEdges/polyLineEdge.C
@@ -44,24 +44,30 @@ Foam::polyLineEdge::polyLineEdge
     const pointField& ps,
     const label start,
     const label end,
-    const pointField& otherpoints
+    const pointField& otherPoints
 )
 :
     curvedEdge(ps, start, end),
-    polyLine(knotlist(ps, start, end, otherpoints))
+    polyLine(appendEndPoints(ps, start_, end_, otherPoints))
 {}
 
 
 Foam::polyLineEdge::polyLineEdge(const pointField& ps, Istream& is)
 :
     curvedEdge(ps, is),
-    polyLine(knotlist(ps, start_, end_, pointField(is)))
+    polyLine(appendEndPoints(ps, start_, end_, pointField(is)))
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::polyLineEdge::~polyLineEdge()
 {}
 
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-Foam::vector Foam::polyLineEdge::position(const scalar lambda) const
+Foam::point Foam::polyLineEdge::position(const scalar lambda) const
 {
     return polyLine::position(lambda);
 }
diff --git a/src/mesh/blockMesh/curvedEdges/polyLineEdge.H b/src/mesh/blockMesh/curvedEdges/polyLineEdge.H
index 532a91ad5d5..e941bba7161 100644
--- a/src/mesh/blockMesh/curvedEdges/polyLineEdge.H
+++ b/src/mesh/blockMesh/curvedEdges/polyLineEdge.H
@@ -26,8 +26,7 @@ Class
     Foam::polyLineEdge
 
 Description
-    Defines a curvedEdge in terms of a series of straight line segments.
-    This is the public face of polyLine
+    A curvedEdge defined in terms of a series of straight line segments.
 
 SourceFiles
     polyLineEdge.C
@@ -84,16 +83,15 @@ public:
         polyLineEdge(const pointField&, Istream&);
 
 
-    // Destructor
-
-        virtual ~polyLineEdge(){}
+        //- Destructor
+        virtual ~polyLineEdge();
 
 
     // Member Functions
 
-        //- Return the position of a point on the curve given by
-        //  the parameter 0 <= lambda <= 1
-        vector position(const scalar lambda) const;
+        //- Return the point position corresponding to the curve parameter
+        //  0 <= lambda <= 1
+        point position(const scalar lambda) const;
 
         //- Return the length of the curve
         scalar length() const;
diff --git a/src/mesh/blockMesh/curvedEdges/polySplineEdge.C b/src/mesh/blockMesh/curvedEdges/polySplineEdge.C
deleted file mode 100644
index 8e4f0f90b3c..00000000000
--- a/src/mesh/blockMesh/curvedEdges/polySplineEdge.C
+++ /dev/null
@@ -1,150 +0,0 @@
-/*---------------------------------------------------------------------------*\
-  =========                 |
-  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-   \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 1991-2009 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 "polySplineEdge.H"
-#include "BSpline.H"
-#include "addToRunTimeSelectionTable.H"
-
-// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
-
-namespace Foam
-{
-    defineTypeNameAndDebug(polySplineEdge, 0);
-    addToRunTimeSelectionTable(curvedEdge, polySplineEdge, Istream);
-}
-
-// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
-
-// intervening : returns a list of the points making up the polyLineEdge
-// which describes the spline. nBetweenKnots is the number of points
-// placed between each knot : this ensures that the knot locations
-// are retained as a subset of the polyLine points.
-
-// note that the points are evenly spaced in the parameter mu, not
-// in real space
-
-Foam::pointField Foam::polySplineEdge::intervening
-(
-    const pointField& otherknots,
-    const label nBetweenKnots,
-    const vector& fstend,
-    const vector& sndend
-)
-{
-    BSpline spl
-    (
-        knotlist(points_, start_, end_, otherknots),
-        fstend,
-        sndend
-    );
-
-    const label nSize
-    (
-        otherknots.size() * (1 + nBetweenKnots) + nBetweenKnots + 2
-    );
-
-    const label NKnots = spl.nKnots();
-    const scalar init = 1.0/(NKnots - 1);
-    scalar interval = (NKnots - scalar(3.0))/NKnots;
-    interval /= otherknots.size() + 1;
-    interval /= nBetweenKnots + 1;
-
-    pointField ans(nSize);
-    ans[0] = points_[start_];
-
-    register scalar index(init);
-    for (register label i=1; i<nSize-1; i++)
-    {
-        index += interval;
-        ans[i] = spl.realPosition(index);
-    }
-
-    ans[nSize-1] = points_[end_];
-
-    return ans;
-}
-
-
-// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
-
-Foam::polySplineEdge::polySplineEdge
-(
-    const pointField& points,
-    const label start,
-    const label end,
-    const pointField& otherknots,
-    const label nInterKnots
-)
-:
-    curvedEdge(points, start, end),
-    polyLine
-    (
-        intervening
-        (
-            otherknots,
-            nInterKnots,
-            vector::zero,
-            vector::zero
-        )
-    ),
-    otherKnots_(otherknots)
-{}
-
-
-Foam::polySplineEdge::polySplineEdge
-(
-    const pointField& points,
-    Istream& is
-)
-:
-    curvedEdge(points, is),
-    polyLine(pointField(0)),
-    otherKnots_(is)
-{
-    label nInterKnots(20);
-    vector fstend(is);
-    vector sndend(is);
-
-    controlPoints_ = intervening(otherKnots_, nInterKnots, fstend, sndend);
-    calcDistances();
-}
-
-
-// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
-
-Foam::vector Foam::polySplineEdge::position(const scalar mu) const
-{
-    return polyLine::position(mu);
-}
-
-
-Foam::scalar Foam::polySplineEdge::length() const
-{
-    return polyLine::length();
-}
-
-
-// ************************************************************************* //
diff --git a/src/mesh/blockMesh/curvedEdges/simpleSplineEdge.C b/src/mesh/blockMesh/curvedEdges/splineEdge.C
similarity index 62%
rename from src/mesh/blockMesh/curvedEdges/simpleSplineEdge.C
rename to src/mesh/blockMesh/curvedEdges/splineEdge.C
index 3132a1f7eaf..b49711c28b6 100644
--- a/src/mesh/blockMesh/curvedEdges/simpleSplineEdge.C
+++ b/src/mesh/blockMesh/curvedEdges/splineEdge.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 1991-2009 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2009-2009 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -24,7 +24,7 @@ License
 
 \*---------------------------------------------------------------------------*/
 
-#include "simpleSplineEdge.H"
+#include "splineEdge.H"
 #include "addToRunTimeSelectionTable.H"
 
 
@@ -32,60 +32,66 @@ License
 
 namespace Foam
 {
-    defineTypeNameAndDebug(simpleSplineEdge, 0);
-    addToRunTimeSelectionTable(curvedEdge, simpleSplineEdge, Istream);
+    defineTypeNameAndDebug(splineEdge, 0);
+
+    addToRunTimeSelectionTable
+    (
+        curvedEdge,
+        splineEdge,
+        Istream
+    );
 }
 
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
-Foam::simpleSplineEdge::simpleSplineEdge
+Foam::splineEdge::splineEdge
 (
     const pointField& points,
     const label start,
     const label end,
-    const pointField& otherknots
+    const pointField& internalPoints
 )
 :
     curvedEdge(points, start, end),
-    BSpline(knotlist(points, start, end, otherknots))
+    CatmullRomSpline(appendEndPoints(points, start, end, internalPoints))
 {}
 
 
-Foam::simpleSplineEdge::simpleSplineEdge
-(
-    const pointField& points,
-    const label start,
-    const label end,
-    const pointField& otherknots,
-    const vector& fstend,
-    const vector& sndend
-)
+Foam::splineEdge::splineEdge(const pointField& points, Istream& is)
 :
-    curvedEdge(points, start, end),
-    BSpline(knotlist(points, start, end, otherknots), fstend, sndend)
-{}
+    curvedEdge(points, is),
+    CatmullRomSpline(appendEndPoints(points, start_, end_, pointField(is)))
+{
+    token t(is);
+    is.putBack(t);
+
+    // discard unused start/end tangents
+    if (t == token::BEGIN_LIST)
+    {
+        vector tangent0Ignored(is);
+        vector tangent1Ignored(is);
+    }
+}
 
 
-Foam::simpleSplineEdge::simpleSplineEdge(const pointField& points, Istream& is)
-:
-    curvedEdge(points, is),
-    BSpline(knotlist(points, start_, end_, pointField(is)))
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::splineEdge::~splineEdge()
 {}
 
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-Foam::vector Foam::simpleSplineEdge::position(const scalar mu) const
+Foam::point Foam::splineEdge::position(const scalar mu) const
 {
-    return BSpline::position(mu);
+    return CatmullRomSpline::position(mu);
 }
 
 
-Foam::scalar Foam::simpleSplineEdge::length() const
+Foam::scalar Foam::splineEdge::length() const
 {
-    notImplemented("simpleSplineEdge::length() const");
-    return 1.0;
+    return CatmullRomSpline::length();
 }
 
 
diff --git a/src/mesh/blockMesh/curvedEdges/polySplineEdge.H b/src/mesh/blockMesh/curvedEdges/splineEdge.H
similarity index 64%
rename from src/mesh/blockMesh/curvedEdges/polySplineEdge.H
rename to src/mesh/blockMesh/curvedEdges/splineEdge.H
index b133b9e45dd..f67a7f76313 100644
--- a/src/mesh/blockMesh/curvedEdges/polySplineEdge.H
+++ b/src/mesh/blockMesh/curvedEdges/splineEdge.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 1991-2009 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2009-2009 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -23,21 +23,21 @@ License
     Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 
 Class
-    Foam::polySplineEdge
+    Foam::splineEdge
 
 Description
-    A spline representation via a polyLine
+    A curvedEdge interface for Catmull-Rom splines.
 
 SourceFiles
-    polySplineEdge.C
+    splineEdge.C
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef polySplineEdge_H
-#define polySplineEdge_H
+#ifndef splineEdge_H
+#define splineEdge_H
 
 #include "curvedEdge.H"
-#include "polyLine.H"
+#include "CatmullRomSpline.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -45,64 +45,56 @@ namespace Foam
 {
 
 /*---------------------------------------------------------------------------*\
-                       Class polySplineEdge Declaration
+                      Class splineEdge Declaration
 \*---------------------------------------------------------------------------*/
 
-class polySplineEdge
+class splineEdge
 :
     public curvedEdge,
-    public polyLine
+    public CatmullRomSpline
 {
-    // Private data
+    // Private Member Functions
 
-        pointField otherKnots_;
+        //- Disallow default bitwise copy construct
+        splineEdge(const splineEdge&);
 
+        //- Disallow default bitwise assignment
+        void operator=(const splineEdge&);
 
-    // Private member functions
-
-        pointField intervening
-        (
-            const pointField& otherKnots,
-            const label nBetweenKnots,
-            const vector&,
-            const vector&
-        );
 
 public:
 
     //- Runtime type information
-    TypeName("polySpline");
+    TypeName("spline");
 
 
     // Constructors
 
         //- Construct from components
-        polySplineEdge
+        splineEdge
         (
             const pointField&,
             const label start,
             const label end,
-            const pointField& otherKnots,
-            const label nInterKnots = 20
+            const pointField& internalPoints
         );
 
-        //- Construct from Istream setting pointsList
-        polySplineEdge(const pointField&, Istream&);
-
+        //- Construct from Istream, setting pointsList
+        splineEdge(const pointField&, Istream&);
 
-    // Destructor
 
-        virtual ~polySplineEdge(){}
+    //- Destructor
+    virtual ~splineEdge();
 
 
     // Member Functions
 
-        //- Return the position of a point on the curve given by
-        //  the parameter 0 <= lambda <= 1
-        vector position(const scalar mu) const;
+        //- Return the point position corresponding to the curve parameter
+        //  0 <= lambda <= 1
+        virtual point position(const scalar) const;
 
-        //- Return the length of the curve
-        scalar length() const;
+        //- Return the length of the spline curve (not implemented)
+        virtual scalar length() const;
 };
 
 
diff --git a/src/meshTools/polyMeshZipUpCells/polyMeshZipUpCells.C b/src/meshTools/polyMeshZipUpCells/polyMeshZipUpCells.C
index f5dbae9d697..17a59862604 100644
--- a/src/meshTools/polyMeshZipUpCells/polyMeshZipUpCells.C
+++ b/src/meshTools/polyMeshZipUpCells/polyMeshZipUpCells.C
@@ -27,7 +27,6 @@ License
 #include "polyMeshZipUpCells.H"
 #include "polyMesh.H"
 #include "Time.H"
-#include "globalMeshData.H"
 
 // #define DEBUG_ZIPUP 1
 // #define DEBUG_CHAIN 1
@@ -155,7 +154,7 @@ bool Foam::polyMeshZipUpCells(polyMesh& mesh)
             singleEdges.setSize(nSingleEdges);
 
 #           ifdef DEBUG_ZIPUP
-            Info << "Cell " << cellI << endl;
+            Info<< "Cell " << cellI << endl;
 
             forAll (curFaces, faceI)
             {
@@ -275,18 +274,18 @@ bool Foam::polyMeshZipUpCells(polyMesh& mesh)
                             if (pointUsage[pointI] > 2)
                             {
 #                               ifdef DEBUG_CHAIN
-                                Info << "start head blocked" << endl;
+                                Info<< "start head blocked" << endl;
 #                               endif
 
                                 blockHead = true;
                             }
                         }
-                        else if(cellPoints[pointI] == newEdgeEnd)
+                        else if (cellPoints[pointI] == newEdgeEnd)
                         {
                             if (pointUsage[pointI] > 2)
                             {
 #                               ifdef DEBUG_CHAIN
-                                Info << "start tail blocked" << endl;
+                                Info<< "start tail blocked" << endl;
 #                               endif
 
                                 blockTail = true;
@@ -370,18 +369,18 @@ bool Foam::polyMeshZipUpCells(polyMesh& mesh)
                                         if (pointUsage[pointI] > 2)
                                         {
 #                                           ifdef DEBUG_CHAIN
-                                            Info << "head blocked" << endl;
+                                            Info<< "head blocked" << endl;
 #                                           endif
 
                                             blockHead = true;
                                         }
                                     }
-                                    else if(cellPoints[pointI] == curEdgeEnd)
+                                    else if (cellPoints[pointI] == curEdgeEnd)
                                     {
                                         if (pointUsage[pointI] > 2)
                                         {
 #                                           ifdef DEBUG_CHAIN
-                                            Info << "tail blocked" << endl;
+                                            Info<< "tail blocked" << endl;
 #                                           endif
 
                                             blockTail = true;
@@ -393,7 +392,7 @@ bool Foam::polyMeshZipUpCells(polyMesh& mesh)
                                 if (curEdgeStart == curEdgeEnd)
                                 {
 #                                   ifdef DEBUG_CHAIN
-                                    Info << "closed loop" << endl;
+                                    Info<< "closed loop" << endl;
 #                                   endif
 
                                     pointChain.removeHead();
@@ -416,7 +415,7 @@ bool Foam::polyMeshZipUpCells(polyMesh& mesh)
                 }
 
 #               ifdef DEBUG_CHAIN
-                Info << "completed patch chain: " << pointChain << endl;
+                Info<< "completed patch chain: " << pointChain << endl;
 #               endif
 
                 if (pointChain.size() > 2)
@@ -429,7 +428,7 @@ bool Foam::polyMeshZipUpCells(polyMesh& mesh)
             edgesToInsert.setSize(nEdgesToInsert);
 
 #           ifdef DEBUG_ZIPUP
-            Info << "edgesToInsert: " << edgesToInsert << endl;
+            Info<< "edgesToInsert: " << edgesToInsert << endl;
 #           endif
 
             // Insert the edges into a list of faces
@@ -589,7 +588,7 @@ bool Foam::polyMeshZipUpCells(polyMesh& mesh)
 #                       ifdef DEBUG_ZIPUP
                         if (allPointsPresent)
                         {
-                            Info << "All points present" << endl;
+                            Info<< "All points present" << endl;
                         }
 #                       endif
 
@@ -606,7 +605,7 @@ bool Foam::polyMeshZipUpCells(polyMesh& mesh)
                             edgeList newFaceEdges = newFace.edges();
 
 #                           ifdef DEBUG_ZIPUP
-                            Info << "Not all points present." << endl;
+                            Info<< "Not all points present." << endl;
 #                           endif
 
                             label nNewFacePoints = 0;
@@ -746,27 +745,13 @@ bool Foam::polyMeshZipUpCells(polyMesh& mesh)
         // Collect the patch sizes
         labelList patchSizes(bMesh.size(), 0);
         labelList patchStarts(bMesh.size(), 0);
+
         forAll (bMesh, patchI)
         {
             patchSizes[patchI] = bMesh[patchI].size();
             patchStarts[patchI] = bMesh[patchI].start();
         }
 
-        labelListList subPatches(bMesh.size());
-        labelListList subPatchStarts(bMesh.size());
-
-        forAll(mesh.globalData().processorPatches(), i)
-        {
-            label patchI = mesh.globalData().processorPatches()[i];
-            const processorPolyPatch& ppp = refCast<const processorPolyPatch>
-            (
-                bMesh[patchI]
-            );
-            subPatches[patchI] = ppp.patchIDs();
-            subPatchStarts[patchI] = ppp.starts();
-        }
-
-
         // Reset the mesh. Number of active faces is one beyond the last patch
         // (patches guaranteed to be in increasing order)
         mesh.resetPrimitives
@@ -777,8 +762,6 @@ bool Foam::polyMeshZipUpCells(polyMesh& mesh)
             Xfer<labelList>::null(),
             patchSizes,
             patchStarts,
-            subPatches,
-            subPatchStarts,
             true                // boundary forms valid boundary mesh.
         );
 
diff --git a/src/sampling/sampledSurface/isoSurface/isoSurface.C b/src/sampling/sampledSurface/isoSurface/isoSurface.C
index 7edb58bb7ba..a4b3b960013 100644
--- a/src/sampling/sampledSurface/isoSurface/isoSurface.C
+++ b/src/sampling/sampledSurface/isoSurface/isoSurface.C
@@ -75,28 +75,11 @@ Foam::PackedBoolList Foam::isoSurface::collocatedFaces
     // Initialise to false
     PackedBoolList collocated(pp.size());
 
-    if (isA<processorPolyPatch>(pp))
+    if (isA<processorPolyPatch>(pp) && collocatedPatch(pp))
     {
-        const processorPolyPatch& ppp = refCast<const processorPolyPatch>(pp);
-
-        forAll(ppp.patchIDs(), i)
+        forAll(pp, i)
         {
-            label subPatchI = ppp.patchIDs()[i];
-            label subStart = ppp.starts()[i];
-            label subSize = ppp.starts()[i+1]-subStart;
-
-            const coupledPolyPatch& subPatch = refCast<const coupledPolyPatch>
-            (
-                ppp.boundaryMesh()[subPatchI]
-            );
-
-            if (collocatedPatch(subPatch))
-            {
-                for (label i = subStart; i < subStart+subSize; i++)
-                {
-                    collocated[i] = 1u;
-                }
-            }
+            collocated[i] = 1u;
         }
     }
     else if (isA<cyclicPolyPatch>(pp) && collocatedPatch(pp))
@@ -137,29 +120,21 @@ void Foam::isoSurface::syncUnseparatedPoints
             (
                 isA<processorPolyPatch>(patches[patchI])
              && patches[patchI].nPoints() > 0
+             && collocatedPatch(patches[patchI])
             )
             {
                 const processorPolyPatch& pp =
                     refCast<const processorPolyPatch>(patches[patchI]);
 
-                List<pointField> patchInfo(pp.patchIDs().size());
+                const labelList& meshPts = pp.meshPoints();
+                const labelList& nbrPts = pp.neighbPoints();
 
-                forAll(pp.patchIDs(), subI)
-                {
-                    label subPatchI = pp.patchIDs()[subI];
-
-                    if (collocatedPatch(patches[subPatchI]))
-                    {
-                        const labelList& subMeshPts = pp.subMeshPoints()[subI];
+                pointField patchInfo(meshPts.size());
 
-                        pointField& subPatchInfo = patchInfo[subI];
-                        subPatchInfo.setSize(subMeshPts.size());
-                        forAll(subPatchInfo, i)
-                        {
-                            label meshPointI = subMeshPts[i];
-                            subPatchInfo[i] = pointValues[meshPointI];
-                        }
-                    }
+                forAll(nbrPts, pointI)
+                {
+                    label nbrPointI = nbrPts[pointI];
+                    patchInfo[nbrPointI] = pointValues[meshPts[pointI]];
                 }
 
                 OPstream toNbr(Pstream::blocking, pp.neighbProcNo());
@@ -175,12 +150,13 @@ void Foam::isoSurface::syncUnseparatedPoints
             (
                 isA<processorPolyPatch>(patches[patchI])
              && patches[patchI].nPoints() > 0
+             && collocatedPatch(patches[patchI])
             )
             {
                 const processorPolyPatch& pp =
                     refCast<const processorPolyPatch>(patches[patchI]);
 
-                List<pointField> nbrPatchInfo;
+                pointField nbrPatchInfo(pp.nPoints());
                 {
                     // We do not know the number of points on the other side
                     // so cannot use Pstream::read.
@@ -188,26 +164,16 @@ void Foam::isoSurface::syncUnseparatedPoints
                     fromNbr >> nbrPatchInfo;
                 }
 
-                forAll(pp.patchIDs(), subI)
-                {
-                    label subPatchI = pp.patchIDs()[subI];
-
-                    if (collocatedPatch(patches[subPatchI]))
-                    {
-                        const labelList& subMeshPts =
-                            pp.reverseSubMeshPoints()[subI];
-                        const pointField& nbrSubInfo = nbrPatchInfo[subI];
+                const labelList& meshPts = pp.meshPoints();
 
-                        forAll(nbrSubInfo, i)
-                        {
-                            label meshPointI = subMeshPts[i];
-                            minEqOp<point>()
-                            (
-                                pointValues[meshPointI],
-                                nbrSubInfo[i]
-                            );
-                        }
-                    }
+                forAll(meshPts, pointI)
+                {
+                    label meshPointI = meshPts[pointI];
+                    minEqOp<point>()
+                    (
+                        pointValues[meshPointI],
+                        nbrPatchInfo[pointI]
+                    );
                 }
             }
         }
-- 
GitLab