diff --git a/applications/utilities/mesh/generation/extrude/extrudeMesh/extrudeMesh.C b/applications/utilities/mesh/generation/extrude/extrudeMesh/extrudeMesh.C
index 02e18d2af926a1e9b2c8490586f69bcac7f43801..a726de250539152ba13bf14db699d290dcecc9b7 100644
--- a/applications/utilities/mesh/generation/extrude/extrudeMesh/extrudeMesh.C
+++ b/applications/utilities/mesh/generation/extrude/extrudeMesh/extrudeMesh.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-2017 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015-2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -48,6 +48,7 @@ Description
 #include "MeshedSurfaces.H"
 #include "globalIndex.H"
 #include "cellSet.H"
+#include "fvMeshTools.H"
 
 #include "extrudedMesh.H"
 #include "extrudeModel.H"
@@ -78,59 +79,6 @@ static const Enum<ExtrudeMode> ExtrudeModeNames
 };
 
 
-void createDummyFvMeshFiles(const polyMesh& mesh, const word& regionName)
-{
-    // Create dummy system/fv*
-    {
-        IOobject io
-        (
-            "fvSchemes",
-            mesh.time().system(),
-            regionName,
-            mesh,
-            IOobject::NO_READ,
-            IOobject::NO_WRITE,
-            false
-        );
-
-        Info<< "Testing:" << io.objectPath() << endl;
-
-        if (!io.typeHeaderOk<IOdictionary>(false))
-        {
-            Info<< "Writing dummy " << regionName/io.name() << endl;
-            dictionary dummyDict;
-            dictionary divDict;
-            dummyDict.add("divSchemes", divDict);
-            dictionary gradDict;
-            dummyDict.add("gradSchemes", gradDict);
-            dictionary laplDict;
-            dummyDict.add("laplacianSchemes", laplDict);
-
-            IOdictionary(io, dummyDict).regIOobject::write();
-        }
-    }
-    {
-        IOobject io
-        (
-            "fvSolution",
-            mesh.time().system(),
-            regionName,
-            mesh,
-            IOobject::NO_READ,
-            IOobject::NO_WRITE,
-            false
-        );
-
-        if (!io.typeHeaderOk<IOdictionary>(false))
-        {
-            Info<< "Writing dummy " << regionName/io.name() << endl;
-            dictionary dummyDict;
-            IOdictionary(io, dummyDict).regIOobject::write();
-        }
-    }
-}
-
-
 label findPatchID(const polyBoundaryMesh& patches, const word& name)
 {
     const label patchID = patches.findPatchID(name);
@@ -738,7 +686,7 @@ int main(int argc, char *argv[])
 
 
         // Create dummy fvSchemes, fvSolution
-        createDummyFvMeshFiles(mesh, regionDir);
+        fvMeshTools::createDummyFvMeshFiles(mesh, regionDir, true);
 
         // Create actual mesh from polyTopoChange container
         autoPtr<mapPolyMesh> map = meshMod().makeMesh
diff --git a/applications/utilities/mesh/generation/extrude/extrudeToRegionMesh/extrudeToRegionMesh.C b/applications/utilities/mesh/generation/extrude/extrudeToRegionMesh/extrudeToRegionMesh.C
index 9f5e2219520009aac2639c5fbc4bbcb4a834d4c9..ab733f3ad66fe1b67fcf5b8f3b04f4f08bf68102 100644
--- a/applications/utilities/mesh/generation/extrude/extrudeToRegionMesh/extrudeToRegionMesh.C
+++ b/applications/utilities/mesh/generation/extrude/extrudeToRegionMesh/extrudeToRegionMesh.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-2016 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015-2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -353,59 +353,6 @@ void deleteEmptyPatches(fvMesh& mesh)
 }
 
 
