From fd665b4a3cbde35df54da095593c7e8af8d59dac Mon Sep 17 00:00:00 2001
From: mattijs <mattijs>
Date: Wed, 14 Jun 2017 09:51:02 +0100
Subject: [PATCH] ENH: overset: Initial release of overset capability.

Adds overset discretisation to selected physics:
- diffusion : overLaplacianDyMFoam
- incompressible steady : overSimpleFoam
- incompressible transient : overPimpleDyMFoam
- compressible transient: overRhoPimpleDyMFoam
- two-phase VOF: overInterDyMFoam

The overset method chosen is a parallel, fully implicit implementation
whereby the interpolation (from donor to acceptor) is inserted as an
adapted discretisation on the donor cells, such that the resulting matrix
can be solved using the standard linear solvers.

Above solvers come with a set of tutorials, showing how to create and set-up
simple simulations from scratch.
---
 README.md                                     |    2 +-
 .../overLaplacianDyMFoam/Make/files           |    3 +
 .../overLaplacianDyMFoam/Make/options         |    8 +
 .../overLaplacianDyMFoam/createFields.H       |   53 +
 .../overLaplacianDyMFoam/laplacianDyMFoam.C   |  110 +
 .../overLaplacianDyMFoam/write.H              |   46 +
 .../overRhoPimpleDyMFoam/Make/files           |    3 +
 .../overRhoPimpleDyMFoam/Make/options         |   25 +
 .../overRhoPimpleDyMFoam/correctPhi.H         |   11 +
 .../overRhoPimpleDyMFoam/createControls.H     |   11 +
 .../overRhoPimpleDyMFoam/createFields.H       |  117 +
 .../rhoPimpleFoam/overRhoPimpleDyMFoam/pEqn.H |  123 +
 .../overRhoPimpleDyMFoam/readControls.H       |    6 +
 .../overRhoPimpleDyMFoam/rhoPimpleDyMFoam.C   |  173 ++
 .../pimpleFoam/overPimpleDyMFoam/CourantNo.H  |   50 +
 .../pimpleFoam/overPimpleDyMFoam/Make/files   |    3 +
 .../pimpleFoam/overPimpleDyMFoam/Make/options |   24 +
 .../pimpleFoam/overPimpleDyMFoam/UEqn.H       |   24 +
 .../overPimpleDyMFoam/continuityErrs.H        |   48 +
 .../pimpleFoam/overPimpleDyMFoam/correctPhi.H |  113 +
 .../overPimpleDyMFoam/createControls.H        |   26 +
 .../overPimpleDyMFoam/createFields.H          |   70 +
 .../overPimpleDyMFoam/interpolatedFaces.H     |  269 +++
 .../pimpleFoam/overPimpleDyMFoam/pEqn.H       |  109 +
 .../overPimpleDyMFoam/pimpleDyMFoam.C         |  157 ++
 .../overPimpleDyMFoam/readControls.H          |   10 +
 .../simpleFoam/overSimpleFoam/Make/files      |    3 +
 .../simpleFoam/overSimpleFoam/Make/options    |   25 +
 .../simpleFoam/overSimpleFoam/UEqn.H          |   21 +
 .../overSimpleFoam/continuityErrs.H           |   48 +
 .../simpleFoam/overSimpleFoam/createFields.H  |   47 +
 .../overSimpleFoam/createOversetFields.H      |   34 +
 .../createUpdatedDynamicFvMesh.H              |   22 +
 .../simpleFoam/overSimpleFoam/pEqn.H          |   57 +
 .../simpleFoam/overSimpleFoam/simpleFoam.C    |  125 +
 .../interFoam/overInterDyMFoam/CourantNo.H    |   53 +
 .../interFoam/overInterDyMFoam/Make/files     |    3 +
 .../interFoam/overInterDyMFoam/Make/options   |   31 +
 .../interFoam/overInterDyMFoam/UEqn.H         |   33 +
 .../overInterDyMFoam/continuityErrs.H         |   48 +
 .../interFoam/overInterDyMFoam/correctPhi.H   |  125 +
 .../overInterDyMFoam/createDyMControls.H      |   25 +
 .../interFoam/overInterDyMFoam/createFields.H |  171 ++
 .../interFoam/overInterDyMFoam/interDyMFoam.C |  209 ++
 .../interFoam/overInterDyMFoam/pEqn.H         |   96 +
 .../interFoam/overInterDyMFoam/readControls.H |   15 +
 applications/test/parallelOverset/Make/files  |    3 +
 .../test/parallelOverset/Make/options         |   12 +
 .../test/parallelOverset/createFields.H       |   53 +
 .../test/parallelOverset/heatTransfer/0.org/T |   49 +
 .../heatTransfer/0.org/pointDisplacement      |   44 +
 .../parallelOverset/heatTransfer/0.org/zoneID |   39 +
 .../parallelOverset/heatTransfer/Allclean     |   13 +
 .../parallelOverset/heatTransfer/Allrun.pre   |   17 +
 .../heatTransfer/constant/dynamicMeshDict     |   33 +
 .../heatTransfer/constant/transportProperties |   41 +
 .../heatTransfer/system/blockMeshDict         |  126 +
 .../heatTransfer/system/controlDict           |   57 +
 .../heatTransfer/system/decomposeParDict      |   44 +
 .../heatTransfer/system/fvSchemes             |   85 +
 .../heatTransfer/system/fvSolution            |   77 +
 .../heatTransfer/system/postProcessingDict    |   35 +
 .../heatTransfer/system/processorField        |   32 +
 .../heatTransfer/system/setFieldsDict         |   48 +
 .../heatTransfer/system/topoSetDict           |   80 +
 .../test/parallelOverset/laplacianDyMFoam.C   |  125 +
 applications/test/parallelOverset/write.H     |   46 +
 applications/test/wallDistDyM/Make/files      |    3 +
 applications/test/wallDistDyM/Make/options    |    9 +
 .../test/wallDistDyM/Test-wallDistDyM.C       |   69 +
 .../mergeOrSplitBaffles/mergeOrSplitBaffles.C |    6 +-
 etc/caseDicts/setConstraintTypes              |    5 +
 src/Allwmake                                  |    2 +
 .../LduInterfaceField/LduInterfaceField.H     |    2 +
 .../matrices/LduMatrix/LduMatrix/LduMatrix.H  |    2 +
 .../LduMatrix/LduMatrix/LduMatrixATmul.C      |   22 +-
 .../LduMatrixUpdateMatrixInterfaces.C         |    8 +
 .../GaussSeidel/TGaussSeidelSmoother.C        |   18 +-
 .../lduMatrix/lduAddressing/lduAddressing.C   |   10 +-
 .../lduMatrix/lduAddressing/lduAddressing.H   |    5 +-
 .../lduInterfaceField/lduInterfaceField.H     |   25 +-
 .../lduInterfaceFieldTemplates.C              |   56 +
 .../matrices/lduMatrix/lduMatrix/lduMatrix.H  |    2 +
 .../lduMatrix/lduMatrix/lduMatrixATmul.C      |   22 +-
 .../lduMatrixUpdateMatrixInterfaces.C         |   10 +
 .../GaussSeidel/GaussSeidelSmoother.C         |   32 +-
 .../nonBlockingGaussSeidelSmoother.C          |   29 +-
 .../symGaussSeidel/symGaussSeidelSmoother.C   |   32 +-
 .../algebraicPairGAMGAgglomeration.C          |    2 +-
 .../solvers/GAMG/GAMGSolverInterpolate.C      |    2 +
 .../lduMatrix/solvers/GAMG/GAMGSolverSolve.C  |    2 +-
 .../cyclicGAMGInterfaceField.C                |    8 +-
 .../cyclicGAMGInterfaceField.H                |    1 +
 .../processorGAMGInterfaceField.C             |   14 +-
 .../processorGAMGInterfaceField.H             |    2 +
 .../meshes/lduMesh/lduPrimitiveMesh.H         |   32 +-
 .../polyMeshTetDecomposition.C                |    4 +-
 ...reRadCoupledMixedFvPatchScalarField.H.orig |  219 --
 .../displacementInterpolationMotionSolver.H   |    2 +-
 .../displacementLayeredMotionMotionSolver.H   |    2 +-
 .../basic/coupled/coupledFvPatchField.H       |    2 +
 .../constraint/cyclic/cyclicFvPatchField.C    |   16 +-
 .../constraint/cyclic/cyclicFvPatchField.H    |    2 +
 .../cyclicACMI/cyclicACMIFvPatchField.C       |   16 +-
 .../cyclicACMI/cyclicACMIFvPatchField.H       |    2 +
 .../cyclicAMI/cyclicAMIFvPatchField.C         |   16 +-
 .../cyclicAMI/cyclicAMIFvPatchField.H         |    2 +
 .../jumpCyclic/jumpCyclicFvPatchField.C       |    8 +-
 .../jumpCyclic/jumpCyclicFvPatchField.H       |    3 +
 .../jumpCyclic/jumpCyclicFvPatchFields.C      |    7 +-
 .../jumpCyclicAMI/jumpCyclicAMIFvPatchField.C |    8 +-
 .../jumpCyclicAMI/jumpCyclicAMIFvPatchField.H |    3 +
 .../jumpCyclicAMIFvPatchFields.C              |    7 +-
 .../processor/processorFvPatchField.C         |   28 +-
 .../processor/processorFvPatchField.H         |    4 +
 .../processor/processorFvPatchScalarField.C   |   14 +-
 .../processor/processorFvPatchScalarField.H   |    2 +
 .../fvMatrices/fvMatrix/fvMatrix.C            |   42 +-
 .../fvMatrices/fvMatrix/fvMatrix.H            |   33 +-
 .../fvMatrices/fvMatrix/fvMatrixSolve.C       |   53 +-
 src/finiteVolume/fvMesh/fvMesh.C              |   46 +
 src/finiteVolume/fvMesh/fvMesh.H              |   88 +-
 .../Poisson/PoissonPatchDistMethod.C          |   15 +-
 .../advectionDiffusionPatchDistMethod.C       |    7 +-
 ...lacementComponentLaplacianFvMotionSolver.C |    8 +-
 ...velocityComponentLaplacianFvMotionSolver.C |    8 +-
 .../displacementSBRStressFvMotionSolver.C     |    6 +-
 .../displacementLaplacianFvMotionSolver.C     |    8 +-
 .../surfaceAlignedSBRStressFvMotionSolver.C   |    3 +-
 .../velocityLaplacianFvMotionSolver.C         |    6 +-
 .../cyclicACMIGAMGInterfaceField.C            |    8 +-
 .../cyclicACMIGAMGInterfaceField.H            |    1 +
 .../cyclicAMIGAMGInterfaceField.C             |    8 +-
 .../cyclicAMIGAMGInterfaceField.H             |    1 +
 .../regionCoupledGAMGInterfaceField.H         |    1 +
 .../regionCoupledWallGAMGInterfaceField.H     |    1 +
 src/overset/Make/files                        |   31 +
 src/overset/Make/options                      |   15 +
 .../cellCellStencil/cellCellStencil.C         |  276 +++
 .../cellCellStencil/cellCellStencil.H         |  198 ++
 .../cellCellStencil/cellCellStencilObject.C   |   37 +
 .../cellCellStencil/cellCellStencilObject.H   |  168 ++
 .../cellVolumeWeightCellCellStencil.C         | 1107 +++++++++
 .../cellVolumeWeightCellCellStencil.H         |  242 ++
 .../inverseDistanceCellCellStencil.C          | 2059 +++++++++++++++++
 .../inverseDistanceCellCellStencil.H          |  334 +++
 .../inverseDistance/meshToMeshData.C          |   50 +
 .../inverseDistance/meshToMeshData.H          |  248 ++
 .../inverseDistance/meshToMeshDataI.H         |  242 ++
 .../inverseDistance/waveMethod.C              |  215 ++
 .../inverseDistance/waveMethod.H              |  107 +
 .../trackingInverseDistanceCellCellStencil.C  |  930 ++++++++
 .../trackingInverseDistanceCellCellStencil.H  |  162 ++
 .../trackingInverseDistance/voxelMeshSearch.C |  432 ++++
 .../trackingInverseDistance/voxelMeshSearch.H |  203 ++
 .../voxelMeshSearchTemplates.C                |  156 ++
 .../dynamicOversetFvMesh.C                    |  354 +++
 .../dynamicOversetFvMesh.H                    |  314 +++
 .../dynamicOversetFvMeshTemplates.C           |  506 ++++
 .../fvMeshPrimitiveLduAddressing.C            |  267 +++
 .../fvMeshPrimitiveLduAddressing.H            |  172 ++
 src/overset/include/createCellMask.H          |   53 +
 src/overset/include/createInterpolatedCells.H |   53 +
 src/overset/include/setCellMask.H             |   51 +
 src/overset/include/setInterpolatedCells.H    |   48 +
 .../lduPrimitiveProcessorInterface.C          |   97 +
 .../lduPrimitiveProcessorInterface.H          |  193 ++
 .../oversetAdjustPhi/oversetAdjustPhi.C       |  291 +++
 .../oversetAdjustPhi/oversetAdjustPhi.H       |   61 +
 src/overset/oversetPolyPatch/oversetFvPatch.C |  115 +
 src/overset/oversetPolyPatch/oversetFvPatch.H |  169 ++
 .../oversetPolyPatch/oversetFvPatchField.C    |  354 +++
 .../oversetPolyPatch/oversetFvPatchField.H    |  217 ++
 .../oversetPolyPatch/oversetFvPatchFields.C   |   43 +
 .../oversetPolyPatch/oversetFvPatchFields.H   |   49 +
 .../oversetPolyPatch/oversetFvsPatchFields.C  |   79 +
 .../oversetPolyPatch/oversetGAMGInterface.C   |  264 +++
 .../oversetPolyPatch/oversetGAMGInterface.H   |  202 ++
 .../oversetGAMGInterfaceField.C               |  152 ++
 .../oversetGAMGInterfaceField.H               |  124 +
 .../oversetPolyPatch/oversetLduInterface.C    |   42 +
 .../oversetPolyPatch/oversetLduInterface.H    |  111 +
 .../oversetPolyPatch/oversetPointPatch.C      |   49 +
 .../oversetPointPatchFields.C                 |   78 +
 .../oversetPolyPatch/oversetPolyPatch.C       |  159 ++
 .../oversetPolyPatch/oversetPolyPatch.H       |  185 ++
 src/overset/regionsToCell/findRefCells.C      |  274 +++
 src/overset/regionsToCell/findRefCells.H      |   74 +
 src/overset/regionsToCell/regionsToCell.C     |  484 ++++
 src/overset/regionsToCell/regionsToCell.H     |  173 ++
 .../energyRegionCoupledFvPatchScalarField.C   |    9 +-
 .../energyRegionCoupledFvPatchScalarField.H   |    2 +
 src/sampling/meshToMesh/meshToMesh.C          |   75 +-
 src/sampling/meshToMesh/meshToMesh.H          |   22 +-
 src/sampling/meshToMesh/meshToMeshI.H         |   16 +-
 src/waveModels/waveModel/waveModel.C          |    2 +-
 .../overLaplacianDyMFoam/heatTransfer/0.org/T |   49 +
 .../heatTransfer/0.org/pointDisplacement      |   43 +
 .../heatTransfer/0.org/zoneID                 |   39 +
 .../heatTransfer/Allclean                     |   13 +
 .../overLaplacianDyMFoam/heatTransfer/Allrun  |   13 +
 .../heatTransfer/Allrun.pre                   |   17 +
 .../heatTransfer/README.txt                   |    4 +
 .../heatTransfer/constant/dynamicMeshDict     |   33 +
 .../heatTransfer/constant/transportProperties |   41 +
 .../heatTransfer/system/blockMeshDict         |  126 +
 .../heatTransfer/system/controlDict           |   51 +
 .../heatTransfer/system/decomposeParDict      |   29 +
 .../heatTransfer/system/fvSchemes             |   85 +
 .../heatTransfer/system/fvSolution            |   77 +
 .../heatTransfer/system/setFieldsDict         |   48 +
 .../heatTransfer/system/topoSetDict           |   80 +
 .../overPimpleDyMFoam/cylinder/Allclean       |   10 +
 .../overPimpleDyMFoam/cylinder/Allrun         |    8 +
 .../overPimpleDyMFoam/cylinder/Allrun.pre     |    8 +
 .../overPimpleDyMFoam/cylinder/README.txt     |    8 +
 .../cylinder/cylinderAndBackground/0.org/U    |   58 +
 .../cylinderAndBackground/0.org/epsilon       |   59 +
 .../0.org/include/fixedInlet                  |   15 +
 .../0.org/include/initialConditions           |   15 +
 .../cylinder/cylinderAndBackground/0.org/k    |   54 +
 .../cylinder/cylinderAndBackground/0.org/nut  |   44 +
 .../cylinder/cylinderAndBackground/0.org/p    |   55 +
 .../0.org/pointDisplacement                   |   42 +
 .../cylinderAndBackground/0.org/zoneID        |   37 +
 .../cylinder/cylinderAndBackground/Allclean   |   14 +
 .../cylinder/cylinderAndBackground/Allrun     |    7 +
 .../cylinder/cylinderAndBackground/Allrun.pre |   20 +
 .../constant/dynamicMeshDict                  |   33 +
 .../constant/transportProperties              |   39 +
 .../constant/turbulenceProperties             |   30 +
 .../system/blockMeshDict                      |   83 +
 .../cylinderAndBackground/system/controlDict  |   51 +
 .../system/decomposeParDict                   |   30 +
 .../cylinderAndBackground/system/fvSchemes    |   72 +
 .../cylinderAndBackground/system/fvSolution   |  100 +
 .../system/setFieldsDict                      |   48 +
 .../cylinderAndBackground/system/topoSetDict  |   48 +
 .../cylinder/cylinderMesh/Allrun.pre          |    8 +
 .../constant/triSurface/cylinder.vtk          |  221 ++
 .../cylinder/cylinderMesh/system/controlDict  |   50 +
 .../cylinderMesh/system/createPatchDict       |  112 +
 .../cylinderMesh/system/extrudeMeshDict       |  136 ++
 .../cylinder/cylinderMesh/system/fvSchemes    |   58 +
 .../cylinder/cylinderMesh/system/fvSolution   |   51 +
 .../overPimpleDyMFoam/simpleRotor/0.org/U     |   62 +
 .../simpleRotor/0.org/epsilon                 |   52 +
 .../overPimpleDyMFoam/simpleRotor/0.org/k     |   51 +
 .../simpleRotor/0.org/nuTilda                 |   37 +
 .../overPimpleDyMFoam/simpleRotor/0.org/nut   |   50 +
 .../overPimpleDyMFoam/simpleRotor/0.org/p     |   64 +
 .../simpleRotor/0.org/pointDisplacement       |   41 +
 .../simpleRotor/0.org/zoneID                  |   38 +
 .../overPimpleDyMFoam/simpleRotor/Allclean    |   14 +
 .../overPimpleDyMFoam/simpleRotor/Allrun      |    6 +
 .../overPimpleDyMFoam/simpleRotor/Allrun.pre  |   19 +
 .../simpleRotor/constant/RASProperties        |   23 +
 .../simpleRotor/constant/dynamicMeshDict      |   49 +
 .../simpleRotor/constant/transportProperties  |   39 +
 .../simpleRotor/constant/turbulenceProperties |   19 +
 .../simpleRotor/system/blockMeshDict          |   97 +
 .../simpleRotor/system/controlDict            |   55 +
 .../simpleRotor/system/decomposeParDict       |   29 +
 .../simpleRotor/system/fvSchemes              |   69 +
 .../simpleRotor/system/fvSolution             |   96 +
 .../simpleRotor/system/setFieldsDict          |   48 +
 .../simpleRotor/system/topoSetDict            |   78 +
 .../overPimpleDyMFoam/twoSimpleRotors/0.org/U |   62 +
 .../overPimpleDyMFoam/twoSimpleRotors/0.org/p |   64 +
 .../twoSimpleRotors/0.org/pointDisplacement   |   41 +
 .../twoSimpleRotors/0.org/zoneID              |   37 +
 .../twoSimpleRotors/Allclean                  |   14 +
 .../overPimpleDyMFoam/twoSimpleRotors/Allrun  |   14 +
 .../twoSimpleRotors/Allrun.pre                |   17 +
 .../twoSimpleRotors/README.txt                |    3 +
 .../twoSimpleRotors/constant/dynamicMeshDict  |   51 +
 .../constant/transportProperties              |   37 +
 .../constant/turbulenceProperties             |   19 +
 .../twoSimpleRotors/system/blockMeshDict      |  140 ++
 .../twoSimpleRotors/system/controlDict        |   53 +
 .../twoSimpleRotors/system/decomposeParDict   |   30 +
 .../twoSimpleRotors/system/fvSchemes          |   68 +
 .../twoSimpleRotors/system/fvSolution         |   96 +
 .../twoSimpleRotors/system/setFieldsDict      |   57 +
 .../twoSimpleRotors/system/topoSetDict        |  116 +
 .../overSimpleFoam/aeroFoil/Allclean          |   20 +
 .../overSimpleFoam/aeroFoil/Allrun            |   10 +
 .../overSimpleFoam/aeroFoil/Allrun.pre        |   12 +
 .../overSimpleFoam/aeroFoil/README.txt        |   14 +
 .../aeroFoil/aeroFoil_overset/Allrun.pre      |   10 +
 .../constant/transportProperties              |   21 +
 .../constant/turbulenceProperties             |   28 +
 .../aeroFoil_overset/system/controlDict       |   65 +
 .../aeroFoil_overset/system/createPatchDict   |   86 +
 .../aeroFoil_overset/system/extrudeMeshDict   |   52 +
 .../aeroFoil_overset/system/fvSchemes         |   58 +
 .../aeroFoil_overset/system/fvSolution        |   77 +
 .../aeroFoil_snappyHexMesh/Allrun.pre         |    9 +
 .../constant/triSurface/wing_5degrees.obj     | 1054 +++++++++
 .../system/blockMeshDict                      |   89 +
 .../aeroFoil_snappyHexMesh/system/controlDict |   49 +
 .../system/decomposeParDict                   |   39 +
 .../aeroFoil_snappyHexMesh/system/fvSchemes   |   56 +
 .../aeroFoil_snappyHexMesh/system/fvSolution  |   49 +
 .../system/snappyHexMeshDict                  |  300 +++
 .../aeroFoil/background_overset/0.org/U       |   49 +
 .../aeroFoil/background_overset/0.org/epsilon |   50 +
 .../include/frontBackTopBottomfreePatches     |   14 +
 .../0.org/include/initialConditions           |   16 +
 .../aeroFoil/background_overset/0.org/k       |   51 +
 .../aeroFoil/background_overset/0.org/nuTilda |   32 +
 .../aeroFoil/background_overset/0.org/nut     |   40 +
 .../aeroFoil/background_overset/0.org/omega   |   50 +
 .../aeroFoil/background_overset/0.org/p       |   48 +
 .../0.org/pointDisplacement                   |   36 +
 .../aeroFoil/background_overset/0.org/zoneID  |   32 +
 .../aeroFoil/background_overset/Allclean      |   14 +
 .../aeroFoil/background_overset/Allrun        |   11 +
 .../aeroFoil/background_overset/Allrun.pre    |   15 +
 .../background_overset/constant/RASProperties |   23 +
 .../constant/dynamicMeshDict                  |   33 +
 .../constant/transportProperties              |   39 +
 .../constant/triSurface/wing_5degrees.obj     | 1054 +++++++++
 .../constant/turbulenceProperties             |   28 +
 .../background_overset/system/blockMeshDict   |   93 +
 .../background_overset/system/controlDict     |   49 +
 .../background_overset/system/createPatchDict |   48 +
 .../system/decomposeParDict                   |   39 +
 .../background_overset/system/extrudeMeshDict |   52 +
 .../background_overset/system/fvSchemes       |   95 +
 .../background_overset/system/fvSolution      |   90 +
 .../system/postProcessingDict                 |   35 +
 .../background_overset/system/setFieldsDict   |   48 +
 .../background_overset/system/topoSetDict     |   48 +
 .../background_snappyHexMesh/Allrun.pre       |   10 +
 .../constant/triSurface/wing_5degrees.obj     | 1054 +++++++++
 .../system/blockMeshDict                      |   93 +
 .../system/controlDict                        |   49 +
 .../background_snappyHexMesh/system/fvSchemes |   56 +
 .../system/fvSolution                         |   49 +
 .../system/snappyHexMeshDict                  |  290 +++
 .../overInterDyMFoam/floatingBody/Allclean    |   10 +
 .../overInterDyMFoam/floatingBody/Allrun      |   10 +
 .../overInterDyMFoam/floatingBody/Allrun.pre  |    8 +
 .../floatingBody/background/0.org/U           |   45 +
 .../floatingBody/background/0.org/alpha.water |   44 +
 .../floatingBody/background/0.org/epsilon     |   52 +
 .../floatingBody/background/0.org/k           |   46 +
 .../floatingBody/background/0.org/nut         |   51 +
 .../floatingBody/background/0.org/p_rgh       |   53 +
 .../background/0.org/pointDisplacement        |   54 +
 .../floatingBody/background/0.org/zoneID      |   42 +
 .../floatingBody/background/Allclean          |   11 +
 .../floatingBody/background/Allrun.pre        |   17 +
 .../floatingBody/background/background.foam   |    0
 .../background/constant/dynamicMeshDict       |  104 +
 .../floatingBody/background/constant/g        |   22 +
 .../background/constant/transportProperties   |   37 +
 .../background/constant/turbulenceProperties  |   30 +
 .../background/system/blockMeshDict           |   76 +
 .../background/system/controlDict             |   57 +
 .../background/system/decomposeParDict        |   29 +
 .../floatingBody/background/system/fvSchemes  |   70 +
 .../floatingBody/background/system/fvSolution |  110 +
 .../background/system/setFieldsDict           |   64 +
 .../background/system/topoSetDict             |   48 +
 .../floatingBody/floatingBody/Allclean        |   11 +
 .../floatingBody/floatingBody/Allrun.pre      |   14 +
 .../floatingBody/system/blockMeshDict         |   62 +
 .../floatingBody/system/controlDict           |   54 +
 .../floatingBody/system/fvSchemes             |   62 +
 .../floatingBody/system/fvSolution            |  139 ++
 .../floatingBody/system/setFieldsDict         |   39 +
 .../floatingBody/system/topoSetDict           |   38 +
 374 files changed, 29369 insertions(+), 579 deletions(-)
 create mode 100644 applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/Make/files
 create mode 100644 applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/Make/options
 create mode 100644 applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/createFields.H
 create mode 100644 applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/laplacianDyMFoam.C
 create mode 100644 applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/write.H
 create mode 100644 applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/Make/files
 create mode 100644 applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/Make/options
 create mode 100644 applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/correctPhi.H
 create mode 100644 applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/createControls.H
 create mode 100644 applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/createFields.H
 create mode 100644 applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/pEqn.H
 create mode 100644 applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/readControls.H
 create mode 100644 applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/rhoPimpleDyMFoam.C
 create mode 100644 applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/CourantNo.H
 create mode 100644 applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/Make/files
 create mode 100644 applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/Make/options
 create mode 100644 applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/UEqn.H
 create mode 100644 applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/continuityErrs.H
 create mode 100644 applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/correctPhi.H
 create mode 100644 applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/createControls.H
 create mode 100644 applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/createFields.H
 create mode 100644 applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/interpolatedFaces.H
 create mode 100644 applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/pEqn.H
 create mode 100644 applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/pimpleDyMFoam.C
 create mode 100644 applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/readControls.H
 create mode 100644 applications/solvers/incompressible/simpleFoam/overSimpleFoam/Make/files
 create mode 100644 applications/solvers/incompressible/simpleFoam/overSimpleFoam/Make/options
 create mode 100644 applications/solvers/incompressible/simpleFoam/overSimpleFoam/UEqn.H
 create mode 100644 applications/solvers/incompressible/simpleFoam/overSimpleFoam/continuityErrs.H
 create mode 100644 applications/solvers/incompressible/simpleFoam/overSimpleFoam/createFields.H
 create mode 100644 applications/solvers/incompressible/simpleFoam/overSimpleFoam/createOversetFields.H
 create mode 100644 applications/solvers/incompressible/simpleFoam/overSimpleFoam/createUpdatedDynamicFvMesh.H
 create mode 100644 applications/solvers/incompressible/simpleFoam/overSimpleFoam/pEqn.H
 create mode 100644 applications/solvers/incompressible/simpleFoam/overSimpleFoam/simpleFoam.C
 create mode 100644 applications/solvers/multiphase/interFoam/overInterDyMFoam/CourantNo.H
 create mode 100644 applications/solvers/multiphase/interFoam/overInterDyMFoam/Make/files
 create mode 100644 applications/solvers/multiphase/interFoam/overInterDyMFoam/Make/options
 create mode 100644 applications/solvers/multiphase/interFoam/overInterDyMFoam/UEqn.H
 create mode 100644 applications/solvers/multiphase/interFoam/overInterDyMFoam/continuityErrs.H
 create mode 100644 applications/solvers/multiphase/interFoam/overInterDyMFoam/correctPhi.H
 create mode 100644 applications/solvers/multiphase/interFoam/overInterDyMFoam/createDyMControls.H
 create mode 100644 applications/solvers/multiphase/interFoam/overInterDyMFoam/createFields.H
 create mode 100644 applications/solvers/multiphase/interFoam/overInterDyMFoam/interDyMFoam.C
 create mode 100644 applications/solvers/multiphase/interFoam/overInterDyMFoam/pEqn.H
 create mode 100644 applications/solvers/multiphase/interFoam/overInterDyMFoam/readControls.H
 create mode 100644 applications/test/parallelOverset/Make/files
 create mode 100644 applications/test/parallelOverset/Make/options
 create mode 100644 applications/test/parallelOverset/createFields.H
 create mode 100644 applications/test/parallelOverset/heatTransfer/0.org/T
 create mode 100644 applications/test/parallelOverset/heatTransfer/0.org/pointDisplacement
 create mode 100644 applications/test/parallelOverset/heatTransfer/0.org/zoneID
 create mode 100755 applications/test/parallelOverset/heatTransfer/Allclean
 create mode 100755 applications/test/parallelOverset/heatTransfer/Allrun.pre
 create mode 100644 applications/test/parallelOverset/heatTransfer/constant/dynamicMeshDict
 create mode 100644 applications/test/parallelOverset/heatTransfer/constant/transportProperties
 create mode 100644 applications/test/parallelOverset/heatTransfer/system/blockMeshDict
 create mode 100644 applications/test/parallelOverset/heatTransfer/system/controlDict
 create mode 100644 applications/test/parallelOverset/heatTransfer/system/decomposeParDict
 create mode 100644 applications/test/parallelOverset/heatTransfer/system/fvSchemes
 create mode 100644 applications/test/parallelOverset/heatTransfer/system/fvSolution
 create mode 100644 applications/test/parallelOverset/heatTransfer/system/postProcessingDict
 create mode 100644 applications/test/parallelOverset/heatTransfer/system/processorField
 create mode 100644 applications/test/parallelOverset/heatTransfer/system/setFieldsDict
 create mode 100644 applications/test/parallelOverset/heatTransfer/system/topoSetDict
 create mode 100644 applications/test/parallelOverset/laplacianDyMFoam.C
 create mode 100644 applications/test/parallelOverset/write.H
 create mode 100644 applications/test/wallDistDyM/Make/files
 create mode 100644 applications/test/wallDistDyM/Make/options
 create mode 100644 applications/test/wallDistDyM/Test-wallDistDyM.C
 create mode 100644 src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/lduInterfaceField/lduInterfaceFieldTemplates.C
 delete mode 100644 src/TurbulenceModels/compressible/turbulentFluidThermoModels/derivedFvPatchFields/turbulentTemperatureRadCoupledMixed/turbulentTemperatureRadCoupledMixedFvPatchScalarField.H.orig
 create mode 100644 src/overset/Make/files
 create mode 100644 src/overset/Make/options
 create mode 100644 src/overset/cellCellStencil/cellCellStencil/cellCellStencil.C
 create mode 100644 src/overset/cellCellStencil/cellCellStencil/cellCellStencil.H
 create mode 100644 src/overset/cellCellStencil/cellCellStencil/cellCellStencilObject.C
 create mode 100644 src/overset/cellCellStencil/cellCellStencil/cellCellStencilObject.H
 create mode 100644 src/overset/cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.C
 create mode 100644 src/overset/cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.H
 create mode 100644 src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.C
 create mode 100644 src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.H
 create mode 100644 src/overset/cellCellStencil/inverseDistance/meshToMeshData.C
 create mode 100644 src/overset/cellCellStencil/inverseDistance/meshToMeshData.H
 create mode 100644 src/overset/cellCellStencil/inverseDistance/meshToMeshDataI.H
 create mode 100644 src/overset/cellCellStencil/inverseDistance/waveMethod.C
 create mode 100644 src/overset/cellCellStencil/inverseDistance/waveMethod.H
 create mode 100644 src/overset/cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.C
 create mode 100644 src/overset/cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.H
 create mode 100644 src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.C
 create mode 100644 src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.H
 create mode 100644 src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearchTemplates.C
 create mode 100644 src/overset/dynamicOversetFvMesh/dynamicOversetFvMesh.C
 create mode 100644 src/overset/dynamicOversetFvMesh/dynamicOversetFvMesh.H
 create mode 100644 src/overset/dynamicOversetFvMesh/dynamicOversetFvMeshTemplates.C
 create mode 100644 src/overset/fvMeshPrimitiveLduAddressing/fvMeshPrimitiveLduAddressing.C
 create mode 100644 src/overset/fvMeshPrimitiveLduAddressing/fvMeshPrimitiveLduAddressing.H
 create mode 100644 src/overset/include/createCellMask.H
 create mode 100644 src/overset/include/createInterpolatedCells.H
 create mode 100644 src/overset/include/setCellMask.H
 create mode 100644 src/overset/include/setInterpolatedCells.H
 create mode 100644 src/overset/lduPrimitiveProcessorInterface/lduPrimitiveProcessorInterface.C
 create mode 100644 src/overset/lduPrimitiveProcessorInterface/lduPrimitiveProcessorInterface.H
 create mode 100644 src/overset/oversetAdjustPhi/oversetAdjustPhi.C
 create mode 100644 src/overset/oversetAdjustPhi/oversetAdjustPhi.H
 create mode 100644 src/overset/oversetPolyPatch/oversetFvPatch.C
 create mode 100644 src/overset/oversetPolyPatch/oversetFvPatch.H
 create mode 100644 src/overset/oversetPolyPatch/oversetFvPatchField.C
 create mode 100644 src/overset/oversetPolyPatch/oversetFvPatchField.H
 create mode 100644 src/overset/oversetPolyPatch/oversetFvPatchFields.C
 create mode 100644 src/overset/oversetPolyPatch/oversetFvPatchFields.H
 create mode 100644 src/overset/oversetPolyPatch/oversetFvsPatchFields.C
 create mode 100644 src/overset/oversetPolyPatch/oversetGAMGInterface.C
 create mode 100644 src/overset/oversetPolyPatch/oversetGAMGInterface.H
 create mode 100644 src/overset/oversetPolyPatch/oversetGAMGInterfaceField.C
 create mode 100644 src/overset/oversetPolyPatch/oversetGAMGInterfaceField.H
 create mode 100644 src/overset/oversetPolyPatch/oversetLduInterface.C
 create mode 100644 src/overset/oversetPolyPatch/oversetLduInterface.H
 create mode 100644 src/overset/oversetPolyPatch/oversetPointPatch.C
 create mode 100644 src/overset/oversetPolyPatch/oversetPointPatchFields.C
 create mode 100644 src/overset/oversetPolyPatch/oversetPolyPatch.C
 create mode 100644 src/overset/oversetPolyPatch/oversetPolyPatch.H
 create mode 100644 src/overset/regionsToCell/findRefCells.C
 create mode 100644 src/overset/regionsToCell/findRefCells.H
 create mode 100644 src/overset/regionsToCell/regionsToCell.C
 create mode 100644 src/overset/regionsToCell/regionsToCell.H
 create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/0.org/T
 create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/0.org/pointDisplacement
 create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/0.org/zoneID
 create mode 100755 tutorials/basic/overLaplacianDyMFoam/heatTransfer/Allclean
 create mode 100755 tutorials/basic/overLaplacianDyMFoam/heatTransfer/Allrun
 create mode 100755 tutorials/basic/overLaplacianDyMFoam/heatTransfer/Allrun.pre
 create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/README.txt
 create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/constant/dynamicMeshDict
 create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/constant/transportProperties
 create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/blockMeshDict
 create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/controlDict
 create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/decomposeParDict
 create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/fvSchemes
 create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/fvSolution
 create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/setFieldsDict
 create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/topoSetDict
 create mode 100755 tutorials/incompressible/overPimpleDyMFoam/cylinder/Allclean
 create mode 100755 tutorials/incompressible/overPimpleDyMFoam/cylinder/Allrun
 create mode 100755 tutorials/incompressible/overPimpleDyMFoam/cylinder/Allrun.pre
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/README.txt
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/U
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/epsilon
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/include/fixedInlet
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/include/initialConditions
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/k
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/nut
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/p
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/pointDisplacement
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/zoneID
 create mode 100755 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/Allclean
 create mode 100755 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/Allrun
 create mode 100755 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/Allrun.pre
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/constant/dynamicMeshDict
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/constant/transportProperties
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/constant/turbulenceProperties
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/blockMeshDict
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/controlDict
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/decomposeParDict
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/fvSchemes
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/fvSolution
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/setFieldsDict
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/topoSetDict
 create mode 100755 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/Allrun.pre
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/constant/triSurface/cylinder.vtk
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/controlDict
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/createPatchDict
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/extrudeMeshDict
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/fvSchemes
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/fvSolution
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/U
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/epsilon
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/k
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/nuTilda
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/nut
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/p
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/pointDisplacement
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/zoneID
 create mode 100755 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/Allclean
 create mode 100755 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/Allrun
 create mode 100755 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/Allrun.pre
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/RASProperties
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/dynamicMeshDict
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/transportProperties
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/turbulenceProperties
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/blockMeshDict
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/controlDict
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/decomposeParDict
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/fvSchemes
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/fvSolution
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/setFieldsDict
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/topoSetDict
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/U
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/p
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/pointDisplacement
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/zoneID
 create mode 100755 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/Allclean
 create mode 100755 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/Allrun
 create mode 100755 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/Allrun.pre
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/README.txt
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/constant/dynamicMeshDict
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/constant/transportProperties
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/constant/turbulenceProperties
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/blockMeshDict
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/controlDict
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/decomposeParDict
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/fvSchemes
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/fvSolution
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/setFieldsDict
 create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/topoSetDict
 create mode 100755 tutorials/incompressible/overSimpleFoam/aeroFoil/Allclean
 create mode 100755 tutorials/incompressible/overSimpleFoam/aeroFoil/Allrun
 create mode 100755 tutorials/incompressible/overSimpleFoam/aeroFoil/Allrun.pre
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/README.txt
 create mode 100755 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/Allrun.pre
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/constant/transportProperties
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/constant/turbulenceProperties
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/controlDict
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/createPatchDict
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/extrudeMeshDict
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/fvSchemes
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/fvSolution
 create mode 100755 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/Allrun.pre
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/constant/triSurface/wing_5degrees.obj
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/blockMeshDict
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/controlDict
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/decomposeParDict
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/fvSchemes
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/fvSolution
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/snappyHexMeshDict
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/U
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/epsilon
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/include/frontBackTopBottomfreePatches
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/include/initialConditions
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/k
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/nuTilda
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/nut
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/omega
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/p
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/pointDisplacement
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/zoneID
 create mode 100755 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/Allclean
 create mode 100755 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/Allrun
 create mode 100755 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/Allrun.pre
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/RASProperties
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/dynamicMeshDict
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/transportProperties
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/triSurface/wing_5degrees.obj
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/turbulenceProperties
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/blockMeshDict
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/controlDict
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/createPatchDict
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/decomposeParDict
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/extrudeMeshDict
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/fvSchemes
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/fvSolution
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/postProcessingDict
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/setFieldsDict
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/topoSetDict
 create mode 100755 tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/Allrun.pre
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/constant/triSurface/wing_5degrees.obj
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/blockMeshDict
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/controlDict
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/fvSchemes
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/fvSolution
 create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/snappyHexMeshDict
 create mode 100755 tutorials/multiphase/overInterDyMFoam/floatingBody/Allclean
 create mode 100755 tutorials/multiphase/overInterDyMFoam/floatingBody/Allrun
 create mode 100755 tutorials/multiphase/overInterDyMFoam/floatingBody/Allrun.pre
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/U
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/alpha.water
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/epsilon
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/k
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/nut
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/p_rgh
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/pointDisplacement
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/zoneID
 create mode 100755 tutorials/multiphase/overInterDyMFoam/floatingBody/background/Allclean
 create mode 100755 tutorials/multiphase/overInterDyMFoam/floatingBody/background/Allrun.pre
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/background.foam
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/dynamicMeshDict
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/g
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/transportProperties
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/turbulenceProperties
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/blockMeshDict
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/controlDict
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/decomposeParDict
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/fvSchemes
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/fvSolution
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/setFieldsDict
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/topoSetDict
 create mode 100755 tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/Allclean
 create mode 100755 tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/Allrun.pre
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/blockMeshDict
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/controlDict
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/fvSchemes
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/fvSolution
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/setFieldsDict
 create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/topoSetDict

diff --git a/README.md b/README.md
index aec529e09f0..fed8a6e7584 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,7 @@ OpenCFD Ltd grants use of the OpenFOAM trademark by Third Parties on a licence b
 
 Please [contact OpenCFD](http://www.openfoam.com/contact) if you have any questions on the use of the OpenFOAM trademark.
 
-Violations of the Trademark are continuously monitored, and will be duly prosecuted. 
+Violations of the Trademark are continuously monitored, and will be duly prosecuted.
 
 
 # Useful Links
diff --git a/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/Make/files b/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/Make/files
new file mode 100644
index 00000000000..0c6257a79d7
--- /dev/null
+++ b/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/Make/files
@@ -0,0 +1,3 @@
+laplacianDyMFoam.C
+
+EXE = $(FOAM_APPBIN)/overLaplacianDyMFoam
diff --git a/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/Make/options b/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/Make/options
new file mode 100644
index 00000000000..149f9694b6d
--- /dev/null
+++ b/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/Make/options
@@ -0,0 +1,8 @@
+EXE_INC = \
+    -I$(LIB_SRC)/finiteVolume/lnInclude \
+    -I$(LIB_SRC)/dynamicFvMesh/lnInclude \
+    -I$(LIB_SRC)/overset/lnInclude \
+    -I$(LIB_SRC)/meshTools/lnInclude
+
+EXE_LIBS = \
+    -loverset
diff --git a/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/createFields.H b/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/createFields.H
new file mode 100644
index 00000000000..d14935caab6
--- /dev/null
+++ b/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/createFields.H
@@ -0,0 +1,53 @@
+    Info<< "Reading field T\n" << endl;
+
+    volScalarField T
+    (
+        IOobject
+        (
+            "T",
+            runTime.timeName(),
+            mesh,
+            IOobject::MUST_READ,
+            IOobject::AUTO_WRITE
+        ),
+        mesh
+    );
+
+    // Add overset specific interpolations
+    {
+        dictionary oversetDict;
+        oversetDict.add("T", true);
+
+        const_cast<dictionary&>
+        (
+            mesh.schemesDict()
+        ).add
+        (
+            "oversetInterpolationRequired",
+            oversetDict,
+            true
+        );
+    }
+
+
+    Info<< "Reading transportProperties\n" << endl;
+
+    IOdictionary transportProperties
+    (
+        IOobject
+        (
+            "transportProperties",
+            runTime.constant(),
+            mesh,
+            IOobject::MUST_READ_IF_MODIFIED,
+            IOobject::NO_WRITE
+        )
+    );
+
+
+    Info<< "Reading diffusivity DT\n" << endl;
+
+    dimensionedScalar DT
+    (
+        transportProperties.lookup("DT")
+    );
diff --git a/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/laplacianDyMFoam.C b/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/laplacianDyMFoam.C
new file mode 100644
index 00000000000..7bcd6b6cb60
--- /dev/null
+++ b/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/laplacianDyMFoam.C
@@ -0,0 +1,110 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2015 OpenFOAM Foundation
+     \\/     M anipulation  | Copyright (C) 2016-2017 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Application
+    laplacianFoam
+
+Group
+    grpBasicSolvers
+
+Description
+    Laplace equation solver for a scalar quantity.
+
+    \heading Solver details
+    The solver is applicable to, e.g. for thermal diffusion in a solid.  The
+    equation is given by:
+
+    \f[
+        \ddt{T}  = \div \left( D_T \grad T \right)
+    \f]
+
+    Where:
+    \vartable
+        T     | Scalar field which is solved for, e.g. temperature
+        D_T   | Diffusion coefficient
+    \endvartable
+
+    \heading Required fields
+    \plaintable
+        T     | Scalar field which is solved for, e.g. temperature
+    \endplaintable
+
+\*---------------------------------------------------------------------------*/
+
+#include "fvCFD.H"
+#include "fvOptions.H"
+#include "simpleControl.H"
+#include "dynamicFvMesh.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+int main(int argc, char *argv[])
+{
+    #include "setRootCase.H"
+
+    #include "createTime.H"
+    #include "createNamedDynamicFvMesh.H"
+
+    simpleControl simple(mesh);
+
+    #include "createFields.H"
+    #include "createFvOptions.H"
+
+    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+    Info<< "\nCalculating temperature distribution\n" << endl;
+
+    while (simple.loop())
+    {
+        Info<< "Time = " << runTime.timeName() << nl << endl;
+
+        mesh.update();
+
+        while (simple.correctNonOrthogonal())
+        {
+            fvScalarMatrix TEqn
+            (
+                fvm::ddt(T) - fvm::laplacian(DT, T)
+             ==
+                fvOptions(T)
+            );
+
+            fvOptions.constrain(TEqn);
+            TEqn.solve();
+            fvOptions.correct(T);
+        }
+
+        #include "write.H"
+
+        Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
+            << "  ClockTime = " << runTime.elapsedClockTime() << " s"
+            << nl << endl;
+    }
+
+    Info<< "End\n" << endl;
+
+    return 0;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/write.H b/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/write.H
new file mode 100644
index 00000000000..47aa182c0a9
--- /dev/null
+++ b/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/write.H
@@ -0,0 +1,46 @@
+    if (runTime.outputTime())
+    {
+        volVectorField gradT(fvc::grad(T));
+
+        volScalarField gradTx
+        (
+            IOobject
+            (
+                "gradTx",
+                runTime.timeName(),
+                mesh,
+                IOobject::NO_READ,
+                IOobject::AUTO_WRITE
+            ),
+            gradT.component(vector::X)
+        );
+
+        volScalarField gradTy
+        (
+            IOobject
+            (
+                "gradTy",
+                runTime.timeName(),
+                mesh,
+                IOobject::NO_READ,
+                IOobject::AUTO_WRITE
+            ),
+            gradT.component(vector::Y)
+        );
+
+        volScalarField gradTz
+        (
+            IOobject
+            (
+                "gradTz",
+                runTime.timeName(),
+                mesh,
+                IOobject::NO_READ,
+                IOobject::AUTO_WRITE
+            ),
+            gradT.component(vector::Z)
+        );
+
+
+        runTime.write();
+    }
diff --git a/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/Make/files b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/Make/files
new file mode 100644
index 00000000000..3d96a548d05
--- /dev/null
+++ b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/Make/files
@@ -0,0 +1,3 @@
+rhoPimpleDyMFoam.C
+
+EXE = $(FOAM_APPBIN)/overRhoPimpleDyMFoam
diff --git a/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/Make/options b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/Make/options
new file mode 100644
index 00000000000..ca5b141675b
--- /dev/null
+++ b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/Make/options
@@ -0,0 +1,25 @@
+EXE_INC = \
+    -I.. \
+    -I$(LIB_SRC)/transportModels/compressible/lnInclude \
+    -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
+    -I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \
+    -I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude \
+    -I$(LIB_SRC)/finiteVolume/cfdTools \
+    -I$(LIB_SRC)/finiteVolume/lnInclude \
+    -I$(LIB_SRC)/meshTools/lnInclude \
+    -I$(LIB_SRC)/sampling/lnInclude \
+    -I$(LIB_SRC)/dynamicFvMesh/lnInclude \
+    -I$(LIB_SRC)/dynamicMesh/lnInclude \
+    -I$(LIB_SRC)/overset/lnInclude \
+    -I$(LIB_SRC)/meshTools/lnInclude \
+
+EXE_LIBS = \
+    -lcompressibleTransportModels \
+    -lfluidThermophysicalModels \
+    -lspecie \
+    -lturbulenceModels \
+    -lcompressibleTurbulenceModels \
+    -loverset \
+    -lfvOptions \
+    -ldynamicFvMesh \
+    -ltopoChangerFvMesh
diff --git a/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/correctPhi.H b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/correctPhi.H
new file mode 100644
index 00000000000..37072312ff8
--- /dev/null
+++ b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/correctPhi.H
@@ -0,0 +1,11 @@
+CorrectPhi
+(
+    U,
+    phi,
+    p,
+    rho,
+    psi,
+    dimensionedScalar("rAUf", dimTime, 1),
+    divrhoU,
+    pimple
+);
diff --git a/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/createControls.H b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/createControls.H
new file mode 100644
index 00000000000..aed0e76956b
--- /dev/null
+++ b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/createControls.H
@@ -0,0 +1,11 @@
+#include "createTimeControls.H"
+
+bool correctPhi
+(
+    pimple.dict().lookupOrDefault<Switch>("correctPhi", true)
+);
+
+bool checkMeshCourantNo
+(
+    pimple.dict().lookupOrDefault<Switch>("checkMeshCourantNo", false)
+);
diff --git a/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/createFields.H b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/createFields.H
new file mode 100644
index 00000000000..27f568bce70
--- /dev/null
+++ b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/createFields.H
@@ -0,0 +1,117 @@
+Info<< "Reading thermophysical properties\n" << endl;
+
+autoPtr<psiThermo> pThermo
+(
+    psiThermo::New(mesh)
+);
+psiThermo& thermo = pThermo();
+thermo.validate(args.executable(), "h", "e");
+
+volScalarField& p = thermo.p();
+const volScalarField& psi = thermo.psi();
+
+volScalarField rho
+(
+    IOobject
+    (
+        "rho",
+        runTime.timeName(),
+        mesh,
+        IOobject::READ_IF_PRESENT,
+        IOobject::AUTO_WRITE
+    ),
+    thermo.rho()
+);
+
+Info<< "Reading field U\n" << endl;
+volVectorField U
+(
+    IOobject
+    (
+        "U",
+        runTime.timeName(),
+        mesh,
+        IOobject::MUST_READ,
+        IOobject::AUTO_WRITE
+    ),
+    mesh
+);
+
+#include "compressibleCreatePhi.H"
+
+dimensionedScalar rhoMax
+(
+    dimensionedScalar::lookupOrDefault
+    (
+        "rhoMax",
+        pimple.dict(),
+        dimDensity,
+        GREAT
+    )
+);
+
+dimensionedScalar rhoMin
+(
+    dimensionedScalar::lookupOrDefault
+    (
+        "rhoMin",
+        pimple.dict(),
+        dimDensity,
+        0
+    )
+);
+
+Info<< "Creating turbulence model\n" << endl;
+autoPtr<compressible::turbulenceModel> turbulence
+(
+    compressible::turbulenceModel::New
+    (
+        rho,
+        U,
+        phi,
+        thermo
+    )
+);
+
+mesh.setFluxRequired(p.name());
+
+Info<< "Creating field dpdt\n" << endl;
+volScalarField dpdt
+(
+    IOobject
+    (
+        "dpdt",
+        runTime.timeName(),
+        mesh
+    ),
+    mesh,
+    dimensionedScalar("dpdt", p.dimensions()/dimTime, 0)
+);
+
+Info<< "Creating field kinetic energy K\n" << endl;
+volScalarField K("K", 0.5*magSqr(U));
+
+
+//- Overset specific
+
+// Add solver-specific interpolations
+{
+    dictionary oversetDict;
+    oversetDict.add("U", true);
+    oversetDict.add("p", true);
+    oversetDict.add("HbyA", true);
+    oversetDict.add("grad(p)", true);
+
+    const_cast<dictionary&>
+    (
+        mesh.schemesDict()
+    ).add
+    (
+        "oversetInterpolationRequired",
+        oversetDict,
+        true
+    );
+}
+
+// Mask field for zeroing out contributions on hole cells
+#include "createCellMask.H"
diff --git a/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/pEqn.H b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/pEqn.H
new file mode 100644
index 00000000000..5f1fc7451c2
--- /dev/null
+++ b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/pEqn.H
@@ -0,0 +1,123 @@
+rho = thermo.rho();
+rho = max(rho, rhoMin);
+rho = min(rho, rhoMax);
+rho.relax();
+
+surfaceScalarField faceMask(localMin<scalar>(mesh).interpolate(cellMask));
+
+volScalarField rAU(1.0/UEqn.A());
+surfaceScalarField rhorAUf("rhorAUf", faceMask*fvc::interpolate(rho*rAU));
+volVectorField HbyA("HbyA", constrainHbyA(rAU*UEqn.H(), U, p));
+//mesh.interpolate(HbyA);
+
+if (pimple.nCorrPISO() <= 1)
+{
+    tUEqn.clear();
+}
+
+if (pimple.transonic())
+{
+    surfaceScalarField phid
+    (
+        "phid",
+        fvc::interpolate(psi)
+       *(
+            fvc::flux(HbyA)
+          + rhorAUf*fvc::ddtCorr(rho, U, rhoUf)/fvc::interpolate(rho)
+        )
+    );
+
+    fvc::makeRelative(phid, psi, U);
+    MRF.makeRelative(fvc::interpolate(psi), phid);
+
+    while (pimple.correctNonOrthogonal())
+    {
+        fvScalarMatrix pEqn
+        (
+            fvm::ddt(psi, p)
+          + fvm::div(phid, p)
+          - fvm::laplacian(rhorAUf, p)
+         ==
+            fvOptions(psi, p, rho.name())
+        );
+
+        pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
+
+        if (pimple.finalNonOrthogonalIter())
+        {
+            phi == pEqn.flux();
+        }
+    }
+}
+else
+{
+    surfaceScalarField phiHbyA
+    (
+        "phiHbyA",
+        fvc::flux(rho*HbyA)
+      + rhorAUf*fvc::ddtCorr(rho, U, rhoUf)
+    );
+
+    fvc::makeRelative(phiHbyA, rho, U);
+    MRF.makeRelative(fvc::interpolate(rho), phiHbyA);
+
+    // Update the pressure BCs to ensure flux consistency
+    constrainPressure(p, rho, U, phiHbyA, rhorAUf, MRF);
+
+    while (pimple.correctNonOrthogonal())
+    {
+        // Pressure corrector
+        fvScalarMatrix pEqn
+        (
+            fvm::ddt(psi, p)
+          + fvc::div(phiHbyA)
+          - fvm::laplacian(rhorAUf, p)
+         ==
+            fvOptions(psi, p, rho.name())
+        );
+
+        pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
+
+        if (pimple.finalNonOrthogonalIter())
+        {
+            phi = phiHbyA + pEqn.flux();
+        }
+    }
+}
+
+#include "rhoEqn.H"
+#include "compressibleContinuityErrs.H"
+
+// Explicitly relax pressure for momentum corrector
+p.relax();
+
+// Recalculate density from the relaxed pressure
+rho = thermo.rho();
+rho = max(rho, rhoMin);
+rho = min(rho, rhoMax);
+rho.relax();
+Info<< "rho max/min : " << max(rho).value()
+    << " " << min(rho).value() << endl;
+
+volVectorField gradP(fvc::grad(p));
+//mesh.interpolate(gradP);
+U = HbyA - rAU*cellMask*gradP;
+U.correctBoundaryConditions();
+fvOptions.correct(U);
+K = 0.5*magSqr(U);
+
+{
+    rhoUf = fvc::interpolate(rho*U);
+    surfaceVectorField n(mesh.Sf()/mesh.magSf());
+    rhoUf += n*(fvc::absolute(phi, rho, U)/mesh.magSf() - (n & rhoUf));
+}
+
+if (thermo.dpdt())
+{
+    dpdt = fvc::ddt(p);
+
+    if (mesh.moving())
+    {
+        dpdt -= fvc::div(fvc::meshPhi(rho, U), p);
+    }
+}
diff --git a/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/readControls.H b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/readControls.H
new file mode 100644
index 00000000000..ed2db49fb4d
--- /dev/null
+++ b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/readControls.H
@@ -0,0 +1,6 @@
+#include "readTimeControls.H"
+
+correctPhi = pimple.dict().lookupOrDefault<Switch>("correctPhi", true);
+
+checkMeshCourantNo =
+    pimple.dict().lookupOrDefault<Switch>("checkMeshCourantNo", false);
diff --git a/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/rhoPimpleDyMFoam.C b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/rhoPimpleDyMFoam.C
new file mode 100644
index 00000000000..0bbcefa14bc
--- /dev/null
+++ b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/rhoPimpleDyMFoam.C
@@ -0,0 +1,173 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2015 OpenFOAM Foundation
+     \\/     M anipulation  | Copyright (C) 2016-2017 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Application
+    rhoPimpleFoam
+
+Group
+    grpCompressibleSolvers grpMovingMeshSolvers
+
+Description
+    Transient solver for laminar or turbulent flow of compressible fluids
+    for HVAC and similar applications.
+
+    Uses the flexible PIMPLE (PISO-SIMPLE) solution for time-resolved and
+    pseudo-transient simulations.
+
+\*---------------------------------------------------------------------------*/
+
+#include "fvCFD.H"
+#include "dynamicFvMesh.H"
+#include "psiThermo.H"
+#include "turbulentFluidThermoModel.H"
+#include "bound.H"
+#include "pimpleControl.H"
+#include "CorrectPhi.H"
+#include "fvOptions.H"
+#include "localEulerDdtScheme.H"
+#include "fvcSmooth.H"
+#include "cellCellStencilObject.H"
+#include "localMin.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+int main(int argc, char *argv[])
+{
+    #include "setRootCase.H"
+    #include "createTime.H"
+    #include "createDynamicFvMesh.H"
+
+    pimpleControl pimple(mesh);
+
+    #include "createRDeltaT.H"
+    #include "initContinuityErrs.H"
+    #include "createFields.H"
+    #include "createMRF.H"
+    #include "createFvOptions.H"
+    #include "createRhoUf.H"
+    #include "createControls.H"
+
+    turbulence->validate();
+
+    if (!LTS)
+    {
+        #include "compressibleCourantNo.H"
+        #include "setInitialDeltaT.H"
+    }
+
+    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+    Info<< "\nStarting time loop\n" << endl;
+
+    while (runTime.run())
+    {
+        #include "readControls.H"
+
+        {
+            // Store divrhoU from the previous mesh so that it can be mapped
+            // and used in correctPhi to ensure the corrected phi has the
+            // same divergence
+            volScalarField divrhoU
+            (
+                "divrhoU",
+                fvc::div(fvc::absolute(phi, rho, U))
+            );
+
+            if (LTS)
+            {
+                #include "setRDeltaT.H"
+            }
+            else
+            {
+                #include "compressibleCourantNo.H"
+                #include "setDeltaT.H"
+            }
+
+            runTime++;
+
+            Info<< "Time = " << runTime.timeName() << nl << endl;
+
+            // Store momentum to set rhoUf for introduced faces.
+            volVectorField rhoU("rhoU", rho*U);
+
+            // Do any mesh changes
+            mesh.update();
+
+            if (mesh.changing())
+            {
+                #include "setCellMask.H"
+            }
+
+            if (mesh.changing() && correctPhi)
+            {
+                // Calculate absolute flux from the mapped surface velocity
+                phi = mesh.Sf() & rhoUf;
+
+                #include "correctPhi.H"
+
+                // Make the fluxes relative to the mesh-motion
+                fvc::makeRelative(phi, rho, U);
+            }
+        }
+
+        if (mesh.changing() && checkMeshCourantNo)
+        {
+            #include "meshCourantNo.H"
+        }
+
+        #include "rhoEqn.H"
+        Info<< "rhoEqn max/min : " << max(rho).value()
+            << " " << min(rho).value() << endl;
+
+        // --- Pressure-velocity PIMPLE corrector loop
+        while (pimple.loop())
+        {
+            #include "UEqn.H"
+            #include "EEqn.H"
+
+            // --- Pressure corrector loop
+            while (pimple.correct())
+            {
+                #include "pEqn.H"
+            }
+
+            if (pimple.turbCorr())
+            {
+                turbulence->correct();
+            }
+        }
+
+        runTime.write();
+
+        Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
+            << "  ClockTime = " << runTime.elapsedClockTime() << " s"
+            << nl << endl;
+    }
+
+    Info<< "End\n" << endl;
+
+    return 0;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/CourantNo.H b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/CourantNo.H
new file mode 100644
index 00000000000..6353e7908fb
--- /dev/null
+++ b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/CourantNo.H
@@ -0,0 +1,50 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Global
+    CourantNo
+
+Description
+    Calculates and outputs the mean and maximum Courant Numbers.
+
+\*---------------------------------------------------------------------------*/
+
+scalar CoNum = 0.0;
+scalar meanCoNum = 0.0;
+
+if (mesh.nInternalFaces())
+{
+    surfaceScalarField phiMask(localMin<scalar>(mesh).interpolate(cellMask));
+
+    scalarField sumPhi(fvc::surfaceSum(mag(phiMask*phi))().internalField());
+
+    CoNum = 0.5*gMax(sumPhi/mesh.V().field())*runTime.deltaTValue();
+
+    meanCoNum =
+        0.5*(gSum(sumPhi)/gSum(mesh.V().field()))*runTime.deltaTValue();
+}
+
+Info<< "Courant Number mean: " << meanCoNum
+    << " max: " << CoNum << endl;
+
+// ************************************************************************* //
diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/Make/files b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/Make/files
new file mode 100644
index 00000000000..7c557aba244
--- /dev/null
+++ b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/Make/files
@@ -0,0 +1,3 @@
+pimpleDyMFoam.C
+
+EXE = $(FOAM_APPBIN)/overPimpleDyMFoam
diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/Make/options b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/Make/options
new file mode 100644
index 00000000000..c538a99b574
--- /dev/null
+++ b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/Make/options
@@ -0,0 +1,24 @@
+EXE_INC = \
+    -I.. \
+    -I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \
+    -I$(LIB_SRC)/TurbulenceModels/incompressible/lnInclude \
+    -I$(LIB_SRC)/transportModels \
+    -I$(LIB_SRC)/transportModels/incompressible/singlePhaseTransportModel \
+    -I$(LIB_SRC)/finiteVolume/lnInclude \
+    -I$(LIB_SRC)/sampling/lnInclude \
+    -I$(LIB_SRC)/dynamicFvMesh/lnInclude \
+    -I$(LIB_SRC)/dynamicMesh/lnInclude \
+    -I$(LIB_SRC)/overset/lnInclude \
+    -I$(LIB_SRC)/meshTools/lnInclude \
+
+EXE_LIBS = \
+    -lturbulenceModels \
+    -lincompressibleTurbulenceModels \
+    -lincompressibleTransportModels \
+    -lfiniteVolume \
+    -lfvOptions \
+    -lsampling \
+    -ldynamicFvMesh \
+    -ltopoChangerFvMesh \
+    -ldynamicMesh \
+    -loverset
diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/UEqn.H b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/UEqn.H
new file mode 100644
index 00000000000..aef0116f7b3
--- /dev/null
+++ b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/UEqn.H
@@ -0,0 +1,24 @@
+// Solve the Momentum equation
+
+MRF.correctBoundaryVelocity(U);
+
+tmp<fvVectorMatrix> tUEqn
+(
+    fvm::ddt(U) + fvm::div(phi, U)
+  + MRF.DDt(U)
+  + turbulence->divDevReff(U)
+ ==
+    fvOptions(U)
+);
+fvVectorMatrix& UEqn = tUEqn.ref();
+
+UEqn.relax();
+
+fvOptions.constrain(UEqn);
+
+if (pimple.momentumPredictor())
+{
+    solve(UEqn == -cellMask*fvc::grad(p));
+
+    fvOptions.correct(U);
+}
diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/continuityErrs.H b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/continuityErrs.H
new file mode 100644
index 00000000000..c7870556230
--- /dev/null
+++ b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/continuityErrs.H
@@ -0,0 +1,48 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Global
+    continuityErrs
+
+Description
+    Calculates and prints the continuity errors.
+
+\*---------------------------------------------------------------------------*/
+
+{
+    volScalarField contErr(interpolatedCells*cellMask*fvc::div(phi));
+
+    scalar sumLocalContErr = runTime.deltaTValue()*
+        mag(contErr)().weightedAverage(mesh.V()).value();
+
+    scalar globalContErr = runTime.deltaTValue()*
+        contErr.weightedAverage(mesh.V()).value();
+    cumulativeContErr += globalContErr;
+
+    Info<< "time step continuity errors : sum local = " << sumLocalContErr
+        << ", global = " << globalContErr
+        << ", cumulative = " << cumulativeContErr
+        << endl;
+}
+
+// ************************************************************************* //
diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/correctPhi.H b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/correctPhi.H
new file mode 100644
index 00000000000..1951316f46a
--- /dev/null
+++ b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/correctPhi.H
@@ -0,0 +1,113 @@
+if (mesh.changing())
+{
+    volVectorField::Boundary& bfld = U.boundaryFieldRef();
+    forAll(bfld, patchi)
+    {
+        if (bfld[patchi].fixesValue())
+        {
+            bfld[patchi].initEvaluate();
+        }
+    }
+
+    surfaceScalarField::Boundary& phiBfld = phi.boundaryFieldRef();
+    forAll(bfld, patchi)
+    {
+        if (bfld[patchi].fixesValue())
+        {
+            bfld[patchi].evaluate();
+
+            phiBfld[patchi] = bfld[patchi] & mesh.Sf().boundaryField()[patchi];
+        }
+    }
+}
+    // Initialize BCs list for pcorr to zero-gradient
+    wordList pcorrTypes
+    (
+        p.boundaryField().size(),
+        zeroGradientFvPatchScalarField::typeName
+    );
+
+    // Set BCs of pcorr to fixed-value for patches at which p is fixed
+    forAll(p.boundaryField(), patchi)
+    {
+        if (p.boundaryField()[patchi].fixesValue())
+        {
+            pcorrTypes[patchi] = fixedValueFvPatchScalarField::typeName;
+        }
+    }
+
+    volScalarField pcorr
+    (
+        IOobject
+        (
+            "pcorr",
+            runTime.timeName(),
+            mesh,
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        mesh,
+        dimensionedScalar("pcorr", p.dimensions(), 0.0),
+        pcorrTypes
+    );
+
+{
+    dimensionedScalar rAUf("rAUf", dimTime, 1.0);
+
+    const cellCellStencilObject& overlap = Stencil::New(mesh);
+    const labelList& cellTypes = overlap.cellTypes();
+    const labelIOList& zoneIDs = overlap.zoneID();
+
+    while (pimple.correctNonOrthogonal())
+    {
+        label nZones = gMax(zoneIDs)+1;
+
+        //label refCellI2 = -1;
+        labelList refCells(nZones, -1);
+        labelList refZones(nZones, -1);
+
+        forAll(zoneIDs, cellI)
+        {
+            label zoneId = zoneIDs[cellI];
+            if
+            (
+                refCells[zoneId] == -1
+             && cellTypes[cellI] == cellCellStencil::CALCULATED
+             && refZones[zoneId] == -1
+            )
+            {
+                refCells[zoneId] = cellI;
+                refZones[zoneId] = zoneId;
+            }
+        }
+
+        fvScalarMatrix pcorrEqn
+        (
+            fvm::laplacian(rAUf, pcorr) == fvc::div(phi)
+        );
+
+        //pcorrEqn.setReference(refCellI2, 0.0, true);
+        scalarList values(nZones, 0.0);
+        pcorrEqn.setReferences(refCells, values, true);
+
+        const dictionary& d = mesh.solver
+        (
+            pcorr.select
+            (
+                pimple.finalInnerIter()
+            )
+        );
+        mesh.fvMesh::solve(pcorrEqn, d);
+
+        if (pimple.finalNonOrthogonalIter())
+        {
+            phi -= pcorrEqn.flux();
+        }
+    }
+
+    if (runTime.outputTime())
+    {
+        volScalarField("contPhiPcorr", fvc::div(phi)).write();
+        pcorr.write();
+    }
+}
diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/createControls.H b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/createControls.H
new file mode 100644
index 00000000000..53ed2009c74
--- /dev/null
+++ b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/createControls.H
@@ -0,0 +1,26 @@
+#include "createTimeControls.H"
+
+bool correctPhi
+(
+    pimple.dict().lookupOrDefault("correctPhi", false)
+);
+
+bool checkMeshCourantNo
+(
+    pimple.dict().lookupOrDefault("checkMeshCourantNo", false)
+);
+
+bool massFluxInterpolation
+(
+    pimple.dict().lookupOrDefault("massFluxInterpolation", false)
+);
+
+bool adjustFringe
+(
+    pimple.dict().lookupOrDefault("oversetAdjustPhi", false)
+);
+
+bool ddtCorr
+(
+    pimple.dict().lookupOrDefault("ddtCorr", true)
+);
diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/createFields.H b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/createFields.H
new file mode 100644
index 00000000000..ba991bfd484
--- /dev/null
+++ b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/createFields.H
@@ -0,0 +1,70 @@
+Info<< "Reading field p\n" << endl;
+volScalarField p
+(
+    IOobject
+    (
+        "p",
+        runTime.timeName(),
+        mesh,
+        IOobject::MUST_READ,
+        IOobject::AUTO_WRITE
+    ),
+    mesh
+);
+
+Info<< "Reading field U\n" << endl;
+volVectorField U
+(
+    IOobject
+    (
+        "U",
+        runTime.timeName(),
+        mesh,
+        IOobject::MUST_READ,
+        IOobject::AUTO_WRITE
+    ),
+    mesh
+);
+
+#include "createPhi.H"
+
+
+label pRefCell = 0;
+scalar pRefValue = 0.0;
+setRefCell(p, pimple.dict(), pRefCell, pRefValue);
+mesh.setFluxRequired(p.name());
+
+
+//- Overset specific
+
+// Add solver-specific interpolations
+{
+    dictionary oversetDict;
+    oversetDict.add("U", true);
+    oversetDict.add("p", true);
+    oversetDict.add("HbyA", true);
+    oversetDict.add("grad(p)", true);
+
+    const_cast<dictionary&>
+    (
+        mesh.schemesDict()
+    ).add
+    (
+        "oversetInterpolationRequired",
+        oversetDict,
+        true
+    );
+}
+
+// Mask field for zeroing out contributions on hole cells
+#include "createCellMask.H"
+
+// Create bool field with interpolated cells
+#include "createInterpolatedCells.H"
+
+singlePhaseTransportModel laminarTransport(U, phi);
+
+autoPtr<incompressible::turbulenceModel> turbulence
+(
+    incompressible::turbulenceModel::New(U, phi, laminarTransport)
+);
diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/interpolatedFaces.H b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/interpolatedFaces.H
new file mode 100644
index 00000000000..e13a2cc0a7c
--- /dev/null
+++ b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/interpolatedFaces.H
@@ -0,0 +1,269 @@
+// Interpolation used
+interpolationCellPoint<vector> UInterpolator(HbyA);
+
+// Determine faces on outside of interpolated cells
+PackedBoolList isOwnerInterpolatedFace(mesh.nInternalFaces());
+PackedBoolList isNeiInterpolatedFace(mesh.nInternalFaces());
+
+// Determine donor cells
+labelListList donorCell(mesh.nInternalFaces());
+
+scalarListList weightCellCells(mesh.nInternalFaces());
+
+// Interpolated HbyA faces
+vectorField UIntFaces(mesh.nInternalFaces(), vector::zero);
+
+// Determine receptor neighbourd cells
+labelList receptorNeigCell(mesh.nInternalFaces(), -1);
+
+{
+    const cellCellStencilObject& overlap = Stencil::New(mesh);
+    const labelList& cellTypes = overlap.cellTypes();
+    const labelIOList& zoneID = overlap.zoneID();
+
+    label nZones = gMax(zoneID)+1;
+    PtrList<fvMeshSubset> meshParts(nZones);
+    labelList nCellsPerZone(nZones, 0);
+
+    forAll(nCellsPerZone, zoneI)
+    {
+        meshParts.set(zoneI, new fvMeshSubset(mesh));
+        meshParts[zoneI].setLargeCellSubset(zoneID, zoneI);
+    }
+
+    for (label faceI = 0; faceI < mesh.nInternalFaces(); faceI++)
+    {
+        label ownType = cellTypes[mesh.faceOwner()[faceI]];
+        label neiType = cellTypes[mesh.faceNeighbour()[faceI]];
+        if
+        (
+            ownType == cellCellStencil::INTERPOLATED
+            && neiType == cellCellStencil::CALCULATED
+        )
+        {
+            isOwnerInterpolatedFace[faceI] = true;
+
+            const vector& fc = mesh.faceCentres()[faceI];
+
+            for (label zoneI = 0; zoneI < nZones; zoneI++)
+            {
+                if (zoneI != zoneID[mesh.faceOwner()[faceI]])
+                {
+                    const fvMesh& partMesh = meshParts[zoneI].subMesh();
+                    const labelList& cellMap = meshParts[zoneI].cellMap();
+                    label cellI = partMesh.findCell(fc);
+
+                    if (cellI != -1)
+                    {
+                         // Determine weights
+                        labelList stencil(partMesh.cellCells()[cellI]);
+
+                        stencil.append(cellI);
+
+                        label st = stencil.size();
+
+                        donorCell[faceI].setSize(st);
+
+                        weightCellCells[faceI].setSize(st);
+
+                        scalarField weights(st);
+
+                        forAll(stencil, i)
+                        {
+                            scalar d = mag
+                            (
+                                partMesh.cellCentres()[stencil[i]]
+                              - fc
+                            );
+                            weights[i] = 1.0/d;
+                            donorCell[faceI][i] = cellMap[stencil[i]];
+                        }
+                        weights /= sum(weights);
+
+                        weightCellCells[faceI] = weights;
+
+                        forAll(stencil, i)
+                        {
+                            UIntFaces[faceI] +=
+                                weightCellCells[faceI][i]
+                               *UInterpolator.interpolate
+                                (
+                                    fc,
+                                    donorCell[faceI][i]
+                                );
+                        }
+
+                        break;
+                    }
+                }
+            }
+
+            receptorNeigCell[faceI] = mesh.faceNeighbour()[faceI];
+        }
+        else if
+        (
+            ownType == cellCellStencil::CALCULATED
+            && neiType == cellCellStencil::INTERPOLATED
+        )
+        {
+            isNeiInterpolatedFace[faceI] = true;
+
+            const vector& fc = mesh.faceCentres()[faceI];
+            for (label zoneI = 0; zoneI < nZones; zoneI++)
+            {
+                if (zoneI != zoneID[mesh.faceNeighbour()[faceI]])
+                {
+                    const fvMesh& partMesh = meshParts[zoneI].subMesh();
+                    const labelList& cellMap = meshParts[zoneI].cellMap();
+                    label cellI = partMesh.findCell(fc);
+
+                    if (cellI != -1)
+                    {
+                        // Determine weights
+                        labelList stencil(partMesh.cellCells()[cellI]);
+
+                        stencil.append(cellI);
+
+                        label st = stencil.size();
+
+                        donorCell[faceI].setSize(st);
+
+                        weightCellCells[faceI].setSize(st);
+
+                        scalarField weights(st);
+
+                        forAll(stencil, i)
+                        {
+                            scalar d = mag
+                            (
+                                partMesh.cellCentres()[stencil[i]]
+                              - fc
+                            );
+                            weights[i] = 1.0/d;
+                            donorCell[faceI][i] = cellMap[stencil[i]];
+                        }
+                        weights /= sum(weights);
+
+                        weightCellCells[faceI] = weights;
+
+                        forAll(stencil, i)
+                        {
+                            UIntFaces[faceI] +=
+                                weightCellCells[faceI][i]
+                               *UInterpolator.interpolate
+                                (
+                                    fc,
+                                    donorCell[faceI][i]
+                                );
+                        }
+
+                        break;
+                    }
+                }
+            }
+
+            receptorNeigCell[faceI] = mesh.faceOwner()[faceI];
+        }
+    }
+}
+
+// contravariant U
+vectorField U1Contrav(mesh.nInternalFaces(), vector::zero);
+
+surfaceVectorField faceNormals(mesh.Sf()/mesh.magSf());
+
+forAll(isNeiInterpolatedFace, faceI)
+{
+    label cellId = -1;
+    if (isNeiInterpolatedFace[faceI])
+    {
+        cellId = mesh.faceNeighbour()[faceI];
+    }
+    else if (isOwnerInterpolatedFace[faceI])
+    {
+        cellId = mesh.faceOwner()[faceI];
+    }
+
+    if (cellId != -1)
+    {
+        const vector& n = faceNormals[faceI];
+        vector n1 = vector::zero;
+        // 2-D cases
+        if (mesh.nSolutionD() == 2)
+        {
+            for (direction cmpt=0; cmpt<vector::nComponents; cmpt++)
+            {
+                if (mesh.geometricD()[cmpt] == -1)
+                {
+                    switch (cmpt)
+                    {
+                        case vector::X:
+                        {
+                            n1 = vector(0, n.z(), -n.y());
+                            break;
+                        }
+
+                        case vector::Y:
+                        {
+                            n1 = vector(n.z(), 0, -n.x());
+                            break;
+                        }
+
+                        case vector::Z:
+                        {
+                            n1 = vector(n.y(), -n.x(), 0);
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+        else if (mesh.nSolutionD() == 3)
+        {
+            //Determine which is the primary direction
+            if (mag(n.x()) > mag(n.y()) && mag(n.x()) > mag(n.z()))
+            {
+                n1 = vector(n.y(), -n.x(), 0);
+            }
+            else if (mag(n.y()) > mag(n.z()))
+            {
+                n1 = vector(0, n.z(), -n.y());
+            }
+            else
+            {
+                n1 = vector(-n.z(), 0, n.x());
+            }
+        }
+
+        n1 /= mag(n1);
+
+        vector n2 = n ^ n1;
+        n2 /= mag(n2);
+
+        tensor rot =
+            tensor
+            (
+               n.x() ,n.y(), n.z(),
+               n1.x() ,n1.y(), n1.z(),
+               n2.x() ,n2.y(), n2.z()
+            );
+
+//         tensor rot =
+//             tensor
+//             (
+//                n  & x ,n  & y, n  & z,
+//                n1 & x ,n1 & y, n1 & z,
+//                n2 & x ,n2 & y, n2 & z
+//             );
+
+        U1Contrav[faceI].x() =
+           2*transform(rot, UIntFaces[faceI]).x()
+           - transform(rot, HbyA[receptorNeigCell[faceI]]).x();
+
+        U1Contrav[faceI].y() = transform(rot, HbyA[cellId]).y();
+
+        U1Contrav[faceI].z() = transform(rot, HbyA[cellId]).z();
+
+        HbyA[cellId] = transform(inv(rot), U1Contrav[faceI]);
+    }
+}
diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/pEqn.H b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/pEqn.H
new file mode 100644
index 00000000000..028dfe4306b
--- /dev/null
+++ b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/pEqn.H
@@ -0,0 +1,109 @@
+volScalarField rAU(1.0/UEqn.A());
+
+// Option 1: interpolate rAU, do not block out rAU on blocked cells
+//mesh.interpolate(rAU, false);
+//surfaceScalarField rAUf("rAUf", fvc::interpolate(rAU));
+
+// Option 2: do not interpolate rAU but block out rAU
+//surfaceScalarField rAUf("rAUf", fvc::interpolate(blockedCells*rAU));
+
+
+// Option 3: do not interpolate rAU but zero out rAUf on faces on holes
+// But what about:
+//
+//   H
+// H I C C C C
+//   H
+//
+
+surfaceScalarField faceMask(localMin<scalar>(mesh).interpolate(cellMask));
+surfaceScalarField rAUf("rAUf", faceMask*fvc::interpolate(rAU));
+
+volVectorField HbyA("HbyA", U);
+HbyA = constrainHbyA(rAU*UEqn.H(), U, p);
+
+//mesh.interpolate(HbyA);
+if (massFluxInterpolation)
+{
+    #include "interpolatedFaces.H"
+}
+
+if (pimple.nCorrPISO() <= 1)
+{
+    tUEqn.clear();
+}
+
+surfaceScalarField phiHbyA("phiHbyA", fvc::flux(HbyA));
+
+if (ddtCorr)
+{
+    phiHbyA += rAUf*fvc::ddtCorr(U, Uf);
+}
+
+MRF.makeRelative(phiHbyA);
+
+if (p.needReference())
+{
+    fvc::makeRelative(phiHbyA, U);
+    adjustPhi(phiHbyA, U, p);
+    fvc::makeAbsolute(phiHbyA, U);
+}
+
+if (adjustFringe)
+{
+    fvc::makeRelative(phiHbyA, U);
+    oversetAdjustPhi(phiHbyA, U);
+    fvc::makeAbsolute(phiHbyA, U);
+}
+
+if (runTime.outputTime())
+{
+    volScalarField
+    (
+        "div(phiHbyA)",
+        fvc::div(phiHbyA)
+        //interpolatedCells*cellMask*fvc::div(phiHbyA)
+    ).write();
+}
+
+while (pimple.correctNonOrthogonal())
+{
+    fvScalarMatrix pEqn
+    (
+        fvm::laplacian(rAUf, p) == fvc::div(phiHbyA)
+    );
+
+    pEqn.setReference(pRefCell, pRefValue);
+
+    pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
+
+    if (pimple.finalNonOrthogonalIter())
+    {
+        phi = phiHbyA - pEqn.flux();
+    }
+}
+
+#include "continuityErrs.H"
+
+// Explicitly relax pressure for momentum corrector
+p.relax();
+volVectorField gradP(fvc::grad(p));
+//mesh.interpolate(gradP);
+
+// Option 1: leave velocity intact on blocked out cells
+//U = HbyA - rAU*gradP;
+
+// Option 2: zero out velocity on blocked out cells
+U = (HbyA - rAU*cellMask*gradP);
+U.correctBoundaryConditions();
+
+fvOptions.correct(U);
+
+{
+    Uf = fvc::interpolate(U);
+    surfaceVectorField n(mesh.Sf()/mesh.magSf());
+    Uf += n*(phi/mesh.magSf() - (n & Uf));
+}
+
+// Make the fluxes relative to the mesh motion
+fvc::makeRelative(phi, U);
diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/pimpleDyMFoam.C b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/pimpleDyMFoam.C
new file mode 100644
index 00000000000..f3dbd6a989c
--- /dev/null
+++ b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/pimpleDyMFoam.C
@@ -0,0 +1,157 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
+     \\/     M anipulation  | Copyright (C) 2016-2017 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Application
+    pimpleDyMFoam.C
+
+Group
+    grpIncompressibleSolvers grpMovingMeshSolvers
+
+Description
+    Transient solver for incompressible, flow of Newtonian fluids
+    on a moving mesh using the PIMPLE (merged PISO-SIMPLE) algorithm.
+
+    Turbulence modelling is generic, i.e. laminar, RAS or LES may be selected.
+
+\*---------------------------------------------------------------------------*/
+
+#include "fvCFD.H"
+#include "dynamicFvMesh.H"
+#include "singlePhaseTransportModel.H"
+#include "turbulentTransportModel.H"
+#include "pimpleControl.H"
+#include "fvOptions.H"
+
+#include "cellCellStencilObject.H"
+#include "zeroGradientFvPatchFields.H"
+#include "localMin.H"
+#include "interpolationCellPoint.H"
+#include "transform.H"
+#include "fvMeshSubset.H"
+#include "oversetAdjustPhi.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+int main(int argc, char *argv[])
+{
+    argList::addNote
+    (
+        "Experimental version of pimpleDyMFoam with support for overset meshes"
+    );
+    #include "setRootCase.H"
+    #include "createTime.H"
+    #include "createDynamicFvMesh.H"
+    #include "initContinuityErrs.H"
+
+    pimpleControl pimple(mesh);
+
+    #include "createFields.H"
+    #include "createUf.H"
+    #include "createMRF.H"
+    #include "createFvOptions.H"
+    #include "createControls.H"
+    #include "CourantNo.H"
+    #include "setInitialDeltaT.H"
+
+    turbulence->validate();
+
+    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+    Info<< "\nStarting time loop\n" << endl;
+
+    while (runTime.run())
+    {
+        #include "readControls.H"
+        #include "CourantNo.H"
+
+        #include "setDeltaT.H"
+
+        runTime++;
+
+        Info<< "Time = " << runTime.timeName() << nl << endl;
+
+        bool changed = mesh.update();
+
+        if (changed)
+        {
+            #include "setCellMask.H"
+            #include "setInterpolatedCells.H"
+        }
+
+        // Calculate absolute flux from the mapped surface velocity
+        phi = mesh.Sf() & Uf;
+
+        if (runTime.outputTime())
+        {
+            volScalarField
+            (
+                "contPhi",
+                interpolatedCells*cellMask*fvc::div(phi)
+            ).write();
+        }
+
+        if (mesh.changing() && correctPhi)
+        {
+            #include "correctPhi.H"
+        }
+
+        // Make the flux relative to the mesh motion
+        fvc::makeRelative(phi, U);
+
+        if (mesh.changing() && checkMeshCourantNo)
+        {
+            #include "meshCourantNo.H"
+        }
+
+        // --- Pressure-velocity PIMPLE corrector loop
+        while (pimple.loop())
+        {
+            #include "UEqn.H"
+
+            // --- Pressure corrector loop
+            while (pimple.correct())
+            {
+                #include "pEqn.H"
+            }
+
+            if (pimple.turbCorr())
+            {
+                laminarTransport.correct();
+                turbulence->correct();
+            }
+        }
+
+        runTime.write();
+
+        Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
+            << "  ClockTime = " << runTime.elapsedClockTime() << " s"
+            << nl << endl;
+    }
+
+    Info<< "End\n" << endl;
+
+    return 0;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/readControls.H b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/readControls.H
new file mode 100644
index 00000000000..0141c85225b
--- /dev/null
+++ b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/readControls.H
@@ -0,0 +1,10 @@
+#include "readTimeControls.H"
+
+correctPhi = pimple.dict().lookupOrDefault("correctPhi", false);
+
+checkMeshCourantNo = pimple.dict().lookupOrDefault("checkMeshCourantNo", false);
+
+massFluxInterpolation =
+    pimple.dict().lookupOrDefault("massFluxInterpolation", false);
+
+ddtCorr = pimple.dict().lookupOrDefault("ddtCorr", true);
diff --git a/applications/solvers/incompressible/simpleFoam/overSimpleFoam/Make/files b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/Make/files
new file mode 100644
index 00000000000..3294949edde
--- /dev/null
+++ b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/Make/files
@@ -0,0 +1,3 @@
+simpleFoam.C
+
+EXE = $(FOAM_APPBIN)/overSimpleFoam
diff --git a/applications/solvers/incompressible/simpleFoam/overSimpleFoam/Make/options b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/Make/options
new file mode 100644
index 00000000000..639b94132a0
--- /dev/null
+++ b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/Make/options
@@ -0,0 +1,25 @@
+EXE_INC = \
+    -I. \
+    -I$(FOAM_SOLVERS)/incompressible/pimpleFoam/overPimpleDyMFoam \
+    -I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \
+    -I$(LIB_SRC)/TurbulenceModels/incompressible/lnInclude \
+    -I$(LIB_SRC)/transportModels \
+    -I$(LIB_SRC)/transportModels/incompressible/singlePhaseTransportModel \
+    -I$(LIB_SRC)/finiteVolume/lnInclude \
+    -I$(LIB_SRC)/sampling/lnInclude \
+    -I$(LIB_SRC)/dynamicFvMesh/lnInclude \
+    -I$(LIB_SRC)/dynamicMesh/lnInclude \
+    -I$(LIB_SRC)/overset/lnInclude \
+    -I$(LIB_SRC)/meshTools/lnInclude \
+
+EXE_LIBS = \
+    -lturbulenceModels \
+    -lincompressibleTurbulenceModels \
+    -lincompressibleTransportModels \
+    -lfiniteVolume \
+    -lfvOptions \
+    -lsampling \
+    -ldynamicFvMesh \
+    -ltopoChangerFvMesh \
+    -ldynamicMesh \
+    -loverset
diff --git a/applications/solvers/incompressible/simpleFoam/overSimpleFoam/UEqn.H b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/UEqn.H
new file mode 100644
index 00000000000..5e9861ccc38
--- /dev/null
+++ b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/UEqn.H
@@ -0,0 +1,21 @@
+    // Momentum predictor
+
+    MRF.correctBoundaryVelocity(U);
+
+    tmp<fvVectorMatrix> tUEqn
+    (
+        fvm::div(phi, U)
+      + MRF.DDt(U)
+      + turbulence->divDevReff(U)
+     ==
+        fvOptions(U)
+    );
+    fvVectorMatrix& UEqn = tUEqn.ref();
+
+    UEqn.relax();
+
+    fvOptions.constrain(UEqn);
+
+    solve(UEqn == -cellMask*fvc::grad(p));
+
+    fvOptions.correct(U);
diff --git a/applications/solvers/incompressible/simpleFoam/overSimpleFoam/continuityErrs.H b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/continuityErrs.H
new file mode 100644
index 00000000000..c7870556230
--- /dev/null
+++ b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/continuityErrs.H
@@ -0,0 +1,48 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Global
+    continuityErrs
+
+Description
+    Calculates and prints the continuity errors.
+
+\*---------------------------------------------------------------------------*/
+
+{
+    volScalarField contErr(interpolatedCells*cellMask*fvc::div(phi));
+
+    scalar sumLocalContErr = runTime.deltaTValue()*
+        mag(contErr)().weightedAverage(mesh.V()).value();
+
+    scalar globalContErr = runTime.deltaTValue()*
+        contErr.weightedAverage(mesh.V()).value();
+    cumulativeContErr += globalContErr;
+
+    Info<< "time step continuity errors : sum local = " << sumLocalContErr
+        << ", global = " << globalContErr
+        << ", cumulative = " << cumulativeContErr
+        << endl;
+}
+
+// ************************************************************************* //
diff --git a/applications/solvers/incompressible/simpleFoam/overSimpleFoam/createFields.H b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/createFields.H
new file mode 100644
index 00000000000..b3d40776f4f
--- /dev/null
+++ b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/createFields.H
@@ -0,0 +1,47 @@
+Info<< "Reading field p\n" << endl;
+volScalarField p
+(
+    IOobject
+    (
+        "p",
+        runTime.timeName(),
+        mesh,
+        IOobject::MUST_READ,
+        IOobject::AUTO_WRITE
+    ),
+    mesh
+);
+
+Info<< "Reading field U\n" << endl;
+volVectorField U
+(
+    IOobject
+    (
+        "U",
+        runTime.timeName(),
+        mesh,
+        IOobject::MUST_READ,
+        IOobject::AUTO_WRITE
+    ),
+    mesh
+);
+
+#include "createPhi.H"
+
+
+label pRefCell = 0;
+scalar pRefValue = 0.0;
+setRefCell(p, simple.dict(), pRefCell, pRefValue);
+mesh.setFluxRequired(p.name());
+
+
+singlePhaseTransportModel laminarTransport(U, phi);
+
+autoPtr<incompressible::turbulenceModel> turbulence
+(
+    incompressible::turbulenceModel::New(U, phi, laminarTransport)
+);
+
+#include "createMRF.H"
+
+#include "createOversetFields.H"
diff --git a/applications/solvers/incompressible/simpleFoam/overSimpleFoam/createOversetFields.H b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/createOversetFields.H
new file mode 100644
index 00000000000..7eda905f506
--- /dev/null
+++ b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/createOversetFields.H
@@ -0,0 +1,34 @@
+//- Overset specific
+
+// Add solver-specific interpolations
+{
+    dictionary oversetDict;
+    oversetDict.add("U", true);
+    oversetDict.add("p", true);
+    oversetDict.add("HbyA", true);
+    oversetDict.add("grad(p)", true);
+
+    const_cast<dictionary&>
+    (
+        mesh.schemesDict()
+    ).add
+    (
+        "oversetInterpolationRequired",
+        oversetDict,
+        true
+    );
+}
+
+// Mask field for zeroing out contributions on hole cells
+#include "createCellMask.H"
+
+#include "createInterpolatedCells.H"
+
+bool adjustFringe
+(
+    simple.dict().lookupOrDefault("oversetAdjustPhi", false)
+);
+bool massFluxInterpolation
+(
+    simple.dict().lookupOrDefault("massFluxInterpolation", false)
+);
diff --git a/applications/solvers/incompressible/simpleFoam/overSimpleFoam/createUpdatedDynamicFvMesh.H b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/createUpdatedDynamicFvMesh.H
new file mode 100644
index 00000000000..db58f908280
--- /dev/null
+++ b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/createUpdatedDynamicFvMesh.H
@@ -0,0 +1,22 @@
+    Info<< "Create dynamic mesh for time = "
+        << runTime.timeName() << nl << endl;
+
+    autoPtr<dynamicFvMesh> meshPtr
+    (
+        dynamicFvMesh::New
+        (
+            IOobject
+            (
+                dynamicFvMesh::defaultRegion,
+                runTime.timeName(),
+                runTime,
+                IOobject::MUST_READ
+            )
+        )
+    );
+
+    dynamicFvMesh& mesh = meshPtr();
+
+    // Calculate initial mesh-to-mesh mapping. Note that this should be
+    // done under the hood, e.g. as a MeshObject
+    mesh.update();
diff --git a/applications/solvers/incompressible/simpleFoam/overSimpleFoam/pEqn.H b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/pEqn.H
new file mode 100644
index 00000000000..c64f92e33f7
--- /dev/null
+++ b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/pEqn.H
@@ -0,0 +1,57 @@
+{
+    surfaceScalarField faceMask(localMin<scalar>(mesh).interpolate(cellMask));
+
+    volScalarField rAU(1.0/UEqn.A());
+    surfaceScalarField rAUf("rAUf", faceMask*fvc::interpolate(rAU));
+
+    volVectorField HbyA("HbyA", U);
+    HbyA = constrainHbyA(rAU*UEqn.H(), U, p);
+
+    //mesh.interpolate(HbyA);
+    if (massFluxInterpolation)
+    {
+        #include "interpolatedFaces.H"
+    }
+
+    tUEqn.clear();
+
+    surfaceScalarField phiHbyA("phiHbyA", fvc::flux(HbyA));
+
+    adjustPhi(phiHbyA, U, p);
+
+    if (adjustFringe)
+    {
+        oversetAdjustPhi(phiHbyA, U);
+    }
+
+    // Non-orthogonal pressure corrector loop
+    while (simple.correctNonOrthogonal())
+    {
+        fvScalarMatrix pEqn
+        (
+            fvm::laplacian(rAUf, p) == fvc::div(phiHbyA)
+        );
+
+        pEqn.setReference(pRefCell, pRefValue);
+
+        pEqn.solve();
+
+        if (simple.finalNonOrthogonalIter())
+        {
+            phi = phiHbyA - pEqn.flux();
+        }
+    }
+
+    #include "continuityErrs.H"
+
+    // Explicitly relax pressure for momentum corrector
+    p.relax();
+
+    // Momentum corrector
+    volVectorField gradP(fvc::grad(p));
+    //mesh.interpolate(gradP);
+
+    U = HbyA - rAU*cellMask*gradP;
+    U.correctBoundaryConditions();
+    fvOptions.correct(U);
+}
diff --git a/applications/solvers/incompressible/simpleFoam/overSimpleFoam/simpleFoam.C b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/simpleFoam.C
new file mode 100644
index 00000000000..4a7cf1315be
--- /dev/null
+++ b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/simpleFoam.C
@@ -0,0 +1,125 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2014 OpenFOAM Foundation
+     \\/     M anipulation  | Copyright (C) 2016-2017 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Application
+    simpleFoam
+
+Group
+    grpIncompressibleSolvers
+
+Description
+    Steady-state solver for incompressible flows with turbulence modelling.
+
+    \heading Solver details
+    The solver uses the SIMPLE algorithm to solve the continuity equation:
+
+        \f[
+            \div \vec{U} = 0
+        \f]
+
+    and momentum equation:
+
+        \f[
+            \div \left( \vec{U} \vec{U} \right) - \div \gvec{R}
+          = - \grad p + \vec{S}_U
+        \f]
+
+    Where:
+    \vartable
+        \vec{U} | Velocity
+        p       | Pressure
+        \vec{R} | Stress tensor
+        \vec{S}_U | Momentum source
+    \endvartable
+
+    \heading Required fields
+    \plaintable
+        U       | Velocity [m/s]
+        p       | Kinematic pressure, p/rho [m2/s2]
+        \<turbulence fields\> | As required by user selection
+    \endplaintable
+
+\*---------------------------------------------------------------------------*/
+
+#include "fvCFD.H"
+#include "singlePhaseTransportModel.H"
+#include "turbulentTransportModel.H"
+#include "simpleControl.H"
+#include "fvOptions.H"
+
+#include "dynamicFvMesh.H"
+#include "cellCellStencilObject.H"
+#include "localMin.H"
+#include "interpolationCellPoint.H"
+#include "fvMeshSubset.H"
+#include "transform.H"
+#include "oversetAdjustPhi.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+int main(int argc, char *argv[])
+{
+    #define CREATE_MESH createUpdatedDynamicFvMesh.H
+    #include "postProcess.H"
+
+    #include "setRootCase.H"
+    #include "createTime.H"
+    #include "createUpdatedDynamicFvMesh.H"
+    #include "createControl.H"
+    #include "createFields.H"
+    #include "createFvOptions.H"
+    #include "initContinuityErrs.H"
+
+    turbulence->validate();
+
+    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+    Info<< "\nStarting time loop\n" << endl;
+
+    while (simple.loop())
+    {
+        Info<< "Time = " << runTime.timeName() << nl << endl;
+
+        // --- Pressure-velocity SIMPLE corrector
+        {
+            #include "UEqn.H"
+            #include "pEqn.H"
+        }
+
+        laminarTransport.correct();
+        turbulence->correct();
+
+        runTime.write();
+
+        Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
+            << "  ClockTime = " << runTime.elapsedClockTime() << " s"
+            << nl << endl;
+    }
+
+    Info<< "End\n" << endl;
+
+    return 0;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/multiphase/interFoam/overInterDyMFoam/CourantNo.H b/applications/solvers/multiphase/interFoam/overInterDyMFoam/CourantNo.H
new file mode 100644
index 00000000000..4182f4e2093
--- /dev/null
+++ b/applications/solvers/multiphase/interFoam/overInterDyMFoam/CourantNo.H
@@ -0,0 +1,53 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Global
+    CourantNo
+
+Description
+    Calculates and outputs the mean and maximum Courant Numbers.
+
+\*---------------------------------------------------------------------------*/
+
+scalar CoNum = 0.0;
+scalar meanCoNum = 0.0;
+
+if (mesh.nInternalFaces())
+{
+    surfaceScalarField phiMask(localMin<scalar>(mesh).interpolate(cellMask));
+
+    scalarField sumPhi
+    (
+        fvc::surfaceSum(mag(phiMask*phi))().internalField()
+    );
+
+    CoNum = 0.5*gMax(sumPhi/mesh.V().field())*runTime.deltaTValue();
+
+    meanCoNum =
+        0.5*(gSum(sumPhi)/gSum(mesh.V().field()))*runTime.deltaTValue();
+}
+
+Info<< "Courant Number mean: " << meanCoNum
+    << " max: " << CoNum << endl;
+
+// ************************************************************************* //
diff --git a/applications/solvers/multiphase/interFoam/overInterDyMFoam/Make/files b/applications/solvers/multiphase/interFoam/overInterDyMFoam/Make/files
new file mode 100644
index 00000000000..e229fbaed0b
--- /dev/null
+++ b/applications/solvers/multiphase/interFoam/overInterDyMFoam/Make/files
@@ -0,0 +1,3 @@
+interDyMFoam.C
+
+EXE = $(FOAM_APPBIN)/overInterDyMFoam
diff --git a/applications/solvers/multiphase/interFoam/overInterDyMFoam/Make/options b/applications/solvers/multiphase/interFoam/overInterDyMFoam/Make/options
new file mode 100644
index 00000000000..3b8ac67af5d
--- /dev/null
+++ b/applications/solvers/multiphase/interFoam/overInterDyMFoam/Make/options
@@ -0,0 +1,31 @@
+EXE_INC = \
+    -I. \
+    -I.. \
+    -I../../VoF \
+    -I$(LIB_SRC)/transportModels/twoPhaseMixture/lnInclude \
+    -I$(LIB_SRC)/transportModels \
+    -I$(LIB_SRC)/transportModels/incompressible/lnInclude \
+    -I$(LIB_SRC)/transportModels/interfaceProperties/lnInclude \
+    -I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \
+    -I$(LIB_SRC)/TurbulenceModels/incompressible/lnInclude \
+    -I$(LIB_SRC)/transportModels/immiscibleIncompressibleTwoPhaseMixture/lnInclude \
+    -I$(LIB_SRC)/finiteVolume/lnInclude \
+    -I$(LIB_SRC)/dynamicMesh/lnInclude \
+    -I$(LIB_SRC)/dynamicFvMesh/lnInclude \
+    -I$(FOAM_SOLVERS)/incompressible/pimpleFoam/overPimpleDyMFoam \
+    -I$(LIB_SRC)/overset/lnInclude \
+    -I$(LIB_SRC)/meshTools/lnInclude \
+    -I$(LIB_SRC)/sampling/lnInclude
+
+EXE_LIBS = \
+    -limmiscibleIncompressibleTwoPhaseMixture \
+    -lturbulenceModels \
+    -lincompressibleTurbulenceModels \
+    -lfiniteVolume \
+    -ldynamicMesh \
+    -ldynamicFvMesh \
+    -ltopoChangerFvMesh \
+    -loverset \
+    -lfvOptions \
+    -lsampling \
+    -lwaveModels
diff --git a/applications/solvers/multiphase/interFoam/overInterDyMFoam/UEqn.H b/applications/solvers/multiphase/interFoam/overInterDyMFoam/UEqn.H
new file mode 100644
index 00000000000..600c94829cc
--- /dev/null
+++ b/applications/solvers/multiphase/interFoam/overInterDyMFoam/UEqn.H
@@ -0,0 +1,33 @@
+    MRF.correctBoundaryVelocity(U);
+
+    fvVectorMatrix UEqn
+    (
+        fvm::ddt(rho, U) + fvm::div(rhoPhi, U)
+      + MRF.DDt(rho, U)
+      + turbulence->divDevRhoReff(rho, U)
+     ==
+        fvOptions(rho, U)
+    );
+
+    UEqn.relax();
+
+    fvOptions.constrain(UEqn);
+
+    if (pimple.momentumPredictor())
+    {
+        solve
+        (
+            UEqn
+         ==
+            cellMask*fvc::reconstruct
+            (
+                (
+                    mixture.surfaceTensionForce()
+                  - ghf*fvc::snGrad(rho)
+                  - fvc::snGrad(p_rgh)
+                ) * mesh.magSf()
+            )
+        );
+
+        fvOptions.correct(U);
+    }
diff --git a/applications/solvers/multiphase/interFoam/overInterDyMFoam/continuityErrs.H b/applications/solvers/multiphase/interFoam/overInterDyMFoam/continuityErrs.H
new file mode 100644
index 00000000000..c7870556230
--- /dev/null
+++ b/applications/solvers/multiphase/interFoam/overInterDyMFoam/continuityErrs.H
@@ -0,0 +1,48 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Global
+    continuityErrs
+
+Description
+    Calculates and prints the continuity errors.
+
+\*---------------------------------------------------------------------------*/
+
+{
+    volScalarField contErr(interpolatedCells*cellMask*fvc::div(phi));
+
+    scalar sumLocalContErr = runTime.deltaTValue()*
+        mag(contErr)().weightedAverage(mesh.V()).value();
+
+    scalar globalContErr = runTime.deltaTValue()*
+        contErr.weightedAverage(mesh.V()).value();
+    cumulativeContErr += globalContErr;
+
+    Info<< "time step continuity errors : sum local = " << sumLocalContErr
+        << ", global = " << globalContErr
+        << ", cumulative = " << cumulativeContErr
+        << endl;
+}
+
+// ************************************************************************* //
diff --git a/applications/solvers/multiphase/interFoam/overInterDyMFoam/correctPhi.H b/applications/solvers/multiphase/interFoam/overInterDyMFoam/correctPhi.H
new file mode 100644
index 00000000000..81948b54da4
--- /dev/null
+++ b/applications/solvers/multiphase/interFoam/overInterDyMFoam/correctPhi.H
@@ -0,0 +1,125 @@
+{
+    if (mesh.changing())
+    {
+        volVectorField::Boundary& bfld = U.boundaryFieldRef();
+        forAll(bfld, patchi)
+        {
+            if (bfld[patchi].fixesValue())
+            {
+                bfld[patchi].initEvaluate();
+            }
+        }
+
+        surfaceScalarField::Boundary& phiBfld = phi.boundaryFieldRef();
+        forAll(bfld, patchi)
+        {
+            if (bfld[patchi].fixesValue())
+            {
+                bfld[patchi].evaluate();
+
+                phiBfld[patchi] =
+                    bfld[patchi]
+                  & mesh.Sf().boundaryField()[patchi];
+            }
+        }
+    }
+
+    wordList pcorrTypes
+    (
+        p_rgh.boundaryField().size(),
+        zeroGradientFvPatchScalarField::typeName
+    );
+
+    for (label i=0; i<p_rgh.boundaryField().size(); i++)
+    {
+        if (p_rgh.boundaryField()[i].fixesValue())
+        {
+            pcorrTypes[i] = fixedValueFvPatchScalarField::typeName;
+        }
+    }
+
+    volScalarField pcorr
+    (
+        IOobject
+        (
+            "pcorr",
+            runTime.timeName(),
+            mesh,
+            IOobject::NO_READ,
+            IOobject::NO_WRITE
+        ),
+        mesh,
+        dimensionedScalar("pcorr", p_rgh.dimensions(), 0.0),
+        pcorrTypes
+    );
+
+    if (pcorr.needReference())
+    {
+        fvc::makeRelative(phi, U);
+        adjustPhi(phi, U, pcorr);
+        fvc::makeAbsolute(phi, U);
+    }
+
+    mesh.setFluxRequired(pcorr.name());
+
+    dimensionedScalar rAUf("rAUf", dimTime/rho.dimensions(), 1.0);
+
+    const cellCellStencilObject& overlap = Stencil::New(mesh);
+    const labelList& cellTypes = overlap.cellTypes();
+    const labelIOList& zoneIDs = overlap.zoneID();
+
+    while (pimple.correctNonOrthogonal())
+    {
+        label nZones = gMax(zoneIDs)+1;
+        //label refCellI2 = -1;
+
+        labelList refCells(nZones, -1);
+        labelList refZones(nZones, -1);
+
+        forAll(zoneIDs, cellI)
+        {
+            label zoneId = zoneIDs[cellI];
+            if
+            (
+                refCells[zoneId] == -1
+             && cellTypes[cellI] == cellCellStencil::CALCULATED
+             && refZones[zoneId] == -1
+            )
+            {
+                refCells[zoneId] = cellI;
+                refZones[zoneId] = zoneId;
+            }
+        }
+
+        fvScalarMatrix pcorrEqn
+        (
+            fvm::laplacian(rAUf, pcorr) == fvc::div(phi)
+        );
+
+        //pcorrEqn.setReference(refCellI2, 0, true);
+        scalarList values(nZones, 0.0);
+        pcorrEqn.setReferences(refCells, values, true);
+
+        const dictionary& d = mesh.solver
+            (
+                pcorr.select
+                (
+                    pimple.finalInnerIter()
+                )
+            );
+
+        //Bypass virtual layer
+        mesh.fvMesh::solve(pcorrEqn, d);
+
+        if (pimple.finalNonOrthogonalIter())
+        {
+            phi -= pcorrEqn.flux();
+        }
+    }
+
+    if (runTime.outputTime())
+    {
+        volScalarField("contPhiPcorr", fvc::div(phi)).write();
+        pcorr.write();
+    }
+}
diff --git a/applications/solvers/multiphase/interFoam/overInterDyMFoam/createDyMControls.H b/applications/solvers/multiphase/interFoam/overInterDyMFoam/createDyMControls.H
new file mode 100644
index 00000000000..cb2dfd5ddd1
--- /dev/null
+++ b/applications/solvers/multiphase/interFoam/overInterDyMFoam/createDyMControls.H
@@ -0,0 +1,25 @@
+bool correctPhi
+(
+    pimple.dict().lookupOrDefault<Switch>("correctPhi", true)
+);
+
+bool checkMeshCourantNo
+(
+    pimple.dict().lookupOrDefault<Switch>("checkMeshCourantNo", false)
+);
+
+bool moveMeshOuterCorrectors
+(
+    pimple.dict().lookupOrDefault<Switch>("moveMeshOuterCorrectors", false)
+);
+
+
+bool massFluxInterpolation
+(
+    pimple.dict().lookupOrDefault("massFluxInterpolation", false)
+);
+
+bool ddtCorr
+(
+    pimple.dict().lookupOrDefault("ddtCorr", true)
+);
diff --git a/applications/solvers/multiphase/interFoam/overInterDyMFoam/createFields.H b/applications/solvers/multiphase/interFoam/overInterDyMFoam/createFields.H
new file mode 100644
index 00000000000..4a83ab58506
--- /dev/null
+++ b/applications/solvers/multiphase/interFoam/overInterDyMFoam/createFields.H
@@ -0,0 +1,171 @@
+#include "createRDeltaT.H"
+
+Info<< "Reading field p_rgh\n" << endl;
+volScalarField p_rgh
+(
+    IOobject
+    (
+        "p_rgh",
+        runTime.timeName(),
+        mesh,
+        IOobject::MUST_READ,
+        IOobject::AUTO_WRITE
+    ),
+    mesh
+);
+
+Info<< "Reading field U\n" << endl;
+volVectorField U
+(
+    IOobject
+    (
+        "U",
+        runTime.timeName(),
+        mesh,
+        IOobject::MUST_READ,
+        IOobject::AUTO_WRITE
+    ),
+    mesh
+);
+
+#include "createPhi.H"
+
+
+
+    //- Overset specific
+
+    // Add solver-specific interpolations
+    {
+        dictionary oversetDict;
+        oversetDict.add("U", true);
+        oversetDict.add("p", true);
+        oversetDict.add("HbyA", true);
+        oversetDict.add("p_rgh", true);
+        oversetDict.add("alpha1", true);
+        oversetDict.add("minGradP", true);
+
+        const_cast<dictionary&>
+        (
+            mesh.schemesDict()
+        ).add
+        (
+            "oversetInterpolationRequired",
+            oversetDict,
+            true
+        );
+    }
+
+    // Mask field for zeroing out contributions on hole cells
+    #include "createCellMask.H"
+
+    // Create bool field with interpolated cells
+    #include "createInterpolatedCells.H"
+
+
+
+Info<< "Reading transportProperties\n" << endl;
+immiscibleIncompressibleTwoPhaseMixture mixture(U, phi);
+
+volScalarField& alpha1(mixture.alpha1());
+volScalarField& alpha2(mixture.alpha2());
+
+const dimensionedScalar& rho1 = mixture.rho1();
+const dimensionedScalar& rho2 = mixture.rho2();
+
+
+// Need to store rho for ddt(rho, U)
+volScalarField rho
+(
+    IOobject
+    (
+        "rho",
+        runTime.timeName(),
+        mesh,
+        IOobject::READ_IF_PRESENT
+    ),
+    alpha1*rho1 + alpha2*rho2
+);
+rho.oldTime();
+
+
+// Mass flux
+surfaceScalarField rhoPhi
+(
+    IOobject
+    (
+        "rhoPhi",
+        runTime.timeName(),
+        mesh,
+        IOobject::NO_READ,
+        IOobject::NO_WRITE
+    ),
+    fvc::interpolate(rho)*phi
+);
+
+
+// Construct incompressible turbulence model
+autoPtr<incompressible::turbulenceModel> turbulence
+(
+    incompressible::turbulenceModel::New(U, phi, mixture)
+);
+
+
+#include "readGravitationalAcceleration.H"
+#include "readhRef.H"
+#include "gh.H"
+
+
+volScalarField p
+(
+    IOobject
+    (
+        "p",
+        runTime.timeName(),
+        mesh,
+        IOobject::NO_READ,
+        IOobject::AUTO_WRITE
+    ),
+    p_rgh + rho*gh
+);
+
+label pRefCell = 0;
+scalar pRefValue = 0.0;
+setRefCell
+(
+    p,
+    p_rgh,
+    pimple.dict(),
+    pRefCell,
+    pRefValue
+);
+
+if (p_rgh.needReference())
+{
+    p += dimensionedScalar
+    (
+        "p",
+        p.dimensions(),
+        pRefValue - getRefCellValue(p, pRefCell)
+    );
+    p_rgh = p - rho*gh;
+}
+
+mesh.setFluxRequired(p_rgh.name());
+mesh.setFluxRequired(alpha1.name());
+
+// MULES compressed flux is registered in case scalarTransport FO needs it.
+surfaceScalarField alphaPhiUn
+(
+    IOobject
+    (
+        "alphaPhiUn",
+        runTime.timeName(),
+        mesh,
+        IOobject::NO_READ,
+        IOobject::NO_WRITE
+    ),
+    mesh,
+    dimensionedScalar("zero", phi.dimensions(), 0.0)
+);
+
+#include "createMRF.H"
diff --git a/applications/solvers/multiphase/interFoam/overInterDyMFoam/interDyMFoam.C b/applications/solvers/multiphase/interFoam/overInterDyMFoam/interDyMFoam.C
new file mode 100644
index 00000000000..7bb7f8af6b8
--- /dev/null
+++ b/applications/solvers/multiphase/interFoam/overInterDyMFoam/interDyMFoam.C
@@ -0,0 +1,209 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2014 OpenFOAM Foundation
+     \\/     M anipulation  | Copyright (C) 2016-2017 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Application
+    overInterDyMFoam
+
+Group
+    grpMultiphaseSolvers grpMovingMeshSolvers
+
+Description
+    Solver for 2 incompressible, isothermal immiscible fluids using a VOF
+    (volume of fluid) phase-fraction based interface capturing approach,
+    with optional mesh motion and mesh topology changes including adaptive
+    re-meshing.
+
+\*---------------------------------------------------------------------------*/
+
+#include "fvCFD.H"
+#include "dynamicFvMesh.H"
+#include "CMULES.H"
+#include "EulerDdtScheme.H"
+#include "localEulerDdtScheme.H"
+#include "CrankNicolsonDdtScheme.H"
+#include "subCycle.H"
+#include "immiscibleIncompressibleTwoPhaseMixture.H"
+#include "turbulentTransportModel.H"
+#include "pimpleControl.H"
+#include "fvOptions.H"
+#include "CorrectPhi.H"
+#include "fvcSmooth.H"
+#include "cellCellStencilObject.H"
+#include "localMin.H"
+#include "interpolationCellPoint.H"
+#include "transform.H"
+#include "fvMeshSubset.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+int main(int argc, char *argv[])
+{
+    #include "postProcess.H"
+
+    #include "setRootCase.H"
+    #include "createTime.H"
+    #include "createDynamicFvMesh.H"
+    #include "initContinuityErrs.H"
+    #include "createControl.H"
+    #include "createTimeControls.H"
+    #include "createDyMControls.H"
+    #include "createFields.H"
+    #include "createAlphaFluxes.H"
+    #include "createFvOptions.H"
+
+    volScalarField rAU
+    (
+        IOobject
+        (
+            "rAU",
+            runTime.timeName(),
+            mesh,
+            IOobject::READ_IF_PRESENT,
+            IOobject::AUTO_WRITE
+        ),
+        mesh,
+        dimensionedScalar("rAUf", dimTime/rho.dimensions(), 1.0)
+    );
+
+    #include "correctPhi.H"
+    #include "createUf.H"
+
+    turbulence->validate();
+
+    if (!LTS)
+    {
+        #include "CourantNo.H"
+        #include "setInitialDeltaT.H"
+    }
+
+    #include "setCellMask.H"
+    #include "setInterpolatedCells.H"
+
+    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+    Info<< "\nStarting time loop\n" << endl;
+
+    while (runTime.run())
+    {
+        #include "readControls.H"
+
+        if (LTS)
+        {
+            #include "setRDeltaT.H"
+        }
+        else
+        {
+            #include "CourantNo.H"
+            #include "alphaCourantNo.H"
+            #include "setDeltaT.H"
+        }
+
+        runTime++;
+
+        Info<< "Time = " << runTime.timeName() << nl << endl;
+
+        // --- Pressure-velocity PIMPLE corrector loop
+        while (pimple.loop())
+        {
+            if (pimple.firstIter() || moveMeshOuterCorrectors)
+            {
+                scalar timeBeforeMeshUpdate = runTime.elapsedCpuTime();
+
+                mesh.update();
+
+                if (mesh.changing())
+                {
+                    Info<< "Execution time for mesh.update() = "
+                        << runTime.elapsedCpuTime() - timeBeforeMeshUpdate
+                        << " s" << endl;
+
+                    // Do not apply previous time-step mesh compression flux
+                    // if the mesh topology changed
+                    if (mesh.topoChanging())
+                    {
+                        talphaPhiCorr0.clear();
+                    }
+
+                    gh = (g & mesh.C()) - ghRef;
+                    ghf = (g & mesh.Cf()) - ghRef;
+
+                    // Update cellMask field for blocking out hole cells
+                    #include "setCellMask.H"
+                    #include "setInterpolatedCells.H"
+                }
+
+                if ((mesh.changing() && correctPhi) || mesh.topoChanging())
+                {
+                    // Calculate absolute flux from the mapped surface velocity
+                    // Note: temporary fix until mapped Uf is assessed
+                    Uf = fvc::interpolate(U);
+
+                    // Calculate absolute flux from the mapped surface velocity
+                    phi = mesh.Sf() & Uf;
+
+                    #include "correctPhi.H"
+
+                    // Make the flux relative to the mesh motion
+                    fvc::makeRelative(phi, U);
+
+                    mixture.correct();
+                }
+
+                if (mesh.changing() && checkMeshCourantNo)
+                {
+                    #include "meshCourantNo.H"
+                }
+            }
+
+            #include "alphaControls.H"
+            #include "alphaEqnSubCycle.H"
+
+            mixture.correct();
+
+            #include "UEqn.H"
+
+            // --- Pressure corrector loop
+            while (pimple.correct())
+            {
+                #include "pEqn.H"
+            }
+
+            if (pimple.turbCorr())
+            {
+                turbulence->correct();
+            }
+        }
+
+        runTime.write();
+
+        Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
+            << "  ClockTime = " << runTime.elapsedClockTime() << " s"
+            << nl << endl;
+    }
+
+    Info<< "End\n" << endl;
+
+    return 0;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/multiphase/interFoam/overInterDyMFoam/pEqn.H b/applications/solvers/multiphase/interFoam/overInterDyMFoam/pEqn.H
new file mode 100644
index 00000000000..0a5b0296b8b
--- /dev/null
+++ b/applications/solvers/multiphase/interFoam/overInterDyMFoam/pEqn.H
@@ -0,0 +1,96 @@
+{
+    rAU = 1.0/UEqn.A();
+    surfaceScalarField faceMask(localMin<scalar>(mesh).interpolate(cellMask));
+
+    surfaceScalarField rAUf("rAUf", fvc::interpolate(rAU));
+
+    volVectorField HbyA("HbyA", U);
+    //HbyA = rAU*UEqn.H();
+    HbyA = constrainHbyA(rAU*UEqn.H(), U, p_rgh);
+
+    if (massFluxInterpolation)
+    {
+        #include "interpolatedFaces.H"
+    }
+
+    surfaceScalarField phiHbyA("phiHbyA", fvc::flux(HbyA));
+
+    if (ddtCorr)
+    {
+        phiHbyA += fvc::interpolate(rho*rAU)*fvc::ddtCorr(U, Uf);
+    }
+    MRF.makeRelative(phiHbyA);
+
+    if (p_rgh.needReference())
+    {
+        fvc::makeRelative(phiHbyA, U);
+        adjustPhi(phiHbyA, U, p_rgh);
+        fvc::makeAbsolute(phiHbyA, U);
+    }
+
+    surfaceScalarField phig
+    (
+        (
+            mixture.surfaceTensionForce()
+          - ghf*fvc::snGrad(rho)
+        )*faceMask*rAUf*mesh.magSf()
+    );
+
+    phiHbyA += phig;
+
+    // Update the pressure BCs to ensure flux consistency
+    constrainPressure(p_rgh, U, phiHbyA, rAUf, MRF);
+
+    while (pimple.correctNonOrthogonal())
+    {
+        fvScalarMatrix p_rghEqn
+        (
+            fvm::laplacian(faceMask*rAUf, p_rgh) == fvc::div(phiHbyA)
+        );
+
+        p_rghEqn.setReference(pRefCell, getRefCellValue(p_rgh, pRefCell));
+
+        p_rghEqn.solve(mesh.solver(p_rgh.select(pimple.finalInnerIter())));
+
+        if (pimple.finalNonOrthogonalIter())
+        {
+            phi = phiHbyA - p_rghEqn.flux();
+
+            p_rgh.relax();
+
+            // Reconstruct body forces (-grad(p) and gh etc)
+            volVectorField minGradP
+            (
+                "minGradP",
+                fvc::reconstruct((phig - p_rghEqn.flux())/rAUf)
+            );
+            U = HbyA + rAU*cellMask*minGradP;
+            U.correctBoundaryConditions();
+            fvOptions.correct(U);
+        }
+    }
+
+    #include "continuityErrs.H"
+
+    {
+        Uf = fvc::interpolate(U);
+        surfaceVectorField n(mesh.Sf()/mesh.magSf());
+        Uf += n*(phi/mesh.magSf() - (n & Uf));
+    }
+
+    // Make the fluxes relative to the mesh motion
+    fvc::makeRelative(phi, U);
+
+    p == p_rgh + rho*gh;
+
+    if (p_rgh.needReference())
+    {
+        p += dimensionedScalar
+        (
+            "p",
+            p.dimensions(),
+            pRefValue - getRefCellValue(p, pRefCell)
+        );
+        p_rgh = p - rho*gh;
+    }
+}
diff --git a/applications/solvers/multiphase/interFoam/overInterDyMFoam/readControls.H b/applications/solvers/multiphase/interFoam/overInterDyMFoam/readControls.H
new file mode 100644
index 00000000000..0df2a74f309
--- /dev/null
+++ b/applications/solvers/multiphase/interFoam/overInterDyMFoam/readControls.H
@@ -0,0 +1,15 @@
+#include "readTimeControls.H"
+
+correctPhi = pimple.dict().lookupOrDefault<Switch>("correctPhi", true);
+
+checkMeshCourantNo =
+    pimple.dict().lookupOrDefault<Switch>("checkMeshCourantNo", false);
+
+moveMeshOuterCorrectors =
+    pimple.dict().lookupOrDefault<Switch>("moveMeshOuterCorrectors", false);
+
+massFluxInterpolation =
+    pimple.dict().lookupOrDefault("massFluxInterpolation", false);
+
+ddtCorr =
+    pimple.dict().lookupOrDefault("ddtCorr", true);
\ No newline at end of file
diff --git a/applications/test/parallelOverset/Make/files b/applications/test/parallelOverset/Make/files
new file mode 100644
index 00000000000..1a6be797876
--- /dev/null
+++ b/applications/test/parallelOverset/Make/files
@@ -0,0 +1,3 @@
+laplacianDyMFoam.C
+
+EXE = $(FOAM_USER_APPBIN)/correctBoundaryConditions
diff --git a/applications/test/parallelOverset/Make/options b/applications/test/parallelOverset/Make/options
new file mode 100644
index 00000000000..0dd7b75e800
--- /dev/null
+++ b/applications/test/parallelOverset/Make/options
@@ -0,0 +1,12 @@
+EXE_INC = \
+    -DFULLDEBUG -g -O0 \
+    -I$(LIB_SRC)/finiteVolume/lnInclude \
+    -I$(LIB_SRC)/dynamicFvMesh/lnInclude \
+    -I$(LIB_SRC)/sampling/lnInclude \
+    -I$(LIB_SRC)/meshTools/lnInclude \
+    -I$(LIB_SRC)/overset/lnInclude
+
+EXE_LIBS = \
+    -lfiniteVolume \
+    -lsampling \
+    -loverset
diff --git a/applications/test/parallelOverset/createFields.H b/applications/test/parallelOverset/createFields.H
new file mode 100644
index 00000000000..d14935caab6
--- /dev/null
+++ b/applications/test/parallelOverset/createFields.H
@@ -0,0 +1,53 @@
+    Info<< "Reading field T\n" << endl;
+
+    volScalarField T
+    (
+        IOobject
+        (
+            "T",
+            runTime.timeName(),
+            mesh,
+            IOobject::MUST_READ,
+            IOobject::AUTO_WRITE
+        ),
+        mesh
+    );
+
+    // Add overset specific interpolations
+    {
+        dictionary oversetDict;
+        oversetDict.add("T", true);
+
+        const_cast<dictionary&>
+        (
+            mesh.schemesDict()
+        ).add
+        (
+            "oversetInterpolationRequired",
+            oversetDict,
+            true
+        );
+    }
+
+
+    Info<< "Reading transportProperties\n" << endl;
+
+    IOdictionary transportProperties
+    (
+        IOobject
+        (
+            "transportProperties",
+            runTime.constant(),
+            mesh,
+            IOobject::MUST_READ_IF_MODIFIED,
+            IOobject::NO_WRITE
+        )
+    );
+
+
+    Info<< "Reading diffusivity DT\n" << endl;
+
+    dimensionedScalar DT
+    (
+        transportProperties.lookup("DT")
+    );
diff --git a/applications/test/parallelOverset/heatTransfer/0.org/T b/applications/test/parallelOverset/heatTransfer/0.org/T
new file mode 100644
index 00000000000..a60edc4bb6b
--- /dev/null
+++ b/applications/test/parallelOverset/heatTransfer/0.org/T
@@ -0,0 +1,49 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      T;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 0 0 1 0 0 0];
+
+internalField   uniform 273;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    "(walls|hole)"
+    {
+        type            zeroGradient;
+    }
+
+    left1
+    {
+        type            fixedValue;
+        value           uniform 300;
+    }
+
+    right1
+    {
+        type            fixedValue;
+        value           uniform 273;
+    }
+
+    overset
+    {
+        type            overset;
+    }
+}
+
+// ************************************************************************* //
diff --git a/applications/test/parallelOverset/heatTransfer/0.org/pointDisplacement b/applications/test/parallelOverset/heatTransfer/0.org/pointDisplacement
new file mode 100644
index 00000000000..a1dda3a4175
--- /dev/null
+++ b/applications/test/parallelOverset/heatTransfer/0.org/pointDisplacement
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       pointVectorField;
+    object      pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 1 0 0 0 0 0];
+
+internalField   uniform (0 0 0);
+
+boundaryField
+{
+    ".*"
+    {
+        type            uniformFixedValue;
+        uniformValue    (0 0 0);
+    }
+
+    "(free|hole)"
+    {
+        patchType       overset;
+        type            uniformFixedValue;
+        uniformValue    (0 0 0);
+//        uniformValue    table
+//        (
+//            (0.0         (0 0 0))
+//            (1.0         (0.31 0 0))
+//            (2.0         (0 0 0))
+//        );
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/applications/test/parallelOverset/heatTransfer/0.org/zoneID b/applications/test/parallelOverset/heatTransfer/0.org/zoneID
new file mode 100644
index 00000000000..1a49886c283
--- /dev/null
+++ b/applications/test/parallelOverset/heatTransfer/0.org/zoneID
@@ -0,0 +1,39 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev-OpenCFD.overlap                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    location    "0";
+    object      zoneID;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 0 0 0 0 0 0];
+
+internalField   uniform 0;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    overset
+    {
+        type        overset;
+    }
+
+    ".*"
+    {
+        type        zeroGradient;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/applications/test/parallelOverset/heatTransfer/Allclean b/applications/test/parallelOverset/heatTransfer/Allclean
new file mode 100755
index 00000000000..323e09af05d
--- /dev/null
+++ b/applications/test/parallelOverset/heatTransfer/Allclean
@@ -0,0 +1,13 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # run from this directory
+
+# Source tutorial clean functions
+. $WM_PROJECT_DIR/bin/tools/CleanFunctions
+
+cleanCase
+rm -f constant/polyMesh/boundary
+rm -f constant/polyMesh/zoneID
+
+rm -rf 0
+
+# ----------------------------------------------------------------- end-of-file
diff --git a/applications/test/parallelOverset/heatTransfer/Allrun.pre b/applications/test/parallelOverset/heatTransfer/Allrun.pre
new file mode 100755
index 00000000000..19e4417a553
--- /dev/null
+++ b/applications/test/parallelOverset/heatTransfer/Allrun.pre
@@ -0,0 +1,17 @@
+#!/bin/sh
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+runApplication blockMesh
+
+# Select cellSets
+runApplication topoSet
+
+runApplication subsetMesh box -patch hole -overwrite
+
+# Select cellSets
+runApplication -s zoneID topoSet
+
+rm -rf 0 && cp -r 0.org 0
+
+# Use cellSets to write zoneID
+runApplication setFields
diff --git a/applications/test/parallelOverset/heatTransfer/constant/dynamicMeshDict b/applications/test/parallelOverset/heatTransfer/constant/dynamicMeshDict
new file mode 100644
index 00000000000..69054196e62
--- /dev/null
+++ b/applications/test/parallelOverset/heatTransfer/constant/dynamicMeshDict
@@ -0,0 +1,33 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+motionSolverLibs ( "libfvMotionSolvers.so" );
+
+solver          displacementLaplacian;
+
+displacementLaplacianCoeffs
+{
+    diffusivity     uniform 1;
+}
+
+dynamicFvMesh       dynamicOversetFvMesh;
+
+dynamicOversetFvMeshCoeffs
+{
+//    layerRelax 0.3;
+}
+
+// ************************************************************************* //
diff --git a/applications/test/parallelOverset/heatTransfer/constant/transportProperties b/applications/test/parallelOverset/heatTransfer/constant/transportProperties
new file mode 100644
index 00000000000..2c17a958286
--- /dev/null
+++ b/applications/test/parallelOverset/heatTransfer/constant/transportProperties
@@ -0,0 +1,41 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "constant";
+    object      transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+DT              DT [ 0 2 -1 0 0 0 0 ] 1;
+
+transportModel  Newtonian;
+
+nu              nu [ 0 2 -1 0 0 0 0 ] 1e-05;
+
+CrossPowerLawCoeffs
+{
+    nu0             nu0 [ 0 2 -1 0 0 0 0 ] 1e-06;
+    nuInf           nuInf [ 0 2 -1 0 0 0 0 ] 1e-06;
+    m               m [ 0 0 1 0 0 0 0 ] 1;
+    n               n [ 0 0 0 0 0 0 0 ] 1;
+}
+
+BirdCarreauCoeffs
+{
+    nu0             nu0 [ 0 2 -1 0 0 0 0 ] 1e-06;
+    nuInf           nuInf [ 0 2 -1 0 0 0 0 ] 1e-06;
+    k               k [ 0 0 1 0 0 0 0 ] 0;
+    n               n [ 0 0 0 0 0 0 0 ] 1;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/test/parallelOverset/heatTransfer/system/blockMeshDict b/applications/test/parallelOverset/heatTransfer/system/blockMeshDict
new file mode 100644
index 00000000000..c3dd3573eb7
--- /dev/null
+++ b/applications/test/parallelOverset/heatTransfer/system/blockMeshDict
@@ -0,0 +1,126 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  1.5                                   |
+|   \\  /    A nd           | Web:      http://www.OpenFOAM.org               |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      blockMeshDict;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+convertToMeters 1;
+
+vertices
+(
+    ( 0.00  0.0  0)
+    ( 1.00  0.0  0)
+    ( 1.00  1.0  0)
+    ( 0.00  1.0  0)
+    ( 0.00  0.0  1)
+    ( 1.00  0.0  1)
+    ( 1.00  1.0  1)
+    ( 0.00  1.0  1)
+
+//- 0 degrees
+    ( 0.25  0.25  0)
+    ( 0.75  0.25  0)
+    ( 0.75  0.75  0)
+    ( 0.25  0.75  0)
+    ( 0.25  0.25  1)
+    ( 0.75  0.25  1)
+    ( 0.75  0.75  1)
+    ( 0.25  0.75  1)
+
+
+//- 45 degrees rotated
+//    ( 0.25  0.5   0)
+//    ( 0.5   0.25  0)
+//    ( 0.75  0.5   0)
+//    ( 0.5   0.75  0)
+//    ( 0.25  0.5   1)
+//    ( 0.5   0.25  1)
+//    ( 0.75  0.5   1)
+//    ( 0.5   0.75  1)
+);
+
+blocks
+(
+    hex (0 1 2 3 4 5 6 7) (18 18 1) simpleGrading (1 1 1)
+
+    hex (8 9 10 11 12 13 14 15) movingZone (30 30 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+    free
+    {
+        type    overset;
+        faces
+        (
+            (8 12 15 11)
+            (10 14 13 9)
+            (11 15 14 10)
+            ( 9 13 12  8)
+        );
+    }
+
+    walls
+    {
+        type patch;
+        faces
+        (
+            (3 7 6 2)
+            (1 5 4 0)
+        );
+    }
+
+    // Populated by subsetMesh
+    hole
+    {
+        type patch;
+        faces ();
+    }
+
+    frontAndBack
+    {
+        type empty;
+        faces
+        (
+            (0 3 2 1)
+            (4 5 6 7)
+            ( 8 11 10  9)
+            (12 13 14 15)
+        );
+    }
+
+    left1
+    {
+        type patch;
+        faces
+        (
+            (0 4 7 3)
+        );
+    }
+    right1
+    {
+        type patch;
+        faces
+        (
+            (2 6 5 1)
+        );
+    }
+);
+
+
+// ************************************************************************* //
diff --git a/applications/test/parallelOverset/heatTransfer/system/controlDict b/applications/test/parallelOverset/heatTransfer/system/controlDict
new file mode 100644
index 00000000000..535f677519c
--- /dev/null
+++ b/applications/test/parallelOverset/heatTransfer/system/controlDict
@@ -0,0 +1,57 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+// Make sure all preprocessing tools know about the 'overset' bc
+libs            ("liboverset.so");
+
+DebugSwitches
+{
+    overset             1;
+    inverseDistance     1;
+}
+
+application     correctBoundaryConditions;  //overLaplacianDyMFoam;
+
+startFrom       startTime;
+
+startTime       0;
+
+stopAt          endTime;
+
+endTime         1;
+
+deltaT          0.1;
+
+writeControl    timeStep;
+
+writeInterval   1;
+
+purgeWrite      0;
+
+writeFormat     ascii;
+
+writePrecision  16;
+
+writeCompression off;
+
+timeFormat      general;
+
+timePrecision   6;
+
+runTimeModifiable true;
+
+// ************************************************************************* //
diff --git a/applications/test/parallelOverset/heatTransfer/system/decomposeParDict b/applications/test/parallelOverset/heatTransfer/system/decomposeParDict
new file mode 100644
index 00000000000..b1fa24963fa
--- /dev/null
+++ b/applications/test/parallelOverset/heatTransfer/system/decomposeParDict
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    note        "mesh decomposition control dictionary";
+    object      decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains  2;
+
+
+//constraints
+//{
+//    localOverset
+//    {
+//        //- Keep donor and acceptor on same processor
+//        type    localOverset;
+//    }
+//}
+
+method          hierarchical;
+
+hierarchicalCoeffs
+{
+    n           (1 2 1);
+    delta       0.001;
+    order       xyz;
+}
+
+manualCoeffs
+{
+    dataFile    "decompositionData";
+}
+
+// ************************************************************************* //
diff --git a/applications/test/parallelOverset/heatTransfer/system/fvSchemes b/applications/test/parallelOverset/heatTransfer/system/fvSchemes
new file mode 100644
index 00000000000..43c631a1f29
--- /dev/null
+++ b/applications/test/parallelOverset/heatTransfer/system/fvSchemes
@@ -0,0 +1,85 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+    default         steadyState;
+}
+
+gradSchemes
+{
+    default         Gauss linear;
+    grad(T)         Gauss linear;
+}
+
+divSchemes
+{
+    default         none;
+    div(phi,U)      bounded Gauss limitedLinearV 1;
+    div(phi,k)      bounded Gauss limitedLinear 1;
+    div(phi,epsilon) bounded Gauss limitedLinear 1;
+    div(phi,R)      bounded Gauss limitedLinear 1;
+    div(R)          Gauss linear;
+    div(phi,nuTilda) bounded Gauss limitedLinear 1;
+    div((nuEff*dev(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+    default         Gauss linear corrected;
+    laplacian(diffusivity,cellDisplacement)  Gauss linear corrected;
+}
+
+interpolationSchemes
+{
+    default         linear;
+}
+
+snGradSchemes
+{
+    default         corrected;
+}
+
+fluxRequired
+{
+    default         no;
+    pcorr           ;
+    p               ;
+}
+
+oversetInterpolation
+{
+    // Interpolation scheme to use for overset calculation
+    method      inverseDistance;
+
+    // The inverseDistance method uses a 'voxel' like search structure.
+    // Optionally specify the extent and number of divisions n.
+    // Note that it will allocate an array of nx*ny*nz. If not specified:
+    // - searchBox          : local mesh bounding box
+    // - searchBoxDivisions : root (2D) or cube-root(3D) of number of cells
+    searchBox           (0 0 0)(1 1 1);
+    searchBoxDivisions  (100 100 1);
+}
+
+
+oversetInterpolationRequired
+{
+    // Any additional fields that require overset interpolation
+}
+
+
+// ************************************************************************* //
diff --git a/applications/test/parallelOverset/heatTransfer/system/fvSolution b/applications/test/parallelOverset/heatTransfer/system/fvSolution
new file mode 100644
index 00000000000..66c7f94747e
--- /dev/null
+++ b/applications/test/parallelOverset/heatTransfer/system/fvSolution
@@ -0,0 +1,77 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+    T
+    {
+        solver          PBiCGStab;
+        preconditioner  DILU;
+
+        //solver           GAMG;
+        //smoother         DILUGaussSeidel;
+        //agglomerator     algebraicPair;
+        //processorAgglomerator none;
+
+        tolerance       1e-10;
+        relTol          0;
+    }
+
+    cellDisplacement
+    {
+        solver          PCG;
+        preconditioner  DIC;
+
+        tolerance       1e-06;
+        relTol          0;
+        maxIter         100;
+    }
+
+
+}
+
+SIMPLE
+{
+    nNonOrthogonalCorrectors 0; //2;
+}
+
+
+PIMPLE
+{
+    correctPhi          yes;
+    nOuterCorrectors    2;
+    nCorrectors         1;
+    nNonOrthogonalCorrectors 0;
+}
+
+
+relaxationFactors
+{
+    fields
+    {
+        p               0.3;
+    }
+    equations
+    {
+        U               0.7;
+        k               0.7;
+        omega           0.7;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/applications/test/parallelOverset/heatTransfer/system/postProcessingDict b/applications/test/parallelOverset/heatTransfer/system/postProcessingDict
new file mode 100644
index 00000000000..8fe6333aa05
--- /dev/null
+++ b/applications/test/parallelOverset/heatTransfer/system/postProcessingDict
@@ -0,0 +1,35 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      postProcessingDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+functions
+{
+    processorField1
+    {
+        // Type of functionObject
+        type            processorField;
+
+        // Where to load it from (if not already in solver)
+        libs            ("libfieldFunctionObjects.so");
+
+        // Function object enabled flag
+        enabled         true;
+
+        // When to output the average fields
+        writeControl    writeTime;
+    }
+}
+
+// ************************************************************************* //
diff --git a/applications/test/parallelOverset/heatTransfer/system/processorField b/applications/test/parallelOverset/heatTransfer/system/processorField
new file mode 100644
index 00000000000..6b41df60e40
--- /dev/null
+++ b/applications/test/parallelOverset/heatTransfer/system/processorField
@@ -0,0 +1,32 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      postProcessingDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+processorField
+{
+    // Type of functionObject
+    type            processorField;
+
+    // Where to load it from (if not already in solver)
+    libs            ("libfieldFunctionObjects.so");
+
+    // Function object enabled flag
+    enabled         true;
+
+    // When to output the average fields
+    writeControl    timeStep;
+}
+
+// ************************************************************************* //
diff --git a/applications/test/parallelOverset/heatTransfer/system/setFieldsDict b/applications/test/parallelOverset/heatTransfer/system/setFieldsDict
new file mode 100644
index 00000000000..2ebc58f23ab
--- /dev/null
+++ b/applications/test/parallelOverset/heatTransfer/system/setFieldsDict
@@ -0,0 +1,48 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      setFieldsDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+defaultFieldValues
+(
+    volScalarFieldValue zoneID 123
+);
+
+regions
+(
+    // Set cell values
+    // (does zerogradient on boundaries)
+    cellToCell
+    {
+        set c0;
+
+        fieldValues
+        (
+            volScalarFieldValue zoneID 0
+        );
+    }
+
+    cellToCell
+    {
+        set c1;
+
+        fieldValues
+        (
+            volScalarFieldValue zoneID 1
+        );
+    }
+
+);
+
+// ************************************************************************* //
diff --git a/applications/test/parallelOverset/heatTransfer/system/topoSetDict b/applications/test/parallelOverset/heatTransfer/system/topoSetDict
new file mode 100644
index 00000000000..06a8182d404
--- /dev/null
+++ b/applications/test/parallelOverset/heatTransfer/system/topoSetDict
@@ -0,0 +1,80 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      topoSetDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+actions
+(
+    {
+        name    c0;
+        type    cellSet;
+        action  new;
+        source  regionToCell;
+        sourceInfo
+        {
+            insidePoints ((0.001 0.001 0.001));
+        }
+    }
+
+    {
+        name    c1;
+        type    cellSet;
+        action  new;
+        source  cellToCell;
+        sourceInfo
+        {
+            set c0;
+        }
+    }
+
+    {
+        name    c1;
+        type    cellSet;
+        action  invert;
+    }
+
+
+    // Select box to remove from region 1
+
+    {
+        name    box;
+        type    cellSet;
+        action  new;
+        source  cellToCell;
+        sourceInfo
+        {
+            set c1;
+        }
+    }
+
+
+    {
+        name    box;
+        type    cellSet;
+        action  subset;
+        source  boxToCell;
+        sourceInfo
+        {
+            box (0.4 0.4 -100)(0.6 0.6 100);
+        }
+    }
+
+    {
+        name    box;
+        type    cellSet;
+        action  invert;
+    }
+);
+
+// ************************************************************************* //
diff --git a/applications/test/parallelOverset/laplacianDyMFoam.C b/applications/test/parallelOverset/laplacianDyMFoam.C
new file mode 100644
index 00000000000..ea06cd7d3ac
--- /dev/null
+++ b/applications/test/parallelOverset/laplacianDyMFoam.C
@@ -0,0 +1,125 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2015 OpenFOAM Foundation
+     \\/     M anipulation  | Copyright (C) 2016-2017 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Application
+    laplacianFoam
+
+Group
+    grpBasicSolvers
+
+Description
+    Laplace equation solver for a scalar quantity.
+
+    \heading Solver details
+    The solver is applicable to, e.g. for thermal diffusion in a solid.  The
+    equation is given by:
+
+    \f[
+        \ddt{T}  = \div \left( D_T \grad T \right)
+    \f]
+
+    Where:
+    \vartable
+        T     | Scalar field which is solved for, e.g. temperature
+        D_T   | Diffusion coefficient
+    \endvartable
+
+    \heading Required fields
+    \plaintable
+        T     | Scalar field which is solved for, e.g. temperature
+    \endplaintable
+
+\*---------------------------------------------------------------------------*/
+
+#include "fvCFD.H"
+#include "simpleControl.H"
+#include "dynamicFvMesh.H"
+#include "dynamicOversetFvMesh.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+int main(int argc, char *argv[])
+{
+    #include "setRootCase.H"
+
+    #include "createTime.H"
+    #include "createNamedDynamicFvMesh.H"
+
+    simpleControl simple(mesh);
+
+    #include "createFields.H"
+
+    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+    Info<< "\nCorrecting boundary conditions on " << T.name() << nl << endl;
+
+    runTime++;
+
+    Info<< "Time = " << runTime.timeName() << nl << endl;
+
+    Info<< "Reading : ExecutionTime = " << runTime.elapsedCpuTime() << " s"
+        << "  ClockTime = " << runTime.elapsedClockTime() << " s"
+        << nl << endl;
+
+    mesh.update();
+
+    Info<< "Overset calculation : ExecutionTime = "
+        << runTime.elapsedCpuTime() << " s"
+        << "  ClockTime = " << runTime.elapsedClockTime() << " s"
+        << nl << endl;
+
+
+    if (false)
+    {
+        // Test correctBoundaryConditions
+
+        // Change the internalField
+        component(T.ref(), mesh.C(), 0);
+        component(T.ref(), mesh.C(), 1);
+        // Interpolate + halo swap
+        T.correctBoundaryConditions();
+        // Check halo swap
+        dynamicOversetFvMesh::checkCoupledBC(T);
+    }
+    if (true)
+    {
+        // Test solving
+        fvScalarMatrix TEqn(fvm::laplacian(DT, T));
+        TEqn.solve();
+    }
+
+    runTime.write();
+
+
+
+    Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
+        << "  ClockTime = " << runTime.elapsedClockTime() << " s"
+        << nl << endl;
+
+    Info<< "End\n" << endl;
+
+    return 0;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/test/parallelOverset/write.H b/applications/test/parallelOverset/write.H
new file mode 100644
index 00000000000..47aa182c0a9
--- /dev/null
+++ b/applications/test/parallelOverset/write.H
@@ -0,0 +1,46 @@
+    if (runTime.outputTime())
+    {
+        volVectorField gradT(fvc::grad(T));
+
+        volScalarField gradTx
+        (
+            IOobject
+            (
+                "gradTx",
+                runTime.timeName(),
+                mesh,
+                IOobject::NO_READ,
+                IOobject::AUTO_WRITE
+            ),
+            gradT.component(vector::X)
+        );
+
+        volScalarField gradTy
+        (
+            IOobject
+            (
+                "gradTy",
+                runTime.timeName(),
+                mesh,
+                IOobject::NO_READ,
+                IOobject::AUTO_WRITE
+            ),
+            gradT.component(vector::Y)
+        );
+
+        volScalarField gradTz
+        (
+            IOobject
+            (
+                "gradTz",
+                runTime.timeName(),
+                mesh,
+                IOobject::NO_READ,
+                IOobject::AUTO_WRITE
+            ),
+            gradT.component(vector::Z)
+        );
+
+
+        runTime.write();
+    }
diff --git a/applications/test/wallDistDyM/Make/files b/applications/test/wallDistDyM/Make/files
new file mode 100644
index 00000000000..c84f5e72f5b
--- /dev/null
+++ b/applications/test/wallDistDyM/Make/files
@@ -0,0 +1,3 @@
+Test-wallDistDyM.C
+
+EXE = $(FOAM_USER_APPBIN)/Test-wallDistDyM
diff --git a/applications/test/wallDistDyM/Make/options b/applications/test/wallDistDyM/Make/options
new file mode 100644
index 00000000000..8a9d17bf25b
--- /dev/null
+++ b/applications/test/wallDistDyM/Make/options
@@ -0,0 +1,9 @@
+EXE_INC = \
+    -I$(LIB_SRC)/finiteVolume/lnInclude \
+    -I$(LIB_SRC)/dynamicFvMesh/lnInclude \
+    -I$(LIB_SRC)/meshTools/lnInclude
+
+EXE_LIBS = \
+    -lfiniteVolume \
+    -lmeshTools \
+    -ldynamicFvMesh
diff --git a/applications/test/wallDistDyM/Test-wallDistDyM.C b/applications/test/wallDistDyM/Test-wallDistDyM.C
new file mode 100644
index 00000000000..cfa1bbb8be9
--- /dev/null
+++ b/applications/test/wallDistDyM/Test-wallDistDyM.C
@@ -0,0 +1,69 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenFOAM Foundation
+     \\/     M anipulation  | Copyright (C) 2017 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Description
+    Calculate and write the distance-to-wall field for a moving mesh.
+
+\*---------------------------------------------------------------------------*/
+
+#include "argList.H"
+#include "Time.H"
+#include "dynamicFvMesh.H"
+#include "wallDist.H"
+
+using namespace Foam;
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+// Main program:
+
+int main(int argc, char *argv[])
+{
+    #include "setRootCase.H"
+    #include "createTime.H"
+    #include "createDynamicFvMesh.H"
+
+    Info<< "Mesh read in = "
+        << runTime.cpuTimeIncrement()
+        << " s\n" << endl << endl;
+
+    // Calculate initial mesh-to-mesh mapping. Note that this should be
+    // done under the hood, e.g. as a MeshObject
+    mesh.update();
+
+    Info<< "Time now = " << runTime.timeName() << endl;
+
+    // Wall-reflection vectors
+    const volVectorField& n = wallDist::New(mesh).n();
+    n.write();
+
+    // Wall distance
+    const volScalarField& y = wallDist::New(mesh).y();
+    y.write();
+
+    Info<< "End\n" << endl;
+
+    return 0;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/utilities/mesh/manipulation/mergeOrSplitBaffles/mergeOrSplitBaffles.C b/applications/utilities/mesh/manipulation/mergeOrSplitBaffles/mergeOrSplitBaffles.C
index 2739ecedd7d..ec10dbb003f 100644
--- a/applications/utilities/mesh/manipulation/mergeOrSplitBaffles/mergeOrSplitBaffles.C
+++ b/applications/utilities/mesh/manipulation/mergeOrSplitBaffles/mergeOrSplitBaffles.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2016-2017 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -177,7 +177,7 @@ void insertDuplicateMerge
 label patchSize(const polyMesh& mesh, const labelList& patchIDs)
 {
     const polyBoundaryMesh& patches = mesh.boundaryMesh();
-   
+
     label sz = 0;
     forAll(patchIDs, i)
     {
@@ -191,7 +191,7 @@ label patchSize(const polyMesh& mesh, const labelList& patchIDs)
 labelList patchFaces(const polyMesh& mesh, const labelList& patchIDs)
 {
     const polyBoundaryMesh& patches = mesh.boundaryMesh();
-   
+
     labelList faceIDs(patchSize(mesh, patchIDs));
     label sz = 0;
     forAll(patchIDs, i)
diff --git a/etc/caseDicts/setConstraintTypes b/etc/caseDicts/setConstraintTypes
index 4fc38fabf02..2098261a27f 100644
--- a/etc/caseDicts/setConstraintTypes
+++ b/etc/caseDicts/setConstraintTypes
@@ -64,5 +64,10 @@ wedge
     type  wedge;
 }
 
+overset
+{
+    type  overset;
+}
+
 
 // ************************************************************************* //
diff --git a/src/Allwmake b/src/Allwmake
index 1e71c42e0cd..abe861514e0 100755
--- a/src/Allwmake
+++ b/src/Allwmake
@@ -54,6 +54,8 @@ wmake $targetType topoChangerFvMesh
 parallel/Allwmake $targetType $*
 randomProcesses/Allwmake $targetType $*
 
+wmake $targetType overset
+
 wmake $targetType ODE
 wmake $targetType fvMotionSolver
 
diff --git a/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduInterfaceField/LduInterfaceField.H b/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduInterfaceField/LduInterfaceField.H
index 289649f2a9c..e1fd26b6c1c 100644
--- a/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduInterfaceField/LduInterfaceField.H
+++ b/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduInterfaceField/LduInterfaceField.H
@@ -97,6 +97,7 @@ public:
             virtual void initInterfaceMatrixUpdate
             (
                 Field<Type>&,
+                const bool add,
                 const Field<Type>&,
                 const scalarField&,
                 const Pstream::commsTypes commsType
@@ -110,6 +111,7 @@ public:
             virtual void updateInterfaceMatrix
             (
                 Field<Type>&,
+                const bool add,
                 const Field<Type>&,
                 const scalarField&,
                 const Pstream::commsTypes commsType
diff --git a/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduMatrix.H b/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduMatrix.H
index f96d583b1f2..bcc35cc0eda 100644
--- a/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduMatrix.H
+++ b/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduMatrix.H
@@ -617,6 +617,7 @@ public:
             //  for matrix operations
             void initMatrixInterfaces
             (
+                const bool add,
                 const FieldField<Field, LUType>& interfaceCoeffs,
                 const Field<Type>& psiif,
                 Field<Type>& result
@@ -625,6 +626,7 @@ public:
             //- Update interfaced interfaces for matrix operations
             void updateMatrixInterfaces
             (
+                const bool add,
                 const FieldField<Field, LUType>& interfaceCoeffs,
                 const Field<Type>& psiif,
                 Field<Type>& result
diff --git a/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduMatrixATmul.C b/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduMatrixATmul.C
index 0aa6d260637..84c61a3c671 100644
--- a/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduMatrixATmul.C
+++ b/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduMatrixATmul.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2017 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -82,6 +82,7 @@ void Foam::LduMatrix<Type, DType, LUType>::Amul
     // Initialise the update of interfaced interfaces
     initMatrixInterfaces
     (
+        true,
         interfacesUpper_,
         psi,
         Apsi
@@ -104,6 +105,7 @@ void Foam::LduMatrix<Type, DType, LUType>::Amul
     // Update interface interfaces
     updateMatrixInterfaces
     (
+        true,
         interfacesUpper_,
         psi,
         Apsi
@@ -136,6 +138,7 @@ void Foam::LduMatrix<Type, DType, LUType>::Tmul
     // Initialise the update of interfaced interfaces
     initMatrixInterfaces
     (
+        true,
         interfacesLower_,
         psi,
         Tpsi
@@ -157,6 +160,7 @@ void Foam::LduMatrix<Type, DType, LUType>::Tmul
     // Update interface interfaces
     updateMatrixInterfaces
     (
+        true,
         interfacesLower_,
         psi,
         Tpsi
@@ -237,20 +241,11 @@ void Foam::LduMatrix<Type, DType, LUType>::residual
     // Note: there is a change of sign in the coupled
     // interface update to add the contibution to the r.h.s.
 
-    FieldField<Field, LUType> mBouCoeffs(interfacesUpper_.size());
-
-    forAll(mBouCoeffs, patchi)
-    {
-        if (interfaces_.set(patchi))
-        {
-            mBouCoeffs.set(patchi, -interfacesUpper_[patchi]);
-        }
-    }
-
     // Initialise the update of interfaced interfaces
     initMatrixInterfaces
     (
-        mBouCoeffs,
+        false,          // negate interface contributions
+        interfacesUpper_,
         psi,
         rA
     );
@@ -272,7 +267,8 @@ void Foam::LduMatrix<Type, DType, LUType>::residual
     // Update interface interfaces
     updateMatrixInterfaces
     (
-        mBouCoeffs,
+        false,
+        interfacesUpper_,
         psi,
         rA
     );
diff --git a/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduMatrixUpdateMatrixInterfaces.C b/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduMatrixUpdateMatrixInterfaces.C
index 465c097bf09..123cc71a103 100644
--- a/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduMatrixUpdateMatrixInterfaces.C
+++ b/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduMatrixUpdateMatrixInterfaces.C
@@ -31,6 +31,7 @@ License
 template<class Type, class DType, class LUType>
 void Foam::LduMatrix<Type, DType, LUType>::initMatrixInterfaces
 (
+    const bool add,
     const FieldField<Field, LUType>& interfaceCoeffs,
     const Field<Type>& psiif,
     Field<Type>& result
@@ -49,6 +50,7 @@ void Foam::LduMatrix<Type, DType, LUType>::initMatrixInterfaces
                 interfaces_[interfacei].initInterfaceMatrixUpdate
                 (
                     result,
+                    add,
                     psiif,
                     interfaceCoeffs[interfacei],
                     //Amultiplier<Type, LUType>(interfaceCoeffs[interfacei]),
@@ -75,6 +77,7 @@ void Foam::LduMatrix<Type, DType, LUType>::initMatrixInterfaces
                 interfaces_[interfacei].initInterfaceMatrixUpdate
                 (
                     result,
+                    add,
                     psiif,
                     interfaceCoeffs[interfacei],
                     //Amultiplier<Type, LUType>(interfaceCoeffs[interfacei]),
@@ -96,6 +99,7 @@ void Foam::LduMatrix<Type, DType, LUType>::initMatrixInterfaces
 template<class Type, class DType, class LUType>
 void Foam::LduMatrix<Type, DType, LUType>::updateMatrixInterfaces
 (
+    const bool add,
     const FieldField<Field, LUType>& interfaceCoeffs,
     const Field<Type>& psiif,
     Field<Type>& result
@@ -121,6 +125,7 @@ void Foam::LduMatrix<Type, DType, LUType>::updateMatrixInterfaces
                 interfaces_[interfacei].updateInterfaceMatrix
                 (
                     result,
+                    add,
                     psiif,
                     interfaceCoeffs[interfacei],
                     //Amultiplier<Type, LUType>(interfaceCoeffs[interfacei]),
@@ -145,6 +150,7 @@ void Foam::LduMatrix<Type, DType, LUType>::updateMatrixInterfaces
                     interfaces_[interfacei].initInterfaceMatrixUpdate
                     (
                         result,
+                        add,
                         psiif,
                         interfaceCoeffs[interfacei],
                       //Amultiplier<Type, LUType>(interfaceCoeffs[interfacei]),
@@ -156,6 +162,7 @@ void Foam::LduMatrix<Type, DType, LUType>::updateMatrixInterfaces
                     interfaces_[interfacei].updateInterfaceMatrix
                     (
                         result,
+                        add,
                         psiif,
                         interfaceCoeffs[interfacei],
                       //Amultiplier<Type, LUType>(interfaceCoeffs[interfacei]),
@@ -179,6 +186,7 @@ void Foam::LduMatrix<Type, DType, LUType>::updateMatrixInterfaces
                 interfaces_[interfacei].updateInterfaceMatrix
                 (
                     result,
+                    add,
                     psiif,
                     interfaceCoeffs[interfacei],
                     //Amultiplier<Type, LUType>(interfaceCoeffs[interfacei]),
diff --git a/src/OpenFOAM/matrices/LduMatrix/Smoothers/GaussSeidel/TGaussSeidelSmoother.C b/src/OpenFOAM/matrices/LduMatrix/Smoothers/GaussSeidel/TGaussSeidelSmoother.C
index b37ceaa5bab..29cad04bb83 100644
--- a/src/OpenFOAM/matrices/LduMatrix/Smoothers/GaussSeidel/TGaussSeidelSmoother.C
+++ b/src/OpenFOAM/matrices/LduMatrix/Smoothers/GaussSeidel/TGaussSeidelSmoother.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2017 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -91,30 +91,22 @@ void Foam::TGaussSeidelSmoother<Type, DType, LUType>::smooth
     // Note: there is a change of sign in the coupled
     // interface update to add the contibution to the r.h.s.
 
-    FieldField<Field, LUType> mBouCoeffs(matrix_.interfacesUpper().size());
-
-    forAll(mBouCoeffs, patchi)
-    {
-        if (matrix_.interfaces().set(patchi))
-        {
-            mBouCoeffs.set(patchi, -matrix_.interfacesUpper()[patchi]);
-        }
-    }
-
     for (label sweep=0; sweep<nSweeps; sweep++)
     {
         bPrime = matrix_.source();
 
         matrix_.initMatrixInterfaces
         (
-            mBouCoeffs,
+            false,
+            matrix_.interfacesUpper(),
             psi,
             bPrime
         );
 
         matrix_.updateMatrixInterfaces
         (
-            mBouCoeffs,
+            false,
+            matrix_.interfacesUpper(),
             psi,
             bPrime
         );
diff --git a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduAddressing.C b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduAddressing.C
index d8185f43b91..02bbd1a3939 100644
--- a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduAddressing.C
+++ b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduAddressing.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -215,6 +215,14 @@ const Foam::labelUList& Foam::lduAddressing::losortStartAddr() const
 }
 
 
+void Foam::lduAddressing::clearOut()
+{
+    deleteDemandDrivenData(losortPtr_);
+    deleteDemandDrivenData(ownerStartPtr_);
+    deleteDemandDrivenData(losortStartPtr_);
+}
+
+
 Foam::label Foam::lduAddressing::triIndex(const label a, const label b) const
 {
     label own = min(a, b);
diff --git a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduAddressing.H b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduAddressing.H
index b5d6f933b13..fa405d37382 100644
--- a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduAddressing.H
+++ b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduAddressing.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -186,6 +186,9 @@ public:
         // Return patch field evaluation schedule
         virtual const lduSchedule& patchSchedule() const = 0;
 
+        //- Clear additional addressing
+        void clearOut();
+
         //- Return losort addressing
         const labelUList& losortAddr() const;
 
diff --git a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/lduInterfaceField/lduInterfaceField.H b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/lduInterfaceField/lduInterfaceField.H
index 1fdd8f4219c..3ce8c096d66 100644
--- a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/lduInterfaceField/lduInterfaceField.H
+++ b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/lduInterfaceField/lduInterfaceField.H
@@ -131,10 +131,12 @@ public:
                 return true;
             }
 
-            //- Initialise neighbour matrix update
+            //- Initialise neighbour matrix update. Add
+            //  or subtract coupled contributions to matrix
             virtual void initInterfaceMatrixUpdate
             (
                 scalarField&,
+                const bool add,
                 const scalarField&,
                 const scalarField&,
                 const direction,
@@ -142,15 +144,28 @@ public:
             ) const
             {}
 
-            //- Update result field based on interface functionality
+            //- Update result field based on interface functionality. Add
+            //  or subtract coupled contributions to matrix
             virtual void updateInterfaceMatrix
             (
                 scalarField&,
+                const bool add,
                 const scalarField&,
                 const scalarField&,
                 const direction,
                 const Pstream::commsTypes commsType
             ) const = 0;
+
+            //- Helper: add (or subtract) weighted contributions to internal
+            //  field
+            template<class Type>
+            void addToInternalField
+            (
+                Field<Type>& result,
+                const bool add,
+                const scalarField& coeffs,
+                const Field<Type>& vals
+            ) const;
 };
 
 
@@ -160,6 +175,12 @@ public:
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
+#ifdef NoRepository
+    #include "lduInterfaceFieldTemplates.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
 #endif
 
 // ************************************************************************* //
diff --git a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/lduInterfaceField/lduInterfaceFieldTemplates.C b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/lduInterfaceField/lduInterfaceFieldTemplates.C
new file mode 100644
index 00000000000..12af2788467
--- /dev/null
+++ b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/lduInterfaceField/lduInterfaceFieldTemplates.C
@@ -0,0 +1,56 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class Type>
+void Foam::lduInterfaceField::addToInternalField
+(
+    Field<Type>& result,
+    const bool add,
+    const scalarField& coeffs,
+    const Field<Type>& vals
+) const
+{
+    const labelUList& faceCells = this->interface().faceCells();
+
+    if (add)
+    {
+        forAll(faceCells, elemI)
+        {
+            result[faceCells[elemI]] += coeffs[elemI]*vals[elemI];
+        }
+    }
+    else
+    {
+        forAll(faceCells, elemI)
+        {
+            result[faceCells[elemI]] -= coeffs[elemI]*vals[elemI];
+        }
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrix.H b/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrix.H
index 4ef5055cfb1..38301514e98 100644
--- a/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrix.H
+++ b/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrix.H
@@ -672,6 +672,7 @@ public:
             //  for matrix operations
             void initMatrixInterfaces
             (
+                const bool add,
                 const FieldField<Field, scalar>& interfaceCoeffs,
                 const lduInterfaceFieldPtrsList& interfaces,
                 const scalarField& psiif,
@@ -682,6 +683,7 @@ public:
             //- Update interfaced interfaces for matrix operations
             void updateMatrixInterfaces
             (
+                const bool add,
                 const FieldField<Field, scalar>& interfaceCoeffs,
                 const lduInterfaceFieldPtrsList& interfaces,
                 const scalarField& psiif,
diff --git a/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixATmul.C b/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixATmul.C
index 715fb420bac..ac340418514 100644
--- a/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixATmul.C
+++ b/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixATmul.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2017 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -56,6 +56,7 @@ void Foam::lduMatrix::Amul
     // Initialise the update of interfaced interfaces
     initMatrixInterfaces
     (
+        true,
         interfaceBouCoeffs,
         interfaces,
         psi,
@@ -81,6 +82,7 @@ void Foam::lduMatrix::Amul
     // Update interface interfaces
     updateMatrixInterfaces
     (
+        true,
         interfaceBouCoeffs,
         interfaces,
         psi,
@@ -117,6 +119,7 @@ void Foam::lduMatrix::Tmul
     // Initialise the update of interfaced interfaces
     initMatrixInterfaces
     (
+        true,
         interfaceIntCoeffs,
         interfaces,
         psi,
@@ -140,6 +143,7 @@ void Foam::lduMatrix::Tmul
     // Update interface interfaces
     updateMatrixInterfaces
     (
+        true,
         interfaceIntCoeffs,
         interfaces,
         psi,
@@ -233,20 +237,11 @@ void Foam::lduMatrix::residual
     // To compensate for this, it is necessary to turn the
     // sign of the contribution.
 
-    FieldField<Field, scalar> mBouCoeffs(interfaceBouCoeffs.size());
-
-    forAll(mBouCoeffs, patchi)
-    {
-        if (interfaces.set(patchi))
-        {
-            mBouCoeffs.set(patchi, -interfaceBouCoeffs[patchi]);
-        }
-    }
-
     // Initialise the update of interfaced interfaces
     initMatrixInterfaces
     (
-        mBouCoeffs,
+        false,
+        interfaceBouCoeffs,
         interfaces,
         psi,
         rA,
@@ -271,7 +266,8 @@ void Foam::lduMatrix::residual
     // Update interface interfaces
     updateMatrixInterfaces
     (
-        mBouCoeffs,
+        false,
+        interfaceBouCoeffs,
         interfaces,
         psi,
         rA,
diff --git a/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixUpdateMatrixInterfaces.C b/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixUpdateMatrixInterfaces.C
index af65e1bc686..28dc38f75cd 100644
--- a/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixUpdateMatrixInterfaces.C
+++ b/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixUpdateMatrixInterfaces.C
@@ -29,6 +29,7 @@ License
 
 void Foam::lduMatrix::initMatrixInterfaces
 (
+    const bool add,
     const FieldField<Field, scalar>& coupleCoeffs,
     const lduInterfaceFieldPtrsList& interfaces,
     const scalarField& psiif,
@@ -49,6 +50,7 @@ void Foam::lduMatrix::initMatrixInterfaces
                 interfaces[interfacei].initInterfaceMatrixUpdate
                 (
                     result,
+                    add,
                     psiif,
                     coupleCoeffs[interfacei],
                     cmpt,
@@ -75,6 +77,7 @@ void Foam::lduMatrix::initMatrixInterfaces
                 interfaces[interfacei].initInterfaceMatrixUpdate
                 (
                     result,
+                    add,
                     psiif,
                     coupleCoeffs[interfacei],
                     cmpt,
@@ -95,6 +98,7 @@ void Foam::lduMatrix::initMatrixInterfaces
 
 void Foam::lduMatrix::updateMatrixInterfaces
 (
+    const bool add,
     const FieldField<Field, scalar>& coupleCoeffs,
     const lduInterfaceFieldPtrsList& interfaces,
     const scalarField& psiif,
@@ -111,6 +115,7 @@ void Foam::lduMatrix::updateMatrixInterfaces
                 interfaces[interfacei].updateInterfaceMatrix
                 (
                     result,
+                    add,
                     psiif,
                     coupleCoeffs[interfacei],
                     cmpt,
@@ -139,6 +144,7 @@ void Foam::lduMatrix::updateMatrixInterfaces
                             interfaces[interfacei].updateInterfaceMatrix
                             (
                                 result,
+                                add,
                                 psiif,
                                 coupleCoeffs[interfacei],
                                 cmpt,
@@ -190,6 +196,7 @@ void Foam::lduMatrix::updateMatrixInterfaces
                 interfaces[interfacei].updateInterfaceMatrix
                 (
                     result,
+                    add,
                     psiif,
                     coupleCoeffs[interfacei],
                     cmpt,
@@ -214,6 +221,7 @@ void Foam::lduMatrix::updateMatrixInterfaces
                     interfaces[interfacei].initInterfaceMatrixUpdate
                     (
                         result,
+                        add,
                         psiif,
                         coupleCoeffs[interfacei],
                         cmpt,
@@ -225,6 +233,7 @@ void Foam::lduMatrix::updateMatrixInterfaces
                     interfaces[interfacei].updateInterfaceMatrix
                     (
                         result,
+                        add,
                         psiif,
                         coupleCoeffs[interfacei],
                         cmpt,
@@ -248,6 +257,7 @@ void Foam::lduMatrix::updateMatrixInterfaces
                 interfaces[interfacei].updateInterfaceMatrix
                 (
                     result,
+                    add,
                     psiif,
                     coupleCoeffs[interfacei],
                     cmpt,
diff --git a/src/OpenFOAM/matrices/lduMatrix/smoothers/GaussSeidel/GaussSeidelSmoother.C b/src/OpenFOAM/matrices/lduMatrix/smoothers/GaussSeidel/GaussSeidelSmoother.C
index b233813d31c..40c5892a69e 100644
--- a/src/OpenFOAM/matrices/lduMatrix/smoothers/GaussSeidel/GaussSeidelSmoother.C
+++ b/src/OpenFOAM/matrices/lduMatrix/smoothers/GaussSeidel/GaussSeidelSmoother.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2015 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2017 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -107,28 +107,14 @@ void Foam::GaussSeidelSmoother::smooth
     // To compensate for this, it is necessary to turn the
     // sign of the contribution.
 
-    FieldField<Field, scalar>& mBouCoeffs =
-        const_cast<FieldField<Field, scalar>&>
-        (
-            interfaceBouCoeffs_
-        );
-
-    forAll(mBouCoeffs, patchi)
-    {
-        if (interfaces_.set(patchi))
-        {
-            mBouCoeffs[patchi].negate();
-        }
-    }
-
-
     for (label sweep=0; sweep<nSweeps; sweep++)
     {
         bPrime = source;
 
         matrix_.initMatrixInterfaces
         (
-            mBouCoeffs,
+            false,
+            interfaceBouCoeffs_,
             interfaces_,
             psi,
             bPrime,
@@ -137,7 +123,8 @@ void Foam::GaussSeidelSmoother::smooth
 
         matrix_.updateMatrixInterfaces
         (
-            mBouCoeffs,
+            false,
+            interfaceBouCoeffs_,
             interfaces_,
             psi,
             bPrime,
@@ -175,15 +162,6 @@ void Foam::GaussSeidelSmoother::smooth
             psiPtr[celli] = psii;
         }
     }
-
-    // Restore interfaceBouCoeffs_
-    forAll(mBouCoeffs, patchi)
-    {
-        if (interfaces_.set(patchi))
-        {
-            mBouCoeffs[patchi].negate();
-        }
-    }
 }
 
 
diff --git a/src/OpenFOAM/matrices/lduMatrix/smoothers/nonBlockingGaussSeidel/nonBlockingGaussSeidelSmoother.C b/src/OpenFOAM/matrices/lduMatrix/smoothers/nonBlockingGaussSeidel/nonBlockingGaussSeidelSmoother.C
index bfae4ef0496..af6f772c21e 100644
--- a/src/OpenFOAM/matrices/lduMatrix/smoothers/nonBlockingGaussSeidel/nonBlockingGaussSeidelSmoother.C
+++ b/src/OpenFOAM/matrices/lduMatrix/smoothers/nonBlockingGaussSeidel/nonBlockingGaussSeidelSmoother.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2017 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -134,18 +134,6 @@ void Foam::nonBlockingGaussSeidelSmoother::smooth
     // To compensate for this, it is necessary to turn the
     // sign of the contribution.
 
-    FieldField<Field, scalar>& mBouCoeffs =
-        const_cast<FieldField<Field, scalar>&>
-        (
-            interfaceBouCoeffs_
-        );
-    forAll(mBouCoeffs, patchi)
-    {
-        if (interfaces_.set(patchi))
-        {
-            mBouCoeffs[patchi].negate();
-        }
-    }
 
     for (label sweep=0; sweep<nSweeps; sweep++)
     {
@@ -153,7 +141,8 @@ void Foam::nonBlockingGaussSeidelSmoother::smooth
 
         matrix_.initMatrixInterfaces
         (
-            mBouCoeffs,
+            false,
+            interfaceBouCoeffs_,
             interfaces_,
             psi,
             bPrime,
@@ -193,7 +182,8 @@ void Foam::nonBlockingGaussSeidelSmoother::smooth
 
         matrix_.updateMatrixInterfaces
         (
-            mBouCoeffs,
+            false,
+            interfaceBouCoeffs_,
             interfaces_,
             psi,
             bPrime,
@@ -228,15 +218,6 @@ void Foam::nonBlockingGaussSeidelSmoother::smooth
             psiPtr[celli] = curPsi;
         }
     }
-
-    // Restore interfaceBouCoeffs_
-    forAll(mBouCoeffs, patchi)
-    {
-        if (interfaces_.set(patchi))
-        {
-            mBouCoeffs[patchi].negate();
-        }
-    }
 }
 
 
diff --git a/src/OpenFOAM/matrices/lduMatrix/smoothers/symGaussSeidel/symGaussSeidelSmoother.C b/src/OpenFOAM/matrices/lduMatrix/smoothers/symGaussSeidel/symGaussSeidelSmoother.C
index 436b7e22f05..57b27608add 100644
--- a/src/OpenFOAM/matrices/lduMatrix/smoothers/symGaussSeidel/symGaussSeidelSmoother.C
+++ b/src/OpenFOAM/matrices/lduMatrix/smoothers/symGaussSeidel/symGaussSeidelSmoother.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2012-2015 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2017 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -107,28 +107,14 @@ void Foam::symGaussSeidelSmoother::smooth
     // To compensate for this, it is necessary to turn the
     // sign of the contribution.
 
-    FieldField<Field, scalar>& mBouCoeffs =
-        const_cast<FieldField<Field, scalar>&>
-        (
-            interfaceBouCoeffs_
-        );
-
-    forAll(mBouCoeffs, patchi)
-    {
-        if (interfaces_.set(patchi))
-        {
-            mBouCoeffs[patchi].negate();
-        }
-    }
-
-
     for (label sweep=0; sweep<nSweeps; sweep++)
     {
         bPrime = source;
 
         matrix_.initMatrixInterfaces
         (
-            mBouCoeffs,
+            false,
+            interfaceBouCoeffs_,
             interfaces_,
             psi,
             bPrime,
@@ -137,7 +123,8 @@ void Foam::symGaussSeidelSmoother::smooth
 
         matrix_.updateMatrixInterfaces
         (
-            mBouCoeffs,
+            false,
+            interfaceBouCoeffs_,
             interfaces_,
             psi,
             bPrime,
@@ -204,15 +191,6 @@ void Foam::symGaussSeidelSmoother::smooth
             psiPtr[celli] = psii;
         }
     }
-
-    // Restore interfaceBouCoeffs_
-    forAll(mBouCoeffs, patchi)
-    {
-        if (interfaces_.set(patchi))
-        {
-            mBouCoeffs[patchi].negate();
-        }
-    }
 }
 
 
diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGAgglomerations/algebraicPairGAMGAgglomeration/algebraicPairGAMGAgglomeration.C b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGAgglomerations/algebraicPairGAMGAgglomeration/algebraicPairGAMGAgglomeration.C
index 6d769f4099e..af384a3158c 100644
--- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGAgglomerations/algebraicPairGAMGAgglomeration/algebraicPairGAMGAgglomeration.C
+++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGAgglomerations/algebraicPairGAMGAgglomeration/algebraicPairGAMGAgglomeration.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverInterpolate.C b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverInterpolate.C
index 3896775f435..6f0a1725591 100644
--- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverInterpolate.C
+++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverInterpolate.C
@@ -51,6 +51,7 @@ void Foam::GAMGSolver::interpolate
 
     m.initMatrixInterfaces
     (
+        true,
         interfaceBouCoeffs,
         interfaces,
         psi,
@@ -67,6 +68,7 @@ void Foam::GAMGSolver::interpolate
 
     m.updateMatrixInterfaces
     (
+        true,
         interfaceBouCoeffs,
         interfaces,
         psi,
diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverSolve.C b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverSolve.C
index c4157d57f2c..e5332f52fe6 100644
--- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverSolve.C
+++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverSolve.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/cyclicGAMGInterfaceField/cyclicGAMGInterfaceField.C b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/cyclicGAMGInterfaceField/cyclicGAMGInterfaceField.C
index 6eebf5f6091..0d2b0c1d166 100644
--- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/cyclicGAMGInterfaceField/cyclicGAMGInterfaceField.C
+++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/cyclicGAMGInterfaceField/cyclicGAMGInterfaceField.C
@@ -109,6 +109,7 @@ Foam::cyclicGAMGInterfaceField::~cyclicGAMGInterfaceField()
 void Foam::cyclicGAMGInterfaceField::updateInterfaceMatrix
 (
     scalarField& result,
+    const bool add,
     const scalarField& psiInternal,
     const scalarField& coeffs,
     const direction cmpt,
@@ -123,12 +124,7 @@ void Foam::cyclicGAMGInterfaceField::updateInterfaceMatrix
 
     transformCoupleField(pnf, cmpt);
 
-    const labelUList& faceCells = cyclicInterface_.faceCells();
-
-    forAll(faceCells, elemI)
-    {
-        result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI];
-    }
+    this->addToInternalField(result, !add, coeffs, pnf);
 }
 
 
diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/cyclicGAMGInterfaceField/cyclicGAMGInterfaceField.H b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/cyclicGAMGInterfaceField/cyclicGAMGInterfaceField.H
index f9068707cae..6402e5efd1e 100644
--- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/cyclicGAMGInterfaceField/cyclicGAMGInterfaceField.H
+++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/cyclicGAMGInterfaceField/cyclicGAMGInterfaceField.H
@@ -146,6 +146,7 @@ public:
             virtual void updateInterfaceMatrix
             (
                 scalarField& result,
+                const bool add,
                 const scalarField& psiInternal,
                 const scalarField& coeffs,
                 const direction cmpt,
diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/processorGAMGInterfaceField/processorGAMGInterfaceField.C b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/processorGAMGInterfaceField/processorGAMGInterfaceField.C
index 852caef35f9..3f77067f067 100644
--- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/processorGAMGInterfaceField/processorGAMGInterfaceField.C
+++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/processorGAMGInterfaceField/processorGAMGInterfaceField.C
@@ -93,6 +93,7 @@ Foam::processorGAMGInterfaceField::~processorGAMGInterfaceField()
 void Foam::processorGAMGInterfaceField::initInterfaceMatrixUpdate
 (
     scalarField&,
+    const bool,
     const scalarField& psiInternal,
     const scalarField&,
     const direction,
@@ -148,6 +149,7 @@ void Foam::processorGAMGInterfaceField::initInterfaceMatrixUpdate
 void Foam::processorGAMGInterfaceField::updateInterfaceMatrix
 (
     scalarField& result,
+    const bool add,
     const scalarField&,
     const scalarField& coeffs,
     const direction cmpt,
@@ -162,8 +164,6 @@ void Foam::processorGAMGInterfaceField::updateInterfaceMatrix
     label oldWarn = UPstream::warnComm;
     UPstream::warnComm = comm();
 
-    const labelUList& faceCells = procInterface_.faceCells();
-
     if
     (
         commsType == Pstream::commsTypes::nonBlocking
@@ -189,10 +189,7 @@ void Foam::processorGAMGInterfaceField::updateInterfaceMatrix
         transformCoupleField(scalarReceiveBuf_, cmpt);
 
         // Multiply the field by coefficients and add into the result
-        forAll(faceCells, elemI)
-        {
-            result[faceCells[elemI]] -= coeffs[elemI]*scalarReceiveBuf_[elemI];
-        }
+        addToInternalField(result, !add, coeffs, scalarReceiveBuf_);
     }
     else
     {
@@ -202,10 +199,7 @@ void Foam::processorGAMGInterfaceField::updateInterfaceMatrix
         );
         transformCoupleField(pnf, cmpt);
 
-        forAll(faceCells, elemI)
-        {
-            result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI];
-        }
+        addToInternalField(result, !add, coeffs, pnf);
     }
 
     const_cast<processorGAMGInterfaceField&>(*this).updatedMatrix() = true;
diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/processorGAMGInterfaceField/processorGAMGInterfaceField.H b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/processorGAMGInterfaceField/processorGAMGInterfaceField.H
index be57260c440..acf48e7e15d 100644
--- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/processorGAMGInterfaceField/processorGAMGInterfaceField.H
+++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/processorGAMGInterfaceField/processorGAMGInterfaceField.H
@@ -135,6 +135,7 @@ public:
             virtual void initInterfaceMatrixUpdate
             (
                 scalarField& result,
+                const bool add,
                 const scalarField& psiInternal,
                 const scalarField& coeffs,
                 const direction cmpt,
@@ -145,6 +146,7 @@ public:
             virtual void updateInterfaceMatrix
             (
                 scalarField& result,
+                const bool add,
                 const scalarField& psiInternal,
                 const scalarField& coeffs,
                 const direction cmpt,
diff --git a/src/OpenFOAM/meshes/lduMesh/lduPrimitiveMesh.H b/src/OpenFOAM/meshes/lduMesh/lduPrimitiveMesh.H
index 7561554b64b..3c62577e4a5 100644
--- a/src/OpenFOAM/meshes/lduMesh/lduPrimitiveMesh.H
+++ b/src/OpenFOAM/meshes/lduMesh/lduPrimitiveMesh.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -78,21 +78,6 @@ class lduPrimitiveMesh
         //- Get size of all meshes
         static label totalSize(const PtrList<lduPrimitiveMesh>&);
 
-        static labelList upperTriOrder
-        (
-            const label nCells,
-            const labelUList& lower,
-            const labelUList& upper
-        );
-
-        //- Check if in upper-triangular ordering
-        static void checkUpperTriangular
-        (
-            const label size,
-            const labelUList& l,
-            const labelUList& u
-        );
-
         //- Disallow default bitwise copy construct
         lduPrimitiveMesh(const lduPrimitiveMesh&);
 
@@ -261,6 +246,21 @@ public:
             template<class ProcPatch>
             static lduSchedule nonBlockingSchedule(const lduInterfacePtrsList&);
 
+            //- Calculate upper-triangular order
+            static labelList upperTriOrder
+            (
+                const label nCells,
+                const labelUList& lower,
+                const labelUList& upper
+            );
+
+            //- Check if in upper-triangular ordering
+            static void checkUpperTriangular
+            (
+                const label size,
+                const labelUList& l,
+                const labelUList& u
+            );
 };
 
 
diff --git a/src/OpenFOAM/meshes/polyMesh/polyMeshTetDecomposition/polyMeshTetDecomposition.C b/src/OpenFOAM/meshes/polyMesh/polyMeshTetDecomposition/polyMeshTetDecomposition.C
index 04d7e7fbdc0..4f1edca3654 100644
--- a/src/OpenFOAM/meshes/polyMesh/polyMeshTetDecomposition/polyMeshTetDecomposition.C
+++ b/src/OpenFOAM/meshes/polyMesh/polyMeshTetDecomposition/polyMeshTetDecomposition.C
@@ -311,7 +311,7 @@ Foam::labelList Foam::polyMeshTetDecomposition::findFaceBasePts
         {
             FatalErrorInFunction
                 << "Coupled face base point exchange failure for face "
-                << fI
+                << fI << " at " << mesh.faceCentres()[fI]
                 << abort(FatalError);
         }
 
@@ -552,6 +552,7 @@ Foam::List<Foam::tetIndices> Foam::polyMeshTetDecomposition::faceTetIndices
         {
             WarningInFunction
                 << "No base point for face " << fI << ", " << f
+                << ", vertices " << UIndirectList<point>(mesh.points(), f)
                 << ", produces a valid tet decomposition."
                 << endl;
             nWarnings++;
@@ -616,6 +617,7 @@ Foam::tetIndices Foam::polyMeshTetDecomposition::triangleTetIndices
         {
             WarningInFunction
                 << "No base point for face " << fI << ", " << f
+                << ", vertices " << UIndirectList<point>(mesh.points(), f)
                 << ", produces a valid tet decomposition."
                 << endl;
             nWarnings++;
diff --git a/src/TurbulenceModels/compressible/turbulentFluidThermoModels/derivedFvPatchFields/turbulentTemperatureRadCoupledMixed/turbulentTemperatureRadCoupledMixedFvPatchScalarField.H.orig b/src/TurbulenceModels/compressible/turbulentFluidThermoModels/derivedFvPatchFields/turbulentTemperatureRadCoupledMixed/turbulentTemperatureRadCoupledMixedFvPatchScalarField.H.orig
deleted file mode 100644
index 9b725409dce..00000000000
--- a/src/TurbulenceModels/compressible/turbulentFluidThermoModels/derivedFvPatchFields/turbulentTemperatureRadCoupledMixed/turbulentTemperatureRadCoupledMixedFvPatchScalarField.H.orig
+++ /dev/null
@@ -1,219 +0,0 @@
-/*---------------------------------------------------------------------------*\
-  =========                 |
-  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-   \\    /   O peration     |
-<<<<<<< HEAD
-    \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  | Copyright (C) 2017 OpenCFD Ltd
-=======
-    \\  /    A nd           | Copyright (C) 2011-2017 OpenFOAM Foundation
-     \\/     M anipulation  |
->>>>>>> d2a62df7c
--------------------------------------------------------------------------------
-License
-    This file is part of OpenFOAM.
-
-    OpenFOAM is free software: you can redistribute it and/or modify it
-    under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
-    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-    for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
-
-Class
-    Foam::compressible::
-        turbulentTemperatureRadCoupledMixedFvPatchScalarField
-
-Description
-    Mixed boundary condition for temperature and radiation heat transfer
-    to be used for in multiregion cases. Optional thin thermal layer
-    resistances can be specified through thicknessLayers and kappaLayers
-    entries.
-
-    The thermal conductivity \c kappa can either be retrieved from various
-    possible sources, as detailed in the class temperatureCoupledBase.
-
-Usage
-    \table
-        Property     | Description             | Required    | Default value
-        Tnbr         | name of the field    | no | T
-        qrNbr      | name of the radiative flux in the nbr region | no | none
-        qr         | name of the radiative flux in this region | no | none
-        thicknessLayers | list of thicknesses per layer [m] | no |
-        kappaLayers  | list of thermal conductivites per layer [W/m/K] | no |
-        kappaMethod  | inherited from temperatureCoupledBase | inherited |
-        kappa        | inherited from temperatureCoupledBase | inherited |
-        thermalInertia | Add thermal inertia to wall node | no | false
-    \endtable
-
-    Example of the boundary condition specification:
-    \verbatim
-    <patchName>
-    {
-        type            compressible::turbulentTemperatureRadCoupledMixed;
-        Tnbr            T;
-        qrNbr           qr; // or none. Name of qr field on neighbour region
-        qr              qr; // or none. Name of qr field on local region
-        thicknessLayers (0.1 0.2 0.3 0.4);
-        kappaLayers     (1 2 3 4);
-        thermalInertia  false/true;
-        kappaMethod     lookup;
-        kappa           kappa;
-        value           uniform 300;
-    }
-    \endverbatim
-
-    Needs to be on underlying mapped(Wall)FvPatch.
-
-See also
-    Foam::temperatureCoupledBase
-
-SourceFiles
-    turbulentTemperatureRadCoupledMixedFvPatchScalarField.C
-
-\*---------------------------------------------------------------------------*/
-
-#ifndef turbulentTemperatureRadCoupledMixedFvPatchScalarField_H
-#define turbulentTemperatureRadCoupledMixedFvPatchScalarField_H
-
-#include "mixedFvPatchFields.H"
-#include "temperatureCoupledBase.H"
-#include "scalarList.H"
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-namespace Foam
-{
-namespace compressible
-{
-
-/*---------------------------------------------------------------------------*\
-    Class turbulentTemperatureRadCoupledMixedFvPatchScalarField Declaration
-\*---------------------------------------------------------------------------*/
-
-class turbulentTemperatureRadCoupledMixedFvPatchScalarField
-:
-    public mixedFvPatchScalarField,
-    public temperatureCoupledBase
-{
-    // Private data
-
-        //- Name of field on the neighbour region
-        const word TnbrName_;
-
-         //- Name of the radiative heat flux in the neighbout region
-        const word qrNbrName_;
-
-        //- Name of the radiative heat flux in local region
-        const word qrName_;
-
-        //- Thickness of layers
-        scalarList thicknessLayers_;
-
-        //- Conductivity of layers
-        scalarList kappaLayers_;
-
-        //- Total contact resistance
-        scalar contactRes_;
-
-        //- Thermal inertia term
-        Switch thermalInertia_;
-
-
-public:
-
-    //- Runtime type information
-    TypeName("compressible::turbulentTemperatureRadCoupledMixed");
-
-
-    // Constructors
-
-        //- Construct from patch and internal field
-        turbulentTemperatureRadCoupledMixedFvPatchScalarField
-        (
-            const fvPatch&,
-            const DimensionedField<scalar, volMesh>&
-        );
-
-        //- Construct from patch, internal field and dictionary
-        turbulentTemperatureRadCoupledMixedFvPatchScalarField
-        (
-            const fvPatch&,
-            const DimensionedField<scalar, volMesh>&,
-            const dictionary&
-        );
-
-        //- Construct by mapping given
-        //  turbulentTemperatureCoupledBaffleMixedFvPatchScalarField onto a
-        //  new patch
-        turbulentTemperatureRadCoupledMixedFvPatchScalarField
-        (
-            const
-            turbulentTemperatureRadCoupledMixedFvPatchScalarField&,
-            const fvPatch&,
-            const DimensionedField<scalar, volMesh>&,
-            const fvPatchFieldMapper&
-        );
-
-        //- Construct and return a clone
-        virtual tmp<fvPatchScalarField> clone() const
-        {
-            return tmp<fvPatchScalarField>
-            (
-                new turbulentTemperatureRadCoupledMixedFvPatchScalarField
-                (
-                    *this
-                )
-            );
-        }
-
-        //- Construct as copy setting internal field reference
-        turbulentTemperatureRadCoupledMixedFvPatchScalarField
-        (
-            const turbulentTemperatureRadCoupledMixedFvPatchScalarField&,
-            const DimensionedField<scalar, volMesh>&
-        );
-
-        //- Construct and return a clone setting internal field reference
-        virtual tmp<fvPatchScalarField> clone
-        (
-            const DimensionedField<scalar, volMesh>& iF
-        ) const
-        {
-            return tmp<fvPatchScalarField>
-            (
-                new turbulentTemperatureRadCoupledMixedFvPatchScalarField
-                (
-                    *this,
-                    iF
-                )
-            );
-        }
-
-
-    // Member functions
-
-        //- Update the coefficients associated with the patch field
-        virtual void updateCoeffs();
-
-        //- Write
-        virtual void write(Ostream&) const;
-};
-
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-} // End namespace compressible
-} // End namespace Foam
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-#endif
-
-// ************************************************************************* //
diff --git a/src/dynamicMesh/motionSolvers/displacement/interpolation/displacementInterpolationMotionSolver.H b/src/dynamicMesh/motionSolvers/displacement/interpolation/displacementInterpolationMotionSolver.H
index 2458d1d400c..785aa25ccaf 100644
--- a/src/dynamicMesh/motionSolvers/displacement/interpolation/displacementInterpolationMotionSolver.H
+++ b/src/dynamicMesh/motionSolvers/displacement/interpolation/displacementInterpolationMotionSolver.H
@@ -25,7 +25,7 @@ Class
     Foam::displacementInterpolationMotionSolver
 
 Group
-    grpMeshMotionSolvers 
+    grpMeshMotionSolvers
 
 Description
     Mesh motion solver for an fvMesh.
diff --git a/src/dynamicMesh/motionSolvers/displacement/layeredSolver/displacementLayeredMotionMotionSolver.H b/src/dynamicMesh/motionSolvers/displacement/layeredSolver/displacementLayeredMotionMotionSolver.H
index 07444532f4f..4975d8c875a 100644
--- a/src/dynamicMesh/motionSolvers/displacement/layeredSolver/displacementLayeredMotionMotionSolver.H
+++ b/src/dynamicMesh/motionSolvers/displacement/layeredSolver/displacementLayeredMotionMotionSolver.H
@@ -25,7 +25,7 @@ Class
     Foam::displacementLayeredMotionMotionSolver
 
 Group
-    grpMeshMotionSolvers 
+    grpMeshMotionSolvers
 
 Description
     Mesh motion solver for an (multi-block) extruded fvMesh. Gets given the
diff --git a/src/finiteVolume/fields/fvPatchFields/basic/coupled/coupledFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/basic/coupled/coupledFvPatchField.H
index 20d87b8e866..5523ef2eac7 100644
--- a/src/finiteVolume/fields/fvPatchFields/basic/coupled/coupledFvPatchField.H
+++ b/src/finiteVolume/fields/fvPatchFields/basic/coupled/coupledFvPatchField.H
@@ -207,6 +207,7 @@ public:
             virtual void updateInterfaceMatrix
             (
                 scalarField& result,
+                const bool add,
                 const scalarField& psiInternal,
                 const scalarField& coeffs,
                 const direction,
@@ -217,6 +218,7 @@ public:
             virtual void updateInterfaceMatrix
             (
                 Field<Type>&,
+                const bool add,
                 const Field<Type>&,
                 const scalarField&,
                 const Pstream::commsTypes commsType
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.C
index db36178e73e..9a6dc99faac 100644
--- a/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.C
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.C
@@ -173,6 +173,7 @@ template<class Type>
 void Foam::cyclicFvPatchField<Type>::updateInterfaceMatrix
 (
     scalarField& result,
+    const bool add,
     const scalarField& psiInternal,
     const scalarField& coeffs,
     const direction cmpt,
@@ -188,12 +189,7 @@ void Foam::cyclicFvPatchField<Type>::updateInterfaceMatrix
     transformCoupleField(pnf, cmpt);
 
     // Multiply the field by coefficients and add into the result
-    const labelUList& faceCells = cyclicPatch_.faceCells();
-
-    forAll(faceCells, elemI)
-    {
-        result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI];
-    }
+    this->addToInternalField(result, !add, coeffs, pnf);
 }
 
 
@@ -201,6 +197,7 @@ template<class Type>
 void Foam::cyclicFvPatchField<Type>::updateInterfaceMatrix
 (
     Field<Type>& result,
+    const bool add,
     const Field<Type>& psiInternal,
     const scalarField& coeffs,
     const Pstream::commsTypes
@@ -215,12 +212,7 @@ void Foam::cyclicFvPatchField<Type>::updateInterfaceMatrix
     transformCoupleField(pnf);
 
     // Multiply the field by coefficients and add into the result
-    const labelUList& faceCells = cyclicPatch_.faceCells();
-
-    forAll(faceCells, elemI)
-    {
-        result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI];
-    }
+    this->addToInternalField(result, !add, coeffs, pnf);
 }
 
 
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.H
index 8122c211390..cd2d5695a44 100644
--- a/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.H
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.H
@@ -178,6 +178,7 @@ public:
             virtual void updateInterfaceMatrix
             (
                 scalarField& result,
+                const bool add,
                 const scalarField& psiInternal,
                 const scalarField& coeffs,
                 const direction cmpt,
@@ -188,6 +189,7 @@ public:
             virtual void updateInterfaceMatrix
             (
                 Field<Type>& result,
+                const bool add,
                 const Field<Type>& psiInternal,
                 const scalarField& coeffs,
                 const Pstream::commsTypes commsType
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.C
index 124c42fb87e..912c44173d7 100644
--- a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.C
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.C
@@ -195,6 +195,7 @@ template<class Type>
 void Foam::cyclicACMIFvPatchField<Type>::updateInterfaceMatrix
 (
     scalarField& result,
+    const bool add,
     const scalarField& psiInternal,
     const scalarField& coeffs,
     const direction cmpt,
@@ -213,14 +214,9 @@ void Foam::cyclicACMIFvPatchField<Type>::updateInterfaceMatrix
     // Transform according to the transformation tensors
     transformCoupleField(pnf, cmpt);
 
-    const labelUList& faceCells = cyclicACMIPatch_.faceCells();
-
     pnf = cyclicACMIPatch_.interpolate(pnf);
 
-    forAll(faceCells, elemI)
-    {
-        result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI];
-    }
+    this->addToInternalField(result, !add, coeffs, pnf);
 }
 
 
@@ -228,6 +224,7 @@ template<class Type>
 void Foam::cyclicACMIFvPatchField<Type>::updateInterfaceMatrix
 (
     Field<Type>& result,
+    const bool add,
     const Field<Type>& psiInternal,
     const scalarField& coeffs,
     const Pstream::commsTypes
@@ -244,14 +241,9 @@ void Foam::cyclicACMIFvPatchField<Type>::updateInterfaceMatrix
     // Transform according to the transformation tensors
     transformCoupleField(pnf);
 
-    const labelUList& faceCells = cyclicACMIPatch_.faceCells();
-
     pnf = cyclicACMIPatch_.interpolate(pnf);
 
-    forAll(faceCells, elemI)
-    {
-        result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI];
-    }
+    this->addToInternalField(result, !add, coeffs, pnf);
 }
 
 
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.H
index ebb2fb8cbd2..0ae3c6b0148 100644
--- a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.H
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.H
@@ -202,6 +202,7 @@ public:
             virtual void updateInterfaceMatrix
             (
                 scalarField& result,
+                const bool add,
                 const scalarField& psiInternal,
                 const scalarField& coeffs,
                 const direction cmpt,
@@ -212,6 +213,7 @@ public:
             virtual void updateInterfaceMatrix
             (
                 Field<Type>&,
+                const bool add,
                 const Field<Type>&,
                 const scalarField&,
                 const Pstream::commsTypes commsType
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicAMI/cyclicAMIFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicAMI/cyclicAMIFvPatchField.C
index 50f0b559383..5bbce362be8 100644
--- a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicAMI/cyclicAMIFvPatchField.C
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicAMI/cyclicAMIFvPatchField.C
@@ -179,6 +179,7 @@ template<class Type>
 void Foam::cyclicAMIFvPatchField<Type>::updateInterfaceMatrix
 (
     scalarField& result,
+    const bool add,
     const scalarField& psiInternal,
     const scalarField& coeffs,
     const direction cmpt,
@@ -204,12 +205,7 @@ void Foam::cyclicAMIFvPatchField<Type>::updateInterfaceMatrix
     }
 
     // Multiply the field by coefficients and add into the result
-    const labelUList& faceCells = cyclicAMIPatch_.faceCells();
-
-    forAll(faceCells, elemI)
-    {
-        result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI];
-    }
+    this->addToInternalField(result, !add, coeffs, pnf);
 }
 
 
@@ -217,6 +213,7 @@ template<class Type>
 void Foam::cyclicAMIFvPatchField<Type>::updateInterfaceMatrix
 (
     Field<Type>& result,
+    const bool add,
     const Field<Type>& psiInternal,
     const scalarField& coeffs,
     const Pstream::commsTypes
@@ -241,12 +238,7 @@ void Foam::cyclicAMIFvPatchField<Type>::updateInterfaceMatrix
     }
 
     // Multiply the field by coefficients and add into the result
-    const labelUList& faceCells = cyclicAMIPatch_.faceCells();
-
-    forAll(faceCells, elemI)
-    {
-        result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI];
-    }
+    this->addToInternalField(result, !add, coeffs, pnf);
 }
 
 
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicAMI/cyclicAMIFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicAMI/cyclicAMIFvPatchField.H
index 7ad7bddbb40..d25f2812b2c 100644
--- a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicAMI/cyclicAMIFvPatchField.H
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicAMI/cyclicAMIFvPatchField.H
@@ -183,6 +183,7 @@ public:
             virtual void updateInterfaceMatrix
             (
                 scalarField& result,
+                const bool add,
                 const scalarField& psiInternal,
                 const scalarField& coeffs,
                 const direction cmpt,
@@ -193,6 +194,7 @@ public:
             virtual void updateInterfaceMatrix
             (
                 Field<Type>&,
+                const bool add,
                 const Field<Type>&,
                 const scalarField&,
                 const Pstream::commsTypes commsType
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchField.C
index 36705e2111c..577f42ee22b 100644
--- a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchField.C
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchField.C
@@ -132,6 +132,7 @@ template<class Type>
 void Foam::jumpCyclicFvPatchField<Type>::updateInterfaceMatrix
 (
     scalarField& result,
+    const bool add,
     const scalarField& psiInternal,
     const scalarField& coeffs,
     const direction cmpt,
@@ -146,6 +147,7 @@ template<class Type>
 void Foam::jumpCyclicFvPatchField<Type>::updateInterfaceMatrix
 (
     Field<Type>& result,
+    const bool add,
     const Field<Type>& psiInternal,
     const scalarField& coeffs,
     const Pstream::commsTypes
@@ -183,11 +185,7 @@ void Foam::jumpCyclicFvPatchField<Type>::updateInterfaceMatrix
     this->transformCoupleField(pnf);
 
     // Multiply the field by coefficients and add into the result
-    const labelUList& faceCells = this->cyclicPatch().faceCells();
-    forAll(faceCells, elemI)
-    {
-        result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI];
-    }
+    this->addToInternalField(result, !add, coeffs, pnf);
 }
 
 
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchField.H
index 2456df9bbaa..36ebce07684 100644
--- a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchField.H
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchField.H
@@ -128,6 +128,7 @@ public:
             virtual void updateInterfaceMatrix
             (
                 scalarField& result,
+                const bool add,
                 const scalarField& psiInternal,
                 const scalarField& coeffs,
                 const direction cmpt,
@@ -138,6 +139,7 @@ public:
             virtual void updateInterfaceMatrix
             (
                 Field<Type>&,
+                const bool add,
                 const Field<Type>&,
                 const scalarField&,
                 const Pstream::commsTypes commsType
@@ -149,6 +151,7 @@ template<>
 void jumpCyclicFvPatchField<scalar>::updateInterfaceMatrix
 (
     scalarField& result,
+    const bool add,
     const scalarField& psiInternal,
     const scalarField& coeffs,
     const direction cmpt,
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchFields.C b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchFields.C
index fc620604db9..f4d7d53342c 100644
--- a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchFields.C
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchFields.C
@@ -40,6 +40,7 @@ template<>
 void Foam::jumpCyclicFvPatchField<Foam::scalar>::updateInterfaceMatrix
 (
     scalarField& result,
+    const bool add,
     const scalarField& psiInternal,
     const scalarField& coeffs,
     const direction cmpt,
@@ -78,11 +79,7 @@ void Foam::jumpCyclicFvPatchField<Foam::scalar>::updateInterfaceMatrix
     this->transformCoupleField(pnf, cmpt);
 
     // Multiply the field by coefficients and add into the result
-    const labelUList& faceCells = this->cyclicPatch().faceCells();
-    forAll(faceCells, elemI)
-    {
-        result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI];
-    }
+    this->addToInternalField(result, !add, coeffs, pnf);
 }
 
 
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclicAMI/jumpCyclicAMIFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclicAMI/jumpCyclicAMIFvPatchField.C
index e22390f84a2..d4facb129b0 100644
--- a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclicAMI/jumpCyclicAMIFvPatchField.C
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclicAMI/jumpCyclicAMIFvPatchField.C
@@ -134,6 +134,7 @@ template<class Type>
 void Foam::jumpCyclicAMIFvPatchField<Type>::updateInterfaceMatrix
 (
     scalarField& result,
+    const bool add,
     const scalarField& psiInternal,
     const scalarField& coeffs,
     const direction cmpt,
@@ -148,6 +149,7 @@ template<class Type>
 void Foam::jumpCyclicAMIFvPatchField<Type>::updateInterfaceMatrix
 (
     Field<Type>& result,
+    const bool add,
     const Field<Type>& psiInternal,
     const scalarField& coeffs,
     const Pstream::commsTypes
@@ -189,11 +191,7 @@ void Foam::jumpCyclicAMIFvPatchField<Type>::updateInterfaceMatrix
     this->transformCoupleField(pnf);
 
     // Multiply the field by coefficients and add into the result
-    const labelUList& faceCells = this->cyclicAMIPatch().faceCells();
-    forAll(faceCells, elemI)
-    {
-        result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI];
-    }
+    this->addToInternalField(result, !add, coeffs, pnf);
 }
 
 
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclicAMI/jumpCyclicAMIFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclicAMI/jumpCyclicAMIFvPatchField.H
index 0815af948f1..7ea5016bf39 100644
--- a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclicAMI/jumpCyclicAMIFvPatchField.H
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclicAMI/jumpCyclicAMIFvPatchField.H
@@ -131,6 +131,7 @@ public:
             virtual void updateInterfaceMatrix
             (
                 scalarField& result,
+                const bool add,
                 const scalarField& psiInternal,
                 const scalarField& coeffs,
                 const direction cmpt,
@@ -141,6 +142,7 @@ public:
             virtual void updateInterfaceMatrix
             (
                 Field<Type>&,
+                const bool add,
                 const Field<Type>&,
                 const scalarField&,
                 const Pstream::commsTypes commsType
@@ -153,6 +155,7 @@ template<>
 void jumpCyclicAMIFvPatchField<scalar>::updateInterfaceMatrix
 (
     scalarField& result,
+    const bool add,
     const scalarField& psiInternal,
     const scalarField& coeffs,
     const direction cmpt,
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclicAMI/jumpCyclicAMIFvPatchFields.C b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclicAMI/jumpCyclicAMIFvPatchFields.C
index c567c400623..f1d54c74886 100644
--- a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclicAMI/jumpCyclicAMIFvPatchFields.C
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclicAMI/jumpCyclicAMIFvPatchFields.C
@@ -42,6 +42,7 @@ template<>
 void Foam::jumpCyclicAMIFvPatchField<scalar>::updateInterfaceMatrix
 (
     scalarField& result,
+    const bool add,
     const scalarField& psiInternal,
     const scalarField& coeffs,
     const direction cmpt,
@@ -72,11 +73,7 @@ void Foam::jumpCyclicAMIFvPatchField<scalar>::updateInterfaceMatrix
     this->transformCoupleField(pnf, cmpt);
 
     // Multiply the field by coefficients and add into the result
-    const labelUList& faceCells = this->cyclicAMIPatch().faceCells();
-    forAll(faceCells, elemI)
-    {
-        result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI];
-    }
+    this->addToInternalField(result, !add, coeffs, pnf);
 }
 
 
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchField.C
index 39b92ea77cd..fee3226ea83 100644
--- a/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchField.C
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchField.C
@@ -318,6 +318,7 @@ template<class Type>
 void Foam::processorFvPatchField<Type>::initInterfaceMatrixUpdate
 (
     scalarField&,
+    const bool add,
     const scalarField& psiInternal,
     const scalarField&,
     const direction,
@@ -378,6 +379,7 @@ template<class Type>
 void Foam::processorFvPatchField<Type>::updateInterfaceMatrix
 (
     scalarField& result,
+    const bool add,
     const scalarField&,
     const scalarField& coeffs,
     const direction cmpt,
@@ -389,8 +391,6 @@ void Foam::processorFvPatchField<Type>::updateInterfaceMatrix
         return;
     }
 
-    const labelUList& faceCells = this->patch().faceCells();
-
     if
     (
         commsType == Pstream::commsTypes::nonBlocking
@@ -416,10 +416,7 @@ void Foam::processorFvPatchField<Type>::updateInterfaceMatrix
         transformCoupleField(scalarReceiveBuf_, cmpt);
 
         // Multiply the field by coefficients and add into the result
-        forAll(faceCells, elemI)
-        {
-            result[faceCells[elemI]] -= coeffs[elemI]*scalarReceiveBuf_[elemI];
-        }
+        this->addToInternalField(result, !add, coeffs, scalarReceiveBuf_);
     }
     else
     {
@@ -432,10 +429,7 @@ void Foam::processorFvPatchField<Type>::updateInterfaceMatrix
         transformCoupleField(pnf, cmpt);
 
         // Multiply the field by coefficients and add into the result
-        forAll(faceCells, elemI)
-        {
-            result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI];
-        }
+        this->addToInternalField(result, !add, coeffs, pnf);
     }
 
     const_cast<processorFvPatchField<Type>&>(*this).updatedMatrix() = true;
@@ -446,6 +440,7 @@ template<class Type>
 void Foam::processorFvPatchField<Type>::initInterfaceMatrixUpdate
 (
     Field<Type>&,
+    const bool add,
     const Field<Type>& psiInternal,
     const scalarField&,
     const Pstream::commsTypes commsType
@@ -505,6 +500,7 @@ template<class Type>
 void Foam::processorFvPatchField<Type>::updateInterfaceMatrix
 (
     Field<Type>& result,
+    const bool add,
     const Field<Type>&,
     const scalarField& coeffs,
     const Pstream::commsTypes commsType
@@ -515,8 +511,6 @@ void Foam::processorFvPatchField<Type>::updateInterfaceMatrix
         return;
     }
 
-    const labelUList& faceCells = this->patch().faceCells();
-
     if
     (
         commsType == Pstream::commsTypes::nonBlocking
@@ -542,10 +536,7 @@ void Foam::processorFvPatchField<Type>::updateInterfaceMatrix
         transformCoupleField(receiveBuf_);
 
         // Multiply the field by coefficients and add into the result
-        forAll(faceCells, elemI)
-        {
-            result[faceCells[elemI]] -= coeffs[elemI]*receiveBuf_[elemI];
-        }
+        this->addToInternalField(result, !add, coeffs, receiveBuf_);
     }
     else
     {
@@ -558,10 +549,7 @@ void Foam::processorFvPatchField<Type>::updateInterfaceMatrix
         transformCoupleField(pnf);
 
         // Multiply the field by coefficients and add into the result
-        forAll(faceCells, elemI)
-        {
-            result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI];
-        }
+        this->addToInternalField(result, !add, coeffs, pnf);
     }
 
     const_cast<processorFvPatchField<Type>&>(*this).updatedMatrix() = true;
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchField.H
index bfe1b75708a..11013c88245 100644
--- a/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchField.H
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchField.H
@@ -209,6 +209,7 @@ public:
             virtual void initInterfaceMatrixUpdate
             (
                 scalarField& result,
+                const bool add,
                 const scalarField& psiInternal,
                 const scalarField& coeffs,
                 const direction cmpt,
@@ -219,6 +220,7 @@ public:
             virtual void updateInterfaceMatrix
             (
                 scalarField& result,
+                const bool add,
                 const scalarField& psiInternal,
                 const scalarField& coeffs,
                 const direction cmpt,
@@ -229,6 +231,7 @@ public:
             virtual void initInterfaceMatrixUpdate
             (
                 Field<Type>& result,
+                const bool add,
                 const Field<Type>& psiInternal,
                 const scalarField& coeffs,
                 const Pstream::commsTypes commsType
@@ -238,6 +241,7 @@ public:
             virtual void updateInterfaceMatrix
             (
                 Field<Type>& result,
+                const bool add,
                 const Field<Type>& psiInternal,
                 const scalarField& coeffs,
                 const Pstream::commsTypes commsType
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchScalarField.C b/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchScalarField.C
index 53ebbb18e2e..85507d00804 100644
--- a/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchScalarField.C
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchScalarField.C
@@ -36,6 +36,7 @@ template<>
 void processorFvPatchField<scalar>::initInterfaceMatrixUpdate
 (
     scalarField&,
+    const bool add,
     const scalarField& psiInternal,
     const scalarField&,
     const direction,
@@ -96,6 +97,7 @@ template<>
 void processorFvPatchField<scalar>::updateInterfaceMatrix
 (
     scalarField& result,
+    const bool add,
     const scalarField&,
     const scalarField& coeffs,
     const direction,
@@ -107,8 +109,6 @@ void processorFvPatchField<scalar>::updateInterfaceMatrix
         return;
     }
 
-    const labelUList& faceCells = this->patch().faceCells();
-
     if
     (
         commsType == Pstream::commsTypes::nonBlocking
@@ -130,10 +130,7 @@ void processorFvPatchField<scalar>::updateInterfaceMatrix
 
 
         // Consume straight from scalarReceiveBuf_
-        forAll(faceCells, elemI)
-        {
-            result[faceCells[elemI]] -= coeffs[elemI]*scalarReceiveBuf_[elemI];
-        }
+        this->addToInternalField(result, !add, coeffs, scalarReceiveBuf_);
     }
     else
     {
@@ -142,10 +139,7 @@ void processorFvPatchField<scalar>::updateInterfaceMatrix
             procPatch_.compressedReceive<scalar>(commsType, this->size())()
         );
 
-        forAll(faceCells, elemI)
-        {
-            result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI];
-        }
+        this->addToInternalField(result, !add, coeffs, pnf);
     }
 
     const_cast<processorFvPatchField<scalar>&>(*this).updatedMatrix() = true;
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchScalarField.H b/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchScalarField.H
index a8bbb24dcb5..0328ef2797b 100644
--- a/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchScalarField.H
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchScalarField.H
@@ -39,6 +39,7 @@ template<>
 void processorFvPatchField<scalar>::initInterfaceMatrixUpdate
 (
     scalarField&,
+    const bool add,
     const scalarField&,
     const scalarField&,
     const direction,
@@ -50,6 +51,7 @@ template<>
 void processorFvPatchField<scalar>::updateInterfaceMatrix
 (
     scalarField& result,
+    const bool add,
     const scalarField&,
     const scalarField& coeffs,
     const direction,
diff --git a/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.C b/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.C
index db21f33d451..81ff46caa2e 100644
--- a/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.C
+++ b/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -507,6 +507,32 @@ void Foam::fvMatrix<Type>::setReference
 }
 
 
+template<class Type>
+void Foam::fvMatrix<Type>::setReferences
+(
+    const labelList& cellLabels,
+    const UList<Type>& values,
+    const bool forceReference
+)
+{
+    bool needRef = (forceReference || psi_.needReference());
+
+    if (needRef)
+    {
+        forAll(cellLabels, celli)
+        {
+            label cellId = cellLabels[celli];
+            if (celli >= 0)
+            {
+                source()[cellId] += diag()[cellId]*values[celli];
+                diag()[cellId] += diag()[cellId];
+            }
+        }
+    }
+}
+
+
+
 template<class Type>
 void Foam::fvMatrix<Type>::relax(const scalar alpha)
 {
@@ -947,6 +973,20 @@ flux() const
 }
 
 
+template<class Type>
+const Foam::dictionary& Foam::fvMatrix<Type>::solverDict() const
+{
+    return psi_.mesh().solverDict
+    (
+        psi_.select
+        (
+            psi_.mesh().data::template lookupOrDefault<bool>
+            ("finalIteration", false)
+        )
+    );
+}
+
+
 // * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
 
 template<class Type>
diff --git a/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.H b/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.H
index 590c3e324e1..cb843f24fd4 100644
--- a/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.H
+++ b/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -299,6 +299,13 @@ public:
                 return source_;
             }
 
+            //- fvBoundary scalar field containing pseudo-matrix coeffs
+            //  for internal cells
+            const FieldField<Field, Type>& internalCoeffs() const
+            {
+                return internalCoeffs_;
+            }
+
             //- fvBoundary scalar field containing pseudo-matrix coeffs
             //  for internal cells
             FieldField<Field, Type>& internalCoeffs()
@@ -306,6 +313,13 @@ public:
                 return internalCoeffs_;
             }
 
+            //- fvBoundary scalar field containing pseudo-matrix coeffs
+            //  for boundary cells
+            const FieldField<Field, Type>& boundaryCoeffs() const
+            {
+                return boundaryCoeffs_;
+            }
+
             //- fvBoundary scalar field containing pseudo-matrix coeffs
             //  for boundary cells
             FieldField<Field, Type>& boundaryCoeffs()
@@ -351,6 +365,14 @@ public:
                 const bool forceReference = false
             );
 
+            //- Set references level for solution
+            void setReferences
+            (
+                const labelList& cells,
+                const UList<Type>& values,
+                const bool forceReference = false
+            );
+
             //- Set reference level for a component of the solution
             //  on a given patch face
             void setComponentReference
@@ -389,7 +411,7 @@ public:
 
             //- Solve segregated or coupled returning the solution statistics.
             //  Use the given solver controls
-            SolverPerformance<Type> solve(const dictionary&);
+            SolverPerformance<Type> solveSegregatedOrCoupled(const dictionary&);
 
             //- Solve segregated returning the solution statistics.
             //  Use the given solver controls
@@ -399,6 +421,10 @@ public:
             //  Use the given solver controls
             SolverPerformance<Type> solveCoupled(const dictionary&);
 
+            //- Solve returning the solution statistics.
+            //  Use the given solver controls
+            SolverPerformance<Type> solve(const dictionary&);
+
             //- Solve returning the solution statistics.
             //  Solver controls read from fvSolution
             SolverPerformance<Type> solve();
@@ -425,6 +451,9 @@ public:
             tmp<GeometricField<Type, fvsPatchField, surfaceMesh>>
                 flux() const;
 
+            //- Return the solver dictionary taking into account finalIteration
+            const dictionary& solverDict() const;
+
 
     // Member operators
 
diff --git a/src/finiteVolume/fvMatrices/fvMatrix/fvMatrixSolve.C b/src/finiteVolume/fvMatrices/fvMatrix/fvMatrixSolve.C
index 253d344a965..5eb6ead4498 100644
--- a/src/finiteVolume/fvMatrices/fvMatrix/fvMatrixSolve.C
+++ b/src/finiteVolume/fvMatrices/fvMatrix/fvMatrixSolve.C
@@ -54,7 +54,7 @@ void Foam::fvMatrix<Type>::setComponentReference
 
 
 template<class Type>
-Foam::SolverPerformance<Type> Foam::fvMatrix<Type>::solve
+Foam::SolverPerformance<Type> Foam::fvMatrix<Type>::solveSegregatedOrCoupled
 (
     const dictionary& solverControls
 )
@@ -69,7 +69,8 @@ Foam::SolverPerformance<Type> Foam::fvMatrix<Type>::solve
     if (debug)
     {
         Info.masterStream(this->mesh().comm())
-            << "fvMatrix<Type>::solve(const dictionary& solverControls) : "
+            << "fvMatrix<Type>::solveSegregatedOrCoupled"
+               "(const dictionary& solverControls) : "
                "solving fvMatrix<Type>"
             << endl;
     }
@@ -174,6 +175,7 @@ Foam::SolverPerformance<Type> Foam::fvMatrix<Type>::solveSegregated
         // conditions
         initMatrixInterfaces
         (
+            true,
             bouCoeffsCmpt,
             interfaces,
             psiCmpt,
@@ -183,6 +185,7 @@ Foam::SolverPerformance<Type> Foam::fvMatrix<Type>::solveSegregated
 
         updateMatrixInterfaces
         (
+            true,
             bouCoeffsCmpt,
             interfaces,
             psiCmpt,
@@ -283,55 +286,35 @@ Foam::SolverPerformance<Type> Foam::fvMatrix<Type>::solveCoupled
 }
 
 
+template<class Type>
+Foam::SolverPerformance<Type> Foam::fvMatrix<Type>::solve
+(
+    const dictionary& solverControls
+)
+{
+    return psi_.mesh().solve(*this, solverControls);
+}
+
+
 template<class Type>
 Foam::autoPtr<typename Foam::fvMatrix<Type>::fvSolver>
 Foam::fvMatrix<Type>::solver()
 {
-    return solver
-    (
-        psi_.mesh().solverDict
-        (
-            psi_.select
-            (
-                psi_.mesh().data::template lookupOrDefault<bool>
-                ("finalIteration", false)
-            )
-        )
-    );
+    return solver(solverDict());
 }
 
 
 template<class Type>
 Foam::SolverPerformance<Type> Foam::fvMatrix<Type>::fvSolver::solve()
 {
-    return solve
-    (
-        fvMat_.psi_.mesh().solverDict
-        (
-            fvMat_.psi_.select
-            (
-                fvMat_.psi_.mesh().data::template lookupOrDefault<bool>
-                ("finalIteration", false)
-            )
-        )
-    );
+    return solve(fvMat_.solverDict());
 }
 
 
 template<class Type>
 Foam::SolverPerformance<Type> Foam::fvMatrix<Type>::solve()
 {
-    return solve
-    (
-        psi_.mesh().solverDict
-        (
-            psi_.select
-            (
-                psi_.mesh().data::template lookupOrDefault<bool>
-                ("finalIteration", false)
-            )
-        )
-    );
+    return this->solve(solverDict());
 }
 
 
diff --git a/src/finiteVolume/fvMesh/fvMesh.C b/src/finiteVolume/fvMesh/fvMesh.C
index 6b071d91319..2c667ac6195 100644
--- a/src/finiteVolume/fvMesh/fvMesh.C
+++ b/src/finiteVolume/fvMesh/fvMesh.C
@@ -3,6 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2017 OpenFOAM Foundation
+     \\/     M anipulation  | Copyright (C) 2016-2017 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -36,6 +37,7 @@ License
 #include "fvMeshMapper.H"
 #include "mapClouds.H"
 #include "MeshObject.H"
+#include "fvMatrix.H"
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
@@ -408,6 +410,50 @@ Foam::fvMesh::~fvMesh()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
+Foam::SolverPerformance<Foam::scalar> Foam::fvMesh::solve
+(
+    fvMatrix<scalar>& m,
+    const dictionary& dict
+) const
+{
+    // Redirect to fvMatrix solver
+    return m.solveSegregatedOrCoupled(dict);
+}
+
+
+Foam::SolverPerformance<Foam::vector> Foam::fvMesh::solve
+(
+    fvMatrix<vector>& m,
+    const dictionary& dict
+) const
+{
+    // Redirect to fvMatrix solver
+    return m.solveSegregatedOrCoupled(dict);
+}
+
+
+Foam::SolverPerformance<Foam::symmTensor> Foam::fvMesh::solve
+(
+    fvMatrix<symmTensor>& m,
+    const dictionary& dict
+) const
+{
+    // Redirect to fvMatrix solver
+    return m.solveSegregatedOrCoupled(dict);
+}
+
+
+Foam::SolverPerformance<Foam::tensor> Foam::fvMesh::solve
+(
+    fvMatrix<tensor>& m,
+    const dictionary& dict
+) const
+{
+    // Redirect to fvMatrix solver
+    return m.solveSegregatedOrCoupled(dict);
+}
+
+
 void Foam::fvMesh::addFvPatches
 (
     const List<polyPatch*> & p,
diff --git a/src/finiteVolume/fvMesh/fvMesh.H b/src/finiteVolume/fvMesh/fvMesh.H
index 94a6f68f21d..6132523c6ce 100644
--- a/src/finiteVolume/fvMesh/fvMesh.H
+++ b/src/finiteVolume/fvMesh/fvMesh.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016-2017 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -62,6 +62,7 @@ SourceFiles
 #include "slicedVolFieldsFwd.H"
 #include "slicedSurfaceFieldsFwd.H"
 #include "className.H"
+#include "SolverPerformance.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -70,6 +71,8 @@ namespace Foam
 
 class fvMeshLduAddressing;
 class volMesh;
+template<class Type>
+class fvMatrix;
 
 
 /*---------------------------------------------------------------------------*\
@@ -265,16 +268,93 @@ public:
                 return polyMesh::comm();
             }
 
-            //- Internal face owner
+
+            // Overlap
+
+                //- Interpolate interpolationCells only
+                virtual void interpolate(volScalarField&) const
+                {}
+
+                //- Interpolate interpolationCells only
+                virtual void interpolate(volVectorField&) const
+                {}
+
+                //- Interpolate interpolationCells only
+                virtual void interpolate(volSphericalTensorField&) const
+                {}
+
+                //- Interpolate interpolationCells only
+                virtual void interpolate(volSymmTensorField&) const
+                {}
+
+                //- Interpolate interpolationCells only
+                virtual void interpolate(volTensorField&) const
+                {}
+
+                //- Interpolate interpolationCells only. No bcs.
+                virtual void interpolate(scalarField&) const
+                {}
+
+                //- Interpolate interpolationCells only. No bcs.
+                virtual void interpolate(vectorField&) const
+                {}
+
+                //- Interpolate interpolationCells only. No bcs.
+                virtual void interpolate(sphericalTensorField&) const
+                {}
+
+                //- Interpolate interpolationCells only. No bcs.
+                virtual void interpolate(symmTensorField&) const
+                {}
+
+                //- Interpolate interpolationCells only. No bcs.
+                virtual void interpolate(tensorField&) const
+                {}
+
+                //- Solve returning the solution statistics given convergence
+                //  tolerance. Use the given solver controls
+                virtual SolverPerformance<scalar> solve
+                (
+                    fvMatrix<scalar>&,
+                    const dictionary&
+                ) const;
+
+                //- Solve returning the solution statistics given convergence
+                //  tolerance. Use the given solver controls
+                virtual SolverPerformance<vector> solve
+                (
+                    fvMatrix<vector>&,
+                    const dictionary&
+                ) const;
+
+                //- Solve returning the solution statistics given convergence
+                //  tolerance. Use the given solver controls
+                virtual SolverPerformance<symmTensor> solve
+                (
+                    fvMatrix<symmTensor>&,
+                    const dictionary&
+                ) const;
+
+                //- Solve returning the solution statistics given convergence
+                //  tolerance. Use the given solver controls
+                virtual SolverPerformance<tensor> solve
+                (
+                    fvMatrix<tensor>&,
+                    const dictionary&
+                ) const;
+
+
+            //- Internal face owner. Note bypassing virtual mechanism so
+            //  e.g. relaxation always gets done using original addressing
             const labelUList& owner() const
             {
-                return lduAddr().lowerAddr();
+                return fvMesh::lduAddr().lowerAddr();
             }
 
             //- Internal face neighbour
             const labelUList& neighbour() const
             {
-                return lduAddr().upperAddr();
+                return fvMesh::lduAddr().upperAddr();
             }
 
             //- Return cell volumes
diff --git a/src/finiteVolume/fvMesh/wallDist/patchDistMethods/Poisson/PoissonPatchDistMethod.C b/src/finiteVolume/fvMesh/wallDist/patchDistMethods/Poisson/PoissonPatchDistMethod.C
index fa3d382d66d..7dd34b9343e 100644
--- a/src/finiteVolume/fvMesh/wallDist/patchDistMethods/Poisson/PoissonPatchDistMethod.C
+++ b/src/finiteVolume/fvMesh/wallDist/patchDistMethods/Poisson/PoissonPatchDistMethod.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2015-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016-2017 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -103,6 +103,15 @@ bool Foam::patchDistMethods::Poisson::correct
 
     y = sqrt(magSqr(gradyPsi) + 2*yPsi) - magGradyPsi;
 
+    // Need to stabilise the y for overset meshes since the holed cells
+    // keep the initial value (0.0) so the gradient of that will be
+    // zero as well. Turbulence models do not like zero wall distance.
+    y.max(SMALL);
+
+    // For overset: enforce smooth y field (yPsi is smooth, magGradyPsi is
+    // not)
+    mesh_.interpolate(y);
+
     // Cache yPsi if the mesh is moving otherwise delete
     if (!mesh_.changing())
     {
@@ -118,7 +127,11 @@ bool Foam::patchDistMethods::Poisson::correct
             (
                 magGradyPsi,
                 dimensionedScalar("smallMagGradyPsi", dimLength, SMALL)
+
             );
+
+        // For overset: enforce smooth field
+        mesh_.interpolate(n);
     }
 
     return true;
diff --git a/src/finiteVolume/fvMesh/wallDist/patchDistMethods/advectionDiffusion/advectionDiffusionPatchDistMethod.C b/src/finiteVolume/fvMesh/wallDist/patchDistMethods/advectionDiffusion/advectionDiffusionPatchDistMethod.C
index 9e0826340a1..99820db026f 100644
--- a/src/finiteVolume/fvMesh/wallDist/patchDistMethods/advectionDiffusion/advectionDiffusionPatchDistMethod.C
+++ b/src/finiteVolume/fvMesh/wallDist/patchDistMethods/advectionDiffusion/advectionDiffusionPatchDistMethod.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2015-2017 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016-2017 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -145,6 +145,11 @@ bool Foam::patchDistMethods::advectionDiffusion::correct
 
     } while (initialResidual > tolerance_ && ++iter < maxIter_);
 
+    // Need to stabilise the y for overset meshes since the holed cells
+    // keep the initial value (0.0) so the gradient of that will be
+    // zero as well. Turbulence models do not like zero wall distance.
+    y.max(SMALL);
+
     // Only calculate n if the field is defined
     if (notNull(n))
     {
diff --git a/src/fvMotionSolver/fvMotionSolvers/componentDisplacement/componentLaplacian/displacementComponentLaplacianFvMotionSolver.C b/src/fvMotionSolver/fvMotionSolvers/componentDisplacement/componentLaplacian/displacementComponentLaplacianFvMotionSolver.C
index a8c37d2c304..0ac6e22f1a7 100644
--- a/src/fvMotionSolver/fvMotionSolvers/componentDisplacement/componentLaplacian/displacementComponentLaplacianFvMotionSolver.C
+++ b/src/fvMotionSolver/fvMotionSolvers/componentDisplacement/componentLaplacian/displacementComponentLaplacianFvMotionSolver.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -231,7 +231,9 @@ void Foam::displacementComponentLaplacianFvMotionSolver::solve()
     diffusivityPtr_->correct();
     pointDisplacement_.boundaryFieldRef().updateCoeffs();
 
-    Foam::solve
+    // We explicitly do NOT want to interpolate the motion inbetween
+    // different regions so bypass all the matrix manipulation.
+    fvScalarMatrix TEqn
     (
         fvm::laplacian
         (
@@ -240,6 +242,8 @@ void Foam::displacementComponentLaplacianFvMotionSolver::solve()
             "laplacian(diffusivity,cellDisplacement)"
         )
     );
+
+    TEqn.solveSegregatedOrCoupled(TEqn.solverDict());
 }
 
 
diff --git a/src/fvMotionSolver/fvMotionSolvers/componentVelocity/componentLaplacian/velocityComponentLaplacianFvMotionSolver.C b/src/fvMotionSolver/fvMotionSolvers/componentVelocity/componentLaplacian/velocityComponentLaplacianFvMotionSolver.C
index 6facb081384..3f16a8eb87e 100644
--- a/src/fvMotionSolver/fvMotionSolvers/componentVelocity/componentLaplacian/velocityComponentLaplacianFvMotionSolver.C
+++ b/src/fvMotionSolver/fvMotionSolvers/componentVelocity/componentLaplacian/velocityComponentLaplacianFvMotionSolver.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -129,7 +129,9 @@ void Foam::velocityComponentLaplacianFvMotionSolver::solve()
     diffusivityPtr_->correct();
     pointMotionU_.boundaryFieldRef().updateCoeffs();
 
-    Foam::solve
+    // We explicitly do NOT want to interpolate the motion inbetween
+    // different regions so bypass all the matrix manipulation.
+    fvScalarMatrix TEqn
     (
         fvm::laplacian
         (
@@ -138,6 +140,8 @@ void Foam::velocityComponentLaplacianFvMotionSolver::solve()
             "laplacian(diffusivity,cellMotionU)"
         )
     );
+
+    TEqn.solveSegregatedOrCoupled(TEqn.solverDict());
 }
 
 
diff --git a/src/fvMotionSolver/fvMotionSolvers/displacement/SBRStress/displacementSBRStressFvMotionSolver.C b/src/fvMotionSolver/fvMotionSolvers/displacement/SBRStress/displacementSBRStressFvMotionSolver.C
index 2bed22c26cc..8a131674e9b 100644
--- a/src/fvMotionSolver/fvMotionSolvers/displacement/SBRStress/displacementSBRStressFvMotionSolver.C
+++ b/src/fvMotionSolver/fvMotionSolvers/displacement/SBRStress/displacementSBRStressFvMotionSolver.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2017 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2017 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -186,7 +186,7 @@ void Foam::displacementSBRStressFvMotionSolver::solve()
 
     volTensorField gradCd("gradCd", fvc::grad(cellDisplacement_));
 
-    Foam::solve
+    fvVectorMatrix TEqn
     (
         fvm::laplacian
         (
@@ -234,6 +234,8 @@ void Foam::displacementSBRStressFvMotionSolver::solve()
         )
         */
     );
+
+    TEqn.solveSegregatedOrCoupled(TEqn.solverDict());
 }
 
 
diff --git a/src/fvMotionSolver/fvMotionSolvers/displacement/laplacian/displacementLaplacianFvMotionSolver.C b/src/fvMotionSolver/fvMotionSolvers/displacement/laplacian/displacementLaplacianFvMotionSolver.C
index 85c12013648..fc35fa61662 100644
--- a/src/fvMotionSolver/fvMotionSolvers/displacement/laplacian/displacementLaplacianFvMotionSolver.C
+++ b/src/fvMotionSolver/fvMotionSolvers/displacement/laplacian/displacementLaplacianFvMotionSolver.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  | Copyright (C) 2015 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015-2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -332,7 +332,9 @@ void Foam::displacementLaplacianFvMotionSolver::solve()
     diffusivity().correct();
     pointDisplacement_.boundaryFieldRef().updateCoeffs();
 
-    Foam::solve
+    // We explicitly do NOT want to interpolate the motion inbetween
+    // different regions so bypass all the matrix manipulation.
+    fvVectorMatrix TEqn
     (
         fvm::laplacian
         (
@@ -341,6 +343,8 @@ void Foam::displacementLaplacianFvMotionSolver::solve()
             "laplacian(diffusivity,cellDisplacement)"
         )
     );
+
+    TEqn.solveSegregatedOrCoupled(TEqn.solverDict());
 }
 
 
diff --git a/src/fvMotionSolver/fvMotionSolvers/displacement/surfaceAlignedSBRStress/surfaceAlignedSBRStressFvMotionSolver.C b/src/fvMotionSolver/fvMotionSolvers/displacement/surfaceAlignedSBRStress/surfaceAlignedSBRStressFvMotionSolver.C
index 6294da02a18..3c39edb7b51 100644
--- a/src/fvMotionSolver/fvMotionSolvers/displacement/surfaceAlignedSBRStress/surfaceAlignedSBRStressFvMotionSolver.C
+++ b/src/fvMotionSolver/fvMotionSolvers/displacement/surfaceAlignedSBRStress/surfaceAlignedSBRStressFvMotionSolver.C
@@ -409,7 +409,8 @@ void Foam::surfaceAlignedSBRStressFvMotionSolver::solve()
             fvc::div(sigmaD_)
         );
 
-        DEqn.solve();
+        // Note: solve uncoupled
+        DEqn.solveSegregatedOrCoupled(DEqn.solverDict());
     }
 }
 
diff --git a/src/fvMotionSolver/fvMotionSolvers/velocity/laplacian/velocityLaplacianFvMotionSolver.C b/src/fvMotionSolver/fvMotionSolvers/velocity/laplacian/velocityLaplacianFvMotionSolver.C
index 46e7f34e2d7..2a5bd14fcd0 100644
--- a/src/fvMotionSolver/fvMotionSolvers/velocity/laplacian/velocityLaplacianFvMotionSolver.C
+++ b/src/fvMotionSolver/fvMotionSolvers/velocity/laplacian/velocityLaplacianFvMotionSolver.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -124,7 +124,7 @@ void Foam::velocityLaplacianFvMotionSolver::solve()
     diffusivityPtr_->correct();
     pointMotionU_.boundaryFieldRef().updateCoeffs();
 
-    Foam::solve
+    fvVectorMatrix UEqn
     (
         fvm::laplacian
         (
@@ -133,6 +133,8 @@ void Foam::velocityLaplacianFvMotionSolver::solve()
             "laplacian(diffusivity,cellMotionU)"
         )
     );
+
+    UEqn.solveSegregatedOrCoupled(UEqn.solverDict());
 }
 
 
diff --git a/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicACMIGAMGInterfaceField/cyclicACMIGAMGInterfaceField.C b/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicACMIGAMGInterfaceField/cyclicACMIGAMGInterfaceField.C
index 4963d926cd5..772799af49b 100644
--- a/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicACMIGAMGInterfaceField/cyclicACMIGAMGInterfaceField.C
+++ b/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicACMIGAMGInterfaceField/cyclicACMIGAMGInterfaceField.C
@@ -93,6 +93,7 @@ Foam::cyclicACMIGAMGInterfaceField::~cyclicACMIGAMGInterfaceField()
 void Foam::cyclicACMIGAMGInterfaceField::updateInterfaceMatrix
 (
     scalarField& result,
+    const bool add,
     const scalarField& psiInternal,
     const scalarField& coeffs,
     const direction cmpt,
@@ -117,12 +118,7 @@ void Foam::cyclicACMIGAMGInterfaceField::updateInterfaceMatrix
         pnf = cyclicACMIInterface_.neighbPatch().AMI().interpolateToTarget(pnf);
     }
 
-    const labelUList& faceCells = cyclicACMIInterface_.faceCells();
-
-    forAll(faceCells, elemI)
-    {
-        result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI];
-    }
+    this->addToInternalField(result, !add, coeffs, pnf);
 }
 
 
diff --git a/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicACMIGAMGInterfaceField/cyclicACMIGAMGInterfaceField.H b/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicACMIGAMGInterfaceField/cyclicACMIGAMGInterfaceField.H
index e06d76328d9..a2f4dc8aec4 100644
--- a/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicACMIGAMGInterfaceField/cyclicACMIGAMGInterfaceField.H
+++ b/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicACMIGAMGInterfaceField/cyclicACMIGAMGInterfaceField.H
@@ -120,6 +120,7 @@ public:
             virtual void updateInterfaceMatrix
             (
                 scalarField& result,
+                const bool add,
                 const scalarField& psiInternal,
                 const scalarField& coeffs,
                 const direction cmpt,
diff --git a/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicAMIGAMGInterfaceField/cyclicAMIGAMGInterfaceField.C b/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicAMIGAMGInterfaceField/cyclicAMIGAMGInterfaceField.C
index 1cb34ad7920..7f6034a2268 100644
--- a/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicAMIGAMGInterfaceField/cyclicAMIGAMGInterfaceField.C
+++ b/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicAMIGAMGInterfaceField/cyclicAMIGAMGInterfaceField.C
@@ -93,6 +93,7 @@ Foam::cyclicAMIGAMGInterfaceField::~cyclicAMIGAMGInterfaceField()
 void Foam::cyclicAMIGAMGInterfaceField::updateInterfaceMatrix
 (
     scalarField& result,
+    const bool add,
     const scalarField& psiInternal,
     const scalarField& coeffs,
     const direction cmpt,
@@ -117,12 +118,7 @@ void Foam::cyclicAMIGAMGInterfaceField::updateInterfaceMatrix
         pnf = cyclicAMIInterface_.neighbPatch().AMI().interpolateToTarget(pnf);
     }
 
-    const labelUList& faceCells = cyclicAMIInterface_.faceCells();
-
-    forAll(faceCells, elemI)
-    {
-        result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI];
-    }
+    this->addToInternalField(result, !add, coeffs, pnf);
 }
 
 
diff --git a/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicAMIGAMGInterfaceField/cyclicAMIGAMGInterfaceField.H b/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicAMIGAMGInterfaceField/cyclicAMIGAMGInterfaceField.H
index 868e2cc47b2..7f1aa72acde 100644
--- a/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicAMIGAMGInterfaceField/cyclicAMIGAMGInterfaceField.H
+++ b/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicAMIGAMGInterfaceField/cyclicAMIGAMGInterfaceField.H
@@ -119,6 +119,7 @@ public:
             virtual void updateInterfaceMatrix
             (
                 scalarField& result,
+                const bool add,
                 const scalarField& psiInternal,
                 const scalarField& coeffs,
                 const direction cmpt,
diff --git a/src/meshTools/regionCoupled/GAMG/interfaceFields/regionCoupledGAMGInterfaceField/regionCoupledGAMGInterfaceField.H b/src/meshTools/regionCoupled/GAMG/interfaceFields/regionCoupledGAMGInterfaceField/regionCoupledGAMGInterfaceField.H
index 5b26ddc2a75..6701e2b7bc5 100644
--- a/src/meshTools/regionCoupled/GAMG/interfaceFields/regionCoupledGAMGInterfaceField/regionCoupledGAMGInterfaceField.H
+++ b/src/meshTools/regionCoupled/GAMG/interfaceFields/regionCoupledGAMGInterfaceField/regionCoupledGAMGInterfaceField.H
@@ -112,6 +112,7 @@ public:
             virtual void updateInterfaceMatrix
             (
                 scalarField&,
+                const bool add,
                 const scalarField&,
                 const scalarField&,
                 const direction,
diff --git a/src/meshTools/regionCoupled/GAMG/interfaceFields/regionCoupledGAMGInterfaceField/regionCoupledWallGAMGInterfaceField.H b/src/meshTools/regionCoupled/GAMG/interfaceFields/regionCoupledGAMGInterfaceField/regionCoupledWallGAMGInterfaceField.H
index 8bcdd2e1147..ca8c0b9b68f 100644
--- a/src/meshTools/regionCoupled/GAMG/interfaceFields/regionCoupledGAMGInterfaceField/regionCoupledWallGAMGInterfaceField.H
+++ b/src/meshTools/regionCoupled/GAMG/interfaceFields/regionCoupledGAMGInterfaceField/regionCoupledWallGAMGInterfaceField.H
@@ -113,6 +113,7 @@ public:
             virtual void updateInterfaceMatrix
             (
                 scalarField&,
+                const bool add,
                 const scalarField&,
                 const scalarField&,
                 const direction,
diff --git a/src/overset/Make/files b/src/overset/Make/files
new file mode 100644
index 00000000000..a285c4979cc
--- /dev/null
+++ b/src/overset/Make/files
@@ -0,0 +1,31 @@
+cellCellStencil/cellCellStencil/cellCellStencil.C
+cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.C
+cellCellStencil/cellCellStencil/cellCellStencilObject.C
+cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.C
+cellCellStencil/inverseDistance/waveMethod.C
+cellCellStencil/inverseDistance/meshToMeshData.C
+cellCellStencil/trackingInverseDistance/voxelMeshSearch.C
+cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.C
+
+dynamicOversetFvMesh/dynamicOversetFvMesh.C
+
+fvMeshPrimitiveLduAddressing/fvMeshPrimitiveLduAddressing.C
+
+oversetPolyPatch/oversetPolyPatch.C
+oversetPolyPatch/oversetLduInterface.C
+oversetPolyPatch/oversetFvPatch.C
+oversetPolyPatch/oversetFvPatchFields.C
+oversetPolyPatch/oversetFvsPatchFields.C
+oversetPolyPatch/oversetGAMGInterface.C
+oversetPolyPatch/oversetGAMGInterfaceField.C
+oversetPolyPatch/oversetPointPatch.C
+oversetPolyPatch/oversetPointPatchFields.C
+
+oversetAdjustPhi/oversetAdjustPhi.C
+
+regionsToCell/regionsToCell.C
+
+lduPrimitiveProcessorInterface/lduPrimitiveProcessorInterface.C
+
+
+LIB = $(FOAM_LIBBIN)/liboverset
diff --git a/src/overset/Make/options b/src/overset/Make/options
new file mode 100644
index 00000000000..ae7529a2277
--- /dev/null
+++ b/src/overset/Make/options
@@ -0,0 +1,15 @@
+EXE_INC = \
+    /* -DFULLDEBUG -O0 -g */ \
+    -I$(LIB_SRC)/fileFormats/lnInclude \
+    -I$(LIB_SRC)/surfMesh/lnInclude \
+    -I$(LIB_SRC)/sampling/lnInclude \
+    -I$(LIB_SRC)/meshTools/lnInclude \
+    -I$(LIB_SRC)/dynamicMesh/lnInclude \
+    -I$(LIB_SRC)/finiteVolume/lnInclude \
+    -I$(LIB_SRC)/dynamicFvMesh/lnInclude \
+    -I$(LIB_SRC)/parallel/decompose/decompositionMethods/lnInclude
+
+LIB_LIBS = \
+    -ldynamicFvMesh \
+    -lsampling \
+    -ldecompositionMethods
diff --git a/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.C b/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.C
new file mode 100644
index 00000000000..9ef72576fae
--- /dev/null
+++ b/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.C
@@ -0,0 +1,276 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify i
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "cellCellStencil.H"
+#include "addToRunTimeSelectionTable.H"
+#include "volFields.H"
+#include "syncTools.H"
+#include "globalIndex.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTypeNameAndDebug(cellCellStencil, 0);
+    defineRunTimeSelectionTable(cellCellStencil, mesh);
+
+    template<>
+    const char* NamedEnum
+    <
+        cellCellStencil::cellType,
+        3
+    >::names[] =
+    {
+        "calculated",
+        "interpolated",
+        "hole"
+    };
+}
+
+const Foam::NamedEnum<Foam::cellCellStencil::cellType, 3>
+Foam::cellCellStencil::cellTypeNames_;
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::cellCellStencil::cellCellStencil(const fvMesh& mesh)
+:
+    mesh_(mesh)
+{}
+
+
+Foam::autoPtr<Foam::cellCellStencil> Foam::cellCellStencil::New
+(
+    const fvMesh& mesh,
+    const dictionary& dict
+)
+{
+    if (debug)
+    {
+        InfoInFunction << "Constructing cellCellStencil" << endl;
+    }
+
+    word type(dict.lookup("method"));
+
+
+    meshConstructorTable::iterator cstrIter =
+        meshConstructorTablePtr_->find(type);
+
+    if (cstrIter == meshConstructorTablePtr_->end())
+    {
+        FatalErrorInFunction
+            << "Unknown cellCellStencil type "
+            << type << nl << nl
+            << "Valid cellCellStencil types are" << endl
+            << meshConstructorTablePtr_->sortedToc()
+            << abort(FatalError);
+    }
+
+    return autoPtr<cellCellStencil>(cstrIter()(mesh, dict, true));
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::cellCellStencil::~cellCellStencil()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+const Foam::labelIOList& Foam::cellCellStencil::zoneID() const
+{
+    if (!mesh_.foundObject<labelIOList>("zoneID"))
+    {
+        labelIOList* zoneIDPtr = new labelIOList
+        (
+            IOobject
+            (
+                "zoneID",
+                mesh_.facesInstance(),
+                polyMesh::meshSubDir,
+                mesh_,
+                IOobject::NO_READ,
+                IOobject::NO_WRITE
+            ),
+            mesh_.nCells()
+        );
+        labelIOList& zoneID = *zoneIDPtr;
+
+        volScalarField volZoneID
+        (
+            IOobject
+            (
+                "zoneID",
+                mesh_.time().findInstance(mesh_.dbDir(), "zoneID"),
+                mesh_,
+                IOobject::MUST_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            mesh_
+        );
+        forAll(volZoneID, cellI)
+        {
+            zoneID[cellI] = label(volZoneID[cellI]);
+        }
+
+        zoneIDPtr->store();
+    }
+    return mesh_.lookupObject<labelIOList>("zoneID");
+}
+
+
+Foam::labelList Foam::cellCellStencil::count
+(
+    const label size,
+    const labelUList& lst
+)
+{
+    labelList count(size, 0);
+    forAll(lst, i)
+    {
+        count[lst[i]]++;
+    }
+    Pstream::listCombineGather(count, plusEqOp<label>());
+    return count;
+}
+
+
+bool Foam::cellCellStencil::localStencil(const labelUList& slots) const
+{
+    forAll(slots, i)
+    {
+        if (slots[i] >= mesh_.nCells())
+        {
+            return false;
+        }
+    }
+    return true;
+}
+
+
+void Foam::cellCellStencil::globalCellCells
+(
+    const globalIndex& gi,
+    const polyMesh& mesh,
+    const labelList& selectedCells,
+    labelListList& cellCells,
+    pointListList& cellCellCentres
+)
+{
+    // For selected cells determine the face neighbours (in global numbering)
+
+    const pointField& cellCentres = mesh.cellCentres();
+    const labelList& faceOwner = mesh.faceOwner();
+    const labelList& faceNeighbour = mesh.faceNeighbour();
+    const cellList& cells = mesh.cells();
+
+
+    // 1. Determine global cell number on other side of coupled patches
+
+    labelList globalCellIDs(mesh.nCells());
+    forAll(globalCellIDs, celli)
+    {
+        globalCellIDs[celli] = gi.toGlobal(celli);
+    }
+
+    labelList nbrGlobalCellIDs;
+    syncTools::swapBoundaryCellList
+    (
+        mesh,
+        globalCellIDs,
+        nbrGlobalCellIDs
+    );
+    pointField nbrCellCentres;
+    syncTools::swapBoundaryCellList
+    (
+        mesh,
+        cellCentres,
+        nbrCellCentres
+    );
+
+
+    // 2. Collect cell and all its neighbours
+
+    cellCells.setSize(mesh.nCells());
+    cellCellCentres.setSize(cellCells.size());
+
+    forAll(selectedCells, i)
+    {
+        label celli = selectedCells[i];
+
+        const cell& cFaces = cells[celli];
+        labelList& stencil = cellCells[celli];
+        pointList& stencilPoints = cellCellCentres[celli];
+        stencil.setSize(cFaces.size()+1);
+        stencilPoints.setSize(stencil.size());
+        label compacti = 0;
+
+        // First entry is cell itself
+        stencil[compacti] = globalCellIDs[celli];
+        stencilPoints[compacti++] = cellCentres[celli];
+
+        // Other entries are cell neighbours
+        forAll(cFaces, i)
+        {
+            label facei = cFaces[i];
+            label bFacei = facei-mesh.nInternalFaces();
+            label own = faceOwner[facei];
+            label nbrCelli;
+            point nbrCc;
+            if (bFacei >= 0)
+            {
+                nbrCelli = nbrGlobalCellIDs[bFacei];
+                nbrCc = nbrCellCentres[bFacei];
+            }
+            else
+            {
+                if (own != celli)
+                {
+                    nbrCelli = gi.toGlobal(own);
+                    nbrCc = cellCentres[own];
+                }
+                else
+                {
+                    label nei = faceNeighbour[facei];
+                    nbrCelli = gi.toGlobal(nei);
+                    nbrCc = cellCentres[nei];
+                }
+            }
+
+            SubList<label> current(stencil, compacti);
+            if (findIndex(current, nbrCelli) == -1)
+            {
+                stencil[compacti] = nbrCelli;
+                stencilPoints[compacti++] = nbrCc;
+            }
+        }
+        stencil.setSize(compacti);
+        stencilPoints.setSize(compacti);
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.H b/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.H
new file mode 100644
index 00000000000..327bce87cf3
--- /dev/null
+++ b/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.H
@@ -0,0 +1,198 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::cellCellStencil
+
+Description
+    Calculation of interpolation stencils.
+
+    Looks up zoneID labelIOList to give the zoning. Wrapped in
+    MeshObject as cellCellStencilObject. Kept separate so meshes can
+    implement more clever methods (e.g. solid body motion does not require
+    full recalculation)
+
+SourceFiles
+    cellCellStencil.C
+    cellCellStencilObject.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef cellCellStencil_H
+#define cellCellStencil_H
+
+#include "scalarList.H"
+#include "mapDistribute.H"
+#include "fvMesh.H"
+#include "pointList.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+class mapDistribute;
+
+/*---------------------------------------------------------------------------*\
+                     Class cellCellStencil Declaration
+\*---------------------------------------------------------------------------*/
+
+class cellCellStencil
+{
+public:
+
+    enum patchCellType
+    {
+        OTHER = 0,          // not on special patch
+        PATCH = 1,          // next to (non-coupled) boundary
+        OVERSET = 2         // next to 'overset' boundary
+    };
+
+    enum cellType
+    {
+        CALCULATED = 0,     // normal operation
+        INTERPOLATED = 1,   // interpolated
+        HOLE = 2            // hole
+    };
+
+
+protected:
+
+    // Protected data
+
+        //- Mode type names
+        static const NamedEnum<cellType, 3> cellTypeNames_;
+
+        //- Reference to the mesh
+        const fvMesh& mesh_;
+
+
+    // Protected Member Functions
+
+        //- Count ocurrences (in parallel)
+        static labelList count(const label size, const labelUList& lst);
+
+private:
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        cellCellStencil(const cellCellStencil&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const cellCellStencil&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("cellCellStencil");
+
+
+    // Declare run-time constructor selection tables
+
+        declareRunTimeSelectionTable
+        (
+            autoPtr,
+            cellCellStencil,
+            mesh,
+            (
+                const fvMesh& mesh,
+                const dictionary& dict,
+                const bool update
+            ),
+            (mesh, dict, update)
+        );
+
+
+    // Constructors
+
+        //- Construct from fvMesh
+        cellCellStencil(const fvMesh&);
+
+        //- New function which constructs and returns pointer to a
+        //  cellCellStencil
+        static autoPtr<cellCellStencil> New
+        (
+            const fvMesh&,
+            const dictionary& dict
+        );
+
+
+    //- Destructor
+    virtual ~cellCellStencil();
+
+
+    // Member Functions
+
+        //- Update stencils. Return false if nothing changed.
+        virtual bool update() = 0;
+
+        //- Return the cell type list
+        virtual const labelUList& cellTypes() const = 0;
+
+        //- Indices of interpolated cells
+        virtual const labelUList& interpolationCells() const = 0;
+
+        //- Return a communication schedule
+        virtual const mapDistribute& cellInterpolationMap() const = 0;
+
+        //- Per interpolated cell the neighbour cells (in terms of slots as
+        //  constructed by above cellInterpolationMap) to interpolate
+        virtual const labelListList& cellStencil() const = 0;
+
+        //- Weights for cellStencil
+        virtual const List<scalarList>& cellInterpolationWeights() const = 0;
+
+        //- Per interpolated cell the interpolation factor. (0 = use
+        //  calculated, 1 = use interpolated)
+        virtual const scalarList& cellInterpolationWeight() const = 0;
+
+        //- Helper: is stencil fully local
+        bool localStencil(const labelUList&) const;
+
+        //- Helper: get reference to registered zoneID. Loads volScalarField
+        //  if not registered.
+        const labelIOList& zoneID() const;
+
+        //- Helper: create cell-cell addressing in global numbering
+        static void globalCellCells
+        (
+            const globalIndex& gi,
+            const polyMesh& mesh,
+            const labelList& selectedCells,
+            labelListList& cellCells,
+            pointListList& cellCellCentres
+        );
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/overset/cellCellStencil/cellCellStencil/cellCellStencilObject.C b/src/overset/cellCellStencil/cellCellStencil/cellCellStencilObject.C
new file mode 100644
index 00000000000..026c4903c55
--- /dev/null
+++ b/src/overset/cellCellStencil/cellCellStencil/cellCellStencilObject.C
@@ -0,0 +1,37 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "cellCellStencilObject.H"
+
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTypeNameAndDebug(cellCellStencilObject, 0);
+}
+
+
+// ************************************************************************* //
diff --git a/src/overset/cellCellStencil/cellCellStencil/cellCellStencilObject.H b/src/overset/cellCellStencil/cellCellStencil/cellCellStencilObject.H
new file mode 100644
index 00000000000..2a0e3ca15df
--- /dev/null
+++ b/src/overset/cellCellStencil/cellCellStencil/cellCellStencilObject.H
@@ -0,0 +1,168 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::cellCellStencilObject
+
+Description
+
+SourceFiles
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef cellCellStencilObject_H
+#define cellCellStencilObject_H
+
+#include "cellCellStencil.H"
+#include "MeshObject.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+class cellCellStencilObject;
+typedef MeshObject
+<
+    fvMesh,
+    Foam::MoveableMeshObject,
+    cellCellStencilObject
+> Stencil;
+
+/*---------------------------------------------------------------------------*\
+                  Class cellCellStencilObject Declaration
+\*---------------------------------------------------------------------------*/
+
+class cellCellStencilObject
+:
+    public MeshObject
+    <
+        fvMesh,
+        MoveableMeshObject,
+        cellCellStencilObject
+    >,
+    public cellCellStencil
+{
+    // Private data
+
+        autoPtr<cellCellStencil> stencilPtr_;
+
+
+public:
+
+    TypeName("cellCellStencilObject");
+
+    // Constructors
+
+        //- Construct with mesh
+        explicit cellCellStencilObject(const fvMesh& mesh)
+        :
+            MeshObject
+            <
+                fvMesh,
+                Foam::MoveableMeshObject,
+                cellCellStencilObject
+            >(mesh),
+            cellCellStencil(mesh),
+            stencilPtr_
+            (
+                cellCellStencil::New
+                (
+                    mesh,
+                    mesh.schemesDict().subDict
+                    (
+                        "oversetInterpolation"
+                    )
+                )
+            )
+        {}
+
+
+    //- Destructor
+    virtual ~cellCellStencilObject()
+    {}
+
+
+    // Member Functions
+
+        //- Callback for geometry motion
+        virtual bool movePoints()
+        {
+            return stencilPtr_().update();
+        }
+
+        //- Update stencils. Return false if nothing changed.
+        virtual bool update()
+        {
+            return stencilPtr_().update();
+        }
+
+        //- Return the cell type list
+        virtual const labelUList& cellTypes() const
+        {
+            return stencilPtr_().cellTypes();
+        }
+
+        //- Indices of interpolated cells
+        virtual const labelUList& interpolationCells() const
+        {
+            return stencilPtr_().interpolationCells();
+        }
+
+        //- Return a communication schedule
+        virtual const mapDistribute& cellInterpolationMap() const
+        {
+            return stencilPtr_().cellInterpolationMap();
+        }
+
+        //- Per interpolated cell the neighbour cells (in terms of slots as
+        //  constructed by above cellInterpolationMap) to interpolate
+        virtual const labelListList& cellStencil() const
+        {
+            return stencilPtr_().cellStencil();
+        }
+
+        //- Weights for cellStencil
+        virtual const List<scalarList>& cellInterpolationWeights() const
+        {
+            return stencilPtr_().cellInterpolationWeights();
+        }
+
+        //- Per interpolated cell the interpolation factor. (0 = use
+        //  calculated, 1 = use interpolated)
+        virtual const scalarList& cellInterpolationWeight() const
+        {
+            return stencilPtr_().cellInterpolationWeight();
+        }
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/overset/cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.C b/src/overset/cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.C
new file mode 100644
index 00000000000..9e7001454d1
--- /dev/null
+++ b/src/overset/cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.C
@@ -0,0 +1,1107 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2014-2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify i
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "cellVolumeWeightCellCellStencil.H"
+#include "addToRunTimeSelectionTable.H"
+#include "OBJstream.H"
+#include "Time.H"
+#include "meshToMesh.H"
+#include "cellVolumeWeightMethod.H"
+#include "fvMeshSubset.H"
+#include "regionSplit.H"
+#include "globalIndex.H"
+#include "oversetFvPatch.H"
+#include "zeroGradientFvPatchFields.H"
+#include "syncTools.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace cellCellStencils
+{
+    defineTypeNameAndDebug(cellVolumeWeight, 0);
+    addToRunTimeSelectionTable(cellCellStencil, cellVolumeWeight, mesh);
+}
+}
+
+Foam::scalar
+Foam::cellCellStencils::cellVolumeWeight::defaultOverlapTolerance_ = 1e-3;
+
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+void Foam::cellCellStencils::cellVolumeWeight::walkFront
+(
+    const scalar layerRelax,
+    labelList& allCellTypes,
+    scalarField& allWeight
+) const
+{
+    // Current front
+    PackedBoolList isFront(mesh_.nFaces());
+    PackedBoolList doneCell(mesh_.nCells());
+
+    const fvBoundaryMesh& fvm = mesh_.boundary();
+
+
+    // 'overset' patches
+
+    forAll(fvm, patchI)
+    {
+        if (isA<oversetFvPatch>(fvm[patchI]))
+        {
+            Pout<< "Storing faces on patch " << fvm[patchI].name() << endl;
+
+            forAll(fvm[patchI], i)
+            {
+                isFront[fvm[patchI].start()+i] = true;
+            }
+        }
+    }
+
+
+    // Outside of 'hole' region
+    {
+        const labelList& own = mesh_.faceOwner();
+        const labelList& nei = mesh_.faceNeighbour();
+
+        for (label faceI = 0; faceI < mesh_.nInternalFaces(); faceI++)
+        {
+            label ownType = allCellTypes[own[faceI]];
+            label neiType = allCellTypes[nei[faceI]];
+            if
+            (
+                 (ownType == HOLE && neiType != HOLE)
+              || (ownType != HOLE && neiType == HOLE)
+            )
+            {
+                //Pout<< "Front at face:" << faceI
+                //    << " at:" << mesh_.faceCentres()[faceI] << endl;
+                isFront[faceI] = true;
+            }
+        }
+
+        labelList nbrCellTypes;
+        syncTools::swapBoundaryCellList(mesh_, allCellTypes, nbrCellTypes);
+
+        for
+        (
+            label faceI = mesh_.nInternalFaces();
+            faceI < mesh_.nFaces();
+            faceI++
+        )
+        {
+            label ownType = allCellTypes[own[faceI]];
+            label neiType = nbrCellTypes[faceI-mesh_.nInternalFaces()];
+
+            if
+            (
+                 (ownType == HOLE && neiType != HOLE)
+              || (ownType != HOLE && neiType == HOLE)
+            )
+            {
+                //Pout<< "Front at coupled face:" << faceI
+                //    << " at:" << mesh_.faceCentres()[faceI] << endl;
+                isFront[faceI] = true;
+            }
+        }
+    }
+
+
+
+    // Current interpolation fraction
+    scalar fraction = 1.0;
+
+    while (fraction > SMALL && returnReduce(isFront.count(), sumOp<label>()))
+    {
+        // Interpolate cells on front
+
+        Info<< "Front : fraction:" << fraction
+            << " size:" << returnReduce(isFront.count(), sumOp<label>())
+            << endl;
+
+        PackedBoolList newIsFront(mesh_.nFaces());
+        forAll(isFront, faceI)
+        {
+            if (isFront[faceI])
+            {
+                label own = mesh_.faceOwner()[faceI];
+                if (allCellTypes[own] != HOLE)
+                {
+                    if (allWeight[own] < fraction)
+                    {
+                        allWeight[own] = fraction;
+
+                        if (debug)
+                        {
+                            Pout<< "    setting cell "
+                                << mesh_.cellCentres()[own]
+                                << " to " << fraction << endl;
+                        }
+                        allCellTypes[own] = INTERPOLATED;
+                        newIsFront.set(mesh_.cells()[own]);
+                    }
+                }
+                if (mesh_.isInternalFace(faceI))
+                {
+                    label nei = mesh_.faceNeighbour()[faceI];
+                    if (allCellTypes[nei] != HOLE)
+                    {
+                        if (allWeight[nei] < fraction)
+                        {
+                            allWeight[nei] = fraction;
+
+                            if (debug)
+                            {
+                                Pout<< "    setting cell "
+                                    << mesh_.cellCentres()[nei]
+                                    << " to " << fraction << endl;
+                            }
+
+                            allCellTypes[nei] = INTERPOLATED;
+                            newIsFront.set(mesh_.cells()[nei]);
+                        }
+                    }
+                }
+            }
+        }
+
+        syncTools::syncFaceList(mesh_, newIsFront, orEqOp<unsigned int>());
+
+        isFront.transfer(newIsFront);
+
+        fraction -= layerRelax;
+    }
+}
+
+
+void Foam::cellCellStencils::cellVolumeWeight::findHoles
+(
+    const globalIndex& globalCells,
+    const fvMesh& mesh,
+    const labelList& zoneID,
+    const labelListList& stencil,
+    labelList& cellTypes
+) const
+{
+    const fvBoundaryMesh& pbm = mesh.boundary();
+    const labelList& own = mesh.faceOwner();
+    const labelList& nei = mesh.faceNeighbour();
+
+
+    // The input cellTypes will be
+    // - HOLE           : cell part covered by other-mesh patch
+    // - INTERPOLATED   : cell fully covered by other-mesh patch
+    //                    or next to 'overset' patch
+    // - CALCULATED     : otherwise
+    //
+    // so we start a walk from our patches and any cell we cannot reach
+    // (because we walk is stopped by other-mesh patch) is a hole.
+
+
+    boolList isBlockedFace(mesh.nFaces(), false);
+    for (label faceI = 0; faceI < mesh.nInternalFaces(); faceI++)
+    {
+        label ownType = cellTypes[own[faceI]];
+        label neiType = cellTypes[nei[faceI]];
+        if
+        (
+             (ownType == HOLE && neiType != HOLE)
+          || (ownType != HOLE && neiType == HOLE)
+        )
+        {
+            isBlockedFace[faceI] = true;
+        }
+    }
+
+    labelList nbrCellTypes;
+    syncTools::swapBoundaryCellList(mesh, cellTypes, nbrCellTypes);
+
+    for (label faceI = mesh.nInternalFaces(); faceI < mesh.nFaces(); faceI++)
+    {
+        label ownType = cellTypes[own[faceI]];
+        label neiType = nbrCellTypes[faceI-mesh.nInternalFaces()];
+
+        if
+        (
+             (ownType == HOLE && neiType != HOLE)
+          || (ownType != HOLE && neiType == HOLE)
+        )
+        {
+            isBlockedFace[faceI] = true;
+        }
+    }
+
+    regionSplit cellRegion(mesh, isBlockedFace);
+
+    Info<< typeName << " : detected " << cellRegion.nRegions()
+        << " mesh regions after overset" << nl << endl;
+
+
+
+    // Now we'll have a mesh split according to where there are cells
+    // covered by the other-side patches. See what we can reach from our
+    // real patches
+
+    //  0 : region not yet determined
+    //  1 : borders blockage so is not ok (but can be overriden by real
+    //      patch)
+    //  2 : has real patch in it so is reachable
+    labelList regionType(cellRegion.nRegions(), 0);
+
+
+    // See if any regions borders blockage. Note: isBlockedFace is already
+    // parallel synchronised.
+    {
+        for (label faceI = 0; faceI < mesh.nInternalFaces(); faceI++)
+        {
+            if (isBlockedFace[faceI])
+            {
+                label ownRegion = cellRegion[own[faceI]];
+
+                if (cellTypes[own[faceI]] != HOLE)
+                {
+                    if (regionType[ownRegion] == 0)
+                    {
+                        Pout<< "Mark region:" << ownRegion
+                            << " on zone:" << zoneID[own[faceI]]
+                            << " as next to blockage at:"
+                            << mesh.faceCentres()[faceI] << endl;
+
+                        regionType[ownRegion] = 1;
+                    }
+                }
+
+                label neiRegion = cellRegion[nei[faceI]];
+
+                if (cellTypes[nei[faceI]] != HOLE)
+                {
+                    if (regionType[neiRegion] == 0)
+                    {
+                        Pout<< "Mark region:" << neiRegion
+                            << " on zone:" << zoneID[nei[faceI]]
+                            << " as next to blockage at:"
+                            << mesh.faceCentres()[faceI] << endl;
+                        regionType[neiRegion] = 1;
+                    }
+                }
+            }
+        }
+        for
+        (
+            label faceI = mesh.nInternalFaces();
+            faceI < mesh.nFaces();
+            faceI++
+        )
+        {
+            if (isBlockedFace[faceI])
+            {
+                label ownRegion = cellRegion[own[faceI]];
+
+                if (regionType[ownRegion] == 0)
+                {
+                    Pout<< "Mark region:" << ownRegion
+                        << " on zone:" << zoneID[own[faceI]]
+                        << " as next to blockage at:"
+                        << mesh.faceCentres()[faceI] << endl;
+                    regionType[ownRegion] = 1;
+                }
+            }
+        }
+    }
+
+
+    // Override with real patches
+    forAll(pbm, patchI)
+    {
+        const fvPatch& fvp = pbm[patchI];
+
+        if (isA<oversetFvPatch>(fvp))
+        {}
+        else if (!fvPatch::constraintType(fvp.type()))
+        {
+            Pout<< "Proper patch " << fvp.name() << " of type " << fvp.type()
+                << endl;
+
+            const labelList& fc = fvp.faceCells();
+            forAll(fc, i)
+            {
+                label regionI = cellRegion[fc[i]];
+
+                if (cellTypes[fc[i]] != HOLE && regionType[regionI] != 2)
+                {
+                    Pout<< "reachable region : " << regionI
+                        << " at cell " << mesh.cellCentres()[fc[i]]
+                        << " on zone " << zoneID[fc[i]]
+                        << endl;
+                    regionType[regionI] = 2;
+                }
+            }
+        }
+    }
+
+    // Now we've handled
+    // - cells next to blocked cells
+    // - coupled boundaries
+    // Only thing to handle is the interpolation between regions
+
+
+    labelListList compactStencil(stencil);
+    List<Map<label>> compactMap;
+    mapDistribute map(globalCells, compactStencil, compactMap);
+
+    while (true)
+    {
+        // Synchronise region status on processors
+        // (could instead swap status through processor patches)
+        Pstream::listCombineGather(regionType, maxEqOp<label>());
+        Pstream::listCombineScatter(regionType);
+
+        // Communicate region status through interpolative cells
+        labelList cellRegionType(UIndirectList<label>(regionType, cellRegion));
+        map.distribute(cellRegionType);
+
+
+        label nChanged = 0;
+        forAll(pbm, patchI)
+        {
+            const fvPatch& fvp = pbm[patchI];
+
+            if (isA<oversetFvPatch>(fvp))
+            {
+                const labelUList& fc = fvp.faceCells();
+                forAll(fc, i)
+                {
+                    label cellI = fc[i];
+                    label regionI = cellRegion[cellI];
+
+                    if (regionType[regionI] != 2)
+                    {
+                        const labelList& slots = compactStencil[cellI];
+                        forAll(slots, i)
+                        {
+                            label otherType = cellRegionType[slots[i]];
+
+                            if (otherType == 2)
+                            {
+                                Pout<< "Reachable through interpolation : "
+                                    << regionI << " at cell "
+                                    << mesh.cellCentres()[cellI]
+                                    << endl;
+                                regionType[regionI] = 2;
+                                nChanged++;
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+
+        reduce(nChanged, sumOp<label>());
+        if (nChanged == 0)
+        {
+            break;
+        }
+    }
+
+
+    // See which regions have not been visited (regionType == 1)
+    forAll(cellRegion, cellI)
+    {
+        label type = regionType[cellRegion[cellI]];
+        if (type == 1 && cellTypes[cellI] != HOLE)
+        {
+            cellTypes[cellI] = HOLE;
+        }
+    }
+}
+
+
+void Foam::cellCellStencils::cellVolumeWeight::markPatchCells
+(
+    const fvMesh& mesh,
+    const labelList& cellMap,
+    labelList& patchCellTypes
+) const
+{
+    const fvBoundaryMesh& pbm = mesh.boundary();
+
+    forAll(pbm, patchI)
+    {
+        const fvPatch& fvp = pbm[patchI];
+        const labelList& fc = fvp.faceCells();
+
+        if (isA<oversetFvPatch>(fvp))
+        {
+            Pout<< "Marking cells on overset patch " << fvp.name() << endl;
+            forAll(fc, i)
+            {
+                label cellI = fc[i];
+                patchCellTypes[cellMap[cellI]] = OVERSET;
+            }
+        }
+        else if (!fvPatch::constraintType(fvp.type()))
+        {
+            Pout<< "Marking cells on proper patch " << fvp.name()
+                << " with type " << fvp.type() << endl;
+            forAll(fc, i)
+            {
+                label cellI = fc[i];
+                if (patchCellTypes[cellMap[cellI]] != OVERSET)
+                {
+                    patchCellTypes[cellMap[cellI]] = PATCH;
+                }
+            }
+        }
+    }
+}
+
+
+void Foam::cellCellStencils::cellVolumeWeight::interpolatePatchTypes
+(
+    const labelListList& addressing,
+    const labelList& patchTypes,
+    labelList& result
+) const
+{
+    forAll(result, cellI)
+    {
+        const labelList& slots = addressing[cellI];
+        forAll(slots, i)
+        {
+            label type = patchTypes[slots[i]];
+
+            if (type == OVERSET)
+            {
+                // 'overset' overrides anything
+                result[cellI] = OVERSET;
+                break;
+            }
+            else if (type == PATCH)
+            {
+                // 'patch' overrides -1 and 'other'
+                result[cellI] = PATCH;
+            }
+            else if (result[cellI] == -1)
+            {
+                // 'other' overrides -1 only
+                result[cellI] = OTHER;
+            }
+        }
+    }
+}
+
+
+void Foam::cellCellStencils::cellVolumeWeight::interpolatePatchTypes
+(
+    const autoPtr<mapDistribute>& mapPtr,
+    const labelListList& addressing,
+    const labelList& patchTypes,
+    labelList& result
+) const
+{
+    if (result.size() != addressing.size())
+    {
+        FatalErrorInFunction << "result:" << result.size()
+            << " addressing:" << addressing.size() << exit(FatalError);
+    }
+
+
+    // Initialise to not-mapped
+    result = -1;
+
+    if (mapPtr.valid())
+    {
+        // Pull remote data into order of addressing
+        labelList work(patchTypes);
+        mapPtr().distribute(work);
+
+        interpolatePatchTypes(addressing, work, result);
+    }
+    else
+    {
+        interpolatePatchTypes(addressing, patchTypes, result);
+    }
+}
+
+
+void Foam::cellCellStencils::cellVolumeWeight::combineCellTypes
+(
+    const label subZoneID,
+    const fvMesh& subMesh,
+    const labelList& subCellMap,
+
+    const label donorZoneID,
+    const labelListList& addressing,
+    const List<scalarList>& weights,
+    const labelList& otherCells,
+    const labelList& interpolatedOtherPatchTypes,
+
+    labelListList& allStencil,
+    scalarListList& allWeights,
+    labelList& allCellTypes,
+    labelList& allDonorID
+) const
+{
+    forAll(subCellMap, subCellI)
+    {
+        label cellI = subCellMap[subCellI];
+
+        bool validDonors = true;
+        switch (interpolatedOtherPatchTypes[subCellI])
+        {
+            case -1:
+            {
+                validDonors = false;
+            }
+            break;
+
+            case OTHER:
+            {
+                // No patch interaction so keep valid
+            }
+            break;
+
+            case PATCH:
+            {
+                if (allCellTypes[cellI] != HOLE)
+                {
+                    scalar overlapVol = sum(weights[subCellI]);
+                    scalar v = mesh_.V()[cellI];
+                    if (overlapVol < (1.0-overlapTolerance_)*v)
+                    {
+                        //Pout<< "** Patch overlap:" << cellI
+                        //    << " at:" << mesh_.cellCentres()[cellI] << endl;
+                        allCellTypes[cellI] = HOLE;
+                        validDonors = false;
+                    }
+                }
+            }
+            break;
+
+            case OVERSET:
+            {
+                validDonors = false;
+            }
+            break;
+        }
+
+
+        if (validDonors)
+        {
+            // There are a few possible choices how to choose between multiple
+            // donor candidates:
+            // 1 highest overlap volume. However this is generally already
+            //   99.9% so you're just measuring truncation error.
+            // 2 smallest donors cells or most donor cells. This is quite
+            //   often done but can cause switching of donor zone from one
+            //   time step to the other if the donor meshes are non-uniform
+            //   and the acceptor cells just happens to be sweeping through
+            //   some small donor cells.
+            // 3 nearest zoneID. So zone 0 preferentially interpolates from
+            //   zone 1, zone 1 preferentially from zone 2 etc.
+
+            //- Option 1:
+            //scalar currentVol = sum(allWeights[cellI]);
+            //if (overlapVol[subCellI] > currentVol)
+
+            //- Option 3:
+            label currentDiff = mag(subZoneID-allDonorID[cellI]);
+            label thisDiff = mag(subZoneID-donorZoneID);
+
+            if
+            (
+                allDonorID[cellI] == -1
+             || (thisDiff < currentDiff)
+             || (thisDiff == currentDiff && donorZoneID > allDonorID[cellI])
+            )
+            {
+                allWeights[cellI] = weights[subCellI];
+                allStencil[cellI] =
+                    UIndirectList<label>
+                    (
+                        otherCells,
+                        addressing[subCellI]
+                    );
+                allDonorID[cellI] = donorZoneID;
+            }
+        }
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::cellCellStencils::cellVolumeWeight::cellVolumeWeight
+(
+    const fvMesh& mesh,
+    const dictionary& dict,
+    const bool doUpdate
+)
+:
+    cellCellStencil(mesh),
+    dict_(dict),
+    overlapTolerance_(defaultOverlapTolerance_),
+    cellTypes_(labelList(mesh.nCells(), CALCULATED)),
+    interpolationCells_(0),
+    cellInterpolationMap_(),
+    cellStencil_(0),
+    cellInterpolationWeights_(0),
+    cellInterpolationWeight_
+    (
+        IOobject
+        (
+            "cellInterpolationWeight",
+            mesh_.facesInstance(),
+            mesh_,
+            IOobject::NO_READ,
+            IOobject::NO_WRITE,
+            false
+        ),
+        mesh_,
+        dimensionedScalar("zero", dimless, 0.0),
+        zeroGradientFvPatchScalarField::typeName
+    )
+{
+    if (doUpdate)
+    {
+        update();
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::cellCellStencils::cellVolumeWeight::~cellVolumeWeight()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::cellCellStencils::cellVolumeWeight::update()
+{
+    scalar layerRelax(dict_.lookupOrDefault("layerRelax", 1.0));
+    const labelIOList& zoneID = this->zoneID();
+
+    label nZones = gMax(zoneID)+1;
+    labelList nCellsPerZone(nZones, 0);
+    forAll(zoneID, cellI)
+    {
+        nCellsPerZone[zoneID[cellI]]++;
+    }
+    Pstream::listCombineGather(nCellsPerZone, plusEqOp<label>());
+    Pstream::listCombineScatter(nCellsPerZone);
+
+
+    Info<< typeName << " : detected " << nZones
+        << " mesh regions" << nl << endl;
+
+
+    PtrList<fvMeshSubset> meshParts(nZones);
+
+    Info<< incrIndent;
+    forAll(nCellsPerZone, zoneI)
+    {
+        Info<< indent<< "zone:" << zoneI << " nCells:" << nCellsPerZone[zoneI]
+            << endl;
+        meshParts.set(zoneI, new fvMeshSubset(mesh_));
+        meshParts[zoneI].setLargeCellSubset(zoneID, zoneI);
+    }
+    Info<< decrIndent;
+
+
+
+    // Current best guess for cells. Includes best stencil. Weights should
+    // add up to volume.
+    labelList allCellTypes(mesh_.nCells(), CALCULATED);
+    labelList allPatchTypes(mesh_.nCells(), OTHER);
+    labelListList allStencil(mesh_.nCells());
+    scalarListList allWeights(mesh_.nCells());
+    // zoneID of donor
+    labelList allDonorID(mesh_.nCells(), -1);
+
+
+    // Marking patch cells
+    forAll(meshParts, partI)
+    {
+        const fvMesh& partMesh = meshParts[partI].subMesh();
+        const labelList& partCellMap = meshParts[partI].cellMap();
+
+        // Mark cells with
+        // - overset boundary
+        // - other, proper boundary
+        // - other cells
+        Info<< "Marking patch-cells on zone " << partI << endl;
+        markPatchCells(partMesh, partCellMap, allPatchTypes);
+    }
+
+
+    labelList nCells(count(3, allPatchTypes));
+    Info<< nl
+        << "After patch analysis : nCells : "
+        << returnReduce(allPatchTypes.size(), sumOp<label>()) << nl
+        << incrIndent
+        << indent << "other  : " << nCells[OTHER] << nl
+        << indent << "patch  : " << nCells[PATCH] << nl
+        << indent << "overset: " << nCells[OVERSET] << nl
+        << decrIndent << endl;
+
+    globalIndex globalCells(mesh_.nCells());
+
+
+    for (label srcI = 0; srcI < meshParts.size()-1; srcI++)
+    {
+        const fvMesh& srcMesh = meshParts[srcI].subMesh();
+        const labelList& srcCellMap = meshParts[srcI].cellMap();
+
+        for (label tgtI = srcI+1; tgtI < meshParts.size(); tgtI++)
+        {
+            const fvMesh& tgtMesh = meshParts[tgtI].subMesh();
+            const labelList& tgtCellMap = meshParts[tgtI].cellMap();
+
+            meshToMesh mapper
+            (
+                srcMesh,
+                tgtMesh,
+                meshToMesh::imCellVolumeWeight,
+                HashTable<word>(0),     // patchMap,
+                wordList(0),            // cuttingPatches
+                false                   // do not normalise
+            );
+
+
+            {
+                // Get tgt patch types on src mesh
+                labelList interpolatedTgtPatchTypes(srcMesh.nCells(), -1);
+                interpolatePatchTypes
+                (
+                    mapper.tgtMap(),            // How to get remote data local
+                    mapper.srcToTgtCellAddr(),
+                    labelList(UIndirectList<label>(allPatchTypes, tgtCellMap)),
+                    interpolatedTgtPatchTypes
+                );
+
+                // Get target cell labels in global cell indexing (on overall
+                // mesh)
+                labelList tgtGlobalCells(tgtMesh.nCells());
+                {
+                    forAll(tgtCellMap, tgtCellI)
+                    {
+                        label cellI = tgtCellMap[tgtCellI];
+                        tgtGlobalCells[tgtCellI] = globalCells.toGlobal(cellI);
+                    }
+                    if (mapper.tgtMap().valid())
+                    {
+                        mapper.tgtMap()().distribute(tgtGlobalCells);
+                    }
+                }
+                combineCellTypes
+                (
+                    srcI,
+                    srcMesh,
+                    srcCellMap,
+
+                    tgtI,
+                    mapper.srcToTgtCellAddr(),
+                    mapper.srcToTgtCellWght(),
+                    tgtGlobalCells,
+                    interpolatedTgtPatchTypes,
+
+                    // Overall mesh data
+                    allStencil,
+                    allWeights,
+                    allCellTypes,
+                    allDonorID
+                );
+            }
+
+            {
+                // Get src patch types on tgt mesh
+                labelList interpolatedSrcPatchTypes(tgtMesh.nCells(), -1);
+                interpolatePatchTypes
+                (
+                    mapper.srcMap(),            // How to get remote data local
+                    mapper.tgtToSrcCellAddr(),
+                    labelList(UIndirectList<label>(allPatchTypes, srcCellMap)),
+                    interpolatedSrcPatchTypes
+                );
+
+                labelList srcGlobalCells(srcMesh.nCells());
+                {
+                    forAll(srcCellMap, srcCellI)
+                    {
+                        label cellI = srcCellMap[srcCellI];
+                        srcGlobalCells[srcCellI] = globalCells.toGlobal(cellI);
+                    }
+                    if (mapper.srcMap().valid())
+                    {
+                        mapper.srcMap()().distribute(srcGlobalCells);
+                    }
+                }
+
+                combineCellTypes
+                (
+                    tgtI,
+                    tgtMesh,
+                    tgtCellMap,
+
+                    srcI,
+                    mapper.tgtToSrcCellAddr(),
+                    mapper.tgtToSrcCellWght(),
+                    srcGlobalCells,
+                    interpolatedSrcPatchTypes,
+
+                    // Overall mesh data
+                    allStencil,
+                    allWeights,
+                    allCellTypes,
+                    allDonorID
+                );
+            }
+        }
+    }
+
+
+    // Use the patch types and weights to decide what to do
+    forAll(allPatchTypes, cellI)
+    {
+        if (allCellTypes[cellI] != HOLE)
+        {
+            switch (allPatchTypes[cellI])
+            {
+                case OVERSET:
+                {
+                    // Interpolate. Check if enough overlap
+                    scalar v = mesh_.V()[cellI];
+                    scalar overlapVol = sum(allWeights[cellI]);
+                    if (overlapVol > (1.0-overlapTolerance_)*v)
+                    {
+                        allCellTypes[cellI] = INTERPOLATED;
+                    }
+                    else
+                    {
+                        //Pout<< "Holeing interpolated cell:" << cellI
+                        //    << " at:" << mesh_.cellCentres()[cellI] << endl;
+                        allCellTypes[cellI] = HOLE;
+                        allWeights[cellI].clear();
+                        allStencil[cellI].clear();
+                    }
+                    break;
+                }
+            }
+        }
+    }
+
+
+    // Knock out cell with insufficient interpolation weights
+    forAll(allCellTypes, cellI)
+    {
+        if (allCellTypes[cellI] == INTERPOLATED)
+        {
+            scalar v = mesh_.V()[cellI];
+            scalar overlapVol = sum(allWeights[cellI]);
+            if (overlapVol < (1.0-overlapTolerance_)*v)
+            {
+                //Pout<< "Holeing cell:" << cellI
+                //    << " at:" << mesh_.cellCentres()[cellI] << endl;
+                allCellTypes[cellI] = HOLE;
+                allWeights[cellI].clear();
+                allStencil[cellI].clear();
+            }
+        }
+    }
+
+
+    // Mark unreachable bits
+    findHoles(globalCells, mesh_, zoneID, allStencil, allCellTypes);
+
+
+    // Add buffer interpolation layer around holes
+    scalarField allWeight(mesh_.nCells(), 0.0);
+    walkFront(layerRelax, allCellTypes, allWeight);
+
+
+    // Normalise weights, Clear storage
+    forAll(allCellTypes, cellI)
+    {
+        if (allCellTypes[cellI] == INTERPOLATED)
+        {
+            if (allWeight[cellI] < SMALL || allStencil[cellI].size() == 0)
+            {
+                //Pout<< "Clearing cell:" << cellI
+                //    << " at:" << mesh_.cellCentres()[cellI] << endl;
+                allWeights[cellI].clear();
+                allStencil[cellI].clear();
+                allWeight[cellI] = 0.0;
+            }
+            else
+            {
+                scalar s = sum(allWeights[cellI]);
+                forAll(allWeights[cellI], i)
+                {
+                    allWeights[cellI][i] /= s;
+                }
+            }
+        }
+        else
+        {
+            allWeights[cellI].clear();
+            allStencil[cellI].clear();
+        }
+    }
+
+
+    // Write to volField for debugging
+    if (debug)
+    {
+        volScalarField patchTypes
+        (
+            IOobject
+            (
+                "patchTypes",
+                mesh_.time().timeName(),
+                mesh_,
+                IOobject::NO_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            mesh_,
+            dimensionedScalar("zero", dimless, 0.0),
+            zeroGradientFvPatchScalarField::typeName
+        );
+
+        forAll(patchTypes.internalField(), cellI)
+        {
+            patchTypes[cellI] = allPatchTypes[cellI];
+        }
+        patchTypes.correctBoundaryConditions();
+        patchTypes.write();
+    }
+    if (debug)
+    {
+        volScalarField volTypes
+        (
+            IOobject
+            (
+                "cellTypes",
+                mesh_.time().timeName(),
+                mesh_,
+                IOobject::NO_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            mesh_,
+            dimensionedScalar("zero", dimless, 0.0),
+            zeroGradientFvPatchScalarField::typeName
+        );
+
+        forAll(volTypes.internalField(), cellI)
+        {
+            volTypes[cellI] = allCellTypes[cellI];
+        }
+        volTypes.correctBoundaryConditions();
+        volTypes.write();
+    }
+
+
+
+    cellTypes_.transfer(allCellTypes);
+    cellStencil_.transfer(allStencil);
+    cellInterpolationWeights_.transfer(allWeights);
+    cellInterpolationWeight_.transfer(allWeight);
+    cellInterpolationWeight_.correctBoundaryConditions();
+
+    DynamicList<label> interpolationCells;
+    forAll(cellStencil_, cellI)
+    {
+        if (cellStencil_[cellI].size())
+        {
+            interpolationCells.append(cellI);
+        }
+    }
+    interpolationCells_.transfer(interpolationCells);
+
+
+    List<Map<label> > compactMap;
+    mapDistribute map(globalCells, cellStencil_, compactMap);
+    cellInterpolationMap_.transfer(map);
+
+    // Dump interpolation stencil
+    if (debug)
+    {
+        // Dump weight
+        cellInterpolationWeight_.instance() = mesh_.time().timeName();
+        cellInterpolationWeight_.write();
+
+
+        mkDir(mesh_.time().timePath());
+        OBJstream str(mesh_.time().timePath()/"stencil2.obj");
+        Info<< typeName << " : dumping to " << str.name() << endl;
+        pointField cc(mesh_.cellCentres());
+        cellInterpolationMap_.distribute(cc);
+
+        forAll(interpolationCells_, compactI)
+        {
+            label cellI = interpolationCells_[compactI];
+            const labelList& slots = cellStencil_[cellI];
+
+            Pout<< "cellI:" << cellI << " at:"
+                << mesh_.cellCentres()[cellI]
+                << " calculated from slots:" << slots
+                << " cc:" << UIndirectList<point>(cc, slots)()
+                << " weights:" << cellInterpolationWeights_[cellI]
+                << endl;
+
+            forAll(slots, i)
+            {
+                const point& donorCc = cc[slots[i]];
+                const point& accCc = mesh_.cellCentres()[cellI];
+
+                str.write(linePointRef(accCc, 0.1*accCc+0.9*donorCc));
+            }
+        }
+    }
+
+
+    {
+        labelList nCells(count(3, cellTypes_));
+        Info<< "Overset analysis : nCells : "
+            << returnReduce(cellTypes_.size(), sumOp<label>()) << nl
+            << incrIndent
+            << indent << "calculated   : " << nCells[CALCULATED] << nl
+            << indent << "interpolated : " << nCells[INTERPOLATED] << nl
+            << indent << "hole         : " << nCells[HOLE] << nl
+            << decrIndent << endl;
+    }
+
+    // Tbd: detect if anything changed. Most likely it did!
+    return true;
+}
+
+
+// ************************************************************************* //
diff --git a/src/overset/cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.H b/src/overset/cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.H
new file mode 100644
index 00000000000..4331b1421f5
--- /dev/null
+++ b/src/overset/cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.H
@@ -0,0 +1,242 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::cellCellStencils::cellVolumeWeight
+
+Description
+    Volume-weighted interpolation stencil
+
+SourceFiles
+    cellVolumeWeightCellCellStencil.C
+    cellVolumeWeightCellCellStencilTemplates.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef cellCellStencils_cellVolumeWeight_H
+#define cellCellStencils_cellVolumeWeight_H
+
+#include "cellCellStencil.H"
+#include "volFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace cellCellStencils
+{
+
+/*---------------------------------------------------------------------------*\
+                     Class cellVolumeWeight Declaration
+\*---------------------------------------------------------------------------*/
+
+class cellVolumeWeight
+:
+    public cellCellStencil
+{
+protected:
+
+    // Static data members
+
+        //- Default overlap tolerance. Fraction of volume
+        static scalar defaultOverlapTolerance_;
+
+
+    // Protected data
+
+        //- Dictionary of motion control parameters
+        const dictionary dict_;
+
+        //- Tolerance for volume overlap. Fraction of volume
+        scalar overlapTolerance_;
+
+        //- Per cell the cell type
+        labelList cellTypes_;
+
+        //- Indices of interpolated cells
+        labelList interpolationCells_;
+
+        //- Fetch interpolated cells
+        mapDistribute cellInterpolationMap_;
+
+        //- Interpolation stencil
+        labelListList cellStencil_;
+
+        //- Interpolation weights
+        List<scalarList> cellInterpolationWeights_;
+
+        //- Amount of interpolation
+        volScalarField cellInterpolationWeight_;
+
+
+   // Protected Member Functions
+
+        void walkFront
+        (
+            const scalar layerRelax,
+            labelList& allCellTypes,
+            scalarField& allWeight
+        ) const;
+
+        //- Find cells next to cells of type PATCH
+        void findHoles
+        (
+            const globalIndex& globalCells,
+            const fvMesh& mesh,
+            const labelList& zoneID,
+            const labelListList& stencil,
+            labelList& cellTypes
+        ) const;
+
+        //- according to additionalDocumentation/MEJ_oversetMesh.txt
+        void markPatchCells
+        (
+            const fvMesh& mesh,
+            const labelList& cellMap,
+            labelList& patchCellTypes
+        ) const;
+
+        void combineCellTypes
+        (
+            const label subZoneID,
+            const fvMesh& subMesh,
+            const labelList& subCellMap,
+
+            const label donorZoneID,
+            const labelListList& toOtherCells,
+            const List<scalarList>& weights,
+            const labelList& otherCells,
+            const labelList& interpolatedOtherPatchTypes,
+
+            labelListList& allStencil,
+            scalarListList& allWeights,
+            labelList& allCellTypes,
+            labelList& allDonorID
+        ) const;
+
+        //- interpolate (= combine) patch types
+        void interpolatePatchTypes
+        (
+            const labelListList& addressing,
+            const labelList& patchTypes,
+            labelList& result
+        ) const;
+
+        //- interpolate (= combine) patch types
+        void interpolatePatchTypes
+        (
+            const autoPtr<mapDistribute>& mapPtr,
+            const labelListList& addressing,
+            const labelList& patchTypes,
+            labelList& result
+        ) const;
+
+
+private:
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        cellVolumeWeight(const cellVolumeWeight&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const cellVolumeWeight&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("cellVolumeWeight");
+
+
+    // Constructors
+
+        //- Construct from fvMesh
+        cellVolumeWeight(const fvMesh&, const dictionary&, const bool doUpdate);
+
+
+    //- Destructor
+    virtual ~cellVolumeWeight();
+
+
+    // Member Functions
+
+        //- Access to volume overlap tolerance
+        scalar overlapTolerance() const
+        {
+            return overlapTolerance_;
+        }
+
+        //- Update stencils. Return false if nothing changed.
+        virtual bool update();
+
+        //- Return the cell type list
+        virtual const labelUList& cellTypes() const
+        {
+            return cellTypes_;
+        }
+
+        //- Indices of interpolated cells
+        virtual const labelUList& interpolationCells() const
+        {
+            return interpolationCells_;
+        }
+
+        //- Return a communication schedule
+        virtual const mapDistribute& cellInterpolationMap() const
+        {
+            return cellInterpolationMap_;
+        }
+
+        //- Per interpolated cell the neighbour cells (in terms of slots as
+        //  constructed by above cellInterpolationMap) to interpolate
+        virtual const labelListList& cellStencil() const
+        {
+            return cellStencil_;
+        }
+
+        //- Weights for cellStencil
+        virtual const List<scalarList>& cellInterpolationWeights() const
+        {
+            return cellInterpolationWeights_;
+        }
+
+        //- Per interpolated cell the interpolation factor. (0 = use
+        //  calculated, 1 = use interpolated)
+        virtual const scalarList& cellInterpolationWeight() const
+        {
+            return cellInterpolationWeight_;
+        }
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace cellCellStencils
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.C b/src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.C
new file mode 100644
index 00000000000..4a5cdbe8a2c
--- /dev/null
+++ b/src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.C
@@ -0,0 +1,2059 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify i
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "inverseDistanceCellCellStencil.H"
+#include "addToRunTimeSelectionTable.H"
+#include "OBJstream.H"
+#include "Time.H"
+#include "fvMeshSubset.H"
+
+#include "globalIndex.H"
+#include "oversetFvPatch.H"
+#include "zeroGradientFvPatchFields.H"
+#include "syncTools.H"
+#include "treeBoundBoxList.H"
+#include "waveMethod.H"
+
+#include "regionSplit.H"
+//#include "minData.H"
+//#include "FaceCellWave.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace cellCellStencils
+{
+    defineTypeNameAndDebug(inverseDistance, 0);
+    addToRunTimeSelectionTable(cellCellStencil, inverseDistance, mesh);
+}
+}
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+Foam::label Foam::cellCellStencils::inverseDistance::index
+(
+    const labelVector& nDivs,
+    const labelVector& ijk
+)
+{
+    return (ijk[0]*nDivs[1] + ijk[1])*nDivs[2] + ijk[2];
+}
+
+
+Foam::labelVector Foam::cellCellStencils::inverseDistance::index3
+(
+    const labelVector& nDivs,
+    const label boxI
+)
+{
+    label ij = boxI/nDivs[2];
+    label k = boxI-ij*nDivs[2];
+    label i = ij/nDivs[1];
+    label j = ij-i*nDivs[1];
+
+    return labelVector(i, j, k);
+}
+
+
+Foam::labelVector Foam::cellCellStencils::inverseDistance::index3
+(
+    const boundBox& bb,
+    const labelVector& nDivs,
+    const point& pt
+)
+{
+    const vector d(bb.span());
+    const point relPt(pt-bb.min());
+
+    return labelVector
+    (
+        floor(relPt[0]/d[0]*nDivs[0]),
+        floor(relPt[1]/d[1]*nDivs[1]),
+        floor(relPt[2]/d[2]*nDivs[2])
+    );
+}
+
+
+Foam::point Foam::cellCellStencils::inverseDistance::position
+(
+    const boundBox& bb,
+    const labelVector& nDivs,
+    const label boxI
+)
+{
+    // Return midpoint of box indicated by boxI
+    labelVector ids(index3(nDivs, boxI));
+
+    const vector d(bb.span());
+    const vector sz(d[0]/nDivs[0], d[1]/nDivs[1], d[2]/nDivs[2]);
+
+    return bb.min()+0.5*sz+vector(sz[0]*ids[0], sz[1]*ids[1], sz[2]*ids[2]);
+}
+
+
+void Foam::cellCellStencils::inverseDistance::fill
+(
+    PackedList<2>& elems,
+    const boundBox& bb,
+    const labelVector& nDivs,
+    const boundBox& subBb,
+    const unsigned int val
+)
+{
+    labelVector minIds(index3(bb, nDivs, subBb.min()));
+    labelVector maxIds(index3(bb, nDivs, subBb.max()));
+
+    for (direction cmpt = 0; cmpt < 3; cmpt++)
+    {
+        if (maxIds[cmpt] < 0 || minIds[cmpt] > nDivs[cmpt])
+        {
+            return;
+        }
+    }
+
+    labelVector maxIndex(labelVector(nDivs[0]-1, nDivs[1]-1, nDivs[2]-1));
+    minIds = max(labelVector::zero, minIds);
+    maxIds = min(maxIndex, maxIds);
+
+    for (label i = minIds[0]; i <= maxIds[0]; i++)
+    {
+        for (label j = minIds[1]; j <= maxIds[1]; j++)
+        {
+            for (label k = minIds[2]; k <= maxIds[2]; k++)
+            {
+                label i1 = index(nDivs, labelVector(i, j, k));
+                elems[i1] = val;
+            }
+        }
+    }
+}
+
+
+void Foam::cellCellStencils::inverseDistance::markBoundaries
+(
+    const fvMesh& mesh,
+
+    const boundBox& bb,
+    const labelVector& nDivs,
+    PackedList<2>& patchTypes,
+
+    const labelList& cellMap,
+    labelList& patchCellTypes
+)
+{
+    // Mark all voxels that overlap the bounding box of any patch
+
+    const fvBoundaryMesh& pbm = mesh.boundary();
+
+    patchTypes = patchCellType::OTHER;
+
+    // Mark wall boundaries
+    forAll(pbm, patchI)
+    {
+        const fvPatch& fvp = pbm[patchI];
+        const labelList& fc = fvp.faceCells();
+
+        if (!fvPatch::constraintType(fvp.type()))
+        {
+            //Info<< "Marking cells on proper patch " << fvp.name()
+            //    << " with type " << fvp.type() << endl;
+            const polyPatch& pp = fvp.patch();
+            forAll(pp, i)
+            {
+                // Mark in overall patch types
+                patchCellTypes[cellMap[fc[i]]] = patchCellType::PATCH;
+
+                // Mark in voxel mesh
+                boundBox faceBb(pp.points(), pp[i], false);
+                if (bb.overlaps(faceBb))
+                {
+                    fill(patchTypes, bb, nDivs, faceBb, patchCellType::PATCH);
+                }
+            }
+        }
+    }
+
+    // Override with overset boundaries
+    forAll(pbm, patchI)
+    {
+        const fvPatch& fvp = pbm[patchI];
+        const labelList& fc = fvp.faceCells();
+
+        if (isA<oversetFvPatch>(fvp))
+        {
+            //Info<< "Marking cells on overset patch " << fvp.name() << endl;
+            const polyPatch& pp = fvp.patch();
+            forAll(pp, i)
+            {
+                // Mark in overall patch types
+                patchCellTypes[cellMap[fc[i]]] = patchCellType::OVERSET;
+
+                // Mark in voxel mesh
+                boundBox faceBb(pp.points(), pp[i], false);
+                if (bb.overlaps(faceBb))
+                {
+                    fill(patchTypes, bb, nDivs, faceBb, patchCellType::OVERSET);
+                }
+            }
+        }
+    }
+}
+
+
+Foam::treeBoundBox Foam::cellCellStencils::inverseDistance::cellBb
+(
+    const primitiveMesh& mesh,
+    const label celli
+)
+{
+    const cellList& cells = mesh.cells();
+    const faceList& faces = mesh.faces();
+    const pointField& points = mesh.points();
+
+    treeBoundBox bb
+    (
+        vector(GREAT, GREAT, GREAT),
+        vector(-GREAT, -GREAT, -GREAT)
+    );
+
+    const cell& cFaces = cells[celli];
+
+    forAll(cFaces, cFacei)
+    {
+        const face& f = faces[cFaces[cFacei]];
+
+        forAll(f, fp)
+        {
+            const point& p = points[f[fp]];
+
+            bb.min() = min(bb.min(), p);
+            bb.max() = max(bb.max(), p);
+        }
+    }
+    return bb;
+}
+
+
+bool Foam::cellCellStencils::inverseDistance::overlaps
+(
+    const boundBox& bb,
+    const labelVector& nDivs,
+    const PackedList<2>& vals,
+    const treeBoundBox& subBb,
+    const unsigned int val
+)
+{
+    // Checks if subBb overlaps any voxel set to val
+
+    labelVector minIds(index3(bb, nDivs, subBb.min()));
+    labelVector maxIds(index3(bb, nDivs, subBb.max()));
+
+    for (direction cmpt = 0; cmpt < 3; cmpt++)
+    {
+        if (maxIds[cmpt] < 0 || minIds[cmpt] > nDivs[cmpt])
+        {
+            return false;
+        }
+    }
+
+    labelVector maxIndex(labelVector(nDivs[0]-1, nDivs[1]-1, nDivs[2]-1));
+    minIds = max(labelVector::zero, minIds);
+    maxIds = min(maxIndex, maxIds);
+
+    for (label i = minIds[0]; i <= maxIds[0]; i++)
+    {
+        for (label j = minIds[1]; j <= maxIds[1]; j++)
+        {
+            for (label k = minIds[2]; k <= maxIds[2]; k++)
+            {
+                label i1 = index(nDivs, labelVector(i, j, k));
+                if (vals[i1] == patchCellType::PATCH)
+                {
+                    return true;
+                }
+            }
+        }
+    }
+    return false;
+}
+
+
+void Foam::cellCellStencils::inverseDistance::markPatchesAsHoles
+(
+    PstreamBuffers& pBufs,
+
+    const PtrList<fvMeshSubset>& meshParts,
+
+    const List<treeBoundBoxList>& patchBb,
+    const List<labelVector>& patchDivisions,
+    const PtrList<PackedList<2>>& patchParts,
+
+    const label srcI,
+    const label tgtI,
+    labelList& allCellTypes
+) const
+{
+    const treeBoundBoxList& srcPatchBbs = patchBb[srcI];
+    const treeBoundBoxList& tgtPatchBbs = patchBb[tgtI];
+    const labelList& tgtCellMap = meshParts[tgtI].cellMap();
+
+    // 1. do processor-local src-tgt patch overlap
+    {
+        const treeBoundBox& srcPatchBb = srcPatchBbs[Pstream::myProcNo()];
+        const treeBoundBox& tgtPatchBb = tgtPatchBbs[Pstream::myProcNo()];
+
+        if (srcPatchBb.overlaps(tgtPatchBb))
+        {
+            const PackedList<2>& srcPatchTypes = patchParts[srcI];
+            const labelVector& zoneDivs = patchDivisions[srcI];
+
+            forAll(tgtCellMap, tgtCelli)
+            {
+                label celli = tgtCellMap[tgtCelli];
+                if
+                (
+                    overlaps
+                    (
+                        srcPatchBb,
+                        zoneDivs,
+                        srcPatchTypes,
+                        cellBb(mesh_, celli),
+                        patchCellType::PATCH
+                    )
+                )
+                {
+                    allCellTypes[celli] = HOLE;
+                }
+            }
+        }
+    }
+
+
+    // 2. Send over srcMesh bits that overlap tgt and do calculation
+    pBufs.clear();
+    for (label procI = 0; procI < Pstream::nProcs(); procI++)
+    {
+        if (procI != Pstream::myProcNo())
+        {
+            const treeBoundBox& srcPatchBb = srcPatchBbs[Pstream::myProcNo()];
+            const treeBoundBox& tgtPatchBb = tgtPatchBbs[procI];
+
+            if (srcPatchBb.overlaps(tgtPatchBb))
+            {
+                // Send over complete patch voxel map. Tbd: could
+                // subset
+                UOPstream os(procI, pBufs);
+                os << srcPatchBb << patchDivisions[srcI] << patchParts[srcI];
+            }
+        }
+    }
+    pBufs.finishedSends();
+    for (label procI = 0; procI < Pstream::nProcs(); procI++)
+    {
+        if (procI != Pstream::myProcNo())
+        {
+            //const treeBoundBox& srcBb = srcBbs[procI];
+            const treeBoundBox& srcPatchBb = srcPatchBbs[procI];
+            const treeBoundBox& tgtPatchBb = tgtPatchBbs[Pstream::myProcNo()];
+
+            if (srcPatchBb.overlaps(tgtPatchBb))
+            {
+                UIPstream is(procI, pBufs);
+                {
+                    treeBoundBox receivedBb(is);
+                    if (srcPatchBb != receivedBb)
+                    {
+                        FatalErrorInFunction
+                            << "proc:" << procI
+                            << " srcPatchBb:" << srcPatchBb
+                            << " receivedBb:" << receivedBb
+                            << exit(FatalError);
+                    }
+                }
+                const labelVector zoneDivs(is);
+                const PackedList<2> srcPatchTypes(is);
+
+                forAll(tgtCellMap, tgtCelli)
+                {
+                    label celli = tgtCellMap[tgtCelli];
+                    if
+                    (
+                        overlaps
+                        (
+                            srcPatchBb,
+                            zoneDivs,
+                            srcPatchTypes,
+                            cellBb(mesh_, celli),
+                            patchCellType::PATCH
+                        )
+                    )
+                    {
+                        allCellTypes[celli] = HOLE;
+                    }
+                }
+            }
+        }
+    }
+}
+
+
+void Foam::cellCellStencils::inverseDistance::markDonors
+(
+    const globalIndex& globalCells,
+    PstreamBuffers& pBufs,
+    const PtrList<fvMeshSubset>& meshParts,
+    const List<treeBoundBoxList>& meshBb,
+
+    const label srcI,
+    const label tgtI,
+    labelListList& allStencil,
+    labelList& allDonor
+) const
+{
+    const treeBoundBoxList& srcBbs = meshBb[srcI];
+    const treeBoundBoxList& tgtBbs = meshBb[tgtI];
+
+    const fvMesh& srcMesh = meshParts[srcI].subMesh();
+    const labelList& srcCellMap = meshParts[srcI].cellMap();
+    const fvMesh& tgtMesh = meshParts[tgtI].subMesh();
+    const pointField& tgtCc = tgtMesh.cellCentres();
+    const labelList& tgtCellMap = meshParts[tgtI].cellMap();
+
+    // 1. do processor-local src/tgt overlap
+    {
+        labelList tgtToSrcAddr;
+        waveMethod::calculate(tgtMesh, srcMesh, tgtToSrcAddr);
+        forAll(tgtCellMap, tgtCelli)
+        {
+            label srcCelli = tgtToSrcAddr[tgtCelli];
+            if (srcCelli != -1)
+            {
+                label celli = tgtCellMap[tgtCelli];
+                label globalDonor =
+                    globalCells.toGlobal(srcCellMap[srcCelli]);
+                allStencil[celli].setSize(1);
+                allStencil[celli][0] = globalDonor;
+                allDonor[celli] = srcI;
+            }
+        }
+    }
+
+
+    // 2. Send over tgtMesh bits that overlap src and do calculation on
+    //    srcMesh.
+
+
+    // (remote) processors where the tgt overlaps my src
+    DynamicList<label> tgtOverlapProcs(Pstream::nProcs());
+    // (remote) processors where the src overlaps my tgt
+    DynamicList<label> srcOverlapProcs(Pstream::nProcs());
+    for (label procI = 0; procI < Pstream::nProcs(); procI++)
+    {
+        if (procI != Pstream::myProcNo())
+        {
+            if (tgtBbs[procI].overlaps(srcBbs[Pstream::myProcNo()]))
+            {
+                tgtOverlapProcs.append(procI);
+            }
+            if (srcBbs[procI].overlaps(tgtBbs[Pstream::myProcNo()]))
+            {
+                srcOverlapProcs.append(procI);
+            }
+        }
+    }
+
+
+
+    // Indices of tgtcells to send over to each processor
+    List<DynamicList<label> > tgtSendCells(Pstream::nProcs());
+    forAll(srcOverlapProcs, i)
+    {
+        label procI = srcOverlapProcs[i];
+        tgtSendCells[procI].reserve(tgtMesh.nCells()/srcOverlapProcs.size());
+    }
+
+
+    forAll(tgtCellMap, tgtCelli)
+    {
+        label celli = tgtCellMap[tgtCelli];
+        if (allStencil[celli].empty())
+        {
+            const treeBoundBox subBb(cellBb(mesh_, celli));
+
+            forAll(srcOverlapProcs, i)
+            {
+                label procI = srcOverlapProcs[i];
+                if (subBb.overlaps(srcBbs[procI]))
+                {
+                    tgtSendCells[procI].append(tgtCelli);
+                }
+            }
+        }
+    }
+
+    // Send target cell centres to overlapping processors
+    pBufs.clear();
+
+    forAll(srcOverlapProcs, i)
+    {
+        label procI = srcOverlapProcs[i];
+        const labelList& cellIDs = tgtSendCells[procI];
+
+        UOPstream os(procI, pBufs);
+        os << UIndirectList<point>(tgtCc, cellIDs);
+    }
+    pBufs.finishedSends();
+
+    // Receive bits of target processors; find; send back
+    (void)srcMesh.tetBasePtIs();
+    forAll(tgtOverlapProcs, i)
+    {
+        label procI = tgtOverlapProcs[i];
+
+        UIPstream is(procI, pBufs);
+        pointList samples(is);
+
+        labelList donors(samples.size(), -1);
+        forAll(samples, sampleI)
+        {
+            const point& sample = samples[sampleI];
+            label srcCelli = srcMesh.findCell(sample, polyMesh::CELL_TETS);
+            if (srcCelli != -1)
+            {
+                donors[sampleI] = globalCells.toGlobal(srcCellMap[srcCelli]);
+            }
+        }
+
+        // Use same pStreamBuffers to send back.
+        UOPstream os(procI, pBufs);
+        os << donors;
+    }
+    pBufs.finishedSends();
+
+    forAll(srcOverlapProcs, i)
+    {
+        label procI = srcOverlapProcs[i];
+        const labelList& cellIDs = tgtSendCells[procI];
+
+        UIPstream is(procI, pBufs);
+        labelList donors(is);
+
+        if (donors.size() != cellIDs.size())
+        {
+            FatalErrorInFunction<< "problem : cellIDs:" << cellIDs.size()
+                << " donors:" << donors.size() << abort(FatalError);
+        }
+
+        forAll(donors, donorI)
+        {
+            label globalDonor = donors[donorI];
+
+            if (globalDonor != -1)
+            {
+                label celli = tgtCellMap[cellIDs[donorI]];
+
+                // TBD: check for multiple donors. Maybe better one?
+                if (allStencil[celli].empty())
+                {
+                    allStencil[celli].setSize(1);
+                    allStencil[celli][0] = globalDonor;
+                    allDonor[celli] = srcI;
+                }
+            }
+        }
+    }
+}
+
+
+//void Foam::cellCellStencils::inverseDistance::uncompactedRegionSplit
+//(
+//    const fvMesh& mesh,
+//    const globalIndex& globalFaces,
+//    const label nZones,
+//    const labelList& zoneID,
+//    const labelList& cellTypes,
+//    const boolList& isBlockedFace,
+//    labelList& cellRegion
+//) const
+//{
+//    // Pass 1: locally seed 2 cells per zone (one unblocked, one blocked).
+//    // This avoids excessive numbers of front
+//
+//    // Field on cells and faces.
+//    List<minData> cellData(mesh.nCells());
+//    List<minData> faceData(mesh.nFaces());
+//
+//    // Take over blockedFaces by seeding a negative number
+//    // (so is always less than the decomposition)
+//
+//    forAll(isBlockedFace, facei)
+//    {
+//        if (isBlockedFace[facei])
+//        {
+//            faceData[facei] = minData(-2);
+//        }
+//    }
+//
+//
+//    labelList seedFace(nZones, -1);
+//
+//    const labelList& owner = mesh.faceOwner();
+//    const labelList& neighbour = mesh.faceNeighbour();
+//
+//    forAll(owner, facei)
+//    {
+//        label own = owner[facei];
+//        if (seedFace[zoneID[own]] == -1)
+//        {
+//            if (cellTypes[own] != HOLE)
+//            {
+//                const cell& cFaces = mesh.cells()[own];
+//                forAll(cFaces, i)
+//                {
+//                    if (!isBlockedFace[cFaces[i]])
+//                    {
+//                        seedFace[zoneID[own]] = cFaces[i];
+//                    }
+//                }
+//            }
+//        }
+//    }
+//    forAll(neighbour, facei)
+//    {
+//        label nei = neighbour[facei];
+//        if (seedFace[zoneID[nei]] == -1)
+//        {
+//            if (cellTypes[nei] != HOLE)
+//            {
+//                const cell& cFaces = mesh.cells()[nei];
+//                forAll(cFaces, i)
+//                {
+//                    if (!isBlockedFace[cFaces[i]])
+//                    {
+//                        seedFace[zoneID[nei]] = cFaces[i];
+//                    }
+//                }
+//            }
+//        }
+//    }
+//
+//    DynamicList<label> seedFaces(nZones);
+//    DynamicList<minData> seedData(seedFaces.size());
+//    forAll(seedFace, zonei)
+//    {
+//        if (seedFace[zonei] != -1)
+//        {
+//            seedFaces.append(seedFace[zonei]);
+//            seedData.append(minData(globalFaces.toGlobal(seedFace[zonei])));
+//        }
+//    }
+//
+//    // Propagate information inwards
+//    FaceCellWave<minData> deltaCalc
+//    (
+//        mesh,
+//        List<labelPair>(),
+//        false,  // disable walking through cyclicAMI for backwards
+//                // compatibility
+//        seedFaces,
+//        seedData,
+//        faceData,
+//        cellData,
+//        mesh.globalData().nTotalCells()+1
+//    );
+//
+//    // Extract
+//    cellRegion.setSize(mesh.nCells());
+//    forAll(cellRegion, celli)
+//    {
+//        if (cellData[celli].valid(deltaCalc.data()))
+//        {
+//            cellRegion[celli] = cellData[celli].data();
+//        }
+//        else
+//        {
+//            // Unvisited cell -> only possible if surrounded by blocked faces.
+//            // If so make up region from any of the faces
+//            const cell& cFaces = mesh.cells()[celli];
+//            label facei = cFaces[0];
+//            cellRegion[celli] = globalFaces.toGlobal(facei);
+//        }
+//    }
+//}
+//Foam::autoPtr<Foam::globalIndex>
+//Foam::cellCellStencils::inverseDistance::compactedRegionSplit
+//(
+//    const fvMesh& mesh,
+//    const globalIndex& globalRegions,
+//    labelList& cellRegion
+//) const
+//{
+//    // Now our cellRegion will have
+//    // - non-local regions (i.e. originating from other processors)
+//    // - non-compact locally originating regions
+//    // so we'll need to compact
+//
+//    // 4a: count per originating processor the number of regions
+//    labelList nOriginating(Pstream::nProcs(), 0);
+//    {
+//        labelHashSet haveRegion(mesh.nCells()/8);
+//
+//        forAll(cellRegion, celli)
+//        {
+//            label region = cellRegion[celli];
+//
+//            // Count originating processor. Use isLocal as efficiency since
+//            // most cells are locally originating.
+//            if (globalRegions.isLocal(region))
+//            {
+//                if (haveRegion.insert(region))
+//                {
+//                    nOriginating[Pstream::myProcNo()]++;
+//                }
+//            }
+//            else
+//            {
+//                label proci = globalRegions.whichProcID(region);
+//                if (haveRegion.insert(region))
+//                {
+//                    nOriginating[proci]++;
+//                }
+//            }
+//        }
+//    }
+//
+//    if (debug)
+//    {
+//        Pout<< "Counted " << nOriginating[Pstream::myProcNo()]
+//            << " local regions." << endl;
+//    }
+//
+//
+//    // Global numbering for compacted local regions
+//    autoPtr<globalIndex> globalCompactPtr
+//    (
+//        new globalIndex(nOriginating[Pstream::myProcNo()])
+//    );
+//    const globalIndex& globalCompact = globalCompactPtr();
+//
+//
+//    // 4b: renumber
+//    // Renumber into compact indices. Note that since we've already made
+//    // all regions global we now need a Map to store the compacting
+//    // information
+//    // instead of a labelList - otherwise we could have used a straight
+//    // labelList.
+//
+//    // Local compaction map
+//    Map<label> globalToCompact(2*nOriginating[Pstream::myProcNo()]);
+//    // Remote regions we want the compact number for
+//    List<labelHashSet> nonLocal(Pstream::nProcs());
+//    forAll(nonLocal, proci)
+//    {
+//        if (proci != Pstream::myProcNo())
+//        {
+//            nonLocal[proci].resize(2*nOriginating[proci]);
+//        }
+//    }
+//
+//    forAll(cellRegion, celli)
+//    {
+//        label region = cellRegion[celli];
+//        if (globalRegions.isLocal(region))
+//        {
+//            // Insert new compact region (if not yet present)
+//            globalToCompact.insert
+//            (
+//                region,
+//                globalCompact.toGlobal(globalToCompact.size())
+//            );
+//        }
+//        else
+//        {
+//            nonLocal[globalRegions.whichProcID(region)].insert(region);
+//        }
+//    }
+//
+//
+//    // Now we have all the local regions compacted. Now we need to get the
+//    // non-local ones from the processors to whom they are local.
+//    // Convert the nonLocal (labelHashSets) to labelLists.
+//
+//    labelListList sendNonLocal(Pstream::nProcs());
+//    forAll(sendNonLocal, proci)
+//    {
+//        sendNonLocal[proci] = nonLocal[proci].toc();
+//    }
+//
+//    if (debug)
+//    {
+//        forAll(sendNonLocal, proci)
+//        {
+//            Pout<< "    from processor " << proci
+//                << " want " << sendNonLocal[proci].size()
+//                << " region numbers." << endl;
+//        }
+//        Pout<< endl;
+//    }
+//
+//
+//    // Get the wanted region labels into recvNonLocal
+//    labelListList recvNonLocal;
+//    Pstream::exchange<labelList, label>(sendNonLocal, recvNonLocal);
+//
+//    // Now we have the wanted compact region labels that proci wants in
+//    // recvNonLocal[proci]. Construct corresponding list of compact
+//    // region labels to send back.
+//
+//    labelListList sendWantedLocal(Pstream::nProcs());
+//    forAll(recvNonLocal, proci)
+//    {
+//        const labelList& nonLocal = recvNonLocal[proci];
+//        sendWantedLocal[proci].setSize(nonLocal.size());
+//
+//        forAll(nonLocal, i)
+//        {
+//            sendWantedLocal[proci][i] = globalToCompact[nonLocal[i]];
+//        }
+//    }
+//
+//
+//    // Send back (into recvNonLocal)
+//    recvNonLocal.clear();
+//    Pstream::exchange<labelList, label>(sendWantedLocal, recvNonLocal);
+//    sendWantedLocal.clear();
+//
+//    // Now recvNonLocal contains for every element in setNonLocal the
+//    // corresponding compact number. Insert these into the local compaction
+//    // map.
+//
+//    forAll(recvNonLocal, proci)
+//    {
+//        const labelList& wantedRegions = sendNonLocal[proci];
+//        const labelList& compactRegions = recvNonLocal[proci];
+//
+//        forAll(wantedRegions, i)
+//        {
+//            globalToCompact.insert(wantedRegions[i], compactRegions[i]);
+//        }
+//    }
+//
+//    // Finally renumber the regions
+//    forAll(cellRegion, celli)
+//    {
+//        cellRegion[celli] = globalToCompact[cellRegion[celli]];
+//    }
+//
+//    return globalCompactPtr;
+//}
+
+
+void Foam::cellCellStencils::inverseDistance::findHoles
+(
+    const globalIndex& globalCells,
+    const fvMesh& mesh,
+    const labelList& zoneID,
+    const labelListList& stencil,
+    labelList& cellTypes
+) const
+{
+    const fvBoundaryMesh& pbm = mesh.boundary();
+    const labelList& own = mesh.faceOwner();
+    const labelList& nei = mesh.faceNeighbour();
+
+
+    // The input cellTypes will be
+    // - HOLE           : cell part covered by other-mesh patch
+    // - INTERPOLATED   : cell fully covered by other-mesh patch
+    //                    or next to 'overset' patch
+    // - CALCULATED     : otherwise
+    //
+    // so we start a walk from our patches and any cell we cannot reach
+    // (because we walk is stopped by other-mesh patch) is a hole.
+
+
+    DebugInfo<< FUNCTION_NAME << " : Starting hole flood filling" << endl;
+
+    DebugInfo<< FUNCTION_NAME << " : Starting hole cells : "
+        << findIndices(cellTypes, HOLE).size() << endl;
+
+    boolList isBlockedFace(mesh.nFaces(), false);
+    label nBlocked = 0;
+
+    for (label faceI = 0; faceI < mesh.nInternalFaces(); faceI++)
+    {
+        label ownType = cellTypes[own[faceI]];
+        label neiType = cellTypes[nei[faceI]];
+        if
+        (
+             (ownType == HOLE && neiType != HOLE)
+          || (ownType != HOLE && neiType == HOLE)
+        )
+        {
+            isBlockedFace[faceI] = true;
+            nBlocked++;
+        }
+    }
+    DebugInfo<< FUNCTION_NAME << " : Marked internal hole boundaries : "
+        << nBlocked << endl;
+
+
+    labelList nbrCellTypes;
+    syncTools::swapBoundaryCellList(mesh, cellTypes, nbrCellTypes);
+
+    for (label faceI = mesh.nInternalFaces(); faceI < mesh.nFaces(); faceI++)
+    {
+        label ownType = cellTypes[own[faceI]];
+        label neiType = nbrCellTypes[faceI-mesh.nInternalFaces()];
+
+        if
+        (
+             (ownType == HOLE && neiType != HOLE)
+          || (ownType != HOLE && neiType == HOLE)
+        )
+        {
+            isBlockedFace[faceI] = true;
+            nBlocked++;
+        }
+    }
+
+    DebugInfo<< FUNCTION_NAME << " : Marked all hole boundaries : "
+        << nBlocked << endl;
+
+    // Determine regions
+    regionSplit cellRegion(mesh, isBlockedFace);
+    const label nRegions = cellRegion.nRegions();
+
+    //labelList cellRegion;
+    //label nRegions = -1;
+    //{
+    //    const globalIndex globalFaces(mesh.nFaces());
+    //    uncompactedRegionSplit
+    //    (
+    //        mesh,
+    //        globalFaces,
+    //        gMax(zoneID)+1,
+    //        zoneID,
+    //        cellTypes,
+    //        isBlockedFace,
+    //        cellRegion
+    //    );
+    //    autoPtr<globalIndex> globalRegions
+    //    (
+    //        compactedRegionSplit
+    //        (
+    //            mesh,
+    //            globalFaces,
+    //            cellRegion
+    //        )
+    //    );
+    //    nRegions = globalRegions().size();
+    //}
+    DebugInfo<< FUNCTION_NAME << " : Determined regions : "
+        << nRegions << endl;
+
+    //Info<< typeName << " : detected " << nRegions
+    //    << " mesh regions after overset" << nl << endl;
+
+
+
+    // Now we'll have a mesh split according to where there are cells
+    // covered by the other-side patches. See what we can reach from our
+    // real patches
+
+    //  0 : region not yet determined
+    //  1 : borders blockage so is not ok (but can be overriden by real
+    //      patch)
+    //  2 : has real patch in it so is reachable
+    labelList regionType(nRegions, 0);
+
+
+    // See if any regions borders blockage. Note: isBlockedFace is already
+    // parallel synchronised.
+    {
+        for (label faceI = 0; faceI < mesh.nInternalFaces(); faceI++)
+        {
+            if (isBlockedFace[faceI])
+            {
+                label ownRegion = cellRegion[own[faceI]];
+
+                if (cellTypes[own[faceI]] != HOLE)
+                {
+                    if (regionType[ownRegion] == 0)
+                    {
+                        regionType[ownRegion] = 1;
+                    }
+                }
+
+                label neiRegion = cellRegion[nei[faceI]];
+
+                if (cellTypes[nei[faceI]] != HOLE)
+                {
+                    if (regionType[neiRegion] == 0)
+                    {
+                        regionType[neiRegion] = 1;
+                    }
+                }
+            }
+        }
+        for
+        (
+            label faceI = mesh.nInternalFaces();
+            faceI < mesh.nFaces();
+            faceI++
+        )
+        {
+            if (isBlockedFace[faceI])
+            {
+                label ownRegion = cellRegion[own[faceI]];
+
+                if (regionType[ownRegion] == 0)
+                {
+                    regionType[ownRegion] = 1;
+                }
+            }
+        }
+    }
+
+
+    // Override with real patches
+    forAll(pbm, patchI)
+    {
+        const fvPatch& fvp = pbm[patchI];
+
+        if (isA<oversetFvPatch>(fvp))
+        {}
+        else if (!fvPatch::constraintType(fvp.type()))
+        {
+            const labelList& fc = fvp.faceCells();
+            forAll(fc, i)
+            {
+                label regionI = cellRegion[fc[i]];
+
+                if (cellTypes[fc[i]] != HOLE && regionType[regionI] != 2)
+                {
+                    regionType[regionI] = 2;
+                }
+            }
+        }
+    }
+
+    DebugInfo<< FUNCTION_NAME << " : Done local analysis" << endl;
+
+    // Now we've handled
+    // - cells next to blocked cells
+    // - coupled boundaries
+    // Only thing to handle is the interpolation between regions
+
+
+    labelListList compactStencil(stencil);
+    List<Map<label>> compactMap;
+    mapDistribute map(globalCells, compactStencil, compactMap);
+
+    DebugInfo<< FUNCTION_NAME << " : Converted stencil into compact form"
+        << endl;
+
+
+    while (true)
+    {
+        // Synchronise region status on processors
+        // (could instead swap status through processor patches)
+        Pstream::listCombineGather(regionType, maxEqOp<label>());
+        Pstream::listCombineScatter(regionType);
+
+        DebugInfo<< FUNCTION_NAME << " : Gathered region type" << endl;
+
+        // Communicate region status through interpolative cells
+        labelList cellRegionType(UIndirectList<label>(regionType, cellRegion));
+        map.distribute(cellRegionType);
+
+        DebugInfo<< FUNCTION_NAME << " : Interpolated region type" << endl;
+
+
+
+        label nChanged = 0;
+        forAll(pbm, patchI)
+        {
+            const fvPatch& fvp = pbm[patchI];
+
+            if (isA<oversetFvPatch>(fvp))
+            {
+                const labelUList& fc = fvp.faceCells();
+                forAll(fc, i)
+                {
+                    label cellI = fc[i];
+                    label regionI = cellRegion[cellI];
+
+                    if (regionType[regionI] != 2)
+                    {
+                        const labelList& slots = compactStencil[cellI];
+                        forAll(slots, i)
+                        {
+                            label otherType = cellRegionType[slots[i]];
+
+                            if (otherType == 2)
+                            {
+                                //Pout<< "Reachable through interpolation : "
+                                //    << regionI << " at cell "
+                                //    << mesh.cellCentres()[cellI] << endl;
+                                regionType[regionI] = 2;
+                                nChanged++;
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        reduce(nChanged, sumOp<label>());
+        DebugInfo<< FUNCTION_NAME << " : Determined regions changed : "
+            << nChanged << endl;
+
+        if (nChanged == 0)
+        {
+            break;
+        }
+    }
+
+
+    // See which regions have not been visited (regionType == 1)
+    forAll(cellRegion, cellI)
+    {
+        label type = regionType[cellRegion[cellI]];
+        if (type == 1 && cellTypes[cellI] != HOLE)
+        {
+            cellTypes[cellI] = HOLE;
+        }
+    }
+    DebugInfo<< FUNCTION_NAME << " : Finished hole flood filling" << endl;
+}
+
+
+void Foam::cellCellStencils::inverseDistance::seedCell
+(
+    const label cellI,
+    const scalar wantedFraction,
+    PackedBoolList& isFront,
+    scalarField& fraction
+) const
+{
+    const cell& cFaces = mesh_.cells()[cellI];
+    forAll(cFaces, i)
+    {
+        label nbrFacei = cFaces[i];
+        if (fraction[nbrFacei] < wantedFraction)
+        {
+            fraction[nbrFacei] = wantedFraction;
+            isFront.set(nbrFacei);
+        }
+    }
+}
+
+
+void Foam::cellCellStencils::inverseDistance::walkFront
+(
+    const scalar layerRelax,
+    const labelListList& allStencil,
+    labelList& allCellTypes,
+    scalarField& allWeight
+) const
+{
+    // Current front
+    PackedBoolList isFront(mesh_.nFaces());
+
+    const fvBoundaryMesh& fvm = mesh_.boundary();
+
+
+    // 'overset' patches
+
+    forAll(fvm, patchI)
+    {
+        if (isA<oversetFvPatch>(fvm[patchI]))
+        {
+            forAll(fvm[patchI], i)
+            {
+                isFront[fvm[patchI].start()+i] = true;
+            }
+        }
+    }
+
+
+    // Outside of 'hole' region
+    {
+        const labelList& own = mesh_.faceOwner();
+        const labelList& nei = mesh_.faceNeighbour();
+
+        for (label faceI = 0; faceI < mesh_.nInternalFaces(); faceI++)
+        {
+            label ownType = allCellTypes[own[faceI]];
+            label neiType = allCellTypes[nei[faceI]];
+            if
+            (
+                 (ownType == HOLE && neiType != HOLE)
+              || (ownType != HOLE && neiType == HOLE)
+            )
+            {
+                //Pout<< "Front at face:" << faceI
+                //    << " at:" << mesh_.faceCentres()[faceI] << endl;
+                isFront[faceI] = true;
+            }
+        }
+
+        labelList nbrCellTypes;
+        syncTools::swapBoundaryCellList(mesh_, allCellTypes, nbrCellTypes);
+
+        for
+        (
+            label faceI = mesh_.nInternalFaces();
+            faceI < mesh_.nFaces();
+            faceI++
+        )
+        {
+            label ownType = allCellTypes[own[faceI]];
+            label neiType = nbrCellTypes[faceI-mesh_.nInternalFaces()];
+
+            if
+            (
+                 (ownType == HOLE && neiType != HOLE)
+              || (ownType != HOLE && neiType == HOLE)
+            )
+            {
+                //Pout<< "Front at coupled face:" << faceI
+                //    << " at:" << mesh_.faceCentres()[faceI] << endl;
+                isFront[faceI] = true;
+            }
+        }
+    }
+
+
+    // Current interpolation fraction
+    scalarField fraction(mesh_.nFaces(), 0.0);
+
+    forAll(isFront, faceI)
+    {
+        if (isFront[faceI])
+        {
+            fraction[faceI] = 1.0;
+        }
+    }
+
+
+    while (returnReduce(isFront.count(), sumOp<label>()))
+    {
+        // Interpolate cells on front
+        PackedBoolList newIsFront(mesh_.nFaces());
+        scalarField newFraction(fraction);
+        forAll(isFront, faceI)
+        {
+            if (isFront[faceI])
+            {
+                label own = mesh_.faceOwner()[faceI];
+                if (allCellTypes[own] != HOLE)
+                {
+                    if (allWeight[own] < fraction[faceI])
+                    {
+                        // Cell wants to become interpolated (if sufficient
+                        // stencil, otherwise becomes hole)
+                        if (allStencil[own].size())
+                        {
+                            allWeight[own] = fraction[faceI];
+                            allCellTypes[own] = INTERPOLATED;
+                            // Add faces of cell (with lower weight) as new
+                            // front
+                            seedCell
+                            (
+                                own,
+                                fraction[faceI]-layerRelax,
+                                newIsFront,
+                                newFraction
+                            );
+                        }
+                        else
+                        {
+                            allWeight[own] = 0.0;
+                            allCellTypes[own] = HOLE;
+                            // Add faces of cell as new front
+                            seedCell
+                            (
+                                own,
+                                1.0,
+                                newIsFront,
+                                newFraction
+                            );
+                        }
+                    }
+                }
+                if (mesh_.isInternalFace(faceI))
+                {
+                    label nei = mesh_.faceNeighbour()[faceI];
+                    if (allCellTypes[nei] != HOLE)
+                    {
+                        if (allWeight[nei] < fraction[faceI])
+                        {
+                            if (allStencil[nei].size())
+                            {
+                                allWeight[nei] = fraction[faceI];
+                                allCellTypes[nei] = INTERPOLATED;
+                                seedCell
+                                (
+                                    nei,
+                                    fraction[faceI]-layerRelax,
+                                    newIsFront,
+                                    newFraction
+                                );
+                            }
+                            else
+                            {
+                                allWeight[nei] = 0.0;
+                                allCellTypes[nei] = HOLE;
+                                seedCell
+                                (
+                                    nei,
+                                    1.0,
+                                    newIsFront,
+                                    newFraction
+                                );
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        syncTools::syncFaceList(mesh_, newIsFront, orEqOp<unsigned int>());
+        syncTools::syncFaceList(mesh_, newFraction, maxEqOp<scalar>());
+
+        isFront.transfer(newIsFront);
+        fraction.transfer(newFraction);
+    }
+}
+
+
+void Foam::cellCellStencils::inverseDistance::calcStencilWeights
+(
+    const point& sample,
+    const pointList& donorCcs,
+    scalarList& weights
+)
+{
+    // Inverse-distance weighting
+
+    weights.setSize(donorCcs.size());
+    scalar sum = 0.0;
+    forAll(donorCcs, i)
+    {
+        scalar d = mag(sample-donorCcs[i]);
+
+        if (d > ROOTVSMALL)
+        {
+            weights[i] = 1.0/d;
+            sum += weights[i];
+        }
+        else
+        {
+            // Short circuit
+            weights = 0.0;
+            weights[i] = 1.0;
+            return;
+        }
+    }
+    forAll(weights, i)
+    {
+        weights[i] /= sum;
+    }
+}
+
+
+void Foam::cellCellStencils::inverseDistance::createStencil
+(
+    const globalIndex& globalCells
+)
+{
+    // Send cell centre back to donor
+    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+    // The complication is that multiple acceptors need the same donor
+    // (but with different weights obviously)
+    // So we do multi-pass:
+    // - send over cc of acceptor for which we want stencil.
+    //   Consistenly choose the acceptor with smallest magSqr in case of
+    //   multiple acceptors for the containing cell/donor.
+    // - find the cell-cells and weights for the donor
+    // - send back together with the acceptor cc
+    // - use the acceptor cc to see if it was 'me' that sent it. If so
+    //   mark me as complete so it doesn't get involved in the next loop.
+    // - loop until all resolved.
+
+    // Special value for unused points
+    const vector greatPoint(GREAT, GREAT, GREAT);
+
+    // Has acceptor been handled already?
+    PackedBoolList doneAcceptor(interpolationCells_.size());
+
+    while (true)
+    {
+        pointField samples(cellInterpolationMap_.constructSize(), greatPoint);
+
+        // Fill remote slots (override old content). We'll find out later
+        // on which one has won and mark this one in doneAcceptor.
+        label nSamples = 0;
+        forAll(interpolationCells_, i)
+        {
+            if (!doneAcceptor[i])
+            {
+                label cellI = interpolationCells_[i];
+                const point& cc = mesh_.cellCentres()[cellI];
+                const labelList& slots = cellStencil_[cellI];
+
+                if (slots.size() != 1)
+                {
+                    FatalErrorInFunction<< "Problem:" << slots
+                        << abort(FatalError);
+                }
+
+                forAll(slots, slotI)
+                {
+                    label elemI = slots[slotI];
+                    //Pout<< "    acceptor:" << cellI
+                    //    << " at:" << mesh_.cellCentres()[cellI]
+                    //    << " global:" << globalCells.toGlobal(cellI)
+                    //    << " foudn in donor:" << elemI << endl;
+                    minMagSqrEqOp<point>()(samples[elemI], cc);
+                }
+                nSamples++;
+            }
+        }
+
+
+        if (returnReduce(nSamples, sumOp<label>()) == 0)
+        {
+            break;
+        }
+
+        // Send back to donor. Make sure valid point takes priority
+        mapDistributeBase::distribute<point, minMagSqrEqOp<point>, flipOp>
+        (
+            Pstream::commsTypes::nonBlocking,
+            List<labelPair>(),
+            mesh_.nCells(),
+            cellInterpolationMap_.constructMap(),
+            false,
+            cellInterpolationMap_.subMap(),
+            false,
+            samples,
+            minMagSqrEqOp<point>(),
+            flipOp(),                               // negateOp
+            greatPoint                              // nullValue
+        );
+
+        // All the donor cells will now have a valid cell centre. Construct a
+        // stencil for these.
+
+        DynamicList<label> donorCells(mesh_.nCells());
+        forAll(samples, cellI)
+        {
+            if (samples[cellI] != greatPoint)
+            {
+                donorCells.append(cellI);
+            }
+        }
+
+
+        // Get neighbours (global cell and centre) of donorCells.
+        labelListList donorCellCells(mesh_.nCells());
+        pointListList donorCellCentres(mesh_.nCells());
+        globalCellCells
+        (
+            globalCells,
+            mesh_,
+            donorCells,
+            donorCellCells,
+            donorCellCentres
+        );
+
+        // Determine the weights.
+        scalarListList donorWeights(mesh_.nCells());
+        forAll(donorCells, i)
+        {
+            label cellI = donorCells[i];
+            const pointList& donorCentres = donorCellCentres[cellI];
+            calcStencilWeights
+            (
+                samples[cellI],
+                donorCentres,
+                donorWeights[cellI]
+            );
+        }
+
+        // Transfer the information back to the acceptor:
+        // - donorCellCells : stencil (with first element the original donor)
+        // - donorWeights : weights for donorCellCells
+        cellInterpolationMap_.distribute(donorCellCells);
+        cellInterpolationMap_.distribute(donorWeights);
+        cellInterpolationMap_.distribute(samples);
+
+        // Check which acceptor has won and transfer
+        forAll(interpolationCells_, i)
+        {
+            if (!doneAcceptor[i])
+            {
+                label cellI = interpolationCells_[i];
+                const labelList& slots = cellStencil_[cellI];
+
+                if (slots.size() != 1)
+                {
+                    FatalErrorInFunction << "Problem:" << slots
+                        << abort(FatalError);
+                }
+
+                label slotI = slots[0];
+
+                // Important: check if the stencil is actually for this cell
+                if (samples[slotI] == mesh_.cellCentres()[cellI])
+                {
+                    cellStencil_[cellI].transfer(donorCellCells[slotI]);
+                    cellInterpolationWeights_[cellI].transfer
+                    (
+                        donorWeights[slotI]
+                    );
+                    // Mark cell as being done so it does not get sent over
+                    // again.
+                    doneAcceptor[i] = true;
+                }
+            }
+        }
+    }
+
+    // Re-do the mapDistribute
+    List<Map<label> > compactMap;
+    mapDistribute map(globalCells, cellStencil_, compactMap);
+    cellInterpolationMap_.transfer(map);
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::cellCellStencils::inverseDistance::inverseDistance
+(
+    const fvMesh& mesh,
+    const dictionary& dict,
+    const bool doUpdate
+)
+:
+    cellCellStencil(mesh),
+    dict_(dict),
+    cellTypes_(labelList(mesh.nCells(), CALCULATED)),
+    interpolationCells_(0),
+    cellInterpolationMap_(),
+    cellStencil_(0),
+    cellInterpolationWeights_(0),
+    cellInterpolationWeight_
+    (
+        IOobject
+        (
+            "cellInterpolationWeight",
+            mesh_.facesInstance(),
+            mesh_,
+            IOobject::NO_READ,
+            IOobject::NO_WRITE,
+            false
+        ),
+        mesh_,
+        dimensionedScalar("zero", dimless, 0.0),
+        zeroGradientFvPatchScalarField::typeName
+    )
+{
+    if (doUpdate)
+    {
+        update();
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::cellCellStencils::inverseDistance::~inverseDistance()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::cellCellStencils::inverseDistance::update()
+{
+    scalar layerRelax(dict_.lookupOrDefault("layerRelax", 1.0));
+
+    const labelIOList& zoneID = this->zoneID();
+
+    label nZones = gMax(zoneID)+1;
+    labelList nCellsPerZone(nZones, 0);
+    forAll(zoneID, cellI)
+    {
+        nCellsPerZone[zoneID[cellI]]++;
+    }
+    Pstream::listCombineGather(nCellsPerZone, plusEqOp<label>());
+    Pstream::listCombineScatter(nCellsPerZone);
+
+
+    const boundBox& allBb(mesh_.bounds());
+
+
+    PtrList<fvMeshSubset> meshParts(nZones);
+    List<treeBoundBoxList> meshBb(nZones);
+
+    // Determine zone meshes and bounding boxes
+    {
+        // Per processor, per zone the bounding box
+        List<treeBoundBoxList> procBb(Pstream::nProcs());
+        procBb[Pstream::myProcNo()].setSize(nZones);
+
+        forAll(nCellsPerZone, zoneI)
+        {
+            meshParts.set(zoneI, new fvMeshSubset(mesh_));
+            meshParts[zoneI].setLargeCellSubset(zoneID, zoneI);
+            const fvMesh& subMesh = meshParts[zoneI].subMesh();
+
+            // Trigger early evaluation of mesh dimension (in case there are
+            // zero cells in mesh)
+            (void)subMesh.nGeometricD();
+
+            if (subMesh.nPoints())
+            {
+                procBb[Pstream::myProcNo()][zoneI] =
+                    treeBoundBox(subMesh.points());
+                procBb[Pstream::myProcNo()][zoneI].inflate(1e-6);
+            }
+            else
+            {
+                // No part of zone on this processor. Make up bb.
+                procBb[Pstream::myProcNo()][zoneI] = treeBoundBox
+                (
+                    allBb.min() - 2*allBb.span(),
+                    allBb.min() - allBb.span()
+                );
+                procBb[Pstream::myProcNo()][zoneI].inflate(1e-6);
+            }
+        }
+
+        Pstream::gatherList(procBb);
+        Pstream::scatterList(procBb);
+
+        // Move local bounding boxes to per-mesh indexing
+        forAll(meshBb, zoneI)
+        {
+            treeBoundBoxList& bbs = meshBb[zoneI];
+            bbs.setSize(Pstream::nProcs());
+            forAll(procBb, procI)
+            {
+                bbs[procI] = procBb[procI][zoneI];
+            }
+        }
+    }
+
+
+    // Determine patch bounding boxes. These are either global and provided
+    // by the user or processor-local as a copy of the mesh bounding box.
+
+    List<treeBoundBoxList> patchBb(nZones);
+    List<labelVector> patchDivisions(nZones);
+    PtrList<PackedList<2>> patchParts(nZones);
+    labelList allPatchTypes(mesh_.nCells(), OTHER);
+
+    {
+        treeBoundBox globalPatchBb;
+        if (dict_.readIfPresent("searchBox", globalPatchBb))
+        {
+            // All processors, all zones have the same bounding box
+            patchBb = treeBoundBoxList(Pstream::nProcs(), globalPatchBb);
+        }
+        else
+        {
+            // Use the meshBb (differing per zone, per processor)
+            patchBb = meshBb;
+        }
+    }
+
+    {
+        labelVector globalDivs;
+        if (dict_.readIfPresent("searchBoxDivisions", globalDivs))
+        {
+            patchDivisions = globalDivs;
+        }
+        else
+        {
+            const labelVector& dim = mesh_.geometricD();
+            label nDivs = -1;
+            if (mesh_.nGeometricD() == 1)
+            {
+                nDivs = mesh_.nCells();
+            }
+            else if (mesh_.nGeometricD() == 2)
+            {
+                nDivs = label(Foam::sqrt(scalar(mesh_.nCells())));
+            }
+            else
+            {
+                nDivs = label(Foam::cbrt(scalar(mesh_.nCells())));
+            }
+
+            labelVector v(nDivs, nDivs, nDivs);
+            forAll(dim, i)
+            {
+                if (dim[i] == -1)
+                {
+                    v[i] = 1;
+                }
+            }
+            patchDivisions = v;
+        }
+    }
+
+    forAll(patchParts, zoneI)
+    {
+        patchParts.set
+        (
+            zoneI,
+            new PackedList<2>
+            (
+                patchDivisions[zoneI][0]
+               *patchDivisions[zoneI][1]
+               *patchDivisions[zoneI][2]
+            )
+        );
+        markBoundaries
+        (
+            meshParts[zoneI].subMesh(),
+
+            patchBb[zoneI][Pstream::myProcNo()],
+            patchDivisions[zoneI],
+            patchParts[zoneI],
+
+            meshParts[zoneI].cellMap(),
+            allPatchTypes
+        );
+    }
+
+
+    // Print a bit
+    {
+        Info<< typeName << " : detected " << nZones
+            << " mesh regions" << endl;
+        Info<< incrIndent;
+        forAll(nCellsPerZone, zoneI)
+        {
+            Info<< indent<< "zone:" << zoneI
+                << " nCells:" << nCellsPerZone[zoneI]
+                << "  voxels:" << patchDivisions[zoneI]
+                << " bb:" << patchBb[zoneI][Pstream::myProcNo()]
+                << endl;
+        }
+        Info<< decrIndent;
+    }
+
+
+    // Current best guess for cells. Includes best stencil. Weights should
+    // add up to volume.
+    labelList allCellTypes(mesh_.nCells(), CALCULATED);
+    labelListList allStencil(mesh_.nCells());
+    // zoneID of donor
+    labelList allDonorID(mesh_.nCells(), -1);
+
+    const globalIndex globalCells(mesh_.nCells());
+
+    PstreamBuffers pBufs(Pstream::commsTypes::nonBlocking);
+
+    for (label srcI = 0; srcI < meshParts.size()-1; srcI++)
+    {
+        for (label tgtI = srcI+1; tgtI < meshParts.size(); tgtI++)
+        {
+            markPatchesAsHoles
+            (
+                pBufs,
+
+                meshParts,
+
+                patchBb,
+                patchDivisions,
+                patchParts,
+
+                srcI,
+                tgtI,
+                allCellTypes
+            );
+            markPatchesAsHoles
+            (
+                pBufs,
+
+                meshParts,
+
+                patchBb,
+                patchDivisions,
+                patchParts,
+
+                tgtI,
+                srcI,
+                allCellTypes
+            );
+
+            markDonors
+            (
+                globalCells,
+                pBufs,
+                meshParts,
+                meshBb,
+
+                tgtI,
+                srcI,
+                allStencil,
+                allDonorID
+            );
+            markDonors
+            (
+                globalCells,
+                pBufs,
+                meshParts,
+                meshBb,
+
+                srcI,
+                tgtI,
+                allStencil,
+                allDonorID
+            );
+        }
+    }
+
+
+    // Use the patch types and weights to decide what to do
+    forAll(allPatchTypes, cellI)
+    {
+        if (allCellTypes[cellI] != HOLE)
+        {
+            switch (allPatchTypes[cellI])
+            {
+                case OVERSET:
+                {
+                    // Require interpolation. See if possible.
+
+                    if (allStencil[cellI].size())
+                    {
+                        allCellTypes[cellI] = INTERPOLATED;
+                    }
+                    else
+                    {
+                        allCellTypes[cellI] = HOLE;
+                    }
+                }
+            }
+        }
+    }
+
+
+    // Mark unreachable bits
+    findHoles(globalCells, mesh_, zoneID, allStencil, allCellTypes);
+
+
+    // Add buffer interpolation layer(s) around holes
+    scalarField allWeight(mesh_.nCells(), 0.0);
+    walkFront(layerRelax, allStencil, allCellTypes, allWeight);
+
+
+    // Convert cell-cell addressing to stencil in compact notation
+
+    cellTypes_.transfer(allCellTypes);
+    cellStencil_.setSize(mesh_.nCells());
+    cellInterpolationWeights_.setSize(mesh_.nCells());
+    DynamicList<label> interpolationCells;
+    forAll(cellTypes_, cellI)
+    {
+        if (cellTypes_[cellI] == INTERPOLATED)
+        {
+            cellStencil_[cellI].transfer(allStencil[cellI]);
+            cellInterpolationWeights_[cellI].setSize(1);
+            cellInterpolationWeights_[cellI][0] = 1.0;
+            interpolationCells.append(cellI);
+        }
+        else
+        {
+            cellStencil_[cellI].clear();
+            cellInterpolationWeights_[cellI].clear();
+        }
+    }
+    interpolationCells_.transfer(interpolationCells);
+
+    List<Map<label> > compactMap;
+    mapDistribute map(globalCells, cellStencil_, compactMap);
+    cellInterpolationMap_.transfer(map);
+
+    cellInterpolationWeight_.transfer(allWeight);
+    cellInterpolationWeight_.correctBoundaryConditions();
+
+
+    if (debug&2)
+    {
+        // Dump stencil
+        mkDir(mesh_.time().timePath());
+        OBJstream str(mesh_.time().timePath()/"injectionStencil.obj");
+        Pout<< typeName << " : dumping injectionStencil to "
+            << str.name() << endl;
+        pointField cc(mesh_.cellCentres());
+        cellInterpolationMap_.distribute(cc);
+
+        forAll(cellStencil_, celli)
+        {
+            const labelList& slots = cellStencil_[celli];
+            if (slots.size())
+            {
+                const point& accCc = mesh_.cellCentres()[celli];
+                forAll(slots, i)
+                {
+                    const point& donorCc = cc[slots[i]];
+                    str.write(linePointRef(accCc, 0.1*accCc+0.9*donorCc));
+                }
+            }
+        }
+    }
+
+
+    // Extend stencil to get inverse distance weighted neighbours
+    createStencil(globalCells);
+
+
+    if (debug&2)
+    {
+        // Dump weight
+        cellInterpolationWeight_.instance() = mesh_.time().timeName();
+        cellInterpolationWeight_.write();
+
+        // Dump cell types
+        volScalarField volTypes
+        (
+            IOobject
+            (
+                "cellTypes",
+                mesh_.time().timeName(),
+                mesh_,
+                IOobject::NO_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            mesh_,
+            dimensionedScalar("zero", dimless, 0.0),
+            zeroGradientFvPatchScalarField::typeName
+        );
+
+        forAll(volTypes.internalField(), cellI)
+        {
+            volTypes[cellI] = cellTypes_[cellI];
+        }
+        volTypes.correctBoundaryConditions();
+        volTypes.write();
+
+        // Dump stencil
+        mkDir(mesh_.time().timePath());
+        OBJstream str(mesh_.time().timePath()/"stencil.obj");
+        Pout<< typeName << " : dumping to " << str.name() << endl;
+        pointField cc(mesh_.cellCentres());
+        cellInterpolationMap_.distribute(cc);
+
+        forAll(cellStencil_, celli)
+        {
+            const labelList& slots = cellStencil_[celli];
+            if (slots.size())
+            {
+                const point& accCc = mesh_.cellCentres()[celli];
+                forAll(slots, i)
+                {
+                    const point& donorCc = cc[slots[i]];
+                    str.write(linePointRef(accCc, 0.1*accCc+0.9*donorCc));
+                }
+            }
+        }
+    }
+
+    // Print some stats
+    {
+        labelList nCells(count(3, cellTypes_));
+
+        label nLocal = 0;
+        label nMixed = 0;
+        label nRemote = 0;
+        forAll(interpolationCells_, i)
+        {
+            label celli = interpolationCells_[i];
+            const labelList& slots = cellStencil_[celli];
+
+            bool hasLocal = false;
+            bool hasRemote = false;
+
+            forAll(slots, sloti)
+            {
+                if (slots[sloti] >= mesh_.nCells())
+                {
+                    hasRemote = true;
+                }
+                else
+                {
+                    hasLocal = true;
+                }
+            }
+
+            if (hasRemote)
+            {
+                if (!hasLocal)
+                {
+                    nRemote++;
+                }
+                else
+                {
+                    nMixed++;
+                }
+            }
+            else if (hasLocal)
+            {
+                nLocal++;
+            }
+        }
+        reduce(nLocal, sumOp<label>());
+        reduce(nMixed, sumOp<label>());
+        reduce(nRemote, sumOp<label>());
+
+        Info<< "Overset analysis : nCells : "
+            << returnReduce(cellTypes_.size(), sumOp<label>()) << nl
+            << incrIndent
+            << indent << "calculated   : " << nCells[CALCULATED] << nl
+            << indent << "interpolated : " << nCells[INTERPOLATED]
+            << " (interpolated from local:" << nLocal
+            << "  mixed local/remote:" << nMixed
+            << "  remote:" << nRemote << ")" << nl
+            << indent << "hole         : " << nCells[HOLE] << nl
+            << decrIndent << endl;
+    }
+
+    // Tbd: detect if anything changed. Most likely it did!
+    return true;
+}
+
+
+// ************************************************************************* //
diff --git a/src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.H b/src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.H
new file mode 100644
index 00000000000..ffc9a291ef4
--- /dev/null
+++ b/src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.H
@@ -0,0 +1,334 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::cellCellStencils::inverseDistance
+
+Description
+    Inverse-distance-weighted interpolation stencil.
+
+    hole finding:
+    - mark boundary faces on helper (voxel) mesh
+    - mark any cell overlaying these voxels
+    - use flood filling to find any unreachable cell
+    Alternative is to use an octree of the boundary faces and determine
+    directly for all cells whether we are outside. Might be slow though.
+
+SourceFiles
+    inverseDistanceCellCellStencil.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef cellCellStencils_inverseDistance_H
+#define cellCellStencils_inverseDistance_H
+
+#include "cellCellStencil.H"
+#include "volFields.H"
+#include "labelVector.H"
+#include "treeBoundBoxList.H"
+#include "pointList.H"
+#include "globalIndex.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+class fvMeshSubset;
+
+namespace cellCellStencils
+{
+
+/*---------------------------------------------------------------------------*\
+                     Class inverseDistance Declaration
+\*---------------------------------------------------------------------------*/
+
+class inverseDistance
+:
+    public cellCellStencil
+{
+protected:
+
+    // Protected data
+
+        //- Dictionary of motion control parameters
+        const dictionary dict_;
+
+        //- Per cell the cell type
+        labelList cellTypes_;
+
+        //- Indices of interpolated cells
+        labelList interpolationCells_;
+
+        //- Fetch interpolated cells
+        mapDistribute cellInterpolationMap_;
+
+        //- Interpolation stencil
+        labelListList cellStencil_;
+
+        //- Interpolation weights
+        scalarListList cellInterpolationWeights_;
+
+        //- Amount of interpolation
+        volScalarField cellInterpolationWeight_;
+
+
+   // Protected Member Functions
+
+        // Voxel representation
+
+            //- Convert ijk indices into single index
+            static label index(const labelVector& nDivs, const labelVector&);
+
+            //- Convert single index into ijk
+            static labelVector index3(const labelVector& nDivs, const label);
+
+            //- Convert coordinate into ijk
+            static labelVector index3
+            (
+                const boundBox& bb,
+                const labelVector& nDivs,
+                const point& pt
+            );
+
+            //- Convert index back into coordinate
+            static point position
+            (
+                const boundBox& bb,
+                const labelVector& nDivs,
+                const label boxI
+            );
+
+            //- Fill all elements overlapping subBb with value val
+            static void fill
+            (
+                PackedList<2>& elems,
+                const boundBox& bb,
+                const labelVector& nDivs,
+                const boundBox& subBb,
+                const unsigned int val
+            );
+
+            //- Is any voxel inside subBb set to val
+            static bool overlaps
+            (
+                const boundBox& bb,
+                const labelVector& nDivs,
+                const PackedList<2>& voxels,
+                const treeBoundBox& subBb,
+                const unsigned int val
+            );
+
+        //- Mark voxels of patchTypes with type of patch face
+        static void markBoundaries
+        (
+            const fvMesh& mesh,
+            const boundBox& bb,
+            const labelVector& nDivs,
+            PackedList<2>& patchTypes,
+            const labelList& cellMap,
+            labelList& patchCellTypes
+        );
+
+        //- Calculate bounding box of cell
+        static treeBoundBox cellBb
+        (
+            const primitiveMesh& mesh,
+            const label celli
+        );
+
+        //- Mark all cells overlapping (a voxel covered by) a src patch
+        //  with type HOLE
+        void markPatchesAsHoles
+        (
+            PstreamBuffers& pBufs,
+
+            // Mesh bb and data
+            const PtrList<fvMeshSubset>& meshParts,
+
+            // Helper mesh for patches
+            const List<treeBoundBoxList>& patchBb,
+            const List<labelVector>& patchDivisions,
+            const PtrList<PackedList<2>>& patchParts,
+
+            const label srcI,
+            const label tgtI,
+            labelList& allCellTypes
+        ) const;
+
+        //- Determine donors for all tgt cells
+        void markDonors
+        (
+            const globalIndex& globalCells,
+            PstreamBuffers& pBufs,
+            const PtrList<fvMeshSubset>& meshParts,
+            const List<treeBoundBoxList>& meshBb,
+
+            const label srcI,
+            const label tgtI,
+            labelListList& allStencil,
+            labelList& allDonor
+        ) const;
+
+        //- Replacement of regionSplit
+        void uncompactedRegionSplit
+        (
+            const fvMesh& mesh,
+            const globalIndex& globalFaces,
+            const label nZones,
+            const labelList& zoneID,
+            const labelList& cellTypes,
+            const boolList& isBlockedFace,
+            labelList& cellRegion
+        ) const;
+        autoPtr<globalIndex> compactedRegionSplit
+        (
+            const fvMesh& mesh,
+            const globalIndex& globalFaces,
+            labelList& cellRegion
+        ) const;
+
+        //- Do flood filling to detect unreachable (from patches) sections
+        //  of mesh
+        void findHoles
+        (
+            const globalIndex& globalCells,
+            const fvMesh& mesh,
+            const labelList& zoneID,
+            const labelListList& stencil,
+            labelList& cellTypes
+        ) const;
+
+        //- Seed faces of cell with wantedFraction (if higher than current)
+        void seedCell
+        (
+            const label cellI,
+            const scalar wantedFraction,
+            PackedBoolList& isFront,
+            scalarField& fraction
+        ) const;
+
+        //- Surround holes with layer(s) of interpolated cells
+        void walkFront
+        (
+            const scalar layerRelax,
+            const labelListList& allStencil,
+            labelList& allCellTypes,
+            scalarField& allWeight
+        ) const;
+
+
+        //- Calculate inverse distance weights
+        static void calcStencilWeights
+        (
+            const point& sample,
+            const pointList& donorCcs,
+            scalarList& weights
+        );
+
+        //- Create stencil starting from the donor containing the acceptor
+        virtual void createStencil(const globalIndex&);
+
+
+private:
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        inverseDistance(const inverseDistance&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const inverseDistance&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("inverseDistance");
+
+
+    // Constructors
+
+        //- Construct from fvMesh
+        inverseDistance(const fvMesh&, const dictionary&, const bool);
+
+
+    //- Destructor
+    virtual ~inverseDistance();
+
+
+    // Member Functions
+
+        //- Update stencils. Return false if nothing changed.
+        virtual bool update();
+
+        //- Return the cell type list
+        virtual const labelUList& cellTypes() const
+        {
+            return cellTypes_;
+        }
+
+        //- Indices of interpolated cells
+        virtual const labelUList& interpolationCells() const
+        {
+            return interpolationCells_;
+        }
+
+        //- Return a communication schedule
+        virtual const mapDistribute& cellInterpolationMap() const
+        {
+            return cellInterpolationMap_;
+        }
+
+        //- Per interpolated cell the neighbour cells (in terms of slots as
+        //  constructed by above cellInterpolationMap) to interpolate
+        virtual const labelListList& cellStencil() const
+        {
+            return cellStencil_;
+        }
+
+        //- Weights for cellStencil
+        virtual const scalarListList& cellInterpolationWeights() const
+        {
+            return cellInterpolationWeights_;
+        }
+
+        //- Per interpolated cell the interpolation factor. (0 = use
+        //  calculated, 1 = use interpolated)
+        virtual const scalarList& cellInterpolationWeight() const
+        {
+            return cellInterpolationWeight_;
+        }
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace cellCellStencils
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/overset/cellCellStencil/inverseDistance/meshToMeshData.C b/src/overset/cellCellStencil/inverseDistance/meshToMeshData.C
new file mode 100644
index 00000000000..1d755ae78a5
--- /dev/null
+++ b/src/overset/cellCellStencil/inverseDistance/meshToMeshData.C
@@ -0,0 +1,50 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "meshToMeshData.H"
+
+// * * * * * * * * * * * * * * * Friend Operators  * * * * * * * * * * * * * //
+
+Foam::Ostream& Foam::operator<<
+(
+    Foam::Ostream& os,
+    const Foam::meshToMeshData& wDist
+)
+{
+    return os << wDist.tgtCelli_;
+}
+
+
+Foam::Istream& Foam::operator>>
+(
+    Foam::Istream& is,
+    Foam::meshToMeshData& wDist
+)
+{
+    return is >> wDist.tgtCelli_;
+}
+
+
+// ************************************************************************* //
diff --git a/src/overset/cellCellStencil/inverseDistance/meshToMeshData.H b/src/overset/cellCellStencil/inverseDistance/meshToMeshData.H
new file mode 100644
index 00000000000..0b252bbee05
--- /dev/null
+++ b/src/overset/cellCellStencil/inverseDistance/meshToMeshData.H
@@ -0,0 +1,248 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::meshToMeshData
+
+Description
+    Transfers refinement levels such that slow transition between levels is
+    maintained. Used in FaceCellWave.
+
+SourceFiles
+    meshToMeshDataI.H
+    meshToMeshData.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef meshToMeshData_H
+#define meshToMeshData_H
+
+#include "point.H"
+#include "tensor.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+class polyPatch;
+class polyMesh;
+
+
+// Forward declaration of friend functions and operators
+
+class meshToMeshData;
+
+Istream& operator>>(Istream&, meshToMeshData&);
+Ostream& operator<<(Ostream&, const meshToMeshData&);
+
+
+/*---------------------------------------------------------------------------*\
+                           Class meshToMeshData Declaration
+\*---------------------------------------------------------------------------*/
+
+class meshToMeshData
+{
+public:
+
+    //- Class used to pass non-cell data to the update function
+    class trackData
+    {
+    public:
+
+        const polyMesh& tgtMesh_;
+
+
+        // Constructors
+
+            trackData(const polyMesh& tgtMesh)
+            :
+                tgtMesh_(tgtMesh)
+            {}
+
+    };
+
+
+    // Private data
+
+        // Corresponding cell in tgtMesh
+        label tgtCelli_;
+
+
+public:
+
+    // Constructors
+
+        //- Construct null
+        inline meshToMeshData();
+
+        //- Construct from count
+        inline meshToMeshData
+        (
+            const label tgtCelli
+        );
+
+
+    // Member Functions
+
+        // Access
+
+            inline label tgtCell() const
+            {
+                return tgtCelli_;
+            }
+
+            inline label& tgtCell()
+            {
+                return tgtCelli_;
+            }
+
+
+        // Needed by FaceCellWave
+
+            //- Check whether origin has been changed at all or
+            //  still contains original (invalid) value.
+            template<class TrackingData>
+            inline bool valid(TrackingData&) const;
+
+            //- Check for identical geometrical data. Used for cyclics checking.
+            template<class TrackingData>
+            inline bool sameGeometry
+            (
+                const polyMesh&,
+                const meshToMeshData&,
+                const scalar,
+                TrackingData&
+            ) const;
+
+            //- Convert any absolute coordinates into relative to (patch)face
+            //  centre
+            template<class TrackingData>
+            inline void leaveDomain
+            (
+                const polyMesh&,
+                const polyPatch&,
+                const label patchFacei,
+                const point& faceCentre,
+                TrackingData&
+            );
+
+            //- Reverse of leaveDomain
+            template<class TrackingData>
+            inline void enterDomain
+            (
+                const polyMesh&,
+                const polyPatch&,
+                const label patchFacei,
+                const point& faceCentre,
+                TrackingData&
+            );
+
+            //- Apply rotation matrix to any coordinates
+            template<class TrackingData>
+            inline void transform
+            (
+                const polyMesh&,
+                const tensor&,
+                TrackingData&
+            );
+
+            //- Influence of neighbouring face.
+            template<class TrackingData>
+            inline bool updateCell
+            (
+                const polyMesh&,
+                const label thisCelli,
+                const label neighbourFacei,
+                const meshToMeshData& neighbourInfo,
+                const scalar tol,
+                TrackingData&
+            );
+
+            //- Influence of neighbouring cell.
+            template<class TrackingData>
+            inline bool updateFace
+            (
+                const polyMesh&,
+                const label thisFacei,
+                const label neighbourCelli,
+                const meshToMeshData& neighbourInfo,
+                const scalar tol,
+                TrackingData&
+            );
+
+            //- Influence of different value on same face.
+            template<class TrackingData>
+            inline bool updateFace
+            (
+                const polyMesh&,
+                const label thisFacei,
+                const meshToMeshData& neighbourInfo,
+                const scalar tol,
+                TrackingData&
+            );
+
+            //- Same (like operator==)
+            template<class TrackingData>
+            inline bool equal
+            (
+                const meshToMeshData&,
+                TrackingData&
+            ) const;
+
+    // Member Operators
+
+        // Needed for List IO
+        inline bool operator==(const meshToMeshData&) const;
+
+        inline bool operator!=(const meshToMeshData&) const;
+
+
+    // IOstream Operators
+
+        friend Ostream& operator<<(Ostream&, const meshToMeshData&);
+        friend Istream& operator>>(Istream&, meshToMeshData&);
+};
+
+
+//- Data associated with meshToMeshData type are contiguous
+template<>
+inline bool contiguous<meshToMeshData>()
+{
+    return true;
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "meshToMeshDataI.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/overset/cellCellStencil/inverseDistance/meshToMeshDataI.H b/src/overset/cellCellStencil/inverseDistance/meshToMeshDataI.H
new file mode 100644
index 00000000000..5bc0923fdf6
--- /dev/null
+++ b/src/overset/cellCellStencil/inverseDistance/meshToMeshDataI.H
@@ -0,0 +1,242 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "polyMesh.H"
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+// Null constructor
+inline Foam::meshToMeshData::meshToMeshData()
+:
+    tgtCelli_(-2)
+{}
+
+
+// Construct from components
+inline Foam::meshToMeshData::meshToMeshData(const label tgtCelli)
+:
+    tgtCelli_(tgtCelli)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class TrackingData>
+inline bool Foam::meshToMeshData::valid(TrackingData& td) const
+{
+    return tgtCelli_ != -2;
+}
+
+
+// No geometric data so never any problem on cyclics
+template<class TrackingData>
+inline bool Foam::meshToMeshData::sameGeometry
+(
+    const polyMesh&,
+    const meshToMeshData&,
+    const scalar,
+    TrackingData& td
+) const
+{
+    return true;
+}
+
+
+template<class TrackingData>
+inline void Foam::meshToMeshData::leaveDomain
+(
+    const polyMesh&,
+    const polyPatch& patch,
+    const label patchFacei,
+    const point& faceCentre,
+    TrackingData& td
+)
+{}
+
+
+template<class TrackingData>
+inline void Foam::meshToMeshData::transform
+(
+    const polyMesh&,
+    const tensor& rotTensor,
+    TrackingData& td
+)
+{}
+
+
+// Update absolute geometric quantities.
+template<class TrackingData>
+inline void Foam::meshToMeshData::enterDomain
+(
+    const polyMesh&,
+    const polyPatch& patch,
+    const label patchFacei,
+    const point& faceCentre,
+    TrackingData& td
+)
+{}
+
+
+// Update cell with neighbouring face information
+template<class TrackingData>
+inline bool Foam::meshToMeshData::updateCell
+(
+    const polyMesh& mesh,
+    const label thisCelli,
+    const label neighbourFacei,
+    const meshToMeshData& neighbourInfo,
+    const scalar tol,
+    TrackingData& td
+)
+{
+    if (!valid(td))
+    {
+        const point& cc = mesh.cellCentres()[thisCelli];
+
+        // See if we are in the neighbour
+        label tgti = neighbourInfo.tgtCelli_;
+
+        // Try match of neighbour
+        if (td.tgtMesh_.pointInCell(cc, tgti, polyMesh::CELL_TETS))
+        {
+            tgtCelli_ = tgti;
+            return true;
+        }
+
+        // Try match of neighbour's neighbours
+        const labelList& tgtNbrs = td.tgtMesh_.cellCells(tgti);
+        forAll(tgtNbrs, i)
+        {
+            label tgti = tgtNbrs[i];
+
+            // Try match of neighbour
+            if (td.tgtMesh_.pointInCell(cc, tgti, polyMesh::CELL_TETS))
+            {
+                tgtCelli_ = tgti;
+                return true;
+            }
+        }
+
+        // Leave unmatched cell for visit from different face
+    }
+    return false;
+}
+
+
+// Update face with neighbouring cell information
+template<class TrackingData>
+inline bool Foam::meshToMeshData::updateFace
+(
+    const polyMesh& mesh,
+    const label thisFacei,
+    const label neighbourCelli,
+    const meshToMeshData& neighbourInfo,
+    const scalar tol,
+    TrackingData& td
+)
+{
+    if (!valid(td))
+    {
+        tgtCelli_ = neighbourInfo.tgtCelli_;
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+
+// Update face with coupled face information
+template<class TrackingData>
+inline bool Foam::meshToMeshData::updateFace
+(
+    const polyMesh& mesh,
+    const label thisFacei,
+    const meshToMeshData& neighbourInfo,
+    const scalar tol,
+    TrackingData& td
+)
+{
+    if (!valid(td))
+    {
+        tgtCelli_ = neighbourInfo.tgtCelli_;
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+
+template<class TrackingData>
+inline bool Foam::meshToMeshData::equal
+(
+    const meshToMeshData& rhs,
+    TrackingData& td
+) const
+{
+    if (!valid(td))
+    {
+        if (!rhs.valid(td))
+        {
+            return true;
+        }
+        else
+        {
+            return false;
+        }
+    }
+    else
+    {
+        return operator==(rhs);
+    }
+}
+
+
+// * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
+
+inline bool Foam::meshToMeshData::operator==
+(
+    const Foam::meshToMeshData& rhs
+)
+ const
+{
+    return tgtCelli_ == rhs.tgtCelli_;
+}
+
+
+inline bool Foam::meshToMeshData::operator!=
+(
+    const Foam::meshToMeshData& rhs
+)
+ const
+{
+    return !(*this == rhs);
+}
+
+
+// ************************************************************************* //
diff --git a/src/overset/cellCellStencil/inverseDistance/waveMethod.C b/src/overset/cellCellStencil/inverseDistance/waveMethod.C
new file mode 100644
index 00000000000..e8ca6715c92
--- /dev/null
+++ b/src/overset/cellCellStencil/inverseDistance/waveMethod.C
@@ -0,0 +1,215 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "waveMethod.H"
+#include "meshToMeshData.H"
+#include "FaceCellWave.H"
+#include "addToRunTimeSelectionTable.H"
+#include "treeDataCell.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTypeNameAndDebug(waveMethod, 0);
+    addToRunTimeSelectionTable(meshToMeshMethod, waveMethod, components);
+}
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+void Foam::waveMethod::calculate
+(
+    const polyMesh& src,
+    const polyMesh& tgt,
+    labelList& srcToTgtAddr
+)
+{
+    // If parallel running a local domain might have zero cells thus never
+    // constructing the face-diagonal decomposition which uses parallel
+    // transfers.
+    (void)tgt.tetBasePtIs();
+
+    // The actual matching is only w.r.t local cells so cannot be run in
+    // parallel.
+    const bool oldParRun = Pstream::parRun();
+    Pstream::parRun() = false;
+
+    label nSeeds = 0;
+
+    if (tgt.nCells() == 0)
+    {
+        srcToTgtAddr.setSize(src.nCells());
+        srcToTgtAddr = -1;
+    }
+    else
+    {
+        const treeBoundBox& tgtBb = tgt.cellTree().bb();
+
+        DynamicList<label> changedFaces(src.nFaces()/100 + 100);
+        DynamicList<meshToMeshData> changedFacesInfo(changedFaces.size());
+
+        List<meshToMeshData> cellData(src.nCells());
+        List<meshToMeshData> faceData(src.nFaces());
+
+        meshToMeshData::trackData td(tgt);
+
+        label startCelli = 0;
+
+        while (true)
+        {
+            changedFaces.clear();
+            changedFacesInfo.clear();
+
+            // Search for starting seed
+            for (; startCelli < src.nCells(); startCelli++)
+            {
+                if (!cellData[startCelli].valid(td))
+                {
+                    nSeeds++;
+                    const point& cc = src.cellCentres()[startCelli];
+
+                    if (!tgtBb.contains(cc))
+                    {
+                        // Point outside local bb of tgt mesh. No need to
+                        // search. Register as no correspondence
+                        cellData[startCelli] = meshToMeshData(-1);
+                    }
+                    else
+                    {
+                        label tgtCelli = tgt.findCell(cc, polyMesh::CELL_TETS);
+                        if (tgtCelli != -1)
+                        {
+                            // Insert any face of cell
+                            label facei = src.cells()[startCelli][0];
+                            changedFaces.append(facei);
+                            changedFacesInfo.append(meshToMeshData(tgtCelli));
+                            break;
+                        }
+                        else
+                        {
+                            // Register as no correspondence
+                            cellData[startCelli] = meshToMeshData(-1);
+                        }
+                    }
+                }
+            }
+
+            if (returnReduce(changedFaces.empty(), andOp<bool>()))
+            {
+                break;
+            }
+
+            FaceCellWave<meshToMeshData, meshToMeshData::trackData> calc
+            (
+                src,
+                changedFaces,
+                changedFacesInfo,
+                faceData,
+                cellData,
+                src.globalData().nTotalCells(),   // max iterations
+                td
+            );
+        }
+
+        // Copy into srcToTgt
+        srcToTgtAddr.setSize(src.nCells());
+
+        forAll(cellData, celli)
+        {
+            srcToTgtAddr[celli] = cellData[celli].tgtCelli_;
+        }
+    }
+
+    Pstream::parRun() = oldParRun;
+
+    if (debug)
+    {
+        Pout<< "nSeeds:" << returnReduce(nSeeds, sumOp<label>())
+            << " out of nCells:" << returnReduce(src.nCells(), sumOp<label>())
+            << endl;
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::waveMethod::waveMethod
+(
+    const polyMesh& src,
+    const polyMesh& tgt
+)
+:
+    meshToMeshMethod(src, tgt)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::waveMethod::~waveMethod()
+{}
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void Foam::waveMethod::calculate
+(
+    labelListList& srcToTgtAddr,
+    scalarListList& srcToTgtWght,
+    pointListList& srcToTgtVec,
+    labelListList& tgtToSrcAddr,
+    scalarListList& tgtToSrcWght,
+    pointListList& tgtToSrcVec
+)
+{
+    {
+        labelList srcToTgt(src_.nCells());
+        calculate(src_, tgt_, srcToTgt);
+        srcToTgtAddr.setSize(srcToTgt.size());
+        srcToTgtWght.setSize(srcToTgt.size());
+        forAll(srcToTgtAddr, celli)
+        {
+            srcToTgtAddr[celli].setSize(1);
+            srcToTgtAddr[celli][0] = srcToTgt[celli];
+            srcToTgtWght[celli].setSize(1);
+            srcToTgtWght[celli][0] = src_.cellVolumes()[celli];
+        }
+    }
+
+    {
+        labelList tgtToSrc(tgt_.nCells());
+        calculate(tgt_, src_, tgtToSrc);
+        tgtToSrcAddr.setSize(tgtToSrc.size());
+        tgtToSrcWght.setSize(tgtToSrc.size());
+        forAll(tgtToSrcAddr, celli)
+        {
+            tgtToSrcAddr[celli].setSize(1);
+            tgtToSrcAddr[celli][0] = tgtToSrc[celli];
+            tgtToSrcWght[celli].setSize(1);
+            tgtToSrcWght[celli][0] = tgt_.cellVolumes()[celli];
+        }
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/src/overset/cellCellStencil/inverseDistance/waveMethod.H b/src/overset/cellCellStencil/inverseDistance/waveMethod.H
new file mode 100644
index 00000000000..9ab9635bcfe
--- /dev/null
+++ b/src/overset/cellCellStencil/inverseDistance/waveMethod.H
@@ -0,0 +1,107 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::waveMethod
+
+Description
+    Direct (one-to-one cell correspondence) mesh-to-mesh interpolation class
+
+SourceFiles
+    waveMethod.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveMethod_H
+#define waveMethod_H
+
+#include "meshToMeshMethod.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                        Class waveMethod Declaration
+\*---------------------------------------------------------------------------*/
+
+class waveMethod
+:
+    public meshToMeshMethod
+{
+    // Private member functions
+
+        //- Disallow default bitwise copy construct
+        waveMethod(const waveMethod&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const waveMethod&);
+
+
+public:
+
+    //- Run-time type information
+    TypeName("wave");
+
+    //- Construct from source and target meshes
+    waveMethod(const polyMesh& src, const polyMesh& tgt);
+
+    //- Destructor
+    virtual ~waveMethod();
+
+
+    // Member Functions
+
+        // Evaluate
+
+            //- Calculate addressing
+            static void calculate
+            (
+                const polyMesh& src,
+                const polyMesh& tgt,
+                labelList& srcToTgtAddr
+            );
+
+            //- Calculate addressing and weights and optionally offset vectors
+            virtual void calculate
+            (
+                labelListList& srcToTgtAddr,
+                scalarListList& srcToTgtWght,
+                pointListList& srcToTgtVec,
+                labelListList& tgtToSrcAddr,
+                scalarListList& tgtToSrcWght,
+                pointListList& tgtToSrcVec
+            );
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/overset/cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.C b/src/overset/cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.C
new file mode 100644
index 00000000000..ed4e2e251ee
--- /dev/null
+++ b/src/overset/cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.C
@@ -0,0 +1,930 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify i
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "trackingInverseDistanceCellCellStencil.H"
+#include "addToRunTimeSelectionTable.H"
+#include "OBJstream.H"
+#include "Time.H"
+#include "fvMeshSubset.H"
+#include "globalIndex.H"
+#include "oversetFvPatch.H"
+#include "zeroGradientFvPatchFields.H"
+#include "syncTools.H"
+#include "treeBoundBoxList.H"
+#include "voxelMeshSearch.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace cellCellStencils
+{
+    defineTypeNameAndDebug(trackingInverseDistance, 0);
+    addToRunTimeSelectionTable(cellCellStencil, trackingInverseDistance, mesh);
+}
+}
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+void Foam::cellCellStencils::trackingInverseDistance::markBoundaries
+(
+    const fvMesh& mesh,
+
+    const boundBox& bb,
+    const labelVector& nDivs,
+    PackedList<2>& patchTypes,
+
+    const labelList& cellMap,
+    labelList& patchCellTypes
+)
+{
+    // Mark all voxels that overlap the bounding box of any patch
+
+    const fvBoundaryMesh& pbm = mesh.boundary();
+
+    patchTypes = patchCellType::OTHER;
+
+    // Mark wall boundaries
+    forAll(pbm, patchi)
+    {
+        const fvPatch& fvp = pbm[patchi];
+        const labelList& fc = fvp.faceCells();
+
+        if (!fvPatch::constraintType(fvp.type()))
+        {
+            //Info<< "Marking cells on proper patch " << fvp.name()
+            //    << " with type " << fvp.type() << endl;
+            const polyPatch& pp = fvp.patch();
+            forAll(pp, i)
+            {
+                // Mark in overall patch types
+                patchCellTypes[cellMap[fc[i]]] = patchCellType::PATCH;
+
+                // Mark in voxel mesh
+                boundBox faceBb(pp.points(), pp[i], false);
+                if (bb.overlaps(faceBb))
+                {
+                    voxelMeshSearch::fill
+                    (
+                        patchTypes,
+                        bb,
+                        nDivs,
+                        faceBb,
+                        patchCellType::PATCH
+                    );
+                }
+            }
+        }
+    }
+
+    // Override with overset boundaries
+    forAll(pbm, patchi)
+    {
+        const fvPatch& fvp = pbm[patchi];
+        const labelList& fc = fvp.faceCells();
+
+        if (isA<oversetFvPatch>(fvp))
+        {
+            //Info<< "Marking cells on overset patch " << fvp.name() << endl;
+            const polyPatch& pp = fvp.patch();
+            forAll(pp, i)
+            {
+                // Mark in overall patch types
+                patchCellTypes[cellMap[fc[i]]] = patchCellType::OVERSET;
+
+                // Mark in voxel mesh
+                boundBox faceBb(pp.points(), pp[i], false);
+                if (bb.overlaps(faceBb))
+                {
+                    voxelMeshSearch::fill
+                    (
+                        patchTypes,
+                        bb,
+                        nDivs,
+                        faceBb,
+                        patchCellType::OVERSET
+                    );
+                }
+            }
+        }
+    }
+}
+
+
+void Foam::cellCellStencils::trackingInverseDistance::markPatchesAsHoles
+(
+    PstreamBuffers& pBufs,
+    const List<treeBoundBoxList>& patchBb,
+    const List<labelVector>& patchDivisions,
+    const PtrList<PackedList<2>>& patchParts,
+
+    const label srcI,
+    const label tgtI,
+    labelList& allCellTypes
+) const
+{
+    const pointField& allPoints = mesh_.points();
+    const labelListList& allCellPoints = mesh_.cellPoints();
+
+    const treeBoundBoxList& srcPatchBbs = patchBb[srcI];
+    const treeBoundBoxList& tgtPatchBbs = patchBb[tgtI];
+    const labelList& tgtCellMap = meshParts_[tgtI].cellMap();
+
+    // 1. do processor-local src-tgt patch overlap
+    {
+        const treeBoundBox& srcPatchBb = srcPatchBbs[Pstream::myProcNo()];
+        const treeBoundBox& tgtPatchBb = tgtPatchBbs[Pstream::myProcNo()];
+
+        if (srcPatchBb.overlaps(tgtPatchBb))
+        {
+            const PackedList<2>& srcPatchTypes = patchParts[srcI];
+            const labelVector& srcDivs = patchDivisions[srcI];
+
+            forAll(tgtCellMap, tgtCelli)
+            {
+                label celli = tgtCellMap[tgtCelli];
+
+                if
+                (
+                    voxelMeshSearch::overlaps
+                    (
+                        srcPatchBb,
+                        srcDivs,
+                        boundBox(allPoints, allCellPoints[celli], false),
+                        srcPatchTypes,
+                        static_cast<unsigned int>(patchCellType::PATCH)
+                    )
+                )
+                {
+                    allCellTypes[celli] = HOLE;
+                }
+            }
+        }
+    }
+
+
+    // 2. Send over srcMesh bits that overlap tgt and do calculation
+    pBufs.clear();
+    for (label procI = 0; procI < Pstream::nProcs(); procI++)
+    {
+        if (procI != Pstream::myProcNo())
+        {
+            const treeBoundBox& srcPatchBb = srcPatchBbs[Pstream::myProcNo()];
+            const treeBoundBox& tgtPatchBb = tgtPatchBbs[procI];
+
+            if (srcPatchBb.overlaps(tgtPatchBb))
+            {
+                // Send over complete patch voxel map. Tbd: could
+                // subset
+                UOPstream os(procI, pBufs);
+                os << srcPatchBb << patchDivisions[srcI] << patchParts[srcI];
+            }
+        }
+    }
+    pBufs.finishedSends();
+    for (label procI = 0; procI < Pstream::nProcs(); procI++)
+    {
+        if (procI != Pstream::myProcNo())
+        {
+            const treeBoundBox& srcPatchBb = srcPatchBbs[procI];
+            const treeBoundBox& tgtPatchBb = tgtPatchBbs[Pstream::myProcNo()];
+
+            if (srcPatchBb.overlaps(tgtPatchBb))
+            {
+                UIPstream is(procI, pBufs);
+                {
+                    treeBoundBox receivedBb(is);
+                    if (srcPatchBb != receivedBb)
+                    {
+                        FatalErrorInFunction
+                            << "proc:" << procI
+                            << " srcPatchBb:" << srcPatchBb
+                            << " receivedBb:" << receivedBb
+                            << exit(FatalError);
+                    }
+                }
+                const labelVector srcDivs(is);
+                const PackedList<2> srcPatchTypes(is);
+
+                forAll(tgtCellMap, tgtCelli)
+                {
+                    label celli = tgtCellMap[tgtCelli];
+                    if
+                    (
+                        voxelMeshSearch::overlaps
+                        (
+                            srcPatchBb,
+                            srcDivs,
+                            boundBox(allPoints, allCellPoints[celli], false),
+                            srcPatchTypes,
+                            static_cast<unsigned int>(patchCellType::PATCH)
+                        )
+                    )
+                    {
+                        allCellTypes[celli] = HOLE;
+                    }
+                }
+            }
+        }
+    }
+}
+
+
+void Foam::cellCellStencils::trackingInverseDistance::markDonors
+(
+    PstreamBuffers& pBufs,
+    const List<treeBoundBoxList>& meshBb,
+    const PtrList<voxelMeshSearch>& meshSearches,
+
+    const label srcI,
+    const label tgtI,
+    labelListList& allStencil,
+    labelList& allDonor
+) const
+{
+    const treeBoundBoxList& srcBbs = meshBb[srcI];
+    const treeBoundBoxList& tgtBbs = meshBb[tgtI];
+
+    const fvMesh& srcMesh = meshParts_[srcI].subMesh();
+    const labelList& srcCellMap = meshParts_[srcI].cellMap();
+    const voxelMeshSearch& meshSearch = meshSearches[srcI];
+    const fvMesh& tgtMesh = meshParts_[tgtI].subMesh();
+    const pointField& tgtCc = tgtMesh.cellCentres();
+    const labelList& tgtCellMap = meshParts_[tgtI].cellMap();
+
+    // 1. do processor-local src/tgt overlap
+    {
+        forAll(tgtCellMap, tgtCelli)
+        {
+            label srcCelli = meshSearch.findCell(tgtCc[tgtCelli]);
+            if (srcCelli != -1)
+            {
+                label globalDonor = globalCells_.toGlobal(srcCellMap[srcCelli]);
+                label celli = tgtCellMap[tgtCelli];
+                allStencil[celli].setSize(1);
+                allStencil[celli][0] = globalDonor;
+                allDonor[celli] = srcI;
+            }
+        }
+    }
+
+
+    // 2. Send over tgtMesh bits that overlap src and do calculation on
+    //    srcMesh.
+
+
+    // (remote) processors where the tgt overlaps my src
+    DynamicList<label> tgtOverlapProcs(Pstream::nProcs());
+    // (remote) processors where the src overlaps my tgt
+    DynamicList<label> srcOverlapProcs(Pstream::nProcs());
+    for (label procI = 0; procI < Pstream::nProcs(); procI++)
+    {
+        if (procI != Pstream::myProcNo())
+        {
+            if (tgtBbs[procI].overlaps(srcBbs[Pstream::myProcNo()]))
+            {
+                tgtOverlapProcs.append(procI);
+            }
+            if (srcBbs[procI].overlaps(tgtBbs[Pstream::myProcNo()]))
+            {
+                srcOverlapProcs.append(procI);
+            }
+        }
+    }
+
+
+
+    // Indices of tgtcells to send over to each processor
+    List<DynamicList<label> > tgtSendCells(Pstream::nProcs());
+    forAll(srcOverlapProcs, i)
+    {
+        label procI = srcOverlapProcs[i];
+        tgtSendCells[procI].reserve(tgtMesh.nCells()/srcOverlapProcs.size());
+    }
+
+
+    forAll(tgtCellMap, tgtCelli)
+    {
+        label celli = tgtCellMap[tgtCelli];
+        if (allStencil[celli].empty())
+        {
+            const treeBoundBox subBb(cellBb(mesh_, celli));
+
+            forAll(srcOverlapProcs, i)
+            {
+                label procI = srcOverlapProcs[i];
+                if (subBb.overlaps(srcBbs[procI]))
+                {
+                    tgtSendCells[procI].append(tgtCelli);
+                }
+            }
+        }
+    }
+
+    // Send target cell centres to overlapping processors
+    pBufs.clear();
+
+    forAll(srcOverlapProcs, i)
+    {
+        label procI = srcOverlapProcs[i];
+        const labelList& cellIDs = tgtSendCells[procI];
+
+        UOPstream os(procI, pBufs);
+        os << UIndirectList<point>(tgtCc, cellIDs);
+    }
+    pBufs.finishedSends();
+
+    // Receive bits of target processors; find; send back
+    (void)srcMesh.tetBasePtIs();
+    forAll(tgtOverlapProcs, i)
+    {
+        label procI = tgtOverlapProcs[i];
+
+        UIPstream is(procI, pBufs);
+        pointList samples(is);
+
+        labelList donors(samples.size(), -1);
+        forAll(samples, sampleI)
+        {
+            label srcCelli = meshSearch.findCell(samples[sampleI]);
+            if (srcCelli != -1)
+            {
+                donors[sampleI] = globalCells_.toGlobal(srcCellMap[srcCelli]);
+            }
+        }
+
+        // Use same pStreamBuffers to send back.
+        UOPstream os(procI, pBufs);
+        os << donors;
+    }
+    pBufs.finishedSends();
+
+    forAll(srcOverlapProcs, i)
+    {
+        label procI = srcOverlapProcs[i];
+        const labelList& cellIDs = tgtSendCells[procI];
+
+        UIPstream is(procI, pBufs);
+        labelList donors(is);
+
+        if (donors.size() != cellIDs.size())
+        {
+            FatalErrorInFunction<< "problem : cellIDs:" << cellIDs.size()
+                << " donors:" << donors.size() << abort(FatalError);
+        }
+
+        forAll(donors, donorI)
+        {
+            label globalDonor = donors[donorI];
+
+            if (globalDonor != -1)
+            {
+                label celli = tgtCellMap[cellIDs[donorI]];
+
+                // TBD: check for multiple donors. Maybe better one?
+                if (allStencil[celli].empty())
+                {
+                    allStencil[celli].setSize(1);
+                    allStencil[celli][0] = globalDonor;
+                    allDonor[celli] = srcI;
+                }
+            }
+        }
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::cellCellStencils::trackingInverseDistance::trackingInverseDistance
+(
+    const fvMesh& mesh,
+    const dictionary& dict,
+    const bool doUpdate
+)
+:
+    inverseDistance(mesh, dict, false),
+    globalCells_(mesh_.nCells())
+{
+    if (doUpdate)
+    {
+        // Initialise donor cell
+        globalDonor_.setSize(mesh_.nCells());
+        globalDonor_ = -1;
+
+        // Initialise mesh partitions
+        const labelIOList& zoneID = this->zoneID();
+        label nZones = gMax(zoneID)+1;
+
+        labelList nCellsPerZone(nZones, 0);
+        forAll(zoneID, celli)
+        {
+            nCellsPerZone[zoneID[celli]]++;
+        }
+        Pstream::listCombineGather(nCellsPerZone, plusEqOp<label>());
+        Pstream::listCombineScatter(nCellsPerZone);
+
+        meshParts_.setSize(nZones);
+        forAll(meshParts_, zonei)
+        {
+            meshParts_.set(zonei, new fvMeshSubset(mesh_));
+            meshParts_[zonei].setLargeCellSubset(zoneID, zonei);
+            // Trigger early evaluation of mesh dimension (in case there are
+            // locally zero cells in mesh)
+            (void)meshParts_[zonei].subMesh().nGeometricD();
+        }
+
+
+        // Print a bit
+        {
+            Info<< typeName << " : detected " << nZones
+                << " mesh regions" << endl;
+            Info<< incrIndent;
+            forAll(nCellsPerZone, zonei)
+            {
+                Info<< indent<< "zone:" << zonei
+                    << " nCells:" << nCellsPerZone[zonei]
+                    << endl;
+            }
+            Info<< decrIndent;
+        }
+
+
+        // Do geometry update
+        update();
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::cellCellStencils::trackingInverseDistance::~trackingInverseDistance()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::cellCellStencils::trackingInverseDistance::update()
+{
+    DebugInfo<< FUNCTION_NAME << " : Start of analysis" << endl;
+
+    scalar layerRelax(dict_.lookupOrDefault("layerRelax", 1.0));
+    const labelIOList& zoneID = this->zoneID();
+    label nZones = meshParts_.size();
+
+    // Update stored mesh partitions for geometry changes
+    forAll(meshParts_, zonei)
+    {
+        pointField subPoints(mesh_.points(), meshParts_[zonei].pointMap());
+
+        fvMesh& subMesh = meshParts_[zonei].subMesh();
+        subMesh.movePoints(subPoints);
+    }
+
+    DebugInfo<< FUNCTION_NAME << " : Moved zone sub-meshes" << endl;
+
+
+    // Calculate fast search structure for each zone
+    PtrList<voxelMeshSearch> meshSearches(nZones);
+
+    List<labelVector> searchBoxDivisions;
+    if (dict_.readIfPresent("searchBoxDivisions", searchBoxDivisions))
+    {
+        forAll(meshParts_, zonei)
+        {
+            meshSearches.set
+            (
+                zonei,
+                new voxelMeshSearch
+                (
+                    meshParts_[zonei].subMesh(),
+                    searchBoxDivisions[zonei],
+                    true
+                )
+            );
+        }
+    }
+    else
+    {
+        forAll(meshParts_, zonei)
+        {
+            meshSearches.set
+            (
+                zonei,
+                new voxelMeshSearch(meshParts_[zonei].subMesh(), true)
+            );
+        }
+    }
+    DebugInfo<< FUNCTION_NAME << " : Constructed cell voxel meshes" << endl;
+
+
+    const boundBox& allBb(mesh_.bounds());
+
+    List<treeBoundBoxList> meshBb(nZones);
+
+    // Determine zone meshes and bounding boxes
+    {
+        // Per processor, per zone the bounding box
+        List<treeBoundBoxList> procBb(Pstream::nProcs());
+        procBb[Pstream::myProcNo()].setSize(nZones);
+
+        forAll(meshParts_, zonei)
+        {
+            const fvMesh& subMesh = meshParts_[zonei].subMesh();
+
+            if (subMesh.nPoints())
+            {
+                procBb[Pstream::myProcNo()][zonei] =
+                    treeBoundBox(subMesh.points());
+                procBb[Pstream::myProcNo()][zonei].inflate(1e-6);
+            }
+            else
+            {
+                // No part of zone on this processor. Make up bb.
+                procBb[Pstream::myProcNo()][zonei] = treeBoundBox
+                (
+                    allBb.min() - 2*allBb.span(),
+                    allBb.min() - allBb.span()
+                );
+                procBb[Pstream::myProcNo()][zonei].inflate(1e-6);
+            }
+        }
+
+        Pstream::gatherList(procBb);
+        Pstream::scatterList(procBb);
+
+        // Move local bounding boxes to per-mesh indexing
+        forAll(meshBb, zonei)
+        {
+            treeBoundBoxList& bbs = meshBb[zonei];
+            bbs.setSize(Pstream::nProcs());
+            forAll(procBb, proci)
+            {
+                bbs[proci] = procBb[proci][zonei];
+            }
+        }
+    }
+
+    DebugInfo<< FUNCTION_NAME << " : Calculated bounding boxes" << endl;
+
+
+    // Determine patch bounding boxes. These are either global and provided
+    // by the user or processor-local as a copy of the mesh bounding box.
+
+    List<treeBoundBoxList> patchBb(nZones);
+    List<labelVector> patchDivisions(searchBoxDivisions);
+    PtrList<PackedList<2>> patchParts(nZones);
+    labelList allPatchTypes(mesh_.nCells(), OTHER);
+
+    {
+        treeBoundBox globalPatchBb;
+        if (dict_.readIfPresent("searchBox", globalPatchBb))
+        {
+            // All processors, all zones have the same bounding box
+            patchBb = treeBoundBoxList(Pstream::nProcs(), globalPatchBb);
+        }
+        else
+        {
+            // Use the meshBb (differing per zone, per processor)
+            patchBb = meshBb;
+        }
+    }
+    if (patchDivisions.empty())
+    {
+        patchDivisions.setSize(nZones);
+        forAll(patchDivisions, zonei)
+        {
+            patchDivisions[zonei] = meshSearches[zonei].nDivs();
+        }
+    }
+
+    forAll(patchParts, zonei)
+    {
+        const labelVector& g = patchDivisions[zonei];
+        patchParts.set(zonei, new PackedList<2>(cmptProduct(g)));
+
+        markBoundaries
+        (
+            meshParts_[zonei].subMesh(),
+
+            patchBb[zonei][Pstream::myProcNo()],
+            patchDivisions[zonei],
+            patchParts[zonei],
+
+            meshParts_[zonei].cellMap(),
+            allPatchTypes
+        );
+    }
+    DebugInfo<< FUNCTION_NAME << " : Calculated boundary voxel meshes" << endl;
+
+
+    // Current best guess for cells
+    labelList allCellTypes(mesh_.nCells(), CALCULATED);
+    labelListList allStencil(mesh_.nCells());
+    // zoneID of donor
+    labelList allDonorID(mesh_.nCells(), -1);
+
+    const globalIndex globalCells(mesh_.nCells());
+
+    PstreamBuffers pBufs(Pstream::commsTypes::nonBlocking);
+
+    DebugInfo<< FUNCTION_NAME << " : Allocated donor-cell structures" << endl;
+
+    for (label srci = 0; srci < meshParts_.size()-1; srci++)
+    {
+        for (label tgti = srci+1; tgti < meshParts_.size(); tgti++)
+        {
+            markPatchesAsHoles
+            (
+                pBufs,
+
+                patchBb,
+                patchDivisions,
+                patchParts,
+
+                srci,
+                tgti,
+                allCellTypes
+            );
+            markPatchesAsHoles
+            (
+                pBufs,
+
+                patchBb,
+                patchDivisions,
+                patchParts,
+
+                tgti,
+                srci,
+                allCellTypes
+            );
+
+            markDonors
+            (
+                pBufs,
+                meshBb,
+                meshSearches,
+
+                tgti,
+                srci,
+                allStencil,
+                allDonorID
+            );
+            markDonors
+            (
+                pBufs,
+                meshBb,
+                meshSearches,
+
+                srci,
+                tgti,
+                allStencil,
+                allDonorID
+            );
+        }
+    }
+
+    DebugInfo<< FUNCTION_NAME << " : Determined holes and donor-acceptors"
+        << endl;
+
+
+    // Use the patch types and weights to decide what to do
+    forAll(allPatchTypes, celli)
+    {
+        if (allCellTypes[celli] != HOLE)
+        {
+            switch (allPatchTypes[celli])
+            {
+                case OVERSET:
+                {
+                    // Require interpolation. See if possible.
+
+                    if (allStencil[celli].size())
+                    {
+                        allCellTypes[celli] = INTERPOLATED;
+                    }
+                    else
+                    {
+                        allCellTypes[celli] = HOLE;
+                    }
+                }
+            }
+        }
+    }
+    DebugInfo<< FUNCTION_NAME << " : Removed bad donors" << endl;
+
+    // Mark unreachable bits
+    findHoles(globalCells_, mesh_, zoneID, allStencil, allCellTypes);
+    DebugInfo<< FUNCTION_NAME << " : Flood-filled holes" << endl;
+
+    // Add buffer interpolation layer(s) around holes
+    scalarField allWeight(mesh_.nCells(), 0.0);
+    walkFront(layerRelax, allStencil, allCellTypes, allWeight);
+    DebugInfo<< FUNCTION_NAME << " : Implemented layer relaxation" << endl;
+
+
+    // Convert cell-cell addressing to stencil in compact notation
+
+    cellTypes_.transfer(allCellTypes);
+    cellStencil_.setSize(mesh_.nCells());
+    cellInterpolationWeights_.setSize(mesh_.nCells());
+    DynamicList<label> interpolationCells;
+    forAll(cellTypes_, celli)
+    {
+        if (cellTypes_[celli] == INTERPOLATED)
+        {
+            cellStencil_[celli].transfer(allStencil[celli]);
+            cellInterpolationWeights_[celli].setSize(1);
+            cellInterpolationWeights_[celli][0] = 1.0;
+            interpolationCells.append(celli);
+        }
+        else
+        {
+            cellStencil_[celli].clear();
+            cellInterpolationWeights_[celli].clear();
+        }
+    }
+    interpolationCells_.transfer(interpolationCells);
+
+    List<Map<label> > compactMap;
+    mapDistribute map(globalCells, cellStencil_, compactMap);
+    cellInterpolationMap_.transfer(map);
+
+    cellInterpolationWeight_.transfer(allWeight);
+    cellInterpolationWeight_.correctBoundaryConditions();
+
+
+    if (debug & 2)
+    {
+        // Dump stencil
+        mkDir(mesh_.time().timePath());
+        OBJstream str(mesh_.time().timePath()/"injectionStencil.obj");
+        Pout<< typeName << " : dumping injectionStencil to "
+            << str.name() << endl;
+        pointField cc(mesh_.cellCentres());
+        cellInterpolationMap_.distribute(cc);
+
+        forAll(cellStencil_, celli)
+        {
+            const labelList& slots = cellStencil_[celli];
+            if (slots.size())
+            {
+                const point& accCc = mesh_.cellCentres()[celli];
+                forAll(slots, i)
+                {
+                    const point& donorCc = cc[slots[i]];
+                    str.write(linePointRef(accCc, 0.1*accCc+0.9*donorCc));
+                }
+            }
+        }
+    }
+
+    DebugInfo<< FUNCTION_NAME << " : Transferred donor to stencil" << endl;
+
+
+    // Extend stencil to get inverse distance weighted neighbours
+    createStencil(globalCells);
+    DebugInfo<< FUNCTION_NAME << " : Extended stencil" << endl;
+
+
+    if (debug & 2)
+    {
+        // Dump weight
+        cellInterpolationWeight_.instance() = mesh_.time().timeName();
+        cellInterpolationWeight_.write();
+
+        // Dump cell types
+        volScalarField volTypes
+        (
+            IOobject
+            (
+                "cellTypes",
+                mesh_.time().timeName(),
+                mesh_,
+                IOobject::NO_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            mesh_,
+            dimensionedScalar("zero", dimless, 0.0),
+            zeroGradientFvPatchScalarField::typeName
+        );
+
+        forAll(volTypes.internalField(), celli)
+        {
+            volTypes[celli] = cellTypes_[celli];
+        }
+        volTypes.correctBoundaryConditions();
+        volTypes.write();
+
+        // Dump stencil
+        mkDir(mesh_.time().timePath());
+        OBJstream str(mesh_.time().timePath()/"stencil.obj");
+        Pout<< typeName << " : dumping to " << str.name() << endl;
+        pointField cc(mesh_.cellCentres());
+        cellInterpolationMap_.distribute(cc);
+
+        forAll(cellStencil_, celli)
+        {
+            const labelList& slots = cellStencil_[celli];
+            if (slots.size())
+            {
+                const point& accCc = mesh_.cellCentres()[celli];
+                forAll(slots, i)
+                {
+                    const point& donorCc = cc[slots[i]];
+                    str.write(linePointRef(accCc, 0.1*accCc+0.9*donorCc));
+                }
+            }
+        }
+    }
+
+
+    // Print some stats
+    {
+        labelList nCells(count(3, cellTypes_));
+
+        label nLocal = 0;
+        label nMixed = 0;
+        label nRemote = 0;
+        forAll(interpolationCells_, i)
+        {
+            label celli = interpolationCells_[i];
+            const labelList& slots = cellStencil_[celli];
+
+            bool hasLocal = false;
+            bool hasRemote = false;
+
+            forAll(slots, sloti)
+            {
+                if (slots[sloti] >= mesh_.nCells())
+                {
+                    hasRemote = true;
+                }
+                else
+                {
+                    hasLocal = true;
+                }
+            }
+
+            if (hasRemote)
+            {
+                if (!hasLocal)
+                {
+                    nRemote++;
+                }
+                else
+                {
+                    nMixed++;
+                }
+            }
+            else if (hasLocal)
+            {
+                nLocal++;
+            }
+        }
+        reduce(nLocal, sumOp<label>());
+        reduce(nMixed, sumOp<label>());
+        reduce(nRemote, sumOp<label>());
+
+        Info<< "Overset analysis : nCells : "
+            << returnReduce(cellTypes_.size(), sumOp<label>()) << nl
+            << incrIndent
+            << indent << "calculated   : " << nCells[CALCULATED] << nl
+            << indent << "interpolated : " << nCells[INTERPOLATED]
+            << " (interpolated from local:" << nLocal
+            << "  mixed local/remote:" << nMixed
+            << "  remote:" << nRemote << ")" << nl
+            << indent << "hole         : " << nCells[HOLE] << nl
+            << decrIndent << endl;
+    }
+    DebugInfo<< FUNCTION_NAME << " : Finished analysis" << endl;
+
+    // Tbd: detect if anything changed. Most likely it did!
+    return true;
+}
+
+
+// ************************************************************************* //
diff --git a/src/overset/cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.H b/src/overset/cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.H
new file mode 100644
index 00000000000..f0cafa3521c
--- /dev/null
+++ b/src/overset/cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.H
@@ -0,0 +1,162 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::cellCellStencils::trackingInverseDistance
+
+Description
+    Inverse-distance-weighted interpolation stencil.
+
+SourceFiles
+    trackingInverseDistanceCellCellStencil.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef cellCellStencils_trackingInverseDistance_H
+#define cellCellStencils_trackingInverseDistance_H
+
+#include "inverseDistanceCellCellStencil.H"
+#include "globalIndex.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+class voxelMeshSearch;
+
+namespace cellCellStencils
+{
+
+/*---------------------------------------------------------------------------*\
+                   Class trackingInverseDistance Declaration
+\*---------------------------------------------------------------------------*/
+
+class trackingInverseDistance
+:
+    public inverseDistance
+{
+protected:
+
+    // Protected data
+
+        //- Global indexing for cells
+        globalIndex globalCells_;
+
+        //- Current (global) donor cell
+        labelList globalDonor_;
+
+        //- Subset according to zone
+        PtrList<fvMeshSubset> meshParts_;
+
+
+
+    // Protected Member Functions
+
+        //- Mark voxels of patchTypes with type of patch face
+        static void markBoundaries
+        (
+            const fvMesh& mesh,
+
+            const boundBox& bb,
+            const labelVector& nDivs,
+            PackedList<2>& patchTypes,
+
+            const labelList& cellMap,
+            labelList& patchCellTypes
+        );
+
+        //- Mark all cells overlapping (a voxel covered by) a src patch
+        //  with type HOLE
+        void markPatchesAsHoles
+        (
+            PstreamBuffers& pBufs,
+
+            // Voxel mesh for patches
+            const List<treeBoundBoxList>& patchBb,
+            const List<labelVector>& patchDivisions,
+            const PtrList<PackedList<2>>& patchParts,
+
+            const label srcI,
+            const label tgtI,
+            labelList& allCellTypes
+        ) const;
+
+        void markDonors
+        (
+            PstreamBuffers& pBufs,
+            const List<treeBoundBoxList>& meshBb,
+            const PtrList<voxelMeshSearch>& meshSearches,
+
+            const label srcI,
+            const label tgtI,
+            labelListList& allStencil,
+            labelList& allDonor
+        ) const;
+
+
+private:
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        trackingInverseDistance(const trackingInverseDistance&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const trackingInverseDistance&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("trackingInverseDistance");
+
+
+    // Constructors
+
+        //- Construct from fvMesh
+        trackingInverseDistance(const fvMesh&, const dictionary&, const bool);
+
+
+    //- Destructor
+    virtual ~trackingInverseDistance();
+
+
+    // Member Functions
+
+        //- Update stencils. Return false if nothing changed.
+        virtual bool update();
+
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace cellCellStencils
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.C b/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.C
new file mode 100644
index 00000000000..720b25d7610
--- /dev/null
+++ b/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.C
@@ -0,0 +1,432 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "voxelMeshSearch.H"
+#include "polyMesh.H"
+#include "processorPolyPatch.H"
+
+
+/* * * * * * * * * * * * * * * Static Member Data  * * * * * * * * * * * * * */
+
+namespace Foam
+{
+    defineTypeNameAndDebug(voxelMeshSearch, 0);
+}
+
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+Foam::labelVector Foam::voxelMeshSearch::index3
+(
+    const boundBox& bb,
+    const labelVector& g,
+    const point& pt
+)
+{
+    const vector s(cmptDivide(bb.span(), vector(g.x(), g.y(), g.z())));
+
+    labelVector v
+    (
+        floor((pt.x()-bb.min().x())/s.x()),
+        floor((pt.y()-bb.min().y())/s.y()),
+        floor((pt.z()-bb.min().z())/s.z())
+    );
+
+    return v;
+}
+
+
+Foam::label Foam::voxelMeshSearch::index
+(
+    const boundBox& bb,
+    const labelVector& g,
+    const point& pt,
+    const bool clip
+)
+{
+    const vector s(cmptDivide(bb.span(), vector(g.x(), g.y(), g.z())));
+
+    labelVector v
+    (
+        floor((pt.x()-bb.min().x())/s.x()),
+        floor((pt.y()-bb.min().y())/s.y()),
+        floor((pt.z()-bb.min().z())/s.z())
+    );
+
+    if (clip)
+    {
+        v[0] = max(0, min(g[0]-1, v[0]));
+        v[1] = max(0, min(g[1]-1, v[1]));
+        v[2] = max(0, min(g[2]-1, v[2]));
+    }
+    else if
+    (
+        v[0] < 0
+     || v[1] < 0
+     || v[2] < 0
+     || v[0] >= g[0]
+     || v[1] >= g[1]
+     || v[2] >= g[2]
+    )
+    {
+        return -1;
+    }
+
+    return v[0] + g[0]*v[1] + g[1]*g.y()*v[2];
+}
+
+
+Foam::point Foam::voxelMeshSearch::centre
+(
+    const boundBox& bb,
+    const labelVector& g,
+    const labelVector& voxel
+)
+{
+    const vector s(cmptDivide(bb.span(), vector(g.x(), g.y(), g.z())));
+
+    return bb.min()+0.5*s+point(voxel[0]*s[0], voxel[1]*s[1], voxel[2]*s[2]);
+}
+
+
+void Foam::voxelMeshSearch::writeGrid
+(
+    OBJstream& os,
+    const boundBox& bb,
+    const labelVector& g
+)
+{
+    const vector s(cmptDivide(bb.span(), vector(g.x(), g.y(), g.z())));
+
+    for (label i = 1; i < g[0]; i++)
+    {
+        for (label j = 0; j < g[1]; j++)
+        {
+            for (label k = 0; k < g[2]; k++)
+            {
+                point p1(bb.min()+point((i-1)*s[0], j*s[1], k*s[2]));
+                point p2(bb.min()+point(i*s[0], j*s[1], k*s[2]));
+                os.write(linePointRef(p1, p2));
+            }
+        }
+    }
+    for (label i = 0; i < g[0]; i++)
+    {
+        for (label j = 1; j < g[1]; j++)
+        {
+            for (label k = 0; k < g[2]; k++)
+            {
+                point p1(bb.min()+point(i*s[0], (j-1)*s[1], k*s[2]));
+                point p2(bb.min()+point(i*s[0], j*s[1], k*s[2]));
+                os.write(linePointRef(p1, p2));
+            }
+        }
+    }
+    for (label i = 0; i < g[0]; i++)
+    {
+        for (label j = 0; j < g[1]; j++)
+        {
+            for (label k = 1; k < g[2]; k++)
+            {
+                point p1(bb.min()+point(i*s[0], j*s[1], (k-1)*s[2]));
+                point p2(bb.min()+point(i*s[0], j*s[1], k*s[2]));
+                os.write(linePointRef(p1, p2));
+            }
+        }
+    }
+}
+
+
+Foam::label Foam::voxelMeshSearch::searchProcPatch
+(
+    const label faceID,
+    const point& searchPoint
+) const
+{
+    const pointField& cellCentres = mesh_.cellCentres();
+    const polyBoundaryMesh& bMeshes = mesh_.boundaryMesh();
+
+    label patchi = bMeshes.patchID()[faceID-mesh_.nInternalFaces()];
+    const polyPatch& bMeshPatch = bMeshes[patchi];
+
+    if (!isA<processorPolyPatch>(bMeshPatch))
+    {
+        return -1;
+    }
+    else
+    {
+        // Find nearest cell. Linear search since cheaper than constructing
+        // tree?
+        const labelUList& faceCells = bMeshPatch.faceCells();
+        scalar minProximity = GREAT;
+
+        label nearestCellI = -1;
+        forAll(faceCells, i)
+        {
+            const point& cc = cellCentres[faceCells[i]];
+            scalar proximity = magSqr(cc-searchPoint);
+            if (proximity < minProximity)
+            {
+                minProximity = proximity;
+                nearestCellI = faceCells[i];
+            }
+        }
+        return nearestCellI;
+    }
+}
+
+
+Foam::label Foam::voxelMeshSearch::findIntersectedFace
+(
+    const label cellI,
+    const point& p
+) const
+{
+    // Return -1 or the label of the face intersected when tracking from
+    // p to centre of cellI
+
+    const faceList& faces = mesh_.faces();
+    const pointField& faceCentres = mesh_.faceCentres();
+    const pointField& points = mesh_.points();
+
+    const point& cc = mesh_.cellCentres()[cellI];
+    const labelList& cFaces = mesh_.cells()[cellI];
+
+    const vector q(cc-p);
+
+    forAll(cFaces, cFacei)
+    {
+        label facei = cFaces[cFacei];
+
+        pointHit hitInfo = faces[facei].intersection
+        (
+            p,
+            q,
+            faceCentres[facei],
+            points,
+            intersection::HALF_RAY
+        );
+
+        if (hitInfo.hit() && (hitInfo.distance() < 1))
+        {
+            return facei;
+        }
+    }
+    return -1;
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::voxelMeshSearch::voxelMeshSearch
+(
+    const polyMesh& mesh,
+    const bool doUpdate
+)
+:
+    mesh_(mesh)
+{
+    // Determine number of voxels from number of cells in mesh
+    const labelVector& dim = mesh_.geometricD();
+
+    // Guarantee at least one voxel
+    label nCells = max(1, mesh_.nCells());
+
+    label nDivs = -1;
+    if (mesh_.nGeometricD() == 1)
+    {
+        nDivs = nCells;
+    }
+    else if (mesh_.nGeometricD() == 2)
+    {
+        nDivs = label(Foam::sqrt(scalar(nCells)));
+    }
+    else
+    {
+        nDivs = label(Foam::cbrt(scalar(nCells)));
+    }
+
+    nDivs_ = labelVector(nDivs, nDivs, nDivs);
+    forAll(dim, i)
+    {
+        if (dim[i] == -1)
+        {
+            nDivs_[i] = 1;
+        }
+    }
+
+    if (debug)
+    {
+        Pout<< "voxelMeshSearch : mesh:" << mesh_.name()
+            << " nDivs:" << nDivs_ << endl;
+    }
+
+    if (doUpdate)
+    {
+        update();
+    }
+}
+
+
+Foam::voxelMeshSearch::voxelMeshSearch
+(
+    const polyMesh& mesh,
+    const labelVector& nDivs,
+    const bool doUpdate
+)
+:
+    mesh_(mesh),
+    nDivs_(nDivs)
+{
+    if (doUpdate)
+    {
+        update();
+    }
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::voxelMeshSearch::update()
+{
+    // Redo the local bounding box
+    localBb_ = boundBox(mesh_.points(), false);
+
+    const point eps(1e-10, 1e-10, 1e-10);
+
+    localBb_.min() = localBb_.min()-eps;
+    localBb_.max() = localBb_.max()+eps;
+
+    // Initialise seed cell array
+
+    seedCell_.setSize(cmptProduct(nDivs_));
+    seedCell_ = -1;
+
+
+    // Find seed cells
+    const pointField& points = mesh_.points();
+    const labelListList& cellPoints = mesh_.cellPoints();
+
+    forAll(cellPoints, celli)
+    {
+        const labelList& cPoints = cellPoints[celli];
+
+        // Get cell bounding box
+        boundBox bb(points, cPoints, false);
+
+        fill(seedCell_, localBb_, nDivs_, bb, celli);
+    }
+
+
+    //// Small optimisation: make sure the cell centre at least always
+    //// returns the cell itself
+    //const pointField& cellCentres = mesh_.cellCentres();
+    //forAll(cellCentres, celli)
+    //{
+    //    label voxeli = index(cellCentres[celli]);
+    //    seedCell_[voxeli] = celli;
+    //}
+
+    return true;
+}
+
+
+Foam::label Foam::voxelMeshSearch::findCell(const point& p) const
+{
+    // First check if the point is contained in the bounding box, else exit
+    if (!localBb_.contains(p))
+    {
+        return -1;
+    }
+
+    // Locate the voxel index for this point. Do not clip.
+    label voxeli = index(localBb_, nDivs_, p, false);
+
+    // The point may still be inside the bb but outside the actual domain.
+    if (voxeli < 0)
+    {
+        return -1;
+    }
+    else
+    {
+        // Inverse map to compute the seed cell.
+        label celli = seedCell_[voxeli];
+
+        if (celli < 0)
+        {
+            return -1;
+        }
+        else
+        {
+            // Simplified, non-parallel tracking from cell centre of
+            // celli to wanted location p. Note that the cell thus
+            // found does not have to be the absolute 'correct' one as
+            // long as at least one of the processors finds a cell.
+
+            label nextCellOld = -1;
+
+            while (true)
+            {
+                // I am in celli now. How many faces do I have ?
+                label facei = findIntersectedFace(celli, p);
+
+                if (facei == -1)
+                {
+                    return celli;
+                }
+
+
+                label nextCell;
+                if (mesh_.isInternalFace(facei))
+                {
+                    label own = mesh_.faceOwner()[facei];
+                    label nei = mesh_.faceNeighbour()[facei];
+                    nextCell = (own == celli ? nei : own);
+                }
+                else
+                {
+                    nextCell = searchProcPatch(facei, p);
+
+                    if (nextCell == nextCellOld)
+                    {
+                        return -1; // point is really out
+                    }
+
+                    if (nextCell == -1 || nextCell == celli)
+                    {
+                        return nextCell;
+                    }
+                    nextCellOld = nextCell;
+                }
+
+                celli = nextCell;
+            }
+            return -1;
+        }
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.H b/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.H
new file mode 100644
index 00000000000..3f8bd044348
--- /dev/null
+++ b/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.H
@@ -0,0 +1,203 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::voxelMeshSearch
+
+Description
+    Fast, non-parallel searching in mesh without use of octree.
+
+SourceFiles
+    voxelMeshSearch.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef voxelMeshSearch_H
+#define voxelMeshSearch_H
+
+#include "boundBox.H"
+#include "labelVector.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// Forward declaration of friend functions and operators
+class polyMesh;
+class OBJstream;
+
+/*---------------------------------------------------------------------------*\
+                        Class voxelMeshSearch Declaration
+\*---------------------------------------------------------------------------*/
+
+class voxelMeshSearch
+{
+    // Private data
+
+        const polyMesh& mesh_;
+
+        //- Local mesh bounding box
+        boundBox localBb_;
+
+        //- Number of points in all directions (for local mesh only)
+        labelVector nDivs_;
+
+        //- Voxel to seed cell
+        labelList seedCell_;
+
+
+   // Private Member Functions
+
+        //- Find nearest cell (on same processor patch as seed face)
+        label searchProcPatch(const label seedFacei, const point&) const;
+
+        //- Find the face on the cell that gets intersected
+        label findIntersectedFace(const label celli, const point&) const;
+
+
+public:
+
+    // Declare name of the class and its debug switch
+    ClassName("voxelMeshSearch");
+
+
+    // Constructors
+
+        //- Construct from mesh; voxels estimated from local number of cells
+        voxelMeshSearch(const polyMesh&, const bool doUpdate = true);
+
+        //- Construct from mesh and voxel discretisation
+        voxelMeshSearch
+        (
+            const polyMesh&,
+            const labelVector&,
+            const bool doUpdate = true
+        );
+
+
+    // Member functions
+
+        //- Number of voxels for local mesh
+        const labelVector& nDivs() const
+        {
+            return nDivs_;
+        }
+
+        //- Update lookup tables for geometry changes
+        bool update();
+
+        //- Find a cell
+        label findCell(const point&) const;
+
+        //- Find cells. Returns number of cells found
+        //label findCells(const UList<point>&, labelList&) const;
+
+
+        //Voxel helper functions
+
+            //- Coordinate to voxel indices
+            static labelVector index3
+            (
+                const boundBox& bb,
+                const labelVector& nDivs,
+                const point& p
+            );
+
+            //- Coordinate to combined voxel index. If clip makes sure
+            //  components are all inside. If not clip returns -1 if outside bb.
+            static label index
+            (
+                const boundBox& bb,
+                const labelVector& nDivs,
+                const point& p,
+                const bool clip
+            );
+
+            //- Voxel index to voxel centre
+            static point centre
+            (
+                const boundBox& bb,
+                const labelVector& nDivs,
+                const labelVector& voxel
+            );
+
+            //- Fill voxels indicated by bounding box
+            template<class Container, class Type>
+            static void fill
+            (
+                Container& elems,
+                const boundBox& bb,
+                const labelVector& nDivs,
+                const boundBox& subBb,
+                const Type val
+            );
+
+            //- Check if any voxel inside bounding box is set to val or
+            //  not set to val (isNot = true)
+            template<class Container, class Type>
+            static bool overlaps
+            (
+                const boundBox& bb,
+                const labelVector& nDivs,
+                const boundBox& subBb,
+                const Container& elems,
+                const Type val,
+                const bool isNot = false
+            );
+
+            //- Debug: write points for every set element
+            template<class Container, class Type>
+            static void write
+            (
+                OBJstream&,
+                const boundBox& bb,
+                const labelVector& nDivs,
+                const Container& elems,
+                const Type val,
+                const bool isNot = false
+            );
+
+            //- Debug: write all edges
+            static void writeGrid
+            (
+                OBJstream&,
+                const boundBox&,
+                const labelVector&
+            );
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+    #include "voxelMeshSearchTemplates.C"
+#endif
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearchTemplates.C b/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearchTemplates.C
new file mode 100644
index 00000000000..e748d23281d
--- /dev/null
+++ b/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearchTemplates.C
@@ -0,0 +1,156 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "voxelMeshSearch.H"
+#include "OBJstream.H"
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+template<class Container, class Type>
+void Foam::voxelMeshSearch::fill
+(
+    Container& elems,
+    const boundBox& bb,
+    const labelVector& nDivs,
+    const boundBox& subBb,
+    const Type val
+)
+{
+    labelVector minIds(index3(bb, nDivs, subBb.min()));
+    labelVector maxIds(index3(bb, nDivs, subBb.max()));
+
+    for (direction cmpt = 0; cmpt < 3; cmpt++)
+    {
+        if (maxIds[cmpt] < 0 || minIds[cmpt] >= nDivs[cmpt])
+        {
+            return;
+        }
+        // Clip
+        maxIds[cmpt] = min(maxIds[cmpt], nDivs[cmpt]-1);
+        minIds[cmpt] = max(minIds[cmpt], 0);
+    }
+
+    for (label i = minIds[0]; i <= maxIds[0]; i++)
+    {
+        for (label j = minIds[1]; j <= maxIds[1]; j++)
+        {
+            for (label k = minIds[2]; k <= maxIds[2]; k++)
+            {
+                elems[i+j*nDivs.x()+k*nDivs.x()*nDivs.y()] = val;
+            }
+        }
+    }
+}
+
+
+template<class Container, class Type>
+bool Foam::voxelMeshSearch::overlaps
+(
+    const boundBox& bb,
+    const labelVector& nDivs,
+    const boundBox& subBb,
+    const Container& elems,
+    const Type val,
+    const bool isNot
+)
+{
+    // Checks if subBb overlaps any voxel set to val
+
+    labelVector minIds(index3(bb, nDivs, subBb.min()));
+    labelVector maxIds(index3(bb, nDivs, subBb.max()));
+
+    for (direction cmpt = 0; cmpt < 3; cmpt++)
+    {
+        if (maxIds[cmpt] < 0 || minIds[cmpt] >= nDivs[cmpt])
+        {
+            return false;
+        }
+        // Clip
+        maxIds[cmpt] = min(maxIds[cmpt], nDivs[cmpt]-1);
+        minIds[cmpt] = max(minIds[cmpt], 0);
+    }
+
+    if (elems.size() != cmptProduct(nDivs))
+    {
+        FatalErrorInFunction
+            << "sizes:" << elems.size() << " and " << nDivs
+            << exit(FatalError);
+    }
+
+
+    for (label i = minIds[0]; i <= maxIds[0]; i++)
+    {
+        for (label j = minIds[1]; j <= maxIds[1]; j++)
+        {
+            for (label k = minIds[2]; k <= maxIds[2]; k++)
+            {
+                const Type elemVal = elems[i+j*nDivs.x()+k*nDivs.x()*nDivs.y()];
+                if (isNot != (elemVal == val))
+                {
+                    return true;
+                }
+            }
+        }
+    }
+    return false;
+}
+
+
+template<class Container, class Type>
+void Foam::voxelMeshSearch::write
+(
+    OBJstream& os,
+    const boundBox& bb,
+    const labelVector& nDivs,
+    const Container& elems,
+    const Type val,
+    const bool isNot
+)
+{
+    if (elems.size() != cmptProduct(nDivs))
+    {
+        FatalErrorInFunction
+            << "sizes:" << elems.size() << " and " << nDivs
+            << exit(FatalError);
+    }
+
+    for (label i = 0; i < nDivs[0]; i++)
+    {
+        for (label j = 0; j < nDivs[1]; j++)
+        {
+            for (label k = 0; k < nDivs[2]; k++)
+            {
+                const Type elemVal = elems[i+j*nDivs.x()+k*nDivs.x()*nDivs.y()];
+                if (isNot != (elemVal == val))
+                {
+                    os.write(centre(bb, nDivs, labelVector(i, j, k)));
+                }
+            }
+        }
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/overset/dynamicOversetFvMesh/dynamicOversetFvMesh.C b/src/overset/dynamicOversetFvMesh/dynamicOversetFvMesh.C
new file mode 100644
index 00000000000..7e5e3584a8c
--- /dev/null
+++ b/src/overset/dynamicOversetFvMesh/dynamicOversetFvMesh.C
@@ -0,0 +1,354 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2014-2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify i
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "dynamicOversetFvMesh.H"
+#include "addToRunTimeSelectionTable.H"
+#include "cellCellStencilObject.H"
+#include "zeroGradientFvPatchFields.H"
+#include "lduPrimitiveProcessorInterface.H"
+#include "globalIndex.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTypeNameAndDebug(dynamicOversetFvMesh, 0);
+    addToRunTimeSelectionTable(dynamicFvMesh, dynamicOversetFvMesh, IOobject);
+}
+
+
+// * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::dynamicOversetFvMesh::updateAddressing() const
+{
+    const cellCellStencilObject& overlap = Stencil::New(*this);
+
+    // The (processor-local part of the) stencil determines the local
+    // faces to add to the matrix. tbd: parallel
+    const labelListList& stencil = overlap.cellStencil();
+
+    // Get the base addressing
+    const lduAddressing& baseAddr = dynamicMotionSolverFvMesh::lduAddr();
+
+    // Add to the base addressing
+    labelList lowerAddr;
+    labelList upperAddr;
+    label nExtraFaces;
+
+    const globalIndex globalNumbering(baseAddr.size());
+    labelListList localFaceCells;
+    labelListList remoteFaceCells;
+
+    labelList globalCellIDs(overlap.cellInterpolationMap().constructSize());
+    forAll(baseAddr, cellI)
+    {
+        globalCellIDs[cellI] = globalNumbering.toGlobal(cellI);
+    }
+    overlap.cellInterpolationMap().distribute(globalCellIDs);
+
+
+    reverseFaceMap_ = fvMeshPrimitiveLduAddressing::addAddressing
+    (
+        baseAddr,
+        stencil,
+        nExtraFaces,
+        lowerAddr,
+        upperAddr,
+        stencilFaces_,
+        globalNumbering,
+        globalCellIDs,
+        localFaceCells,
+        remoteFaceCells
+    );
+
+    if (debug)
+    {
+        Pout<< "dynamicOversetFvMesh::update() : extended addresssing from"
+            << " nFaces:" << baseAddr.lowerAddr().size()
+            << " to nFaces:" << lowerAddr.size()
+            << " nExtraFaces:" << nExtraFaces << endl;
+    }
+
+    // Send across wanted cells
+    labelListList sendCells;
+    Pstream::exchange<labelList, label>(remoteFaceCells, sendCells);
+
+    // Extract relevant remote processors
+    labelList nbrProcs(localFaceCells.size());
+    {
+        label nbrI = 0;
+        forAll(localFaceCells, procI)
+        {
+            if (localFaceCells[procI].size())
+            {
+                //Pout<< "   from proc:" << procI
+                //    << " want its local cells " << remoteFaceCells[procI]
+                //    << " to add to my local cells:" << localFaceCells[procI]
+                //    << endl;
+                nbrProcs[nbrI++] = procI;
+            }
+        }
+        nbrProcs.setSize(nbrI);
+    }
+
+    // Construct interfaces
+    remoteStencilInterfaces_.setSize(nbrProcs.size());
+    forAll(nbrProcs, i)
+    {
+        label procI = nbrProcs[i];
+        remoteStencilInterfaces_.set
+        (
+            i,
+            new lduPrimitiveProcessorInterface
+            (
+                localFaceCells[procI],
+                Pstream::myProcNo(),
+                procI,
+                tensorField(0),
+                Pstream::msgType()
+            )
+        );
+    }
+
+
+    // Get addressing and interfaces of all interfaces
+
+
+    List<const labelUList*> patchAddr;
+    {
+        const fvBoundaryMesh& fvp = boundary();
+
+        patchAddr.setSize(fvp.size() + remoteStencilInterfaces_.size());
+
+        allInterfaces_ = dynamicMotionSolverFvMesh::interfaces();
+        allInterfaces_.setSize(patchAddr.size());
+
+        forAll(fvp, patchI)
+        {
+            patchAddr[patchI] = &fvp[patchI].faceCells();
+        }
+        forAll(remoteStencilInterfaces_, i)
+        {
+            label patchI = fvp.size()+i;
+            const lduPrimitiveProcessorInterface& pp =
+                remoteStencilInterfaces_[i];
+
+            //Pout<< "at patch:" << patchI
+            //    << " have procPatch:" << pp.type()
+            //    << " from:" << pp.myProcNo()
+            //    << " to:" << pp.neighbProcNo()
+            //    << " with fc:" << pp.faceCells().size() << endl;
+
+            patchAddr[patchI] = &pp.faceCells();
+            allInterfaces_.set(patchI, &pp);
+        }
+    }
+    const lduSchedule ps
+    (
+        lduPrimitiveMesh::nonBlockingSchedule<processorLduInterface>
+        (
+            allInterfaces_
+        )
+    );
+
+    lduPtr_.reset
+    (
+        new fvMeshPrimitiveLduAddressing
+        (
+            nCells(),
+            lowerAddr.xfer(),
+            upperAddr.xfer(),
+            patchAddr,
+            ps
+        )
+   );
+
+
+    // Check
+    if (debug)
+    {
+        const lduAddressing& addr = lduPtr_();  //this->lduAddr();
+
+        Pout<< "Adapted addressing:"
+            << " lower:" << addr.lowerAddr().size()
+            << " upper:" << addr.upperAddr().size() << endl;
+
+        lduInterfacePtrsList iFaces = this->interfaces();
+        // Using lduAddressing::patch
+        forAll(patchAddr, patchI)
+        {
+            Pout<< "    " << patchI << "\tpatchAddr:"
+                << addr.patchAddr(patchI).size()
+                << endl;
+        }
+
+        // Using interfaces
+        Pout<< "iFaces:" << iFaces.size() << endl;
+        forAll(iFaces, patchI)
+        {
+            if (iFaces.set(patchI))
+            {
+                Pout<< "    " << patchI << "\tiFace:" << iFaces[patchI].type()
+                        << endl;
+            }
+        }
+
+        Pout<< "end of printing." << endl;
+    }
+
+    return true;
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::dynamicOversetFvMesh::dynamicOversetFvMesh(const IOobject& io)
+:
+    dynamicMotionSolverFvMesh(io),
+    active_(false)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::dynamicOversetFvMesh::~dynamicOversetFvMesh()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+const Foam::lduAddressing& Foam::dynamicOversetFvMesh::lduAddr() const
+{
+    if (!active_)
+    {
+        return dynamicMotionSolverFvMesh::lduAddr();
+    }
+    if (lduPtr_.empty())
+    {
+        // Build extended addressing
+        updateAddressing();
+    }
+    return lduPtr_();
+}
+
+
+const Foam::fvMeshPrimitiveLduAddressing&
+Foam::dynamicOversetFvMesh::primitiveLduAddr() const
+{
+    if (lduPtr_.empty())
+    {
+        FatalErrorInFunction
+            << "Extended addressing not allocated" << abort(FatalError);
+    }
+
+    return lduPtr_();
+}
+
+
+bool Foam::dynamicOversetFvMesh::update()
+{
+    if (dynamicMotionSolverFvMesh::update())
+    {
+        // Calculate the local extra faces for the interpolation. Note: could
+        // let demand-driven lduAddr() trigger it but just to make sure.
+        updateAddressing();
+
+        return true;
+    }
+
+    return false;
+}
+
+
+bool Foam::dynamicOversetFvMesh::writeObject
+(
+    IOstream::streamFormat fmt,
+    IOstream::versionNumber ver,
+    IOstream::compressionType cmp
+) const
+{
+    bool ok = dynamicMotionSolverFvMesh::writeObject(fmt, ver, cmp);
+
+    // For postprocessing : write cellTypes and zoneID
+    {
+        const cellCellStencilObject& overlap = Stencil::New(*this);
+
+        const labelUList& cellTypes = overlap.cellTypes();
+
+        volScalarField volTypes
+        (
+            IOobject
+            (
+                "cellTypes",
+                this->time().timeName(),
+                *this,
+                IOobject::NO_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            *this,
+            dimensionedScalar("zero", dimless, 0.0),
+            zeroGradientFvPatchScalarField::typeName
+        );
+
+        forAll(volTypes.internalField(), cellI)
+        {
+            volTypes[cellI] = cellTypes[cellI];
+        }
+        volTypes.correctBoundaryConditions();
+        volTypes.writeObject(fmt, ver, cmp);
+    }
+    {
+        volScalarField volZoneID
+        (
+            IOobject
+            (
+                "zoneID",
+                this->time().timeName(),
+                *this,
+                IOobject::NO_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            *this,
+            dimensionedScalar("zero", dimless, 0.0),
+            zeroGradientFvPatchScalarField::typeName
+        );
+
+        const cellCellStencilObject& overlap = Stencil::New(*this);
+        const labelIOList& zoneID = overlap.zoneID();
+
+        forAll(zoneID, cellI)
+        {
+            volZoneID[cellI] = zoneID[cellI];
+        }
+        volZoneID.correctBoundaryConditions();
+        volZoneID.writeObject(fmt, ver, cmp);
+    }
+    return ok;
+}
+
+
+// ************************************************************************* //
diff --git a/src/overset/dynamicOversetFvMesh/dynamicOversetFvMesh.H b/src/overset/dynamicOversetFvMesh/dynamicOversetFvMesh.H
new file mode 100644
index 00000000000..2be46218a3e
--- /dev/null
+++ b/src/overset/dynamicOversetFvMesh/dynamicOversetFvMesh.H
@@ -0,0 +1,314 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2015-2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::dynamicOversetFvMesh
+
+Description
+    dynamicFvMesh with support for overset meshes.
+
+SourceFiles
+    dynamicOversetFvMesh.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef dynamicOversetFvMesh_H
+#define dynamicOversetFvMesh_H
+
+#include "dynamicMotionSolverFvMesh.H"
+#include "labelIOList.H"
+#include "fvMeshPrimitiveLduAddressing.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+class mapDistribute;
+class lduPrimitiveProcessorInterface;
+
+/*---------------------------------------------------------------------------*\
+                   Class dynamicOversetFvMesh Declaration
+\*---------------------------------------------------------------------------*/
+
+class dynamicOversetFvMesh
+:
+    public dynamicMotionSolverFvMesh
+{
+protected:
+
+    // Protected data
+
+        //- Select base addressing (false) or locally stored extended
+        //  lduAddressing (true)
+        mutable bool active_;
+
+        //- Extended addressing (extended with local interpolation stencils)
+        mutable autoPtr<fvMeshPrimitiveLduAddressing> lduPtr_;
+
+        //- Added (processor)lduInterfaces for remote bits of stencil.
+        //PtrList<const lduInterface> remoteStencilInterfaces_;
+        mutable PtrList<const lduPrimitiveProcessorInterface>
+            remoteStencilInterfaces_;
+
+        //- Interfaces for above mesh. Contains both original and
+        //  above added processorLduInterfaces
+        mutable lduInterfacePtrsList allInterfaces_;
+
+        //- Corresponding faces (in above lduPtr) to the stencil
+        mutable labelListList stencilFaces_;
+
+        //- From old to new face labels
+        mutable labelList reverseFaceMap_;
+
+
+   // Protected Member Functions
+
+        //- Calculate the extended lduAddressing
+        virtual bool updateAddressing() const;
+
+        //- Debug: print matrix
+        template<class Type>
+        void write(Ostream&, const fvMatrix<Type>&, const lduAddressing&) const;
+
+        //- Explicit interpolation of acceptor cells from donor cells
+        template<class T>
+        void interpolate(Field<T>& psi) const;
+
+        //- Explicit interpolation of acceptor cells from donor cells with
+        //  boundary condition handling
+        template<class GeoField>
+        void interpolate(GeoField& psi) const;
+
+        //- Add interpolation to matrix (coefficients)
+        template<class Type>
+        void addInterpolation(fvMatrix<Type>&) const;
+
+        //- Solve given dictionary with settings
+        template<class Type>
+        SolverPerformance<Type> solve(fvMatrix<Type>&, const dictionary&) const;
+
+        //- Debug: correct coupled bc
+        template<class GeoField>
+        static void correctCoupledBoundaryConditions(GeoField& fld);
+
+        //- Use extended addressing
+        void active(const bool f) const
+        {
+            active_ = f;
+
+            if (active_)
+            {
+                DebugInfo<< "Switching to extended addressing with nFaces:"
+                    << primitiveLduAddr().lowerAddr().size()
+                    << endl;
+            }
+            else
+            {
+                DebugInfo<< "Switching to base addressing with nFaces:"
+                    << fvMesh::lduAddr().lowerAddr().size()
+                    << endl;
+            }
+        }
+
+
+private:
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        dynamicOversetFvMesh(const dynamicOversetFvMesh&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const dynamicOversetFvMesh&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("dynamicOversetFvMesh");
+
+
+    // Constructors
+
+        //- Construct from IOobject
+        dynamicOversetFvMesh(const IOobject& io);
+
+
+    //- Destructor
+    virtual ~dynamicOversetFvMesh();
+
+
+    // Member Functions
+
+
+        // Extended addressing
+
+            //- Use extended addressing
+            bool active() const
+            {
+                return active_;
+            }
+
+            //- Return extended ldu addressing
+            const fvMeshPrimitiveLduAddressing& primitiveLduAddr() const;
+
+            //- Return ldu addressing. If active: is (extended)
+            //  primitiveLduAddr
+            virtual const lduAddressing& lduAddr() const;
+
+
+        // Overset
+
+            // Explicit interpolation
+
+                virtual void interpolate(scalarField& psi) const
+                {
+                    interpolate<scalar>(psi);
+                }
+
+                virtual void interpolate(vectorField& psi) const
+                {
+                    interpolate<vector>(psi);
+                }
+
+                virtual void interpolate(sphericalTensorField& psi) const
+                {
+                    interpolate<sphericalTensor>(psi);
+                }
+
+                virtual void interpolate(symmTensorField& psi) const
+                {
+                    interpolate<symmTensor>(psi);
+                }
+
+                virtual void interpolate(tensorField& psi) const
+                {
+                    interpolate<tensor>(psi);
+                }
+
+                virtual void interpolate(volScalarField& psi) const
+                {
+                    interpolate<volScalarField>(psi);
+                }
+
+                virtual void interpolate(volVectorField& psi) const
+                {
+                    interpolate<volVectorField>(psi);
+                }
+
+                virtual void interpolate(volSphericalTensorField& psi) const
+                {
+                    interpolate<volSphericalTensorField>(psi);
+                }
+
+                virtual void interpolate(volSymmTensorField& psi) const
+                {
+                    interpolate<volSymmTensorField>(psi);
+                }
+
+                virtual void interpolate(volTensorField& psi) const
+                {
+                    interpolate<volTensorField>(psi);
+                }
+
+
+            // Implicit interpolation (matrix manipulation)
+
+                //- Solve returning the solution statistics given convergence
+                //  tolerance. Use the given solver controls
+                virtual SolverPerformance<scalar> solve
+                (
+                    fvMatrix<scalar>& m,
+                    const dictionary& dict
+                ) const
+                {
+                    return solve<scalar>(m, dict);
+                }
+
+                //- Solve returning the solution statistics given convergence
+                //  tolerance. Use the given solver controls
+                virtual SolverPerformance<vector> solve
+                (
+                    fvMatrix<vector>& m,
+                    const dictionary& dict
+                ) const
+                {
+                    return solve<vector>(m, dict);
+                }
+
+                //- Solve returning the solution statistics given convergence
+                //  tolerance. Use the given solver controls
+                virtual SolverPerformance<symmTensor> solve
+                (
+                    fvMatrix<symmTensor>& m,
+                    const dictionary& dict
+                ) const
+                {
+                    return solve<symmTensor>(m, dict);
+                }
+
+                //- Solve returning the solution statistics given convergence
+                //  tolerance. Use the given solver controls
+                virtual SolverPerformance<tensor> solve
+                (
+                    fvMatrix<tensor>& m,
+                    const dictionary& dict
+                ) const
+                {
+                    return solve<tensor>(m, dict);
+                }
+
+
+        //- Update the mesh for both mesh motion and topology change
+        virtual bool update();
+
+        //- Write using given format, version and compression
+        virtual bool writeObject
+        (
+            IOstream::streamFormat,
+            IOstream::versionNumber,
+            IOstream::compressionType
+        ) const;
+
+        //- Debug: check halo swap is ok
+        template<class GeoField>
+        static void checkCoupledBC(const GeoField& fld);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#   include "dynamicOversetFvMeshTemplates.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/overset/dynamicOversetFvMesh/dynamicOversetFvMeshTemplates.C b/src/overset/dynamicOversetFvMesh/dynamicOversetFvMeshTemplates.C
new file mode 100644
index 00000000000..dce8e9cd7a8
--- /dev/null
+++ b/src/overset/dynamicOversetFvMesh/dynamicOversetFvMeshTemplates.C
@@ -0,0 +1,506 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2014-2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "volFields.H"
+#include "fvMatrix.H"
+#include "cellCellStencilObject.H"
+
+// * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * * * //
+
+template<class T>
+void Foam::dynamicOversetFvMesh::interpolate(Field<T>& psi) const
+{
+    const cellCellStencil& overlap = Stencil::New(*this);
+    const labelListList& stencil = overlap.cellStencil();
+
+    if (stencil.size() != nCells())
+    {
+        return;
+    }
+
+    const mapDistribute& map = overlap.cellInterpolationMap();
+    const List<scalarList>& wghts = overlap.cellInterpolationWeights();
+    const labelList& cellIDs = overlap.interpolationCells();
+    const scalarList& factor = overlap.cellInterpolationWeight();
+
+    Field<T> work(psi);
+    map.mapDistributeBase::distribute(work, UPstream::msgType()+1);
+
+    forAll(cellIDs, i)
+    {
+        label celli = cellIDs[i];
+
+        const scalarList& w = wghts[celli];
+        const labelList& nbrs = stencil[celli];
+        const scalar f = factor[celli];
+
+        T s(pTraits<T>::zero);
+        forAll(nbrs, nbrI)
+        {
+            s += w[nbrI]*work[nbrs[nbrI]];
+        }
+        //Pout<< "Interpolated value:" << s << endl;
+        //T oldPsi = psi[celli];
+        psi[celli] = (1.0-f)*psi[celli] + f*s;
+        //Pout<< "psi was:" << oldPsi << " now:" << psi[celli] << endl;
+    }
+}
+
+
+template<class GeoField>
+void Foam::dynamicOversetFvMesh::interpolate(GeoField& psi) const
+{
+    interpolate(psi.primitiveFieldRef());
+    psi.correctBoundaryConditions();
+}
+
+
+//template<class T>
+//void Foam::dynamicOversetFvMesh::setReference(fvMatrix<T>& m) const
+//{
+//    const mapDistribute& map = cellInterpolationMap();
+//    const List<scalarList>& wghts = cellInterpolationWeights();
+//    const labelListList& stencil = cellStencil();
+//    const labelList& cellIDs = interpolationCells();
+//    const scalarList& factor = cellInterpolationWeight();
+//
+//    Field<T> work(m.psi());
+//    map.mapDistributeBase::distribute(work, UPstream::msgType()+1);
+//
+//    forAll(cellIDs, i)
+//    {
+//        label celli = cellIDs[i];
+//
+//        const scalarList& w = wghts[celli];
+//        const labelList& nbrs = stencil[celli];
+//        const scalar f = factor[celli];
+//
+//        //Pout<< "Interpolating " << celli << " from values:" << endl;
+//        T s(pTraits<T>::zero);
+//        forAll(nbrs, nbrI)
+//        {
+//            //Pout<< "    " << work[nbrs[nbrI]]
+//            //    << " from slot " << nbrs[nbrI] << endl;
+//            s += w[nbrI]*work[nbrs[nbrI]];
+//        }
+//        //Pout<< "Interpolated value:" << s << endl;
+//        const T oldPsi = m.psi()[celli];
+//        m.setReference(celli, (1.0-f)*oldPsi + f*s, true);
+//        Pout<< "psi was:" << oldPsi << " now forcing to:"
+//            << (1.0-f)*oldPsi + f*s << endl;
+//    }
+//}
+
+
+template<class Type>
+void Foam::dynamicOversetFvMesh::addInterpolation(fvMatrix<Type>& m) const
+{
+    const cellCellStencilObject& overlap = Stencil::New(*this);
+    const List<scalarList>& wghts = overlap.cellInterpolationWeights();
+    const labelListList& stencil = overlap.cellStencil();
+    const labelList& cellIDs = overlap.interpolationCells();
+    const scalarList& factor = overlap.cellInterpolationWeight();
+    const labelUList& types = overlap.cellTypes();
+
+
+    // Force asymmetric matrix (if it wasn't already)
+    scalarField& lower = m.lower();
+    scalarField& upper = m.upper();
+    Field<Type>& source = m.source();
+    scalarField& diag = m.diag();
+
+
+    // Get the addressing. Note that the addressing is now extended with
+    // any interpolation faces.
+    const lduAddressing& addr = lduAddr();
+    const labelUList& upperAddr = addr.upperAddr();
+    const labelUList& lowerAddr = addr.lowerAddr();
+    const labelUList& ownerStartAddr = addr.ownerStartAddr();
+    const labelUList& losortAddr = addr.losortAddr();
+
+
+    if (!isA<fvMeshPrimitiveLduAddressing>(addr))
+    {
+        FatalErrorInFunction
+            << "Problem : addressing is not fvMeshPrimitiveLduAddressing"
+            << exit(FatalError);
+    }
+
+
+
+    // 1. Adapt lduMatrix for additional faces and new ordering
+    upper.setSize(upperAddr.size(), 0.0);
+    inplaceReorder(reverseFaceMap_, upper);
+    lower.setSize(lowerAddr.size(), 0.0);
+    inplaceReorder(reverseFaceMap_, lower);
+
+
+    // 2. Adapt fvMatrix level: faceFluxCorrectionPtr
+    // Question: do we need to do this?
+    // This seems to be set/used only by the gaussLaplacianScheme and
+    // fvMatrix:correction, both of which are outside the linear solver.
+
+
+
+    // Clear out existing connections on cells to be interpolated
+    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+    // Note: could avoid doing the zeroing of the new faces since these
+    //       are set to zero anyway.
+
+    forAll(upperAddr, facei)
+    {
+        if (types[upperAddr[facei]] == cellCellStencil::INTERPOLATED)
+        {
+            // Disconnect upper from lower
+            label celli = upperAddr[facei];
+            lower[facei] *= 1.0-factor[celli];
+        }
+        if (types[lowerAddr[facei]] == cellCellStencil::INTERPOLATED)
+        {
+            // Disconnect lower from upper
+            label celli = lowerAddr[facei];
+            upper[facei] *= 1.0-factor[celli];
+        }
+    }
+
+    forAll(m.internalCoeffs(), patchI)
+    {
+        const labelUList& fc = addr.patchAddr(patchI);
+        Field<Type>& intCoeffs = m.internalCoeffs()[patchI];
+        Field<Type>& bouCoeffs = m.boundaryCoeffs()[patchI];
+        forAll(fc, i)
+        {
+            label celli = fc[i];
+            {
+                if (types[celli] == cellCellStencil::INTERPOLATED)
+                {
+                    scalar f = factor[celli];
+                    intCoeffs[i] *= 1.0-f;
+                    bouCoeffs[i] *= 1.0-f;
+                }
+                else if (types[celli] == cellCellStencil::HOLE)
+                {
+                    intCoeffs[i] = pTraits<Type>::zero;
+                    bouCoeffs[i] = pTraits<Type>::zero;
+                }
+            }
+        }
+    }
+
+
+
+    // Modify matrix
+    // ~~~~~~~~~~~~~
+
+
+
+    // Do hole cells. Note: maybe put into interpolationCells() loop above?
+    forAll(types, celli)
+    {
+        if (types[celli] == cellCellStencil::HOLE)
+        {
+            //Pout<< "Found hole cell:" << celli
+            //    << " at:" << C()[celli]
+            //    << " ; setting value" << endl;
+
+            label startLabel = ownerStartAddr[celli];
+            label endLabel = ownerStartAddr[celli + 1];
+
+            for (label facei = startLabel; facei < endLabel; facei++)
+            {
+                upper[facei] = 0.0;
+            }
+
+            startLabel = addr.losortStartAddr()[celli];
+            endLabel = addr.losortStartAddr()[celli + 1];
+
+            for (label i = startLabel; i < endLabel; i++)
+            {
+                label facei = losortAddr[i];
+                lower[facei] = 0.0;
+            }
+
+            const scalar normalisation = V()[celli];
+            diag[celli] = normalisation;
+            source[celli] = normalisation*m.psi()[celli];
+        }
+    }
+
+
+    forAll(cellIDs, i)
+    {
+        label celli = cellIDs[i];
+
+        const scalar f = factor[celli];
+        const scalarList& w = wghts[celli];
+        const labelList& nbrs = stencil[celli];
+        const labelList& nbrFaces = stencilFaces_[celli];
+
+        const scalar normalisation = V()[celli];
+
+        if (types[celli] == cellCellStencil::HOLE)
+        {
+            FatalErrorInFunction << "Found HOLE cell " << celli
+                << " at:" << C()[celli]
+                << " . Should this be in interpolationCells()????"
+                << abort(FatalError);
+        }
+        else
+        {
+            // Create interpolation stencil. Leave any non-local contributions
+            //  to be done by oversetFvPatchField updateMatrixInterface
+
+            diag[celli] *= (1.0-f);
+            diag[celli] += normalisation*f;
+
+            source[celli] *= (1.0-f);
+            source[celli] += normalisation*f*pTraits<Type>::zero; // dummy
+
+            //Pout<< "Interpolating " << celli << " with factor:" << f
+            //    << " new diag:" << diag[celli]
+            //    << " new source:" << source[celli]
+            //    << " volume:" << V()[celli] << endl;
+
+            forAll(nbrs, nbri)
+            {
+                label facei = nbrFaces[nbri];
+
+                if (facei != -1)
+                {
+                    label nbrCelli = nbrs[nbri];
+
+                    // Add the coefficients
+
+                    scalar& u = upper[facei];
+                    scalar& l = lower[facei];
+                    if (celli < nbrCelli)
+                    {
+                        u += -normalisation*f*w[nbri];
+                    }
+                    else
+                    {
+                        l += -normalisation*f*w[nbri];
+                    }
+                }
+                //else
+                //{
+                //    Pout<< "addItnerpolation of " << celli
+                //        << " at:" << this->cellCentres()[celli]
+                //        << " zone:" << this->zoneID()[celli]
+                //        << " diag:" << diag[celli]
+                //        << " source:" << source[celli]
+                //        <<" : skipping remote cell:" << nbrs[nbri]
+                //        << " with weight:" << w[nbri]
+                //        << endl;
+                //}
+            }
+        }
+    }
+}
+
+
+template<class Type>
+Foam::SolverPerformance<Type> Foam::dynamicOversetFvMesh::solve
+(
+    fvMatrix<Type>& m,
+    const dictionary& dict
+) const
+{
+    // Switch to extended addressing (requires mesh::update() having been
+    // called)
+    active(true);
+
+    // Adapt matrix
+    scalarField oldUpper(m.upper());
+    scalarField oldLower(m.lower());
+    FieldField<Field, Type> oldInt(m.internalCoeffs());
+    FieldField<Field, Type> oldBou(m.boundaryCoeffs());
+
+    addInterpolation(m);
+
+    // Print a bit
+    //write(Pout, m, lduAddr());
+
+    // Use lower level solver
+    SolverPerformance<Type> s(dynamicMotionSolverFvMesh::solve(m, dict));
+
+    // Reset matrix (shuffle faces into original order)
+    //resetMatrix(m);
+    m.upper().transfer(oldUpper);
+    m.lower().transfer(oldLower);
+    m.internalCoeffs().transfer(oldInt);
+    m.boundaryCoeffs().transfer(oldBou);
+
+    // Switch to original addressing
+    active(false);
+
+    return s;
+}
+
+
+template<class Type>
+void Foam::dynamicOversetFvMesh::write
+(
+    Ostream& os,
+    const fvMatrix<Type>& m,
+    const lduAddressing& addr
+) const
+{
+    os  << "** Matrix **" << endl;
+    const labelUList& upperAddr = addr.upperAddr();
+    const labelUList& lowerAddr = addr.lowerAddr();
+    const labelUList& ownerStartAddr = addr.ownerStartAddr();
+    const labelUList& losortAddr = addr.losortAddr();
+
+    const scalarField& lower = m.lower();
+    const scalarField& upper = m.upper();
+    const Field<Type>& source = m.source();
+    const scalarField& diag = m.diag();
+
+    forAll(source, celli)
+    {
+        os  << "cell:" << celli << " diag:" << diag[celli]
+            << " source:" << source[celli] << endl;
+
+        label startLabel = ownerStartAddr[celli];
+        label endLabel = ownerStartAddr[celli + 1];
+
+        for (label facei = startLabel; facei < endLabel; facei++)
+        {
+            os  << "    face:" << facei
+                << " nbr:" << upperAddr[facei] << " coeff:" << upper[facei]
+                << endl;
+        }
+
+        startLabel = addr.losortStartAddr()[celli];
+        endLabel = addr.losortStartAddr()[celli + 1];
+
+        for (label i = startLabel; i < endLabel; i++)
+        {
+            label facei = losortAddr[i];
+            os  << "    face:" << facei
+                << " nbr:" << lowerAddr[facei] << " coeff:" << lower[facei]
+                << endl;
+        }
+    }
+    forAll(m.internalCoeffs(), patchi)
+    {
+        if (m.internalCoeffs().set(patchi))
+        {
+            const labelUList& fc = addr.patchAddr(patchi);
+
+            os  << "patch:" << patchi << " size:" << fc.size() << endl;
+            forAll(fc, i)
+            {
+                os  << "    cell:" << fc[i]
+                    << " int:" << m.internalCoeffs()[patchi][i]
+                    << " boun:" << m.boundaryCoeffs()[patchi][i]
+                    << endl;
+            }
+        }
+    }
+
+
+    lduInterfaceFieldPtrsList interfaces =
+        m.psi().boundaryField().scalarInterfaces();
+    forAll(interfaces, inti)
+    {
+        if (interfaces.set(inti))
+        {
+            os  << "interface:" << inti
+                << " if type:" << interfaces[inti].interface().type()
+                << " fld type:" << interfaces[inti].type() << endl;
+        }
+    }
+
+    os  << "** End of Matrix **" << endl;
+}
+
+
+template<class GeoField>
+void Foam::dynamicOversetFvMesh::correctCoupledBoundaryConditions(GeoField& fld)
+{
+    typename GeoField::Boundary& bfld = fld.boundaryFieldRef();
+
+    label nReq = Pstream::nRequests();
+
+    forAll(bfld, patchi)
+    {
+        if (bfld[patchi].coupled())
+        {
+            Pout<< "initEval of " << bfld[patchi].patch().name() << endl;
+            bfld[patchi].initEvaluate(Pstream::defaultCommsType);
+        }
+    }
+
+    // Block for any outstanding requests
+    if (Pstream::parRun())
+    {
+        Pstream::waitRequests(nReq);
+    }
+
+    forAll(bfld, patchi)
+    {
+        if (bfld[patchi].coupled())
+        {
+            Pout<< "eval of " << bfld[patchi].patch().name() << endl;
+            bfld[patchi].evaluate(Pstream::defaultCommsType);
+        }
+    }
+}
+
+
+template<class GeoField>
+void Foam::dynamicOversetFvMesh::checkCoupledBC(const GeoField& fld)
+{
+    Pout<< "** starting checking of " << fld.name() << endl;
+
+    GeoField fldCorr(fld.name()+"_correct", fld);
+    correctCoupledBoundaryConditions(fldCorr);
+
+    const typename GeoField::Boundary& bfld = fld.boundaryField();
+    const typename GeoField::Boundary& bfldCorr = fldCorr.boundaryField();
+
+    forAll(bfld, patchi)
+    {
+        const typename GeoField::Patch& pfld = bfld[patchi];
+        const typename GeoField::Patch& pfldCorr = bfldCorr[patchi];
+
+        Pout<< "Patch:" << pfld.patch().name() << endl;
+
+        forAll(pfld, i)
+        {
+            if (pfld[i] != pfldCorr[i])
+            {
+                Pout<< "    " << i << "  orig:" << pfld[i]
+                    << " corrected:" << pfldCorr[i] << endl;
+            }
+        }
+    }
+    Pout<< "** end of " << fld.name() << endl;
+}
+
+
+// ************************************************************************* //
diff --git a/src/overset/fvMeshPrimitiveLduAddressing/fvMeshPrimitiveLduAddressing.C b/src/overset/fvMeshPrimitiveLduAddressing/fvMeshPrimitiveLduAddressing.C
new file mode 100644
index 00000000000..d779b59de64
--- /dev/null
+++ b/src/overset/fvMeshPrimitiveLduAddressing/fvMeshPrimitiveLduAddressing.C
@@ -0,0 +1,267 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2015-2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "fvMeshPrimitiveLduAddressing.H"
+#include "lduPrimitiveMesh.H"
+#include "processorLduInterface.H"
+#include "globalIndex.H"
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+
+Foam::fvMeshPrimitiveLduAddressing::fvMeshPrimitiveLduAddressing
+(
+    const fvMesh& mesh
+)
+:
+    lduAddressing(mesh.nCells()),
+    lowerAddr_
+    (
+        labelList::subList
+        (
+            mesh.faceOwner(),
+            mesh.nInternalFaces()
+        )
+    ),
+    upperAddr_(mesh.faceNeighbour()),
+    patchAddr_(mesh.boundary().size()),
+    patchSchedule_(mesh.globalData().patchSchedule())
+{
+    forAll(mesh.boundary(), patchI)
+    {
+        patchAddr_[patchI] = &mesh.boundary()[patchI].faceCells();
+    }
+}
+
+
+Foam::fvMeshPrimitiveLduAddressing::fvMeshPrimitiveLduAddressing
+(
+    const label nCells,
+    const Xfer<labelList>& lowerAddr,
+    const Xfer<labelList>& upperAddr,
+    const List<const labelUList*>& patchAddr,
+    const lduSchedule& ps
+)
+:
+    lduAddressing(nCells),
+    lowerAddr_(lowerAddr),
+    upperAddr_(upperAddr),
+    patchAddr_(patchAddr),
+    patchSchedule_(ps)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+Foam::label Foam::fvMeshPrimitiveLduAddressing::triIndex
+(
+    const lduAddressing& addr,
+    const label a,
+    const label b
+)
+{
+    label own = min(a, b);
+
+    label nbr = max(a, b);
+
+    label startLabel = addr.ownerStartAddr()[own];
+
+    label endLabel = addr.ownerStartAddr()[own + 1];
+
+    const labelUList& neighbour = addr.upperAddr();
+
+    for (label i = startLabel; i < endLabel; i++)
+    {
+        if (neighbour[i] == nbr)
+        {
+            return i;
+        }
+    }
+    return -1;
+}
+
+
+Foam::labelList Foam::fvMeshPrimitiveLduAddressing::addAddressing
+(
+    const lduAddressing& addr,
+    const labelListList& nbrCells,
+    label& nExtraFaces,
+    labelList& newLowerAddr,
+    labelList& newUpperAddr,
+    labelListList& nbrCellFaces,
+    const globalIndex& globalNumbering,
+    const labelList& globalCellIDs,
+    labelListList& localFaceCells,
+    labelListList& remoteFaceCells
+)
+{
+    label nCells = addr.size();
+    label nFaces = addr.upperAddr().size();
+    labelList nProcFaces(Pstream::nProcs(), 0);
+
+    // Count additional faces
+    nExtraFaces = 0;
+    forAll(nbrCells, cellI)
+    {
+        const labelList& nbrs = nbrCells[cellI];
+        forAll(nbrs, nbrI)
+        {
+            if (nbrs[nbrI] < nCells)
+            {
+                // Local cell
+                if (triIndex(addr, cellI, nbrs[nbrI]) == -1)
+                {
+                    nExtraFaces++;
+                }
+            }
+            else
+            {
+                label globalNbr = globalCellIDs[nbrs[nbrI]];
+                label procI = globalNumbering.whichProcID(globalNbr);
+                nProcFaces[procI]++;
+            }
+        }
+    }
+
+    // Create space for extra addressing
+    newLowerAddr.setSize(nFaces + nExtraFaces);
+    newUpperAddr.setSize(nFaces + nExtraFaces);
+
+    // Copy existing addressing
+    SubList<label>(newLowerAddr, nFaces) = addr.lowerAddr();
+    SubList<label>(newUpperAddr, nFaces) = addr.upperAddr();
+
+
+    // Per processor its local cells we want
+    localFaceCells.setSize(Pstream::nProcs());
+    remoteFaceCells.setSize(Pstream::nProcs());
+    forAll(nProcFaces, procI)
+    {
+        localFaceCells[procI].setSize(nProcFaces[procI]);
+        remoteFaceCells[procI].setSize(nProcFaces[procI]);
+    }
+    nProcFaces = 0;
+
+    nbrCellFaces.setSize(nbrCells.size());
+    forAll(nbrCells, cellI)
+    {
+        const labelList& nbrs = nbrCells[cellI];
+        labelList& faces = nbrCellFaces[cellI];
+        faces.setSize(nbrs.size());
+
+        forAll(nbrs, nbrI)
+        {
+            label nbrCellI = nbrs[nbrI];
+
+            if (nbrCellI < nCells)
+            {
+                // Find neighbour cell in owner list
+                label faceI = triIndex(addr, cellI, nbrCellI);
+                if (faceI == -1)
+                {
+                    faceI = nFaces++;
+                    newLowerAddr[faceI] = min(cellI, nbrCellI);
+                    newUpperAddr[faceI] = max(cellI, nbrCellI);
+                }
+                faces[nbrI] = faceI;
+            }
+            else
+            {
+                // Remote cell
+                faces[nbrI] = -1;
+
+                label globalNbr = globalCellIDs[nbrs[nbrI]];
+                label procI = globalNumbering.whichProcID(globalNbr);
+                label remoteCellI = globalNumbering.toLocal(procI, globalNbr);
+
+                label procFaceI = nProcFaces[procI]++;
+                localFaceCells[procI][procFaceI] = cellI;
+                remoteFaceCells[procI][procFaceI] = remoteCellI;
+            }
+        }
+    }
+
+    // Reorder upper-triangular
+    labelList oldToNew
+    (
+        lduPrimitiveMesh::upperTriOrder
+        (
+            addr.size(),
+            newLowerAddr,
+            newUpperAddr
+        )
+    );
+
+    // Shuffle face-to-cell addressing
+    inplaceReorder(oldToNew, newLowerAddr);
+    inplaceReorder(oldToNew, newUpperAddr);
+    // Update cell-to-face addressing
+    forAll(nbrCellFaces, cellI)
+    {
+        inplaceRenumber(oldToNew, nbrCellFaces[cellI]);
+    }
+
+    //if (debug)
+    //{
+    //    for
+    //    (
+    //        label i = addr.upperAddr().size();
+    //        i < oldToNew.size();
+    //        i++
+    //    )
+    //    {
+    //        label faceI = oldToNew[i];
+    //        Pout<< "new face:" << faceI << endl
+    //            << "    owner:" << newLowerAddr[faceI]
+    //            << "    neighbour:" << newUpperAddr[faceI]
+    //            << endl;
+    //    }
+    //
+    //    forAll(nbrCellFaces, cellI)
+    //    {
+    //        const labelList& nbrs = nbrCells[cellI];
+    //        const labelList& nbrFaces = nbrCellFaces[cellI];
+    //        if (nbrs.size())
+    //        {
+    //            Pout<< "cell:" << cellI << " has additional neighbours:"
+    //                << endl;
+    //            forAll(nbrs, i)
+    //            {
+    //                label faceI = nbrFaces[i];
+    //                Pout<< "    nbr:" << nbrs[i]
+    //                    << " through face:" << faceI
+    //                    << " with own:" << newLowerAddr[faceI]
+    //                    << " with nei:" << newUpperAddr[faceI]
+    //                    << endl;
+    //            }
+    //        }
+    //    }
+    //}
+
+    return oldToNew;
+}
+
+
+// ************************************************************************* //
diff --git a/src/overset/fvMeshPrimitiveLduAddressing/fvMeshPrimitiveLduAddressing.H b/src/overset/fvMeshPrimitiveLduAddressing/fvMeshPrimitiveLduAddressing.H
new file mode 100644
index 00000000000..097a4308125
--- /dev/null
+++ b/src/overset/fvMeshPrimitiveLduAddressing/fvMeshPrimitiveLduAddressing.H
@@ -0,0 +1,172 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2015-2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::fvMeshPrimitiveLduAddressing
+
+Description
+    Variant of fvMeshLduAddressing that contains addressing instead of
+    slices.
+
+    Alternatively use lduPrimitiveMesh but that assumes there are only
+    lduInterfaces and not also generic patches.
+
+SourceFiles
+    fvMeshPrimitiveLduAddressing.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef fvMeshPrimitiveLduAddressing_H
+#define fvMeshPrimitiveLduAddressing_H
+
+#include "lduPrimitiveMesh.H"
+#include "lduAddressing.H"
+#include "fvMesh.H"
+#include "globalMeshData.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                Class fvMeshPrimitiveLduAddressing Declaration
+\*---------------------------------------------------------------------------*/
+
+class fvMeshPrimitiveLduAddressing
+:
+    public lduAddressing
+{
+    // Private data
+
+        //- Lower (face to owner addressing)
+        labelList lowerAddr_;
+
+        //- Upper (face to neighbour addressing)
+        labelList upperAddr_;
+
+        //- Patch addressing as a list of sublists
+        List<const labelUList*> patchAddr_;
+
+        //- Patch field evaluation schedule
+        const lduSchedule& patchSchedule_;
+
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        fvMeshPrimitiveLduAddressing(const fvMeshPrimitiveLduAddressing&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const fvMeshPrimitiveLduAddressing&);
+
+
+public:
+
+    // Constructors
+
+        //- Construct from mesh
+        fvMeshPrimitiveLduAddressing(const fvMesh& mesh);
+
+        //- Construct from components
+        fvMeshPrimitiveLduAddressing
+        (
+            const label nCells,
+            const Xfer<labelList>& lowerAddr,
+            const Xfer<labelList>& upperAddr,
+            const List<const labelUList*>& interfaces,
+            const lduSchedule& ps
+        );
+
+
+    //- Destructor
+    virtual ~fvMeshPrimitiveLduAddressing()
+    {}
+
+
+    // Member Functions
+
+        //- Return lower addressing (i.e. lower label = upper triangle)
+        virtual const labelUList& lowerAddr() const
+        {
+            return lowerAddr_;
+        }
+
+        //- Return upper addressing (i.e. upper label)
+        virtual const labelUList& upperAddr() const
+        {
+            return upperAddr_;
+        }
+
+        //- Return patch addressing
+        virtual const labelUList& patchAddr(const label i) const
+        {
+            return *patchAddr_[i];
+        }
+
+        // Return patch field evaluation schedule
+        virtual const lduSchedule& patchSchedule() const
+        {
+            return patchSchedule_;
+        }
+
+        //- Given additional addressing (in the form of additional neighbour
+        //  cells, i.e. like cellCells)
+        //  - add any additional faces
+        //  - sort in upper-triangular order
+        //  - construct cell-faces equivalent of given nbrCells
+        //    (so e.g. nbrCellFaces[cellI][0] is the face corresponding to
+        //     the cell nbrCells[cellI][0])
+        //    (note: face in nbrCellFaces is -1 if the nbrCell is not local)
+        //  - construct additional processor interface addressing:
+        //      per processor the local and the remote cell.
+        //  - return old-to-new face mapping
+        static labelList addAddressing
+        (
+            const lduAddressing& addr,
+            const labelListList& nbrCells,
+            label& nExtraFaces,
+            labelList& lower,
+            labelList& upper,
+            labelListList& nbrCellFaces,
+            const globalIndex&,
+            const labelList& globalCellIDs,
+            labelListList& localFaceCells,
+            labelListList& remoteFaceCells
+        );
+
+        //- Return off-diagonal index given owner and neighbour label. Return
+        //  -1 if not found
+        static label triIndex(const lduAddressing&, const label, const label);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/overset/include/createCellMask.H b/src/overset/include/createCellMask.H
new file mode 100644
index 00000000000..61de1068858
--- /dev/null
+++ b/src/overset/include/createCellMask.H
@@ -0,0 +1,53 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Global
+    blockedCellMask
+
+Description
+    Creates mask for blocked out cells
+
+\*---------------------------------------------------------------------------*/
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+Info<< "Creating cellMask field to block out hole cells\n" << endl;
+
+volScalarField cellMask
+(
+    IOobject
+    (
+        "cellMask",
+        runTime.timeName(),
+        mesh,
+        IOobject::NO_READ,
+        IOobject::AUTO_WRITE
+    ),
+    mesh,
+    dimensionedScalar("cellMask", dimless, 1.0),
+    zeroGradientFvPatchScalarField::typeName
+);
+
+#include "setCellMask.H"
+
+// ************************************************************************* //
diff --git a/src/overset/include/createInterpolatedCells.H b/src/overset/include/createInterpolatedCells.H
new file mode 100644
index 00000000000..87b8ebbb4a0
--- /dev/null
+++ b/src/overset/include/createInterpolatedCells.H
@@ -0,0 +1,53 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Global
+    interpolatedCells
+
+Description
+    Creates mask for interpolated cells
+
+\*---------------------------------------------------------------------------*/
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+Info<< "Creating interpolatedCells field \n" << endl;
+
+volScalarField interpolatedCells
+(
+    IOobject
+    (
+        "interpolatedCells",
+        runTime.timeName(),
+        mesh,
+        IOobject::NO_READ,
+        IOobject::NO_WRITE
+    ),
+    mesh,
+    dimensionedScalar("interpolatedCells", dimless, 1.0),
+    zeroGradientFvPatchScalarField::typeName
+);
+
+#include "setInterpolatedCells.H"
+
+// ************************************************************************* //
diff --git a/src/overset/include/setCellMask.H b/src/overset/include/setCellMask.H
new file mode 100644
index 00000000000..92e187ee596
--- /dev/null
+++ b/src/overset/include/setCellMask.H
@@ -0,0 +1,51 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+
+Description
+    Sets blocked cells mask field
+
+SourceFiles
+
+\*---------------------------------------------------------------------------*/
+
+{
+    const cellCellStencilObject& overlap = Stencil::New(mesh);
+    const labelList& cellTypes = overlap.cellTypes();
+
+    //label nHoles = 0;
+
+    cellMask.primitiveFieldRef() = 1.0;
+    forAll(cellMask, cellI)
+    {
+        if (cellTypes[cellI] == cellCellStencil::HOLE)
+        {
+            cellMask[cellI] = 0.0;
+            //nHoles++;
+        }
+    }
+    cellMask.correctBoundaryConditions();
+}
+
+// ************************************************************************* //
diff --git a/src/overset/include/setInterpolatedCells.H b/src/overset/include/setInterpolatedCells.H
new file mode 100644
index 00000000000..6b3cac9e854
--- /dev/null
+++ b/src/overset/include/setInterpolatedCells.H
@@ -0,0 +1,48 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+
+Description
+    Sets blocked cells mask field
+
+SourceFiles
+
+\*---------------------------------------------------------------------------*/
+
+{
+    const cellCellStencilObject& overlap = Stencil::New(mesh);
+    const labelList& cellTypes = overlap.cellTypes();
+
+    interpolatedCells.primitiveFieldRef() = 1.0;
+    forAll(cellMask, cellI)
+    {
+        if (cellTypes[cellI] == cellCellStencil::INTERPOLATED)
+        {
+            interpolatedCells[cellI] = 0.0;
+        }
+    }
+    interpolatedCells.correctBoundaryConditions();
+}
+
+// ************************************************************************* //
diff --git a/src/overset/lduPrimitiveProcessorInterface/lduPrimitiveProcessorInterface.C b/src/overset/lduPrimitiveProcessorInterface/lduPrimitiveProcessorInterface.C
new file mode 100644
index 00000000000..c12dc99f90f
--- /dev/null
+++ b/src/overset/lduPrimitiveProcessorInterface/lduPrimitiveProcessorInterface.C
@@ -0,0 +1,97 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "lduPrimitiveProcessorInterface.H"
+#include "transformField.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTypeNameAndDebug(lduPrimitiveProcessorInterface, 0);
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::lduPrimitiveProcessorInterface::lduPrimitiveProcessorInterface
+(
+    const labelUList& faceCells,
+    const label myProcNo,
+    const label neighbProcNo,
+    const tensorField& forwardT,
+    const int tag,
+    const label comm
+)
+:
+    faceCells_(faceCells),
+    myProcNo_(myProcNo),
+    neighbProcNo_(neighbProcNo),
+    forwardT_(forwardT),
+    tag_(tag),
+    comm_(comm)
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+Foam::tmp<Foam::labelField>
+Foam::lduPrimitiveProcessorInterface::interfaceInternalField
+(
+    const labelUList& internalData
+) const
+{
+    tmp<labelField> tfld(new labelField(faceCells_.size()));
+    labelField& fld = tfld.ref();
+    forAll(faceCells_, i)
+    {
+        fld[i] = internalData[faceCells_[i]];
+    }
+    return tfld;
+}
+
+
+void Foam::lduPrimitiveProcessorInterface::initInternalFieldTransfer
+(
+    const Pstream::commsTypes commsType,
+    const labelUList& iF
+) const
+{
+    processorLduInterface::send(commsType, interfaceInternalField(iF)());
+}
+
+
+Foam::tmp<Foam::labelField>
+Foam::lduPrimitiveProcessorInterface::internalFieldTransfer
+(
+    const Pstream::commsTypes commsType,
+    const labelUList&
+) const
+{
+    return processorLduInterface::receive<label>(commsType, faceCells_.size());
+}
+
+
+// ************************************************************************* //
diff --git a/src/overset/lduPrimitiveProcessorInterface/lduPrimitiveProcessorInterface.H b/src/overset/lduPrimitiveProcessorInterface/lduPrimitiveProcessorInterface.H
new file mode 100644
index 00000000000..2f1777008f9
--- /dev/null
+++ b/src/overset/lduPrimitiveProcessorInterface/lduPrimitiveProcessorInterface.H
@@ -0,0 +1,193 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenFOAM Foundation
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::lduPrimitiveProcessorInterface
+
+Description
+    Concrete implementation of processor interface. Used to temporarily store
+    settings.
+
+SourceFiles
+    lduPrimitiveProcessorInterface.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef lduPrimitiveProcessorInterface_H
+#define lduPrimitiveProcessorInterface_H
+
+#include "GAMGInterface.H"
+#include "processorLduInterface.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+               Class lduPrimitiveProcessorInterface Declaration
+\*---------------------------------------------------------------------------*/
+
+class lduPrimitiveProcessorInterface
+:
+    public lduInterface,
+    public processorLduInterface
+{
+    // Private data
+
+        const labelList faceCells_;
+
+        //- My processor rank in communicator
+        label myProcNo_;
+
+        //- Neighbouring processor rank in communicator
+        label neighbProcNo_;
+
+        //- Transformation tensor
+        tensorField forwardT_;
+
+        //- Message tag used for sending
+        int tag_;
+
+        //- Communicator to use for parallel communication
+        const label comm_;
+
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        lduPrimitiveProcessorInterface(const lduPrimitiveProcessorInterface&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const lduPrimitiveProcessorInterface&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("primitiveProcessor");
+
+
+    // Constructors
+
+        //- Construct from components
+        lduPrimitiveProcessorInterface
+        (
+            const labelUList& faceCells,
+            const label myProcNo,
+            const label neighbProcNo,
+            const tensorField& forwardT,
+            const int tag,
+            const label comm = UPstream::worldComm
+        );
+
+
+    //- Destructor
+    virtual ~lduPrimitiveProcessorInterface()
+    {}
+
+
+    // Member Functions
+
+        // Access
+
+            //- Return faceCell addressing
+            virtual const labelUList& faceCells() const
+            {
+                return faceCells_;
+            }
+
+
+        // Interface transfer functions
+
+            //- Return the values of the given internal data adjacent to
+            //  the interface as a field
+            virtual tmp<labelField> interfaceInternalField
+            (
+                const labelUList& internalData
+            ) const;
+
+            //- Initialise neighbour field transfer
+            virtual void initInternalFieldTransfer
+            (
+                const Pstream::commsTypes commsType,
+                const labelUList& iF
+            ) const;
+
+            //- Transfer and return internal field adjacent to the interface
+            virtual tmp<labelField> internalFieldTransfer
+            (
+                const Pstream::commsTypes commsType,
+                const labelUList& iF
+            ) const;
+
+
+        //- Processor interface functions
+
+            //- Return communicator used for sending
+            virtual label comm() const
+            {
+                return comm_;
+            }
+
+            //- Return processor number (rank in communicator)
+            virtual int myProcNo() const
+            {
+                return myProcNo_;
+            }
+
+            //- Return neigbour processor number (rank in communicator)
+            virtual int neighbProcNo() const
+            {
+                return neighbProcNo_;
+            }
+
+            //- Return face transformation tensor
+            virtual const tensorField& forwardT() const
+            {
+                return forwardT_;
+            }
+
+            //- Return message tag used for sending
+            virtual int tag() const
+            {
+                return tag_;
+            }
+
+
+//        // I/O
+//
+//            //- Write to stream
+//            virtual void write(Ostream&) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/overset/oversetAdjustPhi/oversetAdjustPhi.C b/src/overset/oversetAdjustPhi/oversetAdjustPhi.C
new file mode 100644
index 00000000000..b6eb644b550
--- /dev/null
+++ b/src/overset/oversetAdjustPhi/oversetAdjustPhi.C
@@ -0,0 +1,291 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "oversetAdjustPhi.H"
+#include "volFields.H"
+#include "surfaceFields.H"
+#include "cellCellStencilObject.H"
+#include "syncTools.H"
+#include "fv.H"
+
+// * * * * * * * * * * * * * * * Global Functions  * * * * * * * * * * * * * //
+
+bool Foam::oversetAdjustPhi
+(
+    surfaceScalarField& phi,
+    const volVectorField& U
+)
+{
+    const fvMesh& mesh = U.mesh();
+
+    const cellCellStencilObject& overlap = Stencil::New(mesh);
+    const labelList& cellTypes = overlap.cellTypes();
+    const labelList& zoneID = overlap.zoneID();
+    label nZones = gMax(zoneID)+1;
+
+
+
+    // Pass1: accumulate all fluxes, calculate correction factor
+
+    scalarField massIn(nZones, 0.0);
+    scalarField adjustableMassOut(nZones, 0.0);
+
+    surfaceScalarField::Boundary& bphi =
+        phi.boundaryFieldRef();
+
+
+    // Check all faces on the outside of interpolated cells
+    const labelUList& own = mesh.owner();
+    const labelUList& nei = mesh.neighbour();
+    {
+        forAll(own, facei)
+        {
+            label zonei = zoneID[own[facei]];   // note:own and nei in same zone
+
+            label ownType = cellTypes[own[facei]];
+            label neiType = cellTypes[nei[facei]];
+
+            bool ownCalc =
+                (ownType == cellCellStencil::CALCULATED)
+             && (neiType == cellCellStencil::INTERPOLATED);
+
+            bool neiCalc =
+                (ownType == cellCellStencil::INTERPOLATED)
+             && (neiType == cellCellStencil::CALCULATED);
+
+
+            if (ownCalc || neiCalc)
+            {
+                // Calculate flux w.r.t. calculated cell
+                scalar flux = phi[facei];
+                if (neiCalc)
+                {
+                    flux = -flux;
+                }
+
+                if (flux < 0.0)
+                {
+                    massIn[zonei] -= flux;
+                }
+                else
+                {
+                    adjustableMassOut[zonei] += flux;
+                 }
+            }
+        }
+    }
+
+
+    // Check all coupled faces on the outside of interpolated cells
+    labelList neiCellTypes;
+    syncTools::swapBoundaryCellList(mesh, cellTypes, neiCellTypes);
+    {
+        forAll(bphi, patchi)
+        {
+            const fvPatchVectorField& Up = U.boundaryField()[patchi];
+            const fvsPatchScalarField& phip = bphi[patchi];
+            const labelUList& fc = Up.patch().faceCells();
+
+            label start = Up.patch().start();
+
+            forAll(fc, i)
+            {
+                label facei = start+i;
+                label celli = fc[i];
+                label ownType = cellTypes[celli];
+                label neiType = neiCellTypes[facei-mesh.nInternalFaces()];
+
+                bool ownCalc =
+                    (ownType == cellCellStencil::CALCULATED)
+                 && (neiType == cellCellStencil::INTERPOLATED);
+
+                bool neiCalc =
+                    (ownType == cellCellStencil::INTERPOLATED)
+                 && (neiType == cellCellStencil::CALCULATED);
+
+
+                if (ownCalc || neiCalc)
+                {
+                    // Calculate flux w.r.t. calculated cell
+                    scalar flux = phip[i];
+                    if (neiCalc)
+                    {
+                        flux = -flux;
+                    }
+
+                    if (flux < 0.0)
+                    {
+                        massIn[zoneID[celli]] -= flux;
+                    }
+                    else
+                    {
+                        adjustableMassOut[zoneID[celli]] += flux;
+                    }
+                }
+            }
+        }
+    }
+
+    // Calculate the total flux in the domain, used for normalisation
+    scalar totalFlux = VSMALL + sum(mag(phi)).value();
+
+    forAll(massIn, zonei)
+    {
+        reduce(massIn[zonei], sumOp<scalar>());
+        reduce(adjustableMassOut[zonei], sumOp<scalar>());
+    }
+
+
+    scalarField massCorr(nZones, 1.0);
+
+    forAll(massIn, zonei)
+    {
+        scalar magAdjustableMassOut = mag(adjustableMassOut[zonei]);
+
+        if
+        (
+            magAdjustableMassOut > VSMALL
+         && magAdjustableMassOut/totalFlux > SMALL
+        )
+        {
+            massCorr[zonei] = massIn[zonei]/adjustableMassOut[zonei];
+        }
+        else if (mag(massIn[zonei])/totalFlux > 1e-8)
+        {
+            WarningInFunction
+                << "Continuity error cannot be removed by adjusting the"
+                   " flow at fringe faces.\n    Please check the cell types"
+                << " from the overset analysis."
+                << nl
+                << "Zone                    : " << zonei << nl
+                << "Total flux              : " << totalFlux << nl
+                << "Specified mass inflow   : " << massIn[zonei] << nl
+                << "Adjustable mass outflow : " << adjustableMassOut[zonei]
+                << nl << endl;
+        }
+
+
+        if (fv::debug)
+        {
+            Info<< "Zone                    : " << zonei << nl
+                << "Total flux              : " << totalFlux << nl
+                << "Specified mass inflow   : " << massIn[zonei] << nl
+                << "Adjustable mass outflow : " << adjustableMassOut[zonei]
+                << nl
+                << "Correction factor       : " << massCorr[zonei] << nl
+                << endl;
+        }
+    }
+
+
+
+    // Pass2: adjust fluxes
+
+    forAll(own, facei)
+    {
+        label zonei = zoneID[own[facei]];   // note:own and nei in same zone
+
+        label ownType = cellTypes[own[facei]];
+        label neiType = cellTypes[nei[facei]];
+
+        bool ownCalc =
+            (ownType == cellCellStencil::CALCULATED)
+         && (neiType == cellCellStencil::INTERPOLATED);
+
+        bool neiCalc =
+            (ownType == cellCellStencil::INTERPOLATED)
+         && (neiType == cellCellStencil::CALCULATED);
+
+        if (ownCalc || neiCalc)
+        {
+            // Calculate flux w.r.t. calculated cell
+            scalar flux = phi[facei];
+            if (neiCalc)
+            {
+                flux = -flux;
+            }
+
+            if (flux < 0.0)
+            {
+                phi[facei] /= Foam::sqrt(massCorr[zonei]);
+            }
+            else
+            {
+                phi[facei] *= Foam::sqrt(massCorr[zonei]);
+            }
+        }
+    }
+
+    forAll(bphi, patchi)
+    {
+        const fvPatchVectorField& Up = U.boundaryField()[patchi];
+        fvsPatchScalarField& phip = bphi[patchi];
+        const labelUList& fc = Up.patch().faceCells();
+
+        label start = Up.patch().start();
+
+        forAll(fc, i)
+        {
+            label facei = start+i;
+            label celli = fc[i];
+            label zonei = zoneID[celli];   // note:own and nei in same zone
+            label ownType = cellTypes[celli];
+            label neiType = neiCellTypes[facei-mesh.nInternalFaces()];
+
+            bool ownCalc =
+                (ownType == cellCellStencil::CALCULATED)
+             && (neiType == cellCellStencil::INTERPOLATED);
+
+            bool neiCalc =
+                (ownType == cellCellStencil::INTERPOLATED)
+             && (neiType == cellCellStencil::CALCULATED);
+
+            if (ownCalc || neiCalc)
+            {
+                // Calculate flux w.r.t. calculated cell
+                scalar flux = phip[i];
+                if (neiCalc)
+                {
+                    flux = -flux;
+                }
+
+                if (flux < 0.0)
+                {
+                    phip[i] /= Foam::sqrt(massCorr[zonei]);
+                }
+                else
+                {
+                    phip[i] *= Foam::sqrt(massCorr[zonei]);
+                }
+            }
+        }
+    }
+
+    return sum(mag(massIn))/totalFlux < SMALL
+        && sum(mag(adjustableMassOut))/totalFlux < SMALL;
+}
+
+
+// ************************************************************************* //
diff --git a/src/overset/oversetAdjustPhi/oversetAdjustPhi.H b/src/overset/oversetAdjustPhi/oversetAdjustPhi.H
new file mode 100644
index 00000000000..1adfea339a6
--- /dev/null
+++ b/src/overset/oversetAdjustPhi/oversetAdjustPhi.H
@@ -0,0 +1,61 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+InNamespace
+    Foam
+
+Description
+    Adjust the balance of fluxes on the faces between interpolated
+    and calculated to obey continuity.
+
+SourceFiles
+    oversetAdjustPhi.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef oversetAdjustPhi_H
+#define oversetAdjustPhi_H
+
+#include "volFieldsFwd.H"
+#include "surfaceFieldsFwd.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+//- Adjust the balance of fluxes to obey continuity.
+//  Return true if no flux was adjusted.
+bool oversetAdjustPhi
+(
+    surfaceScalarField& phi,
+    const volVectorField& U
+);
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/overset/oversetPolyPatch/oversetFvPatch.C b/src/overset/oversetPolyPatch/oversetFvPatch.C
new file mode 100644
index 00000000000..1be8d160cb3
--- /dev/null
+++ b/src/overset/oversetPolyPatch/oversetFvPatch.C
@@ -0,0 +1,115 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "oversetFvPatch.H"
+#include "addToRunTimeSelectionTable.H"
+#include "fvMesh.H"
+#include "transform.H"
+#include "cellCellStencilObject.H"
+#include "volFields.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTypeNameAndDebug(oversetFvPatch, 0);
+    addToRunTimeSelectionTable(fvPatch, oversetFvPatch, polyPatch);
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+Foam::tmp<Foam::labelField> Foam::oversetFvPatch::interfaceInternalField
+(
+    const labelUList& internalData
+) const
+{
+    return patchInternalField(internalData);
+}
+
+
+Foam::tmp<Foam::labelField> Foam::oversetFvPatch::internalFieldTransfer
+(
+    const Pstream::commsTypes commsType,
+    const labelUList& restrictMap
+) const
+{
+    // Store the restrictMap. This routine gets used for
+    // - GAMGAgglomeration      : this is the use we want to intercept.
+    // - GAMGProcAgglomeration  : to find out the cell number on the other side
+    // - MGridGenGAMGAgglomeration: same
+    if (master())
+    {
+        restrictMap_ = restrictMap;
+    }
+
+    return patchInternalField(restrictMap);
+}
+
+
+const Foam::labelListList& Foam::oversetFvPatch::stencil() const
+{
+    const cellCellStencilObject& overlap = Stencil::New(boundaryMesh().mesh());
+
+    return overlap.cellStencil();
+}
+
+
+const Foam::mapDistribute& Foam::oversetFvPatch::cellInterpolationMap() const
+{
+    const cellCellStencilObject& overlap = Stencil::New(boundaryMesh().mesh());
+    return overlap.cellInterpolationMap();
+}
+
+
+const Foam::List<Foam::scalarList>&
+Foam::oversetFvPatch::cellInterpolationWeights() const
+{
+    const cellCellStencilObject& overlap = Stencil::New(boundaryMesh().mesh());
+    return overlap.cellInterpolationWeights();
+}
+
+
+const Foam::scalarField& Foam::oversetFvPatch::normalisation() const
+{
+    return boundaryMesh().mesh().V().field();
+}
+
+
+const Foam::labelList& Foam::oversetFvPatch::interpolationCells() const
+{
+    const cellCellStencilObject& overlap = Stencil::New(boundaryMesh().mesh());
+    return overlap.interpolationCells();
+}
+
+
+const Foam::scalarList& Foam::oversetFvPatch::cellInterpolationWeight() const
+{
+    const cellCellStencilObject& overlap = Stencil::New(boundaryMesh().mesh());
+    return overlap.cellInterpolationWeight();
+}
+
+
+// ************************************************************************* //
diff --git a/src/overset/oversetPolyPatch/oversetFvPatch.H b/src/overset/oversetPolyPatch/oversetFvPatch.H
new file mode 100644
index 00000000000..eaf4e4289a4
--- /dev/null
+++ b/src/overset/oversetPolyPatch/oversetFvPatch.H
@@ -0,0 +1,169 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::oversetFvPatch
+
+Description
+    Patch for indicating interpolated boundaries (in overset meshes).
+
+SourceFiles
+    oversetFvPatch.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef oversetFvPatch_H
+#define oversetFvPatch_H
+
+#include "fvPatch.H"
+#include "oversetPolyPatch.H"
+#include "fvBoundaryMesh.H"
+#include "lduInterface.H"
+#include "oversetLduInterface.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                      Class oversetFvPatch Declaration
+\*---------------------------------------------------------------------------*/
+
+class oversetFvPatch
+:
+    public lduInterface,
+    public oversetLduInterface,
+    public fvPatch
+{
+    // Private data
+
+        const oversetPolyPatch& oversetPolyPatch_;
+
+        //- Temporary copy of the fine level restrict map. Cleared upon
+        //  calculating stencils below
+        mutable labelList restrictMap_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName(oversetPolyPatch::typeName_());
+
+
+    // Constructors
+
+        //- Construct from polyPatch
+        oversetFvPatch(const polyPatch& patch, const fvBoundaryMesh& bm)
+        :
+            fvPatch(patch, bm),
+            oversetPolyPatch_(refCast<const oversetPolyPatch>(patch))
+        {}
+
+
+    // Member functions
+
+        // Access
+
+            //- Return local reference cast into the overset patch
+            const oversetPolyPatch& oversetPatch() const
+            {
+                return oversetPolyPatch_;
+            }
+
+
+        // Access
+
+            //- Return faceCell addressing
+            virtual const labelUList& faceCells() const
+            {
+                return oversetPolyPatch_.faceCells();
+            }
+
+
+        // Interface transfer functions
+
+            //- Return the values of the given internal data adjacent to
+            //  the interface as a field
+            virtual tmp<labelField> interfaceInternalField
+            (
+                const labelUList& internalData
+            ) const;
+
+            //- Return neighbour field
+            virtual tmp<labelField> internalFieldTransfer
+            (
+                const Pstream::commsTypes commsType,
+                const labelUList& internalData
+            ) const;
+
+
+        //- Overset interface functions
+
+            //- Name of interface (for debugging)
+            virtual const word& name() const
+            {
+                return oversetPolyPatch_.name();
+            }
+
+            //- Am I the master interface
+            virtual bool master() const
+            {
+                return oversetPolyPatch_.master();
+            }
+
+            //- GAMG restriction (fine-to-coarse)
+            virtual const labelList& restrictMap() const
+            {
+                return restrictMap_;
+            }
+
+            //- Donor stencil
+            virtual const labelListList& stencil() const;
+
+            //- Map for obtaining data in stencil order
+            virtual const mapDistribute& cellInterpolationMap() const;
+
+            //- Weights in stencil order
+            virtual const List<scalarList>& cellInterpolationWeights() const;
+
+            //- Normalisation of matrix; for explicit contributions
+            virtual const scalarField& normalisation() const;
+
+            //- Acceptor cells
+            virtual const labelList& interpolationCells() const;
+
+            //- Underrelaxation for acceptor cells
+            virtual const scalarList& cellInterpolationWeight() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/overset/oversetPolyPatch/oversetFvPatchField.C b/src/overset/oversetPolyPatch/oversetFvPatchField.C
new file mode 100644
index 00000000000..0d38b83514c
--- /dev/null
+++ b/src/overset/oversetPolyPatch/oversetFvPatchField.C
@@ -0,0 +1,354 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "volFields.H"
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+template<class Type>
+Foam::oversetFvPatchField<Type>::oversetFvPatchField
+(
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF
+)
+:
+    LduInterfaceField<Type>(refCast<const oversetFvPatch>(p)),
+    zeroGradientFvPatchField<Type>(p, iF),
+    oversetPatch_(refCast<const oversetFvPatch>(p))
+{}
+
+
+template<class Type>
+Foam::oversetFvPatchField<Type>::oversetFvPatchField
+(
+    const oversetFvPatchField<Type>& ptf,
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF,
+    const fvPatchFieldMapper& mapper
+)
+:
+    LduInterfaceField<Type>(refCast<const oversetFvPatch>(p)),
+    zeroGradientFvPatchField<Type>(ptf, p, iF, mapper),
+    oversetPatch_(refCast<const oversetFvPatch>(p))
+{
+    if (!isA<oversetFvPatch>(this->patch()))
+    {
+        FatalErrorInFunction
+            << "    patch type '" << p.type()
+            << "' not constraint type '" << typeName << "'"
+            << "\n    for patch " << p.name()
+            << " of field " << this->internalField().name()
+            << " in file " << this->internalField().objectPath()
+            << exit(FatalIOError);
+    }
+}
+
+
+template<class Type>
+Foam::oversetFvPatchField<Type>::oversetFvPatchField
+(
+    const fvPatch& p,
+    const DimensionedField<Type, volMesh>& iF,
+    const dictionary& dict
+)
+:
+    LduInterfaceField<Type>(refCast<const oversetFvPatch>(p)),
+    zeroGradientFvPatchField<Type>(p, iF, dict),
+    oversetPatch_(refCast<const oversetFvPatch>(p))
+{
+    if (!isA<oversetFvPatch>(p))
+    {
+        FatalIOErrorIn
+        (
+            "oversetFvPatchField<Type>::oversetFvPatchField"
+            "("
+                "const fvPatch&, "
+                "const DimensionedField<Type, volMesh>&, "
+                "const dictionary&"
+            ")",
+            dict
+        )   << "    patch type '" << p.type()
+            << "' not constraint type '" << typeName << "'"
+            << "\n    for patch " << p.name()
+            << " of field " << this->internalField().name()
+            << " in file " << this->internalField().objectPath()
+            << exit(FatalIOError);
+    }
+
+    if (!dict.found("value") && this->coupled())
+    {
+        this->evaluate(Pstream::commsTypes::blocking);
+    }
+}
+
+
+template<class Type>
+Foam::oversetFvPatchField<Type>::oversetFvPatchField
+(
+    const oversetFvPatchField<Type>& ptf
+)
+:
+    LduInterfaceField<Type>(ptf.oversetPatch_),
+    zeroGradientFvPatchField<Type>(ptf),
+    oversetPatch_(ptf.oversetPatch_)
+{}
+
+
+template<class Type>
+Foam::oversetFvPatchField<Type>::oversetFvPatchField
+(
+    const oversetFvPatchField<Type>& ptf,
+    const DimensionedField<Type, volMesh>& iF
+)
+:
+    LduInterfaceField<Type>(ptf.oversetPatch_),
+    zeroGradientFvPatchField<Type>(ptf, iF),
+    oversetPatch_(ptf.oversetPatch_)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+
+template<class Type>
+void Foam::oversetFvPatchField<Type>::initEvaluate
+(
+    const Pstream::commsTypes commsType
+)
+{
+    if (oversetPatch_.master())
+    {
+        // Trigger interpolation
+        const fvMesh& mesh = this->internalField().mesh();
+        const dictionary& fvSchemes = mesh.schemesDict();
+        const word& fldName = this->internalField().name();
+
+        if (&mesh.lduAddr() != &mesh.fvMesh::lduAddr())
+        {
+            // Running extended addressing. Interpolate always.
+            if (debug)
+            {
+                Info<< "Interpolating solved-for field " << fldName << endl;
+            }
+
+            // Interpolate without bc update (since would trigger infinite
+            // recursion back to oversetFvPatchField<Type>::evaluate)
+            // The only problem is bcs that use the new cell values
+            // (e.g. zeroGradient, processor). These need to appear -after-
+            // the 'overset' bc.
+            mesh.interpolate
+            (
+                const_cast<Field<Type>&>
+                (
+                    this->primitiveField()
+                )
+            );
+        }
+        else if
+        (
+           !fvSchemes.found("oversetInterpolation")
+        || !fvSchemes.found("oversetInterpolationRequired")
+        )
+        {
+            IOWarningInFunction(fvSchemes)
+                << "Missing required dictionary entries"
+                << " 'oversetInterpolation' and 'oversetInterpolationRequired'"
+                << ". Skipping overset interpolation for field "
+                << fldName << endl;
+        }
+        else
+        {
+            const dictionary& intDict = fvSchemes.subDict
+            (
+                "oversetInterpolationRequired"
+            );
+            if (intDict.found(fldName))
+            {
+                if (debug)
+                {
+                    Info<< "Interpolating field " << fldName << endl;
+                }
+
+                // Interpolate without bc update (since would trigger infinite
+                // recursion back to oversetFvPatchField<Type>::evaluate)
+                // The only problem is bcs that use the new cell values
+                // (e.g. zeroGradient, processor). These need to appear -after-
+                // the 'overset' bc.
+                mesh.interpolate
+                (
+                    const_cast<Field<Type>&>
+                    (
+                        this->primitiveField()
+                    )
+                );
+            }
+            else if (debug)
+            {
+                Info<< "Skipping overset interpolation for field "
+                    << fldName << endl;
+            }
+        }
+    }
+}
+
+
+template<class Type>
+void Foam::oversetFvPatchField<Type>::evaluate(const Pstream::commsTypes)
+{
+    if (!this->updated())
+    {
+        this->updateCoeffs();
+    }
+
+    zeroGradientFvPatchField<Type>::evaluate();
+}
+
+
+template<class Type>
+void Foam::oversetFvPatchField<Type>::initInterfaceMatrixUpdate
+(
+    scalarField& result,
+    const bool add,
+    const scalarField& psiInternal,
+    const scalarField& coeffs,
+    const direction cmpt,
+    const Pstream::commsTypes commsType
+) const
+{}
+
+
+template<class Type>
+void Foam::oversetFvPatchField<Type>::updateInterfaceMatrix
+(
+    scalarField& result,
+    const bool add,
+    const scalarField& psiInternal,
+    const scalarField& coeffs,
+    const direction cmpt,
+    const Pstream::commsTypes
+) const
+{
+    // Add remote values
+    if (oversetPatch_.master())
+    {
+        const fvMesh& mesh = this->patch().boundaryMesh().mesh();
+
+        // Try to find out if the solve routine comes from the mesh
+        // TBD. This should be cleaner.
+        if (&mesh.lduAddr() == &mesh.fvMesh::lduAddr())
+        {
+            //Pout<< "** not running extended addressing..." << endl;
+            return;
+        }
+
+        const labelListList& stencil = oversetPatch_.stencil();
+
+        if (stencil.size() != psiInternal.size())
+        {
+            FatalErrorInFunction << "psiInternal:" << psiInternal.size()
+                << " stencil:" << stencil.size() << exit(FatalError);
+        }
+
+        const mapDistribute& map = oversetPatch_.cellInterpolationMap();
+        const List<scalarList>& wghts =
+            oversetPatch_.cellInterpolationWeights();
+        const labelList& cellIDs = oversetPatch_.interpolationCells();
+        const scalarList& factor = oversetPatch_.cellInterpolationWeight();
+        const scalarField& normalisation = oversetPatch_.normalisation();
+
+
+        // Since we're inside initEvaluate/evaluate there might be processor
+        // comms underway. Change the tag we use.
+        scalarField work(psiInternal);
+        map.mapDistributeBase::distribute(work, UPstream::msgType()+1);
+
+        forAll(cellIDs, i)
+        {
+            label celli = cellIDs[i];
+
+            const scalarList& w = wghts[celli];
+            const labelList& nbrs = stencil[celli];
+            scalar f = factor[celli];
+            const scalar norm = normalisation[celli];
+
+            // Add the non-local matrix contribution to psi. Note that the
+            // matrix coefficients are -weights
+
+            if (add)
+            {
+                f = -1.0*f;
+            }
+
+            forAll(nbrs, nbrI)
+            {
+                label slotI = nbrs[nbrI];
+                if (slotI >= psiInternal.size())
+                {
+                    result[celli] += f*norm*w[nbrI]*work[slotI];
+                }
+            }
+        }
+    }
+}
+
+
+template<class Type>
+void Foam::oversetFvPatchField<Type>::initInterfaceMatrixUpdate
+(
+    Field<Type>&,
+    const bool add,
+    const Field<Type>&,
+    const scalarField&,
+    const Pstream::commsTypes commsType
+) const
+{
+    NotImplemented;
+}
+
+
+template<class Type>
+void Foam::oversetFvPatchField<Type>::updateInterfaceMatrix
+(
+    Field<Type>& result,
+    const bool add,
+    const Field<Type>& psiInternal,
+    const scalarField&,
+    const Pstream::commsTypes
+) const
+{
+    NotImplemented;
+}
+
+
+template<class Type>
+void Foam::oversetFvPatchField<Type>::write(Ostream& os) const
+{
+    zeroGradientFvPatchField<Type>::write(os);
+    // Make sure to write the value for ease of postprocessing.
+    this->writeEntry("value", os);
+}
+
+
+// ************************************************************************* //
diff --git a/src/overset/oversetPolyPatch/oversetFvPatchField.H b/src/overset/oversetPolyPatch/oversetFvPatchField.H
new file mode 100644
index 00000000000..3a337996ee6
--- /dev/null
+++ b/src/overset/oversetPolyPatch/oversetFvPatchField.H
@@ -0,0 +1,217 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::oversetFvPatchField
+
+Group
+    grpCoupledBoundaryConditions
+
+Description
+
+SeeAlso
+
+SourceFiles
+    oversetFvPatchField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef oversetFvPatchField_H
+#define oversetFvPatchField_H
+
+#include "oversetFvPatch.H"
+#include "zeroGradientFvPatchField.H"
+#include "LduInterfaceField.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                      Class oversetFvPatchField Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class Type>
+class oversetFvPatchField
+:
+    public LduInterfaceField<Type>,
+    public zeroGradientFvPatchField<Type>
+{
+    // Private data
+
+        //- Local reference cast into the overset patch
+        const oversetFvPatch& oversetPatch_;
+
+        //- Master patch ID
+        mutable label masterPatchID_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName(oversetFvPatch::typeName_());
+
+
+    // Constructors
+
+        //- Construct from patch and internal field
+        oversetFvPatchField
+        (
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&
+        );
+
+        //- Construct from patch, internal field and dictionary
+        oversetFvPatchField
+        (
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&,
+            const dictionary&
+        );
+
+        //- Construct by mapping given oversetFvPatchField onto a new patch
+        oversetFvPatchField
+        (
+            const oversetFvPatchField<Type>&,
+            const fvPatch&,
+            const DimensionedField<Type, volMesh>&,
+            const fvPatchFieldMapper&
+        );
+
+        //- Construct as copy
+        oversetFvPatchField(const oversetFvPatchField<Type>&);
+
+        //- Construct and return a clone
+        virtual tmp<fvPatchField<Type> > clone() const
+        {
+            return tmp<fvPatchField<Type> >
+            (
+                new oversetFvPatchField<Type>(*this)
+            );
+        }
+
+        //- Construct as copy setting internal field reference
+        oversetFvPatchField
+        (
+            const oversetFvPatchField<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 oversetFvPatchField<Type>(*this, iF)
+            );
+        }
+
+
+    // Member functions
+
+        // Access
+
+            //- Return local reference cast into the cyclic AMI patch
+            const oversetFvPatch& oversetPatch() const
+            {
+                return oversetPatch_;
+            }
+
+
+        // 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);
+
+            //- Initialise neighbour matrix update
+            virtual void initInterfaceMatrixUpdate
+            (
+                scalarField&,
+                const bool add,
+                const scalarField&,
+                const scalarField&,
+                const direction,
+                const Pstream::commsTypes commsType
+            ) const;
+
+            //- Update result field based on interface functionality
+            virtual void updateInterfaceMatrix
+            (
+                scalarField& result,
+                const bool add,
+                const scalarField& psiInternal,
+                const scalarField& coeffs,
+                const direction cmpt,
+                const Pstream::commsTypes commsType
+            ) const;
+
+            //- Initialise neighbour matrix update
+            virtual void initInterfaceMatrixUpdate
+            (
+                Field<Type>&,
+                const bool add,
+                const Field<Type>&,
+                const scalarField&,
+                const Pstream::commsTypes commsType
+            ) const;
+
+            //- Update result field based on interface functionality
+            virtual void updateInterfaceMatrix
+            (
+                Field<Type>&,
+                const bool add,
+                const Field<Type>&,
+                const scalarField&,
+                const Pstream::commsTypes commsType
+            ) const;
+
+
+        // I-O
+
+            //- Write
+            virtual void write(Ostream& os) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#   include "oversetFvPatchField.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/overset/oversetPolyPatch/oversetFvPatchFields.C b/src/overset/oversetPolyPatch/oversetFvPatchFields.C
new file mode 100644
index 00000000000..27f04e81b98
--- /dev/null
+++ b/src/overset/oversetPolyPatch/oversetFvPatchFields.C
@@ -0,0 +1,43 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "oversetFvPatchFields.H"
+#include "addToRunTimeSelectionTable.H"
+#include "volFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+makePatchFields(overset);
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/overset/oversetPolyPatch/oversetFvPatchFields.H b/src/overset/oversetPolyPatch/oversetFvPatchFields.H
new file mode 100644
index 00000000000..7c1dde9fbb4
--- /dev/null
+++ b/src/overset/oversetPolyPatch/oversetFvPatchFields.H
@@ -0,0 +1,49 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef oversetFvPatchFields_H
+#define oversetFvPatchFields_H
+
+#include "oversetFvPatchField.H"
+#include "fieldTypes.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+makePatchTypeFieldTypedefs(overset);
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/overset/oversetPolyPatch/oversetFvsPatchFields.C b/src/overset/oversetPolyPatch/oversetFvsPatchFields.C
new file mode 100644
index 00000000000..4c58c315193
--- /dev/null
+++ b/src/overset/oversetPolyPatch/oversetFvsPatchFields.C
@@ -0,0 +1,79 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "oversetFvPatchField.H"
+#include "calculatedFvsPatchFields.H"
+#include "fvsPatchFields.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+addNamedToRunTimeSelectionTable
+(
+    fvsPatchScalarField,
+    calculatedFvsPatchScalarField,
+    patch,
+    overset
+);
+addNamedToRunTimeSelectionTable
+(
+    fvsPatchVectorField,
+    calculatedFvsPatchVectorField,
+    patch,
+    overset
+);
+addNamedToRunTimeSelectionTable
+(
+    fvsPatchSphericalTensorField,
+    calculatedFvsPatchSphericalTensorField,
+    patch,
+    overset
+);
+addNamedToRunTimeSelectionTable
+(
+    fvsPatchSymmTensorField,
+    calculatedFvsPatchSymmTensorField,
+    patch,
+    overset
+);
+addNamedToRunTimeSelectionTable
+(
+    fvsPatchTensorField,
+    calculatedFvsPatchTensorField,
+    patch,
+    overset
+);
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/overset/oversetPolyPatch/oversetGAMGInterface.C b/src/overset/oversetPolyPatch/oversetGAMGInterface.C
new file mode 100644
index 00000000000..e4155338355
--- /dev/null
+++ b/src/overset/oversetPolyPatch/oversetGAMGInterface.C
@@ -0,0 +1,264 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "oversetGAMGInterface.H"
+#include "addToRunTimeSelectionTable.H"
+#include "Map.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTypeNameAndDebug(oversetGAMGInterface, 0);
+    addToRunTimeSelectionTable
+    (
+        GAMGInterface,
+        oversetGAMGInterface,
+        lduInterface
+    );
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::oversetGAMGInterface::oversetGAMGInterface
+(
+    const label index,
+    const lduInterfacePtrsList& coarseInterfaces,
+    const lduInterface& fineInterface,
+    const labelField& localRestrictAddressing,
+    const labelField& neighbourRestrictAddressing,
+    const label fineLevelIndex,
+    const label coarseComm
+)
+:
+    GAMGInterface(index, coarseInterfaces),
+    fineOversetInterface_
+    (
+        refCast<const oversetLduInterface>(fineInterface)
+    )
+{
+    //Pout<< "Constructing oversetGAMGInterface index:" << index
+    //    << " from:" << fineOversetInterface_.name()
+    //    << " size:" << localRestrictAddressing.size()
+    //    << endl;
+
+    // From coarse face to coarse cell
+    DynamicList<label> dynFaceCells(localRestrictAddressing.size());
+    // From fine face to coarse face
+    DynamicList<label> dynFaceRestrictAddressing(dynFaceCells.size());
+
+
+    // From coarse cell to coarse face
+    Map<label> cellToCoarseFace(dynFaceCells.size());
+
+    // Construct face agglomeration from cell agglomeration
+    forAll(localRestrictAddressing, ffi)
+    {
+        // Get coarse cell
+        label coarseCelli = localRestrictAddressing[ffi];
+
+        // Do we have coarse face for it?
+        Map<label>::iterator iter = cellToCoarseFace.find(coarseCelli);
+        if (iter == cellToCoarseFace.end())
+        {
+            label coarseFacei = dynFaceCells.size();
+            cellToCoarseFace.insert(coarseCelli, coarseFacei);
+            dynFaceCells.append(coarseCelli);
+            dynFaceRestrictAddressing.append(coarseFacei);
+        }
+        else
+        {
+            dynFaceRestrictAddressing.append(iter());
+        }
+    }
+
+    faceCells_.transfer(dynFaceCells);
+    faceRestrictAddressing_.transfer(dynFaceRestrictAddressing);
+
+    //Pout<< "** Constructed interface:" << name()
+    //    << " of size:" << size() << endl;
+
+
+    // Determine this level's stencil from the fine stencil
+    if (master())
+    {
+        const mapDistribute& fineMap =
+            fineOversetInterface_.cellInterpolationMap();
+        const List<scalarList>& fineWghts =
+            fineOversetInterface_.cellInterpolationWeights();
+        const labelListList& fineStencil = fineOversetInterface_.stencil();
+        const labelList& fineCellIDs =
+            fineOversetInterface_.interpolationCells();
+        const scalarList& fineFactor =
+            fineOversetInterface_.cellInterpolationWeight();
+        const scalarField& fineNorm = fineOversetInterface_.normalisation();
+        const labelList& restrictMap = fineOversetInterface_.restrictMap();
+
+
+        if (localRestrictAddressing.size() && restrictMap.empty())
+        {
+            FatalErrorInFunction
+                << "The restrict addressing has not been saved on interface "
+                << this->name()
+                << ". This gets stored when running internalFieldTransfer"
+                << exit(FatalError);
+        }
+
+
+        // 'Interpolate' the restrict map so locally we know what the remote
+        // cells are going to be.
+
+        label nCoarseCells = max(restrictMap)+1;
+        globalIndex globalNumbering(nCoarseCells);
+
+        labelList globalCoarseIDs(restrictMap.size());
+        forAll(restrictMap, fineCelli)
+        {
+            globalCoarseIDs[fineCelli] =
+                globalNumbering.toGlobal(restrictMap[fineCelli]);
+        }
+        fineMap.distribute(globalCoarseIDs);
+
+        //Pout<< this->name()
+        //    << " index:" << index
+        //    << " size:" << this->size()
+        //    << " restrictMap:" << restrictMap.size()
+        //    << " fineNumInterpolate:" << fineCellIDs.size()
+        //    << " nCoarseCells:" << nCoarseCells
+        //    << endl;
+
+
+
+        // Accumulate the coarse level stencil
+
+        // Number of fine cells contributing to the coarse cell
+        labelList nFineCells(nCoarseCells, 0);
+
+        stencil_.setSize(nCoarseCells);
+        cellInterpolationWeights_.setSize(nCoarseCells);
+        cellInterpolationWeight_.setSize(nCoarseCells, 0.0);
+        normalisation_.setSize(nCoarseCells, 0.0);
+
+        forAll(fineCellIDs, i)
+        {
+            label fineCelli = fineCellIDs[i];
+            label coarseCelli = restrictMap[fineCelli];
+
+            const scalarList& w = fineWghts[fineCelli];
+            const labelList& nbrs = fineStencil[fineCelli];
+
+            // Accumulate stencil
+
+            labelList& coarseStencil = stencil_[coarseCelli];
+            scalarList& coarseWghts = cellInterpolationWeights_[coarseCelli];
+
+            label sz = coarseStencil.size();
+            coarseStencil.setSize(sz+nbrs.size());
+            coarseWghts.setSize(coarseStencil.size());
+
+            forAll(nbrs, i)
+            {
+                coarseStencil[sz] = globalCoarseIDs[nbrs[i]];
+                coarseWghts[sz] = w[i];
+                sz++;
+            }
+
+            // Accumulate weight
+            cellInterpolationWeight_[coarseCelli] += fineFactor[fineCelli];
+            normalisation_[coarseCelli] += fineNorm[fineCelli];
+            nFineCells[coarseCelli]++;
+        }
+
+        // Normalise weight (0 .. 1). Take average? Volume average? Min? Max?
+        forAll(nFineCells, coarseCelli)
+        {
+            label nAvg = nFineCells[coarseCelli];
+            if (nAvg > 0)
+            {
+                cellInterpolationWeight_[coarseCelli] /= nAvg;
+            }
+        }
+
+
+        // Work the stencil back from global cells into a mapDistribute
+        // + slots
+        List<Map<label>> compactMap;
+        mapPtr_.reset(new mapDistribute(globalNumbering, stencil_, compactMap));
+
+
+        // Determine the interpolationCells
+        label nInterpolate = 0;
+        forAll(stencil_, coarseCelli)
+        {
+            if (stencil_[coarseCelli].size())
+            {
+                nInterpolate++;
+            }
+        }
+
+        //Pout<< this->name() << " nInterpolate:" << nInterpolate << endl;
+
+        interpolationCells_.setSize(nInterpolate);
+        nInterpolate = 0;
+        forAll(stencil_, coarseCelli)
+        {
+            if (stencil_[coarseCelli].size())
+            {
+                interpolationCells_[nInterpolate++] = coarseCelli;
+            }
+        }
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::oversetGAMGInterface::~oversetGAMGInterface()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+Foam::tmp<Foam::labelField> Foam::oversetGAMGInterface::internalFieldTransfer
+(
+    const Pstream::commsTypes,
+    const labelUList& restrictMap
+) const
+{
+    // Store the restrictMap. This routine gets used for
+    // - GAMGAgglomeration      : this is the use we want to intercept.
+    // - GAMGProcAgglomeration  : to find out the cell number on the other side
+    // - MGridGenGAMGAgglomeration: same
+    if (master())
+    {
+        restrictMap_ = restrictMap;
+    }
+
+    return tmp<labelField>(new labelField(restrictMap, faceCells()));
+}
+
+
+// ************************************************************************* //
diff --git a/src/overset/oversetPolyPatch/oversetGAMGInterface.H b/src/overset/oversetPolyPatch/oversetGAMGInterface.H
new file mode 100644
index 00000000000..3f9105b612e
--- /dev/null
+++ b/src/overset/oversetPolyPatch/oversetGAMGInterface.H
@@ -0,0 +1,202 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::oversetGAMGInterface
+
+Description
+    GAMG agglomerated overset interface.
+
+SourceFiles
+    oversetGAMGInterface.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef oversetGAMGInterface_H
+#define oversetGAMGInterface_H
+
+#include "GAMGInterface.H"
+#include "oversetLduInterface.H"
+#include "mapDistribute.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                  Class oversetGAMGInterface Declaration
+\*---------------------------------------------------------------------------*/
+
+class oversetGAMGInterface
+:
+    public GAMGInterface,
+    virtual public oversetLduInterface
+{
+    // Private data
+
+        //- Reference for the oversetLduInterface from which this is
+        //  agglomerated
+        const oversetLduInterface& fineOversetInterface_;
+
+        //- Temporary copy of the fine level restrict map. Cleared upon
+        //  calculating stencils below
+        mutable labelList restrictMap_;
+
+        labelListList stencil_;
+
+        autoPtr<mapDistribute> mapPtr_;
+
+        List<scalarList> cellInterpolationWeights_;
+
+        scalarField normalisation_;
+
+        labelList interpolationCells_;
+
+        scalarList cellInterpolationWeight_;
+
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        oversetGAMGInterface(const oversetGAMGInterface&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const oversetGAMGInterface&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("overset");
+
+
+    // Constructors
+
+        //- Construct from fine level interface,
+        //  local and neighbour restrict addressing
+        oversetGAMGInterface
+        (
+            const label index,
+            const lduInterfacePtrsList& coarseInterfaces,
+            const lduInterface& fineInterface,
+            const labelField& localRestrictAddressing,
+            const labelField& neighbourRestrictAddressing,
+            const label fineLevelIndex,
+            const label coarseComm
+        );
+
+
+    //- Destructor
+    virtual ~oversetGAMGInterface();
+
+
+    // Member Functions
+
+        // Interface transfer functions
+
+            //- Transfer and return internal field adjacent to the interface
+            virtual tmp<labelField> internalFieldTransfer
+            (
+                const Pstream::commsTypes commsType,
+                const labelUList& iF
+            ) const;
+
+
+        //- Overset interface functions
+
+            //- Name of lduInterface
+            virtual const word& name() const
+            {
+                return fineOversetInterface_.name();
+            }
+
+            //- Am I the master interface
+            virtual bool master() const
+            {
+                return fineOversetInterface_.master();
+            }
+
+            //- GAMG restriction (fine-to-coarse)
+            virtual const labelList& restrictMap() const
+            {
+                return restrictMap_;
+            }
+
+            //- Donor stencil
+            virtual const labelListList& stencil() const
+            {
+                return stencil_;
+            }
+
+            //- Map for obtaining data in stencil order
+            virtual const mapDistribute& cellInterpolationMap() const
+            {
+                return mapPtr_();
+            }
+
+            //- Weights in stencil order
+            virtual const List<scalarList>& cellInterpolationWeights() const
+            {
+                return cellInterpolationWeights_;
+            }
+
+            //- Normalisation ot matrix; for explicit contributions
+            virtual const scalarField& normalisation() const
+            {
+                return normalisation_;
+            }
+
+            //- Acceptor cells
+            virtual const labelList& interpolationCells() const
+            {
+                return interpolationCells_;
+            }
+
+            //- Underrelaxation for acceptor cells
+            virtual const scalarList& cellInterpolationWeight() const
+            {
+                return cellInterpolationWeight_;
+            }
+
+
+        // I/O
+
+            //- Write to stream
+            virtual void write(Ostream&) const
+            {
+                //TBD.
+                NotImplemented;
+            }
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/overset/oversetPolyPatch/oversetGAMGInterfaceField.C b/src/overset/oversetPolyPatch/oversetGAMGInterfaceField.C
new file mode 100644
index 00000000000..b3c33752098
--- /dev/null
+++ b/src/overset/oversetPolyPatch/oversetGAMGInterfaceField.C
@@ -0,0 +1,152 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "oversetGAMGInterfaceField.H"
+#include "addToRunTimeSelectionTable.H"
+#include "lduMatrix.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTypeNameAndDebug(oversetGAMGInterfaceField, 0);
+    addToRunTimeSelectionTable
+    (
+        GAMGInterfaceField,
+        oversetGAMGInterfaceField,
+        lduInterfaceField
+    );
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::oversetGAMGInterfaceField::oversetGAMGInterfaceField
+(
+    const GAMGInterface& GAMGCp,
+    const lduInterfaceField& fineInterface
+)
+:
+    GAMGInterfaceField(GAMGCp, fineInterface),
+    oversetInterface_(refCast<const oversetGAMGInterface>(GAMGCp))
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::oversetGAMGInterfaceField::~oversetGAMGInterfaceField()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void Foam::oversetGAMGInterfaceField::updateInterfaceMatrix
+(
+    scalarField& result,
+    const bool add,
+    const scalarField& psiInternal,
+    const scalarField& coeffs,
+    const direction cmpt,
+    const Pstream::commsTypes commsType
+) const
+{
+    //Pout<< "oversetGAMGInterfaceField::updateInterfaceMatrix: at:"
+    //    << oversetInterface_.name()
+    //    << " nCells:" << result.size() << endl;
+    //
+    // Add remote values
+    if (oversetInterface_.master())
+    {
+        const labelListList& stencil = oversetInterface_.stencil();
+
+        if (stencil.size() != psiInternal.size())
+        {
+            FatalErrorInFunction << "psiInternal:" << psiInternal.size()
+                << " stencil:" << stencil.size() << exit(FatalError);
+        }
+
+        const mapDistribute& map = oversetInterface_.cellInterpolationMap();
+        const List<scalarList>& wghts =
+            oversetInterface_.cellInterpolationWeights();
+        const labelList& cellIDs = oversetInterface_.interpolationCells();
+        const scalarList& factor = oversetInterface_.cellInterpolationWeight();
+        const scalarField& normalisation = oversetInterface_.normalisation();
+
+        scalarField work(psiInternal);
+        map.mapDistributeBase::distribute(work, UPstream::msgType()+1);
+
+        forAll(cellIDs, i)
+        {
+            label celli = cellIDs[i];
+
+            const scalarList& w = wghts[celli];
+            const labelList& nbrs = stencil[celli];
+            const scalar f = factor[celli];
+
+            bool hasRemote = false;
+            forAll(nbrs, nbrI)
+            {
+                label slotI = nbrs[nbrI];
+                if (slotI >= psiInternal.size())
+                {
+                    hasRemote = true;
+                    break;
+                }
+            }
+
+            if (hasRemote)
+            {
+                //Pout<< "oversetGAMGInterfaceField : Interpolating " << celli
+                //    << " from remote values (if any):" << endl;
+                scalar s(0.0);
+                forAll(nbrs, nbrI)
+                {
+                    label slotI = nbrs[nbrI];
+                    if (slotI >= psiInternal.size())
+                    {
+                        //Pout<< "    remote value " << work[slotI]
+                        //    << " from slot " << slotI << " with w:" << w[nbrI]
+                        //    << endl;
+                        s += w[nbrI]*work[slotI];
+                    }
+                }
+                //Pout<< "oversetGAMGInterfaceField : Interpolated value:"
+                //    << s << endl;
+                //scalar oldPsi = result[celli];
+                if (add)
+                {
+                    s = -1.0*s;
+                }
+
+                result[celli] += normalisation[celli]*f*s;
+                //Pout<< "oversetGAMGInterfaceField : result was:" << oldPsi
+                //    << " now:" << result[celli] << endl;
+            }
+        }
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/src/overset/oversetPolyPatch/oversetGAMGInterfaceField.H b/src/overset/oversetPolyPatch/oversetGAMGInterfaceField.H
new file mode 100644
index 00000000000..3cd44fa3dba
--- /dev/null
+++ b/src/overset/oversetPolyPatch/oversetGAMGInterfaceField.H
@@ -0,0 +1,124 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::oversetGAMGInterfaceField
+
+Description
+    GAMG agglomerated processor interface field.
+
+SourceFiles
+    processorGAMGInterfaceField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef oversetGAMGInterfaceField_H
+#define oversetGAMGInterfaceField_H
+
+#include "GAMGInterfaceField.H"
+#include "oversetGAMGInterface.H"
+#include "processorLduInterfaceField.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                  Class oversetGAMGInterfaceField Declaration
+\*---------------------------------------------------------------------------*/
+
+class oversetGAMGInterfaceField
+:
+    public GAMGInterfaceField
+{
+    // Private data
+
+        //- Local reference cast into the interface
+        const oversetGAMGInterface& oversetInterface_;
+
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        oversetGAMGInterfaceField(const oversetGAMGInterfaceField&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const oversetGAMGInterfaceField&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("overset");
+
+
+    // Constructors
+
+        //- Construct from GAMG interface and fine level interface field
+        oversetGAMGInterfaceField
+        (
+            const GAMGInterface& GAMGCp,
+            const lduInterfaceField& fineInterface
+        );
+
+
+    //- Destructor
+    virtual ~oversetGAMGInterfaceField();
+
+
+    // Member Functions
+
+        // Access
+
+            //- Return size
+            label size() const
+            {
+                return oversetInterface_.size();
+            }
+
+
+        // Interface matrix update
+
+            //- Update result field based on interface functionality
+            virtual void updateInterfaceMatrix
+            (
+                scalarField& result,
+                const bool add,
+                const scalarField& psiInternal,
+                const scalarField& coeffs,
+                const direction cmpt,
+                const Pstream::commsTypes commsType
+            ) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/overset/oversetPolyPatch/oversetLduInterface.C b/src/overset/oversetPolyPatch/oversetLduInterface.C
new file mode 100644
index 00000000000..ec04070196a
--- /dev/null
+++ b/src/overset/oversetPolyPatch/oversetLduInterface.C
@@ -0,0 +1,42 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "oversetLduInterface.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+defineTypeNameAndDebug(oversetLduInterface, 0);
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::oversetLduInterface::~oversetLduInterface()
+{}
+
+
+// ************************************************************************* //
diff --git a/src/overset/oversetPolyPatch/oversetLduInterface.H b/src/overset/oversetPolyPatch/oversetLduInterface.H
new file mode 100644
index 00000000000..537def21642
--- /dev/null
+++ b/src/overset/oversetPolyPatch/oversetLduInterface.H
@@ -0,0 +1,111 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::oversetLduInterface
+
+Description
+    An abstract base class for overset coupled interfaces
+
+SourceFiles
+    oversetLduInterface.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef oversetLduInterface_H
+#define oversetLduInterface_H
+
+#include "mapDistribute.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                      Class oversetLduInterface Declaration
+\*---------------------------------------------------------------------------*/
+
+class oversetLduInterface
+{
+
+public:
+
+    //- Runtime type information
+    TypeName("oversetLduInterface");
+
+
+    // Constructors
+
+        //- Construct null
+        oversetLduInterface()
+        {}
+
+
+    //- Destructor
+    virtual ~oversetLduInterface();
+
+
+    // Member Functions
+
+        // Access
+
+            //- Name of interface (for debugging)
+            virtual const word& name() const = 0;
+
+            //- Am I the master interface
+            virtual bool master() const = 0;
+
+            //- GAMG restriction (fine-to-coarse)
+            virtual const labelList& restrictMap() const = 0;
+
+            //- Donor stencil
+            virtual const labelListList& stencil() const = 0;
+
+            //- Map for obtaining data in stencil order
+            virtual const mapDistribute& cellInterpolationMap() const = 0;
+
+            //- Weights in stencil order
+            virtual const List<scalarList>&
+            cellInterpolationWeights() const = 0;
+
+            //- Normalisation of matrix; for explicit contributions
+            virtual const scalarField& normalisation() const = 0;
+
+            //- Acceptor cells
+            virtual const labelList& interpolationCells() const = 0;
+
+            //- Underrelaxation for acceptor cells
+            virtual const scalarList& cellInterpolationWeight() const = 0;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/overset/oversetPolyPatch/oversetPointPatch.C b/src/overset/oversetPolyPatch/oversetPointPatch.C
new file mode 100644
index 00000000000..15f4a37e0c7
--- /dev/null
+++ b/src/overset/oversetPolyPatch/oversetPointPatch.C
@@ -0,0 +1,49 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "facePointPatch.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+addNamedToRunTimeSelectionTable
+(
+    facePointPatch,
+    facePointPatch,
+    polyPatch,
+    overset
+);
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/overset/oversetPolyPatch/oversetPointPatchFields.C b/src/overset/oversetPolyPatch/oversetPointPatchFields.C
new file mode 100644
index 00000000000..c8c0168df34
--- /dev/null
+++ b/src/overset/oversetPolyPatch/oversetPointPatchFields.C
@@ -0,0 +1,78 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "slipPointPatchFields.H"
+#include "pointPatchFields.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+addNamedToRunTimeSelectionTable
+(
+    pointPatchScalarField,
+    slipPointPatchScalarField,
+    pointPatch,
+    overset
+);
+addNamedToRunTimeSelectionTable
+(
+    pointPatchVectorField,
+    slipPointPatchVectorField,
+    pointPatch,
+    overset
+);
+addNamedToRunTimeSelectionTable
+(
+    pointPatchSphericalTensorField,
+    slipPointPatchSphericalTensorField,
+    pointPatch,
+    overset
+);
+addNamedToRunTimeSelectionTable
+(
+    pointPatchSymmTensorField,
+    slipPointPatchSymmTensorField,
+    pointPatch,
+    overset
+);
+addNamedToRunTimeSelectionTable
+(
+    pointPatchTensorField,
+    slipPointPatchTensorField,
+    pointPatch,
+    overset
+);
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/overset/oversetPolyPatch/oversetPolyPatch.C b/src/overset/oversetPolyPatch/oversetPolyPatch.C
new file mode 100644
index 00000000000..ddce16ae7c6
--- /dev/null
+++ b/src/overset/oversetPolyPatch/oversetPolyPatch.C
@@ -0,0 +1,159 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "oversetPolyPatch.H"
+#include "addToRunTimeSelectionTable.H"
+#include "polyBoundaryMesh.H"
+#include "processorPolyPatch.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTypeNameAndDebug(oversetPolyPatch, 0);
+
+    addToRunTimeSelectionTable(polyPatch, oversetPolyPatch, word);
+    addToRunTimeSelectionTable(polyPatch, oversetPolyPatch, dictionary);
+}
+
+// * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * * * * * //
+
+Foam::oversetPolyPatch::oversetPolyPatch
+(
+    const word& name,
+    const label size,
+    const label start,
+    const label index,
+    const polyBoundaryMesh& bm,
+    const word& patchType
+)
+:
+    polyPatch(name, size, start, index, bm, patchType),
+    masterPatchID_(-1)
+{
+    //  'overset' is not constraint type so add to group explicitly
+    if (findIndex(inGroups(), typeName) == -1)
+    {
+        inGroups().append(typeName);
+    }
+}
+
+
+Foam::oversetPolyPatch::oversetPolyPatch
+(
+    const word& name,
+    const dictionary& dict,
+    const label index,
+    const polyBoundaryMesh& bm,
+    const word& patchType
+)
+:
+    polyPatch(name, dict, index, bm, patchType),
+    masterPatchID_(-1)
+{
+    //  'overset' is not constraint type so add to group explicitly
+    if (findIndex(inGroups(), typeName) == -1)
+    {
+        inGroups().append(typeName);
+    }
+}
+
+
+Foam::oversetPolyPatch::oversetPolyPatch
+(
+    const oversetPolyPatch& pp,
+    const polyBoundaryMesh& bm
+)
+:
+    polyPatch(pp, bm),
+    masterPatchID_(-1)
+{}
+
+
+Foam::oversetPolyPatch::oversetPolyPatch
+(
+    const oversetPolyPatch& pp,
+    const polyBoundaryMesh& bm,
+    const label index,
+    const label newSize,
+    const label newStart
+)
+:
+    polyPatch(pp, bm, index, newSize, newStart),
+    masterPatchID_(-1)
+{}
+
+
+Foam::oversetPolyPatch::oversetPolyPatch
+(
+    const oversetPolyPatch& pp,
+    const polyBoundaryMesh& bm,
+    const label index,
+    const labelUList& mapAddressing,
+    const label newStart
+)
+:
+    polyPatch(pp, bm, index, mapAddressing, newStart),
+    masterPatchID_(-1)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::oversetPolyPatch::~oversetPolyPatch()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::oversetPolyPatch::master() const
+{
+    if (masterPatchID_ == -1)
+    {
+        // Find lowest numbered overset patch
+        const polyBoundaryMesh& pbm = boundaryMesh();
+
+        forAll(pbm, patchi)
+        {
+            if (isA<oversetPolyPatch>(pbm[patchi]))
+            {
+                masterPatchID_ = patchi;
+                break;
+            }
+        }
+
+        if (masterPatchID_ != -1 && masterPatchID_ > 0)
+        {
+            WarningInFunction<< "The master overset patch is not the"
+                << " first patch. Generally the first patch should be an"
+                << " overset patch to guarantee consistent operation." << endl;
+        }
+    }
+
+    return index() == masterPatchID_;
+}
+
+
+// ************************************************************************* //
diff --git a/src/overset/oversetPolyPatch/oversetPolyPatch.H b/src/overset/oversetPolyPatch/oversetPolyPatch.H
new file mode 100644
index 00000000000..52eba954f2d
--- /dev/null
+++ b/src/overset/oversetPolyPatch/oversetPolyPatch.H
@@ -0,0 +1,185 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::oversetPolyPatch
+
+Description
+    Patch for indicating interpolated boundaries (in overset meshes).
+
+SourceFiles
+    oversetPolyPatch.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef oversetPolyPatch_H
+#define oversetPolyPatch_H
+
+#include "polyPatch.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+class polyMesh;
+
+/*---------------------------------------------------------------------------*\
+                      Class oversetPolyPatch Declaration
+\*---------------------------------------------------------------------------*/
+
+class oversetPolyPatch
+:
+    public polyPatch
+{
+    // Private data
+
+        //- Master patch ID
+        mutable label masterPatchID_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("overset");
+
+
+    // Constructors
+
+        //- Construct from components
+        oversetPolyPatch
+        (
+            const word& name,
+            const label size,
+            const label start,
+            const label index,
+            const polyBoundaryMesh& bm,
+            const word& patchType
+        );
+
+        //- Construct from dictionary
+        oversetPolyPatch
+        (
+            const word& name,
+            const dictionary& dict,
+            const label index,
+            const polyBoundaryMesh& bm,
+            const word& patchType
+        );
+
+
+        //- Construct as copy, resetting the boundary mesh
+        oversetPolyPatch
+        (
+            const oversetPolyPatch& pp,
+            const polyBoundaryMesh& bm
+        );
+
+        //- Construct given the original patch and resetting the
+        //  face list and boundary mesh information
+        oversetPolyPatch
+        (
+            const oversetPolyPatch& pp,
+            const polyBoundaryMesh& bm,
+            const label index,
+            const label newSize,
+            const label newStart
+        );
+
+        //- Construct given the original patch and a map
+        oversetPolyPatch
+        (
+            const oversetPolyPatch& pp,
+            const polyBoundaryMesh& bm,
+            const label index,
+            const labelUList& mapAddressing,
+            const label newStart
+        );
+
+        //- Construct and return a clone, resetting the boundary mesh
+        virtual autoPtr<polyPatch> clone(const polyBoundaryMesh& bm) const
+        {
+            return autoPtr<polyPatch>(new oversetPolyPatch(*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
+        {
+            return autoPtr<polyPatch>
+            (
+                new oversetPolyPatch(*this, bm, index, newSize, newStart)
+            );
+        }
+
+        //- Construct and return a clone, resetting the face list
+        //  and boundary mesh
+        virtual autoPtr<polyPatch> clone
+        (
+            const polyBoundaryMesh& bm,
+            const label index,
+            const labelUList& mapAddressing,
+            const label newStart
+        ) const
+        {
+            return autoPtr<polyPatch>
+            (
+                new oversetPolyPatch
+                (
+                    *this,
+                    bm,
+                    index,
+                    mapAddressing,
+                    newStart
+                )
+            );
+        }
+
+
+    //- Destructor
+    virtual ~oversetPolyPatch();
+
+
+    // Member functions
+
+        //- Am I master patch? The master is responsible for doing all
+        //  interpolation.
+        bool master() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/overset/regionsToCell/findRefCells.C b/src/overset/regionsToCell/findRefCells.C
new file mode 100644
index 00000000000..289bb1959b5
--- /dev/null
+++ b/src/overset/regionsToCell/findRefCells.C
@@ -0,0 +1,274 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "findRefCell.H"
+#include "regionSplit.H"
+
+// * * * * * * * * * * * * * * * Global Functions  * * * * * * * * * * * * * //
+
+void Foam::setRefCells
+(
+    const volScalarField& field,
+    const volScalarField& fieldRef,
+    const dictionary& dict,
+    boolList& regionNeedReference,
+    labelList& regionRefCells,
+    scalarField& regionRefValues,
+    const bool forceReference
+)
+{
+    const regionSplit& regions = regionSplit::New(field.mesh());
+
+    regionNeedReference.setSize(regions.nRegions(), true);
+    regionRefCells.setSize(regions.nRegions(), -1);
+    regionRefValues.setSize(regions.nRegions(), 0);
+
+    if (!forceReference)
+    {
+        const volScalarField::GeometricBoundaryField& bfld =
+            fieldRef.boundaryField();
+
+        forAll(bfld, patchI)
+        {
+            if (bfld[patchI].fixesValue())
+            {
+                // Unmark all regions
+
+                const labelUList& fc = bfld[patchI].patch().patch().faceCells();
+
+                forAll(fc, faceI)
+                {
+                    regionNeedReference[regions[fc[faceI]]] = false;
+                }
+            }
+        }
+
+        Pstream::listCombineGather(regionNeedReference, orEqOp<bool>());
+        Pstream::listCombineScatter(regionNeedReference);
+    }
+
+
+    label nRefs = 0;
+    forAll(regionNeedReference, regionI)
+    {
+        if (regionNeedReference[regionI])
+        {
+            nRefs++;
+        }
+    }
+
+    if (nRefs == 0)
+    {
+        return;
+    }
+
+    // Get the reference cells for all the regions
+
+    word refCellName = field.name() + "RefCells";
+    word refPointName = field.name() + "RefPoints";
+    word refValueName = field.name() + "RefValues";
+
+
+    // (per region!) does region have reference cell?
+    labelList hasRef(regionNeedReference.size(), 0);
+
+
+    const labelList refValues(dict.lookup(refValueName));
+
+
+    if (dict.found(refCellName))
+    {
+        // Have specified reference cells (on master!)
+
+        if (Pstream::master())
+        {
+            labelList refCells(dict.lookup(refCellName));
+
+            if (refCells.size() != regionNeedReference.size())
+            {
+                FatalIOErrorIn
+                (
+                    "setRefCell\n"
+                    "(\n"
+                    "    const volScalarField&,\n"
+                    "    const volScalarField&,\n"
+                    "    const dictionary&,\n"
+                    "    labelList&,\n"
+                    "    scalarField&,\n"
+                    "    const bool\n"
+                    ")\n",
+                    dict
+                )   << "Number of refCells " << refCells.size()
+                    << " does not correspond to number of regions "
+                    << regionNeedReference.size()
+                    << exit(FatalIOError);
+            }
+
+            forAll(refCells, i)
+            {
+                label regionI = regions[refCells[i]];
+
+                if (regionNeedReference[regionI])
+                {
+                    regionRefCells[regionI] = refCells[i];
+                    regionRefValues[regionI] = refValues[i];
+                }
+            }
+
+
+            forAll(regionNeedReference, regionI)
+            {
+                if
+                (
+                    regionNeedReference[regionI]
+                 && regionRefCells[regionI] == -1
+                )
+                {
+                    FatalIOErrorIn
+                    (
+                        "setRefCell\n"
+                        "(\n"
+                        "    const volScalarField&,\n"
+                        "    const volScalarField&,\n"
+                        "    const dictionary&,\n"
+                        "    labelList&,\n"
+                        "    scalarField&,\n"
+                        "    const bool\n"
+                        ")\n",
+                        dict
+                    )   << "Have no reference cell for region " << regionI
+                        << nl
+                        << "Overall per-region reference cells "
+                        << regionRefCells
+                        << exit(FatalIOError);
+                }
+            }
+        }
+    }
+    else if (dict.found(refPointName))
+    {
+        pointField refPoints(dict.lookup(refPointName));
+
+        if (refPoints.size() != regionNeedReference.size())
+        {
+            FatalIOErrorIn
+            (
+                "setRefCell\n"
+                "(\n"
+                "    const volScalarField&,\n"
+                "    const volScalarField&,\n"
+                "    const dictionary&,\n"
+                "    labelList&,\n"
+                "    scalarField&,\n"
+                "    const bool\n"
+                ")\n",
+                dict
+            )   << "Number of refPoints " << refPoints.size()
+                << " does not correspond to number of regions "
+                << regionNeedReference.size()
+                << exit(FatalIOError);
+        }
+
+        labelList hasRef(refPoints.size(), 0);
+
+        forAll(refPoints, i)
+        {
+            // Note: find reference cell using facePlanes to avoid constructing
+            //       face decomposition structure. Most likely the reference
+            //       cell is an undistorted one so this should not be a
+            //       problem.
+
+            label celli = field.mesh().findCell
+            (
+                refPoints[i],
+                polyMesh::FACEPLANES
+            );
+
+            if (celli >= 0)
+            {
+                Pout<< "Found point " << refPoints[i]
+                    << " in reference cell " << celli
+                    << " at " << field.mesh().cellCentres()[celli]
+                    << " for region " << regions[celli]
+                    << endl;
+
+                regionRefCells[regions[celli]] = celli;
+                hasRef[regions[celli]] = 1;
+            }
+        }
+
+        Pstream::listCombineGather(hasRef, plusEqOp<label>());
+        Pstream::listCombineScatter(hasRef);
+
+        forAll(hasRef, regionI)
+        {
+            if (hasRef[regionI] != 1)
+            {
+                FatalIOErrorIn
+                (
+                    "setRefCell\n"
+                    "(\n"
+                    "    const volScalarField&,\n"
+                    "    const volScalarField&,\n"
+                    "    const dictionary&,\n"
+                    "    labelList&,\n"
+                    "    scalarField&,\n"
+                    "    const bool\n"
+                    ")\n",
+                    dict
+                )   << "Unable to set reference cell for field " << field.name()
+                    << nl
+                    << "    Reference points " << refPointName
+                    << " " << refPoints
+                    << nl << "    For region " << regionI
+                    << " found on " << hasRef[regionI]
+                    << " domains (should be one)"
+                    << nl << exit(FatalIOError);
+            }
+        }
+    }
+    else
+    {
+        FatalIOErrorIn
+        (
+            "setRefCell\n"
+            "(\n"
+            "    const volScalarField&,\n"
+            "    const volScalarField&,\n"
+            "    const dictionary&,\n"
+            "    labelList&,\n"
+            "    scalarField&,\n"
+            "    const bool\n"
+            ")\n",
+            dict
+        )   << "Unable to set reference cell for field " << field.name()
+            << nl
+            << "    Please supply either " << refCellName
+            << " or " << refPointName << nl << exit(FatalIOError);
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/src/overset/regionsToCell/findRefCells.H b/src/overset/regionsToCell/findRefCells.H
new file mode 100644
index 00000000000..4812750c608
--- /dev/null
+++ b/src/overset/regionsToCell/findRefCells.H
@@ -0,0 +1,74 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+InNamespace
+    Foam
+
+Description
+    Find the reference cells per region. Regions given as cellSet names.
+
+SourceFiles
+    findRefCell.C
+
+SeeAlso
+    Foam::regionSplit
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef findRefCell_H
+#define findRefCell_H
+
+#include "label.H"
+#include "volFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+//- Set reference cells for multi-region domains. Returns per region:
+//  - whether a reference is needed
+//  - if so a reference cell (or -1)
+//  - and a reference value
+void setRefCells
+(
+    const volScalarField& field,
+    const volScalarField& fieldRef,
+    const dictionary& dict,
+
+    const label refCelli,
+    const scalar refValue,
+
+    boolList& needReference,
+    labelList& refCells,
+    scalarField& refValues,
+    const bool forceReference = false
+);
+
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/overset/regionsToCell/regionsToCell.C b/src/overset/regionsToCell/regionsToCell.C
new file mode 100644
index 00000000000..2cb3419a4f4
--- /dev/null
+++ b/src/overset/regionsToCell/regionsToCell.C
@@ -0,0 +1,484 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "regionsToCell.H"
+#include "regionSplit.H"
+#include "emptyPolyPatch.H"
+#include "cellSet.H"
+#include "syncTools.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+defineTypeNameAndDebug(regionsToCell, 0);
+
+addToRunTimeSelectionTable(topoSetSource, regionsToCell, word);
+
+addToRunTimeSelectionTable(topoSetSource, regionsToCell, istream);
+
+}
+
+
+Foam::topoSetSource::addToUsageTable Foam::regionsToCell::usage_
+(
+    regionsToCell::typeName,
+    "\n    Usage: regionsToCell subCellSet (pt0 .. ptn) nErode\n\n"
+    "    Select all cells in the connected region containing"
+    " points (pt0..ptn).\n"
+);
+
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+void Foam::regionsToCell::markRegionFaces
+(
+    const boolList& selectedCell,
+    boolList& regionFace
+) const
+{
+    // Internal faces
+    const labelList& faceOwner = mesh_.faceOwner();
+    const labelList& faceNeighbour = mesh_.faceNeighbour();
+    forAll(faceNeighbour, faceI)
+    {
+        if
+        (
+            selectedCell[faceOwner[faceI]]
+         != selectedCell[faceNeighbour[faceI]]
+        )
+        {
+            regionFace[faceI] = true;
+        }
+    }
+
+    // Swap neighbour selectedCell state
+    boolList nbrSelected;
+    syncTools::swapBoundaryCellList(mesh_, selectedCell, nbrSelected);
+
+    // Boundary faces
+    const polyBoundaryMesh& pbm = mesh_.boundaryMesh();
+    forAll(pbm, patchI)
+    {
+        const polyPatch& pp = pbm[patchI];
+        const labelUList& faceCells = pp.faceCells();
+        forAll(faceCells, i)
+        {
+            label faceI = pp.start()+i;
+            label bFaceI = faceI-mesh_.nInternalFaces();
+            if
+            (
+                selectedCell[faceCells[i]]
+             != selectedCell[nbrSelected[bFaceI]]
+            )
+            {
+                regionFace[faceI] = true;
+            }
+        }
+    }
+}
+
+
+Foam::boolList Foam::regionsToCell::findRegions
+(
+    const bool verbose,
+    const boolList& selectedCell,
+    const regionSplit& cellRegion
+) const
+{
+    boolList keepRegion(cellRegion.nRegions(), false);
+
+    forAll(insidePoints_, i)
+    {
+        // Find the region containing the insidePoint
+
+        const point& insidePt = insidePoints_[i];
+
+        //label cellI = mesh_.findCell(insidePt);
+        label cellI = -1;
+        forAll(selectedCell, index)
+        {
+            if
+            (
+                selectedCell[index]
+             && mesh_.pointInCell(insidePt, index, polyMesh::CELL_TETS)
+            )
+            {
+                cellI = index;
+                break;
+            }
+        }
+
+        label keepRegionI = -1;
+        label keepProcI = -1;
+        if (cellI != -1)
+        {
+            keepRegionI = cellRegion[cellI];
+            keepProcI = Pstream::myProcNo();
+        }
+        reduce(keepRegionI, maxOp<label>());
+        keepRegion[keepRegionI] = true;
+
+        reduce(keepProcI, maxOp<label>());
+
+        if (keepProcI == -1)
+        {
+            FatalErrorInFunction
+                << "Did not find " << insidePt
+                << " in mesh." << " Mesh bounds are " << mesh_.bounds()
+                << exit(FatalError);
+        }
+
+        if (verbose)
+        {
+            Info<< "    Found location " << insidePt
+                << " in cell " << cellI << " on processor " << keepProcI
+                << " in global region " << keepRegionI
+                << " out of " << cellRegion.nRegions() << " regions." << endl;
+        }
+    }
+
+    return keepRegion;
+}
+
+
+void Foam::regionsToCell::unselectOutsideRegions
+(
+    boolList& selectedCell
+) const
+{
+    // Determine faces on the edge of selectedCell
+    boolList blockedFace(mesh_.nFaces(), false);
+    markRegionFaces(selectedCell, blockedFace);
+
+    // Determine regions
+    regionSplit cellRegion(mesh_, blockedFace);
+
+    // Determine regions containing insidePoints_
+    boolList keepRegion(findRegions(true, selectedCell, cellRegion));
+
+    // Go back to bool per cell
+    forAll(cellRegion, cellI)
+    {
+        if (!keepRegion[cellRegion[cellI]])
+        {
+            selectedCell[cellI] = false;
+        }
+    }
+}
+
+
+void Foam::regionsToCell::shrinkRegions
+(
+    boolList& selectedCell
+) const
+{
+    // Select points on unselected cells and boundary
+    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    boolList boundaryPoint(mesh_.nPoints(), false);
+
+    const polyBoundaryMesh& pbm = mesh_.boundaryMesh();
+
+    forAll(pbm, patchI)
+    {
+        const polyPatch& pp = pbm[patchI];
+
+        if (!pp.coupled() && !isA<emptyPolyPatch>(pp))
+        {
+            forAll(pp, i)
+            {
+                const face& f = pp[i];
+                forAll(f, fp)
+                {
+                    boundaryPoint[f[fp]] = true;
+                }
+            }
+        }
+    }
+
+    forAll(selectedCell, cellI)
+    {
+        if (!selectedCell[cellI])
+        {
+            const labelList& cPoints = mesh_.cellPoints(cellI);
+            forAll(cPoints, i)
+            {
+                boundaryPoint[cPoints[i]] = true;
+            }
+        }
+    }
+
+    syncTools::syncPointList(mesh_, boundaryPoint, orEqOp<bool>(), false);
+
+
+    // Select all cells using these points
+    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    label nChanged = 0;
+    forAll(boundaryPoint, pointI)
+    {
+        if (boundaryPoint[pointI])
+        {
+            const labelList& pCells = mesh_.pointCells(pointI);
+            forAll(pCells, i)
+            {
+                label cellI = pCells[i];
+                if (selectedCell[cellI])
+                {
+                    selectedCell[cellI] = false;
+                    nChanged++;
+                }
+            }
+        }
+    }
+    Info<< "    Eroded " << returnReduce(nChanged, sumOp<label>())
+        << " cells." << endl;
+}
+
+
+void Foam::regionsToCell::erode
+(
+    boolList& selectedCell
+) const
+{
+    //Info<< "Entering shrinkRegions:" << count(selectedCell) << endl;
+    //generateField("selectedCell_before", selectedCell)().write();
+
+    // Now erode and see which regions get disconnected
+    boolList shrunkSelectedCell(selectedCell);
+
+    for (label iter = 0; iter < nErode_; iter++)
+    {
+        shrinkRegions(shrunkSelectedCell);
+    }
+
+    //Info<< "After shrinking:" << count(shrunkSelectedCell) << endl;
+    //generateField("shrunkSelectedCell", shrunkSelectedCell)().write();
+
+
+
+    // Determine faces on the edge of shrunkSelectedCell
+    boolList blockedFace(mesh_.nFaces(), false);
+    markRegionFaces(shrunkSelectedCell, blockedFace);
+
+    // Find disconnected regions
+    regionSplit cellRegion(mesh_, blockedFace);
+
+    // Determine regions containing insidePoints
+    boolList keepRegion(findRegions(true, shrunkSelectedCell, cellRegion));
+
+
+    // Extract cells in regions that are not to be kept.
+    boolList removeCell(mesh_.nCells(), false);
+    forAll(cellRegion, cellI)
+    {
+        if (shrunkSelectedCell[cellI] && !keepRegion[cellRegion[cellI]])
+        {
+            removeCell[cellI] = true;
+        }
+    }
+
+    //Info<< "removeCell before:" << count(removeCell) << endl;
+    //generateField("removeCell_before", removeCell)().write();
+
+
+
+    // Grow removeCell
+    for (label iter = 0; iter < nErode_; iter++)
+    {
+        // Grow selected cell in regions that are not for keeping
+        boolList boundaryPoint(mesh_.nPoints(), false);
+        forAll(removeCell, cellI)
+        {
+            if (removeCell[cellI])
+            {
+                const labelList& cPoints = mesh_.cellPoints(cellI);
+                forAll(cPoints, i)
+                {
+                    boundaryPoint[cPoints[i]] = true;
+                }
+            }
+        }
+        syncTools::syncPointList(mesh_, boundaryPoint, orEqOp<bool>(), false);
+
+        // Select all cells using these points
+
+        label nChanged = 0;
+        forAll(boundaryPoint, pointI)
+        {
+            if (boundaryPoint[pointI])
+            {
+                const labelList& pCells = mesh_.pointCells(pointI);
+                forAll(pCells, i)
+                {
+                    label cellI = pCells[i];
+                    if (!removeCell[cellI])
+                    {
+                        removeCell[cellI] = true;
+                        nChanged++;
+                    }
+                }
+            }
+        }
+    }
+
+    //Info<< "removeCell after:" << count(removeCell) << endl;
+    //generateField("removeCell_after", removeCell)().write();
+
+
+    // Unmark removeCell
+    forAll(removeCell, cellI)
+    {
+        if (removeCell[cellI])
+        {
+            selectedCell[cellI] = false;
+        }
+    }
+}
+
+
+void Foam::regionsToCell::combine(topoSet& set, const bool add) const
+{
+    // Note: wip. Select cells first
+    boolList selectedCell(mesh_.nCells(), true);
+
+    if (setName_.size() && setName_ != "none")
+    {
+        Info<< "    Loading subset " << setName_ << " to delimit search region."
+            << endl;
+        cellSet subSet(mesh_, setName_);
+
+        selectedCell = false;
+        forAllConstIter(cellSet, subSet, iter)
+        {
+            selectedCell[iter.key()] = true;
+        }
+    }
+
+
+    unselectOutsideRegions(selectedCell);
+
+    if (nErode_ > 0)
+    {
+        erode(selectedCell);
+    }
+
+
+    forAll(selectedCell, cellI)
+    {
+        if (selectedCell[cellI])
+        {
+            addOrDelete(set, cellI, add);
+        }
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+// Construct from components
+Foam::regionsToCell::regionsToCell
+(
+    const polyMesh& mesh,
+    const word& setName,
+    const pointField& insidePoints,
+    const label nErode
+)
+:
+    topoSetSource(mesh),
+    setName_(setName),
+    insidePoints_(insidePoints),
+    nErode_(nErode)
+{}
+
+
+// Construct from dictionary
+Foam::regionsToCell::regionsToCell
+(
+    const polyMesh& mesh,
+    const dictionary& dict
+)
+:
+    topoSetSource(mesh),
+    setName_(dict.lookupOrDefault<word>("set", "none")),
+    insidePoints_
+    (
+        dict.found("insidePoints")
+      ? dict.lookup("insidePoints")
+      : dict.lookup("insidePoint")
+    ),
+    nErode_(dict.lookupOrDefault("nErode", 0))
+{}
+
+
+// Construct from Istream
+Foam::regionsToCell::regionsToCell
+(
+    const polyMesh& mesh,
+    Istream& is
+)
+:
+    topoSetSource(mesh),
+    setName_(checkIs(is)),
+    insidePoints_(checkIs(is)),
+    nErode_(readLabel(checkIs(is)))
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::regionsToCell::~regionsToCell()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void Foam::regionsToCell::applyToSet
+(
+    const topoSetSource::setAction action,
+    topoSet& set
+) const
+{
+    if ((action == topoSetSource::NEW) || (action == topoSetSource::ADD))
+    {
+        Info<< "    Adding all cells of connected region containing points "
+            << insidePoints_ << " ..." << endl;
+
+        combine(set, true);
+    }
+    else if (action == topoSetSource::DELETE)
+    {
+        Info<< "    Removing all cells of connected region containing points "
+            << insidePoints_ << " ..." << endl;
+
+        combine(set, false);
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/src/overset/regionsToCell/regionsToCell.H b/src/overset/regionsToCell/regionsToCell.H
new file mode 100644
index 00000000000..1f7c5445746
--- /dev/null
+++ b/src/overset/regionsToCell/regionsToCell.H
@@ -0,0 +1,173 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::regionsToCell
+
+Description
+    TopoSetSource. Select cells belonging to topological connected region
+    (that contains given points)
+
+    In dictionary input:
+
+        // optional name of cellSet delimiting search
+        set         c0;
+
+        //- Number of cell layers to erode mesh to detect holes in the mesh
+        //  Set to 0 if not used.
+        nErode 3;
+
+        // points inside region to select
+        insidePoints ((1 2 3));
+
+
+SourceFiles
+    regionsToCell.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef regionsToCell_H
+#define regionsToCell_H
+
+#include "topoSetSource.H"
+#include "boolList.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+class regionSplit;
+
+/*---------------------------------------------------------------------------*\
+                           Class regionsToCell Declaration
+\*---------------------------------------------------------------------------*/
+
+class regionsToCell
+:
+    public topoSetSource
+{
+
+    // Private data
+
+        //- Add usage string
+        static addToUsageTable usage_;
+
+        //- Name of cellSet to keep to
+        const word setName_;
+
+        //- Coordinate(s) that is inside connected region
+        const pointField insidePoints_;
+
+        //- Number of layers to erode
+        const label nErode_;
+
+
+    // Private Member Functions
+
+        //- Mark faces inbetween selected and unselected elements
+        void markRegionFaces
+        (
+            const boolList& selectedCell,
+            boolList& regionFace
+        ) const;
+
+        //- Determine for every disconnected region in the mesh whether
+        //  it contains a locationInMesh
+        boolList findRegions
+        (
+            const bool verbose,
+            const boolList& selectedCell,
+            const regionSplit&
+        ) const;
+
+        //- Unselect regions not containing a locationInMesh
+        void unselectOutsideRegions(boolList& selectedCell) const;
+
+        //- Unselect one layer of cells from selectedCell
+        void shrinkRegions(boolList& selectedCell) const;
+
+        //- Erode a given number of layers from selectedCell. Remove any
+        //  region that gets disconnected that way.
+        void erode(boolList& selectedCell) const;
+
+        void combine(topoSet& set, const bool add) const;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("regionsToCell");
+
+    // Constructors
+
+        //- Construct from components
+        regionsToCell
+        (
+            const polyMesh& mesh,
+            const word& setName,
+            const pointField& insidePoints,
+            const label nErode
+        );
+
+        //- Construct from dictionary
+        regionsToCell
+        (
+            const polyMesh& mesh,
+            const dictionary& dict
+        );
+
+        //- Construct from Istream
+        regionsToCell
+        (
+            const polyMesh& mesh,
+            Istream&
+        );
+
+
+    //- Destructor
+    virtual ~regionsToCell();
+
+
+    // Member Functions
+
+        virtual sourceType setType() const
+        {
+            return CELLSETSOURCE;
+        }
+
+        virtual void applyToSet(const topoSetSource::setAction action, topoSet&)
+         const;
+
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/regionCoupled/derivedFvPatchFields/energyRegionCoupled/energyRegionCoupledFvPatchScalarField.C b/src/regionCoupled/derivedFvPatchFields/energyRegionCoupled/energyRegionCoupledFvPatchScalarField.C
index 72afb55582a..1fcabf5243a 100644
--- a/src/regionCoupled/derivedFvPatchFields/energyRegionCoupled/energyRegionCoupledFvPatchScalarField.C
+++ b/src/regionCoupled/derivedFvPatchFields/energyRegionCoupled/energyRegionCoupledFvPatchScalarField.C
@@ -406,6 +406,7 @@ patchInternalTemperatureField() const
 void Foam::energyRegionCoupledFvPatchScalarField::updateInterfaceMatrix
 (
     Field<scalar>& result,
+    const bool add,
     const scalarField& psiInternal,
     const scalarField& coeffs,
     const direction cmpt,
@@ -435,18 +436,14 @@ void Foam::energyRegionCoupledFvPatchScalarField::updateInterfaceMatrix
     }
 
     // Multiply the field by coefficients and add into the result
-    const labelUList& faceCells = regionCoupledPatch_.faceCells();
-
-    forAll(faceCells, elemI)
-    {
-        result[faceCells[elemI]] -= coeffs[elemI]*myHE[elemI];
-    }
+    this->addToInternalField(result, !add, coeffs, myHE);
 }
 
 
 void Foam::energyRegionCoupledFvPatchScalarField::updateInterfaceMatrix
 (
     Field<scalar>& result,
+    const bool add,
     const Field<scalar>& psiInternal,
     const scalarField& coeffs,
     const Pstream::commsTypes
diff --git a/src/regionCoupled/derivedFvPatchFields/energyRegionCoupled/energyRegionCoupledFvPatchScalarField.H b/src/regionCoupled/derivedFvPatchFields/energyRegionCoupled/energyRegionCoupledFvPatchScalarField.H
index df8a2c8fd83..877d40583de 100644
--- a/src/regionCoupled/derivedFvPatchFields/energyRegionCoupled/energyRegionCoupledFvPatchScalarField.H
+++ b/src/regionCoupled/derivedFvPatchFields/energyRegionCoupled/energyRegionCoupledFvPatchScalarField.H
@@ -221,6 +221,7 @@ public:
             virtual void updateInterfaceMatrix
             (
                 Field<scalar>& result,
+                const bool add,
                 const scalarField& psiInternal,
                 const scalarField& coeffs,
                 const direction cmpt,
@@ -231,6 +232,7 @@ public:
             virtual void updateInterfaceMatrix
             (
                 Field<scalar>&,
+                const bool,
                 const Field<scalar>&,
                 const scalarField&,
                 const Pstream::commsTypes commsType
diff --git a/src/sampling/meshToMesh/meshToMesh.C b/src/sampling/meshToMesh/meshToMesh.C
index 57b290851c8..3ac9607fff0 100644
--- a/src/sampling/meshToMesh/meshToMesh.C
+++ b/src/sampling/meshToMesh/meshToMesh.C
@@ -420,7 +420,7 @@ void Foam::meshToMesh::calcAddressing
 }
 
 
-void Foam::meshToMesh::calculate(const word& methodName)
+void Foam::meshToMesh::calculate(const word& methodName, const bool normalise)
 {
     Info<< "Creating mesh-to-mesh addressing for " << srcRegion_.name()
         << " and " << tgtRegion_.name() << " regions using "
@@ -566,19 +566,22 @@ void Foam::meshToMesh::calculate(const word& methodName)
         );
 
         // weights normalisation
-        normaliseWeights
-        (
-            "source",
-            srcToTgtCellAddr_,
-            srcToTgtCellWght_
-        );
+        if (normalise)
+        {
+            normaliseWeights
+            (
+                "source",
+                srcToTgtCellAddr_,
+                srcToTgtCellWght_
+            );
 
-        normaliseWeights
-        (
-            "target",
-            tgtToSrcCellAddr_,
-            tgtToSrcCellWght_
-        );
+            normaliseWeights
+            (
+                "target",
+                tgtToSrcCellAddr_,
+                tgtToSrcCellWght_
+            );
+        }
 
         // cache maps and reset addresses
         List<Map<label>> cMap;
@@ -598,19 +601,22 @@ void Foam::meshToMesh::calculate(const word& methodName)
     {
         calcAddressing(methodName, srcRegion_, tgtRegion_);
 
-        normaliseWeights
-        (
-            "source",
-            srcToTgtCellAddr_,
-            srcToTgtCellWght_
-        );
+        if (normalise)
+        {
+            normaliseWeights
+            (
+                "source",
+                srcToTgtCellAddr_,
+                srcToTgtCellWght_
+            );
 
-        normaliseWeights
-        (
-            "target",
-            tgtToSrcCellAddr_,
-            tgtToSrcCellWght_
-        );
+            normaliseWeights
+            (
+                "target",
+                tgtToSrcCellAddr_,
+                tgtToSrcCellWght_
+            );
+        }
     }
 
     Info<< "    Overlap volume: " << V_ << endl;
@@ -743,7 +749,7 @@ void Foam::meshToMesh::constructNoCuttingPatches
     }
 
     // calculate volume addressing and weights
-    calculate(methodName);
+    calculate(methodName, true);
 
     // calculate patch addressing and weights
     calculatePatchAMIs(AMIMethodName);
@@ -755,7 +761,8 @@ void Foam::meshToMesh::constructFromCuttingPatches
     const word& methodName,
     const word& AMIMethodName,
     const HashTable<word>& patchMap,
-    const wordList& cuttingPatches
+    const wordList& cuttingPatches,
+    const bool normalise
 )
 {
     const polyBoundaryMesh& srcBm = srcRegion_.boundaryMesh();
@@ -806,7 +813,7 @@ void Foam::meshToMesh::constructFromCuttingPatches
     tgtPatchID_.transfer(tgtIDs);
 
     // calculate volume addressing and weights
-    calculate(methodName);
+    calculate(methodName, normalise);
 
     // calculate patch addressing and weights
     calculatePatchAMIs(AMIMethodName);
@@ -888,7 +895,8 @@ Foam::meshToMesh::meshToMesh
     const polyMesh& tgt,
     const interpolationMethod& method,
     const HashTable<word>& patchMap,
-    const wordList& cuttingPatches
+    const wordList& cuttingPatches,
+    const bool normalise
 )
 :
     srcRegion_(src),
@@ -914,7 +922,8 @@ Foam::meshToMesh::meshToMesh
             interpolationMethodAMI(method)
         ),
         patchMap,
-        cuttingPatches
+        cuttingPatches,
+        normalise
     );
 }
 
@@ -926,7 +935,8 @@ Foam::meshToMesh::meshToMesh
     const word& methodName,     // internal mapping
     const word& AMIMethodName,  // boundary mapping
     const HashTable<word>& patchMap,
-    const wordList& cuttingPatches
+    const wordList& cuttingPatches,
+    const bool normalise
 )
 :
     srcRegion_(src),
@@ -949,7 +959,8 @@ Foam::meshToMesh::meshToMesh
         methodName,
         AMIMethodName,
         patchMap,
-        cuttingPatches
+        cuttingPatches,
+        normalise
     );
 }
 
diff --git a/src/sampling/meshToMesh/meshToMesh.H b/src/sampling/meshToMesh/meshToMesh.H
index 26227235db0..62b5781979a 100644
--- a/src/sampling/meshToMesh/meshToMesh.H
+++ b/src/sampling/meshToMesh/meshToMesh.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2012-2016 OpenFOAM Foundation
-     \\/     M anipulation  | Copyright (C) 2015 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015-2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -205,7 +205,7 @@ private:
         );
 
         //- Calculate - main driver function
-        void calculate(const word& methodName);
+        void calculate(const word& methodName, const bool normalise);
 
         //- Calculate patch overlap
         void calculatePatchAMIs(const word& amiMethodName);
@@ -224,7 +224,8 @@ private:
             const word& methodName,
             const word& AMIMethodName,
             const HashTable<word>& patchMap,
-            const wordList& cuttingPatches
+            const wordList& cuttingPatches,
+            const bool normalise
         );
 
         // Parallel operations
@@ -320,7 +321,8 @@ public:
         const polyMesh& tgt,
         const interpolationMethod& method,
         const HashTable<word>& patchMap,
-        const wordList& cuttingPatches
+        const wordList& cuttingPatches,
+        const bool normalise = true
     );
 
 
@@ -332,7 +334,8 @@ public:
         const word& methodName,     // internal mapping
         const word& AMIMethodName,  // boundary mapping
         const HashTable<word>& patchMap,
-        const wordList& cuttingPatches
+        const wordList& cuttingPatches,
+        const bool normalise = true
     );
 
 
@@ -383,6 +386,15 @@ public:
             patchAMIs() const;
 
 
+            // Explicit access. Can probably be done with combine operator.
+
+                //- Source map pointer - valid if no singleMeshProc
+                inline const autoPtr<mapDistribute>& srcMap() const;
+
+                //- Target map pointer - valid if no singleMeshProc
+                inline const autoPtr<mapDistribute>& tgtMap() const;
+
+
         // Evaluation
 
             // Source-to-target field mapping
diff --git a/src/sampling/meshToMesh/meshToMeshI.H b/src/sampling/meshToMesh/meshToMeshI.H
index a00d37a62e8..bd62cdb004e 100644
--- a/src/sampling/meshToMesh/meshToMeshI.H
+++ b/src/sampling/meshToMesh/meshToMeshI.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2012-2014 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -81,6 +81,20 @@ inline Foam::scalar Foam::meshToMesh::V() const
 }
 
 
+inline const Foam::autoPtr<Foam::mapDistribute>&
+Foam::meshToMesh::srcMap() const
+{
+    return srcMapPtr_;
+}
+
+
+inline const Foam::autoPtr<Foam::mapDistribute>&
+Foam::meshToMesh::tgtMap() const
+{
+    return tgtMapPtr_;
+}
+
+
 inline const Foam::PtrList<Foam::AMIPatchToPatchInterpolation>&
 Foam::meshToMesh::patchAMIs() const
 {
diff --git a/src/waveModels/waveModel/waveModel.C b/src/waveModels/waveModel/waveModel.C
index 484aac3f6dc..ed7e3e1ba32 100644
--- a/src/waveModels/waveModel/waveModel.C
+++ b/src/waveModels/waveModel/waveModel.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
      \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
 -------------------------------------------------------------------------------
 License
diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/0.org/T b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/0.org/T
new file mode 100644
index 00000000000..a60edc4bb6b
--- /dev/null
+++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/0.org/T
@@ -0,0 +1,49 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      T;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 0 0 1 0 0 0];
+
+internalField   uniform 273;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    "(walls|hole)"
+    {
+        type            zeroGradient;
+    }
+
+    left1
+    {
+        type            fixedValue;
+        value           uniform 300;
+    }
+
+    right1
+    {
+        type            fixedValue;
+        value           uniform 273;
+    }
+
+    overset
+    {
+        type            overset;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/0.org/pointDisplacement b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/0.org/pointDisplacement
new file mode 100644
index 00000000000..dcf1467e615
--- /dev/null
+++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/0.org/pointDisplacement
@@ -0,0 +1,43 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       pointVectorField;
+    object      pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 1 0 0 0 0 0];
+
+internalField   uniform (0 0 0);
+
+boundaryField
+{
+    ".*"
+    {
+        type            uniformFixedValue;
+        uniformValue    (0 0 0);
+    }
+
+    "(free|hole)"
+    {
+        patchType       overset;
+        type            uniformFixedValue;
+        uniformValue    table
+        (
+            (0.0         (0 0 0))
+            (1.0         (0.31 0 0))
+            (2.0         (0 0 0))
+        );
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/0.org/zoneID b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/0.org/zoneID
new file mode 100644
index 00000000000..1a49886c283
--- /dev/null
+++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/0.org/zoneID
@@ -0,0 +1,39 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev-OpenCFD.overlap                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    location    "0";
+    object      zoneID;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 0 0 0 0 0 0];
+
+internalField   uniform 0;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    overset
+    {
+        type        overset;
+    }
+
+    ".*"
+    {
+        type        zeroGradient;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/Allclean b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/Allclean
new file mode 100755
index 00000000000..323e09af05d
--- /dev/null
+++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/Allclean
@@ -0,0 +1,13 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # run from this directory
+
+# Source tutorial clean functions
+. $WM_PROJECT_DIR/bin/tools/CleanFunctions
+
+cleanCase
+rm -f constant/polyMesh/boundary
+rm -f constant/polyMesh/zoneID
+
+rm -rf 0
+
+# ----------------------------------------------------------------- end-of-file
diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/Allrun b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/Allrun
new file mode 100755
index 00000000000..a7602c7dea1
--- /dev/null
+++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/Allrun
@@ -0,0 +1,13 @@
+#!/bin/sh
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+./Allrun.pre
+
+# Run it for a bit
+
+# Serial
+#runApplication `getApplication`
+
+# Parallel
+runApplication decomposePar -cellDist
+runParallel `getApplication`
diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/Allrun.pre b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/Allrun.pre
new file mode 100755
index 00000000000..19e4417a553
--- /dev/null
+++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/Allrun.pre
@@ -0,0 +1,17 @@
+#!/bin/sh
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+runApplication blockMesh
+
+# Select cellSets
+runApplication topoSet
+
+runApplication subsetMesh box -patch hole -overwrite
+
+# Select cellSets
+runApplication -s zoneID topoSet
+
+rm -rf 0 && cp -r 0.org 0
+
+# Use cellSets to write zoneID
+runApplication setFields
diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/README.txt b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/README.txt
new file mode 100644
index 00000000000..2b8ef391a71
--- /dev/null
+++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/README.txt
@@ -0,0 +1,4 @@
+Transient, moving mesh
+----------------------
+
+Simple testcase for testing mesh motion
diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/constant/dynamicMeshDict b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/constant/dynamicMeshDict
new file mode 100644
index 00000000000..69054196e62
--- /dev/null
+++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/constant/dynamicMeshDict
@@ -0,0 +1,33 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+motionSolverLibs ( "libfvMotionSolvers.so" );
+
+solver          displacementLaplacian;
+
+displacementLaplacianCoeffs
+{
+    diffusivity     uniform 1;
+}
+
+dynamicFvMesh       dynamicOversetFvMesh;
+
+dynamicOversetFvMeshCoeffs
+{
+//    layerRelax 0.3;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/constant/transportProperties b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/constant/transportProperties
new file mode 100644
index 00000000000..2c17a958286
--- /dev/null
+++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/constant/transportProperties
@@ -0,0 +1,41 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "constant";
+    object      transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+DT              DT [ 0 2 -1 0 0 0 0 ] 1;
+
+transportModel  Newtonian;
+
+nu              nu [ 0 2 -1 0 0 0 0 ] 1e-05;
+
+CrossPowerLawCoeffs
+{
+    nu0             nu0 [ 0 2 -1 0 0 0 0 ] 1e-06;
+    nuInf           nuInf [ 0 2 -1 0 0 0 0 ] 1e-06;
+    m               m [ 0 0 1 0 0 0 0 ] 1;
+    n               n [ 0 0 0 0 0 0 0 ] 1;
+}
+
+BirdCarreauCoeffs
+{
+    nu0             nu0 [ 0 2 -1 0 0 0 0 ] 1e-06;
+    nuInf           nuInf [ 0 2 -1 0 0 0 0 ] 1e-06;
+    k               k [ 0 0 1 0 0 0 0 ] 0;
+    n               n [ 0 0 0 0 0 0 0 ] 1;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/blockMeshDict b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/blockMeshDict
new file mode 100644
index 00000000000..a5fafc3ec13
--- /dev/null
+++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/blockMeshDict
@@ -0,0 +1,126 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  1.5                                   |
+|   \\  /    A nd           | Web:      http://www.OpenFOAM.org               |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      blockMeshDict;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+convertToMeters 1;
+
+vertices
+(
+    ( 0.00  0.0  0)
+    ( 1.00  0.0  0)
+    ( 1.00  1.0  0)
+    ( 0.00  1.0  0)
+    ( 0.00  0.0  1)
+    ( 1.00  0.0  1)
+    ( 1.00  1.0  1)
+    ( 0.00  1.0  1)
+
+//- 0 degrees
+    ( 0.25  0.25  0)
+    ( 0.75  0.25  0)
+    ( 0.75  0.75  0)
+    ( 0.25  0.75  0)
+    ( 0.25  0.25  1)
+    ( 0.75  0.25  1)
+    ( 0.75  0.75  1)
+    ( 0.25  0.75  1)
+
+
+//- 45 degrees rotated
+//    ( 0.25  0.5   0)
+//    ( 0.5   0.25  0)
+//    ( 0.75  0.5   0)
+//    ( 0.5   0.75  0)
+//    ( 0.25  0.5   1)
+//    ( 0.5   0.25  1)
+//    ( 0.75  0.5   1)
+//    ( 0.5   0.75  1)
+);
+
+blocks
+(
+    hex (0 1 2 3 4 5 6 7) (18 18 1) simpleGrading (1 1 1)
+
+    hex (8 9 10 11 12 13 14 15) movingZone (20 20 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+    free
+    {
+        type    overset;
+        faces
+        (
+            (8 12 15 11)
+            (10 14 13 9)
+            (11 15 14 10)
+            ( 9 13 12  8)
+        );
+    }
+
+    walls
+    {
+        type patch;
+        faces
+        (
+            (3 7 6 2)
+            (1 5 4 0)
+        );
+    }
+
+    // Populated by subsetMesh
+    hole
+    {
+        type patch;
+        faces ();
+    }
+
+    frontAndBack
+    {
+        type empty;
+        faces
+        (
+            (0 3 2 1)
+            (4 5 6 7)
+            ( 8 11 10  9)
+            (12 13 14 15)
+        );
+    }
+
+    left1
+    {
+        type patch;
+        faces
+        (
+            (0 4 7 3)
+        );
+    }
+    right1
+    {
+        type patch;
+        faces
+        (
+            (2 6 5 1)
+        );
+    }
+);
+
+
+// ************************************************************************* //
diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/controlDict b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/controlDict
new file mode 100644
index 00000000000..52e7cf888d4
--- /dev/null
+++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/controlDict
@@ -0,0 +1,51 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+// Make sure all preprocessing tools know about the 'overset' bc
+libs            ("liboverset.so");
+
+application     overLaplacianDyMFoam;
+
+startFrom       startTime;
+
+startTime       0;
+
+stopAt          endTime;
+
+endTime         1;
+
+deltaT          0.1;
+
+writeControl    timeStep;
+
+writeInterval   1;
+
+purgeWrite      0;
+
+writeFormat     ascii;
+
+writePrecision  10;
+
+writeCompression off;
+
+timeFormat      general;
+
+timePrecision   6;
+
+runTimeModifiable true;
+
+// ************************************************************************* //
diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/decomposeParDict b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/decomposeParDict
new file mode 100644
index 00000000000..138625c7da8
--- /dev/null
+++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/decomposeParDict
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    note        "mesh decomposition control dictionary";
+    object      decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains  2;
+
+method          hierarchical;
+
+hierarchicalCoeffs
+{
+    n           (2 1 1);
+    delta       0.001;
+    order       xyz;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/fvSchemes b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/fvSchemes
new file mode 100644
index 00000000000..54af0223a5b
--- /dev/null
+++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/fvSchemes
@@ -0,0 +1,85 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+    default         Euler; //steadyState;
+}
+
+gradSchemes
+{
+    default         Gauss linear;
+    grad(T)         Gauss linear;
+}
+
+divSchemes
+{
+    default         none;
+    div(phi,U)      bounded Gauss limitedLinearV 1;
+    div(phi,k)      bounded Gauss limitedLinear 1;
+    div(phi,epsilon) bounded Gauss limitedLinear 1;
+    div(phi,R)      bounded Gauss limitedLinear 1;
+    div(R)          Gauss linear;
+    div(phi,nuTilda) bounded Gauss limitedLinear 1;
+    div((nuEff*dev(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+    default         Gauss linear corrected;
+    laplacian(diffusivity,cellDisplacement)  Gauss linear corrected;
+}
+
+interpolationSchemes
+{
+    default         linear;
+}
+
+snGradSchemes
+{
+    default         corrected;
+}
+
+fluxRequired
+{
+    default         no;
+    pcorr           ;
+    p               ;
+}
+
+oversetInterpolation
+{
+    // Interpolation scheme to use for overset calculation
+    method      inverseDistance;
+
+    // The inverseDistance method uses a 'voxel' like search structure.
+    // Optionally specify the extent and number of divisions n.
+    // Note that it will allocate an array of nx*ny*nz. If not specified:
+    // - searchBox          : local mesh bounding box
+    // - searchBoxDivisions : root (2D) or cube-root(3D) of number of cells
+    //searchBox           (0 0 0)(1 1 1);
+    //searchBoxDivisions  (100 100 1);
+}
+
+
+oversetInterpolationRequired
+{
+    // Any additional fields that require overset interpolation
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/fvSolution b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/fvSolution
new file mode 100644
index 00000000000..66c7f94747e
--- /dev/null
+++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/fvSolution
@@ -0,0 +1,77 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+    T
+    {
+        solver          PBiCGStab;
+        preconditioner  DILU;
+
+        //solver           GAMG;
+        //smoother         DILUGaussSeidel;
+        //agglomerator     algebraicPair;
+        //processorAgglomerator none;
+
+        tolerance       1e-10;
+        relTol          0;
+    }
+
+    cellDisplacement
+    {
+        solver          PCG;
+        preconditioner  DIC;
+
+        tolerance       1e-06;
+        relTol          0;
+        maxIter         100;
+    }
+
+
+}
+
+SIMPLE
+{
+    nNonOrthogonalCorrectors 0; //2;
+}
+
+
+PIMPLE
+{
+    correctPhi          yes;
+    nOuterCorrectors    2;
+    nCorrectors         1;
+    nNonOrthogonalCorrectors 0;
+}
+
+
+relaxationFactors
+{
+    fields
+    {
+        p               0.3;
+    }
+    equations
+    {
+        U               0.7;
+        k               0.7;
+        omega           0.7;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/setFieldsDict b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/setFieldsDict
new file mode 100644
index 00000000000..2ebc58f23ab
--- /dev/null
+++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/setFieldsDict
@@ -0,0 +1,48 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      setFieldsDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+defaultFieldValues
+(
+    volScalarFieldValue zoneID 123
+);
+
+regions
+(
+    // Set cell values
+    // (does zerogradient on boundaries)
+    cellToCell
+    {
+        set c0;
+
+        fieldValues
+        (
+            volScalarFieldValue zoneID 0
+        );
+    }
+
+    cellToCell
+    {
+        set c1;
+
+        fieldValues
+        (
+            volScalarFieldValue zoneID 1
+        );
+    }
+
+);
+
+// ************************************************************************* //
diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/topoSetDict b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/topoSetDict
new file mode 100644
index 00000000000..06a8182d404
--- /dev/null
+++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/topoSetDict
@@ -0,0 +1,80 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      topoSetDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+actions
+(
+    {
+        name    c0;
+        type    cellSet;
+        action  new;
+        source  regionToCell;
+        sourceInfo
+        {
+            insidePoints ((0.001 0.001 0.001));
+        }
+    }
+
+    {
+        name    c1;
+        type    cellSet;
+        action  new;
+        source  cellToCell;
+        sourceInfo
+        {
+            set c0;
+        }
+    }
+
+    {
+        name    c1;
+        type    cellSet;
+        action  invert;
+    }
+
+
+    // Select box to remove from region 1
+
+    {
+        name    box;
+        type    cellSet;
+        action  new;
+        source  cellToCell;
+        sourceInfo
+        {
+            set c1;
+        }
+    }
+
+
+    {
+        name    box;
+        type    cellSet;
+        action  subset;
+        source  boxToCell;
+        sourceInfo
+        {
+            box (0.4 0.4 -100)(0.6 0.6 100);
+        }
+    }
+
+    {
+        name    box;
+        type    cellSet;
+        action  invert;
+    }
+);
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/Allclean b/tutorials/incompressible/overPimpleDyMFoam/cylinder/Allclean
new file mode 100755
index 00000000000..862ed262d87
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/Allclean
@@ -0,0 +1,10 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # run from this directory
+
+# Extrude mesh around cylinder
+(cd cylinderAndBackground && ./Allclean)
+
+# Add background mesh
+(cd cylinderMesh && foamCleanTutorials)
+
+# ----------------------------------------------------------------- end-of-file
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/Allrun b/tutorials/incompressible/overPimpleDyMFoam/cylinder/Allrun
new file mode 100755
index 00000000000..7604f9ad35a
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/Allrun
@@ -0,0 +1,8 @@
+#!/bin/sh
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+# Extrude mesh around cylinder
+(cd cylinderMesh && ./Allrun.pre)
+
+# Add background mesh
+(cd cylinderAndBackground && ./Allrun)
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/Allrun.pre b/tutorials/incompressible/overPimpleDyMFoam/cylinder/Allrun.pre
new file mode 100755
index 00000000000..788e9474864
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/Allrun.pre
@@ -0,0 +1,8 @@
+#!/bin/sh
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+# Extrude mesh around cylinder
+(cd cylinderMesh && ./Allrun.pre)
+
+# Add background mesh
+(cd cylinderAndBackground && ./Allrun.pre)
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/README.txt b/tutorials/incompressible/overPimpleDyMFoam/cylinder/README.txt
new file mode 100644
index 00000000000..172ae4285f8
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/README.txt
@@ -0,0 +1,8 @@
+Transient, steady mesh
+-----------------------
+
+cylinderMesh/
+    For generating (2D) mesh cylinder mesh
+
+cylinderAndBackground/
+    BlockMesh for background and running
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/U b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/U
new file mode 100644
index 00000000000..58e5de004b0
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/U
@@ -0,0 +1,58 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volVectorField;
+    object      U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include        "include/initialConditions"
+
+dimensions      [0 1 -1 0 0 0 0];
+
+internalField   uniform $flowVelocity;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    overset
+    {
+        type            overset;
+    }
+
+    walls
+    {
+        type            movingWallVelocity;
+        value           uniform (0 0 0);
+    }
+
+    inlet
+    {
+        type            fixedValue;
+        value           $internalField;
+    }
+
+    outlet
+    {
+        type            inletOutlet;
+        inletValue      uniform (0 0 0);
+        value           $internalField;
+    }
+
+    topAndBottom
+    {
+        type            zeroGradient;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/epsilon b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/epsilon
new file mode 100644
index 00000000000..e84ad141fd4
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/epsilon
@@ -0,0 +1,59 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      epsilon;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include        "include/initialConditions"
+
+dimensions      [ 0 2 -3 0 0 0 0 ];
+
+internalField   uniform $turbulentEpsilon;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    overset
+    {
+        type            overset;
+    }
+
+    wall
+    {
+        type            epsilonWallFunction;
+        value           $internalField;
+    }
+
+    outlet
+    {
+        type            inletOutlet;
+        inletValue      $internalField;
+        value           $internalField;
+    }
+
+    inlet
+    {
+        type            turbulentMixingLengthDissipationRateInlet;
+        mixingLength    0.01;       // 1cm - half channel height
+        value           $internalField;
+    }
+
+    ".*"
+    {
+        type            zeroGradient;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/include/fixedInlet b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/include/fixedInlet
new file mode 100644
index 00000000000..f765e838505
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/include/fixedInlet
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+
+inlet
+{
+    type  fixedValue;
+    value $internalField;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/include/initialConditions b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/include/initialConditions
new file mode 100644
index 00000000000..aaa6bd1c6ff
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/include/initialConditions
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+
+flowVelocity         (10 0 0);
+pressure             0;
+turbulentKE          1.5;
+turbulentEpsilon     0.88;
+#inputMode           merge
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/k b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/k
new file mode 100644
index 00000000000..abe94093414
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/k
@@ -0,0 +1,54 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      k;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include        "include/initialConditions"
+
+dimensions      [ 0 2 -2 0 0 0 0 ];
+
+internalField   uniform $turbulentKE;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    overset
+    {
+        type            overset;
+    }
+
+    #include "include/fixedInlet"
+
+    outlet
+    {
+        type            inletOutlet;
+        inletValue      $internalField;
+        value           $internalField;
+    }
+
+    wall
+    {
+        type            kqRWallFunction;
+        value           $internalField;
+    }
+
+    ".*"
+    {
+        type            zeroGradient;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/nut b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/nut
new file mode 100644
index 00000000000..cc655b9cc59
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/nut
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      nut;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [ 0 2 -1 0 0 0 0 ];
+
+internalField   uniform 0;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    overset
+    {
+        type            overset;
+    }
+
+    wall
+    {
+        type            nutkWallFunction;
+        value           uniform 0;
+    }
+
+    ".*"
+    {
+        type            calculated;
+        value           uniform 0;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/p b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/p
new file mode 100644
index 00000000000..e7f065b3bd8
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/p
@@ -0,0 +1,55 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include        "include/initialConditions"
+
+dimensions      [0 2 -2 0 0 0 0];
+
+internalField   uniform $pressure;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    overset
+    {
+        type            overset;
+    }
+
+    wall
+    {
+        type            zeroGradient;
+    }
+
+    inlet
+    {
+        type            zeroGradient;
+    }
+
+    outlet
+    {
+        type            fixedValue;   //calculated;
+        value           $internalField;
+    }
+
+    ".*"
+    {
+        type            zeroGradient;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/pointDisplacement b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/pointDisplacement
new file mode 100644
index 00000000000..0bcc4e3481f
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/pointDisplacement
@@ -0,0 +1,42 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       pointVectorField;
+    object      pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 1 0 0 0 0 0];
+
+internalField   uniform (0 0 0);
+
+boundaryField
+{
+    overset
+    {
+        patchType       overset;
+        type            zeroGradient;
+    }
+
+    walls
+    {
+        type            uniformFixedValue;
+        uniformValue    (0 0 0);
+    }
+
+    ".*"
+    {
+        type            uniformFixedValue;
+        uniformValue    (0 0 0);
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/zoneID b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/zoneID
new file mode 100644
index 00000000000..b1cdf0478ed
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/zoneID
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      zoneID;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 0 0 0 0 0 0];
+
+internalField   uniform 0;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    overset
+    {
+        type            overset;
+    }
+
+    ".*"
+    {
+        type            zeroGradient;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/Allclean b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/Allclean
new file mode 100755
index 00000000000..5d96ca404a3
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/Allclean
@@ -0,0 +1,14 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # run from this directory
+
+# Source tutorial clean functions
+. $WM_PROJECT_DIR/bin/tools/CleanFunctions
+
+cleanCase
+rm -f constant/polyMesh/boundary
+rm -f constant/polyMesh/zoneID
+rm -f constant/cellInterpolationWeight
+
+rm -rf 0
+
+# ----------------------------------------------------------------- end-of-file
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/Allrun b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/Allrun
new file mode 100755
index 00000000000..b3d5b3a8dea
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/Allrun
@@ -0,0 +1,7 @@
+#!/bin/sh
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+./Allrun.pre
+
+# Run it for a bit
+runApplication `getApplication`
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/Allrun.pre b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/Allrun.pre
new file mode 100755
index 00000000000..5e8d5fb08da
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/Allrun.pre
@@ -0,0 +1,20 @@
+#!/bin/sh
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+# Create background mesh
+runApplication blockMesh
+
+# Add the cylinder mesh
+runApplication mergeMeshes . ../cylinderMesh -overwrite
+
+## Make it a bit smaller to keep it laminar
+#runApplication transformPoints -scale '(0.001 0.001 0.001)'
+
+# Select cellSets for the different zones
+runApplication topoSet
+
+# Copy standard fields
+rm -rf 0 && cp -r 0.org 0
+
+# Use cellSets to write zoneID
+runApplication setFields
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/constant/dynamicMeshDict b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/constant/dynamicMeshDict
new file mode 100644
index 00000000000..799c4a059b7
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/constant/dynamicMeshDict
@@ -0,0 +1,33 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+motionSolverLibs ( "libfvMotionSolvers.so" );
+
+solver          displacementLaplacian;
+
+displacementLaplacianCoeffs
+{
+    diffusivity     uniform 1;
+}
+
+dynamicFvMesh       dynamicOversetFvMesh;
+
+dynamicOversetFvMeshCoeffs
+{
+//    layerRelax 0.3;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/constant/transportProperties b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/constant/transportProperties
new file mode 100644
index 00000000000..4efbc8b9325
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/constant/transportProperties
@@ -0,0 +1,39 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+DT              DT [ 0 2 -1 0 0 0 0 ] 1;    //4e-05;
+
+transportModel  Newtonian;
+
+nu              nu [ 0 2 -1 0 0 0 0 ] 1e-05;
+
+CrossPowerLawCoeffs
+{
+    nu0             nu0 [ 0 2 -1 0 0 0 0 ] 1e-06;
+    nuInf           nuInf [ 0 2 -1 0 0 0 0 ] 1e-06;
+    m               m [ 0 0 1 0 0 0 0 ] 1;
+    n               n [ 0 0 0 0 0 0 0 ] 1;
+}
+
+BirdCarreauCoeffs
+{
+    nu0             nu0 [ 0 2 -1 0 0 0 0 ] 1e-06;
+    nuInf           nuInf [ 0 2 -1 0 0 0 0 ] 1e-06;
+    k               k [ 0 0 1 0 0 0 0 ] 0;
+    n               n [ 0 0 0 0 0 0 0 ] 1;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/constant/turbulenceProperties b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/constant/turbulenceProperties
new file mode 100644
index 00000000000..8fe9b5ed38d
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/constant/turbulenceProperties
@@ -0,0 +1,30 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "constant";
+    object      turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType  RAS;
+
+RAS
+{
+    RASModel        kEpsilon;
+
+    turbulence      on;
+
+    printCoeffs     on;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/blockMeshDict b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/blockMeshDict
new file mode 100644
index 00000000000..b2e40c26c83
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/blockMeshDict
@@ -0,0 +1,83 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v3.0+                                 |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      blockMeshDict;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+convertToMeters 1;
+
+vertices
+(
+    (-5 -0.05 -4.0)
+    ( 9 -0.05 -4.0)
+    ( 9  0.05 -4.0)
+    (-5  0.05 -4.0)
+    (-5 -0.05  4.0)
+    ( 9 -0.05  4.0)
+    ( 9  0.05  4.0)
+    (-5  0.05  4.0)
+);
+
+blocks
+(
+    hex (0 1 2 3 4 5 6 7) (120 1 60) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+    topAndBottom
+    {
+        type patch;
+        faces
+        (
+            (4 5 6 7)
+            (0 3 2 1)
+        );
+    }
+
+    inlet
+    {
+        type patch;
+        faces
+        (
+            (0 4 7 3)
+        );
+    }
+
+    outlet
+    {
+        type patch;
+        faces
+        (
+            (2 6 5 1)
+        );
+    }
+
+    frontAndBack
+    {
+        type empty;
+        faces
+        (
+            (3 7 6 2)
+            (1 5 4 0)
+        );
+    }
+);
+
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/controlDict b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/controlDict
new file mode 100644
index 00000000000..cc974a94e69
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/controlDict
@@ -0,0 +1,51 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v3.0+                                 |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+libs            ("liboverset.so");
+
+application     overPimpleDyMFoam;
+
+startFrom       startTime;
+
+startTime       0;
+
+stopAt          endTime;
+
+endTime         2.0;
+
+deltaT          0.005;
+
+writeControl    timeStep;
+
+writeInterval   10;
+
+purgeWrite      0;
+
+writeFormat     ascii;
+
+writePrecision  6;
+
+writeCompression off;
+
+timeFormat      general;
+
+timePrecision   6;
+
+runTimeModifiable true;
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/decomposeParDict b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/decomposeParDict
new file mode 100644
index 00000000000..29610a20d88
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/decomposeParDict
@@ -0,0 +1,30 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    note        "mesh decomposition control dictionary";
+    object      decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains  4;
+
+
+method          hierarchical;
+
+hierarchicalCoeffs
+{
+    n           (2 2 1);
+    delta       0.001;
+    order       xyz;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/fvSchemes b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/fvSchemes
new file mode 100644
index 00000000000..a8031a5b63a
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/fvSchemes
@@ -0,0 +1,72 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v3.0+                                 |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+    default         Euler;
+}
+
+gradSchemes
+{
+    default         Gauss linear;
+}
+
+divSchemes
+{
+    default         none;
+    div(phi,U)      Gauss limitedLinearV 1;
+    div(phi,k)      Gauss limitedLinear 1;;
+    div(phi,epsilon) Gauss limitedLinear 1;;
+    div(phi,R)      Gauss limitedLinear 1;;
+    div(R)          Gauss limitedLinear 1;;
+    div(phi,omega)  Gauss limitedLinear 1;
+    div(phid,p)     Gauss limitedLinear 1;
+    div(phi,K)      Gauss limitedLinear 1;
+    div(phi,e)      Gauss limitedLinear 1;
+    div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear;
+    div((nuEff*dev2(T(grad(U)))))   Gauss linear;
+}
+
+laplacianSchemes
+{
+    default         Gauss linear corrected;
+}
+
+interpolationSchemes
+{
+    default         linear;
+}
+
+snGradSchemes
+{
+    default         corrected ;
+}
+
+oversetInterpolation
+{
+    method          inverseDistance;
+}
+
+fluxRequired
+{
+    default         no;
+    pcorr           ;
+    p               ;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/fvSolution b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/fvSolution
new file mode 100644
index 00000000000..889491adf98
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/fvSolution
@@ -0,0 +1,100 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v3.0+                                 |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+    cellDisplacement
+    {
+        solver          PCG;
+        preconditioner  DIC;
+
+        tolerance       1e-06;
+        relTol          0;
+        maxIter         100;
+    }
+
+    p
+    {
+        solver          PBiCGStab;
+        preconditioner  DILU;
+        tolerance       1e-6;
+        relTol          0;
+    }
+
+
+    pFinal
+    {
+        $p;
+        relTol          0;
+    }
+
+    pcorr
+    {
+        $pFinal;
+        solver          PCG;
+        preconditioner  DIC;
+    }
+
+    pcorrFinal
+    {
+        $pcorr;
+        relTol          0;
+    }
+
+    "(U|k|epsilon|omega)"
+    {
+        solver          smoothSolver;
+        smoother        symGaussSeidel;
+        tolerance       1e-6;
+        relTol          0;
+    }
+
+    "(U|k|epsilon|omega)Final"
+    {
+        $U;
+        tolerance       1e-6;
+        relTol          0;
+    }
+}
+
+
+PIMPLE
+{
+    momentumPredictor   false;
+    correctPhi          false;  //true;
+    oversetAdjustPhi    true;
+    nOuterCorrectors    1;
+    nCorrectors         2;
+    nNonOrthogonalCorrectors 0;
+
+    ddtCorr             true;
+
+}
+
+relaxationFactors
+{
+    fields
+    {
+    }
+    equations
+    {
+        ".*"           1;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/setFieldsDict b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/setFieldsDict
new file mode 100644
index 00000000000..21c7adb08ee
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/setFieldsDict
@@ -0,0 +1,48 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      setFieldsDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+defaultFieldValues
+(
+    volScalarFieldValue zoneID 123
+);
+
+regions
+(
+    // Set cell values
+    // (does zerogradient on boundaries)
+    cellToCell
+    {
+        set c0;
+
+        fieldValues
+        (
+            volScalarFieldValue zoneID 0
+        );
+    }
+
+    cellToCell
+    {
+        set c1;
+
+        fieldValues
+        (
+            volScalarFieldValue zoneID 1
+        );
+    }
+
+);
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/topoSetDict b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/topoSetDict
new file mode 100644
index 00000000000..9c6d9767824
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/topoSetDict
@@ -0,0 +1,48 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      topoSetDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+actions
+(
+    {
+        name    c0;
+        type    cellSet;
+        action  new;
+        source  regionToCell;
+        sourceInfo
+        {
+            insidePoints ((-4.999 0 -3.999));
+        }
+    }
+
+    {
+        name    c1;
+        type    cellSet;
+        action  new;
+        source  cellToCell;
+        sourceInfo
+        {
+            set c0;
+        }
+    }
+
+    {
+        name    c1;
+        type    cellSet;
+        action  invert;
+    }
+);
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/Allrun.pre b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/Allrun.pre
new file mode 100755
index 00000000000..ad0801bbb90
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/Allrun.pre
@@ -0,0 +1,8 @@
+#!/bin/sh
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+# Generate mesh from surface (in constant/triSurface)
+runApplication extrudeMesh
+
+# Make front and back type empty
+runApplication createPatch -overwrite
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/constant/triSurface/cylinder.vtk b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/constant/triSurface/cylinder.vtk
new file mode 100644
index 00000000000..6a99fb9b6fa
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/constant/triSurface/cylinder.vtk
@@ -0,0 +1,221 @@
+# vtk DataFile Version 4.0
+vtk output
+ASCII
+DATASET POLYDATA
+POINTS 150 float
+0.5 0.05 0 0.5 -0.05 0 0.498246 0.05 -0.0418389
+0.498246 -0.05 -0.0418389 0.492998 0.05 -0.0833844 0.492998 -0.05 -0.0833844
+0.484292 0.05 -0.124345 0.484292 -0.05 -0.124345 0.472188 0.05 -0.164433
+0.472188 -0.05 -0.164433 0.456773 0.05 -0.203368 0.456773 -0.05 -0.203368
+0.438153 0.05 -0.240877 0.438153 -0.05 -0.240877 0.416461 0.05 -0.276696
+0.416461 -0.05 -0.276696 0.391847 0.05 -0.310574 0.391847 -0.05 -0.310574
+0.364484 0.05 -0.342274 0.364484 -0.05 -0.342274 0.334565 0.05 -0.371572
+0.334565 -0.05 -0.371572 0.3023 0.05 -0.398265 0.3023 -0.05 -0.398265
+0.267913 0.05 -0.422164 0.267913 -0.05 -0.422164 0.231648 0.05 -0.443102
+0.231648 -0.05 -0.443102 0.193758 0.05 -0.460932 0.193758 -0.05 -0.460932
+0.154509 0.05 -0.475528 0.154509 -0.05 -0.475528 0.114175 0.05 -0.486789
+0.114175 -0.05 -0.486789 0.0730415 0.05 -0.494636 0.0730415 -0.05 -0.494636
+0.0313953 0.05 -0.499013 0.0313953 -0.05 -0.499013 -0.0104712 0.05 -0.49989
+-0.0104712 -0.05 -0.49989 -0.0522642 0.05 -0.497261 -0.0522642 -0.05 -0.497261
+-0.0936907 0.05 -0.491144 -0.0936907 -0.05 -0.491144 -0.13446 0.05 -0.481581
+-0.13446 -0.05 -0.481581 -0.174286 0.05 -0.468641 -0.174286 -0.05 -0.468641
+-0.21289 0.05 -0.452414 -0.21289 -0.05 -0.452414 -0.25 0.05 -0.433013
+-0.25 -0.05 -0.433013 -0.285357 0.05 -0.410575 -0.285357 -0.05 -0.410575
+-0.318712 0.05 -0.385257 -0.318712 -0.05 -0.385257 -0.349832 0.05 -0.357236
+-0.349832 -0.05 -0.357236 -0.378498 0.05 -0.32671 -0.378498 -0.05 -0.32671
+-0.404509 0.05 -0.293893 -0.404509 -0.05 -0.293893 -0.427682 0.05 -0.259014
+-0.427682 -0.05 -0.259014 -0.447856 0.05 -0.222318 -0.447856 -0.05 -0.222318
+-0.464888 0.05 -0.184062 -0.464888 -0.05 -0.184062 -0.47866 0.05 -0.144516
+-0.47866 -0.05 -0.144516 -0.489074 0.05 -0.103956 -0.489074 -0.05 -0.103956
+-0.496057 0.05 -0.0626666 -0.496057 -0.05 -0.0626666 -0.499561 0.05 -0.0209378
+-0.499561 -0.05 -0.0209378 -0.499561 0.05 0.0209378 -0.499561 -0.05 0.0209378
+-0.496057 0.05 0.0626666 -0.496057 -0.05 0.0626666 -0.489074 0.05 0.103956
+-0.489074 -0.05 0.103956 -0.47866 0.05 0.144516 -0.47866 -0.05 0.144516
+-0.464888 0.05 0.184062 -0.464888 -0.05 0.184062 -0.447856 0.05 0.222318
+-0.447856 -0.05 0.222318 -0.427682 0.05 0.259014 -0.427682 -0.05 0.259014
+-0.404509 0.05 0.293893 -0.404509 -0.05 0.293893 -0.378498 0.05 0.32671
+-0.378498 -0.05 0.32671 -0.349832 0.05 0.357236 -0.349832 -0.05 0.357236
+-0.318712 0.05 0.385257 -0.318712 -0.05 0.385257 -0.285357 0.05 0.410575
+-0.285357 -0.05 0.410575 -0.25 0.05 0.433013 -0.25 -0.05 0.433013
+-0.21289 0.05 0.452414 -0.21289 -0.05 0.452414 -0.174286 0.05 0.468641
+-0.174286 -0.05 0.468641 -0.13446 0.05 0.481581 -0.13446 -0.05 0.481581
+-0.0936907 0.05 0.491144 -0.0936907 -0.05 0.491144 -0.0522642 0.05 0.497261
+-0.0522642 -0.05 0.497261 -0.0104712 0.05 0.49989 -0.0104712 -0.05 0.49989
+0.0313953 0.05 0.499013 0.0313953 -0.05 0.499013 0.0730415 0.05 0.494636
+0.0730415 -0.05 0.494636 0.114175 0.05 0.486789 0.114175 -0.05 0.486789
+0.154509 0.05 0.475528 0.154509 -0.05 0.475528 0.193758 0.05 0.460932
+0.193758 -0.05 0.460932 0.231648 0.05 0.443102 0.231648 -0.05 0.443102
+0.267913 0.05 0.422164 0.267913 -0.05 0.422164 0.3023 0.05 0.398265
+0.3023 -0.05 0.398265 0.334565 0.05 0.371572 0.334565 -0.05 0.371572
+0.364484 0.05 0.342274 0.364484 -0.05 0.342274 0.391847 0.05 0.310574
+0.391847 -0.05 0.310574 0.416461 0.05 0.276696 0.416461 -0.05 0.276696
+0.438153 0.05 0.240877 0.438153 -0.05 0.240877 0.456773 0.05 0.203368
+0.456773 -0.05 0.203368 0.472188 0.05 0.164433 0.472188 -0.05 0.164433
+0.484292 0.05 0.124345 0.484292 -0.05 0.124345 0.492998 0.05 0.0833844
+0.492998 -0.05 0.0833844 0.498246 0.05 0.0418389 0.498246 -0.05 0.0418389
+
+POLYGONS 75 375
+4 0 1 3 2
+4 2 3 5 4
+4 4 5 7 6
+4 6 7 9 8
+4 8 9 11 10
+4 10 11 13 12
+4 12 13 15 14
+4 14 15 17 16
+4 16 17 19 18
+4 18 19 21 20
+4 20 21 23 22
+4 22 23 25 24
+4 24 25 27 26
+4 26 27 29 28
+4 28 29 31 30
+4 30 31 33 32
+4 32 33 35 34
+4 34 35 37 36
+4 36 37 39 38
+4 38 39 41 40
+4 40 41 43 42
+4 42 43 45 44
+4 44 45 47 46
+4 46 47 49 48
+4 48 49 51 50
+4 50 51 53 52
+4 52 53 55 54
+4 54 55 57 56
+4 56 57 59 58
+4 58 59 61 60
+4 60 61 63 62
+4 62 63 65 64
+4 64 65 67 66
+4 66 67 69 68
+4 68 69 71 70
+4 70 71 73 72
+4 72 73 75 74
+4 74 75 77 76
+4 76 77 79 78
+4 78 79 81 80
+4 80 81 83 82
+4 82 83 85 84
+4 84 85 87 86
+4 86 87 89 88
+4 88 89 91 90
+4 90 91 93 92
+4 92 93 95 94
+4 94 95 97 96
+4 96 97 99 98
+4 98 99 101 100
+4 100 101 103 102
+4 102 103 105 104
+4 104 105 107 106
+4 106 107 109 108
+4 108 109 111 110
+4 110 111 113 112
+4 112 113 115 114
+4 114 115 117 116
+4 116 117 119 118
+4 118 119 121 120
+4 120 121 123 122
+4 122 123 125 124
+4 124 125 127 126
+4 126 127 129 128
+4 128 129 131 130
+4 130 131 133 132
+4 132 133 135 134
+4 134 135 137 136
+4 136 137 139 138
+4 138 139 141 140
+4 140 141 143 142
+4 142 143 145 144
+4 144 145 147 146
+4 146 147 149 148
+4 148 149 1 0
+
+POINT_DATA 150
+NORMALS Normals float
+1 0 -0 1 0 -0 0.996493 0 -0.0836778
+0.996493 0 -0.0836778 0.985996 0 -0.166769 0.985996 0 -0.166769
+0.968583 0 -0.24869 0.968583 0 -0.24869 0.944376 0 -0.328867
+0.944376 0 -0.328867 0.913545 0 -0.406737 0.913545 0 -0.406737
+0.876307 0 -0.481754 0.876307 0 -0.481754 0.832921 0 -0.553392
+0.832921 0 -0.553392 0.783693 0 -0.621148 0.783693 0 -0.621148
+0.728969 0 -0.684547 0.728969 0 -0.684547 0.669131 0 -0.743145
+0.669131 0 -0.743145 0.604599 0 -0.79653 0.604599 0 -0.79653
+0.535827 0 -0.844328 0.535827 0 -0.844328 0.463296 0 -0.886204
+0.463296 0 -0.886204 0.387516 0 -0.921863 0.387516 0 -0.921863
+0.309017 0 -0.951057 0.309017 0 -0.951057 0.228351 0 -0.973579
+0.228351 0 -0.973579 0.146083 0 -0.989272 0.146083 0 -0.989272
+0.0627905 0 -0.998027 0.0627905 0 -0.998027 -0.0209424 0 -0.999781
+-0.0209424 0 -0.999781 -0.104528 0 -0.994522 -0.104528 0 -0.994522
+-0.187381 0 -0.982287 -0.187381 0 -0.982287 -0.26892 0 -0.963163
+-0.26892 0 -0.963163 -0.348572 0 -0.937282 -0.348572 0 -0.937282
+-0.425779 0 -0.904827 -0.425779 0 -0.904827 -0.5 0 -0.866025
+-0.5 0 -0.866025 -0.570714 0 -0.821149 -0.570714 0 -0.821149
+-0.637424 0 -0.770513 -0.637424 0 -0.770513 -0.699663 0 -0.714473
+-0.699663 0 -0.714473 -0.756995 0 -0.653421 -0.756995 0 -0.653421
+-0.809017 0 -0.587785 -0.809017 0 -0.587785 -0.855364 0 -0.518027
+-0.855364 0 -0.518027 -0.895712 0 -0.444635 -0.895712 0 -0.444635
+-0.929776 0 -0.368125 -0.929776 0 -0.368125 -0.957319 0 -0.289032
+-0.957319 0 -0.289032 -0.978148 0 -0.207912 -0.978148 0 -0.207912
+-0.992115 0 -0.125333 -0.992115 0 -0.125333 -0.999123 0 -0.0418757
+-0.999123 0 -0.0418757 -0.999123 0 0.0418757 -0.999123 0 0.0418757
+-0.992115 0 0.125333 -0.992115 0 0.125333 -0.978148 0 0.207912
+-0.978148 0 0.207912 -0.957319 0 0.289032 -0.957319 0 0.289032
+-0.929776 0 0.368125 -0.929776 0 0.368125 -0.895712 0 0.444635
+-0.895712 0 0.444635 -0.855364 0 0.518027 -0.855364 0 0.518027
+-0.809017 0 0.587785 -0.809017 0 0.587785 -0.756995 0 0.653421
+-0.756995 0 0.653421 -0.699663 0 0.714473 -0.699663 0 0.714473
+-0.637424 0 0.770513 -0.637424 0 0.770513 -0.570714 0 0.821149
+-0.570714 0 0.821149 -0.5 0 0.866025 -0.5 0 0.866025
+-0.425779 0 0.904827 -0.425779 0 0.904827 -0.348572 0 0.937282
+-0.348572 0 0.937282 -0.26892 0 0.963163 -0.26892 0 0.963163
+-0.187381 0 0.982287 -0.187381 0 0.982287 -0.104528 0 0.994522
+-0.104528 0 0.994522 -0.0209424 0 0.999781 -0.0209424 0 0.999781
+0.0627905 0 0.998027 0.0627905 0 0.998027 0.146083 0 0.989272
+0.146083 0 0.989272 0.228351 0 0.973579 0.228351 0 0.973579
+0.309017 0 0.951057 0.309017 0 0.951057 0.387516 0 0.921863
+0.387516 0 0.921863 0.463296 0 0.886204 0.463296 0 0.886204
+0.535827 0 0.844328 0.535827 0 0.844328 0.604599 0 0.79653
+0.604599 0 0.79653 0.669131 0 0.743145 0.669131 0 0.743145
+0.728969 0 0.684547 0.728969 0 0.684547 0.783693 0 0.621148
+0.783693 0 0.621148 0.832921 0 0.553392 0.832921 0 0.553392
+0.876307 0 0.481754 0.876307 0 0.481754 0.913545 0 0.406737
+0.913545 0 0.406737 0.944376 0 0.328867 0.944376 0 0.328867
+0.968583 0 0.24869 0.968583 0 0.24869 0.985996 0 0.166769
+0.985996 0 0.166769 0.996493 0 0.0836778 0.996493 0 0.0836778
+
+TEXTURE_COORDINATES TCoords 2 float
+1 0 1 1 0.973333 0 0.973333 1 0.946667
+0 0.946667 1 0.92 0 0.92 1 0.893333 0
+0.893333 1 0.866667 0 0.866667 1 0.84 0 0.84
+1 0.813333 0 0.813333 1 0.786667 0 0.786667 1
+0.76 0 0.76 1 0.733333 0 0.733333 1 0.706667
+0 0.706667 1 0.68 0 0.68 1 0.653333 0
+0.653333 1 0.626667 0 0.626667 1 0.6 0 0.6
+1 0.573333 0 0.573333 1 0.546667 0 0.546667 1
+0.52 0 0.52 1 0.493333 0 0.493333 1 0.466667
+0 0.466667 1 0.44 0 0.44 1 0.413333 0
+0.413333 1 0.386667 0 0.386667 1 0.36 0 0.36
+1 0.333333 0 0.333333 1 0.306667 0 0.306667 1
+0.28 0 0.28 1 0.253333 0 0.253333 1 0.226667
+0 0.226667 1 0.2 0 0.2 1 0.173333 0
+0.173333 1 0.146667 0 0.146667 1 0.12 0 0.12
+1 0.0933333 0 0.0933333 1 0.0666667 0 0.0666667 1
+0.04 0 0.04 1 0.0133333 0 0.0133333 1 0.0133333
+0 0.0133333 1 0.04 0 0.04 1 0.0666667 0
+0.0666667 1 0.0933333 0 0.0933333 1 0.12 0 0.12
+1 0.146667 0 0.146667 1 0.173333 0 0.173333 1
+0.2 0 0.2 1 0.226667 0 0.226667 1 0.253333
+0 0.253333 1 0.28 0 0.28 1 0.306667 0
+0.306667 1 0.333333 0 0.333333 1 0.36 0 0.36
+1 0.386667 0 0.386667 1 0.413333 0 0.413333 1
+0.44 0 0.44 1 0.466667 0 0.466667 1 0.493333
+0 0.493333 1 0.52 0 0.52 1 0.546667 0
+0.546667 1 0.573333 0 0.573333 1 0.6 0 0.6
+1 0.626667 0 0.626667 1 0.653333 0 0.653333 1
+0.68 0 0.68 1 0.706667 0 0.706667 1 0.733333
+0 0.733333 1 0.76 0 0.76 1 0.786667 0
+0.786667 1 0.813333 0 0.813333 1 0.84 0 0.84
+1 0.866667 0 0.866667 1 0.893333 0 0.893333 1
+0.92 0 0.92 1 0.946667 0 0.946667 1 0.973333
+0 0.973333 1
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/controlDict b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/controlDict
new file mode 100644
index 00000000000..933969693bd
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/controlDict
@@ -0,0 +1,50 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v3.0+                                 |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application     snappyHexMesh;
+
+startFrom       latestTime;
+
+startTime       0;
+
+stopAt          endTime;
+
+endTime         100;
+
+deltaT          1;
+
+writeControl    runTime;
+
+writeInterval   1;
+
+purgeWrite      0;
+
+writeFormat     ascii;
+
+writePrecision  6;
+
+writeCompression off;
+
+timeFormat      general;
+
+timePrecision   6;
+
+runTimeModifiable true;
+
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/createPatchDict b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/createPatchDict
new file mode 100644
index 00000000000..74214eea863
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/createPatchDict
@@ -0,0 +1,112 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      createPatchDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+// This application/dictionary controls:
+// - optional: create new patches from boundary faces (either given as
+//   a set of patches or as a faceSet)
+// - always: order faces on coupled patches such that they are opposite. This
+//   is done for all coupled faces, not just for any patches created.
+// - optional: synchronise points on coupled patches.
+// - always: remove zero-sized (non-coupled) patches (that were not added)
+
+// 1. Create cyclic:
+// - specify where the faces should come from
+// - specify the type of cyclic. If a rotational specify the rotationAxis
+//   and centre to make matching easier
+// - always create both halves in one invocation with correct 'neighbourPatch'
+//   setting.
+// - optionally pointSync true to guarantee points to line up.
+
+// 2. Correct incorrect cyclic:
+// This will usually fail upon loading:
+//  "face 0 area does not match neighbour 2 by 0.0100005%"
+//  " -- possible face ordering problem."
+// - in polyMesh/boundary file:
+//      - loosen matchTolerance of all cyclics to get case to load
+//      - or change patch type from 'cyclic' to 'patch'
+//        and regenerate cyclic as above
+
+// Do a synchronisation of coupled points after creation of any patches.
+// Note: this does not work with points that are on multiple coupled patches
+//       with transformations (i.e. cyclics).
+pointSync false;
+
+// Patches to create.
+patches
+(
+    {
+        // Name of new patch
+        name oversetPatch;
+
+        // Dictionary to construct new patch from
+        patchInfo
+        {
+            type overset;
+        }
+
+        // How to construct: either from 'patches' or 'set'
+        constructFrom patches;
+
+        // If constructFrom = patches : names of patches. Wildcards allowed.
+        patches (otherSide);
+
+        // If constructFrom = set : name of faceSet
+        set f0;
+    }
+
+    {
+        // Name of new patch
+        name walls;
+
+        // Dictionary to construct new patch from
+        patchInfo
+        {
+            type wall;
+        }
+
+        // How to construct: either from 'patches' or 'set'
+        constructFrom patches;
+
+        // If constructFrom = patches : names of patches. Wildcards allowed.
+        patches (originalPatch);
+
+        // If constructFrom = set : name of faceSet
+        set f0;
+    }
+
+    {
+        // Name of new patch
+        name frontAndBack;
+
+        // Dictionary to construct new patch from
+        patchInfo
+        {
+            type empty;
+        }
+
+        // How to construct: either from 'patches' or 'set'
+        constructFrom patches;
+
+        // If constructFrom = patches : names of patches. Wildcards allowed.
+        patches (sides);
+
+        // If constructFrom = set : name of faceSet
+        set f0;
+    }
+
+);
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/extrudeMeshDict b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/extrudeMeshDict
new file mode 100644
index 00000000000..56563f90d3c
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/extrudeMeshDict
@@ -0,0 +1,136 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v3.0+                                 |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      extrudeMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+// What to extrude:
+//      patch   : from patch of another case ('sourceCase')
+//      mesh    : as above but with original case included
+//      surface : from externally read surface
+
+//constructFrom mesh;
+//constructFrom patch;
+constructFrom surface;
+
+// If construct from patch/mesh:
+sourceCase "../cavity";
+sourcePatches (movingWall);
+
+// If construct from patch: patch to use for back (can be same as sourcePatch)
+exposedPatchName movingWall;
+
+// If construct from surface:
+surface "constant/triSurface/cylinder.vtk";
+
+// Flip surface normals before usage. Valid only for extrude from surface or
+// patch.
+flipNormals false;
+
+//- Linear extrusion in point-normal direction
+extrudeModel        linearNormal;
+
+//- Single layer linear extrusion in point-normal direction
+//  with empty patches on front and back
+//extrudeModel        plane;
+
+//- Linear extrusion in specified direction
+//extrudeModel        linearDirection;
+
+//- Sector extrusion
+//extrudeModel        sector;
+
+//- Wedge extrusion of a single layer
+//  with wedge patches on front and back
+//extrudeModel        wedge;
+
+//- Extrudes into sphere around (0 0 0)
+//extrudeModel        linearRadial;
+
+//- Extrudes into sphere around (0 0 0) with specified radii
+//extrudeModel        radial;
+
+//- Extrudes into sphere with grading according to pressure (atmospherics)
+//extrudeModel        sigmaRadial;
+
+//- Extrudes by interpolating along path inbetween two (topologically identical)
+//  surfaces (e.g. one is an offsetted version of the other)
+//extrudeModel        offsetSurface;
+
+nLayers             10;
+
+expansionRatio      1.02;
+
+sectorCoeffs
+{
+    axisPt      (0 0.1 -0.05);
+    axis        (-1 0 0);
+    angle       360;  // For nLayers=1 assume symmetry so angle/2 on each side
+}
+
+linearNormalCoeffs
+{
+    thickness       0.7;
+}
+
+planeCoeffs
+{
+//    thickness       0.1;
+  nLayers 4;
+}
+
+linearDirectionCoeffs
+{
+    direction       (0 1 0);
+    thickness     0.5;
+}
+
+linearRadialCoeffs
+{
+    R               0.1;
+    // Optional inner radius
+    Rsurface        0.01;
+}
+
+radialCoeffs
+{
+    // Radii specified through interpolation table
+    R               table ((0 0.01)(3 0.03)(10 0.1));
+}
+
+sigmaRadialCoeffs
+{
+    RTbyg           1;
+    pRef            1;
+    pStrat          1;
+}
+
+offsetSurfaceCoeffs
+{
+    // Surface that mesh has been meshed to
+    baseSurface "$FOAM_CASE/constant/triSurface/DTC-scaled-inflated.obj";
+
+    // Surface to fill in to
+    offsetSurface "$FOAM_CASE/constant/triSurface/DTC-scaled.obj";
+}
+
+
+// Do front and back need to be merged? Usually only makes sense for 360
+// degree wedges.
+mergeFaces false;
+
+// Merge small edges. Fraction of bounding box.
+mergeTol 0;
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/fvSchemes b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/fvSchemes
new file mode 100644
index 00000000000..471fef01438
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/fvSchemes
@@ -0,0 +1,58 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v3.0+                                 |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+    default         Euler;
+}
+
+gradSchemes
+{
+    default         Gauss linear;
+}
+
+divSchemes
+{
+    default         none;
+    div(phi,U)      Gauss limitedLinearV 1;
+    div(phi,k)      Gauss upwind;
+    div(phi,epsilon) Gauss upwind;
+    div(phi,R)      Gauss upwind;
+    div(R)          Gauss linear;
+    div(phid,p)     Gauss limitedLinear 1;
+    div(phi,K)      Gauss limitedLinear 1;
+    div(phi,e)      Gauss limitedLinear 1;
+    div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+    default         Gauss linear limited corrected 0.5;
+}
+
+interpolationSchemes
+{
+    default         linear;
+}
+
+snGradSchemes
+{
+    default         corrected;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/fvSolution b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/fvSolution
new file mode 100644
index 00000000000..852422eb082
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/fvSolution
@@ -0,0 +1,51 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v3.0+                                 |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+    p
+    {
+        solver          smoothSolver;
+        smoother        symGaussSeidel;
+        tolerance       1e-12;
+        relTol          0;
+    }
+
+    rho
+    {
+        solver          PCG;
+        preconditioner  DIC;
+        tolerance       1e-08;
+        relTol          0;
+    }
+
+    "(U|e|k|epsilon|R)"
+    {
+        $p;
+        tolerance       1e-08;
+        relTol          0;
+    }
+}
+
+PISO
+{
+    nCorrectors     2;
+    nNonOrthogonalCorrectors 2;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/U b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/U
new file mode 100644
index 00000000000..b1fc09c1253
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/U
@@ -0,0 +1,62 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volVectorField;
+    object      U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 1 -1 0 0 0 0];
+
+internalField   uniform (0 0 0);
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    walls
+    {
+        //type            slip;
+        type            uniformFixedValue;
+        uniformValue    (0 0 0);
+    }
+
+    hole
+    {
+        type            movingWallVelocity;
+        value           uniform (0 0 0);
+    }
+
+//    left1
+//    {
+//        type            pressureInletOutletVelocity;
+//        value           uniform (0 0 0);
+//    }
+//    left1
+//    {
+//        type            fixedValue;
+//        value           $internalField;
+//    }
+//
+//    right1
+//    {
+//        type            zeroGradient;   //calculated;
+//        value           $internalField;
+//    }
+
+    overset
+    {
+        type            overset;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/epsilon b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/epsilon
new file mode 100644
index 00000000000..ca86c9f6e5f
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/epsilon
@@ -0,0 +1,52 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    location    "0";
+    object      epsilon;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [ 0 2 -3 0 0 0 0 ];
+
+internalField   uniform 200;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    "(walls|hole)"
+    {
+        type            epsilonWallFunction;
+        value           $internalField;
+    }
+
+//    left1
+//    {
+//        type            turbulentMixingLengthDissipationRateInlet;
+//        mixingLength    0.01;       // 1cm - half channel height
+//        value           $internalField;
+//    }
+//
+//    right1
+//    {
+//        type            calculated;
+//        value           $internalField;
+//    }
+
+    overset
+    {
+        type            overset;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/k b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/k
new file mode 100644
index 00000000000..b74e3daf920
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/k
@@ -0,0 +1,51 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      k;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [ 0 2 -2 0 0 0 0 ];
+
+internalField   uniform 0.2;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    "(walls|hole)"
+    {
+        type            kqRWallFunction;
+        value           uniform 0;
+    }
+
+//    left1
+//    {
+//        type            turbulentIntensityKineticEnergyInlet;
+//        intensity       0.05;       // 5% turbulent intensity
+//        value           $internalField;
+//    }
+//
+//    right1
+//    {
+//        type            calculated;
+//        value           $internalField;
+//    }
+
+    overset
+    {
+        type            overset;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/nuTilda b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/nuTilda
new file mode 100644
index 00000000000..11af85939e9
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/nuTilda
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      nuTilda;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 2 -1 0 0 0 0];
+
+internalField   uniform 0;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    overset
+    {
+        type            overset;
+    }
+
+    ".*"
+    {
+        type            zeroGradient;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/nut b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/nut
new file mode 100644
index 00000000000..f7c72d5ce2a
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/nut
@@ -0,0 +1,50 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      nut;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [ 0 2 -1 0 0 0 0 ];
+
+internalField   uniform 0;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    "(walls|hole)"
+    {
+        type            nutkWallFunction;
+        value           uniform 0;
+    }
+
+//    left1
+//    {
+//        type            calculated;
+//        value           uniform 0;
+//    }
+//
+//    right1
+//    {
+//        type            calculated;
+//        value           uniform 0;
+//    }
+
+    overset
+    {
+        type            overset;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/p b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/p
new file mode 100644
index 00000000000..55e4c8b692e
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/p
@@ -0,0 +1,64 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 2 -2 0 0 0 0];
+
+internalField   uniform 0;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    "(walls|hole)"
+    {
+        type            zeroGradient;
+    }
+
+//    left1
+//    {
+//        type            uniformTotalPressure;
+//        pressure        table
+//        (
+//            (0 10)
+//            (1 40)
+//        );
+//        p0              40; // only used for restarts
+//        U               U;
+//        phi             phi;
+//        rho             none;
+//        psi             none;
+//        gamma           1;
+//        value           uniform 40;
+//    }
+//    left1
+//    {
+//        type            zeroGradient;
+//    }
+//
+//    right1
+//    {
+//        type            fixedValue;   //calculated;
+//        value           $internalField;
+//    }
+
+    overset
+    {
+        type            overset;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/pointDisplacement b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/pointDisplacement
new file mode 100644
index 00000000000..fe072121d35
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/pointDisplacement
@@ -0,0 +1,41 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       pointVectorField;
+    object      pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 1 0 0 0 0 0];
+
+internalField   uniform (0 0 0);
+
+boundaryField
+{
+    ".*"
+    {
+        type            uniformFixedValue;
+        uniformValue    (0 0 0);
+    }
+
+    overset
+    {
+        patchType       overset;
+        type            zeroGradient;
+    }
+
+    hole
+    {
+        type            zeroGradient;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/zoneID b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/zoneID
new file mode 100644
index 00000000000..acef7b1a3df
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/zoneID
@@ -0,0 +1,38 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      zoneID;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 0 0 0 0 0 0];
+
+internalField   uniform 0;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    ".*"
+    {
+        type            zeroGradient;
+    }
+
+    overset
+    {
+        type            overset;
+        value           uniform 0;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/Allclean b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/Allclean
new file mode 100755
index 00000000000..5d96ca404a3
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/Allclean
@@ -0,0 +1,14 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # run from this directory
+
+# Source tutorial clean functions
+. $WM_PROJECT_DIR/bin/tools/CleanFunctions
+
+cleanCase
+rm -f constant/polyMesh/boundary
+rm -f constant/polyMesh/zoneID
+rm -f constant/cellInterpolationWeight
+
+rm -rf 0
+
+# ----------------------------------------------------------------- end-of-file
diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/Allrun b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/Allrun
new file mode 100755
index 00000000000..9edfe26c89a
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/Allrun
@@ -0,0 +1,6 @@
+#!/bin/sh
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+./Allrun.pre
+
+runApplication overPimpleDyMFoam
diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/Allrun.pre b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/Allrun.pre
new file mode 100755
index 00000000000..a6ddc21dbe9
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/Allrun.pre
@@ -0,0 +1,19 @@
+#!/bin/sh
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+runApplication blockMesh
+
+# Select cellSets
+runApplication topoSet
+
+runApplication subsetMesh box -patch hole -overwrite
+
+# Select cellSets
+rm log.topoSet
+
+runApplication topoSet
+
+rm -rf 0 && cp -r 0.org 0
+
+# Use cellSets to write zoneID
+runApplication setFields
diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/RASProperties b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/RASProperties
new file mode 100644
index 00000000000..ec34b4c47c9
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/RASProperties
@@ -0,0 +1,23 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      RASProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+RASModel        laminar;    //kEpsilon;
+
+turbulence      off;        //on;
+
+printCoeffs     off;        //on;
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/dynamicMeshDict b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/dynamicMeshDict
new file mode 100644
index 00000000000..951bd08dae5
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/dynamicMeshDict
@@ -0,0 +1,49 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dynamicFvMesh       dynamicOversetFvMesh;
+
+dynamicOversetFvMeshCoeffs
+{
+//    layerRelax 0.3;
+}
+
+//motionSolverLibs ( "libfvMotionSolvers.so" );
+//
+//solver          displacementLaplacian;
+//
+//displacementLaplacianCoeffs
+//{
+//    diffusivity     uniform 1;
+//}
+
+solver          multiSolidBodyMotionSolver;
+
+multiSolidBodyMotionSolverCoeffs
+{
+    movingZone
+    {
+        solidBodyMotionFunction rotatingMotion;
+        rotatingMotionCoeffs
+        {
+            origin      (0.005 0.005 0.005);
+            axis        (0 0 1);
+            omega       100.0;
+        }
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/transportProperties b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/transportProperties
new file mode 100644
index 00000000000..4efbc8b9325
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/transportProperties
@@ -0,0 +1,39 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+DT              DT [ 0 2 -1 0 0 0 0 ] 1;    //4e-05;
+
+transportModel  Newtonian;
+
+nu              nu [ 0 2 -1 0 0 0 0 ] 1e-05;
+
+CrossPowerLawCoeffs
+{
+    nu0             nu0 [ 0 2 -1 0 0 0 0 ] 1e-06;
+    nuInf           nuInf [ 0 2 -1 0 0 0 0 ] 1e-06;
+    m               m [ 0 0 1 0 0 0 0 ] 1;
+    n               n [ 0 0 0 0 0 0 0 ] 1;
+}
+
+BirdCarreauCoeffs
+{
+    nu0             nu0 [ 0 2 -1 0 0 0 0 ] 1e-06;
+    nuInf           nuInf [ 0 2 -1 0 0 0 0 ] 1e-06;
+    k               k [ 0 0 1 0 0 0 0 ] 0;
+    n               n [ 0 0 0 0 0 0 0 ] 1;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/turbulenceProperties b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/turbulenceProperties
new file mode 100644
index 00000000000..c1f1b1a8341
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/turbulenceProperties
@@ -0,0 +1,19 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType laminar; //RASModel;
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/blockMeshDict b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/blockMeshDict
new file mode 100644
index 00000000000..7e5a21da5f5
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/blockMeshDict
@@ -0,0 +1,97 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+convertToMeters 0.01;
+
+vertices
+(
+    ( 0.00  0.0  0)
+    ( 1.00  0.0  0)
+    ( 1.00  1.0  0)
+    ( 0.00  1.0  0)
+    ( 0.00  0.0  1)
+    ( 1.00  0.0  1)
+    ( 1.00  1.0  1)
+    ( 0.00  1.0  1)
+
+    ( 0.15  0.35  0)
+    ( 0.85  0.35  0)
+    ( 0.85  0.65  0)
+    ( 0.15  0.65  0)
+    ( 0.15  0.35  1)
+    ( 0.85  0.35  1)
+    ( 0.85  0.65  1)
+    ( 0.15  0.65  1)
+);
+
+blocks
+(
+    hex (0 1 2 3 4 5 6 7) (36 36 1) simpleGrading (1 1 1)
+
+    hex (8 9 10 11 12 13 14 15) movingZone (28 12 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+    overset2
+    {
+        type        overset;
+        faces
+        (
+            ( 8 12 15 11)
+            (10 14 13  9)
+            (11 15 14 10)
+            ( 9 13 12  8)
+        );
+    }
+
+    walls
+    {
+        type wall;
+        faces
+        (
+            (3 7 6 2)
+            (1 5 4 0)
+            (0 4 7 3)
+            (2 6 5 1)
+        );
+    }
+
+    // Populated by subsetMesh
+    hole
+    {
+        type wall;
+        faces ();
+    }
+
+    frontAndBack
+    {
+        type empty;
+        faces
+        (
+            (0 3 2 1)
+            (4 5 6 7)
+            ( 8 11 10  9)
+            (12 13 14 15)
+        );
+    }
+);
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/controlDict b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/controlDict
new file mode 100644
index 00000000000..d9178735a16
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/controlDict
@@ -0,0 +1,55 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+libs            ("liboverset.so");
+
+application     overPimpleDyMFoam;
+
+startFrom       startTime;
+
+startTime       0;
+
+stopAt          endTime;
+
+endTime         0.1;
+
+deltaT          0.00025;
+
+//writeControl    timeStep;
+//writeInterval   10;
+
+writeControl    adjustableRunTime;
+writeInterval   0.01;
+
+purgeWrite      0;
+
+writeFormat     ascii;
+
+writePrecision  10;
+
+writeCompression off;
+
+timeFormat      general;
+
+timePrecision   6;
+
+runTimeModifiable true;
+
+adjustTimeStep  yes;
+
+maxCo           1;
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/decomposeParDict b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/decomposeParDict
new file mode 100644
index 00000000000..805c936e877
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/decomposeParDict
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    note        "mesh decomposition control dictionary";
+    object      decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains  3;
+
+method          hierarchical;
+
+hierarchicalCoeffs
+{
+    n           (3 1 1);
+    delta       0.001;
+    order       xyz;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/fvSchemes b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/fvSchemes
new file mode 100644
index 00000000000..067d2aa43b6
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/fvSchemes
@@ -0,0 +1,69 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+    default         Euler;
+}
+
+gradSchemes
+{
+    default         Gauss linear;
+    grad(T)         Gauss linear;
+}
+
+divSchemes
+{
+    default         none;
+    div(phi,U)      Gauss limitedLinearV 1;
+    div(phi,k)      Gauss limitedLinear 1;
+    div(phi,epsilon) Gauss limitedLinear 1;
+    div(phi,R)      Gauss limitedLinear 1;
+    div(R)          Gauss linear;
+    div(phi,nuTilda) Gauss limitedLinear 1;
+    div((nuEff*dev(T(grad(U))))) Gauss linear;
+    div((nuEff*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+    default         Gauss linear corrected;
+    laplacian(diffusivity,cellDisplacement)  Gauss linear corrected;
+}
+
+interpolationSchemes
+{
+    default         linear;
+}
+
+snGradSchemes
+{
+    default         corrected;
+}
+
+oversetInterpolation
+{
+    method          inverseDistance;
+}
+
+fluxRequired
+{
+    default         no;
+    pcorr           ;
+    p               ;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/fvSolution b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/fvSolution
new file mode 100644
index 00000000000..464100d29a4
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/fvSolution
@@ -0,0 +1,96 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+    cellDisplacement
+    {
+        solver          PCG;
+        preconditioner  DIC;
+
+        tolerance       1e-06;
+        relTol          0;
+        maxIter         100;
+    }
+
+    p
+    {
+        solver          PBiCGStab;
+        preconditioner  DILU;
+        tolerance       1e-6;
+        relTol          0;
+    }
+
+    pFinal
+    {
+        $p;
+    }
+
+    pcorr
+    {
+        $p;
+        solver          PCG;
+        preconditioner  DIC;
+    }
+
+    pcorrFinal
+    {
+        $pcorr;
+        relTol          0;
+    }
+
+    "(U|k|epsilon)"
+    {
+        solver          smoothSolver;
+        smoother        symGaussSeidel;
+        tolerance       1e-6;
+        relTol          0;
+    }
+
+    "(U|k|epsilon)Final"
+    {
+        $U;
+        tolerance       1e-6;
+        relTol          0;
+    }
+}
+
+PIMPLE
+{
+    momentumPredictor   no;
+    correctPhi          no;
+    nOuterCorrectors    1;
+    nCorrectors         2;
+    nNonOrthogonalCorrectors 0;
+
+    ddtCorr             false;
+
+    pRefPoint           (0.0001 0.0001 0.001);
+    pRefValue           0.0;
+}
+
+relaxationFactors
+{
+   fields
+   {
+   }
+   equations
+   {
+       ".*"             1;
+   }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/setFieldsDict b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/setFieldsDict
new file mode 100644
index 00000000000..21c7adb08ee
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/setFieldsDict
@@ -0,0 +1,48 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      setFieldsDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+defaultFieldValues
+(
+    volScalarFieldValue zoneID 123
+);
+
+regions
+(
+    // Set cell values
+    // (does zerogradient on boundaries)
+    cellToCell
+    {
+        set c0;
+
+        fieldValues
+        (
+            volScalarFieldValue zoneID 0
+        );
+    }
+
+    cellToCell
+    {
+        set c1;
+
+        fieldValues
+        (
+            volScalarFieldValue zoneID 1
+        );
+    }
+
+);
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/topoSetDict b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/topoSetDict
new file mode 100644
index 00000000000..4b0957e2889
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/topoSetDict
@@ -0,0 +1,78 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      topoSetDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+actions
+(
+    {
+        name    c0;
+        type    cellSet;
+        action  new;
+        source  regionToCell;
+        sourceInfo
+        {
+            insidePoints ((0.001 0.001 0.001));
+        }
+    }
+
+    {
+        name    c1;
+        type    cellSet;
+        action  new;
+        source  cellToCell;
+        sourceInfo
+        {
+            set c0;
+        }
+    }
+
+    {
+        name    c1;
+        type    cellSet;
+        action  invert;
+    }
+
+    // Select box to remove from region 1
+
+    {
+        name    box;
+        type    cellSet;
+        action  new;
+        source  cellToCell;
+        sourceInfo
+        {
+            set c1;
+        }
+    }
+
+    {
+        name    box;
+        type    cellSet;
+        action  subset;
+        source  boxToCell;
+        sourceInfo
+        {
+            box (0.0025 0.0045 -100)(0.0075 0.0055 100);
+        }
+    }
+
+    {
+        name    box;
+        type    cellSet;
+        action  invert;
+    }
+);
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/U b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/U
new file mode 100644
index 00000000000..b1fc09c1253
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/U
@@ -0,0 +1,62 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volVectorField;
+    object      U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 1 -1 0 0 0 0];
+
+internalField   uniform (0 0 0);
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    walls
+    {
+        //type            slip;
+        type            uniformFixedValue;
+        uniformValue    (0 0 0);
+    }
+
+    hole
+    {
+        type            movingWallVelocity;
+        value           uniform (0 0 0);
+    }
+
+//    left1
+//    {
+//        type            pressureInletOutletVelocity;
+//        value           uniform (0 0 0);
+//    }
+//    left1
+//    {
+//        type            fixedValue;
+//        value           $internalField;
+//    }
+//
+//    right1
+//    {
+//        type            zeroGradient;   //calculated;
+//        value           $internalField;
+//    }
+
+    overset
+    {
+        type            overset;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/p b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/p
new file mode 100644
index 00000000000..55e4c8b692e
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/p
@@ -0,0 +1,64 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 2 -2 0 0 0 0];
+
+internalField   uniform 0;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    "(walls|hole)"
+    {
+        type            zeroGradient;
+    }
+
+//    left1
+//    {
+//        type            uniformTotalPressure;
+//        pressure        table
+//        (
+//            (0 10)
+//            (1 40)
+//        );
+//        p0              40; // only used for restarts
+//        U               U;
+//        phi             phi;
+//        rho             none;
+//        psi             none;
+//        gamma           1;
+//        value           uniform 40;
+//    }
+//    left1
+//    {
+//        type            zeroGradient;
+//    }
+//
+//    right1
+//    {
+//        type            fixedValue;   //calculated;
+//        value           $internalField;
+//    }
+
+    overset
+    {
+        type            overset;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/pointDisplacement b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/pointDisplacement
new file mode 100644
index 00000000000..b218758016c
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/pointDisplacement
@@ -0,0 +1,41 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       pointVectorField;
+    object      pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 1 0 0 0 0 0];
+
+internalField   uniform (0 0 0);
+
+boundaryField
+{
+    ".*"
+    {
+        type            uniformFixedValue;
+        uniformValue    (0 0 0);
+    }
+
+    hole
+    {
+        type            zeroGradient;
+    }
+
+    overset
+    {
+        patchType       overset;
+        type            zeroGradient;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/zoneID b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/zoneID
new file mode 100644
index 00000000000..b1cdf0478ed
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/zoneID
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      zoneID;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 0 0 0 0 0 0];
+
+internalField   uniform 0;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    overset
+    {
+        type            overset;
+    }
+
+    ".*"
+    {
+        type            zeroGradient;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/Allclean b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/Allclean
new file mode 100755
index 00000000000..5d96ca404a3
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/Allclean
@@ -0,0 +1,14 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # run from this directory
+
+# Source tutorial clean functions
+. $WM_PROJECT_DIR/bin/tools/CleanFunctions
+
+cleanCase
+rm -f constant/polyMesh/boundary
+rm -f constant/polyMesh/zoneID
+rm -f constant/cellInterpolationWeight
+
+rm -rf 0
+
+# ----------------------------------------------------------------- end-of-file
diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/Allrun b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/Allrun
new file mode 100755
index 00000000000..ea6d08a994b
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/Allrun
@@ -0,0 +1,14 @@
+#!/bin/sh
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+./Allrun.pre
+
+# Get application directory
+application=`getApplication`
+
+# Serial
+#runApplication $application
+
+# Parallel
+runApplication decomposePar -cellDist
+runParallel $application
diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/Allrun.pre b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/Allrun.pre
new file mode 100755
index 00000000000..19f634cd43d
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/Allrun.pre
@@ -0,0 +1,17 @@
+#!/bin/sh
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+runApplication blockMesh
+
+# Select cellSets
+runApplication -s 1 topoSet
+
+runApplication subsetMesh box -patch hole -overwrite
+
+# Select cellSets
+runApplication -s 2 topoSet
+
+rm -rf 0 && cp -r 0.org 0
+
+# Use cellSets to write zoneID
+runApplication setFields
diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/README.txt b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/README.txt
new file mode 100644
index 00000000000..eb98b26f8d7
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/README.txt
@@ -0,0 +1,3 @@
+Transient, moving mesh
+----------------------
+Two turning rotors
diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/constant/dynamicMeshDict b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/constant/dynamicMeshDict
new file mode 100644
index 00000000000..391eb516ead
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/constant/dynamicMeshDict
@@ -0,0 +1,51 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dynamicFvMesh       dynamicOversetFvMesh;
+
+dynamicOversetFvMeshCoeffs
+{
+//    layerRelax 0.3;
+}
+
+solver          multiSolidBodyMotionSolver;
+
+multiSolidBodyMotionSolverCoeffs
+{
+    movingZone1
+    {
+        solidBodyMotionFunction rotatingMotion;
+        rotatingMotionCoeffs
+        {
+            origin      (0.005 0.005 0.005);
+            axis        (0 0 1);
+            omega       100.0;
+        }
+    }
+
+    movingZone2
+    {
+        solidBodyMotionFunction rotatingMotion;
+        rotatingMotionCoeffs
+        {
+            origin      (0.009 0.005 0.005);
+            axis        (0 0 1);
+            omega       -100.0;
+        }
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/constant/transportProperties b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/constant/transportProperties
new file mode 100644
index 00000000000..ab4d80f3308
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/constant/transportProperties
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+transportModel  Newtonian;
+
+nu              nu [ 0 2 -1 0 0 0 0 ] 1e-05;
+
+CrossPowerLawCoeffs
+{
+    nu0             nu0 [ 0 2 -1 0 0 0 0 ] 1e-06;
+    nuInf           nuInf [ 0 2 -1 0 0 0 0 ] 1e-06;
+    m               m [ 0 0 1 0 0 0 0 ] 1;
+    n               n [ 0 0 0 0 0 0 0 ] 1;
+}
+
+BirdCarreauCoeffs
+{
+    nu0             nu0 [ 0 2 -1 0 0 0 0 ] 1e-06;
+    nuInf           nuInf [ 0 2 -1 0 0 0 0 ] 1e-06;
+    k               k [ 0 0 1 0 0 0 0 ] 0;
+    n               n [ 0 0 0 0 0 0 0 ] 1;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/constant/turbulenceProperties b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/constant/turbulenceProperties
new file mode 100644
index 00000000000..9abf14eeecd
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/constant/turbulenceProperties
@@ -0,0 +1,19 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType   laminar;
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/blockMeshDict b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/blockMeshDict
new file mode 100644
index 00000000000..5456fdbf9c0
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/blockMeshDict
@@ -0,0 +1,140 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+convertToMeters 0.01;
+
+vertices
+(
+    ( 0.00  0.0  0)
+    ( 2.00  0.0  0)
+    ( 2.00  1.0  0)
+    ( 0.00  1.0  0)
+    ( 0.00  0.0  1)
+    ( 2.00  0.0  1)
+    ( 2.00  1.0  1)
+    ( 0.00  1.0  1)
+
+    // movingZone1
+    ( 0.15  0.35  0)
+    ( 0.85  0.35  0)
+    ( 0.85  0.65  0)
+    ( 0.15  0.65  0)
+    ( 0.15  0.35  1)
+    ( 0.85  0.35  1)
+    ( 0.85  0.65  1)
+    ( 0.15  0.65  1)
+
+    // movingZone2
+    ( 0.75  0.15  0)
+    ( 1.05  0.15  0)
+    ( 1.05  0.85  0)
+    ( 0.75  0.85  0)
+    ( 0.75  0.15  1)
+    ( 1.05  0.15  1)
+    ( 1.05  0.85  1)
+    ( 0.75  0.85  1)
+);
+
+blocks
+(
+    hex (0 1 2 3 4 5 6 7) (73 37 1) simpleGrading (1 1 1)
+
+    hex (8 9 10 11 12 13 14 15) movingZone1 (28 12 1) simpleGrading (1 1 1)
+
+    hex (16 17 18 19 20 21 22 23) movingZone2 (12 28 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+    overset1
+    {
+        type        overset;
+        faces
+        (
+            ( 8 12 15 11)
+            (10 14 13  9)
+            (11 15 14 10)
+            ( 9 13 12  8)
+        );
+    }
+
+    overset2
+    {
+        type        overset;
+        faces
+        (
+            (16 20 23 19)
+            (18 22 21 17)
+            (19 23 22 18)
+            (17 21 20 16)
+        );
+    }
+
+    walls
+    {
+        type wall;
+        faces
+        (
+            (3 7 6 2)
+            (1 5 4 0)
+            (0 4 7 3)
+            (2 6 5 1)
+        );
+    }
+
+    // Populated by subsetMesh
+    hole
+    {
+        type wall;
+        faces ();
+    }
+
+    frontAndBack
+    {
+        type empty;
+        faces
+        (
+            (0 3 2 1)
+            (4 5 6 7)
+        );
+    }
+
+    frontAndBack1
+    {
+        type empty;
+        faces
+        (
+            ( 8 11 10  9)
+            (12 13 14 15)
+        );
+    }
+
+    frontAndBack2
+    {
+        type empty;
+        faces
+        (
+            (16 19 18 17)
+            (20 21 22 23)
+        );
+    }
+);
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/controlDict b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/controlDict
new file mode 100644
index 00000000000..591998cc3f6
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/controlDict
@@ -0,0 +1,53 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+libs            ("liboverset.so");
+
+application     overPimpleDyMFoam;
+
+startFrom       startTime;
+
+startTime       0;
+
+stopAt          endTime;
+
+endTime         0.06;
+
+deltaT          0.00025;
+
+writeControl    adjustableRunTime;
+
+writeInterval   0.005;
+
+purgeWrite      0;
+
+writeFormat     ascii;
+
+writePrecision  10;
+
+writeCompression off;
+
+timeFormat      general;
+
+timePrecision   6;
+
+runTimeModifiable true;
+
+adjustTimeStep  yes;
+
+maxCo           1;
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/decomposeParDict b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/decomposeParDict
new file mode 100644
index 00000000000..2e73b80199c
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/decomposeParDict
@@ -0,0 +1,30 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    note        "mesh decomposition control dictionary";
+    object      decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains  3;
+
+
+method          hierarchical;
+
+hierarchicalCoeffs
+{
+    n           (3 1 1);
+    delta       0.001;
+    order       xyz;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/fvSchemes b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/fvSchemes
new file mode 100644
index 00000000000..4e18294c71a
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/fvSchemes
@@ -0,0 +1,68 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+    default         Euler;
+}
+
+gradSchemes
+{
+    default         Gauss linear;
+    grad(T)         Gauss linear;
+}
+
+divSchemes
+{
+    default         none;
+    div(phi,U)      Gauss limitedLinearV 1;
+    div(phi,k)      Gauss limitedLinear 1;
+    div(phi,epsilon) Gauss limitedLinear 1;
+    div(phi,R)      Gauss limitedLinear 1;
+    div(R)          Gauss linear;
+    div(phi,nuTilda) Gauss limitedLinear 1;
+    div((nuEff*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+    default         Gauss linear corrected;
+    laplacian(diffusivity,cellDisplacement)  Gauss linear corrected;
+}
+
+interpolationSchemes
+{
+    default         linear;
+}
+
+snGradSchemes
+{
+    default         corrected;
+}
+
+oversetInterpolation
+{
+    method          inverseDistance;
+}
+
+fluxRequired
+{
+    default         no;
+    pcorr           ;
+    p               ;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/fvSolution b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/fvSolution
new file mode 100644
index 00000000000..464100d29a4
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/fvSolution
@@ -0,0 +1,96 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+    cellDisplacement
+    {
+        solver          PCG;
+        preconditioner  DIC;
+
+        tolerance       1e-06;
+        relTol          0;
+        maxIter         100;
+    }
+
+    p
+    {
+        solver          PBiCGStab;
+        preconditioner  DILU;
+        tolerance       1e-6;
+        relTol          0;
+    }
+
+    pFinal
+    {
+        $p;
+    }
+
+    pcorr
+    {
+        $p;
+        solver          PCG;
+        preconditioner  DIC;
+    }
+
+    pcorrFinal
+    {
+        $pcorr;
+        relTol          0;
+    }
+
+    "(U|k|epsilon)"
+    {
+        solver          smoothSolver;
+        smoother        symGaussSeidel;
+        tolerance       1e-6;
+        relTol          0;
+    }
+
+    "(U|k|epsilon)Final"
+    {
+        $U;
+        tolerance       1e-6;
+        relTol          0;
+    }
+}
+
+PIMPLE
+{
+    momentumPredictor   no;
+    correctPhi          no;
+    nOuterCorrectors    1;
+    nCorrectors         2;
+    nNonOrthogonalCorrectors 0;
+
+    ddtCorr             false;
+
+    pRefPoint           (0.0001 0.0001 0.001);
+    pRefValue           0.0;
+}
+
+relaxationFactors
+{
+   fields
+   {
+   }
+   equations
+   {
+       ".*"             1;
+   }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/setFieldsDict b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/setFieldsDict
new file mode 100644
index 00000000000..b3f3729fe8b
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/setFieldsDict
@@ -0,0 +1,57 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      setFieldsDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+defaultFieldValues
+(
+    volScalarFieldValue zoneID 123
+);
+
+regions
+(
+    // Set cell values
+    // (does zerogradient on boundaries)
+    cellToCell
+    {
+        set c0;
+
+        fieldValues
+        (
+            volScalarFieldValue zoneID 0
+        );
+    }
+
+    cellToCell
+    {
+        set c1;
+
+        fieldValues
+        (
+            volScalarFieldValue zoneID 1
+        );
+    }
+
+    cellToCell
+    {
+        set c2;
+
+        fieldValues
+        (
+            volScalarFieldValue zoneID 2
+        );
+    }
+);
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/topoSetDict b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/topoSetDict
new file mode 100644
index 00000000000..db08fe53b5d
--- /dev/null
+++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/topoSetDict
@@ -0,0 +1,116 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus-overset                          |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      topoSetDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+actions
+(
+    {
+        name    c0;
+        type    cellSet;
+        action  new;
+        source  regionsToCell;
+        sourceInfo
+        {
+            insidePoints ((0.001 0.001 0.001));
+        }
+    }
+
+    {
+        name    c1;
+        type    cellSet;
+        action  new;
+        source  cellToCell;
+        sourceInfo
+        {
+            set c0;
+        }
+    }
+
+    {
+        name    c1;
+        type    cellSet;
+        action  invert;
+    }
+
+    {
+        name    c2;
+        type    cellSet;
+        action  new;
+        source  regionsToCell;
+        sourceInfo
+        {
+            insidePoints ((0.0076 0.00151 0.001));
+            set          c1;
+        }
+    }
+
+    {
+        name    c1;
+        type    cellSet;
+        action  delete;
+        source  cellToCell;
+        sourceInfo
+        {
+            set c2;
+        }
+    }
+
+    // Select box to remove from region 1 and 2
+
+    {
+        name    box;
+        type    cellSet;
+        action  new;
+        source  cellToCell;
+        sourceInfo
+        {
+            set c1;
+        }
+    }
+
+    {
+        name    box;
+        type    cellSet;
+        action  add;
+        source  cellToCell;
+        sourceInfo
+        {
+            set c2;
+        }
+    }
+
+    {
+        name    box;
+        type    cellSet;
+        action  subset;
+        source  boxToCell;
+        sourceInfo
+        {
+            boxes
+            (
+                 (0.0025 0.0045 -100)(0.0075 0.0055 100)
+                 (0.0085 0.0025 -100)(0.0095 0.0075 100)
+            );
+        }
+    }
+
+    {
+        name    box;
+        type    cellSet;
+        action  invert;
+    }
+);
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/Allclean b/tutorials/incompressible/overSimpleFoam/aeroFoil/Allclean
new file mode 100755
index 00000000000..10394c3ebe5
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/Allclean
@@ -0,0 +1,20 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # Run from this directory
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/CleanFunctions
+
+cd aeroFoil_snappyHexMesh
+cleanCase
+
+cd ../aeroFoil_overset
+cleanCase
+rm -rf 0
+
+cd ../background_snappyHexMesh
+cleanCase
+
+
+cd ../background_overset
+cleanCase
+./Allclean
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/Allrun b/tutorials/incompressible/overSimpleFoam/aeroFoil/Allrun
new file mode 100755
index 00000000000..728e17019da
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/Allrun
@@ -0,0 +1,10 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # Run from this directory
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+
+./Allrun.pre
+cd background_overset
+./Allrun
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/Allrun.pre b/tutorials/incompressible/overSimpleFoam/aeroFoil/Allrun.pre
new file mode 100755
index 00000000000..6b300fc25ac
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/Allrun.pre
@@ -0,0 +1,12 @@
+#!/bin/sh
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+# create aeroFoil mesh using snappyHexMesh
+(cd aeroFoil_snappyHexMesh && ./Allrun.pre)
+
+# Extrude mesh
+(cd aeroFoil_overset && ./Allrun.pre)
+
+(cd background_snappyHexMesh && ./Allrun.pre)
+
+(cd background_overset &&  ./Allrun.pre)
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/README.txt b/tutorials/incompressible/overSimpleFoam/aeroFoil/README.txt
new file mode 100644
index 00000000000..c77aeeff8ac
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/README.txt
@@ -0,0 +1,14 @@
+Steady state, steady mesh
+-------------------------
+
+aeroFoil_snappyHexMesh/
+    For generating (3D) mesh for background
+
+aeroFoil_overset/
+    Extruding into 2D
+
+background_snappyHexMesh/
+    For generating (3D) mesh for background
+
+background_overset/
+    Combined mesh for running
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/Allrun.pre b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/Allrun.pre
new file mode 100755
index 00000000000..98a5ce71db0
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/Allrun.pre
@@ -0,0 +1,10 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # Run from this directory
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+
+# Make a 2D mesh by extruding a patch and solve to steady state.
+runApplication extrudeMesh
+runApplication createPatch -overwrite
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/constant/transportProperties b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/constant/transportProperties
new file mode 100644
index 00000000000..9531534e980
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/constant/transportProperties
@@ -0,0 +1,21 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+transportModel Newtonian;
+
+nu              [0 2 -1 0 0 0 0] 1e-05;
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/constant/turbulenceProperties b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/constant/turbulenceProperties
new file mode 100644
index 00000000000..7b102c0acca
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/constant/turbulenceProperties
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType RAS;
+
+RAS
+{
+    RASModel        kOmegaSST;
+
+    turbulence      on;
+
+    printCoeffs     on;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/controlDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/controlDict
new file mode 100644
index 00000000000..6e5ca5c1c57
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/controlDict
@@ -0,0 +1,65 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application     simpleFoam;
+
+startFrom       latestTime;
+
+startTime       0;
+
+stopAt          endTime;
+
+endTime         3000;
+
+deltaT          1;
+
+writeControl    runTime;
+
+writeInterval   100;
+
+purgeWrite      0;
+
+writeFormat     binary;
+
+writePrecision  6;
+
+writeCompression off;
+
+timeFormat      general;
+
+timePrecision   6;
+
+runTimeModifiable true;
+
+functions
+{
+    forces
+    {
+        type                forces;
+        functionObjectLibs  ( "libforces.so" );
+        outputControl       timeStep;
+        outputInterval      10;
+        patches             (wing);
+        pName               p;
+        UName               U;
+        rhoName             rhoInf;
+        log                 true;
+        rhoInf              1;
+        CofR                (0.4974612746 -0.01671895744 0.125);
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/createPatchDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/createPatchDict
new file mode 100644
index 00000000000..89853b13d6e
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/createPatchDict
@@ -0,0 +1,86 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      createPatchDict;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+// Do a synchronisation of coupled points after creation of any patches.
+// Note: this does not work with points that are on multiple coupled patches
+//       with transformations (i.e. cyclics).
+pointSync false;
+
+// Patches to create.
+patches
+(
+    {
+        // Name of new patch
+        name oversetPatch;
+
+        // Dictionary to construct new patch from
+        patchInfo
+        {
+            type overset;
+        }
+
+        // How to construct: either from 'patches' or 'set'
+        constructFrom patches;
+
+        // If constructFrom = patches : names of patches. Wildcards allowed.
+        patches (inlet outlet topAndBottom);
+
+        // If constructFrom = set : name of faceSet
+        set f0;
+    }
+
+    {
+        // Name of new patch
+        name walls;
+
+        // Dictionary to construct new patch from
+        patchInfo
+        {
+            type wall;
+        }
+
+        // How to construct: either from 'patches' or 'set'
+        constructFrom patches;
+
+        // If constructFrom = patches : names of patches. Wildcards allowed.
+        patches (wing);
+
+        // If constructFrom = set : name of faceSet
+        set f0;
+    }
+    {
+        // Name of new patch
+        name frontAndBack;
+
+        // Dictionary to construct new patch from
+        patchInfo
+        {
+            type empty;
+        }
+
+        // How to construct: either from 'patches' or 'set'
+        constructFrom patches;
+
+        // If constructFrom = patches : names of patches. Wildcards allowed.
+        patches (symFront symBack);
+
+        // If constructFrom = set : name of faceSet
+        set f0;
+    }
+);
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/extrudeMeshDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/extrudeMeshDict
new file mode 100644
index 00000000000..2e735d74798
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/extrudeMeshDict
@@ -0,0 +1,52 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      extrudeMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+// What to extrude:
+//      patch   : from patch of another case ('sourceCase')
+//      mesh    : as above but with original case included
+//      surface : from externally read surface
+
+constructFrom patch;
+sourceCase "../aeroFoil_snappyHexMesh";
+sourcePatches (symFront);
+
+// If construct from patch: patch to use for back (can be same as sourcePatch)
+exposedPatchName symBack;
+
+// Flip surface normals before usage. Valid only for extrude from surface or
+// patch.
+flipNormals false;
+
+//- Linear extrusion in point-normal direction
+extrudeModel        linearNormal;
+
+nLayers             1;
+
+expansionRatio      1.0;
+
+linearNormalCoeffs
+{
+    thickness       0.05;
+}
+
+// Do front and back need to be merged? Usually only makes sense for 360
+// degree wedges.
+mergeFaces false;   //true;
+
+// Merge small edges. Fraction of bounding box.
+mergeTol 0;
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/fvSchemes b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/fvSchemes
new file mode 100644
index 00000000000..089b2c5116d
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/fvSchemes
@@ -0,0 +1,58 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+    default steadyState;
+}
+
+gradSchemes
+{
+    default         Gauss linear;
+    grad(p)         Gauss linear;
+    grad(U)         Gauss linear;
+}
+
+divSchemes
+{
+    default         none;
+    div(phi,U)      bounded Gauss linearUpwind grad(U);
+    div(phi,k)      bounded Gauss upwind;
+    div(phi,omega)  bounded Gauss upwind;
+    div((nuEff*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+    default         Gauss linear corrected;
+}
+
+interpolationSchemes
+{
+    default         linear;
+}
+
+snGradSchemes
+{
+    default         corrected;
+}
+
+wallDist
+{
+    method meshWave;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/fvSolution b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/fvSolution
new file mode 100644
index 00000000000..015f39e4ade
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/fvSolution
@@ -0,0 +1,77 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+    p
+    {
+        solver          PBiCGStab;
+        preconditioner  DILU;
+        relTol          0.1;
+    }
+
+    U
+    {
+        solver          smoothSolver;
+        smoother        symGaussSeidel;
+        tolerance       1e-8;
+        relTol          0.1;
+        nSweeps         1;
+    }
+
+    k
+    {
+        solver          smoothSolver;
+        smoother        symGaussSeidel;
+        tolerance       1e-8;
+        relTol          0.1;
+        nSweeps         1;
+    }
+
+    omega
+    {
+        solver          smoothSolver;
+        smoother        symGaussSeidel;
+        tolerance       1e-8;
+        relTol          0.1;
+        nSweeps         1;
+    }
+}
+
+SIMPLE
+{
+    nNonOrthogonalCorrectors 0;
+}
+
+relaxationFactors
+{
+    fields
+    {
+        p               0.3;
+    }
+    equations
+    {
+        "(U|k|omega)"   0.7;
+        "(U|k|omega)Final" 1.0;
+    }
+}
+
+cache
+{
+    grad(U);
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/Allrun.pre b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/Allrun.pre
new file mode 100755
index 00000000000..fdfb7e78d16
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/Allrun.pre
@@ -0,0 +1,9 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # Run from this directory
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+# Make 3D mesh in slab of cells.
+runApplication blockMesh
+runApplication snappyHexMesh -overwrite
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/constant/triSurface/wing_5degrees.obj b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/constant/triSurface/wing_5degrees.obj
new file mode 100644
index 00000000000..4be2aac5f2f
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/constant/triSurface/wing_5degrees.obj
@@ -0,0 +1,1054 @@
+# Wavefront OBJ file written 2010-05-13T09:12:43
+o wing_5degrees
+
+# points : 520
+# faces  : 520
+# zones  : 1
+#   0  WALL10  (nFaces: 520)
+
+# <points count="520">
+v 1.00488 -0.0890722 -0.5
+v 1.00488 -0.0890722 0.5
+v 0.999453 -0.0870827 0.5
+v 0.999453 -0.0870827 -0.5
+v 0.993747 -0.0849908 0.5
+v 0.993747 -0.0849908 -0.5
+v 0.98776 -0.0827959 0.5
+v 0.98776 -0.0827959 -0.5
+v 0.981475 -0.0804834 0.5
+v 0.981475 -0.0804834 -0.5
+v 0.974878 -0.0780483 0.5
+v 0.974878 -0.0780483 -0.5
+v 0.967936 -0.075535 0.5
+v 0.967936 -0.075535 -0.5
+v 0.960671 -0.0728297 0.5
+v 0.960671 -0.0728297 -0.5
+v 0.952986 -0.070149 0.5
+v 0.952986 -0.070149 -0.5
+v 0.944915 -0.067332 0.5
+v 0.944915 -0.067332 -0.5
+v 0.936442 -0.064377 0.5
+v 0.936442 -0.064377 -0.5
+v 0.927543 -0.0612777 0.5
+v 0.927543 -0.0612777 -0.5
+v 0.918171 -0.0581074 0.5
+v 0.918171 -0.0581074 -0.5
+v 0.908345 -0.0547308 0.5
+v 0.908345 -0.0547308 -0.5
+v 0.897978 -0.0513371 0.5
+v 0.897978 -0.0513371 -0.5
+v 0.887113 -0.0477115 0.5
+v 0.887113 -0.0477115 -0.5
+v 0.875671 -0.0440076 0.5
+v 0.875671 -0.0440076 -0.5
+v 0.863634 -0.0401898 0.5
+v 0.863634 -0.0401898 -0.5
+v 0.850988 -0.0362043 0.5
+v 0.850988 -0.0362043 -0.5
+v 0.837677 -0.0321259 0.5
+v 0.837677 -0.0321259 -0.5
+v 0.8237 -0.0278406 0.5
+v 0.8237 -0.0278406 -0.5
+v 0.808997 -0.0234314 0.5
+v 0.808997 -0.0234314 -0.5
+v 0.793536 -0.0188824 0.5
+v 0.793536 -0.0188824 -0.5
+v 0.777248 -0.0142896 0.5
+v 0.777248 -0.0142896 -0.5
+v 0.760144 -0.00947585 0.5
+v 0.760144 -0.00947585 -0.5
+v 0.742148 -0.0045544 0.5
+v 0.742148 -0.0045544 -0.5
+v 0.723207 0.000449948 0.5
+v 0.723207 0.000449948 -0.5
+v 0.703296 0.00561154 0.5
+v 0.703296 0.00561154 -0.5
+v 0.682345 0.010854 0.5
+v 0.682345 0.010854 -0.5
+v 0.660295 0.0161554 0.5
+v 0.660295 0.0161554 -0.5
+v 0.637103 0.0215548 0.5
+v 0.637103 0.0215548 -0.5
+v 0.606829 0.0282606 0.5
+v 0.606829 0.0282606 -0.5
+v 0.578018 0.0343978 0.5
+v 0.578018 0.0343978 -0.5
+v 0.550557 0.0397874 0.5
+v 0.550557 0.0397874 -0.5
+v 0.524436 0.0447356 0.5
+v 0.524436 0.0447356 -0.5
+v 0.499549 0.0490421 0.5
+v 0.499549 0.0490421 -0.5
+v 0.475869 0.05291 0.5
+v 0.475869 0.05291 -0.5
+v 0.45334 0.0563729 0.5
+v 0.45334 0.0563729 -0.5
+v 0.431911 0.059484 0.5
+v 0.431911 0.059484 -0.5
+v 0.411518 0.0621876 0.5
+v 0.411518 0.0621876 -0.5
+v 0.392118 0.0645445 0.5
+v 0.392118 0.0645445 -0.5
+v 0.373644 0.0664046 0.5
+v 0.373644 0.0664046 -0.5
+v 0.356081 0.0680196 0.5
+v 0.356081 0.0680196 -0.5
+v 0.339375 0.0692961 0.5
+v 0.339375 0.0692961 -0.5
+v 0.323487 0.0702815 0.5
+v 0.323487 0.0702815 -0.5
+v 0.308383 0.0710035 0.5
+v 0.308383 0.0710035 -0.5
+v 0.294024 0.0714698 0.5
+v 0.294024 0.0714698 -0.5
+v 0.28038 0.0717809 0.5
+v 0.28038 0.0717809 -0.5
+v 0.267416 0.0719191 0.5
+v 0.267416 0.0719191 -0.5
+v 0.255099 0.0718222 0.5
+v 0.255099 0.0718222 -0.5
+v 0.243399 0.0716511 0.5
+v 0.243399 0.0716511 -0.5
+v 0.232288 0.0713208 0.5
+v 0.232288 0.0713208 -0.5
+v 0.221735 0.0709249 0.5
+v 0.221735 0.0709249 -0.5
+v 0.211715 0.0704338 0.5
+v 0.211715 0.0704338 -0.5
+v 0.202202 0.0698513 0.5
+v 0.202202 0.0698513 -0.5
+v 0.19317 0.0692271 0.5
+v 0.19317 0.0692271 -0.5
+v 0.184599 0.0685108 0.5
+v 0.184599 0.0685108 -0.5
+v 0.176464 0.0677409 0.5
+v 0.176464 0.0677409 -0.5
+v 0.168741 0.0669472 0.5
+v 0.168741 0.0669472 -0.5
+v 0.161418 0.0660755 0.5
+v 0.161418 0.0660755 -0.5
+v 0.154469 0.0651852 0.5
+v 0.154469 0.0651852 -0.5
+v 0.145493 0.0640314 0.5
+v 0.145493 0.0640314 -0.5
+v 0.136995 0.0627463 0.5
+v 0.136995 0.0627463 -0.5
+v 0.128932 0.0614383 0.5
+v 0.128932 0.0614383 -0.5
+v 0.121282 0.0601525 0.5
+v 0.121282 0.0601525 -0.5
+v 0.114049 0.0587416 0.5
+v 0.114049 0.0587416 -0.5
+v 0.107186 0.0573482 0.5
+v 0.107186 0.0573482 -0.5
+v 0.100675 0.0559871 0.5
+v 0.100675 0.0559871 -0.5
+v 0.0945147 0.0545794 0.5
+v 0.0945147 0.0545794 -0.5
+v 0.0886858 0.0531426 0.5
+v 0.0886858 0.0531426 -0.5
+v 0.0831659 0.0517083 0.5
+v 0.0831659 0.0517083 -0.5
+v 0.0779342 0.0503006 0.5
+v 0.0779342 0.0503006 -0.5
+v 0.072975 0.0489224 0.5
+v 0.072975 0.0489224 -0.5
+v 0.0682798 0.0475559 0.5
+v 0.0682798 0.0475559 -0.5
+v 0.0638499 0.0461601 0.5
+v 0.0638499 0.0461601 -0.5
+v 0.0596656 0.0447577 0.5
+v 0.0596656 0.0447577 -0.5
+v 0.055694 0.0434126 0.5
+v 0.055694 0.0434126 -0.5
+v 0.0519364 0.0420932 0.5
+v 0.0519364 0.0420932 -0.5
+v 0.0484053 0.0407363 0.5
+v 0.0484053 0.0407363 -0.5
+v 0.0450779 0.0393756 0.5
+v 0.0450779 0.0393756 -0.5
+v 0.0419215 0.0380722 0.5
+v 0.0419215 0.0380722 -0.5
+v 0.0389288 0.0368211 0.5
+v 0.0389288 0.0368211 -0.5
+v 0.036102 0.0355928 0.5
+v 0.036102 0.0355928 -0.5
+v 0.0334425 0.034368 0.5
+v 0.0334425 0.034368 -0.5
+v 0.0309496 0.0331356 0.5
+v 0.0309496 0.0331356 -0.5
+v 0.0286117 0.0319047 0.5
+v 0.0286117 0.0319047 -0.5
+v 0.0264077 0.0307022 0.5
+v 0.0264077 0.0307022 -0.5
+v 0.0243248 0.02954 0.5
+v 0.0243248 0.02954 -0.5
+v 0.0223665 0.0284014 0.5
+v 0.0223665 0.0284014 -0.5
+v 0.0205353 0.0272716 0.5
+v 0.0205353 0.0272716 -0.5
+v 0.0188204 0.0261581 0.5
+v 0.0188204 0.0261581 -0.5
+v 0.0172057 0.0250781 0.5
+v 0.0172057 0.0250781 -0.5
+v 0.015681 0.0240389 0.5
+v 0.015681 0.0240389 -0.5
+v 0.0142472 0.0230307 0.5
+v 0.0142472 0.0230307 -0.5
+v 0.0129051 0.0220434 0.5
+v 0.0129051 0.0220434 -0.5
+v 0.0116567 0.0210699 0.5
+v 0.0116567 0.0210699 -0.5
+v 0.0105044 0.0201047 0.5
+v 0.0105044 0.0201047 -0.5
+v 0.00944864 0.0191444 0.5
+v 0.00944864 0.0191444 -0.5
+v 0.00847997 0.0181956 0.5
+v 0.00847997 0.0181956 -0.5
+v 0.00758214 0.0172702 0.5
+v 0.00758214 0.0172702 -0.5
+v 0.00674204 0.0163779 0.5
+v 0.00674204 0.0163779 -0.5
+v 0.00595671 0.0155186 0.5
+v 0.00595671 0.0155186 -0.5
+v 0.00523198 0.0146848 0.5
+v 0.00523198 0.0146848 -0.5
+v 0.00457157 0.0138701 0.5
+v 0.00457157 0.0138701 -0.5
+v 0.00397503 0.0130721 0.5
+v 0.00397503 0.0130721 -0.5
+v 0.00343506 0.0122936 0.5
+v 0.00343506 0.0122936 -0.5
+v 0.0029443 0.0115379 0.5
+v 0.0029443 0.0115379 -0.5
+v 0.0024965 0.010807 0.5
+v 0.0024965 0.010807 -0.5
+v 0.00209053 0.0101012 0.5
+v 0.00209053 0.0101012 -0.5
+v 0.00172938 0.00941821 0.5
+v 0.00172938 0.00941821 -0.5
+v 0.00141481 0.00875662 0.5
+v 0.00141481 0.00875662 -0.5
+v 0.00114703 0.00811509 0.5
+v 0.00114703 0.00811509 -0.5
+v 0.000922634 0.00749375 0.5
+v 0.000922634 0.00749375 -0.5
+v 0.00073432 0.00689421 0.5
+v 0.00073432 0.00689421 -0.5
+v 0.000575606 0.00631745 0.5
+v 0.000575606 0.00631745 -0.5
+v 0.000441178 0.00576428 0.5
+v 0.000441178 0.00576428 -0.5
+v 0.000326628 0.00523494 0.5
+v 0.000326628 0.00523494 -0.5
+v 0.000229331 0.00472926 0.5
+v 0.000229331 0.00472926 -0.5
+v 0.000147968 0.00424663 0.5
+v 0.000147968 0.00424663 -0.5
+v 8.13071e-05 0.00378656 0.5
+v 8.13071e-05 0.00378656 -0.5
+v 2.81186e-05 0.00334838 0.5
+v 2.81186e-05 0.00334838 -0.5
+v -1.28053e-05 0.00293132 0.5
+v -1.28053e-05 0.00293132 -0.5
+v -4.26138e-05 0.00253464 0.5
+v -4.26138e-05 0.00253464 -0.5
+v -6.24104e-05 0.00215753 0.5
+v -6.24104e-05 0.00215753 -0.5
+v -7.32354e-05 0.00179922 0.5
+v -7.32354e-05 0.00179922 -0.5
+v -7.6066e-05 0.00145891 0.5
+v -7.6066e-05 0.00145891 -0.5
+v -7.18149e-05 0.00113574 0.5
+v -7.18149e-05 0.00113574 -0.5
+v -6.13265e-05 0.000828962 0.5
+v -6.13265e-05 0.000828962 -0.5
+v -4.5388e-05 0.000537894 0.5
+v -4.5388e-05 0.000537894 -0.5
+v -2.47174e-05 0.000261729 0.5
+v -2.47174e-05 0.000261729 -0.5
+v 0.999428 -0.0886333 -0.5
+v 0.999428 -0.0886333 0.5
+v 0 0 0.5
+v 0 0 -0.5
+v 3.07731e-05 -0.000269468 0.5
+v 3.07731e-05 -0.000269468 -0.5
+v 6.87839e-05 -0.000551758 0.5
+v 6.87839e-05 -0.000551758 -0.5
+v 0.00011487 -0.000847395 0.5
+v 0.00011487 -0.000847395 -0.5
+v 0.000169958 -0.00115699 0.5
+v 0.000169958 -0.00115699 -0.5
+v 0.000235006 -0.00148084 0.5
+v 0.000235006 -0.00148084 -0.5
+v 0.000311085 -0.00181947 0.5
+v 0.000311085 -0.00181947 -0.5
+v 0.000399343 -0.00217329 0.5
+v 0.000399343 -0.00217329 -0.5
+v 0.000501006 -0.00254265 0.5
+v 0.000501006 -0.00254265 -0.5
+v 0.000617405 -0.00292793 0.5
+v 0.000617405 -0.00292793 -0.5
+v 0.000749918 -0.00332928 0.5
+v 0.000749918 -0.00332928 -0.5
+v 0.000900098 -0.00374706 0.5
+v 0.000900098 -0.00374706 -0.5
+v 0.00106951 -0.00418123 0.5
+v 0.00106951 -0.00418123 -0.5
+v 0.00125981 -0.00463173 0.5
+v 0.00125981 -0.00463173 -0.5
+v 0.00147278 -0.00509836 0.5
+v 0.00147278 -0.00509836 -0.5
+v 0.00171023 -0.00558073 0.5
+v 0.00171023 -0.00558073 -0.5
+v 0.0019741 -0.00607866 0.5
+v 0.0019741 -0.00607866 -0.5
+v 0.00226657 -0.00659235 0.5
+v 0.00226657 -0.00659235 -0.5
+v 0.00258985 -0.00712192 0.5
+v 0.00258985 -0.00712192 -0.5
+v 0.00294625 -0.00766749 0.5
+v 0.00294625 -0.00766749 -0.5
+v 0.0033381 -0.00822888 0.5
+v 0.0033381 -0.00822888 -0.5
+v 0.00376858 -0.00880495 0.5
+v 0.00376858 -0.00880495 -0.5
+v 0.00424144 -0.00939356 0.5
+v 0.00424144 -0.00939356 -0.5
+v 0.0047608 -0.00999197 0.5
+v 0.0047608 -0.00999197 -0.5
+v 0.00533108 -0.0105969 0.5
+v 0.00533108 -0.0105969 -0.5
+v 0.00595465 -0.0112076 0.5
+v 0.00595465 -0.0112076 -0.5
+v 0.00663108 -0.0118268 0.5
+v 0.00663108 -0.0118268 -0.5
+v 0.00735864 -0.0124589 0.5
+v 0.00735864 -0.0124589 -0.5
+v 0.00813479 -0.0131082 0.5
+v 0.00813479 -0.0131082 -0.5
+v 0.00896315 -0.0137726 0.5
+v 0.00896315 -0.0137726 -0.5
+v 0.00985143 -0.0144449 0.5
+v 0.00985143 -0.0144449 -0.5
+v 0.0108089 -0.0151156 0.5
+v 0.0108089 -0.0151156 -0.5
+v 0.0118417 -0.0157801 0.5
+v 0.0118417 -0.0157801 -0.5
+v 0.0129485 -0.0164439 0.5
+v 0.0129485 -0.0164439 -0.5
+v 0.0141258 -0.0171158 0.5
+v 0.0141258 -0.0171158 -0.5
+v 0.0153717 -0.0178024 0.5
+v 0.0153717 -0.0178024 -0.5
+v 0.0166914 -0.0185005 0.5
+v 0.0166914 -0.0185005 -0.5
+v 0.0180921 -0.0192037 0.5
+v 0.0180921 -0.0192037 -0.5
+v 0.01958 -0.019908 0.5
+v 0.01958 -0.019908 -0.5
+v 0.0211576 -0.0206151 0.5
+v 0.0211576 -0.0206151 -0.5
+v 0.0228265 -0.0213288 0.5
+v 0.0228265 -0.0213288 -0.5
+v 0.0245895 -0.0220523 0.5
+v 0.0245895 -0.0220523 -0.5
+v 0.0264506 -0.0227868 0.5
+v 0.0264506 -0.0227868 -0.5
+v 0.028415 -0.0235332 0.5
+v 0.028415 -0.0235332 -0.5
+v 0.0304905 -0.0242814 0.5
+v 0.0304905 -0.0242814 -0.5
+v 0.0326872 -0.0250146 0.5
+v 0.0326872 -0.0250146 -0.5
+v 0.0350128 -0.0257258 0.5
+v 0.0350128 -0.0257258 -0.5
+v 0.0374672 -0.0264333 0.5
+v 0.0374672 -0.0264333 -0.5
+v 0.0400497 -0.0271566 0.5
+v 0.0400497 -0.0271566 -0.5
+v 0.0427704 -0.0278802 0.5
+v 0.0427704 -0.0278802 -0.5
+v 0.0456434 -0.0285739 0.5
+v 0.0456434 -0.0285739 -0.5
+v 0.0486731 -0.0292495 0.5
+v 0.0486731 -0.0292495 -0.5
+v 0.0518554 -0.0299566 0.5
+v 0.0518554 -0.0299566 -0.5
+v 0.0551966 -0.030697 0.5
+v 0.0551966 -0.030697 -0.5
+v 0.0587179 -0.0314085 0.5
+v 0.0587179 -0.0314085 -0.5
+v 0.062431 -0.032078 0.5
+v 0.062431 -0.032078 -0.5
+v 0.0663314 -0.0327743 0.5
+v 0.0663314 -0.0327743 -0.5
+v 0.0704248 -0.033514 0.5
+v 0.0704248 -0.033514 -0.5
+v 0.0747335 -0.0342256 0.5
+v 0.0747335 -0.0342256 -0.5
+v 0.0792714 -0.0348902 0.5
+v 0.0792714 -0.0348902 -0.5
+v 0.0840416 -0.0355492 0.5
+v 0.0840416 -0.0355492 -0.5
+v 0.089054 -0.0362103 0.5
+v 0.089054 -0.0362103 -0.5
+v 0.0943226 -0.0368627 0.5
+v 0.0943226 -0.0368627 -0.5
+v 0.0998603 -0.0375041 0.5
+v 0.0998603 -0.0375041 -0.5
+v 0.105679 -0.0381355 0.5
+v 0.105679 -0.0381355 -0.5
+v 0.111793 -0.0387575 0.5
+v 0.111793 -0.0387575 -0.5
+v 0.118218 -0.0393567 0.5
+v 0.118218 -0.0393567 -0.5
+v 0.124968 -0.0399429 0.5
+v 0.124968 -0.0399429 -0.5
+v 0.132055 -0.0405782 0.5
+v 0.132055 -0.0405782 -0.5
+v 0.1395 -0.0411771 0.5
+v 0.1395 -0.0411771 -0.5
+v 0.147326 -0.041699 0.5
+v 0.147326 -0.041699 -0.5
+v 0.15451 -0.0421969 0.5
+v 0.15451 -0.0421969 -0.5
+v 0.162054 -0.042698 0.5
+v 0.162054 -0.042698 -0.5
+v 0.16998 -0.0431596 0.5
+v 0.16998 -0.0431596 -0.5
+v 0.178305 -0.0435984 0.5
+v 0.178305 -0.0435984 -0.5
+v 0.187045 -0.0440696 0.5
+v 0.187045 -0.0440696 -0.5
+v 0.196223 -0.0445349 0.5
+v 0.196223 -0.0445349 -0.5
+v 0.205864 -0.0449725 0.5
+v 0.205864 -0.0449725 -0.5
+v 0.215985 -0.045448 0.5
+v 0.215985 -0.045448 -0.5
+v 0.226615 -0.0458797 0.5
+v 0.226615 -0.0458797 -0.5
+v 0.237778 -0.0463184 0.5
+v 0.237778 -0.0463184 -0.5
+v 0.249497 -0.0468156 0.5
+v 0.249497 -0.0468156 -0.5
+v 0.261804 -0.0472732 0.5
+v 0.261804 -0.0472732 -0.5
+v 0.274727 -0.0477637 0.5
+v 0.274727 -0.0477637 -0.5
+v 0.288294 -0.0483182 0.5
+v 0.288294 -0.0483182 -0.5
+v 0.302542 -0.0488257 0.5
+v 0.302542 -0.0488257 -0.5
+v 0.317502 -0.0493844 0.5
+v 0.317502 -0.0493844 -0.5
+v 0.33321 -0.0499788 0.5
+v 0.33321 -0.0499788 -0.5
+v 0.349702 -0.0506056 0.5
+v 0.349702 -0.0506056 -0.5
+v 0.367015 -0.0513872 0.5
+v 0.367015 -0.0513872 -0.5
+v 0.385192 -0.0522281 0.5
+v 0.385192 -0.0522281 -0.5
+v 0.404277 -0.0531254 0.5
+v 0.404277 -0.0531254 -0.5
+v 0.424316 -0.0540817 0.5
+v 0.424316 -0.0540817 -0.5
+v 0.445357 -0.0550979 0.5
+v 0.445357 -0.0550979 -0.5
+v 0.467451 -0.0560874 0.5
+v 0.467451 -0.0560874 -0.5
+v 0.490649 -0.0571824 0.5
+v 0.490649 -0.0571824 -0.5
+v 0.51501 -0.0582757 0.5
+v 0.51501 -0.0582757 -0.5
+v 0.540585 -0.0594903 0.5
+v 0.540585 -0.0594903 -0.5
+v 0.567439 -0.0607815 0.5
+v 0.567439 -0.0607815 -0.5
+v 0.595635 -0.0621304 0.5
+v 0.595635 -0.0621304 -0.5
+v 0.625242 -0.0635352 0.5
+v 0.625242 -0.0635352 -0.5
+v 0.649433 -0.0648334 0.5
+v 0.649433 -0.0648334 -0.5
+v 0.672415 -0.0660494 0.5
+v 0.672415 -0.0660494 -0.5
+v 0.694245 -0.0672674 0.5
+v 0.694245 -0.0672674 -0.5
+v 0.714979 -0.0684936 0.5
+v 0.714979 -0.0684936 -0.5
+v 0.734678 -0.0696472 0.5
+v 0.734678 -0.0696472 -0.5
+v 0.753392 -0.070724 0.5
+v 0.753392 -0.070724 -0.5
+v 0.771162 -0.0718742 0.5
+v 0.771162 -0.0718742 -0.5
+v 0.788046 -0.0729552 0.5
+v 0.788046 -0.0729552 -0.5
+v 0.804086 -0.0739668 0.5
+v 0.804086 -0.0739668 -0.5
+v 0.819316 -0.0750462 0.5
+v 0.819316 -0.0750462 -0.5
+v 0.833785 -0.076061 0.5
+v 0.833785 -0.076061 -0.5
+v 0.847532 -0.0770175 0.5
+v 0.847532 -0.0770175 -0.5
+v 0.86059 -0.0779215 0.5
+v 0.86059 -0.0779215 -0.5
+v 0.872998 -0.0787716 0.5
+v 0.872998 -0.0787716 -0.5
+v 0.884776 -0.079698 0.5
+v 0.884776 -0.079698 -0.5
+v 0.89597 -0.0805061 0.5
+v 0.89597 -0.0805061 -0.5
+v 0.906605 -0.0812554 0.5
+v 0.906605 -0.0812554 -0.5
+v 0.916704 -0.0820352 0.5
+v 0.916704 -0.0820352 -0.5
+v 0.926301 -0.0827494 0.5
+v 0.926301 -0.0827494 -0.5
+v 0.935409 -0.0835384 0.5
+v 0.935409 -0.0835384 -0.5
+v 0.944071 -0.0841575 0.5
+v 0.944071 -0.0841575 -0.5
+v 0.952294 -0.0848264 0.5
+v 0.952294 -0.0848264 -0.5
+v 0.960109 -0.0854166 0.5
+v 0.960109 -0.0854166 -0.5
+v 0.967527 -0.0860602 0.5
+v 0.967527 -0.0860602 -0.5
+v 0.97458 -0.0865997 0.5
+v 0.97458 -0.0865997 -0.5
+v 0.981277 -0.0871547 0.5
+v 0.981277 -0.0871547 -0.5
+v 0.987637 -0.0876912 0.5
+v 0.987637 -0.0876912 -0.5
+v 0.993684 -0.0881407 0.5
+v 0.993684 -0.0881407 -0.5
+# </points>
+
+# <faces count="520">
+g WALL10
+f 1 2 3
+f 3 4 1
+f 4 3 5
+f 5 6 4
+f 6 5 7
+f 7 8 6
+f 8 7 9
+f 9 10 8
+f 10 9 11
+f 11 12 10
+f 12 11 13
+f 13 14 12
+f 14 13 15
+f 15 16 14
+f 16 15 17
+f 17 18 16
+f 18 17 19
+f 19 20 18
+f 20 19 21
+f 21 22 20
+f 22 21 23
+f 23 24 22
+f 24 23 25
+f 25 26 24
+f 26 25 27
+f 27 28 26
+f 28 27 29
+f 29 30 28
+f 30 29 31
+f 31 32 30
+f 32 31 33
+f 33 34 32
+f 34 33 35
+f 35 36 34
+f 36 35 37
+f 37 38 36
+f 38 37 39
+f 39 40 38
+f 40 39 41
+f 41 42 40
+f 42 41 43
+f 43 44 42
+f 44 43 45
+f 45 46 44
+f 46 45 47
+f 47 48 46
+f 48 47 49
+f 49 50 48
+f 50 49 51
+f 51 52 50
+f 52 51 53
+f 53 54 52
+f 54 53 55
+f 55 56 54
+f 56 55 57
+f 57 58 56
+f 58 57 59
+f 59 60 58
+f 60 59 61
+f 61 62 60
+f 62 61 63
+f 63 64 62
+f 64 63 65
+f 65 66 64
+f 66 65 67
+f 67 68 66
+f 68 67 69
+f 69 70 68
+f 70 69 71
+f 71 72 70
+f 72 71 73
+f 73 74 72
+f 74 73 75
+f 75 76 74
+f 76 75 77
+f 77 78 76
+f 78 77 79
+f 79 80 78
+f 80 79 81
+f 81 82 80
+f 82 81 83
+f 83 84 82
+f 84 83 85
+f 85 86 84
+f 86 85 87
+f 87 88 86
+f 88 87 89
+f 89 90 88
+f 90 89 91
+f 91 92 90
+f 92 91 93
+f 93 94 92
+f 94 93 95
+f 95 96 94
+f 96 95 97
+f 97 98 96
+f 98 97 99
+f 99 100 98
+f 100 99 101
+f 101 102 100
+f 102 101 103
+f 103 104 102
+f 104 103 105
+f 105 106 104
+f 106 105 107
+f 107 108 106
+f 108 107 109
+f 109 110 108
+f 110 109 111
+f 111 112 110
+f 112 111 113
+f 113 114 112
+f 114 113 115
+f 115 116 114
+f 116 115 117
+f 117 118 116
+f 118 117 119
+f 119 120 118
+f 120 119 121
+f 121 122 120
+f 122 121 123
+f 123 124 122
+f 124 123 125
+f 125 126 124
+f 126 125 127
+f 127 128 126
+f 128 127 129
+f 129 130 128
+f 130 129 131
+f 131 132 130
+f 132 131 133
+f 133 134 132
+f 134 133 135
+f 135 136 134
+f 136 135 137
+f 137 138 136
+f 138 137 139
+f 139 140 138
+f 140 139 141
+f 141 142 140
+f 142 141 143
+f 143 144 142
+f 144 143 145
+f 145 146 144
+f 146 145 147
+f 147 148 146
+f 148 147 149
+f 149 150 148
+f 150 149 151
+f 151 152 150
+f 152 151 153
+f 153 154 152
+f 154 153 155
+f 155 156 154
+f 156 155 157
+f 157 158 156
+f 158 157 159
+f 159 160 158
+f 160 159 161
+f 161 162 160
+f 162 161 163
+f 163 164 162
+f 164 163 165
+f 165 166 164
+f 166 165 167
+f 167 168 166
+f 168 167 169
+f 169 170 168
+f 170 169 171
+f 171 172 170
+f 172 171 173
+f 173 174 172
+f 174 173 175
+f 175 176 174
+f 176 175 177
+f 177 178 176
+f 178 177 179
+f 179 180 178
+f 180 179 181
+f 181 182 180
+f 182 181 183
+f 183 184 182
+f 184 183 185
+f 185 186 184
+f 186 185 187
+f 187 188 186
+f 188 187 189
+f 189 190 188
+f 190 189 191
+f 191 192 190
+f 192 191 193
+f 193 194 192
+f 194 193 195
+f 195 196 194
+f 196 195 197
+f 197 198 196
+f 198 197 199
+f 199 200 198
+f 200 199 201
+f 201 202 200
+f 202 201 203
+f 203 204 202
+f 204 203 205
+f 205 206 204
+f 206 205 207
+f 207 208 206
+f 208 207 209
+f 209 210 208
+f 210 209 211
+f 211 212 210
+f 212 211 213
+f 213 214 212
+f 214 213 215
+f 215 216 214
+f 216 215 217
+f 217 218 216
+f 218 217 219
+f 219 220 218
+f 220 219 221
+f 221 222 220
+f 222 221 223
+f 223 224 222
+f 224 223 225
+f 225 226 224
+f 226 225 227
+f 227 228 226
+f 228 227 229
+f 229 230 228
+f 230 229 231
+f 231 232 230
+f 232 231 233
+f 233 234 232
+f 234 233 235
+f 235 236 234
+f 236 235 237
+f 237 238 236
+f 238 237 239
+f 239 240 238
+f 240 239 241
+f 241 242 240
+f 242 241 243
+f 243 244 242
+f 244 243 245
+f 245 246 244
+f 246 245 247
+f 247 248 246
+f 248 247 249
+f 249 250 248
+f 250 249 251
+f 251 252 250
+f 252 251 253
+f 253 254 252
+f 254 253 255
+f 255 256 254
+f 256 255 257
+f 257 258 256
+f 258 257 259
+f 259 260 258
+f 261 262 2
+f 2 1 261
+f 260 259 263
+f 263 264 260
+f 264 263 265
+f 265 266 264
+f 266 265 267
+f 267 268 266
+f 268 267 269
+f 269 270 268
+f 270 269 271
+f 271 272 270
+f 272 271 273
+f 273 274 272
+f 274 273 275
+f 275 276 274
+f 276 275 277
+f 277 278 276
+f 278 277 279
+f 279 280 278
+f 280 279 281
+f 281 282 280
+f 282 281 283
+f 283 284 282
+f 284 283 285
+f 285 286 284
+f 286 285 287
+f 287 288 286
+f 288 287 289
+f 289 290 288
+f 290 289 291
+f 291 292 290
+f 292 291 293
+f 293 294 292
+f 294 293 295
+f 295 296 294
+f 296 295 297
+f 297 298 296
+f 298 297 299
+f 299 300 298
+f 300 299 301
+f 301 302 300
+f 302 301 303
+f 303 304 302
+f 304 303 305
+f 305 306 304
+f 306 305 307
+f 307 308 306
+f 308 307 309
+f 309 310 308
+f 310 309 311
+f 311 312 310
+f 312 311 313
+f 313 314 312
+f 314 313 315
+f 315 316 314
+f 316 315 317
+f 317 318 316
+f 318 317 319
+f 319 320 318
+f 320 319 321
+f 321 322 320
+f 322 321 323
+f 323 324 322
+f 324 323 325
+f 325 326 324
+f 326 325 327
+f 327 328 326
+f 328 327 329
+f 329 330 328
+f 330 329 331
+f 331 332 330
+f 332 331 333
+f 333 334 332
+f 334 333 335
+f 335 336 334
+f 336 335 337
+f 337 338 336
+f 338 337 339
+f 339 340 338
+f 340 339 341
+f 341 342 340
+f 342 341 343
+f 343 344 342
+f 344 343 345
+f 345 346 344
+f 346 345 347
+f 347 348 346
+f 348 347 349
+f 349 350 348
+f 350 349 351
+f 351 352 350
+f 352 351 353
+f 353 354 352
+f 354 353 355
+f 355 356 354
+f 356 355 357
+f 357 358 356
+f 358 357 359
+f 359 360 358
+f 360 359 361
+f 361 362 360
+f 362 361 363
+f 363 364 362
+f 364 363 365
+f 365 366 364
+f 366 365 367
+f 367 368 366
+f 368 367 369
+f 369 370 368
+f 370 369 371
+f 371 372 370
+f 372 371 373
+f 373 374 372
+f 374 373 375
+f 375 376 374
+f 376 375 377
+f 377 378 376
+f 378 377 379
+f 379 380 378
+f 380 379 381
+f 381 382 380
+f 382 381 383
+f 383 384 382
+f 384 383 385
+f 385 386 384
+f 386 385 387
+f 387 388 386
+f 388 387 389
+f 389 390 388
+f 390 389 391
+f 391 392 390
+f 392 391 393
+f 393 394 392
+f 394 393 395
+f 395 396 394
+f 396 395 397
+f 397 398 396
+f 398 397 399
+f 399 400 398
+f 400 399 401
+f 401 402 400
+f 402 401 403
+f 403 404 402
+f 404 403 405
+f 405 406 404
+f 406 405 407
+f 407 408 406
+f 408 407 409
+f 409 410 408
+f 410 409 411
+f 411 412 410
+f 412 411 413
+f 413 414 412
+f 414 413 415
+f 415 416 414
+f 416 415 417
+f 417 418 416
+f 418 417 419
+f 419 420 418
+f 420 419 421
+f 421 422 420
+f 422 421 423
+f 423 424 422
+f 424 423 425
+f 425 426 424
+f 426 425 427
+f 427 428 426
+f 428 427 429
+f 429 430 428
+f 430 429 431
+f 431 432 430
+f 432 431 433
+f 433 434 432
+f 434 433 435
+f 435 436 434
+f 436 435 437
+f 437 438 436
+f 438 437 439
+f 439 440 438
+f 440 439 441
+f 441 442 440
+f 442 441 443
+f 443 444 442
+f 444 443 445
+f 445 446 444
+f 446 445 447
+f 447 448 446
+f 448 447 449
+f 449 450 448
+f 450 449 451
+f 451 452 450
+f 452 451 453
+f 453 454 452
+f 454 453 455
+f 455 456 454
+f 456 455 457
+f 457 458 456
+f 458 457 459
+f 459 460 458
+f 460 459 461
+f 461 462 460
+f 462 461 463
+f 463 464 462
+f 464 463 465
+f 465 466 464
+f 466 465 467
+f 467 468 466
+f 468 467 469
+f 469 470 468
+f 470 469 471
+f 471 472 470
+f 472 471 473
+f 473 474 472
+f 474 473 475
+f 475 476 474
+f 476 475 477
+f 477 478 476
+f 478 477 479
+f 479 480 478
+f 480 479 481
+f 481 482 480
+f 482 481 483
+f 483 484 482
+f 484 483 485
+f 485 486 484
+f 486 485 487
+f 487 488 486
+f 488 487 489
+f 489 490 488
+f 490 489 491
+f 491 492 490
+f 492 491 493
+f 493 494 492
+f 494 493 495
+f 495 496 494
+f 496 495 497
+f 497 498 496
+f 498 497 499
+f 499 500 498
+f 500 499 501
+f 501 502 500
+f 502 501 503
+f 503 504 502
+f 504 503 505
+f 505 506 504
+f 506 505 507
+f 507 508 506
+f 508 507 509
+f 509 510 508
+f 510 509 511
+f 511 512 510
+f 512 511 513
+f 513 514 512
+f 514 513 515
+f 515 516 514
+f 516 515 517
+f 517 518 516
+f 518 517 519
+f 519 520 518
+f 520 519 262
+f 262 261 520
+# </faces>
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/blockMeshDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/blockMeshDict
new file mode 100644
index 00000000000..f539f6c9282
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/blockMeshDict
@@ -0,0 +1,89 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+convertToMeters 1;
+
+vertices
+(
+    (-0.5 -0.5 -0.1)
+    ( 2.0 -0.5 -0.1)
+    ( 2.0  0.5 -0.1)
+    (-0.5  0.5 -0.1)
+    (-0.5 -0.5  0.1)
+    ( 2.0 -0.5  0.1)
+    ( 2.0  0.5  0.1)
+    (-0.5  0.5  0.1)
+);
+
+blocks
+(
+    hex (0 1 2 3 4 5 6 7) (12 7 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+    topAndBottom
+    {
+        type patch;
+        faces
+        (
+            (3 7 6 2)
+            (1 5 4 0)
+        );
+    }
+
+    inlet
+    {
+        type patch;
+        faces
+        (
+            (0 4 7 3)
+        );
+    }
+
+    outlet
+    {
+        type patch;
+        faces
+        (
+            (2 6 5 1)
+        );
+    }
+
+    symFront
+    {
+        type symmetryPlane;
+        faces
+        (
+            (4 5 6 7)
+        );
+    }
+
+    symBack
+    {
+        type symmetryPlane;
+        faces
+        (
+            (0 3 2 1)
+        );
+    }
+);
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/controlDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/controlDict
new file mode 100644
index 00000000000..28130318d74
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/controlDict
@@ -0,0 +1,49 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application     snappyHexMesh;
+
+startFrom       latestTime;
+
+startTime       0;
+
+stopAt          endTime;
+
+endTime         100;
+
+deltaT          1;
+
+writeControl    runTime;
+
+writeInterval   1;
+
+purgeWrite      0;
+
+writeFormat     binary;
+
+writePrecision  6;
+
+writeCompression off;
+
+timeFormat      general;
+
+timePrecision   6;
+
+runTimeModifiable true;
+
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/decomposeParDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/decomposeParDict
new file mode 100644
index 00000000000..f70b376fabb
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/decomposeParDict
@@ -0,0 +1,39 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 3;
+
+method          simple;
+
+simpleCoeffs
+{
+    n               (1 3 1);
+    delta           0.001;
+}
+
+hierarchicalCoeffs
+{
+    n               (3 2 1);
+    delta           0.001;
+    order           xyz;
+}
+
+manualCoeffs
+{
+    dataFile        "cellDecomposition";
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/fvSchemes b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/fvSchemes
new file mode 100644
index 00000000000..52f9f1efc28
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/fvSchemes
@@ -0,0 +1,56 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+    default         Euler;
+}
+
+gradSchemes
+{
+    default         Gauss linear;
+}
+
+divSchemes
+{
+    default         none;
+    div(phi,U)      Gauss limitedLinearV 1;
+    div(phi,k)      Gauss upwind;
+    div(phi,epsilon) Gauss upwind;
+    div(phi,R)      Gauss upwind;
+    div(R)          Gauss linear;
+    div(phid,p)     Gauss limitedLinear 1;
+    div(phi,K)      Gauss limitedLinear 1;
+    div(phi,e)      Gauss limitedLinear 1;
+    div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+    default         Gauss linear limited corrected 0.5;
+}
+
+interpolationSchemes
+{
+    default         linear;
+}
+
+snGradSchemes
+{
+    default         corrected;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/fvSolution b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/fvSolution
new file mode 100644
index 00000000000..04a2dd4fdbe
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/fvSolution
@@ -0,0 +1,49 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+    p
+    {
+        solver          smoothSolver;
+        smoother        symGaussSeidel;
+        tolerance       1e-12;
+        relTol          0;
+    }
+
+    rho
+    {
+        solver          PCG;
+        preconditioner  DIC;
+        tolerance       1e-08;
+        relTol          0;
+    }
+
+    "(U|e|k|epsilon|R)"
+    {
+        $p;
+        tolerance       1e-08;
+        relTol          0;
+    }
+}
+
+PISO
+{
+    nCorrectors     2;
+    nNonOrthogonalCorrectors 2;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/snappyHexMeshDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/snappyHexMeshDict
new file mode 100644
index 00000000000..5ad22a55c07
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/snappyHexMeshDict
@@ -0,0 +1,300 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      snappyHexMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+// Which of the steps to run
+castellatedMesh true;
+snap            true;
+addLayers       true;
+
+// Geometry. Definition of all surfaces. All surfaces are of class
+// searchableSurface.
+// Surfaces are used
+// - to specify refinement for any mesh cell intersecting it
+// - to specify refinement for any mesh cell inside/outside/near
+// - to 'snap' the mesh boundary to the surface
+geometry
+{
+    wing_5degrees.obj
+    {
+        type    triSurfaceMesh;
+        name    wing;
+    }
+
+    refinementBox
+    {
+        type    searchableBox;
+        min     (-1 -1 -1);
+        max     ( 5  1  1);
+    }
+};
+
+// Settings for the castellatedMesh generation.
+castellatedMeshControls
+{
+
+    // Refinement parameters
+    // ~~~~~~~~~~~~~~~~~~~~~
+
+    // If local number of cells is >= maxLocalCells on any processor
+    // switches from from refinement followed by balancing
+    // (current method) to (weighted) balancing before refinement.
+    maxLocalCells 100000;
+
+    // Overall cell limit (approximately). Refinement will stop immediately
+    // upon reaching this number so a refinement level might not complete.
+    // Note that this is the number of cells before removing the part which
+    // is not 'visible' from the keepPoint. The final number of cells might
+    // actually be a lot less.
+    maxGlobalCells 2000000;
+
+    // The surface refinement loop might spend lots of iterations refining just
+    // a few cells. This setting will cause refinement to stop if <=
+    // minimumRefine are selected for refinement. Note: it will at least do one
+    // iteration (unless the number of cells to refine is 0)
+    minRefinementCells 100;
+
+    // Number of buffer layers between different levels.
+    // 1 means normal 2:1 refinement restriction, larger means slower
+    // refinement.
+    nCellsBetweenLevels 6;
+
+    // Explicit feature edge refinement
+    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    // Specifies a level for any cell intersected by its edges.
+    // This is a featureEdgeMesh, read from constant/triSurface for now.
+    features ();
+
+    // Surface based refinement
+    // ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    // Specifies two levels for every surface. The first is the minimum level,
+    // every cell intersecting a surface gets refined up to the minimum level.
+    // The second level is the maximum level. Cells that 'see' multiple
+    // intersections where the intersections make an
+    // angle > resolveFeatureAngle get refined up to the maximum level.
+
+    refinementSurfaces
+    {
+        wing
+        {
+            // Surface-wise min and max refinement level
+            level (5 5);
+        }
+    }
+
+    // Resolve sharp angles on fridges
+    resolveFeatureAngle 30;
+
+    // Region-wise refinement
+    // ~~~~~~~~~~~~~~~~~~~~~~
+
+    // Specifies refinement level for cells in relation to a surface. One of
+    // three modes
+    // - distance. 'levels' specifies per distance to the surface the
+    //   wanted refinement level. The distances need to be specified in
+    //   descending order.
+    // - inside. 'levels' is only one entry and only the level is used. All
+    //   cells inside the surface get refined up to the level. The surface
+    //   needs to be closed for this to be possible.
+    // - outside. Same but cells outside.
+
+    refinementRegions
+    {
+        refinementBox
+        {
+            mode inside;
+            levels ((1e15 2));
+        }
+    }
+
+    // Mesh selection
+    // ~~~~~~~~~~~~~~
+
+    // After refinement patches get added for all refinementSurfaces and
+    // all cells intersecting the surfaces get put into these patches. The
+    // section reachable from the locationInMesh is kept.
+    // NOTE: This point should never be on a face, always inside a cell, even
+    // after refinement.
+    locationInMesh (0.5 0.22 0);
+
+    // Whether any faceZones (as specified in the refinementSurfaces)
+    // are only on the boundary of corresponding cellZones or also allow
+    // free-standing zone faces. Not used if there are no faceZones.
+    allowFreeStandingZoneFaces true;
+}
+
+// Settings for the snapping.
+snapControls
+{
+    //- Number of patch smoothing iterations before finding correspondence
+    //  to surface
+    nSmoothPatch 3;
+
+    //- Relative distance for points to be attracted by surface feature point
+    //  or edge. True distance is this factor times local
+    //  maximum edge length.
+    tolerance 4.0;
+
+    //- Number of mesh displacement relaxation iterations.
+    nSolveIter 30;
+
+    //- Maximum number of snapping relaxation iterations. Should stop
+    //  before upon reaching a correct mesh.
+    nRelaxIter 5;
+}
+
+// Settings for the layer addition.
+addLayersControls
+{
+    // Are the thickness parameters below relative to the undistorted
+    // size of the refined cell outside layer (true) or absolute sizes (false).
+    relativeSizes true;
+
+    // Per final patch (so not geometry!) the layer information
+    layers
+    {
+        wing
+        {
+            nSurfaceLayers 3;
+        }
+    }
+
+    // Expansion factor for layer mesh
+    expansionRatio 1.3;
+
+    // Wanted thickness of final added cell layer. If multiple layers
+    // is the thickness of the layer furthest away from the wall.
+    // Relative to undistorted size of cell outside layer.
+    // See relativeSizes parameter.
+    finalLayerThickness 0.7;
+
+    // Minimum thickness of cell layer. If for any reason layer
+    // cannot be above minThickness do not add layer.
+    // Relative to undistorted size of cell outside layer.
+    // See relativeSizes parameter.
+    minThickness 0.25;
+
+    // If points get not extruded do nGrow layers of connected faces that are
+    // also not grown. This helps convergence of the layer addition process
+    // close to features.
+    // Note: changed(corrected) w.r.t 17x! (didn't do anything in 17x)
+    nGrow 0;
+
+    // Advanced settings
+
+    // When not to extrude surface. 0 is flat surface, 90 is when two faces
+    // are perpendicular
+    featureAngle 60;
+
+    // Maximum number of snapping relaxation iterations. Should stop
+    // before upon reaching a correct mesh.
+    nRelaxIter 5;
+
+    // Number of smoothing iterations of surface normals
+    nSmoothSurfaceNormals 1;
+
+    // Number of smoothing iterations of interior mesh movement direction
+    nSmoothNormals 3;
+
+    // Smooth layer thickness over surface patches
+    nSmoothThickness 10;
+
+    // Stop layer growth on highly warped cells
+    maxFaceThicknessRatio 0.5;
+
+    // Reduce layer growth where ratio thickness to medial
+    // distance is large
+    maxThicknessToMedialRatio 0.3;
+
+    // Angle used to pick up medial axis points
+    // Note: changed(corrected) w.r.t 16x! 90 degrees corresponds to 130 in 16x.
+    minMedianAxisAngle 90;
+
+    // Create buffer region for new layer terminations
+    nBufferCellsNoExtrude 0;
+
+    // Overall max number of layer addition iterations. The mesher will exit
+    // if it reaches this number of iterations; possibly with an illegal
+    // mesh.
+    nLayerIter 50;
+}
+
+// Generic mesh quality settings. At any undoable phase these determine
+// where to undo.
+meshQualityControls
+{
+    //- Maximum non-orthogonality allowed. Set to 180 to disable.
+    maxNonOrtho 65;
+
+    //- Max skewness allowed. Set to <0 to disable.
+    maxBoundarySkewness 20;
+    maxInternalSkewness 4;
+
+    //- Max concaveness allowed. Is angle (in degrees) below which concavity
+    //  is allowed. 0 is straight face, <0 would be convex face.
+    //  Set to 180 to disable.
+    maxConcave 80;
+
+    //- Minimum pyramid volume. Is absolute volume of cell pyramid.
+    //  Set to a sensible fraction of the smallest cell volume expected.
+    //  Set to very negative number (e.g. -1E30) to disable.
+    minVol 1e-13;
+
+    //- Minimum quality of the tet formed by the face-centre
+    //  and variable base point minimum decomposition triangles and
+    //  the cell centre.  Set to very negative number (e.g. -1E30) to
+    //  disable.
+    //     <0 = inside out tet,
+    //      0 = flat tet
+    //      1 = regular tet
+    minTetQuality 1e-30;
+
+    //- Minimum face area. Set to <0 to disable.
+    minArea -1;
+
+    //- Minimum face twist. Set to <-1 to disable. dot product of face normal
+    //  and face centre triangles normal
+    minTwist 0.05;
+
+    //- Minimum normalised cell determinant
+    //  1 = hex, <= 0 = folded or flattened illegal cell
+    minDeterminant 0.001;
+
+    //- minFaceWeight (0 -> 0.5)
+    minFaceWeight 0.05;
+
+    //- minVolRatio (0 -> 1)
+    minVolRatio 0.01;
+
+    //must be >0 for Fluent compatibility
+    minTriangleTwist -1;
+
+    // Advanced
+
+    //- Number of error distribution iterations
+    nSmoothScale 4;
+    //- Amount to scale back displacement at error points
+    errorReduction 0.75;
+}
+
+// Advanced
+
+// Merge tolerance. Is fraction of overall bounding box of initial mesh.
+// Note: the write tolerance needs to be higher than this.
+mergeTolerance 1e-6;
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/U b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/U
new file mode 100644
index 00000000000..39534ce7d67
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/U
@@ -0,0 +1,49 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volVectorField;
+    object      U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include        "include/initialConditions"
+
+dimensions      [0 1 -1 0 0 0 0];
+
+internalField   uniform $flowVelocity;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    walls
+    {
+        type            movingWallVelocity;
+        value           uniform (0 0 0);
+    }
+
+    inlet
+    {
+        type            fixedValue;
+        value           $internalField;
+    }
+
+    outlet
+    {
+        type            zeroGradient;   //calculated;
+        value           $internalField;
+    }
+
+    #include "include/frontBackTopBottomfreePatches"
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/epsilon b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/epsilon
new file mode 100644
index 00000000000..73ef242b33e
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/epsilon
@@ -0,0 +1,50 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      epsilon;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include        "include/initialConditions"
+
+dimensions      [0 2 -3 0 0 0 0];
+
+internalField   uniform $turbulentEpsilon;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    wall
+    {
+        type            epsilonWallFunction;
+        value           $internalField;
+    }
+
+    inlet
+    {
+        type  fixedValue;
+        value $internalField;
+    }
+
+    outlet
+    {
+        type            inletOutlet;
+        inletValue      $internalField;
+        value           $internalField;
+    }
+
+    #include "include/frontBackTopBottomfreePatches"
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/include/frontBackTopBottomfreePatches b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/include/frontBackTopBottomfreePatches
new file mode 100644
index 00000000000..04f861bd8e0
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/include/frontBackTopBottomfreePatches
@@ -0,0 +1,14 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+
+topAndBottom
+{
+    type slip;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/include/initialConditions b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/include/initialConditions
new file mode 100644
index 00000000000..f9af913104d
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/include/initialConditions
@@ -0,0 +1,16 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+
+flowVelocity         (10 0 0);
+pressure             0;
+turbulentKE          0.375;
+turbulentOmega       3.6;
+turbulentEpsilon     0.12;
+#inputMode           merge
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/k b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/k
new file mode 100644
index 00000000000..6f9c85a404b
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/k
@@ -0,0 +1,51 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      k;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include        "include/initialConditions"
+
+dimensions      [ 0 2 -2 0 0 0 0 ];
+
+internalField   uniform $turbulentKE;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    wall
+    {
+        type            kqRWallFunction;
+        value           uniform 0;
+    }
+
+    inlet
+    {
+        type            turbulentIntensityKineticEnergyInlet;
+        intensity       0.05;       // 5% turbulent intensity
+        value           $internalField;
+    }
+
+    outlet
+    {
+       type             inletOutlet;
+       inletValue       $internalField;
+       value            $internalField;
+    }
+
+    #include "include/frontBackTopBottomfreePatches"
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/nuTilda b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/nuTilda
new file mode 100644
index 00000000000..2787701e9bd
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/nuTilda
@@ -0,0 +1,32 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      nuTilda;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 2 -1 0 0 0 0];
+
+internalField   uniform 0;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    ".*"
+    {
+        type            zeroGradient;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/nut b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/nut
new file mode 100644
index 00000000000..e6cf3ba42de
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/nut
@@ -0,0 +1,40 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      nut;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [ 0 2 -1 0 0 0 0 ];
+
+internalField   uniform 0;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    wall
+    {
+        type            nutkWallFunction;
+        value           uniform 0;
+    }
+
+    #include "include/frontBackTopBottomfreePatches"
+
+    ".*"
+    {
+        type            zeroGradient;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/omega b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/omega
new file mode 100644
index 00000000000..6d5097ae582
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/omega
@@ -0,0 +1,50 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      omega;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include        "include/initialConditions"
+
+dimensions      [0 0 -1 0 0 0 0];
+
+internalField   uniform $turbulentOmega;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    wall
+    {
+        type            omegaWallFunction;
+        value           $internalField;
+    }
+
+    inlet
+    {
+        type  fixedValue;
+        value $internalField;
+    }
+
+    outlet
+    {
+        type            inletOutlet;
+        inletValue      $internalField;
+        value           $internalField;
+    }
+
+    #include "include/frontBackTopBottomfreePatches"
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/p b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/p
new file mode 100644
index 00000000000..c5b82e301cc
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/p
@@ -0,0 +1,48 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 2 -2 0 0 0 0];
+
+#include        "include/initialConditions"
+
+internalField   uniform $pressure;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    wall
+    {
+        type            zeroGradient;
+    }
+
+    inlet
+    {
+        type            zeroGradient;
+    }
+
+    outlet
+    {
+        type            fixedValue;
+        inletValue      $internalField;
+        value           $internalField;
+    }
+
+    #include "include/frontBackTopBottomfreePatches"
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/pointDisplacement b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/pointDisplacement
new file mode 100644
index 00000000000..74fc54dc74b
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/pointDisplacement
@@ -0,0 +1,36 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       pointVectorField;
+    object      pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 1 0 0 0 0 0];
+
+internalField   uniform (0 0 0);
+
+boundaryField
+{
+    "(walls|overset)"
+    {
+        type            uniformFixedValue;
+        uniformValue    (0 0 0);
+    }
+
+    ".*"
+    {
+        type            uniformFixedValue;
+        uniformValue    (0 0 0);
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/zoneID b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/zoneID
new file mode 100644
index 00000000000..03c62b53858
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/zoneID
@@ -0,0 +1,32 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      zoneID;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 0 0 0 0 0 0];
+
+internalField   uniform 0;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
+
+    ".*"
+    {
+        type            zeroGradient;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/Allclean b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/Allclean
new file mode 100755
index 00000000000..5d96ca404a3
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/Allclean
@@ -0,0 +1,14 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # run from this directory
+
+# Source tutorial clean functions
+. $WM_PROJECT_DIR/bin/tools/CleanFunctions
+
+cleanCase
+rm -f constant/polyMesh/boundary
+rm -f constant/polyMesh/zoneID
+rm -f constant/cellInterpolationWeight
+
+rm -rf 0
+
+# ----------------------------------------------------------------- end-of-file
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/Allrun b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/Allrun
new file mode 100755
index 00000000000..35c77b01877
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/Allrun
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+# Serial
+#runApplication  $(getApplication)
+
+# Parallel
+runApplication decomposePar -cellDist
+runParallel $application
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/Allrun.pre b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/Allrun.pre
new file mode 100755
index 00000000000..d45f7bfe12e
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/Allrun.pre
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+runApplication extrudeMesh
+runApplication createPatch -overwrite
+mergeMeshes . ../aeroFoil_overset -overwrite
+runApplication topoSet
+
+# Copy standard fields
+rm -rf 0 && cp -r 0.org 0
+
+# Use cellSets to write zoneID
+runApplication setFields
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/RASProperties b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/RASProperties
new file mode 100644
index 00000000000..a4d5a1a869f
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/RASProperties
@@ -0,0 +1,23 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      RASProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+RASModel        kOmegaSST;
+
+turbulence      on;
+
+printCoeffs     on;
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/dynamicMeshDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/dynamicMeshDict
new file mode 100644
index 00000000000..9f766ac2725
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/dynamicMeshDict
@@ -0,0 +1,33 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+motionSolverLibs ( "libfvMotionSolvers.so" );
+
+solver          displacementLaplacian;
+
+displacementLaplacianCoeffs
+{
+    diffusivity     uniform 1;
+}
+
+dynamicFvMesh       dynamicOversetFvMesh;
+
+dynamicOversetFvMeshCoeffs
+{
+//    layerRelax 0.3;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/transportProperties b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/transportProperties
new file mode 100644
index 00000000000..312de2197d3
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/transportProperties
@@ -0,0 +1,39 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+DT              DT [ 0 2 -1 0 0 0 0 ] 1;    //4e-05;
+
+transportModel  Newtonian;
+
+nu              nu [ 0 2 -1 0 0 0 0 ] 1e-05;
+
+CrossPowerLawCoeffs
+{
+    nu0             nu0 [ 0 2 -1 0 0 0 0 ] 1e-06;
+    nuInf           nuInf [ 0 2 -1 0 0 0 0 ] 1e-06;
+    m               m [ 0 0 1 0 0 0 0 ] 1;
+    n               n [ 0 0 0 0 0 0 0 ] 1;
+}
+
+BirdCarreauCoeffs
+{
+    nu0             nu0 [ 0 2 -1 0 0 0 0 ] 1e-06;
+    nuInf           nuInf [ 0 2 -1 0 0 0 0 ] 1e-06;
+    k               k [ 0 0 1 0 0 0 0 ] 0;
+    n               n [ 0 0 0 0 0 0 0 ] 1;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/triSurface/wing_5degrees.obj b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/triSurface/wing_5degrees.obj
new file mode 100644
index 00000000000..4be2aac5f2f
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/triSurface/wing_5degrees.obj
@@ -0,0 +1,1054 @@
+# Wavefront OBJ file written 2010-05-13T09:12:43
+o wing_5degrees
+
+# points : 520
+# faces  : 520
+# zones  : 1
+#   0  WALL10  (nFaces: 520)
+
+# <points count="520">
+v 1.00488 -0.0890722 -0.5
+v 1.00488 -0.0890722 0.5
+v 0.999453 -0.0870827 0.5
+v 0.999453 -0.0870827 -0.5
+v 0.993747 -0.0849908 0.5
+v 0.993747 -0.0849908 -0.5
+v 0.98776 -0.0827959 0.5
+v 0.98776 -0.0827959 -0.5
+v 0.981475 -0.0804834 0.5
+v 0.981475 -0.0804834 -0.5
+v 0.974878 -0.0780483 0.5
+v 0.974878 -0.0780483 -0.5
+v 0.967936 -0.075535 0.5
+v 0.967936 -0.075535 -0.5
+v 0.960671 -0.0728297 0.5
+v 0.960671 -0.0728297 -0.5
+v 0.952986 -0.070149 0.5
+v 0.952986 -0.070149 -0.5
+v 0.944915 -0.067332 0.5
+v 0.944915 -0.067332 -0.5
+v 0.936442 -0.064377 0.5
+v 0.936442 -0.064377 -0.5
+v 0.927543 -0.0612777 0.5
+v 0.927543 -0.0612777 -0.5
+v 0.918171 -0.0581074 0.5
+v 0.918171 -0.0581074 -0.5
+v 0.908345 -0.0547308 0.5
+v 0.908345 -0.0547308 -0.5
+v 0.897978 -0.0513371 0.5
+v 0.897978 -0.0513371 -0.5
+v 0.887113 -0.0477115 0.5
+v 0.887113 -0.0477115 -0.5
+v 0.875671 -0.0440076 0.5
+v 0.875671 -0.0440076 -0.5
+v 0.863634 -0.0401898 0.5
+v 0.863634 -0.0401898 -0.5
+v 0.850988 -0.0362043 0.5
+v 0.850988 -0.0362043 -0.5
+v 0.837677 -0.0321259 0.5
+v 0.837677 -0.0321259 -0.5
+v 0.8237 -0.0278406 0.5
+v 0.8237 -0.0278406 -0.5
+v 0.808997 -0.0234314 0.5
+v 0.808997 -0.0234314 -0.5
+v 0.793536 -0.0188824 0.5
+v 0.793536 -0.0188824 -0.5
+v 0.777248 -0.0142896 0.5
+v 0.777248 -0.0142896 -0.5
+v 0.760144 -0.00947585 0.5
+v 0.760144 -0.00947585 -0.5
+v 0.742148 -0.0045544 0.5
+v 0.742148 -0.0045544 -0.5
+v 0.723207 0.000449948 0.5
+v 0.723207 0.000449948 -0.5
+v 0.703296 0.00561154 0.5
+v 0.703296 0.00561154 -0.5
+v 0.682345 0.010854 0.5
+v 0.682345 0.010854 -0.5
+v 0.660295 0.0161554 0.5
+v 0.660295 0.0161554 -0.5
+v 0.637103 0.0215548 0.5
+v 0.637103 0.0215548 -0.5
+v 0.606829 0.0282606 0.5
+v 0.606829 0.0282606 -0.5
+v 0.578018 0.0343978 0.5
+v 0.578018 0.0343978 -0.5
+v 0.550557 0.0397874 0.5
+v 0.550557 0.0397874 -0.5
+v 0.524436 0.0447356 0.5
+v 0.524436 0.0447356 -0.5
+v 0.499549 0.0490421 0.5
+v 0.499549 0.0490421 -0.5
+v 0.475869 0.05291 0.5
+v 0.475869 0.05291 -0.5
+v 0.45334 0.0563729 0.5
+v 0.45334 0.0563729 -0.5
+v 0.431911 0.059484 0.5
+v 0.431911 0.059484 -0.5
+v 0.411518 0.0621876 0.5
+v 0.411518 0.0621876 -0.5
+v 0.392118 0.0645445 0.5
+v 0.392118 0.0645445 -0.5
+v 0.373644 0.0664046 0.5
+v 0.373644 0.0664046 -0.5
+v 0.356081 0.0680196 0.5
+v 0.356081 0.0680196 -0.5
+v 0.339375 0.0692961 0.5
+v 0.339375 0.0692961 -0.5
+v 0.323487 0.0702815 0.5
+v 0.323487 0.0702815 -0.5
+v 0.308383 0.0710035 0.5
+v 0.308383 0.0710035 -0.5
+v 0.294024 0.0714698 0.5
+v 0.294024 0.0714698 -0.5
+v 0.28038 0.0717809 0.5
+v 0.28038 0.0717809 -0.5
+v 0.267416 0.0719191 0.5
+v 0.267416 0.0719191 -0.5
+v 0.255099 0.0718222 0.5
+v 0.255099 0.0718222 -0.5
+v 0.243399 0.0716511 0.5
+v 0.243399 0.0716511 -0.5
+v 0.232288 0.0713208 0.5
+v 0.232288 0.0713208 -0.5
+v 0.221735 0.0709249 0.5
+v 0.221735 0.0709249 -0.5
+v 0.211715 0.0704338 0.5
+v 0.211715 0.0704338 -0.5
+v 0.202202 0.0698513 0.5
+v 0.202202 0.0698513 -0.5
+v 0.19317 0.0692271 0.5
+v 0.19317 0.0692271 -0.5
+v 0.184599 0.0685108 0.5
+v 0.184599 0.0685108 -0.5
+v 0.176464 0.0677409 0.5
+v 0.176464 0.0677409 -0.5
+v 0.168741 0.0669472 0.5
+v 0.168741 0.0669472 -0.5
+v 0.161418 0.0660755 0.5
+v 0.161418 0.0660755 -0.5
+v 0.154469 0.0651852 0.5
+v 0.154469 0.0651852 -0.5
+v 0.145493 0.0640314 0.5
+v 0.145493 0.0640314 -0.5
+v 0.136995 0.0627463 0.5
+v 0.136995 0.0627463 -0.5
+v 0.128932 0.0614383 0.5
+v 0.128932 0.0614383 -0.5
+v 0.121282 0.0601525 0.5
+v 0.121282 0.0601525 -0.5
+v 0.114049 0.0587416 0.5
+v 0.114049 0.0587416 -0.5
+v 0.107186 0.0573482 0.5
+v 0.107186 0.0573482 -0.5
+v 0.100675 0.0559871 0.5
+v 0.100675 0.0559871 -0.5
+v 0.0945147 0.0545794 0.5
+v 0.0945147 0.0545794 -0.5
+v 0.0886858 0.0531426 0.5
+v 0.0886858 0.0531426 -0.5
+v 0.0831659 0.0517083 0.5
+v 0.0831659 0.0517083 -0.5
+v 0.0779342 0.0503006 0.5
+v 0.0779342 0.0503006 -0.5
+v 0.072975 0.0489224 0.5
+v 0.072975 0.0489224 -0.5
+v 0.0682798 0.0475559 0.5
+v 0.0682798 0.0475559 -0.5
+v 0.0638499 0.0461601 0.5
+v 0.0638499 0.0461601 -0.5
+v 0.0596656 0.0447577 0.5
+v 0.0596656 0.0447577 -0.5
+v 0.055694 0.0434126 0.5
+v 0.055694 0.0434126 -0.5
+v 0.0519364 0.0420932 0.5
+v 0.0519364 0.0420932 -0.5
+v 0.0484053 0.0407363 0.5
+v 0.0484053 0.0407363 -0.5
+v 0.0450779 0.0393756 0.5
+v 0.0450779 0.0393756 -0.5
+v 0.0419215 0.0380722 0.5
+v 0.0419215 0.0380722 -0.5
+v 0.0389288 0.0368211 0.5
+v 0.0389288 0.0368211 -0.5
+v 0.036102 0.0355928 0.5
+v 0.036102 0.0355928 -0.5
+v 0.0334425 0.034368 0.5
+v 0.0334425 0.034368 -0.5
+v 0.0309496 0.0331356 0.5
+v 0.0309496 0.0331356 -0.5
+v 0.0286117 0.0319047 0.5
+v 0.0286117 0.0319047 -0.5
+v 0.0264077 0.0307022 0.5
+v 0.0264077 0.0307022 -0.5
+v 0.0243248 0.02954 0.5
+v 0.0243248 0.02954 -0.5
+v 0.0223665 0.0284014 0.5
+v 0.0223665 0.0284014 -0.5
+v 0.0205353 0.0272716 0.5
+v 0.0205353 0.0272716 -0.5
+v 0.0188204 0.0261581 0.5
+v 0.0188204 0.0261581 -0.5
+v 0.0172057 0.0250781 0.5
+v 0.0172057 0.0250781 -0.5
+v 0.015681 0.0240389 0.5
+v 0.015681 0.0240389 -0.5
+v 0.0142472 0.0230307 0.5
+v 0.0142472 0.0230307 -0.5
+v 0.0129051 0.0220434 0.5
+v 0.0129051 0.0220434 -0.5
+v 0.0116567 0.0210699 0.5
+v 0.0116567 0.0210699 -0.5
+v 0.0105044 0.0201047 0.5
+v 0.0105044 0.0201047 -0.5
+v 0.00944864 0.0191444 0.5
+v 0.00944864 0.0191444 -0.5
+v 0.00847997 0.0181956 0.5
+v 0.00847997 0.0181956 -0.5
+v 0.00758214 0.0172702 0.5
+v 0.00758214 0.0172702 -0.5
+v 0.00674204 0.0163779 0.5
+v 0.00674204 0.0163779 -0.5
+v 0.00595671 0.0155186 0.5
+v 0.00595671 0.0155186 -0.5
+v 0.00523198 0.0146848 0.5
+v 0.00523198 0.0146848 -0.5
+v 0.00457157 0.0138701 0.5
+v 0.00457157 0.0138701 -0.5
+v 0.00397503 0.0130721 0.5
+v 0.00397503 0.0130721 -0.5
+v 0.00343506 0.0122936 0.5
+v 0.00343506 0.0122936 -0.5
+v 0.0029443 0.0115379 0.5
+v 0.0029443 0.0115379 -0.5
+v 0.0024965 0.010807 0.5
+v 0.0024965 0.010807 -0.5
+v 0.00209053 0.0101012 0.5
+v 0.00209053 0.0101012 -0.5
+v 0.00172938 0.00941821 0.5
+v 0.00172938 0.00941821 -0.5
+v 0.00141481 0.00875662 0.5
+v 0.00141481 0.00875662 -0.5
+v 0.00114703 0.00811509 0.5
+v 0.00114703 0.00811509 -0.5
+v 0.000922634 0.00749375 0.5
+v 0.000922634 0.00749375 -0.5
+v 0.00073432 0.00689421 0.5
+v 0.00073432 0.00689421 -0.5
+v 0.000575606 0.00631745 0.5
+v 0.000575606 0.00631745 -0.5
+v 0.000441178 0.00576428 0.5
+v 0.000441178 0.00576428 -0.5
+v 0.000326628 0.00523494 0.5
+v 0.000326628 0.00523494 -0.5
+v 0.000229331 0.00472926 0.5
+v 0.000229331 0.00472926 -0.5
+v 0.000147968 0.00424663 0.5
+v 0.000147968 0.00424663 -0.5
+v 8.13071e-05 0.00378656 0.5
+v 8.13071e-05 0.00378656 -0.5
+v 2.81186e-05 0.00334838 0.5
+v 2.81186e-05 0.00334838 -0.5
+v -1.28053e-05 0.00293132 0.5
+v -1.28053e-05 0.00293132 -0.5
+v -4.26138e-05 0.00253464 0.5
+v -4.26138e-05 0.00253464 -0.5
+v -6.24104e-05 0.00215753 0.5
+v -6.24104e-05 0.00215753 -0.5
+v -7.32354e-05 0.00179922 0.5
+v -7.32354e-05 0.00179922 -0.5
+v -7.6066e-05 0.00145891 0.5
+v -7.6066e-05 0.00145891 -0.5
+v -7.18149e-05 0.00113574 0.5
+v -7.18149e-05 0.00113574 -0.5
+v -6.13265e-05 0.000828962 0.5
+v -6.13265e-05 0.000828962 -0.5
+v -4.5388e-05 0.000537894 0.5
+v -4.5388e-05 0.000537894 -0.5
+v -2.47174e-05 0.000261729 0.5
+v -2.47174e-05 0.000261729 -0.5
+v 0.999428 -0.0886333 -0.5
+v 0.999428 -0.0886333 0.5
+v 0 0 0.5
+v 0 0 -0.5
+v 3.07731e-05 -0.000269468 0.5
+v 3.07731e-05 -0.000269468 -0.5
+v 6.87839e-05 -0.000551758 0.5
+v 6.87839e-05 -0.000551758 -0.5
+v 0.00011487 -0.000847395 0.5
+v 0.00011487 -0.000847395 -0.5
+v 0.000169958 -0.00115699 0.5
+v 0.000169958 -0.00115699 -0.5
+v 0.000235006 -0.00148084 0.5
+v 0.000235006 -0.00148084 -0.5
+v 0.000311085 -0.00181947 0.5
+v 0.000311085 -0.00181947 -0.5
+v 0.000399343 -0.00217329 0.5
+v 0.000399343 -0.00217329 -0.5
+v 0.000501006 -0.00254265 0.5
+v 0.000501006 -0.00254265 -0.5
+v 0.000617405 -0.00292793 0.5
+v 0.000617405 -0.00292793 -0.5
+v 0.000749918 -0.00332928 0.5
+v 0.000749918 -0.00332928 -0.5
+v 0.000900098 -0.00374706 0.5
+v 0.000900098 -0.00374706 -0.5
+v 0.00106951 -0.00418123 0.5
+v 0.00106951 -0.00418123 -0.5
+v 0.00125981 -0.00463173 0.5
+v 0.00125981 -0.00463173 -0.5
+v 0.00147278 -0.00509836 0.5
+v 0.00147278 -0.00509836 -0.5
+v 0.00171023 -0.00558073 0.5
+v 0.00171023 -0.00558073 -0.5
+v 0.0019741 -0.00607866 0.5
+v 0.0019741 -0.00607866 -0.5
+v 0.00226657 -0.00659235 0.5
+v 0.00226657 -0.00659235 -0.5
+v 0.00258985 -0.00712192 0.5
+v 0.00258985 -0.00712192 -0.5
+v 0.00294625 -0.00766749 0.5
+v 0.00294625 -0.00766749 -0.5
+v 0.0033381 -0.00822888 0.5
+v 0.0033381 -0.00822888 -0.5
+v 0.00376858 -0.00880495 0.5
+v 0.00376858 -0.00880495 -0.5
+v 0.00424144 -0.00939356 0.5
+v 0.00424144 -0.00939356 -0.5
+v 0.0047608 -0.00999197 0.5
+v 0.0047608 -0.00999197 -0.5
+v 0.00533108 -0.0105969 0.5
+v 0.00533108 -0.0105969 -0.5
+v 0.00595465 -0.0112076 0.5
+v 0.00595465 -0.0112076 -0.5
+v 0.00663108 -0.0118268 0.5
+v 0.00663108 -0.0118268 -0.5
+v 0.00735864 -0.0124589 0.5
+v 0.00735864 -0.0124589 -0.5
+v 0.00813479 -0.0131082 0.5
+v 0.00813479 -0.0131082 -0.5
+v 0.00896315 -0.0137726 0.5
+v 0.00896315 -0.0137726 -0.5
+v 0.00985143 -0.0144449 0.5
+v 0.00985143 -0.0144449 -0.5
+v 0.0108089 -0.0151156 0.5
+v 0.0108089 -0.0151156 -0.5
+v 0.0118417 -0.0157801 0.5
+v 0.0118417 -0.0157801 -0.5
+v 0.0129485 -0.0164439 0.5
+v 0.0129485 -0.0164439 -0.5
+v 0.0141258 -0.0171158 0.5
+v 0.0141258 -0.0171158 -0.5
+v 0.0153717 -0.0178024 0.5
+v 0.0153717 -0.0178024 -0.5
+v 0.0166914 -0.0185005 0.5
+v 0.0166914 -0.0185005 -0.5
+v 0.0180921 -0.0192037 0.5
+v 0.0180921 -0.0192037 -0.5
+v 0.01958 -0.019908 0.5
+v 0.01958 -0.019908 -0.5
+v 0.0211576 -0.0206151 0.5
+v 0.0211576 -0.0206151 -0.5
+v 0.0228265 -0.0213288 0.5
+v 0.0228265 -0.0213288 -0.5
+v 0.0245895 -0.0220523 0.5
+v 0.0245895 -0.0220523 -0.5
+v 0.0264506 -0.0227868 0.5
+v 0.0264506 -0.0227868 -0.5
+v 0.028415 -0.0235332 0.5
+v 0.028415 -0.0235332 -0.5
+v 0.0304905 -0.0242814 0.5
+v 0.0304905 -0.0242814 -0.5
+v 0.0326872 -0.0250146 0.5
+v 0.0326872 -0.0250146 -0.5
+v 0.0350128 -0.0257258 0.5
+v 0.0350128 -0.0257258 -0.5
+v 0.0374672 -0.0264333 0.5
+v 0.0374672 -0.0264333 -0.5
+v 0.0400497 -0.0271566 0.5
+v 0.0400497 -0.0271566 -0.5
+v 0.0427704 -0.0278802 0.5
+v 0.0427704 -0.0278802 -0.5
+v 0.0456434 -0.0285739 0.5
+v 0.0456434 -0.0285739 -0.5
+v 0.0486731 -0.0292495 0.5
+v 0.0486731 -0.0292495 -0.5
+v 0.0518554 -0.0299566 0.5
+v 0.0518554 -0.0299566 -0.5
+v 0.0551966 -0.030697 0.5
+v 0.0551966 -0.030697 -0.5
+v 0.0587179 -0.0314085 0.5
+v 0.0587179 -0.0314085 -0.5
+v 0.062431 -0.032078 0.5
+v 0.062431 -0.032078 -0.5
+v 0.0663314 -0.0327743 0.5
+v 0.0663314 -0.0327743 -0.5
+v 0.0704248 -0.033514 0.5
+v 0.0704248 -0.033514 -0.5
+v 0.0747335 -0.0342256 0.5
+v 0.0747335 -0.0342256 -0.5
+v 0.0792714 -0.0348902 0.5
+v 0.0792714 -0.0348902 -0.5
+v 0.0840416 -0.0355492 0.5
+v 0.0840416 -0.0355492 -0.5
+v 0.089054 -0.0362103 0.5
+v 0.089054 -0.0362103 -0.5
+v 0.0943226 -0.0368627 0.5
+v 0.0943226 -0.0368627 -0.5
+v 0.0998603 -0.0375041 0.5
+v 0.0998603 -0.0375041 -0.5
+v 0.105679 -0.0381355 0.5
+v 0.105679 -0.0381355 -0.5
+v 0.111793 -0.0387575 0.5
+v 0.111793 -0.0387575 -0.5
+v 0.118218 -0.0393567 0.5
+v 0.118218 -0.0393567 -0.5
+v 0.124968 -0.0399429 0.5
+v 0.124968 -0.0399429 -0.5
+v 0.132055 -0.0405782 0.5
+v 0.132055 -0.0405782 -0.5
+v 0.1395 -0.0411771 0.5
+v 0.1395 -0.0411771 -0.5
+v 0.147326 -0.041699 0.5
+v 0.147326 -0.041699 -0.5
+v 0.15451 -0.0421969 0.5
+v 0.15451 -0.0421969 -0.5
+v 0.162054 -0.042698 0.5
+v 0.162054 -0.042698 -0.5
+v 0.16998 -0.0431596 0.5
+v 0.16998 -0.0431596 -0.5
+v 0.178305 -0.0435984 0.5
+v 0.178305 -0.0435984 -0.5
+v 0.187045 -0.0440696 0.5
+v 0.187045 -0.0440696 -0.5
+v 0.196223 -0.0445349 0.5
+v 0.196223 -0.0445349 -0.5
+v 0.205864 -0.0449725 0.5
+v 0.205864 -0.0449725 -0.5
+v 0.215985 -0.045448 0.5
+v 0.215985 -0.045448 -0.5
+v 0.226615 -0.0458797 0.5
+v 0.226615 -0.0458797 -0.5
+v 0.237778 -0.0463184 0.5
+v 0.237778 -0.0463184 -0.5
+v 0.249497 -0.0468156 0.5
+v 0.249497 -0.0468156 -0.5
+v 0.261804 -0.0472732 0.5
+v 0.261804 -0.0472732 -0.5
+v 0.274727 -0.0477637 0.5
+v 0.274727 -0.0477637 -0.5
+v 0.288294 -0.0483182 0.5
+v 0.288294 -0.0483182 -0.5
+v 0.302542 -0.0488257 0.5
+v 0.302542 -0.0488257 -0.5
+v 0.317502 -0.0493844 0.5
+v 0.317502 -0.0493844 -0.5
+v 0.33321 -0.0499788 0.5
+v 0.33321 -0.0499788 -0.5
+v 0.349702 -0.0506056 0.5
+v 0.349702 -0.0506056 -0.5
+v 0.367015 -0.0513872 0.5
+v 0.367015 -0.0513872 -0.5
+v 0.385192 -0.0522281 0.5
+v 0.385192 -0.0522281 -0.5
+v 0.404277 -0.0531254 0.5
+v 0.404277 -0.0531254 -0.5
+v 0.424316 -0.0540817 0.5
+v 0.424316 -0.0540817 -0.5
+v 0.445357 -0.0550979 0.5
+v 0.445357 -0.0550979 -0.5
+v 0.467451 -0.0560874 0.5
+v 0.467451 -0.0560874 -0.5
+v 0.490649 -0.0571824 0.5
+v 0.490649 -0.0571824 -0.5
+v 0.51501 -0.0582757 0.5
+v 0.51501 -0.0582757 -0.5
+v 0.540585 -0.0594903 0.5
+v 0.540585 -0.0594903 -0.5
+v 0.567439 -0.0607815 0.5
+v 0.567439 -0.0607815 -0.5
+v 0.595635 -0.0621304 0.5
+v 0.595635 -0.0621304 -0.5
+v 0.625242 -0.0635352 0.5
+v 0.625242 -0.0635352 -0.5
+v 0.649433 -0.0648334 0.5
+v 0.649433 -0.0648334 -0.5
+v 0.672415 -0.0660494 0.5
+v 0.672415 -0.0660494 -0.5
+v 0.694245 -0.0672674 0.5
+v 0.694245 -0.0672674 -0.5
+v 0.714979 -0.0684936 0.5
+v 0.714979 -0.0684936 -0.5
+v 0.734678 -0.0696472 0.5
+v 0.734678 -0.0696472 -0.5
+v 0.753392 -0.070724 0.5
+v 0.753392 -0.070724 -0.5
+v 0.771162 -0.0718742 0.5
+v 0.771162 -0.0718742 -0.5
+v 0.788046 -0.0729552 0.5
+v 0.788046 -0.0729552 -0.5
+v 0.804086 -0.0739668 0.5
+v 0.804086 -0.0739668 -0.5
+v 0.819316 -0.0750462 0.5
+v 0.819316 -0.0750462 -0.5
+v 0.833785 -0.076061 0.5
+v 0.833785 -0.076061 -0.5
+v 0.847532 -0.0770175 0.5
+v 0.847532 -0.0770175 -0.5
+v 0.86059 -0.0779215 0.5
+v 0.86059 -0.0779215 -0.5
+v 0.872998 -0.0787716 0.5
+v 0.872998 -0.0787716 -0.5
+v 0.884776 -0.079698 0.5
+v 0.884776 -0.079698 -0.5
+v 0.89597 -0.0805061 0.5
+v 0.89597 -0.0805061 -0.5
+v 0.906605 -0.0812554 0.5
+v 0.906605 -0.0812554 -0.5
+v 0.916704 -0.0820352 0.5
+v 0.916704 -0.0820352 -0.5
+v 0.926301 -0.0827494 0.5
+v 0.926301 -0.0827494 -0.5
+v 0.935409 -0.0835384 0.5
+v 0.935409 -0.0835384 -0.5
+v 0.944071 -0.0841575 0.5
+v 0.944071 -0.0841575 -0.5
+v 0.952294 -0.0848264 0.5
+v 0.952294 -0.0848264 -0.5
+v 0.960109 -0.0854166 0.5
+v 0.960109 -0.0854166 -0.5
+v 0.967527 -0.0860602 0.5
+v 0.967527 -0.0860602 -0.5
+v 0.97458 -0.0865997 0.5
+v 0.97458 -0.0865997 -0.5
+v 0.981277 -0.0871547 0.5
+v 0.981277 -0.0871547 -0.5
+v 0.987637 -0.0876912 0.5
+v 0.987637 -0.0876912 -0.5
+v 0.993684 -0.0881407 0.5
+v 0.993684 -0.0881407 -0.5
+# </points>
+
+# <faces count="520">
+g WALL10
+f 1 2 3
+f 3 4 1
+f 4 3 5
+f 5 6 4
+f 6 5 7
+f 7 8 6
+f 8 7 9
+f 9 10 8
+f 10 9 11
+f 11 12 10
+f 12 11 13
+f 13 14 12
+f 14 13 15
+f 15 16 14
+f 16 15 17
+f 17 18 16
+f 18 17 19
+f 19 20 18
+f 20 19 21
+f 21 22 20
+f 22 21 23
+f 23 24 22
+f 24 23 25
+f 25 26 24
+f 26 25 27
+f 27 28 26
+f 28 27 29
+f 29 30 28
+f 30 29 31
+f 31 32 30
+f 32 31 33
+f 33 34 32
+f 34 33 35
+f 35 36 34
+f 36 35 37
+f 37 38 36
+f 38 37 39
+f 39 40 38
+f 40 39 41
+f 41 42 40
+f 42 41 43
+f 43 44 42
+f 44 43 45
+f 45 46 44
+f 46 45 47
+f 47 48 46
+f 48 47 49
+f 49 50 48
+f 50 49 51
+f 51 52 50
+f 52 51 53
+f 53 54 52
+f 54 53 55
+f 55 56 54
+f 56 55 57
+f 57 58 56
+f 58 57 59
+f 59 60 58
+f 60 59 61
+f 61 62 60
+f 62 61 63
+f 63 64 62
+f 64 63 65
+f 65 66 64
+f 66 65 67
+f 67 68 66
+f 68 67 69
+f 69 70 68
+f 70 69 71
+f 71 72 70
+f 72 71 73
+f 73 74 72
+f 74 73 75
+f 75 76 74
+f 76 75 77
+f 77 78 76
+f 78 77 79
+f 79 80 78
+f 80 79 81
+f 81 82 80
+f 82 81 83
+f 83 84 82
+f 84 83 85
+f 85 86 84
+f 86 85 87
+f 87 88 86
+f 88 87 89
+f 89 90 88
+f 90 89 91
+f 91 92 90
+f 92 91 93
+f 93 94 92
+f 94 93 95
+f 95 96 94
+f 96 95 97
+f 97 98 96
+f 98 97 99
+f 99 100 98
+f 100 99 101
+f 101 102 100
+f 102 101 103
+f 103 104 102
+f 104 103 105
+f 105 106 104
+f 106 105 107
+f 107 108 106
+f 108 107 109
+f 109 110 108
+f 110 109 111
+f 111 112 110
+f 112 111 113
+f 113 114 112
+f 114 113 115
+f 115 116 114
+f 116 115 117
+f 117 118 116
+f 118 117 119
+f 119 120 118
+f 120 119 121
+f 121 122 120
+f 122 121 123
+f 123 124 122
+f 124 123 125
+f 125 126 124
+f 126 125 127
+f 127 128 126
+f 128 127 129
+f 129 130 128
+f 130 129 131
+f 131 132 130
+f 132 131 133
+f 133 134 132
+f 134 133 135
+f 135 136 134
+f 136 135 137
+f 137 138 136
+f 138 137 139
+f 139 140 138
+f 140 139 141
+f 141 142 140
+f 142 141 143
+f 143 144 142
+f 144 143 145
+f 145 146 144
+f 146 145 147
+f 147 148 146
+f 148 147 149
+f 149 150 148
+f 150 149 151
+f 151 152 150
+f 152 151 153
+f 153 154 152
+f 154 153 155
+f 155 156 154
+f 156 155 157
+f 157 158 156
+f 158 157 159
+f 159 160 158
+f 160 159 161
+f 161 162 160
+f 162 161 163
+f 163 164 162
+f 164 163 165
+f 165 166 164
+f 166 165 167
+f 167 168 166
+f 168 167 169
+f 169 170 168
+f 170 169 171
+f 171 172 170
+f 172 171 173
+f 173 174 172
+f 174 173 175
+f 175 176 174
+f 176 175 177
+f 177 178 176
+f 178 177 179
+f 179 180 178
+f 180 179 181
+f 181 182 180
+f 182 181 183
+f 183 184 182
+f 184 183 185
+f 185 186 184
+f 186 185 187
+f 187 188 186
+f 188 187 189
+f 189 190 188
+f 190 189 191
+f 191 192 190
+f 192 191 193
+f 193 194 192
+f 194 193 195
+f 195 196 194
+f 196 195 197
+f 197 198 196
+f 198 197 199
+f 199 200 198
+f 200 199 201
+f 201 202 200
+f 202 201 203
+f 203 204 202
+f 204 203 205
+f 205 206 204
+f 206 205 207
+f 207 208 206
+f 208 207 209
+f 209 210 208
+f 210 209 211
+f 211 212 210
+f 212 211 213
+f 213 214 212
+f 214 213 215
+f 215 216 214
+f 216 215 217
+f 217 218 216
+f 218 217 219
+f 219 220 218
+f 220 219 221
+f 221 222 220
+f 222 221 223
+f 223 224 222
+f 224 223 225
+f 225 226 224
+f 226 225 227
+f 227 228 226
+f 228 227 229
+f 229 230 228
+f 230 229 231
+f 231 232 230
+f 232 231 233
+f 233 234 232
+f 234 233 235
+f 235 236 234
+f 236 235 237
+f 237 238 236
+f 238 237 239
+f 239 240 238
+f 240 239 241
+f 241 242 240
+f 242 241 243
+f 243 244 242
+f 244 243 245
+f 245 246 244
+f 246 245 247
+f 247 248 246
+f 248 247 249
+f 249 250 248
+f 250 249 251
+f 251 252 250
+f 252 251 253
+f 253 254 252
+f 254 253 255
+f 255 256 254
+f 256 255 257
+f 257 258 256
+f 258 257 259
+f 259 260 258
+f 261 262 2
+f 2 1 261
+f 260 259 263
+f 263 264 260
+f 264 263 265
+f 265 266 264
+f 266 265 267
+f 267 268 266
+f 268 267 269
+f 269 270 268
+f 270 269 271
+f 271 272 270
+f 272 271 273
+f 273 274 272
+f 274 273 275
+f 275 276 274
+f 276 275 277
+f 277 278 276
+f 278 277 279
+f 279 280 278
+f 280 279 281
+f 281 282 280
+f 282 281 283
+f 283 284 282
+f 284 283 285
+f 285 286 284
+f 286 285 287
+f 287 288 286
+f 288 287 289
+f 289 290 288
+f 290 289 291
+f 291 292 290
+f 292 291 293
+f 293 294 292
+f 294 293 295
+f 295 296 294
+f 296 295 297
+f 297 298 296
+f 298 297 299
+f 299 300 298
+f 300 299 301
+f 301 302 300
+f 302 301 303
+f 303 304 302
+f 304 303 305
+f 305 306 304
+f 306 305 307
+f 307 308 306
+f 308 307 309
+f 309 310 308
+f 310 309 311
+f 311 312 310
+f 312 311 313
+f 313 314 312
+f 314 313 315
+f 315 316 314
+f 316 315 317
+f 317 318 316
+f 318 317 319
+f 319 320 318
+f 320 319 321
+f 321 322 320
+f 322 321 323
+f 323 324 322
+f 324 323 325
+f 325 326 324
+f 326 325 327
+f 327 328 326
+f 328 327 329
+f 329 330 328
+f 330 329 331
+f 331 332 330
+f 332 331 333
+f 333 334 332
+f 334 333 335
+f 335 336 334
+f 336 335 337
+f 337 338 336
+f 338 337 339
+f 339 340 338
+f 340 339 341
+f 341 342 340
+f 342 341 343
+f 343 344 342
+f 344 343 345
+f 345 346 344
+f 346 345 347
+f 347 348 346
+f 348 347 349
+f 349 350 348
+f 350 349 351
+f 351 352 350
+f 352 351 353
+f 353 354 352
+f 354 353 355
+f 355 356 354
+f 356 355 357
+f 357 358 356
+f 358 357 359
+f 359 360 358
+f 360 359 361
+f 361 362 360
+f 362 361 363
+f 363 364 362
+f 364 363 365
+f 365 366 364
+f 366 365 367
+f 367 368 366
+f 368 367 369
+f 369 370 368
+f 370 369 371
+f 371 372 370
+f 372 371 373
+f 373 374 372
+f 374 373 375
+f 375 376 374
+f 376 375 377
+f 377 378 376
+f 378 377 379
+f 379 380 378
+f 380 379 381
+f 381 382 380
+f 382 381 383
+f 383 384 382
+f 384 383 385
+f 385 386 384
+f 386 385 387
+f 387 388 386
+f 388 387 389
+f 389 390 388
+f 390 389 391
+f 391 392 390
+f 392 391 393
+f 393 394 392
+f 394 393 395
+f 395 396 394
+f 396 395 397
+f 397 398 396
+f 398 397 399
+f 399 400 398
+f 400 399 401
+f 401 402 400
+f 402 401 403
+f 403 404 402
+f 404 403 405
+f 405 406 404
+f 406 405 407
+f 407 408 406
+f 408 407 409
+f 409 410 408
+f 410 409 411
+f 411 412 410
+f 412 411 413
+f 413 414 412
+f 414 413 415
+f 415 416 414
+f 416 415 417
+f 417 418 416
+f 418 417 419
+f 419 420 418
+f 420 419 421
+f 421 422 420
+f 422 421 423
+f 423 424 422
+f 424 423 425
+f 425 426 424
+f 426 425 427
+f 427 428 426
+f 428 427 429
+f 429 430 428
+f 430 429 431
+f 431 432 430
+f 432 431 433
+f 433 434 432
+f 434 433 435
+f 435 436 434
+f 436 435 437
+f 437 438 436
+f 438 437 439
+f 439 440 438
+f 440 439 441
+f 441 442 440
+f 442 441 443
+f 443 444 442
+f 444 443 445
+f 445 446 444
+f 446 445 447
+f 447 448 446
+f 448 447 449
+f 449 450 448
+f 450 449 451
+f 451 452 450
+f 452 451 453
+f 453 454 452
+f 454 453 455
+f 455 456 454
+f 456 455 457
+f 457 458 456
+f 458 457 459
+f 459 460 458
+f 460 459 461
+f 461 462 460
+f 462 461 463
+f 463 464 462
+f 464 463 465
+f 465 466 464
+f 466 465 467
+f 467 468 466
+f 468 467 469
+f 469 470 468
+f 470 469 471
+f 471 472 470
+f 472 471 473
+f 473 474 472
+f 474 473 475
+f 475 476 474
+f 476 475 477
+f 477 478 476
+f 478 477 479
+f 479 480 478
+f 480 479 481
+f 481 482 480
+f 482 481 483
+f 483 484 482
+f 484 483 485
+f 485 486 484
+f 486 485 487
+f 487 488 486
+f 488 487 489
+f 489 490 488
+f 490 489 491
+f 491 492 490
+f 492 491 493
+f 493 494 492
+f 494 493 495
+f 495 496 494
+f 496 495 497
+f 497 498 496
+f 498 497 499
+f 499 500 498
+f 500 499 501
+f 501 502 500
+f 502 501 503
+f 503 504 502
+f 504 503 505
+f 505 506 504
+f 506 505 507
+f 507 508 506
+f 508 507 509
+f 509 510 508
+f 510 509 511
+f 511 512 510
+f 512 511 513
+f 513 514 512
+f 514 513 515
+f 515 516 514
+f 516 515 517
+f 517 518 516
+f 518 517 519
+f 519 520 518
+f 520 519 262
+f 262 261 520
+# </faces>
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/turbulenceProperties b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/turbulenceProperties
new file mode 100644
index 00000000000..1ae39077556
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/turbulenceProperties
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType  RAS;
+
+RAS
+{
+    RASModel        kEpsilon;   //kOmegaSST;
+
+    turbulence      on;
+
+    printCoeffs     on;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/blockMeshDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/blockMeshDict
new file mode 100644
index 00000000000..9c95d3eac67
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/blockMeshDict
@@ -0,0 +1,93 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+convertToMeters 1;
+
+vertices
+(
+    (-1.0 -1.0 -0.1)
+    ( 2.0 -1.0 -0.1)
+    ( 2.0 1.0 -0.1)
+    (-1.0 1.0 -0.1)
+    (-1.0 -1.0  0.1)
+    ( 2.0 -1.0  0.1)
+    ( 2.0 1.0  0.1)
+    (-1.0 1.0  0.1)
+);
+
+blocks
+(
+    hex (0 1 2 3 4 5 6 7) (17 11 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+    topAndBottom
+    {
+        type patch;
+        faces
+        (
+            (3 7 6 2)
+            (1 5 4 0)
+        );
+    }
+
+    inlet
+    {
+        type patch;
+        faces
+        (
+            (0 4 7 3)
+        );
+    }
+
+    outlet
+    {
+        type patch;
+        faces
+        (
+            (2 6 5 1)
+        );
+    }
+
+    symFront
+    {
+        type symmetryPlane;
+        faces
+        (
+            (4 5 6 7)
+        );
+    }
+
+    symBack
+    {
+        type symmetryPlane;
+        faces
+        (
+            (0 3 2 1)
+        );
+    }
+);
+
+mergePatchPairs
+(
+);
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/controlDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/controlDict
new file mode 100644
index 00000000000..28436ef928d
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/controlDict
@@ -0,0 +1,49 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+libs            ("liboverset.so");
+
+application     overSimpleFoam;
+
+startFrom       startTime;
+
+startTime       0;
+
+stopAt          endTime;
+
+endTime         2000;
+
+deltaT          1;
+
+writeControl    timeStep;
+
+writeInterval   200;
+
+purgeWrite      0;
+
+writeFormat     ascii;
+
+writePrecision  10;
+
+writeCompression off;
+
+timeFormat      general;
+
+timePrecision   6;
+
+runTimeModifiable true;
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/createPatchDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/createPatchDict
new file mode 100644
index 00000000000..f84e309be74
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/createPatchDict
@@ -0,0 +1,48 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      createPatchDict;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+// Do a synchronisation of coupled points after creation of any patches.
+// Note: this does not work with points that are on multiple coupled patches
+//       with transformations (i.e. cyclics).
+pointSync false;
+
+// Patches to create.
+patches
+(
+    {
+        // Name of new patch
+        name frontAndBack;
+
+        // Dictionary to construct new patch from
+        patchInfo
+        {
+            type empty;
+        }
+
+        // How to construct: either from 'patches' or 'set'
+        constructFrom patches;
+
+        // If constructFrom = patches : names of patches. Wildcards allowed.
+        patches (symFront symBack);
+
+        // If constructFrom = set : name of faceSet
+        set f0;
+    }
+
+);
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/decomposeParDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/decomposeParDict
new file mode 100644
index 00000000000..5a457a75200
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/decomposeParDict
@@ -0,0 +1,39 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 8;
+
+method          hierarchical;
+
+simpleCoeffs
+{
+    n               (1 3 1);
+    delta           0.001;
+}
+
+hierarchicalCoeffs
+{
+    n               (8 1 1);
+    delta           0.001;
+    order           xyz;
+}
+
+manualCoeffs
+{
+    dataFile        "cellDecomposition";
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/extrudeMeshDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/extrudeMeshDict
new file mode 100644
index 00000000000..e5f2993d226
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/extrudeMeshDict
@@ -0,0 +1,52 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      extrudeMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+// What to extrude:
+//      patch   : from patch of another case ('sourceCase')
+//      mesh    : as above but with original case included
+//      surface : from externally read surface
+
+constructFrom patch;
+sourceCase "../background_snappyHexMesh";
+sourcePatches (symFront);
+
+// If construct from patch: patch to use for back (can be same as sourcePatch)
+exposedPatchName symBack;
+
+// Flip surface normals before usage. Valid only for extrude from surface or
+// patch.
+flipNormals false;
+
+//- Linear extrusion in point-normal direction
+extrudeModel        linearNormal;
+
+nLayers             1;
+
+expansionRatio      1.0;
+
+linearNormalCoeffs
+{
+    thickness       0.05;
+}
+
+// Do front and back need to be merged? Usually only makes sense for 360
+// degree wedges.
+mergeFaces false;   //true;
+
+// Merge small edges. Fraction of bounding box.
+mergeTol 0;
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/fvSchemes b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/fvSchemes
new file mode 100644
index 00000000000..08936ae7678
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/fvSchemes
@@ -0,0 +1,95 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+    default         steadyState;
+}
+
+gradSchemes
+{
+    default         Gauss linear;
+    grad(yPsi)      cellLimited Gauss linear 1.0;
+}
+
+divSchemes
+{
+    default         none;
+    div(phi,U)      bounded  Gauss limitedLinearV 1;
+    div(phi,k)      bounded Gauss upwind;
+    div(phi,epsilon) Gauss upwind;
+    div(phi,R)      Gauss upwind;
+    div(R)          Gauss linear;
+    div(phid,p)     Gauss limitedLinear 1;
+    div(phi,K)      Gauss limitedLinear 1;
+    div(phi,e)      Gauss limitedLinear 1;
+    div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear;
+    div(phi,omega)  bounded Gauss limitedLinear 1;
+    div((nuEff*dev2(T(grad(U)))))  Gauss linear;
+
+}
+
+laplacianSchemes
+{
+    default         Gauss linear limited corrected 0.5;
+    laplacian(diffusivity,cellDisplacement)  Gauss linear corrected;
+    laplacian(yPsi) Gauss linear corrected;
+}
+
+interpolationSchemes
+{
+    default         linear;
+}
+
+snGradSchemes
+{
+    default         corrected;
+}
+
+fluxRequired
+{
+    default         no;
+    pcorr           ;
+    p               ;
+    yPsi            ;
+}
+
+oversetInterpolation
+{
+    method          inverseDistance;    //trackingInverseDistance;
+
+    // The inverseDistance method uses a 'voxel' like search structure.
+    // Optionally specify the extent and number of divisions n.
+    // Note that it will allocate an array of nx*ny*nz. If not specified:
+    // - searchBox          : local mesh bounding box
+    // - searchBoxDivisions : root (2D) or cube-root(3D) of number of cells
+    searchBox           (-0.1 -0.5 0)(1.1 0.5 1);
+    searchBoxDivisions  (100 100 1);
+}
+
+oversetInterpolationRequired
+{
+    omega;
+    k;
+    nut;
+}
+
+wallDist
+{
+    method Poisson;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/fvSolution b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/fvSolution
new file mode 100644
index 00000000000..71cf71b4055
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/fvSolution
@@ -0,0 +1,90 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+    cellDisplacement
+    {
+        solver          PCG;
+        preconditioner  DIC;
+
+        tolerance       1e-06;
+        relTol          0;
+        maxIter         100;
+    }
+
+    p
+    {
+        solver          PBiCGStab;
+        preconditioner  DILU;
+        tolerance       1e-6;
+        relTol          0.01;
+    }
+
+    pcorr
+    {
+        $p;
+        solver          PCG;
+        preconditioner  DIC;
+    }
+
+    yPsi
+    {
+        solver          PBiCGStab;
+        preconditioner  DILU;
+        tolerance       1e-5;
+        relTol          0.0;
+    }
+
+    "(U|k|omega|epsilon)"
+    {
+        solver          smoothSolver;
+        smoother        symGaussSeidel;
+        tolerance       1e-6;
+        relTol          0.01;
+    }
+}
+
+SIMPLE
+{
+    nOuterCorrectors    1;
+    nCorrectors         2;
+    nNonOrthogonalCorrectors 0;
+
+    residualControl
+    {
+        p               2e-3;
+        U               2e-4;
+        "(k|epsilon|omega|f|v2)" 1e-4;
+    }
+}
+
+relaxationFactors
+{
+    fields
+    {
+        p               0.3;
+    }
+    equations
+    {
+        U               0.6;
+        k               0.7;
+        omega           0.7;
+        epsilon         0.7;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/postProcessingDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/postProcessingDict
new file mode 100644
index 00000000000..8fe6333aa05
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/postProcessingDict
@@ -0,0 +1,35 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      postProcessingDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+functions
+{
+    processorField1
+    {
+        // Type of functionObject
+        type            processorField;
+
+        // Where to load it from (if not already in solver)
+        libs            ("libfieldFunctionObjects.so");
+
+        // Function object enabled flag
+        enabled         true;
+
+        // When to output the average fields
+        writeControl    writeTime;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/setFieldsDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/setFieldsDict
new file mode 100644
index 00000000000..8efb92d6102
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/setFieldsDict
@@ -0,0 +1,48 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      setFieldsDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+defaultFieldValues
+(
+    volScalarFieldValue zoneID 123
+);
+
+regions
+(
+    // Set cell values
+    // (does zerogradient on boundaries)
+    cellToCell
+    {
+        set c0;
+
+        fieldValues
+        (
+            volScalarFieldValue zoneID 0
+        );
+    }
+
+    cellToCell
+    {
+        set c1;
+
+        fieldValues
+        (
+            volScalarFieldValue zoneID 1
+        );
+    }
+
+);
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/topoSetDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/topoSetDict
new file mode 100644
index 00000000000..92b72993854
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/topoSetDict
@@ -0,0 +1,48 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      topoSetDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+actions
+(
+    {
+        name    c0;
+        type    cellSet;
+        action  new;
+        source  regionsToCell;
+        sourceInfo
+        {
+            insidePoints ((0 -1 0.1));
+        }
+    }
+
+    {
+        name    c1;
+        type    cellSet;
+        action  new;
+        source  cellToCell;
+        sourceInfo
+        {
+            set c0;
+        }
+    }
+
+    {
+        name    c1;
+        type    cellSet;
+        action  invert;
+    }
+);
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/Allrun.pre b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/Allrun.pre
new file mode 100755
index 00000000000..75612046476
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/Allrun.pre
@@ -0,0 +1,10 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # Run from this directory
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+# Make 3D mesh in slab of cells.
+# Make 3D mesh in slab of cells.
+runApplication blockMesh
+runApplication snappyHexMesh -overwrite
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/constant/triSurface/wing_5degrees.obj b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/constant/triSurface/wing_5degrees.obj
new file mode 100644
index 00000000000..4be2aac5f2f
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/constant/triSurface/wing_5degrees.obj
@@ -0,0 +1,1054 @@
+# Wavefront OBJ file written 2010-05-13T09:12:43
+o wing_5degrees
+
+# points : 520
+# faces  : 520
+# zones  : 1
+#   0  WALL10  (nFaces: 520)
+
+# <points count="520">
+v 1.00488 -0.0890722 -0.5
+v 1.00488 -0.0890722 0.5
+v 0.999453 -0.0870827 0.5
+v 0.999453 -0.0870827 -0.5
+v 0.993747 -0.0849908 0.5
+v 0.993747 -0.0849908 -0.5
+v 0.98776 -0.0827959 0.5
+v 0.98776 -0.0827959 -0.5
+v 0.981475 -0.0804834 0.5
+v 0.981475 -0.0804834 -0.5
+v 0.974878 -0.0780483 0.5
+v 0.974878 -0.0780483 -0.5
+v 0.967936 -0.075535 0.5
+v 0.967936 -0.075535 -0.5
+v 0.960671 -0.0728297 0.5
+v 0.960671 -0.0728297 -0.5
+v 0.952986 -0.070149 0.5
+v 0.952986 -0.070149 -0.5
+v 0.944915 -0.067332 0.5
+v 0.944915 -0.067332 -0.5
+v 0.936442 -0.064377 0.5
+v 0.936442 -0.064377 -0.5
+v 0.927543 -0.0612777 0.5
+v 0.927543 -0.0612777 -0.5
+v 0.918171 -0.0581074 0.5
+v 0.918171 -0.0581074 -0.5
+v 0.908345 -0.0547308 0.5
+v 0.908345 -0.0547308 -0.5
+v 0.897978 -0.0513371 0.5
+v 0.897978 -0.0513371 -0.5
+v 0.887113 -0.0477115 0.5
+v 0.887113 -0.0477115 -0.5
+v 0.875671 -0.0440076 0.5
+v 0.875671 -0.0440076 -0.5
+v 0.863634 -0.0401898 0.5
+v 0.863634 -0.0401898 -0.5
+v 0.850988 -0.0362043 0.5
+v 0.850988 -0.0362043 -0.5
+v 0.837677 -0.0321259 0.5
+v 0.837677 -0.0321259 -0.5
+v 0.8237 -0.0278406 0.5
+v 0.8237 -0.0278406 -0.5
+v 0.808997 -0.0234314 0.5
+v 0.808997 -0.0234314 -0.5
+v 0.793536 -0.0188824 0.5
+v 0.793536 -0.0188824 -0.5
+v 0.777248 -0.0142896 0.5
+v 0.777248 -0.0142896 -0.5
+v 0.760144 -0.00947585 0.5
+v 0.760144 -0.00947585 -0.5
+v 0.742148 -0.0045544 0.5
+v 0.742148 -0.0045544 -0.5
+v 0.723207 0.000449948 0.5
+v 0.723207 0.000449948 -0.5
+v 0.703296 0.00561154 0.5
+v 0.703296 0.00561154 -0.5
+v 0.682345 0.010854 0.5
+v 0.682345 0.010854 -0.5
+v 0.660295 0.0161554 0.5
+v 0.660295 0.0161554 -0.5
+v 0.637103 0.0215548 0.5
+v 0.637103 0.0215548 -0.5
+v 0.606829 0.0282606 0.5
+v 0.606829 0.0282606 -0.5
+v 0.578018 0.0343978 0.5
+v 0.578018 0.0343978 -0.5
+v 0.550557 0.0397874 0.5
+v 0.550557 0.0397874 -0.5
+v 0.524436 0.0447356 0.5
+v 0.524436 0.0447356 -0.5
+v 0.499549 0.0490421 0.5
+v 0.499549 0.0490421 -0.5
+v 0.475869 0.05291 0.5
+v 0.475869 0.05291 -0.5
+v 0.45334 0.0563729 0.5
+v 0.45334 0.0563729 -0.5
+v 0.431911 0.059484 0.5
+v 0.431911 0.059484 -0.5
+v 0.411518 0.0621876 0.5
+v 0.411518 0.0621876 -0.5
+v 0.392118 0.0645445 0.5
+v 0.392118 0.0645445 -0.5
+v 0.373644 0.0664046 0.5
+v 0.373644 0.0664046 -0.5
+v 0.356081 0.0680196 0.5
+v 0.356081 0.0680196 -0.5
+v 0.339375 0.0692961 0.5
+v 0.339375 0.0692961 -0.5
+v 0.323487 0.0702815 0.5
+v 0.323487 0.0702815 -0.5
+v 0.308383 0.0710035 0.5
+v 0.308383 0.0710035 -0.5
+v 0.294024 0.0714698 0.5
+v 0.294024 0.0714698 -0.5
+v 0.28038 0.0717809 0.5
+v 0.28038 0.0717809 -0.5
+v 0.267416 0.0719191 0.5
+v 0.267416 0.0719191 -0.5
+v 0.255099 0.0718222 0.5
+v 0.255099 0.0718222 -0.5
+v 0.243399 0.0716511 0.5
+v 0.243399 0.0716511 -0.5
+v 0.232288 0.0713208 0.5
+v 0.232288 0.0713208 -0.5
+v 0.221735 0.0709249 0.5
+v 0.221735 0.0709249 -0.5
+v 0.211715 0.0704338 0.5
+v 0.211715 0.0704338 -0.5
+v 0.202202 0.0698513 0.5
+v 0.202202 0.0698513 -0.5
+v 0.19317 0.0692271 0.5
+v 0.19317 0.0692271 -0.5
+v 0.184599 0.0685108 0.5
+v 0.184599 0.0685108 -0.5
+v 0.176464 0.0677409 0.5
+v 0.176464 0.0677409 -0.5
+v 0.168741 0.0669472 0.5
+v 0.168741 0.0669472 -0.5
+v 0.161418 0.0660755 0.5
+v 0.161418 0.0660755 -0.5
+v 0.154469 0.0651852 0.5
+v 0.154469 0.0651852 -0.5
+v 0.145493 0.0640314 0.5
+v 0.145493 0.0640314 -0.5
+v 0.136995 0.0627463 0.5
+v 0.136995 0.0627463 -0.5
+v 0.128932 0.0614383 0.5
+v 0.128932 0.0614383 -0.5
+v 0.121282 0.0601525 0.5
+v 0.121282 0.0601525 -0.5
+v 0.114049 0.0587416 0.5
+v 0.114049 0.0587416 -0.5
+v 0.107186 0.0573482 0.5
+v 0.107186 0.0573482 -0.5
+v 0.100675 0.0559871 0.5
+v 0.100675 0.0559871 -0.5
+v 0.0945147 0.0545794 0.5
+v 0.0945147 0.0545794 -0.5
+v 0.0886858 0.0531426 0.5
+v 0.0886858 0.0531426 -0.5
+v 0.0831659 0.0517083 0.5
+v 0.0831659 0.0517083 -0.5
+v 0.0779342 0.0503006 0.5
+v 0.0779342 0.0503006 -0.5
+v 0.072975 0.0489224 0.5
+v 0.072975 0.0489224 -0.5
+v 0.0682798 0.0475559 0.5
+v 0.0682798 0.0475559 -0.5
+v 0.0638499 0.0461601 0.5
+v 0.0638499 0.0461601 -0.5
+v 0.0596656 0.0447577 0.5
+v 0.0596656 0.0447577 -0.5
+v 0.055694 0.0434126 0.5
+v 0.055694 0.0434126 -0.5
+v 0.0519364 0.0420932 0.5
+v 0.0519364 0.0420932 -0.5
+v 0.0484053 0.0407363 0.5
+v 0.0484053 0.0407363 -0.5
+v 0.0450779 0.0393756 0.5
+v 0.0450779 0.0393756 -0.5
+v 0.0419215 0.0380722 0.5
+v 0.0419215 0.0380722 -0.5
+v 0.0389288 0.0368211 0.5
+v 0.0389288 0.0368211 -0.5
+v 0.036102 0.0355928 0.5
+v 0.036102 0.0355928 -0.5
+v 0.0334425 0.034368 0.5
+v 0.0334425 0.034368 -0.5
+v 0.0309496 0.0331356 0.5
+v 0.0309496 0.0331356 -0.5
+v 0.0286117 0.0319047 0.5
+v 0.0286117 0.0319047 -0.5
+v 0.0264077 0.0307022 0.5
+v 0.0264077 0.0307022 -0.5
+v 0.0243248 0.02954 0.5
+v 0.0243248 0.02954 -0.5
+v 0.0223665 0.0284014 0.5
+v 0.0223665 0.0284014 -0.5
+v 0.0205353 0.0272716 0.5
+v 0.0205353 0.0272716 -0.5
+v 0.0188204 0.0261581 0.5
+v 0.0188204 0.0261581 -0.5
+v 0.0172057 0.0250781 0.5
+v 0.0172057 0.0250781 -0.5
+v 0.015681 0.0240389 0.5
+v 0.015681 0.0240389 -0.5
+v 0.0142472 0.0230307 0.5
+v 0.0142472 0.0230307 -0.5
+v 0.0129051 0.0220434 0.5
+v 0.0129051 0.0220434 -0.5
+v 0.0116567 0.0210699 0.5
+v 0.0116567 0.0210699 -0.5
+v 0.0105044 0.0201047 0.5
+v 0.0105044 0.0201047 -0.5
+v 0.00944864 0.0191444 0.5
+v 0.00944864 0.0191444 -0.5
+v 0.00847997 0.0181956 0.5
+v 0.00847997 0.0181956 -0.5
+v 0.00758214 0.0172702 0.5
+v 0.00758214 0.0172702 -0.5
+v 0.00674204 0.0163779 0.5
+v 0.00674204 0.0163779 -0.5
+v 0.00595671 0.0155186 0.5
+v 0.00595671 0.0155186 -0.5
+v 0.00523198 0.0146848 0.5
+v 0.00523198 0.0146848 -0.5
+v 0.00457157 0.0138701 0.5
+v 0.00457157 0.0138701 -0.5
+v 0.00397503 0.0130721 0.5
+v 0.00397503 0.0130721 -0.5
+v 0.00343506 0.0122936 0.5
+v 0.00343506 0.0122936 -0.5
+v 0.0029443 0.0115379 0.5
+v 0.0029443 0.0115379 -0.5
+v 0.0024965 0.010807 0.5
+v 0.0024965 0.010807 -0.5
+v 0.00209053 0.0101012 0.5
+v 0.00209053 0.0101012 -0.5
+v 0.00172938 0.00941821 0.5
+v 0.00172938 0.00941821 -0.5
+v 0.00141481 0.00875662 0.5
+v 0.00141481 0.00875662 -0.5
+v 0.00114703 0.00811509 0.5
+v 0.00114703 0.00811509 -0.5
+v 0.000922634 0.00749375 0.5
+v 0.000922634 0.00749375 -0.5
+v 0.00073432 0.00689421 0.5
+v 0.00073432 0.00689421 -0.5
+v 0.000575606 0.00631745 0.5
+v 0.000575606 0.00631745 -0.5
+v 0.000441178 0.00576428 0.5
+v 0.000441178 0.00576428 -0.5
+v 0.000326628 0.00523494 0.5
+v 0.000326628 0.00523494 -0.5
+v 0.000229331 0.00472926 0.5
+v 0.000229331 0.00472926 -0.5
+v 0.000147968 0.00424663 0.5
+v 0.000147968 0.00424663 -0.5
+v 8.13071e-05 0.00378656 0.5
+v 8.13071e-05 0.00378656 -0.5
+v 2.81186e-05 0.00334838 0.5
+v 2.81186e-05 0.00334838 -0.5
+v -1.28053e-05 0.00293132 0.5
+v -1.28053e-05 0.00293132 -0.5
+v -4.26138e-05 0.00253464 0.5
+v -4.26138e-05 0.00253464 -0.5
+v -6.24104e-05 0.00215753 0.5
+v -6.24104e-05 0.00215753 -0.5
+v -7.32354e-05 0.00179922 0.5
+v -7.32354e-05 0.00179922 -0.5
+v -7.6066e-05 0.00145891 0.5
+v -7.6066e-05 0.00145891 -0.5
+v -7.18149e-05 0.00113574 0.5
+v -7.18149e-05 0.00113574 -0.5
+v -6.13265e-05 0.000828962 0.5
+v -6.13265e-05 0.000828962 -0.5
+v -4.5388e-05 0.000537894 0.5
+v -4.5388e-05 0.000537894 -0.5
+v -2.47174e-05 0.000261729 0.5
+v -2.47174e-05 0.000261729 -0.5
+v 0.999428 -0.0886333 -0.5
+v 0.999428 -0.0886333 0.5
+v 0 0 0.5
+v 0 0 -0.5
+v 3.07731e-05 -0.000269468 0.5
+v 3.07731e-05 -0.000269468 -0.5
+v 6.87839e-05 -0.000551758 0.5
+v 6.87839e-05 -0.000551758 -0.5
+v 0.00011487 -0.000847395 0.5
+v 0.00011487 -0.000847395 -0.5
+v 0.000169958 -0.00115699 0.5
+v 0.000169958 -0.00115699 -0.5
+v 0.000235006 -0.00148084 0.5
+v 0.000235006 -0.00148084 -0.5
+v 0.000311085 -0.00181947 0.5
+v 0.000311085 -0.00181947 -0.5
+v 0.000399343 -0.00217329 0.5
+v 0.000399343 -0.00217329 -0.5
+v 0.000501006 -0.00254265 0.5
+v 0.000501006 -0.00254265 -0.5
+v 0.000617405 -0.00292793 0.5
+v 0.000617405 -0.00292793 -0.5
+v 0.000749918 -0.00332928 0.5
+v 0.000749918 -0.00332928 -0.5
+v 0.000900098 -0.00374706 0.5
+v 0.000900098 -0.00374706 -0.5
+v 0.00106951 -0.00418123 0.5
+v 0.00106951 -0.00418123 -0.5
+v 0.00125981 -0.00463173 0.5
+v 0.00125981 -0.00463173 -0.5
+v 0.00147278 -0.00509836 0.5
+v 0.00147278 -0.00509836 -0.5
+v 0.00171023 -0.00558073 0.5
+v 0.00171023 -0.00558073 -0.5
+v 0.0019741 -0.00607866 0.5
+v 0.0019741 -0.00607866 -0.5
+v 0.00226657 -0.00659235 0.5
+v 0.00226657 -0.00659235 -0.5
+v 0.00258985 -0.00712192 0.5
+v 0.00258985 -0.00712192 -0.5
+v 0.00294625 -0.00766749 0.5
+v 0.00294625 -0.00766749 -0.5
+v 0.0033381 -0.00822888 0.5
+v 0.0033381 -0.00822888 -0.5
+v 0.00376858 -0.00880495 0.5
+v 0.00376858 -0.00880495 -0.5
+v 0.00424144 -0.00939356 0.5
+v 0.00424144 -0.00939356 -0.5
+v 0.0047608 -0.00999197 0.5
+v 0.0047608 -0.00999197 -0.5
+v 0.00533108 -0.0105969 0.5
+v 0.00533108 -0.0105969 -0.5
+v 0.00595465 -0.0112076 0.5
+v 0.00595465 -0.0112076 -0.5
+v 0.00663108 -0.0118268 0.5
+v 0.00663108 -0.0118268 -0.5
+v 0.00735864 -0.0124589 0.5
+v 0.00735864 -0.0124589 -0.5
+v 0.00813479 -0.0131082 0.5
+v 0.00813479 -0.0131082 -0.5
+v 0.00896315 -0.0137726 0.5
+v 0.00896315 -0.0137726 -0.5
+v 0.00985143 -0.0144449 0.5
+v 0.00985143 -0.0144449 -0.5
+v 0.0108089 -0.0151156 0.5
+v 0.0108089 -0.0151156 -0.5
+v 0.0118417 -0.0157801 0.5
+v 0.0118417 -0.0157801 -0.5
+v 0.0129485 -0.0164439 0.5
+v 0.0129485 -0.0164439 -0.5
+v 0.0141258 -0.0171158 0.5
+v 0.0141258 -0.0171158 -0.5
+v 0.0153717 -0.0178024 0.5
+v 0.0153717 -0.0178024 -0.5
+v 0.0166914 -0.0185005 0.5
+v 0.0166914 -0.0185005 -0.5
+v 0.0180921 -0.0192037 0.5
+v 0.0180921 -0.0192037 -0.5
+v 0.01958 -0.019908 0.5
+v 0.01958 -0.019908 -0.5
+v 0.0211576 -0.0206151 0.5
+v 0.0211576 -0.0206151 -0.5
+v 0.0228265 -0.0213288 0.5
+v 0.0228265 -0.0213288 -0.5
+v 0.0245895 -0.0220523 0.5
+v 0.0245895 -0.0220523 -0.5
+v 0.0264506 -0.0227868 0.5
+v 0.0264506 -0.0227868 -0.5
+v 0.028415 -0.0235332 0.5
+v 0.028415 -0.0235332 -0.5
+v 0.0304905 -0.0242814 0.5
+v 0.0304905 -0.0242814 -0.5
+v 0.0326872 -0.0250146 0.5
+v 0.0326872 -0.0250146 -0.5
+v 0.0350128 -0.0257258 0.5
+v 0.0350128 -0.0257258 -0.5
+v 0.0374672 -0.0264333 0.5
+v 0.0374672 -0.0264333 -0.5
+v 0.0400497 -0.0271566 0.5
+v 0.0400497 -0.0271566 -0.5
+v 0.0427704 -0.0278802 0.5
+v 0.0427704 -0.0278802 -0.5
+v 0.0456434 -0.0285739 0.5
+v 0.0456434 -0.0285739 -0.5
+v 0.0486731 -0.0292495 0.5
+v 0.0486731 -0.0292495 -0.5
+v 0.0518554 -0.0299566 0.5
+v 0.0518554 -0.0299566 -0.5
+v 0.0551966 -0.030697 0.5
+v 0.0551966 -0.030697 -0.5
+v 0.0587179 -0.0314085 0.5
+v 0.0587179 -0.0314085 -0.5
+v 0.062431 -0.032078 0.5
+v 0.062431 -0.032078 -0.5
+v 0.0663314 -0.0327743 0.5
+v 0.0663314 -0.0327743 -0.5
+v 0.0704248 -0.033514 0.5
+v 0.0704248 -0.033514 -0.5
+v 0.0747335 -0.0342256 0.5
+v 0.0747335 -0.0342256 -0.5
+v 0.0792714 -0.0348902 0.5
+v 0.0792714 -0.0348902 -0.5
+v 0.0840416 -0.0355492 0.5
+v 0.0840416 -0.0355492 -0.5
+v 0.089054 -0.0362103 0.5
+v 0.089054 -0.0362103 -0.5
+v 0.0943226 -0.0368627 0.5
+v 0.0943226 -0.0368627 -0.5
+v 0.0998603 -0.0375041 0.5
+v 0.0998603 -0.0375041 -0.5
+v 0.105679 -0.0381355 0.5
+v 0.105679 -0.0381355 -0.5
+v 0.111793 -0.0387575 0.5
+v 0.111793 -0.0387575 -0.5
+v 0.118218 -0.0393567 0.5
+v 0.118218 -0.0393567 -0.5
+v 0.124968 -0.0399429 0.5
+v 0.124968 -0.0399429 -0.5
+v 0.132055 -0.0405782 0.5
+v 0.132055 -0.0405782 -0.5
+v 0.1395 -0.0411771 0.5
+v 0.1395 -0.0411771 -0.5
+v 0.147326 -0.041699 0.5
+v 0.147326 -0.041699 -0.5
+v 0.15451 -0.0421969 0.5
+v 0.15451 -0.0421969 -0.5
+v 0.162054 -0.042698 0.5
+v 0.162054 -0.042698 -0.5
+v 0.16998 -0.0431596 0.5
+v 0.16998 -0.0431596 -0.5
+v 0.178305 -0.0435984 0.5
+v 0.178305 -0.0435984 -0.5
+v 0.187045 -0.0440696 0.5
+v 0.187045 -0.0440696 -0.5
+v 0.196223 -0.0445349 0.5
+v 0.196223 -0.0445349 -0.5
+v 0.205864 -0.0449725 0.5
+v 0.205864 -0.0449725 -0.5
+v 0.215985 -0.045448 0.5
+v 0.215985 -0.045448 -0.5
+v 0.226615 -0.0458797 0.5
+v 0.226615 -0.0458797 -0.5
+v 0.237778 -0.0463184 0.5
+v 0.237778 -0.0463184 -0.5
+v 0.249497 -0.0468156 0.5
+v 0.249497 -0.0468156 -0.5
+v 0.261804 -0.0472732 0.5
+v 0.261804 -0.0472732 -0.5
+v 0.274727 -0.0477637 0.5
+v 0.274727 -0.0477637 -0.5
+v 0.288294 -0.0483182 0.5
+v 0.288294 -0.0483182 -0.5
+v 0.302542 -0.0488257 0.5
+v 0.302542 -0.0488257 -0.5
+v 0.317502 -0.0493844 0.5
+v 0.317502 -0.0493844 -0.5
+v 0.33321 -0.0499788 0.5
+v 0.33321 -0.0499788 -0.5
+v 0.349702 -0.0506056 0.5
+v 0.349702 -0.0506056 -0.5
+v 0.367015 -0.0513872 0.5
+v 0.367015 -0.0513872 -0.5
+v 0.385192 -0.0522281 0.5
+v 0.385192 -0.0522281 -0.5
+v 0.404277 -0.0531254 0.5
+v 0.404277 -0.0531254 -0.5
+v 0.424316 -0.0540817 0.5
+v 0.424316 -0.0540817 -0.5
+v 0.445357 -0.0550979 0.5
+v 0.445357 -0.0550979 -0.5
+v 0.467451 -0.0560874 0.5
+v 0.467451 -0.0560874 -0.5
+v 0.490649 -0.0571824 0.5
+v 0.490649 -0.0571824 -0.5
+v 0.51501 -0.0582757 0.5
+v 0.51501 -0.0582757 -0.5
+v 0.540585 -0.0594903 0.5
+v 0.540585 -0.0594903 -0.5
+v 0.567439 -0.0607815 0.5
+v 0.567439 -0.0607815 -0.5
+v 0.595635 -0.0621304 0.5
+v 0.595635 -0.0621304 -0.5
+v 0.625242 -0.0635352 0.5
+v 0.625242 -0.0635352 -0.5
+v 0.649433 -0.0648334 0.5
+v 0.649433 -0.0648334 -0.5
+v 0.672415 -0.0660494 0.5
+v 0.672415 -0.0660494 -0.5
+v 0.694245 -0.0672674 0.5
+v 0.694245 -0.0672674 -0.5
+v 0.714979 -0.0684936 0.5
+v 0.714979 -0.0684936 -0.5
+v 0.734678 -0.0696472 0.5
+v 0.734678 -0.0696472 -0.5
+v 0.753392 -0.070724 0.5
+v 0.753392 -0.070724 -0.5
+v 0.771162 -0.0718742 0.5
+v 0.771162 -0.0718742 -0.5
+v 0.788046 -0.0729552 0.5
+v 0.788046 -0.0729552 -0.5
+v 0.804086 -0.0739668 0.5
+v 0.804086 -0.0739668 -0.5
+v 0.819316 -0.0750462 0.5
+v 0.819316 -0.0750462 -0.5
+v 0.833785 -0.076061 0.5
+v 0.833785 -0.076061 -0.5
+v 0.847532 -0.0770175 0.5
+v 0.847532 -0.0770175 -0.5
+v 0.86059 -0.0779215 0.5
+v 0.86059 -0.0779215 -0.5
+v 0.872998 -0.0787716 0.5
+v 0.872998 -0.0787716 -0.5
+v 0.884776 -0.079698 0.5
+v 0.884776 -0.079698 -0.5
+v 0.89597 -0.0805061 0.5
+v 0.89597 -0.0805061 -0.5
+v 0.906605 -0.0812554 0.5
+v 0.906605 -0.0812554 -0.5
+v 0.916704 -0.0820352 0.5
+v 0.916704 -0.0820352 -0.5
+v 0.926301 -0.0827494 0.5
+v 0.926301 -0.0827494 -0.5
+v 0.935409 -0.0835384 0.5
+v 0.935409 -0.0835384 -0.5
+v 0.944071 -0.0841575 0.5
+v 0.944071 -0.0841575 -0.5
+v 0.952294 -0.0848264 0.5
+v 0.952294 -0.0848264 -0.5
+v 0.960109 -0.0854166 0.5
+v 0.960109 -0.0854166 -0.5
+v 0.967527 -0.0860602 0.5
+v 0.967527 -0.0860602 -0.5
+v 0.97458 -0.0865997 0.5
+v 0.97458 -0.0865997 -0.5
+v 0.981277 -0.0871547 0.5
+v 0.981277 -0.0871547 -0.5
+v 0.987637 -0.0876912 0.5
+v 0.987637 -0.0876912 -0.5
+v 0.993684 -0.0881407 0.5
+v 0.993684 -0.0881407 -0.5
+# </points>
+
+# <faces count="520">
+g WALL10
+f 1 2 3
+f 3 4 1
+f 4 3 5
+f 5 6 4
+f 6 5 7
+f 7 8 6
+f 8 7 9
+f 9 10 8
+f 10 9 11
+f 11 12 10
+f 12 11 13
+f 13 14 12
+f 14 13 15
+f 15 16 14
+f 16 15 17
+f 17 18 16
+f 18 17 19
+f 19 20 18
+f 20 19 21
+f 21 22 20
+f 22 21 23
+f 23 24 22
+f 24 23 25
+f 25 26 24
+f 26 25 27
+f 27 28 26
+f 28 27 29
+f 29 30 28
+f 30 29 31
+f 31 32 30
+f 32 31 33
+f 33 34 32
+f 34 33 35
+f 35 36 34
+f 36 35 37
+f 37 38 36
+f 38 37 39
+f 39 40 38
+f 40 39 41
+f 41 42 40
+f 42 41 43
+f 43 44 42
+f 44 43 45
+f 45 46 44
+f 46 45 47
+f 47 48 46
+f 48 47 49
+f 49 50 48
+f 50 49 51
+f 51 52 50
+f 52 51 53
+f 53 54 52
+f 54 53 55
+f 55 56 54
+f 56 55 57
+f 57 58 56
+f 58 57 59
+f 59 60 58
+f 60 59 61
+f 61 62 60
+f 62 61 63
+f 63 64 62
+f 64 63 65
+f 65 66 64
+f 66 65 67
+f 67 68 66
+f 68 67 69
+f 69 70 68
+f 70 69 71
+f 71 72 70
+f 72 71 73
+f 73 74 72
+f 74 73 75
+f 75 76 74
+f 76 75 77
+f 77 78 76
+f 78 77 79
+f 79 80 78
+f 80 79 81
+f 81 82 80
+f 82 81 83
+f 83 84 82
+f 84 83 85
+f 85 86 84
+f 86 85 87
+f 87 88 86
+f 88 87 89
+f 89 90 88
+f 90 89 91
+f 91 92 90
+f 92 91 93
+f 93 94 92
+f 94 93 95
+f 95 96 94
+f 96 95 97
+f 97 98 96
+f 98 97 99
+f 99 100 98
+f 100 99 101
+f 101 102 100
+f 102 101 103
+f 103 104 102
+f 104 103 105
+f 105 106 104
+f 106 105 107
+f 107 108 106
+f 108 107 109
+f 109 110 108
+f 110 109 111
+f 111 112 110
+f 112 111 113
+f 113 114 112
+f 114 113 115
+f 115 116 114
+f 116 115 117
+f 117 118 116
+f 118 117 119
+f 119 120 118
+f 120 119 121
+f 121 122 120
+f 122 121 123
+f 123 124 122
+f 124 123 125
+f 125 126 124
+f 126 125 127
+f 127 128 126
+f 128 127 129
+f 129 130 128
+f 130 129 131
+f 131 132 130
+f 132 131 133
+f 133 134 132
+f 134 133 135
+f 135 136 134
+f 136 135 137
+f 137 138 136
+f 138 137 139
+f 139 140 138
+f 140 139 141
+f 141 142 140
+f 142 141 143
+f 143 144 142
+f 144 143 145
+f 145 146 144
+f 146 145 147
+f 147 148 146
+f 148 147 149
+f 149 150 148
+f 150 149 151
+f 151 152 150
+f 152 151 153
+f 153 154 152
+f 154 153 155
+f 155 156 154
+f 156 155 157
+f 157 158 156
+f 158 157 159
+f 159 160 158
+f 160 159 161
+f 161 162 160
+f 162 161 163
+f 163 164 162
+f 164 163 165
+f 165 166 164
+f 166 165 167
+f 167 168 166
+f 168 167 169
+f 169 170 168
+f 170 169 171
+f 171 172 170
+f 172 171 173
+f 173 174 172
+f 174 173 175
+f 175 176 174
+f 176 175 177
+f 177 178 176
+f 178 177 179
+f 179 180 178
+f 180 179 181
+f 181 182 180
+f 182 181 183
+f 183 184 182
+f 184 183 185
+f 185 186 184
+f 186 185 187
+f 187 188 186
+f 188 187 189
+f 189 190 188
+f 190 189 191
+f 191 192 190
+f 192 191 193
+f 193 194 192
+f 194 193 195
+f 195 196 194
+f 196 195 197
+f 197 198 196
+f 198 197 199
+f 199 200 198
+f 200 199 201
+f 201 202 200
+f 202 201 203
+f 203 204 202
+f 204 203 205
+f 205 206 204
+f 206 205 207
+f 207 208 206
+f 208 207 209
+f 209 210 208
+f 210 209 211
+f 211 212 210
+f 212 211 213
+f 213 214 212
+f 214 213 215
+f 215 216 214
+f 216 215 217
+f 217 218 216
+f 218 217 219
+f 219 220 218
+f 220 219 221
+f 221 222 220
+f 222 221 223
+f 223 224 222
+f 224 223 225
+f 225 226 224
+f 226 225 227
+f 227 228 226
+f 228 227 229
+f 229 230 228
+f 230 229 231
+f 231 232 230
+f 232 231 233
+f 233 234 232
+f 234 233 235
+f 235 236 234
+f 236 235 237
+f 237 238 236
+f 238 237 239
+f 239 240 238
+f 240 239 241
+f 241 242 240
+f 242 241 243
+f 243 244 242
+f 244 243 245
+f 245 246 244
+f 246 245 247
+f 247 248 246
+f 248 247 249
+f 249 250 248
+f 250 249 251
+f 251 252 250
+f 252 251 253
+f 253 254 252
+f 254 253 255
+f 255 256 254
+f 256 255 257
+f 257 258 256
+f 258 257 259
+f 259 260 258
+f 261 262 2
+f 2 1 261
+f 260 259 263
+f 263 264 260
+f 264 263 265
+f 265 266 264
+f 266 265 267
+f 267 268 266
+f 268 267 269
+f 269 270 268
+f 270 269 271
+f 271 272 270
+f 272 271 273
+f 273 274 272
+f 274 273 275
+f 275 276 274
+f 276 275 277
+f 277 278 276
+f 278 277 279
+f 279 280 278
+f 280 279 281
+f 281 282 280
+f 282 281 283
+f 283 284 282
+f 284 283 285
+f 285 286 284
+f 286 285 287
+f 287 288 286
+f 288 287 289
+f 289 290 288
+f 290 289 291
+f 291 292 290
+f 292 291 293
+f 293 294 292
+f 294 293 295
+f 295 296 294
+f 296 295 297
+f 297 298 296
+f 298 297 299
+f 299 300 298
+f 300 299 301
+f 301 302 300
+f 302 301 303
+f 303 304 302
+f 304 303 305
+f 305 306 304
+f 306 305 307
+f 307 308 306
+f 308 307 309
+f 309 310 308
+f 310 309 311
+f 311 312 310
+f 312 311 313
+f 313 314 312
+f 314 313 315
+f 315 316 314
+f 316 315 317
+f 317 318 316
+f 318 317 319
+f 319 320 318
+f 320 319 321
+f 321 322 320
+f 322 321 323
+f 323 324 322
+f 324 323 325
+f 325 326 324
+f 326 325 327
+f 327 328 326
+f 328 327 329
+f 329 330 328
+f 330 329 331
+f 331 332 330
+f 332 331 333
+f 333 334 332
+f 334 333 335
+f 335 336 334
+f 336 335 337
+f 337 338 336
+f 338 337 339
+f 339 340 338
+f 340 339 341
+f 341 342 340
+f 342 341 343
+f 343 344 342
+f 344 343 345
+f 345 346 344
+f 346 345 347
+f 347 348 346
+f 348 347 349
+f 349 350 348
+f 350 349 351
+f 351 352 350
+f 352 351 353
+f 353 354 352
+f 354 353 355
+f 355 356 354
+f 356 355 357
+f 357 358 356
+f 358 357 359
+f 359 360 358
+f 360 359 361
+f 361 362 360
+f 362 361 363
+f 363 364 362
+f 364 363 365
+f 365 366 364
+f 366 365 367
+f 367 368 366
+f 368 367 369
+f 369 370 368
+f 370 369 371
+f 371 372 370
+f 372 371 373
+f 373 374 372
+f 374 373 375
+f 375 376 374
+f 376 375 377
+f 377 378 376
+f 378 377 379
+f 379 380 378
+f 380 379 381
+f 381 382 380
+f 382 381 383
+f 383 384 382
+f 384 383 385
+f 385 386 384
+f 386 385 387
+f 387 388 386
+f 388 387 389
+f 389 390 388
+f 390 389 391
+f 391 392 390
+f 392 391 393
+f 393 394 392
+f 394 393 395
+f 395 396 394
+f 396 395 397
+f 397 398 396
+f 398 397 399
+f 399 400 398
+f 400 399 401
+f 401 402 400
+f 402 401 403
+f 403 404 402
+f 404 403 405
+f 405 406 404
+f 406 405 407
+f 407 408 406
+f 408 407 409
+f 409 410 408
+f 410 409 411
+f 411 412 410
+f 412 411 413
+f 413 414 412
+f 414 413 415
+f 415 416 414
+f 416 415 417
+f 417 418 416
+f 418 417 419
+f 419 420 418
+f 420 419 421
+f 421 422 420
+f 422 421 423
+f 423 424 422
+f 424 423 425
+f 425 426 424
+f 426 425 427
+f 427 428 426
+f 428 427 429
+f 429 430 428
+f 430 429 431
+f 431 432 430
+f 432 431 433
+f 433 434 432
+f 434 433 435
+f 435 436 434
+f 436 435 437
+f 437 438 436
+f 438 437 439
+f 439 440 438
+f 440 439 441
+f 441 442 440
+f 442 441 443
+f 443 444 442
+f 444 443 445
+f 445 446 444
+f 446 445 447
+f 447 448 446
+f 448 447 449
+f 449 450 448
+f 450 449 451
+f 451 452 450
+f 452 451 453
+f 453 454 452
+f 454 453 455
+f 455 456 454
+f 456 455 457
+f 457 458 456
+f 458 457 459
+f 459 460 458
+f 460 459 461
+f 461 462 460
+f 462 461 463
+f 463 464 462
+f 464 463 465
+f 465 466 464
+f 466 465 467
+f 467 468 466
+f 468 467 469
+f 469 470 468
+f 470 469 471
+f 471 472 470
+f 472 471 473
+f 473 474 472
+f 474 473 475
+f 475 476 474
+f 476 475 477
+f 477 478 476
+f 478 477 479
+f 479 480 478
+f 480 479 481
+f 481 482 480
+f 482 481 483
+f 483 484 482
+f 484 483 485
+f 485 486 484
+f 486 485 487
+f 487 488 486
+f 488 487 489
+f 489 490 488
+f 490 489 491
+f 491 492 490
+f 492 491 493
+f 493 494 492
+f 494 493 495
+f 495 496 494
+f 496 495 497
+f 497 498 496
+f 498 497 499
+f 499 500 498
+f 500 499 501
+f 501 502 500
+f 502 501 503
+f 503 504 502
+f 504 503 505
+f 505 506 504
+f 506 505 507
+f 507 508 506
+f 508 507 509
+f 509 510 508
+f 510 509 511
+f 511 512 510
+f 512 511 513
+f 513 514 512
+f 514 513 515
+f 515 516 514
+f 516 515 517
+f 517 518 516
+f 518 517 519
+f 519 520 518
+f 520 519 262
+f 262 261 520
+# </faces>
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/blockMeshDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/blockMeshDict
new file mode 100644
index 00000000000..5151eb3c5f6
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/blockMeshDict
@@ -0,0 +1,93 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+convertToMeters 1;
+
+vertices
+(
+    (-1.2 -2.2 -0.1)
+    ( 5   -2.2 -0.1)
+    ( 5    2.2 -0.1)
+    (-1.2  2.2 -0.1)
+    (-1.2 -2.2  0.1)
+    ( 5   -2.2  0.1)
+    ( 5    2.2  0.1)
+    (-1.2  2.2  0.1)
+);
+
+blocks
+(
+    hex (0 1 2 3 4 5 6 7) (36 24 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+    topAndBottom
+    {
+        type patch;
+        faces
+        (
+            (3 7 6 2)
+            (1 5 4 0)
+        );
+    }
+
+    inlet
+    {
+        type patch;
+        faces
+        (
+            (0 4 7 3)
+        );
+    }
+
+    outlet
+    {
+        type patch;
+        faces
+        (
+            (2 6 5 1)
+        );
+    }
+
+    symFront
+    {
+        type symmetryPlane;
+        faces
+        (
+            (4 5 6 7)
+        );
+    }
+
+    symBack
+    {
+        type symmetryPlane;
+        faces
+        (
+            (0 3 2 1)
+        );
+    }
+);
+
+mergePatchPairs
+(
+);
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/controlDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/controlDict
new file mode 100644
index 00000000000..28130318d74
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/controlDict
@@ -0,0 +1,49 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application     snappyHexMesh;
+
+startFrom       latestTime;
+
+startTime       0;
+
+stopAt          endTime;
+
+endTime         100;
+
+deltaT          1;
+
+writeControl    runTime;
+
+writeInterval   1;
+
+purgeWrite      0;
+
+writeFormat     binary;
+
+writePrecision  6;
+
+writeCompression off;
+
+timeFormat      general;
+
+timePrecision   6;
+
+runTimeModifiable true;
+
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/fvSchemes b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/fvSchemes
new file mode 100644
index 00000000000..52f9f1efc28
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/fvSchemes
@@ -0,0 +1,56 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+    default         Euler;
+}
+
+gradSchemes
+{
+    default         Gauss linear;
+}
+
+divSchemes
+{
+    default         none;
+    div(phi,U)      Gauss limitedLinearV 1;
+    div(phi,k)      Gauss upwind;
+    div(phi,epsilon) Gauss upwind;
+    div(phi,R)      Gauss upwind;
+    div(R)          Gauss linear;
+    div(phid,p)     Gauss limitedLinear 1;
+    div(phi,K)      Gauss limitedLinear 1;
+    div(phi,e)      Gauss limitedLinear 1;
+    div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+    default         Gauss linear limited corrected 0.5;
+}
+
+interpolationSchemes
+{
+    default         linear;
+}
+
+snGradSchemes
+{
+    default         corrected;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/fvSolution b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/fvSolution
new file mode 100644
index 00000000000..04a2dd4fdbe
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/fvSolution
@@ -0,0 +1,49 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+    p
+    {
+        solver          smoothSolver;
+        smoother        symGaussSeidel;
+        tolerance       1e-12;
+        relTol          0;
+    }
+
+    rho
+    {
+        solver          PCG;
+        preconditioner  DIC;
+        tolerance       1e-08;
+        relTol          0;
+    }
+
+    "(U|e|k|epsilon|R)"
+    {
+        $p;
+        tolerance       1e-08;
+        relTol          0;
+    }
+}
+
+PISO
+{
+    nCorrectors     2;
+    nNonOrthogonalCorrectors 2;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/snappyHexMeshDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/snappyHexMeshDict
new file mode 100644
index 00000000000..4f7f6b1a1b1
--- /dev/null
+++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/snappyHexMeshDict
@@ -0,0 +1,290 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      snappyHexMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+// Which of the steps to run
+castellatedMesh true;
+snap            true;
+addLayers       false;
+
+// Geometry. Definition of all surfaces. All surfaces are of class
+// searchableSurface.
+// Surfaces are used
+// - to specify refinement for any mesh cell intersecting it
+// - to specify refinement for any mesh cell inside/outside/near
+// - to 'snap' the mesh boundary to the surface
+geometry
+{
+
+    refinementBox
+    {
+        type    searchableBox;
+        min     (-5 -1 -1);
+        max     ( 5  1  1);
+    }
+};
+
+// Settings for the castellatedMesh generation.
+castellatedMeshControls
+{
+
+    // Refinement parameters
+    // ~~~~~~~~~~~~~~~~~~~~~
+
+    // If local number of cells is >= maxLocalCells on any processor
+    // switches from from refinement followed by balancing
+    // (current method) to (weighted) balancing before refinement.
+    maxLocalCells 100000;
+
+    // Overall cell limit (approximately). Refinement will stop immediately
+    // upon reaching this number so a refinement level might not complete.
+    // Note that this is the number of cells before removing the part which
+    // is not 'visible' from the keepPoint. The final number of cells might
+    // actually be a lot less.
+    maxGlobalCells 2000000;
+
+    // The surface refinement loop might spend lots of iterations refining just
+    // a few cells. This setting will cause refinement to stop if <=
+    // minimumRefine are selected for refinement. Note: it will at least do one
+    // iteration (unless the number of cells to refine is 0)
+    minRefinementCells 100;
+
+    // Number of buffer layers between different levels.
+    // 1 means normal 2:1 refinement restriction, larger means slower
+    // refinement.
+    nCellsBetweenLevels 6;
+
+    // Explicit feature edge refinement
+    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    // Specifies a level for any cell intersected by its edges.
+    // This is a featureEdgeMesh, read from constant/triSurface for now.
+    features ();
+
+    // Surface based refinement
+    // ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    // Specifies two levels for every surface. The first is the minimum level,
+    // every cell intersecting a surface gets refined up to the minimum level.
+    // The second level is the maximum level. Cells that 'see' multiple
+    // intersections where the intersections make an
+    // angle > resolveFeatureAngle get refined up to the maximum level.
+
+    refinementSurfaces
+    {
+    }
+
+    // Resolve sharp angles on fridges
+    resolveFeatureAngle 30;
+
+    // Region-wise refinement
+    // ~~~~~~~~~~~~~~~~~~~~~~
+
+    // Specifies refinement level for cells in relation to a surface. One of
+    // three modes
+    // - distance. 'levels' specifies per distance to the surface the
+    //   wanted refinement level. The distances need to be specified in
+    //   descending order.
+    // - inside. 'levels' is only one entry and only the level is used. All
+    //   cells inside the surface get refined up to the level. The surface
+    //   needs to be closed for this to be possible.
+    // - outside. Same but cells outside.
+
+    refinementRegions
+    {
+        refinementBox
+        {
+            mode inside;
+            levels ((1e15 1));
+        }
+    }
+
+    // Mesh selection
+    // ~~~~~~~~~~~~~~
+
+    // After refinement patches get added for all refinementSurfaces and
+    // all cells intersecting the surfaces get put into these patches. The
+    // section reachable from the locationInMesh is kept.
+    // NOTE: This point should never be on a face, always inside a cell, even
+    // after refinement.
+    locationInMesh (-0.5 0 0.0);
+
+    // Whether any faceZones (as specified in the refinementSurfaces)
+    // are only on the boundary of corresponding cellZones or also allow
+    // free-standing zone faces. Not used if there are no faceZones.
+    allowFreeStandingZoneFaces true;
+}
+
+// Settings for the snapping.
+snapControls
+{
+    //- Number of patch smoothing iterations before finding correspondence
+    //  to surface
+    nSmoothPatch 3;
+
+    //- Relative distance for points to be attracted by surface feature point
+    //  or edge. True distance is this factor times local
+    //  maximum edge length.
+    tolerance 4.0;
+
+    //- Number of mesh displacement relaxation iterations.
+    nSolveIter 30;
+
+    //- Maximum number of snapping relaxation iterations. Should stop
+    //  before upon reaching a correct mesh.
+    nRelaxIter 5;
+}
+
+// Settings for the layer addition.
+addLayersControls
+{
+    // Are the thickness parameters below relative to the undistorted
+    // size of the refined cell outside layer (true) or absolute sizes (false).
+    relativeSizes true;
+
+    // Per final patch (so not geometry!) the layer information
+    layers
+    {
+        wing
+        {
+            nSurfaceLayers 3;
+        }
+    }
+
+    // Expansion factor for layer mesh
+    expansionRatio 1.3;
+
+    // Wanted thickness of final added cell layer. If multiple layers
+    // is the thickness of the layer furthest away from the wall.
+    // Relative to undistorted size of cell outside layer.
+    // See relativeSizes parameter.
+    finalLayerThickness 0.7;
+
+    // Minimum thickness of cell layer. If for any reason layer
+    // cannot be above minThickness do not add layer.
+    // Relative to undistorted size of cell outside layer.
+    // See relativeSizes parameter.
+    minThickness 0.25;
+
+    // If points get not extruded do nGrow layers of connected faces that are
+    // also not grown. This helps convergence of the layer addition process
+    // close to features.
+    // Note: changed(corrected) w.r.t 17x! (didn't do anything in 17x)
+    nGrow 0;
+
+    // Advanced settings
+
+    // When not to extrude surface. 0 is flat surface, 90 is when two faces
+    // are perpendicular
+    featureAngle 60;
+
+    // Maximum number of snapping relaxation iterations. Should stop
+    // before upon reaching a correct mesh.
+    nRelaxIter 5;
+
+    // Number of smoothing iterations of surface normals
+    nSmoothSurfaceNormals 1;
+
+    // Number of smoothing iterations of interior mesh movement direction
+    nSmoothNormals 3;
+
+    // Smooth layer thickness over surface patches
+    nSmoothThickness 10;
+
+    // Stop layer growth on highly warped cells
+    maxFaceThicknessRatio 0.5;
+
+    // Reduce layer growth where ratio thickness to medial
+    // distance is large
+    maxThicknessToMedialRatio 0.3;
+
+    // Angle used to pick up medial axis points
+    // Note: changed(corrected) w.r.t 16x! 90 degrees corresponds to 130 in 16x.
+    minMedianAxisAngle 90;
+
+    // Create buffer region for new layer terminations
+    nBufferCellsNoExtrude 0;
+
+    // Overall max number of layer addition iterations. The mesher will exit
+    // if it reaches this number of iterations; possibly with an illegal
+    // mesh.
+    nLayerIter 50;
+}
+
+// Generic mesh quality settings. At any undoable phase these determine
+// where to undo.
+meshQualityControls
+{
+    //- Maximum non-orthogonality allowed. Set to 180 to disable.
+    maxNonOrtho 65;
+
+    //- Max skewness allowed. Set to <0 to disable.
+    maxBoundarySkewness 20;
+    maxInternalSkewness 4;
+
+    //- Max concaveness allowed. Is angle (in degrees) below which concavity
+    //  is allowed. 0 is straight face, <0 would be convex face.
+    //  Set to 180 to disable.
+    maxConcave 80;
+
+    //- Minimum pyramid volume. Is absolute volume of cell pyramid.
+    //  Set to a sensible fraction of the smallest cell volume expected.
+    //  Set to very negative number (e.g. -1E30) to disable.
+    minVol 1e-13;
+
+    //- Minimum quality of the tet formed by the face-centre
+    //  and variable base point minimum decomposition triangles and
+    //  the cell centre.  Set to very negative number (e.g. -1E30) to
+    //  disable.
+    //     <0 = inside out tet,
+    //      0 = flat tet
+    //      1 = regular tet
+    minTetQuality 1e-30;
+
+    //- Minimum face area. Set to <0 to disable.
+    minArea -1;
+
+    //- Minimum face twist. Set to <-1 to disable. dot product of face normal
+    //  and face centre triangles normal
+    minTwist 0.05;
+
+    //- Minimum normalised cell determinant
+    //  1 = hex, <= 0 = folded or flattened illegal cell
+    minDeterminant 0.001;
+
+    //- minFaceWeight (0 -> 0.5)
+    minFaceWeight 0.05;
+
+    //- minVolRatio (0 -> 1)
+    minVolRatio 0.01;
+
+    //must be >0 for Fluent compatibility
+    minTriangleTwist -1;
+
+    // Advanced
+
+    //- Number of error distribution iterations
+    nSmoothScale 4;
+    //- Amount to scale back displacement at error points
+    errorReduction 0.75;
+}
+
+// Advanced
+
+// Merge tolerance. Is fraction of overall bounding box of initial mesh.
+// Note: the write tolerance needs to be higher than this.
+mergeTolerance 1e-6;
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/Allclean b/tutorials/multiphase/overInterDyMFoam/floatingBody/Allclean
new file mode 100755
index 00000000000..e3c5c15e9c9
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/Allclean
@@ -0,0 +1,10 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # run from this directory
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+(cd background && ./Allclean)
+(cd floatingBody && ./Allclean)
+
+# ----------------------------------------------------------------- end-of-file
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/Allrun b/tutorials/multiphase/overInterDyMFoam/floatingBody/Allrun
new file mode 100755
index 00000000000..95ffcc4bf4c
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/Allrun
@@ -0,0 +1,10 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # run from this directory
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+./Allrun.pre
+(cd background && runApplication $(getApplication))
+
+# ----------------------------------------------------------------- end-of-file
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/Allrun.pre b/tutorials/multiphase/overInterDyMFoam/floatingBody/Allrun.pre
new file mode 100755
index 00000000000..a69774179d3
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/Allrun.pre
@@ -0,0 +1,8 @@
+#!/bin/sh
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+# mesh floating body
+(cd floatingBody && ./Allrun.pre)
+
+# Add background mesh
+(cd background  && ./Allrun.pre)
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/U b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/U
new file mode 100644
index 00000000000..a63b70f9b0f
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/U
@@ -0,0 +1,45 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volVectorField;
+    location    "0";
+    object      U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 1 -1 0 0 0 0];
+
+internalField   uniform (0 0 0);
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #includeEtc "caseDicts/setConstraintTypes"
+
+    stationaryWalls
+    {
+        type            fixedValue;
+        value           uniform (0 0 0);
+    }
+    atmosphere
+    {
+        type            pressureInletOutletVelocity;
+        value           uniform (0 0 0);
+    }
+    floatingObject
+    {
+        type            movingWallVelocity;
+        value           uniform (0 0 0);
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/alpha.water b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/alpha.water
new file mode 100644
index 00000000000..672fe184cef
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/alpha.water
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  overlap                               |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    location    "0";
+    object      alpha.water;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 0 0 0 0 0 0];
+
+internalField   uniform 0;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #includeEtc "caseDicts/setConstraintTypes"
+
+    stationaryWalls
+    {
+        type            zeroGradient;
+    }
+    atmosphere
+    {
+        type            inletOutlet;
+        inletValue      uniform 0;
+        value           uniform 0;
+    }
+    floatingObject
+    {
+        type            zeroGradient;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/epsilon b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/epsilon
new file mode 100644
index 00000000000..55bbd29c2f1
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/epsilon
@@ -0,0 +1,52 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    location    "0";
+    object      epsilon;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 2 -3 0 0 0 0];
+
+internalField   uniform 0.1;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #includeEtc "caseDicts/setConstraintTypes"
+
+    stationaryWalls
+    {
+        type            epsilonWallFunction;
+        Cmu             0.09;
+        kappa           0.41;
+        E               9.8;
+        value           uniform 0.1;
+    }
+    atmosphere
+    {
+        type            inletOutlet;
+        inletValue      uniform 0.1;
+        value           uniform 0.1;
+    }
+    floatingObject
+    {
+        type            epsilonWallFunction;
+        Cmu             0.09;
+        kappa           0.41;
+        E               9.8;
+        value           uniform 0.1;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/k b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/k
new file mode 100644
index 00000000000..b1a20190857
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/k
@@ -0,0 +1,46 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    location    "0";
+    object      k;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 2 -2 0 0 0 0];
+
+internalField   uniform 0.1;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #includeEtc "caseDicts/setConstraintTypes"
+
+    stationaryWalls
+    {
+        type            kqRWallFunction;
+        value           uniform 0.1;
+    }
+    atmosphere
+    {
+        type            inletOutlet;
+        inletValue      uniform 0.1;
+        value           uniform 0.1;
+    }
+    floatingObject
+    {
+        type            kqRWallFunction;
+        value           uniform 0.1;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/nut b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/nut
new file mode 100644
index 00000000000..282297cbd88
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/nut
@@ -0,0 +1,51 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    location    "0";
+    object      nut;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 2 -1 0 0 0 0];
+
+internalField   uniform 0;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #includeEtc "caseDicts/setConstraintTypes"
+
+    stationaryWalls
+    {
+        type            nutkWallFunction;
+        Cmu             0.09;
+        kappa           0.41;
+        E               9.8;
+        value           uniform 0;
+    }
+    atmosphere
+    {
+        type            calculated;
+        value           uniform 0;
+    }
+    floatingObject
+    {
+        type            nutkWallFunction;
+        Cmu             0.09;
+        kappa           0.41;
+        E               9.8;
+        value           uniform 0;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/p_rgh b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/p_rgh
new file mode 100644
index 00000000000..75ac340beaf
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/p_rgh
@@ -0,0 +1,53 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      p_rgh;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [1 -1 -2 0 0 0 0];
+
+internalField   uniform 0;
+
+boundaryField
+{
+    oversetPatch
+    {
+        type            overset;
+    }
+    stationaryWalls
+    {
+        type            fixedFluxPressure;
+    }
+    atmosphere
+    {
+        type            totalPressure;
+        p0              uniform 0;
+        U               U;
+        phi             phi;
+        rho             rho;
+        psi             none;
+        gamma           1;
+        value           uniform 0;
+    }
+    floatingObject
+    {
+        type            fixedFluxPressure;
+    }
+    overset
+    {
+        patchType       overset;
+        type            fixedFluxPressure;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/pointDisplacement b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/pointDisplacement
new file mode 100644
index 00000000000..d23a59c0e10
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/pointDisplacement
@@ -0,0 +1,54 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       pointVectorField;
+    object      pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 1 0 0 0 0 0];
+
+internalField   uniform (0 0 0);
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #includeEtc "caseDicts/setConstraintTypes"
+
+    stationaryWalls
+    {
+        type            fixedValue;
+        value           uniform (0 0 0);
+    }
+    atmosphere
+    {
+        type            fixedValue;
+        value           uniform (0 0 0);
+    }
+    floatingObject
+    {
+        type            calculated;
+        value           uniform (0 0 0);
+    }
+    oversetPatch
+    {
+        patchType       overset;
+        type            zeroGradient;
+    }
+    sides
+    {
+        patchType       overset;
+        type            zeroGradient;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/zoneID b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/zoneID
new file mode 100644
index 00000000000..384338071d3
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/zoneID
@@ -0,0 +1,42 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  overlap                               |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    location    "0";
+    object      zoneID;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 0 0 0 0 0 0];
+
+internalField   uniform 0;
+
+boundaryField
+{
+    //- Set patchGroups for constraint patches
+    #includeEtc "caseDicts/setConstraintTypes"
+
+    stationaryWalls
+    {
+        type            zeroGradient;
+    }
+    atmosphere
+    {
+        type            zeroGradient;
+    }
+    floatingObject
+    {
+        type            zeroGradient;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/Allclean b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/Allclean
new file mode 100755
index 00000000000..d16400a94f6
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/Allclean
@@ -0,0 +1,11 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # run from this directory
+
+# Source tutorial clean functions
+. $WM_PROJECT_DIR/bin/tools/CleanFunctions
+
+rm -rf 0 > /dev/null 2>&1
+
+cleanCase
+
+# ----------------------------------------------------------------- end-of-file
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/Allrun.pre b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/Allrun.pre
new file mode 100755
index 00000000000..78da51948ae
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/Allrun.pre
@@ -0,0 +1,17 @@
+#!/bin/sh
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+# Create background mesh
+runApplication blockMesh
+
+# Add the cylinder mesh
+runApplication mergeMeshes . ../floatingBody -overwrite
+
+# Select cellSets for the different zones
+runApplication topoSet
+
+# Copy standard fields
+rm -rf 0 && cp -r 0.org 0
+
+# Use cellSets to write zoneID
+runApplication setFields
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/background.foam b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/background.foam
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/dynamicMeshDict b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/dynamicMeshDict
new file mode 100644
index 00000000000..197de15a524
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/dynamicMeshDict
@@ -0,0 +1,104 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      motionProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+motionSolverLibs    ("libsixDoFRigidBodyMotion.so");
+
+
+dynamicFvMesh       dynamicOversetFvMesh;
+
+dynamicOversetFvMeshCoeffs
+{
+}
+
+solver          sixDoFRigidBodyMotion;
+
+sixDoFRigidBodyMotionCoeffs
+{
+
+    patches         (floatingObject);
+    innerDistance   100.0;
+    outerDistance   101.0;
+
+    centreOfMass    (0.5 0.5 0.3);
+
+    // Cuboid dimensions
+    Lx              0.24;
+    Ly              0.24;
+    Lz              0.4;
+
+    // Density of the solid
+    rhoSolid        700;
+
+    // Cuboid mass
+    mass            #calc "$rhoSolid*$Lx*$Ly*$Lz";
+
+    // Cuboid moment of inertia about the centre of mass
+    momentOfInertia #codeStream
+    {
+        codeInclude
+        #{
+            #include "diagTensor.H"
+        #};
+
+        code
+        #{
+            scalar sqrLx = sqr($Lx);
+            scalar sqrLy = sqr($Ly);
+            scalar sqrLz = sqr($Lz);
+            os  <<
+                $mass
+               *diagTensor(sqrLy + sqrLz, sqrLx + sqrLz, sqrLx + sqrLy)/12.0;
+        #};
+    };
+
+    report          on;
+    accelerationRelaxation 0.6;
+
+    solver
+    {
+        type Newmark;
+    }
+
+    constraints
+    {
+
+        /*
+        fixedPoint
+        {
+             sixDoFRigidBodyMotionConstraint point;
+             centreOfRotation (0.5 0.45 0.1);
+        }
+        */
+
+        fixedLine
+        {
+            sixDoFRigidBodyMotionConstraint line;
+            //centreOfRotation (0.5 0.45 0.1);
+            direction (0 0 1);
+        }
+
+        /*
+        fixedAxis
+        {
+            sixDoFRigidBodyMotionConstraint axis;
+            axis (0 1 0);
+        }
+        */
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/g b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/g
new file mode 100644
index 00000000000..897615a50df
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/g
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       uniformDimensionedVectorField;
+    location    "constant";
+    object      g;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 1 -2 0 0 0 0];
+value           ( 0 0 -9.81 );
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/transportProperties b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/transportProperties
new file mode 100644
index 00000000000..3729fc7648b
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/transportProperties
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "constant";
+    object      transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+phases (water air);
+
+water
+{
+    transportModel  Newtonian;
+    nu              nu [ 0 2 -1 0 0 0 0 ] 1e-06;
+    rho             rho [ 1 -3 0 0 0 0 0 ] 998.2;
+}
+
+air
+{
+    transportModel  Newtonian;
+    nu              nu [ 0 2 -1 0 0 0 0 ] 1.48e-05;
+    rho             rho [ 1 -3 0 0 0 0 0 ] 1;
+}
+
+sigma           sigma [ 1 0 -2 0 0 0 0 ] 0;
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/turbulenceProperties b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/turbulenceProperties
new file mode 100644
index 00000000000..cd2daf8229b
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/turbulenceProperties
@@ -0,0 +1,30 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "constant";
+    object      turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType  RAS;
+
+RAS
+{
+    RASModel        kEpsilon;
+
+    turbulence      on;
+
+    printCoeffs     on;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/blockMeshDict b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/blockMeshDict
new file mode 100644
index 00000000000..bff73562f4c
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/blockMeshDict
@@ -0,0 +1,76 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+convertToMeters 1;
+
+vertices
+(
+    (0 0 0)
+    (1 0 0)
+    (1 1 0)
+    (0 1 0)
+    (0 0 1)
+    (1 0 1)
+    (1 1 1)
+    (0 1 1)
+);
+
+blocks
+(
+    hex (0 1 2 3 4 5 6 7) (35 35 35) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+    // Dummy patch to trigger overset interpolation before any other
+    // bcs
+    oversetPatch
+    {
+        type overset;
+        faces ();
+    }
+
+    stationaryWalls
+    {
+        type wall;
+        faces
+        (
+            (0 3 2 1)
+            (2 6 5 1)
+            (1 5 4 0)
+            (3 7 6 2)
+            (0 4 7 3)
+        );
+    }
+    atmosphere
+    {
+        type patch;
+        faces
+        (
+            (4 5 6 7)
+        );
+    }
+);
+
+mergePatchPairs
+(
+);
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/controlDict b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/controlDict
new file mode 100644
index 00000000000..a21e0935f31
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/controlDict
@@ -0,0 +1,57 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+// Load the additional patches, patchFields etc.
+libs            ("liboverset.so");
+
+application     overInterDyMFoam ;
+
+startFrom       startTime;
+
+startTime       0.0;
+
+stopAt          endTime;
+
+endTime         4;
+
+deltaT          0.001;
+
+writeControl    adjustableRunTime;
+
+writeInterval   0.05;
+
+purgeWrite      0;
+
+writeFormat     ascii;
+
+writePrecision  12;
+
+writeCompression uncompressed;
+
+timeFormat      general;
+
+timePrecision   6;
+
+runTimeModifiable yes;
+
+adjustTimeStep  yes;
+
+maxCo           2.0;
+maxAlphaCo      2.0;
+maxDeltaT       1;
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/decomposeParDict b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/decomposeParDict
new file mode 100644
index 00000000000..ede2181dfee
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/decomposeParDict
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    note        "mesh decomposition control dictionary";
+    object      decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains  4;
+
+method          hierarchical;
+
+hierarchicalCoeffs
+{
+    n           (2 2 1);
+    delta       0.001;
+    order       xyz;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/fvSchemes b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/fvSchemes
new file mode 100644
index 00000000000..bc6574b81bc
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/fvSchemes
@@ -0,0 +1,70 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  2.3.0                                 |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+    default         Euler;
+}
+
+gradSchemes
+{
+    default         Gauss linear;
+}
+
+divSchemes
+{
+    div(rhoPhi,U)   Gauss limitedLinearV 1;
+    div(U)          Gauss linear;
+    div(phi,alpha)  Gauss vanLeer;
+    div(phirb,alpha) Gauss linear;
+    div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear;
+
+    div(phi,k)      Gauss upwind;
+    div(phi,epsilon) Gauss upwind;
+    div(phi,omega) Gauss upwind;
+}
+
+laplacianSchemes
+{
+    default         Gauss linear corrected;
+}
+
+interpolationSchemes
+{
+    default         linear;
+}
+
+snGradSchemes
+{
+    default         corrected;
+}
+
+oversetInterpolation
+{
+    method          inverseDistance;
+}
+
+fluxRequired
+{
+    default         no;
+    p_rgh;
+    pcorr;
+    alpha.water;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/fvSolution b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/fvSolution
new file mode 100644
index 00000000000..d786f239265
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/fvSolution
@@ -0,0 +1,110 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  2.3.0                                 |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+
+    "cellDisplacement.*"
+    {
+        solver          PCG;
+        preconditioner  DIC;
+
+        tolerance       1e-06;
+        relTol          0;
+        maxIter         100;
+    }
+
+    "alpha.water.*"
+    {
+        nAlphaCorr      2;
+        nAlphaSubCycles 1;
+        cAlpha          1;
+        icAlpha         0;
+
+
+        MULESCorr       yes;
+        nLimiterIter    5;
+        alphaApplyPrevCorr  no;
+
+        solver          smoothSolver;
+        smoother        symGaussSeidel;
+        tolerance       1e-8;
+        relTol          0;
+    }
+
+    "pcorr.*"
+    {
+        solver          PCG;
+        preconditioner  DIC;
+        tolerance       1e-9;
+        relTol          0;
+    }
+
+    p_rgh
+    {
+        solver          PBiCGStab;
+        preconditioner  DILU;
+        tolerance       1e-9;
+        relTol          0.01;
+    }
+
+    p_rghFinal
+    {
+        $p_rgh;
+        relTol          0;
+    }
+
+    "(U|k|omega|epsilon).*"
+    {
+        solver          smoothSolver;
+        smoother        symGaussSeidel;
+        tolerance       1e-08;
+        relTol          0;
+    }
+}
+
+PIMPLE
+{
+    momentumPredictor   no;
+    nOuterCorrectors    3;
+    nCorrectors         1;
+    nNonOrthogonalCorrectors 0;
+
+    ddtCorr         yes;
+    correctPhi      no;
+
+    moveMeshOuterCorrectors no;
+    turbOnFinalIterOnly no;
+}
+
+relaxationFactors
+{
+    fields
+    {
+    }
+    equations
+    {
+            ".*" 1;
+    }
+}
+
+cache
+{
+        grad(U);
+}
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/setFieldsDict b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/setFieldsDict
new file mode 100644
index 00000000000..0c2bb614d27
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/setFieldsDict
@@ -0,0 +1,64 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      setFieldsDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+defaultFieldValues
+(
+    volScalarFieldValue alpha.water 0
+    volScalarFieldValue zoneID 123
+);
+
+regions
+(
+    boxToCell
+    {
+        box ( -100 -100 -100 ) ( 100 100 0.5368 );
+        fieldValues ( volScalarFieldValue alpha.water 1 );
+    }
+
+    boxToCell
+    {
+        box ( 0.7 0.8 -100 ) ( 100 100 0.75 );
+        fieldValues ( volScalarFieldValue alpha.water 1 );
+    }
+    cellToCell
+    {
+        set c0;
+
+        fieldValues
+        (
+            volScalarFieldValue zoneID 0
+        );
+    }
+    cellToCell
+    {
+        set c1;
+
+        fieldValues
+        (
+            volScalarFieldValue zoneID 1
+        );
+    }
+
+);
+
+
+
+
+
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/topoSetDict b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/topoSetDict
new file mode 100644
index 00000000000..7b957344b89
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/topoSetDict
@@ -0,0 +1,48 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      topoSetDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+actions
+(
+    {
+        name    c0;
+        type    cellSet;
+        action  new;
+        source  regionToCell;
+        sourceInfo
+        {
+            insidePoints ((0.1 0.1 0.1));
+        }
+    }
+
+    {
+        name    c1;
+        type    cellSet;
+        action  new;
+        source  cellToCell;
+        sourceInfo
+        {
+            set c0;
+        }
+    }
+
+    {
+        name    c1;
+        type    cellSet;
+        action  invert;
+    }
+);
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/Allclean b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/Allclean
new file mode 100755
index 00000000000..d16400a94f6
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/Allclean
@@ -0,0 +1,11 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # run from this directory
+
+# Source tutorial clean functions
+. $WM_PROJECT_DIR/bin/tools/CleanFunctions
+
+rm -rf 0 > /dev/null 2>&1
+
+cleanCase
+
+# ----------------------------------------------------------------- end-of-file
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/Allrun.pre b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/Allrun.pre
new file mode 100755
index 00000000000..36d051548df
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/Allrun.pre
@@ -0,0 +1,14 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # run from this directory
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+# Set application name
+application=`getApplication`
+
+runApplication blockMesh
+runApplication topoSet
+runApplication subsetMesh -overwrite c0 -patch floatingObject
+
+# ----------------------------------------------------------------- end-of-file
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/blockMeshDict b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/blockMeshDict
new file mode 100644
index 00000000000..300835baa5e
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/blockMeshDict
@@ -0,0 +1,62 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+convertToMeters 1;
+
+vertices
+(
+    (0.3 0.3 0.1)
+    (0.7 0.3 0.1)
+    (0.7 0.7 0.1)
+    (0.3 0.7 0.1)
+    (0.3 0.3 0.8)
+    (0.7 0.3 0.8)
+    (0.7 0.7 0.8)
+    (0.3 0.7 0.8)
+);
+
+blocks
+(
+    hex (0 1 2 3 4 5 6 7) (20 20 30) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+    sides
+    {
+        type overset;
+        faces
+        (
+            (0 3 2 1)
+            (2 6 5 1)
+            (1 5 4 0)
+            (3 7 6 2)
+            (0 4 7 3)
+            (4 5 6 7)
+        );
+    }
+    floatingObject
+    {
+        type wall;
+        faces ();
+    }
+);
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/controlDict b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/controlDict
new file mode 100644
index 00000000000..6510d78a122
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/controlDict
@@ -0,0 +1,54 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application     interDyMFoam;
+
+startFrom       startTime;
+
+startTime       0;
+
+stopAt          endTime;
+
+endTime         6;
+
+deltaT          0.01;
+
+writeControl    adjustableRunTime;
+
+writeInterval   0.1;
+
+purgeWrite      0;
+
+writeFormat     ascii;
+
+writePrecision  12;
+
+writeCompression uncompressed;
+
+timeFormat      general;
+
+timePrecision   6;
+
+runTimeModifiable yes;
+
+adjustTimeStep  yes;
+
+maxCo           1;
+maxAlphaCo      1;
+maxDeltaT       1;
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/fvSchemes b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/fvSchemes
new file mode 100644
index 00000000000..88424a730cb
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/fvSchemes
@@ -0,0 +1,62 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+    default         Euler;
+}
+
+gradSchemes
+{
+    default         Gauss linear;
+}
+
+divSchemes
+{
+    div(rhoPhi,U)  Gauss vanLeerV;
+    div(phi,alpha)  Gauss vanLeer;
+    div(phirb,alpha) Gauss linear;
+    div(phi,k)      Gauss upwind;
+    div(phi,epsilon) Gauss upwind;
+    div((muEff*dev(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+    default         Gauss linear corrected;
+}
+
+interpolationSchemes
+{
+    default         linear;
+}
+
+snGradSchemes
+{
+    default         corrected;
+}
+
+fluxRequired
+{
+    default         no;
+    p_rgh;
+    pcorr;
+    alpha.water;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/fvSolution b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/fvSolution
new file mode 100644
index 00000000000..b391dcbc82a
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/fvSolution
@@ -0,0 +1,139 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+    "alpha.water.*"
+    {
+        nAlphaCorr      1;
+        nAlphaSubCycles 1;
+        cAlpha          1;
+
+        MULESCorr       yes;
+        nLimiterIter    5;
+        alphaApplyPrevCorr  true;
+
+        solver          smoothSolver;
+        smoother        symGaussSeidel;
+        tolerance       1e-8;
+        relTol          0;
+    }
+
+    "pcorr.*"
+    {
+        solver          PCG;
+        preconditioner
+        {
+            preconditioner  GAMG;
+            tolerance       1e-5;
+            relTol          0;
+            smoother        DICGaussSeidel;
+            nPreSweeps      0;
+            nPostSweeps     2;
+            nFinestSweeps   2;
+            cacheAgglomeration false;
+            nCellsInCoarsestLevel 10;
+            agglomerator    faceAreaPair;
+            mergeLevels     1;
+        }
+
+        tolerance       1e-05;
+        relTol          0;
+        maxIter         100;
+    }
+
+    p_rgh
+    {
+        solver          GAMG;
+        tolerance       1e-8;
+        relTol          0.01;
+        smoother        DIC;
+        nPreSweeps      0;
+        nPostSweeps     2;
+        nFinestSweeps   2;
+        cacheAgglomeration true;
+        nCellsInCoarsestLevel 10;
+        agglomerator    faceAreaPair;
+        mergeLevels     1;
+    }
+
+    p_rghFinal
+    {
+        solver          PCG;
+        preconditioner
+        {
+            preconditioner  GAMG;
+            tolerance       1e-8;
+            relTol          0;
+            nVcycles        2;
+            smoother        DICGaussSeidel;
+            nPreSweeps      2;
+            nPostSweeps     2;
+            nFinestSweeps   2;
+            cacheAgglomeration true;
+            nCellsInCoarsestLevel 10;
+            agglomerator    faceAreaPair;
+            mergeLevels     1;
+        }
+
+        tolerance       1e-8;
+        relTol          0;
+        maxIter         20;
+    }
+
+    "(U|k|epsilon)"
+    {
+        solver          smoothSolver;
+        smoother        GaussSeidel;
+        tolerance       1e-6;
+        relTol          0.1;
+        nSweeps         1;
+    }
+
+    "(U|k|epsilon)Final"
+    {
+        solver          smoothSolver;
+        smoother        GaussSeidel;
+        tolerance       1e-6;
+        relTol          0;
+        nSweeps         1;
+    }
+}
+
+PIMPLE
+{
+    momentumPredictor no;
+    nOuterCorrectors 5;
+    nCorrectors      1;
+    nNonOrthogonalCorrectors 0;
+    correctPhi      yes;
+    moveMeshOuterCorrectors yes;
+}
+
+relaxationFactors
+{
+    fields
+    {
+    }
+    equations
+    {
+        ".*" 1;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/setFieldsDict b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/setFieldsDict
new file mode 100644
index 00000000000..2506a693af0
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/setFieldsDict
@@ -0,0 +1,39 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      setFieldsDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+defaultFieldValues
+(
+    volScalarFieldValue alpha.water 0
+);
+
+regions
+(
+    boxToCell
+    {
+        box ( -100 -100 -100 ) ( 100 100 0.5368 );
+        fieldValues ( volScalarFieldValue alpha.water 1 );
+    }
+
+    boxToCell
+    {
+        box ( 0.7 0.8 -100 ) ( 100 100 0.65 );
+        fieldValues ( volScalarFieldValue alpha.water 1 );
+    }
+);
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/topoSetDict b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/topoSetDict
new file mode 100644
index 00000000000..2f271d34d3e
--- /dev/null
+++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/topoSetDict
@@ -0,0 +1,38 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  dev                                   |
+|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      topoSetDict;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+actions
+(
+    {
+        name    c0;
+        type    cellSet;
+        action  new;
+        source  boxToCell;
+        sourceInfo
+        {
+            box (0.38 0.38 0.2) (0.62 0.62 0.6);
+        }
+    }
+
+    {
+        name    c0;
+        type    cellSet;
+        action  invert;
+    }
+);
+
+// ************************************************************************* //
-- 
GitLab