-void createDummyFvMeshFiles(const polyMesh& mesh, const word& regionName)
-{
-    // Create dummy system/fv*
-    {
-        IOobject io
-        (
-            "fvSchemes",
-            mesh.time().system(),
-            regionName,
-            mesh,
-            IOobject::NO_READ,
-            IOobject::NO_WRITE,
-            false
-        );
-
-        Info<< "Testing:" << io.objectPath() << endl;
-
-        if (!io.typeHeaderOk<IOdictionary>(true))
-        {
-            Info<< "Writing dummy " << regionName/io.name() << endl;
-            dictionary dummyDict;
-            dictionary divDict;
-            dummyDict.add("divSchemes", divDict);
-            dictionary gradDict;
-            dummyDict.add("gradSchemes", gradDict);
-            dictionary laplDict;
-            dummyDict.add("laplacianSchemes", laplDict);
-
-            IOdictionary(io, dummyDict).regIOobject::write();
-        }
-    }
-    {
-        IOobject io
-        (
-            "fvSolution",
-            mesh.time().system(),
-            regionName,
-            mesh,
-            IOobject::NO_READ,
-            IOobject::NO_WRITE,
-            false
-        );
-
-        if (!io.typeHeaderOk<IOdictionary>(true))
-        {
-            Info<< "Writing dummy " << regionName/io.name() << endl;
-            dictionary dummyDict;
-            IOdictionary(io, dummyDict).regIOobject::write();
-        }
-    }
-}
-
-
 // Check zone either all internal or all external faces
 void checkZoneInside
 (
@@ -1642,7 +1589,7 @@ int main(int argc, char *argv[])
 
 
     // Create dummy fv* files
-    createDummyFvMeshFiles(mesh, shellRegionName);
+    fvMeshTools::createDummyFvMeshFiles(mesh, shellRegionName, true);
 
 
     word meshInstance;
diff --git a/applications/utilities/mesh/manipulation/splitMeshRegions/splitMeshRegions.C b/applications/utilities/mesh/manipulation/splitMeshRegions/splitMeshRegions.C
index 3692adeeb0a326705de1fec011e3ed1dd24e2a6d..ebf6e7c65edaedb63a1f92e63f6b9ee6cde47bfe 100644
--- a/applications/utilities/mesh/manipulation/splitMeshRegions/splitMeshRegions.C
+++ b/applications/utilities/mesh/manipulation/splitMeshRegions/splitMeshRegions.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  | Copyright (C) 2015-2017 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015-2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -584,56 +584,7 @@ autoPtr<mapPolyMesh> createRegionMesh
 )
 {
     // Create dummy system/fv*
-    {
-        IOobject io
-        (
-            "fvSchemes",
-            mesh.time().system(),
-            regionName,
-            mesh,
-            IOobject::NO_READ,
-            IOobject::NO_WRITE,
-            false
-        );
-
-        Info<< "Testing:" << io.objectPath() << endl;
-
-        if (!io.typeHeaderOk<IOdictionary>(true))
-        // if (!exists(io.objectPath()))
-        {
-            Info<< "Writing dummy " << regionName/io.name() << endl;
-            dictionary dummyDict;
-            dictionary divDict;
-            dummyDict.add("divSchemes", divDict);
-            dictionary gradDict;
-            dummyDict.add("gradSchemes", gradDict);
-            dictionary laplDict;
-            dummyDict.add("laplacianSchemes", laplDict);
-
-            IOdictionary(io, dummyDict).regIOobject::write();
-        }
-    }
-    {
-        IOobject io
-        (
-            "fvSolution",
-            mesh.time().system(),
-            regionName,
-            mesh,
-            IOobject::NO_READ,
-            IOobject::NO_WRITE,
-            false
-        );
-
-        if (!io.typeHeaderOk<IOdictionary>(true))
-        //if (!exists(io.objectPath()))
-        {
-            Info<< "Writing dummy " << regionName/io.name() << endl;
-            dictionary dummyDict;
-            IOdictionary(io, dummyDict).regIOobject::write();
-        }
-    }
-
+    fvMeshTools::createDummyFvMeshFiles(mesh, regionName, true);
 
     // Neighbour cellRegion.
     labelList coupledRegion(mesh.nBoundaryFaces());
diff --git a/src/Allwmake b/src/Allwmake
index 7742d3502c06d1b0a3123669893e47a9a7c8a3cf..b5378ac63cc296dd74da06d2d36479a73d9fbc36 100755
--- a/src/Allwmake
+++ b/src/Allwmake
@@ -53,7 +53,6 @@ wmake $targetType topoChangerFvMesh
 parallel/Allwmake $targetType $*
 randomProcesses/Allwmake $targetType $*
 
-wmake $targetType overset
 wmake $targetType ODE
 
 transportModels/Allwmake $targetType $*
@@ -67,6 +66,7 @@ wmake $targetType fvOptions
 wmake $targetType fvMotionSolver
 
 mesh/Allwmake $targetType $*
+wmake $targetType overset
 renumber/Allwmake $targetType $*
 fvAgglomerationMethods/Allwmake $targetType $*
 wmake $targetType waveModels
diff --git a/src/dynamicMesh/fvMeshTools/fvMeshTools.C b/src/dynamicMesh/fvMeshTools/fvMeshTools.C
index b45e84eda48e229e947767f16e942658b2e6c16d..2cd12e262637bb62315507ba0fbd2328d5cfc6be 100644
--- a/src/dynamicMesh/fvMeshTools/fvMeshTools.C
+++ b/src/dynamicMesh/fvMeshTools/fvMeshTools.C
@@ -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-2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -667,4 +667,66 @@ Foam::autoPtr<Foam::fvMesh> Foam::fvMeshTools::newMesh
 }
 
 
+void Foam::fvMeshTools::createDummyFvMeshFiles
+(
+    const objectRegistry& mesh,
+    const word& regionName,
+    const bool verbose
+)
+{
+    // Create dummy system/fv*
+    {
+        IOobject io
+        (
+            "fvSchemes",
+            mesh.time().system(),
+            regionName,
+            mesh,
+            IOobject::NO_READ,
+            IOobject::NO_WRITE,
+            false
+        );
+
+        if (!io.typeHeaderOk<IOdictionary>(false))
+        {
+            if (verbose)
+            {
+                Info<< "Writing dummy " << regionName/io.name() << endl;
+            }
+            dictionary dummyDict;
+            dictionary divDict;
+            dummyDict.add("divSchemes", divDict);
+            dictionary gradDict;
+            dummyDict.add("gradSchemes", gradDict);
+            dictionary laplDict;
+            dummyDict.add("laplacianSchemes", laplDict);
+
+            IOdictionary(io, dummyDict).regIOobject::write();
+        }
+    }
+    {
+        IOobject io
+        (
+            "fvSolution",
+            mesh.time().system(),
+            regionName,
+            mesh,
+            IOobject::NO_READ,
+            IOobject::NO_WRITE,
+            false
+        );
+
+        if (!io.typeHeaderOk<IOdictionary>(false))
+        {
+            if (verbose)
+            {
+                Info<< "Writing dummy " << regionName/io.name() << endl;
+            }
+            dictionary dummyDict;
+            IOdictionary(io, dummyDict).regIOobject::write();
+        }
+    }
+}
+
+
 // ************************************************************************* //
diff --git a/src/dynamicMesh/fvMeshTools/fvMeshTools.H b/src/dynamicMesh/fvMeshTools/fvMeshTools.H
index 78a6c4390ca46de745bcb7489d1f26a8da60e96c..b65832bbea3b48bbce01ab64d83c1e8fbe510322 100644
--- a/src/dynamicMesh/fvMeshTools/fvMeshTools.H
+++ b/src/dynamicMesh/fvMeshTools/fvMeshTools.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-2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -137,6 +137,14 @@ public:
         const IOobject& io,
         const bool masterOnlyReading
     );
+
+    //- Create additional fv* files
+    static void createDummyFvMeshFiles
+    (
+        const objectRegistry& parent,
+        const word& regionName,
+        const bool verbose = false
+    );
 };
 
 
diff --git a/src/overset/Make/options b/src/overset/Make/options
index fc6854c46f4c61bcd20297567a11f85984141d7f..fb7f46e24e001259f083f3f012c782a0b8db4446 100644
--- a/src/overset/Make/options
+++ b/src/overset/Make/options
@@ -4,6 +4,7 @@
 
 EXE_INC = \
     -I$(LIB_SRC)/fileFormats/lnInclude \
+    -I$(LIB_SRC)/mesh/blockMesh/lnInclude \
     -I$(LIB_SRC)/surfMesh/lnInclude \
     -I$(LIB_SRC)/sampling/lnInclude \
     -I$(LIB_SRC)/meshTools/lnInclude \
@@ -15,4 +16,5 @@ EXE_INC = \
 LIB_LIBS = \
     -ldynamicFvMesh \
     -lsampling \
+    -lblockMesh \
     -ldecompositionMethods
diff --git a/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.H b/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.H
index 9bb17601880e26a90b778e237afbda784820d9d4..476f359382dd71cf16a84441ae0f9fd3410399a7 100644
--- a/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.H
+++ b/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2017-2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2017-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -97,7 +97,12 @@ protected:
 
         //- Helper: create volScalarField for postprocessing.
         template<class Type>
-        tmp<volScalarField> createField(const word& name, UList<Type>&) const;
+        static tmp<volScalarField> createField
+        (
+            const fvMesh& mesh,
+            const word& name,
+            const UList<Type>&
+        );
 
 
 private:
diff --git a/src/overset/cellCellStencil/cellCellStencil/cellCellStencilTemplates.C b/src/overset/cellCellStencil/cellCellStencil/cellCellStencilTemplates.C
index d4318909767d506ee01d184a985a04c43951d10d..18c045ced2a58087a038b0405711721e6143cfa5 100644
--- a/src/overset/cellCellStencil/cellCellStencil/cellCellStencilTemplates.C
+++ b/src/overset/cellCellStencil/cellCellStencil/cellCellStencilTemplates.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2018-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -29,7 +29,12 @@ License
 
 template<class Type>
 Foam::tmp<Foam::volScalarField>
-Foam::cellCellStencil::createField(const word& name, UList<Type>& psi) const
+Foam::cellCellStencil::createField
+(
+    const fvMesh& mesh,
+    const word& name,
+    const UList<Type>& psi
+)
 {
     tmp<volScalarField> tfld
     (
@@ -38,13 +43,13 @@ Foam::cellCellStencil::createField(const word& name, UList<Type>& psi) const
             IOobject
             (
                 name,
-                mesh_.time().timeName(),
-                mesh_,
+                mesh.time().timeName(),
+                mesh,
                 IOobject::NO_READ,
                 IOobject::NO_WRITE,
                 false
             ),
-            mesh_,
+            mesh,
             dimensionedScalar(dimless, Zero),
             zeroGradientFvPatchScalarField::typeName
         )
diff --git a/src/overset/cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.C b/src/overset/cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.C
index 0e048a8c266f4170aed089c441d0b0ec1c130e5a..dba9cf6053ce6d917bb858abd2a6b8e987391e0d 100644
--- a/src/overset/cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.C
+++ b/src/overset/cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2014-2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2014-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -155,12 +155,12 @@ void Foam::cellCellStencils::cellVolumeWeight::walkFront
                     {
                         allWeight[own] = fraction;
 
-                        if (debug)
-                        {
-                            Pout<< "    setting cell "
-                                << mesh_.cellCentres()[own]
-                                << " to " << fraction << endl;
-                        }
+                        //if (debug)
+                        //{
+                        //    Pout<< "    setting cell "
+                        //        << mesh_.cellCentres()[own]
+                        //        << " to " << fraction << endl;
+                        //}
                         allCellTypes[own] = INTERPOLATED;
                         newIsFront.set(mesh_.cells()[own]);
                     }
@@ -174,12 +174,12 @@ void Foam::cellCellStencils::cellVolumeWeight::walkFront
                         {
                             allWeight[nei] = fraction;
 
-                            if (debug)
-                            {
-                                Pout<< "    setting cell "
-                                    << mesh_.cellCentres()[nei]
-                                    << " to " << fraction << endl;
-                            }
+                            //if (debug)
+                            //{
+                            //    Pout<< "    setting cell "
+                            //        << mesh_.cellCentres()[nei]
+                            //        << " to " << fraction << endl;
+                            //}
 
                             allCellTypes[nei] = INTERPOLATED;
                             newIsFront.set(mesh_.cells()[nei]);
@@ -928,6 +928,16 @@ bool Foam::cellCellStencils::cellVolumeWeight::update()
     }
 
 
+    if (debug)
+    {
+        tmp<volScalarField> tfld
+        (
+            createField(mesh_, "allCellTypes", allCellTypes)
+        );
+        tfld().write();
+    }
+
+
     // Use the patch types and weights to decide what to do
     forAll(allPatchTypes, cellI)
     {
@@ -977,15 +987,44 @@ bool Foam::cellCellStencils::cellVolumeWeight::update()
         }
     }
 
+    if (debug)
+    {
+        tmp<volScalarField> tfld
+        (
+            createField(mesh_, "allCellTypes_patch", allCellTypes)
+        );
+        //tfld.ref().correctBoundaryConditions();
+        tfld().write();
+    }
+
 
     // Mark unreachable bits
     findHoles(globalCells, mesh_, zoneID, allStencil, allCellTypes);
 
+    if (debug)
+    {
+        tmp<volScalarField> tfld
+        (
+            createField(mesh_, "allCellTypes_hole", allCellTypes)
+        );
+        //tfld.ref().correctBoundaryConditions();
+        tfld().write();
+    }
+
 
     // Add buffer interpolation layer around holes
     scalarField allWeight(mesh_.nCells(), Zero);
     walkFront(layerRelax, allCellTypes, allWeight);
 
+    if (debug)
+    {
+        tmp<volScalarField> tfld
+        (
+            createField(mesh_, "allCellTypes_front", allCellTypes)
+        );
+        //tfld.ref().correctBoundaryConditions();
+        tfld().write();
+    }
 
     // Check previous iteration cellTypes_ for any hole->calculated changes
     {
@@ -1104,39 +1143,39 @@ bool Foam::cellCellStencils::cellVolumeWeight::update()
     }
 
 
-//     // Check previous iteration cellTypes_ for any hole->calculated changes
-//     {
-//         label nCalculated = 0;
+//  // Check previous iteration cellTypes_ for any hole->calculated changes
+//  {
+//      label nCalculated = 0;
 //
-//         forAll(cellTypes_, celli)
-//         {
-//             if (allCellTypes[celli] == CALCULATED && cellTypes_[celli] == HOLE)
-//             {
-//                 if (allStencil[celli].size() == 0)
-//                 {
-//                     FatalErrorInFunction
-//                         << "Cell:" << celli
-//                         << " at:" << mesh_.cellCentres()[celli]
-//                         << " zone:" << zoneID[celli]
-//                         << " changed from hole to calculated"
-//                         << " but there is no donor"
-//                         << exit(FatalError);
-//                 }
-//                 else
-//                 {
-//                     allCellTypes[celli] = INTERPOLATED;
-//                     nCalculated++;
-//                 }
-//             }
-//         }
+//      forAll(cellTypes_, celli)
+//      {
+//          if (allCellTypes[celli] == CALCULATED && cellTypes_[celli] == HOLE)
+//          {
+//              if (allStencil[celli].size() == 0)
+//              {
+//                  FatalErrorInFunction
+//                      << "Cell:" << celli
+//                      << " at:" << mesh_.cellCentres()[celli]
+//                      << " zone:" << zoneID[celli]
+//                      << " changed from hole to calculated"
+//                      << " but there is no donor"
+//                      << exit(FatalError);
+//              }
+//              else
+//              {
+//                  allCellTypes[celli] = INTERPOLATED;
+//                  nCalculated++;
+//              }
+//          }
+//      }
 //
-//         if (debug)
-//         {
-//             Pout<< "Detected " << nCalculated << " cells changing from hole"
-//                 << " to calculated. Changed these to interpolated"
-//                 << endl;
-//         }
-//     }
+//      if (debug)
+//      {
+//          Pout<< "Detected " << nCalculated << " cells changing from hole"
+//              << " to calculated. Changed these to interpolated"
+//              << endl;
+//      }
+//  }
 
 
     cellTypes_.transfer(allCellTypes);
diff --git a/src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.C b/src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.C
index 0d09a2330eb47d76a8a4bc3409eb35c4216d363d..1e019dab39495bb112be011fce03def9c14833b6 100644
--- a/src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.C
+++ b/src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2017-2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2017-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -1998,8 +1998,10 @@ bool Foam::cellCellStencils::inverseDistance::update()
 
     if (debug)
     {
-        tmp<volScalarField> tfld(createField("allCellTypes", allCellTypes));
-        //tfld.ref().correctBoundaryConditions();
+        tmp<volScalarField> tfld
+        (
+            createField(mesh_, "allCellTypes", allCellTypes)
+        );
         tfld().write();
     }
 
@@ -2041,9 +2043,8 @@ bool Foam::cellCellStencils::inverseDistance::update()
     {
         tmp<volScalarField> tfld
         (
-            createField("allCellTypes_patch", allCellTypes)
+            createField(mesh_, "allCellTypes_patch", allCellTypes)
         );
-        //tfld.ref().correctBoundaryConditions();
         tfld().write();
     }
 
@@ -2054,9 +2055,8 @@ bool Foam::cellCellStencils::inverseDistance::update()
     {
         tmp<volScalarField> tfld
         (
-            createField("allCellTypes_hole", allCellTypes)
+            createField(mesh_, "allCellTypes_hole", allCellTypes)
         );
-        //tfld.ref().correctBoundaryConditions();
         tfld().write();
     }
     if (debug)
@@ -2066,8 +2066,10 @@ bool Foam::cellCellStencils::inverseDistance::update()
         {
             stencilSize[celli] = allStencil[celli].size();
         }
-        tmp<volScalarField> tfld(createField("allStencil_hole", stencilSize));
-        //tfld.ref().correctBoundaryConditions();
+        tmp<volScalarField> tfld
+        (
+            createField(mesh_, "allStencil_hole", stencilSize)
+        );
         tfld().write();
     }
 
@@ -2080,9 +2082,8 @@ bool Foam::cellCellStencils::inverseDistance::update()
     {
         tmp<volScalarField> tfld
         (
-            createField("allCellTypes_front", allCellTypes)
+            createField(mesh_, "allCellTypes_front", allCellTypes)
         );
-        //tfld.ref().correctBoundaryConditions();
         tfld().write();
     }
 
@@ -2227,14 +2228,20 @@ bool Foam::cellCellStencils::inverseDistance::update()
                         << endl;
                 }
             }
-            tmp<volScalarField> tfld(createField("maxMagWeight", maxMagWeight));
+            tmp<volScalarField> tfld
+            (
+                createField(mesh_, "maxMagWeight", maxMagWeight)
+            );
             tfld.ref().correctBoundaryConditions();
             tfld().write();
         }
 
         // Dump cell types
         {
-            tmp<volScalarField> tfld(createField("cellTypes", cellTypes_));
+            tmp<volScalarField> tfld
+            (
+                createField(mesh_, "cellTypes", cellTypes_)
+            );
             tfld.ref().correctBoundaryConditions();
             tfld().write();
         }
diff --git a/src/overset/cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.C b/src/overset/cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.C
index a30a601d306622c6789d9256e883516f2f715b97..988404591f62579df97a939803485e566c28f6aa 100644
--- a/src/overset/cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.C
+++ b/src/overset/cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2017-2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2017-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -441,55 +441,55 @@ Foam::cellCellStencils::trackingInverseDistance::trackingInverseDistance
     inverseDistance(mesh, dict, false),
     globalCells_(mesh_.nCells())
 {
-    if (doUpdate)
-    {
-        // Initialise donor cell
-        globalDonor_.setSize(mesh_.nCells());
-        globalDonor_ = -1;
+    // Initialise donor cell
+    globalDonor_.setSize(mesh_.nCells());
+    globalDonor_ = -1;
 
-        // Initialise mesh partitions
-        const labelIOList& zoneID = this->zoneID();
-        label nZones = gMax(zoneID)+1;
+    // Initialise mesh partitions
+    const labelIOList& zoneID = this->zoneID();
+    label nZones = gMax(zoneID)+1;
 
-        labelList nCellsPerZone(nZones, Zero);
-        forAll(zoneID, celli)
-        {
-            nCellsPerZone[zoneID[celli]]++;
-        }
-        Pstream::listCombineGather(nCellsPerZone, plusEqOp<label>());
-        Pstream::listCombineScatter(nCellsPerZone);
+    labelList nCellsPerZone(nZones, Zero);
+    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_, zonei, zoneID)
-            );
+    meshParts_.setSize(nZones);
+    forAll(meshParts_, zonei)
+    {
+        meshParts_.set
+        (
+            zonei,
+            new fvMeshSubset(mesh_, zonei, zoneID)
+        );
 
-            // Trigger early evaluation of mesh dimension
-            // (in case there are locally zero cells in mesh)
-            (void)meshParts_[zonei].subMesh().nGeometricD();
-        }
+        // Trigger early evaluation of mesh dimension
+        // (in case there are locally zero cells in mesh)
+        (void)meshParts_[zonei].subMesh().nGeometricD();
+    }
 
 
-        // Print a bit
+    // Print a bit
+    {
+        Info<< typeName << " : detected " << nZones
+            << " mesh regions" << endl;
+        Info<< incrIndent;
+        forAll(nCellsPerZone, zonei)
         {
-            Info<< typeName << " : detected " << nZones
-                << " mesh regions" << endl;
-            Info<< incrIndent;
-            forAll(nCellsPerZone, zonei)
-            {
-                Info<< indent<< "zone:" << zonei
-                    << " nCells:" << nCellsPerZone[zonei]
-                    << endl;
-            }
-            Info<< decrIndent;
+            Info<< indent<< "zone:" << zonei
+                << " nCells:" << nCellsPerZone[zonei]
+                << endl;
         }
+        Info<< decrIndent;
+    }
 
 
-        // Do geometry update
+    // Do geometry update
+    if (doUpdate)
+    {
         update();
     }
 }
@@ -550,12 +550,36 @@ bool Foam::cellCellStencils::trackingInverseDistance::update()
             meshSearches.set
             (
                 zonei,
-                new voxelMeshSearch(meshParts_[zonei].subMesh(), true)
+                new voxelMeshSearch
+                (
+                    meshParts_[zonei].subMesh(),
+                    true
+                )
             );
         }
     }
     DebugInfo<< FUNCTION_NAME << " : Constructed cell voxel meshes" << endl;
 
+    PtrList<fvMesh> voxelMeshes;
+    if (debug)
+    {
+        voxelMeshes.setSize(meshSearches.size());
+        forAll(meshSearches, zonei)
+        {
+            IOobject meshIO
+            (
+                word("voxelMesh" + Foam::name(zonei)),
+                mesh_.time().timeName(),
+                mesh_,
+                IOobject::NO_READ
+            );
+
+            Pout<< "Constructing voxel mesh " << meshIO.objectPath() << endl;
+            voxelMeshes.set(zonei, meshSearches[zonei].makeMesh(meshIO));
+        }
+    }
+
+
 
     const boundBox& allBb(mesh_.bounds());
 
@@ -657,6 +681,24 @@ bool Foam::cellCellStencils::trackingInverseDistance::update()
     }
     DebugInfo<< FUNCTION_NAME << " : Calculated boundary voxel meshes" << endl;
 
+    if (debug)
+    {
+        forAll(patchParts, zonei)
+        {
+            const labelList voxelTypes(patchParts[zonei].values());
+            const fvMesh& vm = voxelMeshes[zonei];
+            tmp<volScalarField> tfld
+            (
+                createField<label>
+                (
+                    vm,
+                    "patchTypes",
+                    voxelTypes
+                )
+            );
+            tfld().write();
+        }
+    }
 
     // Current best guess for cells
     labelList allCellTypes(mesh_.nCells(), CALCULATED);
@@ -698,7 +740,13 @@ bool Foam::cellCellStencils::trackingInverseDistance::update()
                 srci,
                 allCellTypes
             );
+        }
+    }
 
+    for (label srci = 0; srci < meshParts_.size()-1; srci++)
+    {
+        for (label tgti = srci+1; tgti < meshParts_.size(); tgti++)
+        {
             markDonors
             (
                 pBufs,
@@ -727,6 +775,15 @@ bool Foam::cellCellStencils::trackingInverseDistance::update()
     DebugInfo<< FUNCTION_NAME << " : Determined holes and donor-acceptors"
         << endl;
 
+    if (debug)
+    {
+        tmp<volScalarField> tfld
+        (
+            createField(mesh_, "allCellTypes", allCellTypes)
+        );
+        tfld().write();
+    }
+
 
     // Use the patch types and weights to decide what to do
     forAll(allPatchTypes, celli)
@@ -753,15 +810,84 @@ bool Foam::cellCellStencils::trackingInverseDistance::update()
     }
     DebugInfo<< FUNCTION_NAME << " : Removed bad donors" << endl;
 
+    if (debug)
+    {
+        tmp<volScalarField> tfld
+        (
+            createField(mesh_, "allCellTypes_patch", allCellTypes)
+        );
+        tfld().write();
+    }
+
+
     // Mark unreachable bits
     findHoles(globalCells_, mesh_, zoneID, allStencil, allCellTypes);
     DebugInfo<< FUNCTION_NAME << " : Flood-filled holes" << endl;
 
+    if (debug)
+    {
+        tmp<volScalarField> tfld
+        (
+            createField(mesh_, "allCellTypes_hole", allCellTypes)
+        );
+        tfld().write();
+    }
+
     // Add buffer interpolation layer(s) around holes
     scalarField allWeight(mesh_.nCells(), Zero);
     walkFront(layerRelax, allStencil, allCellTypes, allWeight);
     DebugInfo<< FUNCTION_NAME << " : Implemented layer relaxation" << endl;
 
+    if (debug)
+    {
+        tmp<volScalarField> tfld
+        (
+            createField(mesh_, "allCellTypes_front", allCellTypes)
+        );
+        tfld().write();
+    }
+
+
+    // Check previous iteration cellTypes_ for any hole->calculated changes
+    {
+        label nCalculated = 0;
+
+        forAll(cellTypes_, celli)
+        {
+            if (allCellTypes[celli] == CALCULATED && cellTypes_[celli] == HOLE)
+            {
+                if (allStencil[celli].size() == 0)
+                {
+                    FatalErrorInFunction
+                    //WarningInFunction
+                        << "Cell:" << celli
+                        << " at:" << mesh_.cellCentres()[celli]
+                        << " zone:" << zoneID[celli]
+                        << " changed from hole to calculated"
+                        << " but there is no donor"
+                        //<< endl;
+                        << exit(FatalError);
+                }
+                else
+                {
+                    Pout<< "cell:" << mesh_.cellCentres()[celli]
+                        << " changed from hole to calculated"
+                        << " using donors:" << allStencil[celli]
+                        << endl;
+                    allCellTypes[celli] = INTERPOLATED;
+                    nCalculated++;
+                }
+            }
+        }
+
+        if (debug)
+        {
+            Pout<< "Detected " << nCalculated << " cells changing from hole"
+                << " to calculated. Changed to interpolated"
+                << endl;
+        }
+    }
+
 
     // Convert cell-cell addressing to stencil in compact notation
 
diff --git a/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.C b/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.C
index 720b25d7610d55a5df8af4811c9a7379715e4039..dd331034992a4c283f50795730d8016df3aae3b2 100644
--- a/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.C
+++ b/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2017-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -26,7 +26,11 @@ License
 #include "voxelMeshSearch.H"
 #include "polyMesh.H"
 #include "processorPolyPatch.H"
-
+#include "IOobject.H"
+#include "fvMesh.H"
+#include "block.H"
+#include "emptyPolyPatch.H"
+#include "fvMeshTools.H"
 
 /* * * * * * * * * * * * * * * Static Member Data  * * * * * * * * * * * * * */
 
@@ -340,6 +344,14 @@ bool Foam::voxelMeshSearch::update()
     }
 
 
+    if (debug)
+    {
+        Pout<< "voxelMeshSearch : mesh:" << mesh_.name()
+            << " nDivs:" << nDivs_
+            << " localBb:" << localBb_ << endl;
+    }
+
+
     //// Small optimisation: make sure the cell centre at least always
     //// returns the cell itself
     //const pointField& cellCentres = mesh_.cellCentres();
@@ -429,4 +441,106 @@ Foam::label Foam::voxelMeshSearch::findCell(const point& p) const
 }
 
 
+Foam::autoPtr<Foam::fvMesh> Foam::voxelMeshSearch::makeMesh
+(
+    const IOobject& io
+) const
+{
+    const cellModel& hex = cellModel::ref(cellModel::HEX);
+
+    cellShapeList cellShapes;
+    faceListList boundary;
+    pointField points;
+    {
+        //Info<< "Creating block" << endl;
+
+        block b
+        (
+            cellShape(hex, identity(8), false),
+            localBb_.points(),
+            blockEdgeList(),
+            blockFaceList(),
+            nDivs_,
+            List<gradingDescriptors>(12)
+        );
+
+        List<FixedList<label, 8>> bCells(b.cells());
+        cellShapes.setSize(bCells.size());
+        forAll(cellShapes, celli)
+        {
+            cellShapes[celli] =
+                cellShape(hex, labelList(bCells[celli]), false);
+        }
+
+        //Info<< "Creating boundary faces" << endl;
+
+        boundary.setSize(b.boundaryPatches().size());
+        forAll(boundary, patchi)
+        {
+            faceList faces(b.boundaryPatches()[patchi].size());
+            forAll(faces, facei)
+            {
+                faces[facei] = face(b.boundaryPatches()[patchi][facei]);
+            }
+            boundary[patchi].transfer(faces);
+        }
+
+        points.transfer(const_cast<pointField&>(b.points()));
+    }
+
+    //Info<< "Creating patch dictionaries" << endl;
+    wordList patchNames(boundary.size());
+    forAll(patchNames, patchi)
+    {
+        patchNames[patchi] = "patch" + Foam::name(patchi);
+    }
+
+    PtrList<dictionary> boundaryDicts(boundary.size());
+    forAll(boundaryDicts, patchi)
+    {
+        boundaryDicts.set(patchi, new dictionary());
+        dictionary& patchDict = boundaryDicts[patchi];
+        patchDict.add("type", emptyPolyPatch::typeName);
+    }
+
+    //Info<< "Creating polyMesh" << endl;
+    IOobject polyIO(io);
+    polyIO.readOpt() = IOobject::NO_READ;
+    polyMesh mesh
+    (
+        //IOobject
+        //(
+        //    polyMesh::defaultRegion,
+        //    runTime.constant(),
+        //    runTime,
+        //    IOobject::NO_READ
+        //),
+        polyIO,
+        std::move(points),
+        cellShapes,
+        boundary,
+        patchNames,
+        boundaryDicts,
+        "defaultFaces",
+        emptyPolyPatch::typeName,
+        false
+    );
+
+    //Info<< "Writing polyMesh" << endl;
+    mesh.write();
+
+    //Info<< "Reading fvMesh" << endl;
+
+    fvMeshTools::createDummyFvMeshFiles
+    (
+        io.db(),
+        io.name()
+    );
+    IOobject fvIO(io);
+    fvIO.readOpt() = IOobject::MUST_READ;
+
+    return autoPtr<fvMesh>::New(fvIO);
+}
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.H b/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.H
index 3f8bd0443489762a351fb6918974ca5743fc94f9..5c929fe44b62b7232656a03631730adee7f1b7a6 100644
--- a/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.H
+++ b/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2017-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -46,6 +46,8 @@ namespace Foam
 // Forward declaration of friend functions and operators
 class polyMesh;
 class OBJstream;
+class IOobject;
+class fvMesh;
 
 /*---------------------------------------------------------------------------*\
                         Class voxelMeshSearch Declaration
@@ -60,7 +62,7 @@ class voxelMeshSearch
         //- Local mesh bounding box
         boundBox localBb_;
 
-        //- Number of points in all directions (for local mesh only)
+        //- Number of voxels in all directions (for local mesh only)
         labelVector nDivs_;
 
         //- Voxel to seed cell
@@ -185,6 +187,10 @@ public:
                 const boundBox&,
                 const labelVector&
             );
+
+            //- Debug: construct fvMesh. Note: writes a dummy mesh to
+            //  io.timeName()! TBD.
+            autoPtr<fvMesh> makeMesh(const IOobject&) const;
 };
 
 
diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/fvSchemes b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/fvSchemes
index b92e920c3ed7639a081992cebd5cc4920979796f..ca1a726628bda56873007db0b7608a53879297dd 100644
--- a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/fvSchemes
+++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/fvSchemes
@@ -57,9 +57,11 @@ snGradSchemes
 oversetInterpolation
 {
     method              inverseDistance;
-
     searchBox           (0 0 0)(0.01 0.01 0.01);
     searchBoxDivisions  (100 100 1);
+
+    //method              trackingInverseDistance;
+    //searchBoxDivisions  2{(100 100 1)};
 }
 
 fluxRequired