diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMesh.C b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMesh.C
index 00aa92630fcafe1d853c3208508484f7f10c9427..d78011c9db4ce3fbb157feffd44999abe19cdace 100644
--- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMesh.C
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMesh.C
@@ -26,6 +26,10 @@ License
 #include "DelaunayMesh.H"
 #include "labelPair.H"
 #include "PrintTable.H"
+#include "pointIOField.H"
+#include "scalarIOField.H"
+#include "labelIOField.H"
+#include "pointConversion.H"
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
@@ -36,14 +40,121 @@ License
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
 template<class Triangulation>
-Foam::DelaunayMesh<Triangulation>::DelaunayMesh()
+Foam::DelaunayMesh<Triangulation>::DelaunayMesh(const Time& runTime)
 :
     Triangulation(),
     vertexCount_(0),
-    cellCount_(0)
+    cellCount_(0),
+    runTime_(runTime)
 {}
 
 
+template<class Triangulation>
+Foam::DelaunayMesh<Triangulation>::DelaunayMesh
+(
+    const Time& runTime,
+    const word& meshName
+)
+:
+    Triangulation(),
+    vertexCount_(0),
+    cellCount_(0),
+    runTime_(runTime)
+{
+    pointIOField pts
+    (
+        IOobject
+        (
+            "points",
+            runTime.timeName(),
+            meshName/polyMesh::meshSubDir,
+            runTime,
+            IOobject::READ_IF_PRESENT,
+            IOobject::NO_WRITE
+        )
+    );
+
+    labelIOField types
+    (
+        IOobject
+        (
+            "types",
+            runTime.timeName(),
+            meshName,
+            runTime,
+            IOobject::READ_IF_PRESENT,
+            IOobject::NO_WRITE
+        )
+    );
+
+    labelIOField indices
+    (
+        IOobject
+        (
+            "indices",
+            runTime.timeName(),
+            meshName,
+            runTime,
+            IOobject::READ_IF_PRESENT,
+            IOobject::NO_WRITE
+        )
+    );
+
+    labelIOField processorIndices
+    (
+        IOobject
+        (
+            "processorIndices",
+            runTime.timeName(),
+            meshName,
+            runTime,
+            IOobject::READ_IF_PRESENT,
+            IOobject::NO_WRITE
+        )
+    );
+
+    if (pts.headerOk())
+    {
+        forAll(pts, ptI)
+        {
+            Vertex_handle vh = this->insert(toPoint<Point>(pts[ptI]));
+
+            if (indices.headerOk())
+            {
+                vh->index() = indices[ptI];
+                vertexCount()++;
+            }
+            else
+            {
+                vh->index() = getNewVertexIndex();
+            }
+
+            if (processorIndices.headerOk())
+            {
+                vh->procIndex() = processorIndices[ptI];
+            }
+            else
+            {
+                vh->procIndex() = Pstream::myProcNo();
+            }
+
+            if (types.headerOk())
+            {
+                vh->type() =
+                    static_cast<Foam::indexedVertexEnum::vertexType>
+                    (
+                        types[ptI]
+                    );
+            }
+            else
+            {
+                vh->type() = Vb::vtUnassigned;
+            }
+        }
+    }
+}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class Triangulation>
diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMesh.H b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMesh.H
index 383ee64baeeef0862b92aa70faa8fd1a5c9d65e9..1fbf19c1d6957cdc69fabcf678fd13071faac0f8 100644
--- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMesh.H
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMesh.H
@@ -43,6 +43,7 @@ SourceFiles
 #include "boundBox.H"
 #include "indexedVertex.H"
 #include "CGALTriangulation3Ddefs.H"
+#include "Time.H"
 #include "autoPtr.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -82,6 +83,12 @@ public:
            FixedList<label, 2>::Hash<>
         > labelPairHashSet;
 
+        typedef HashTable
+        <
+            label,
+            labelPair,
+            FixedList<label, 2>::Hash<>
+        > labelTolabelPairHashTable;
 
 private:
 
@@ -95,6 +102,9 @@ private:
         //  This allows a unique index to be assigned to each cell.
         mutable label cellCount_;
 
+        //- Reference to Time
+        const Time& runTime_;
+
         //- Spatial sort traits to use with a pair of point pointers and an int.
         //  Taken from a post on the CGAL lists: 2010-01/msg00004.html by
         //  Sebastien Loriot (Geometry Factory).
@@ -159,7 +169,13 @@ public:
     // Constructors
 
         //- Construct from components
-        DelaunayMesh();
+        explicit DelaunayMesh(const Time& runTime);
+
+        DelaunayMesh
+        (
+            const Time& runTime,
+            const word& meshName
+        );
 
 
     //- Destructor
@@ -168,6 +184,14 @@ public:
 
     // Member Functions
 
+        inline const Time& time() const;
+
+        inline void timeCheck
+        (
+            const string& description,
+            const bool check = true
+        ) const;
+
         inline label getNewVertexIndex() const;
 
         inline label getNewCellIndex() const;
@@ -177,6 +201,7 @@ public:
         inline void resetCellCount();
 
         inline label vertexCount() const;
+        inline label& vertexCount();
 
         inline void resetVertexCount();
 
@@ -209,12 +234,12 @@ public:
 
         //- Create an fvMesh from the triangulation.
         //  The mesh is not parallel consistent - only used for viewing
-        autoPtr<fvMesh> createMesh
+        autoPtr<polyMesh> createMesh
         (
             const fileName& name,
-            const Time& runTime,
-            labelList& vertexMap,
-            labelList& cellMap
+            labelTolabelPairHashTable& vertexMap,
+            labelList& cellMap,
+            const bool writeDelaunayData = true
         ) const;
 };
 
diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMeshI.H b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMeshI.H
index 733f1230f7202e774321b5c9e325aa4f45a74857..bf2277e356da608452c1b3c47cf8db1d90bc2a08 100644
--- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMeshI.H
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMeshI.H
@@ -36,6 +36,40 @@ License
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
+template<class Triangulation>
+inline const Foam::Time& Foam::DelaunayMesh<Triangulation>::time() const
+{
+    return runTime_;
+}
+
+
+template<class Triangulation>
+void Foam::DelaunayMesh<Triangulation>::timeCheck
+(
+    const string& description,
+    const bool check
+) const
+{
+    if (check)
+    {
+        Info<< nl << "--- [ cpuTime "
+            << time().elapsedCpuTime() << " s, "
+            << "delta " << time().cpuTimeIncrement()<< " s";
+
+        if (description != word::null)
+        {
+            Info<< ", " << description << " ";
+        }
+        else
+        {
+            Info<< " ";
+        }
+
+        Info<< "] --- " << endl;
+    }
+}
+
+
 template<class Triangulation>
 inline Foam::label Foam::DelaunayMesh<Triangulation>::getNewVertexIndex() const
 {
@@ -90,6 +124,12 @@ Foam::label Foam::DelaunayMesh<Triangulation>::vertexCount() const
     return vertexCount_;
 }
 
+template<class Triangulation>
+Foam::label& Foam::DelaunayMesh<Triangulation>::vertexCount()
+{
+    return vertexCount_;
+}
+
 
 template<class Triangulation>
 void Foam::DelaunayMesh<Triangulation>::resetVertexCount()
diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMeshIO.C b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMeshIO.C
index bed42012cf7981ca2db868cadecf1ea86f35563e..1a341348b1a1d948a31a195672f888d515e871d9 100644
--- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMeshIO.C
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/DelaunayMesh/DelaunayMeshIO.C
@@ -28,6 +28,7 @@ License
 #include "pointConversion.H"
 #include "wallPolyPatch.H"
 #include "processorPolyPatch.H"
+#include "labelIOField.H"
 
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
@@ -331,13 +332,13 @@ void Foam::DelaunayMesh<Triangulation>::printVertexInfo(Ostream& os) const
 
 
 template<class Triangulation>
-Foam::autoPtr<Foam::fvMesh>
+Foam::autoPtr<Foam::polyMesh>
 Foam::DelaunayMesh<Triangulation>::createMesh
 (
     const fileName& name,
-    const Time& runTime,
-    labelList& vertexMap,
-    labelList& cellMap
+    labelTolabelPairHashTable& vertexMap,
+    labelList& cellMap,
+    const bool writeDelaunayData
 ) const
 {
     pointField points(Triangulation::number_of_vertices());
@@ -354,12 +355,54 @@ Foam::DelaunayMesh<Triangulation>::createMesh
     List<DynamicList<face> > patchFaces(1, DynamicList<face>());
     List<DynamicList<label> > patchOwners(1, DynamicList<label>());
 
-    vertexMap.setSize(vertexCount(), -1);
+    vertexMap.resize(vertexCount());
     cellMap.setSize(Triangulation::number_of_finite_cells(), -1);
 
     // Calculate pts and a map of point index to location in pts.
     label vertI = 0;
 
+    labelIOField indices
+    (
+        IOobject
+        (
+            "indices",
+            time().timeName(),
+            name,
+            time(),
+            IOobject::NO_READ,
+            IOobject::AUTO_WRITE
+        ),
+        Triangulation::number_of_vertices()
+    );
+
+    labelIOField types
+    (
+        IOobject
+        (
+            "types",
+            time().timeName(),
+            name,
+            time(),
+            IOobject::NO_READ,
+            IOobject::AUTO_WRITE
+        ),
+        Triangulation::number_of_vertices()
+    );
+
+    labelIOField processorIndices
+    (
+        IOobject
+        (
+            "processorIndices",
+            time().timeName(),
+            name,
+            time(),
+            IOobject::NO_READ,
+            IOobject::AUTO_WRITE
+        ),
+        Triangulation::number_of_vertices()
+    );
+
     for
     (
         Finite_vertices_iterator vit = Triangulation::finite_vertices_begin();
@@ -369,13 +412,20 @@ Foam::DelaunayMesh<Triangulation>::createMesh
     {
         if (!vit->farPoint())
         {
-            vertexMap[vit->index()] = vertI;
+            vertexMap(labelPair(vit->index(), vit->procIndex())) = vertI;
             points[vertI] = topoint(vit->point());
+            indices[vertI] = vit->index();
+            types[vertI] = static_cast<label>(vit->type());
+            processorIndices[vertI] = vit->procIndex();
             vertI++;
         }
     }
 
     points.setSize(vertI);
+    indices.setSize(vertI);
+    types.setSize(vertI);
+    processorIndices.setSize(vertI);
+
 
     // Index the cells
     label cellI = 0;
@@ -391,6 +441,7 @@ Foam::DelaunayMesh<Triangulation>::createMesh
         (
             !cit->hasFarPoint()
          && !Triangulation::is_infinite(cit)
+         && cit->real()
         )
         {
             cellMap[cit->cellIndex()] = cellI++;
@@ -424,7 +475,12 @@ Foam::DelaunayMesh<Triangulation>::createMesh
 
         label c1I = Cb::ctFar;
         bool c1Real = false;
-        if (!c1->hasFarPoint() && !Triangulation::is_infinite(c1))
+        if
+        (
+            !c1->hasFarPoint()
+         && !Triangulation::is_infinite(c1)
+         && c1->real()
+        )
         {
             c1I = cellMap[c1->cellIndex()];
             c1Real = true;
@@ -432,7 +488,12 @@ Foam::DelaunayMesh<Triangulation>::createMesh
 
         label c2I = Cb::ctFar;
         bool c2Real = false;
-        if (!c2->hasFarPoint() && !Triangulation::is_infinite(c2))
+        if
+        (
+            !c2->hasFarPoint()
+         && !Triangulation::is_infinite(c2)
+         && c2->real()
+        )
         {
             c2I = cellMap[c2->cellIndex()];
             c2Real = true;
@@ -451,10 +512,17 @@ Foam::DelaunayMesh<Triangulation>::createMesh
         {
             verticesOnTriFace[i] = vertexMap
             [
-                c1->vertex
+                labelPair
                 (
-                    Triangulation::vertex_triple_index(oppositeVertex, i)
-                )->index()
+                    c1->vertex
+                    (
+                        Triangulation::vertex_triple_index(oppositeVertex, i)
+                    )->index(),
+                    c1->vertex
+                    (
+                        Triangulation::vertex_triple_index(oppositeVertex, i)
+                    )->procIndex()
+                )
             ];
         }
 
@@ -524,15 +592,15 @@ Foam::DelaunayMesh<Triangulation>::createMesh
 
     Info<< "Creating mesh" << endl;
 
-    autoPtr<fvMesh> meshPtr
+    autoPtr<polyMesh> meshPtr
     (
-        new fvMesh
+        new polyMesh
         (
             IOobject
             (
                 name,
-                runTime.timeName(),
-                runTime,
+                time().timeName(),
+                time(),
                 IOobject::NO_READ,
                 IOobject::NO_WRITE
             ),
@@ -565,7 +633,14 @@ Foam::DelaunayMesh<Triangulation>::createMesh
 
     patches.setSize(nValidPatches);
 
-    meshPtr().addFvPatches(patches);
+    meshPtr().addPatches(patches);
+
+    if (writeDelaunayData)
+    {
+        indices.write();
+        types.write();
+        processorIndices.write();
+    }
 
     Info<< "Mesh created" << endl;
 
diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/DelaunayMesh/DistributedDelaunayMesh.C b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/DelaunayMesh/DistributedDelaunayMesh.C
index 7b316e5c44f34f64867b09f3662e2473bee92999..4f7a07fab92de412ec0b49d0534e93dbf6a9c2f4 100644
--- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/DelaunayMesh/DistributedDelaunayMesh.C
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/DelaunayMesh/DistributedDelaunayMesh.C
@@ -126,9 +126,24 @@ Foam::DistributedDelaunayMesh<Triangulation>::buildMap
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
 template<class Triangulation>
-Foam::DistributedDelaunayMesh<Triangulation>::DistributedDelaunayMesh()
+Foam::DistributedDelaunayMesh<Triangulation>::DistributedDelaunayMesh
+(
+    const Time& runTime
+)
+:
+    DelaunayMesh<Triangulation>(runTime),
+    allBackgroundMeshBounds_()
+{}
+
+
+template<class Triangulation>
+Foam::DistributedDelaunayMesh<Triangulation>::DistributedDelaunayMesh
+(
+    const Time& runTime,
+    const word& meshName
+)
 :
-    DelaunayMesh<Triangulation>(),
+    DelaunayMesh<Triangulation>(runTime, meshName),
     allBackgroundMeshBounds_()
 {}
 
diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/DelaunayMesh/DistributedDelaunayMesh.H b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/DelaunayMesh/DistributedDelaunayMesh.H
index 1eaa483c74ba9965c84368d1797b97b6c6e11b7c..c2acbf8a089476fc8e85c4034e52d965843bcbd2 100644
--- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/DelaunayMesh/DistributedDelaunayMesh.H
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/DelaunayMesh/DistributedDelaunayMesh.H
@@ -135,13 +135,25 @@ public:
     // Constructors
 
         //- Construct from components
-        DistributedDelaunayMesh();
+        explicit DistributedDelaunayMesh(const Time& runTime);
+
+        DistributedDelaunayMesh
+        (
+            const Time& runTime,
+            const word& meshName
+        );
 
 
     //- Destructor
     ~DistributedDelaunayMesh();
 
 
+    // Queries
+
+        //- Use DelaunayMesh timeCheck function
+        using DelaunayMesh<Triangulation>::timeCheck;
+
+
     // Member Functions
 
         //- Build a mapDistribute for the supplied destination processor data
diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/backgroundMeshDecomposition/backgroundMeshDecomposition.C b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/backgroundMeshDecomposition/backgroundMeshDecomposition.C
index a9770b50dac866981519df8a64ed91af4d6622d0..e14100cd0039c9d51059788051eadf6c0c7acda6 100644
--- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/backgroundMeshDecomposition/backgroundMeshDecomposition.C
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/backgroundMeshDecomposition/backgroundMeshDecomposition.C
@@ -791,10 +791,11 @@ Foam::backgroundMeshDecomposition::backgroundMeshDecomposition
     (
         IOobject
         (
-            fvMesh::defaultRegion,
+            "backgroundMeshDecomposition",
             runTime_.timeName(),
             runTime_,
-            IOobject::MUST_READ
+            IOobject::MUST_READ,
+            IOobject::AUTO_WRITE
         )
     ),
     meshCutter_
diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControlMesh/cellShapeControlMesh.C b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControlMesh/cellShapeControlMesh.C
index 42e8a161f911eebc9c26f1104d977357b45e4463..52d14633b4312341aa6acc2bf8c12cc5c074a0cd 100644
--- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControlMesh/cellShapeControlMesh.C
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControlMesh/cellShapeControlMesh.C
@@ -27,7 +27,7 @@ License
 #include "cellSizeAndAlignmentControls.H"
 #include "pointIOField.H"
 #include "scalarIOField.H"
-#include "tensorIOField.H"
+#include "triadIOField.H"
 #include "tetrahedron.H"
 #include "plane.H"
 #include "transform.H"
@@ -38,6 +38,8 @@ License
 namespace Foam
 {
 defineTypeNameAndDebug(cellShapeControlMesh, 0);
+
+word cellShapeControlMesh::meshSubDir = "cellShapeControlMesh";
 }
 
 
@@ -366,9 +368,89 @@ void Foam::cellShapeControlMesh::writeTriangulation()
 
 Foam::cellShapeControlMesh::cellShapeControlMesh(const Time& runTime)
 :
+    DistributedDelaunayMesh<CellSizeDelaunay>
+    (
+        runTime,
+        meshSubDir
+    ),
     runTime_(runTime),
     defaultCellSize_(0.0)
-{}
+{
+    if (this->vertexCount())
+    {
+        fvMesh mesh
+        (
+            IOobject
+            (
+                meshSubDir,
+                runTime.timeName(),
+                runTime,
+                IOobject::READ_IF_PRESENT,
+                IOobject::NO_WRITE
+            )
+        );
+
+        if (mesh.nPoints() == this->vertexCount())
+        {
+            pointScalarField sizes
+            (
+                IOobject
+                (
+                    "sizes",
+                    runTime.timeName(),
+                    meshSubDir,
+                    runTime,
+                    IOobject::READ_IF_PRESENT,
+                    IOobject::NO_WRITE
+                ),
+                pointMesh::New(mesh)
+            );
+
+            triadIOField alignments
+            (
+                IOobject
+                (
+                    "alignments",
+                    mesh.time().timeName(),
+                    meshSubDir,
+                    mesh.time(),
+                    IOobject::READ_IF_PRESENT,
+                    IOobject::AUTO_WRITE
+                )
+            );
+
+            if
+            (
+                sizes.size() == this->vertexCount()
+             && alignments.size() == this->vertexCount()
+            )
+            {
+                label count = 0;
+                for
+                (
+                    Finite_vertices_iterator vit = finite_vertices_begin();
+                    vit != finite_vertices_end();
+                    ++vit
+                )
+                {
+                    vit->targetCellSize() = sizes[count];
+                    vit->alignment() = alignments[count];
+                    count++;
+                }
+            }
+            else
+            {
+                FatalErrorIn
+                (
+                    "Foam::cellShapeControlMesh::cellShapeControlMesh"
+                    "(const Time&)"
+                )   << "Cell size point field is not the same size as the "
+                    << "mesh."
+                    << abort(FatalError);
+            }
+        }
+    }
+}
 
 
 //Foam::triangulatedMesh::triangulatedMesh
@@ -744,9 +826,7 @@ void Foam::cellShapeControlMesh::insertBoundingPoints
 
 void Foam::cellShapeControlMesh::write() const
 {
-    Info<< "Writing cell size and alignment mesh" << endl;
-
-    const fileName name("cellSizeAndAlignmentMesh");
+    Info<< "Writing " << meshSubDir << endl;
 
     // Reindex the cells
     label cellCount = 0;
@@ -763,17 +843,16 @@ void Foam::cellShapeControlMesh::write() const
         }
     }
 
-    labelList vertexMap;
+    DelaunayMesh<CellSizeDelaunay>::labelTolabelPairHashTable vertexMap;
     labelList cellMap;
 
-    autoPtr<fvMesh> meshPtr = DelaunayMesh<CellSizeDelaunay>::createMesh
+    autoPtr<polyMesh> meshPtr = DelaunayMesh<CellSizeDelaunay>::createMesh
     (
-        name,
-        runTime_,
+        meshSubDir,
         vertexMap,
         cellMap
     );
-    const fvMesh& mesh = meshPtr();
+    const polyMesh& mesh = meshPtr();
 
     pointScalarField sizes
     (
@@ -781,7 +860,8 @@ void Foam::cellShapeControlMesh::write() const
         (
             "sizes",
             mesh.time().timeName(),
-            mesh,
+            meshSubDir,
+            mesh.time(),
             IOobject::NO_READ,
             IOobject::AUTO_WRITE
         ),
@@ -789,7 +869,22 @@ void Foam::cellShapeControlMesh::write() const
         scalar(0)
     );
 
-    OFstream str(runTime_.path()/"alignments.obj");
+    triadIOField alignments
+    (
+        IOobject
+        (
+            "alignments",
+            mesh.time().timeName(),
+            meshSubDir,
+            mesh.time(),
+            IOobject::NO_READ,
+            IOobject::AUTO_WRITE
+        ),
+        sizes.size()
+    );
+
+    // Write alignments
+//    OFstream str(runTime_.path()/"alignments.obj");
 
     for
     (
@@ -801,35 +896,41 @@ void Foam::cellShapeControlMesh::write() const
         if (!vit->farPoint())
         {
             // Populate sizes
-            sizes[vertexMap[vit->index()]] = vit->targetCellSize();
-
-            // Write alignments
-            const tensor& alignment = vit->alignment();
-            pointFromPoint pt = topoint(vit->point());
-
-            if
-            (
-                alignment.x() == triad::unset[0]
-             || alignment.y() == triad::unset[0]
-             || alignment.z() == triad::unset[0]
-            )
-            {
-                Info<< "Bad alignment = " << vit->info();
+            sizes[vertexMap[labelPair(vit->index(), vit->procIndex())]] =
+                vit->targetCellSize();
 
-                vit->alignment() = tensor::I;
+            alignments[vertexMap[labelPair(vit->index(), vit->procIndex())]] =
+                vit->alignment();
 
-                Info<< "New alignment = " << vit->info();
-
-                continue;
-            }
-
-            meshTools::writeOBJ(str, pt, alignment.x() + pt);
-            meshTools::writeOBJ(str, pt, alignment.y() + pt);
-            meshTools::writeOBJ(str, pt, alignment.z() + pt);
+//            // Write alignments
+//            const tensor& alignment = vit->alignment();
+//            pointFromPoint pt = topoint(vit->point());
+//
+//            if
+//            (
+//                alignment.x() == triad::unset[0]
+//             || alignment.y() == triad::unset[0]
+//             || alignment.z() == triad::unset[0]
+//            )
+//            {
+//                Info<< "Bad alignment = " << vit->info();
+//
+//                vit->alignment() = tensor::I;
+//
+//                Info<< "New alignment = " << vit->info();
+//
+//                continue;
+//            }
+//
+//            meshTools::writeOBJ(str, pt, alignment.x() + pt);
+//            meshTools::writeOBJ(str, pt, alignment.y() + pt);
+//            meshTools::writeOBJ(str, pt, alignment.z() + pt);
         }
     }
 
     mesh.write();
+    sizes.write();
+    alignments.write();
 }
 
 
diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControlMesh/cellShapeControlMesh.H b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControlMesh/cellShapeControlMesh.H
index effb7ee4482289d239b9ee40d409af6f5316522d..e6af5bde0f6520065df2c8b264cb1aa3461e71a1 100644
--- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControlMesh/cellShapeControlMesh.H
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/cellShapeControl/cellShapeControlMesh/cellShapeControlMesh.H
@@ -95,6 +95,9 @@ public:
     //- Runtime type information
     ClassName("cellShapeControlMesh");
 
+    //- Return the mesh sub-directory name (usually "cellShapeControlMesh")
+    static word meshSubDir;
+
 
     // Constructors
 
diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/cellShapeControl/controlMeshRefinement/controlMeshRefinement.C b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/cellShapeControl/controlMeshRefinement/controlMeshRefinement.C
index 8d4cac11ba2ec90cf08bb519de5f11aa359fb725..5a4b0c785a8b4821f40d45063975ee8ce605f324 100644
--- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/cellShapeControl/controlMeshRefinement/controlMeshRefinement.C
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/cellShapeControl/controlMeshRefinement/controlMeshRefinement.C
@@ -223,6 +223,13 @@ void Foam::controlMeshRefinement::initialMeshPopulation
     const autoPtr<backgroundMeshDecomposition>& decomposition
 )
 {
+    if (shapeController_.shapeControlMesh().vertexCount() > 0)
+    {
+        // Mesh already populated.
+        Info<< "Cell size and alignment mesh already populated." << endl;
+        return;
+    }
+
     autoPtr<boundBox> overallBoundBox;
 
     // Need to pass in the background mesh decomposition so that can test if
@@ -268,7 +275,7 @@ void Foam::controlMeshRefinement::initialMeshPopulation
 
         controlFunction.initialVertices(pts, sizes, alignments);
 
-        Info<< "    Got initial vertices list" << endl;
+        Info<< "    Got initial vertices list of size " << pts.size() << endl;
 
         List<Vb> vertices(pts.size());
 
diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.C b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.C
index 577d81cdcb21e21359d834788a54a4216527d903..0c983bfdd8c30eb9acdd8568ccabaa8321589e40 100644
--- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.C
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.C
@@ -981,7 +981,7 @@ Foam::conformalVoronoiMesh::conformalVoronoiMesh
     const dictionary& foamyHexMeshDict
 )
 :
-    DistributedDelaunayMesh<Delaunay>(),
+    DistributedDelaunayMesh<Delaunay>(runTime),
     runTime_(runTime),
     rndGen_(64293*Pstream::myProcNo()),
     foamyHexMeshControls_(foamyHexMeshDict),
@@ -1135,8 +1135,6 @@ void Foam::conformalVoronoiMesh::initialiseForMotion()
             Foam::indexedVertexEnum::vtExternalFeaturePoint
         );
     }
-
-    //writeFixedPoints("fixedPointsStart.obj");
 }
 
 
@@ -1814,32 +1812,6 @@ void Foam::conformalVoronoiMesh::move()
     if (time().outputTime())
     {
         writeMesh(time().timeName());
-
-//        label cellI = 0;
-//        for
-//        (
-//            Finite_cells_iterator cit = finite_cells_begin();
-//            cit != finite_cells_end();
-//            ++cit
-//        )
-//        {
-//            if
-//            (
-//                !cit->hasFarPoint()
-//             && !is_infinite(cit)
-//            )
-//            {
-//                cit->cellIndex() = cellI++;
-//            }
-//        }
-//
-//        labelList vertexMap;
-//        labelList cellMap;
-//        autoPtr<fvMesh> tetMesh =
-//            createMesh("tetMesh", runTime_, vertexMap, cellMap);
-//
-//        tetMesh().write();
-        //writeFixedPoints("fixedPointsStart_" + runTime_.timeName() + ".obj");
     }
 
     updateSizesAndAlignments(pointsToInsert);
diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshCalcDualMesh.C b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshCalcDualMesh.C
index 07d93d9f879c59992c2137f3b85381d9670b7f95..b5810855dfb1e6a652f607d522c5e4baadc70d60 100644
--- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshCalcDualMesh.C
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshCalcDualMesh.C
@@ -2808,7 +2808,7 @@ void Foam::conformalVoronoiMesh::createFacesOwnerNeighbourAndPatches
         patchPointPairSlaves[patchI].transfer(patchPPSlaves[patchI]);
     }
 
-//    if (foamyHexMeshControls().objOutput())
+    if (foamyHexMeshControls().objOutput())
     {
         Info<< "Writing processor interfaces" << endl;
 
diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshI.H b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshI.H
index a669871e04eaa41ec81eb3cd59e04c228ef11452..a912515fb311b84588d33f190f6e51ca5b510dc5 100644
--- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshI.H
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshI.H
@@ -337,11 +337,10 @@ inline void Foam::conformalVoronoiMesh::createPointPair
     const Foam::point internalPt = surfPt - ppDistn;
     const Foam::point externalPt = surfPt + ppDistn;
 
-    if
-    (
-        geometryToConformTo_.inside(internalPt)
-     && geometryToConformTo_.outside(externalPt)
-    )
+    bool internalInside = geometryToConformTo_.inside(internalPt);
+    bool externalOutside = geometryToConformTo_.outside(externalPt);
+
+    if (internalInside && externalOutside)
     {
         pts.append
         (
@@ -369,11 +368,8 @@ inline void Foam::conformalVoronoiMesh::createPointPair
     {
         Info<< "Warning: point pair not inside/outside" << nl
             << "    surfPt = " << surfPt << nl
-            << "    internal = "
-            << internalPt << " " << geometryToConformTo_.inside(internalPt)
-            << nl
-            << "    external = "
-            << externalPt << " " << geometryToConformTo_.outside(externalPt)
+            << "    internal = " << internalPt << " " << internalInside << nl
+            << "    external = " << externalPt << " " << externalOutside
             << endl;
     }
 }
diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshIO.C b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshIO.C
index d60cae8c2207d17f348fdbb8267ef03124e65d9a..3cef2304d6792e64a97b0746183391d5b06cdbb5 100644
--- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshIO.C
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshIO.C
@@ -421,202 +421,247 @@ void Foam::conformalVoronoiMesh::writeMesh(const fileName& instance)
         }
     }
 
-    if (foamyHexMeshControls().writeTetDualMesh())
+    if (foamyHexMeshControls().writeCellShapeControlMesh())
     {
-        // Determine map from Delaunay vertex to Dual mesh
-        // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-        // From all Delaunay vertices to cell (positive index)
-        // or patch face (negative index)
-        labelList vertexToDualAddressing(number_of_vertices(), 0);
-
-        forAll(cellToDelaunayVertex, cellI)
-        {
-            label vertI = cellToDelaunayVertex[cellI];
-
-            if (vertexToDualAddressing[vertI] != 0)
-            {
-                FatalErrorIn("conformalVoronoiMesh::writeMesh(..)")
-                    << "Delaunay vertex " << vertI
-                    << " from cell " << cellI
-                    << " is already mapped to "
-                    << vertexToDualAddressing[vertI]
-                    << exit(FatalError);
-            }
-            vertexToDualAddressing[vertI] = cellI+1;
-        }
-
-        forAll(patchToDelaunayVertex, patchI)
-        {
-            const labelList& patchVertices = patchToDelaunayVertex[patchI];
-
-            forAll(patchVertices, i)
-            {
-                label vertI = patchVertices[i];
-
-                if (vertexToDualAddressing[vertI] > 0)
-                {
-                    FatalErrorIn("conformalVoronoiMesh::writeMesh(..)")
-                        << "Delaunay vertex " << vertI
-                        << " from patch " << patchI
-                        << " local index " << i
-                        << " is already mapped to cell "
-                        << vertexToDualAddressing[vertI]-1
-                        << exit(FatalError);
-                }
-
-                // Vertex might be used by multiple faces. Which one to
-                // use? For now last one wins.
-                label dualFaceI = dualPatchStarts[patchI]+i;
-                vertexToDualAddressing[vertI] = -dualFaceI-1;
-            }
-        }
-
-
-        // Calculate tet mesh addressing
-        // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+        cellShapeControls().shapeControlMesh().write();
+    }
 
-        pointField points;
-        labelList boundaryPts(number_of_finite_cells(), -1);
-        // From tet point back to Delaunay vertex index
-        labelList pointToDelaunayVertex;
-        faceList faces;
-        labelList owner;
-        labelList neighbour;
-        wordList patchTypes;
-        wordList patchNames;
-        PtrList<dictionary> patchDicts;
-        pointField cellCentres;
+    if (foamyHexMeshControls().writeBackgroundMeshDecomposition())
+    {
+        Info<< nl << "Writing " << "backgroundMeshDecomposition" << endl;
 
-        calcTetMesh
+        // Have to explicitly update the mesh instance.
+        const_cast<fvMesh&>(decomposition_().mesh()).setInstance
         (
-            points,
-            pointToDelaunayVertex,
-            faces,
-            owner,
-            neighbour,
-            patchTypes,
-            patchNames,
-            patchDicts
+            time().timeName()
         );
 
+        decomposition_().mesh().write();
+    }
 
-
-        // Calculate map from tet points to dual mesh cells/patch faces
-        // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-        labelIOList pointDualAddressing
+    if (foamyHexMeshControls().writeTetDualMesh())
+    {
+        label cellI = 0;
+        for
         (
-            IOobject
-            (
-                "pointDualAddressing",
-                instance,
-                "tetDualMesh"/polyMesh::meshSubDir,
-                runTime_,
-                IOobject::NO_READ,
-                IOobject::AUTO_WRITE,
-                false
-            ),
-            UIndirectList<label>
-            (
-                vertexToDualAddressing,
-                pointToDelaunayVertex
-            )()
-        );
-
-        label pointI = findIndex(pointDualAddressing, -1);
-        if (pointI != -1)
-        {
-            WarningIn
-            (
-                "conformalVoronoiMesh::writeMesh\n"
-                "(\n"
-                "    const fileName& instance,\n"
-                "    bool filterFaces\n"
-                ")\n"
-            )   << "Delaunay vertex " << pointI
-                << " does not have a corresponding dual cell." << endl;
-        }
-
-        Info<< "Writing map from tetDualMesh points to Voronoi mesh to "
-            << pointDualAddressing.objectPath() << endl;
-        pointDualAddressing.write();
-
-
-
-        // Write tet points corresponding to the Voronoi cell/face centre
-        // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+            Finite_cells_iterator cit = finite_cells_begin();
+            cit != finite_cells_end();
+            ++cit
+        )
         {
-            // Read Voronoi mesh
-            fvMesh mesh
-            (
-                IOobject
-                (
-                    Foam::polyMesh::defaultRegion,
-                    instance,
-                    runTime_,
-                    IOobject::MUST_READ
-                )
-            );
-            pointIOField dualPoints
+            if
             (
-                IOobject
-                (
-                    "dualPoints",
-                    instance,
-                    "tetDualMesh"/polyMesh::meshSubDir,
-                    runTime_,
-                    IOobject::NO_READ,
-                    IOobject::AUTO_WRITE,
-                    false
-                ),
-                points
-            );
-
-            forAll(pointDualAddressing, pointI)
+                !cit->hasFarPoint()
+             && !is_infinite(cit)
+            )
             {
-                label index = pointDualAddressing[pointI];
-
-                if (index > 0)
-                {
-                    label cellI = index-1;
-                    dualPoints[pointI] = mesh.cellCentres()[cellI];
-                }
-                else if (index < 0)
-                {
-                    label faceI = -index-1;
-                    if (faceI >= mesh.nInternalFaces())
-                    {
-                        dualPoints[pointI] = mesh.faceCentres()[faceI];
-                    }
-                }
+                cit->cellIndex() = cellI++;
             }
-
-            Info<< "Writing new tetDualMesh points mapped onto Voronoi mesh to "
-                << dualPoints.objectPath() << endl
-                << "Replace the polyMesh/points with these." << endl;
-            dualPoints.write();
         }
 
+        Info<< nl << "Writing " << "tetDualMesh" << endl;
 
-        Info<< nl << "Writing tetDualMesh to " << instance << endl;
+        DistributedDelaunayMesh<Delaunay>::labelTolabelPairHashTable vertexMap;
+        labelList cellMap;
+        autoPtr<polyMesh> tetMesh =
+            createMesh("tetDualMesh", vertexMap, cellMap);
 
-        PackedBoolList boundaryFacesToRemove;
-        writeMesh
-        (
-            "tetDualMesh",
-            instance,
-            points,
-            boundaryPts,
-            faces,
-            owner,
-            neighbour,
-            patchTypes,
-            patchNames,
-            patchDicts,
-            cellCentres,
-            boundaryFacesToRemove
-        );
+        tetMesh().write();
+
+//        // Determine map from Delaunay vertex to Dual mesh
+//        // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+//        // From all Delaunay vertices to cell (positive index)
+//        // or patch face (negative index)
+//        labelList vertexToDualAddressing(number_of_vertices(), 0);
+//
+//        forAll(cellToDelaunayVertex, cellI)
+//        {
+//            label vertI = cellToDelaunayVertex[cellI];
+//
+//            if (vertexToDualAddressing[vertI] != 0)
+//            {
+//                FatalErrorIn("conformalVoronoiMesh::writeMesh(..)")
+//                    << "Delaunay vertex " << vertI
+//                    << " from cell " << cellI
+//                    << " is already mapped to "
+//                    << vertexToDualAddressing[vertI]
+//                    << exit(FatalError);
+//            }
+//            vertexToDualAddressing[vertI] = cellI+1;
+//        }
+//
+//        forAll(patchToDelaunayVertex, patchI)
+//        {
+//            const labelList& patchVertices = patchToDelaunayVertex[patchI];
+//
+//            forAll(patchVertices, i)
+//            {
+//                label vertI = patchVertices[i];
+//
+//                if (vertexToDualAddressing[vertI] > 0)
+//                {
+//                    FatalErrorIn("conformalVoronoiMesh::writeMesh(..)")
+//                        << "Delaunay vertex " << vertI
+//                        << " from patch " << patchI
+//                        << " local index " << i
+//                        << " is already mapped to cell "
+//                        << vertexToDualAddressing[vertI]-1
+//                        << exit(FatalError);
+//                }
+//
+//                // Vertex might be used by multiple faces. Which one to
+//                // use? For now last one wins.
+//                label dualFaceI = dualPatchStarts[patchI]+i;
+//                vertexToDualAddressing[vertI] = -dualFaceI-1;
+//            }
+//        }
+//
+//
+//        // Calculate tet mesh addressing
+//        // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+//        pointField points;
+//        labelList boundaryPts(number_of_finite_cells(), -1);
+//        // From tet point back to Delaunay vertex index
+//        labelList pointToDelaunayVertex;
+//        faceList faces;
+//        labelList owner;
+//        labelList neighbour;
+//        wordList patchTypes;
+//        wordList patchNames;
+//        PtrList<dictionary> patchDicts;
+//        pointField cellCentres;
+//
+//        calcTetMesh
+//        (
+//            points,
+//            pointToDelaunayVertex,
+//            faces,
+//            owner,
+//            neighbour,
+//            patchTypes,
+//            patchNames,
+//            patchDicts
+//        );
+//
+//
+//
+//        // Calculate map from tet points to dual mesh cells/patch faces
+//        // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+//        labelIOList pointDualAddressing
+//        (
+//            IOobject
+//            (
+//                "pointDualAddressing",
+//                instance,
+//                "tetDualMesh"/polyMesh::meshSubDir,
+//                runTime_,
+//                IOobject::NO_READ,
+//                IOobject::AUTO_WRITE,
+//                false
+//            ),
+//            UIndirectList<label>
+//            (
+//                vertexToDualAddressing,
+//                pointToDelaunayVertex
+//            )()
+//        );
+//
+//        label pointI = findIndex(pointDualAddressing, -1);
+//        if (pointI != -1)
+//        {
+//            WarningIn
+//            (
+//                "conformalVoronoiMesh::writeMesh\n"
+//                "(\n"
+//                "    const fileName& instance,\n"
+//                "    bool filterFaces\n"
+//                ")\n"
+//            )   << "Delaunay vertex " << pointI
+//                << " does not have a corresponding dual cell." << endl;
+//        }
+//
+//        Info<< "Writing map from tetDualMesh points to Voronoi mesh to "
+//            << pointDualAddressing.objectPath() << endl;
+//        pointDualAddressing.write();
+//
+//
+//
+//        // Write tet points corresponding to the Voronoi cell/face centre
+//        // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//        {
+//            // Read Voronoi mesh
+//            fvMesh mesh
+//            (
+//                IOobject
+//                (
+//                    Foam::polyMesh::defaultRegion,
+//                    instance,
+//                    runTime_,
+//                    IOobject::MUST_READ
+//                )
+//            );
+//            pointIOField dualPoints
+//            (
+//                IOobject
+//                (
+//                    "dualPoints",
+//                    instance,
+//                    "tetDualMesh"/polyMesh::meshSubDir,
+//                    runTime_,
+//                    IOobject::NO_READ,
+//                    IOobject::AUTO_WRITE,
+//                    false
+//                ),
+//                points
+//            );
+//
+//            forAll(pointDualAddressing, pointI)
+//            {
+//                label index = pointDualAddressing[pointI];
+//
+//                if (index > 0)
+//                {
+//                    label cellI = index-1;
+//                    dualPoints[pointI] = mesh.cellCentres()[cellI];
+//                }
+//                else if (index < 0)
+//                {
+//                    label faceI = -index-1;
+//                    if (faceI >= mesh.nInternalFaces())
+//                    {
+//                        dualPoints[pointI] = mesh.faceCentres()[faceI];
+//                    }
+//                }
+//            }
+//
+//            Info<< "Writing tetDualMesh points mapped onto Voronoi mesh to "
+//                << dualPoints.objectPath() << endl
+//                << "Replace the polyMesh/points with these." << endl;
+//            dualPoints.write();
+//        }
+//
+//
+//        Info<< nl << "Writing tetDualMesh to " << instance << endl;
+//
+//        PackedBoolList boundaryFacesToRemove;
+//        writeMesh
+//        (
+//            "tetDualMesh",
+//            instance,
+//            points,
+//            boundaryPts,
+//            faces,
+//            owner,
+//            neighbour,
+//            patchTypes,
+//            patchNames,
+//            patchDicts,
+//            cellCentres,
+//            boundaryFacesToRemove
+//        );
     }
 }
 
diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/cvControls/cvControls.C b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/cvControls/cvControls.C
index 48cd76c23df3ae37f42cb69426d9542b942da966..04eb4f36634d6680bd933cc2f9f69b73d3645fc5 100644
--- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/cvControls/cvControls.C
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/cvControls/cvControls.C
@@ -247,6 +247,20 @@ Foam::cvControls::cvControls
     }
 
     writeTetDualMesh_ = Switch(filteringDict.lookup("writeTetDualMesh"));
+
+    writeCellShapeControlMesh_ =
+        Switch(filteringDict.lookup("writeCellShapeControlMesh"));
+
+    if (Pstream::parRun())
+    {
+        writeBackgroundMeshDecomposition_ =
+            Switch(filteringDict.lookup("writeBackgroundMeshDecomposition"));
+    }
+    else
+    {
+        writeBackgroundMeshDecomposition_ = Switch(false);
+    }
+
 }
 
 
diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/cvControls/cvControls.H b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/cvControls/cvControls.H
index 6c1c83e05ba1d3ed9fd47d19a8671fa367e9b7df..1f1fe356cda55357114c046bdc60d43cf7654aeb 100644
--- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/cvControls/cvControls.H
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/cvControls/cvControls.H
@@ -202,6 +202,10 @@ class cvControls
         //- Write tet mesh at output time (it always writes the Voronoi)
         Switch writeTetDualMesh_;
 
+        Switch writeCellShapeControlMesh_;
+
+        Switch writeBackgroundMeshDecomposition_;
+
 
     // Private Member Functions
 
@@ -335,6 +339,12 @@ public:
 
             //- Write tetMesh at output time
             inline Switch writeTetDualMesh() const;
+
+            //- Write cellShapeControlMesh at output time
+            inline Switch writeCellShapeControlMesh() const;
+
+            //- Write backgroundMeshDecomposition at output time
+            inline Switch writeBackgroundMeshDecomposition() const;
 };
 
 
diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/cvControls/cvControlsI.H b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/cvControls/cvControlsI.H
index ae05b421e207a4a6af8b08adb007e118397bb469..f4408f204e9d9fb7997313b604d8a4026aeecff1 100644
--- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/cvControls/cvControlsI.H
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/cvControls/cvControlsI.H
@@ -215,5 +215,15 @@ inline Foam::Switch Foam::cvControls::writeTetDualMesh() const
     return writeTetDualMesh_;
 }
 
+inline Foam::Switch Foam::cvControls::writeCellShapeControlMesh() const
+{
+    return writeCellShapeControlMesh_;
+}
+
+inline Foam::Switch Foam::cvControls::writeBackgroundMeshDecomposition() const
+{
+    return writeBackgroundMeshDecomposition_;
+}
+
 
 // ************************************************************************* //
diff --git a/bin/tools/foamConfigurePaths b/bin/tools/foamConfigurePaths
index 254f5e4380ff7273d682b41e311b20ada7787d86..34c6fc200431223d26407fbbefe37d22ff7f78f4 100755
--- a/bin/tools/foamConfigurePaths
+++ b/bin/tools/foamConfigurePaths
@@ -41,6 +41,8 @@ usage: ${0##*/}
   --archOption arch         specify architecture option (only 32 or 64 applicable)
   --paraviewInstall dir     specify ParaView_DIR (e.g. /opt/paraviewopenfoam3120)
   --paraviewVersion ver     specify ParaView_VERSION (e.g. 3.12.0)
+  --scotchArchPath dir      specify SCOTCH_ARCH_PATH (e.g. /opt/OpenFOAM-scotch-6.0.0/)
+  --scotchVersion ver       specify SCOTCH_VERSION (e.g. 6.0.0)
 
 * hardcode paths to installation
 
@@ -49,32 +51,6 @@ USAGE
 }
 
 
-# Function to do replacement on file. Checks if any replacement has been done.
-# inlineSed <file> <sedCommand> <description>
-#_inlineSed()
-#{
-#    [ -f "$1" ] || {
-#        echo "Missing file: $1"
-#        exit 1
-#    }
-#
-#    backup="temp.$$"
-#    cp $1 $backup
-#    sed -i -e "$2" $1
-#
-#    if cmp $1 $backup > /dev/null 2>&1
-#    then
-#        echo "Failed: $3 in $1"
-#        rm $backup 2>/dev/null
-#        exit 1
-#    else
-#        echo "Okay: $3 in $1"
-#        rm $backup 2>/dev/null
-#    fi
-#
-#    return 0
-#}
-
 # Function to do replacement on file. Checks if any replacement has been done.
 # _inlineSed <file> <regexp> <replacement> <msg>
 _inlineSed()
@@ -103,7 +79,8 @@ _inlineSed()
 
 [ -f etc/bashrc ] || usage "Please run from top-level directory of installation"
 
-unset foamInstall projectName projectVersion archOption paraviewInstall
+unset foamInstall projectName projectVersion archOption
+unset paraviewInstall scotchArchPath
 
 # parse options
 while [ "$#" -gt 0 ]
@@ -172,7 +149,7 @@ do
             etc/config/paraview.sh \
             'ParaView_DIR=.*' \
             'ParaView_DIR='"$paraviewInstall" \
-             "Replacing ParaView_DIR setting by '$paraviewInstall'"
+            "Replacing ParaView_DIR setting by '$paraviewInstall'"
         shift 2
         ;;
     -paraviewVersion | --paraviewVersion)
@@ -186,13 +163,36 @@ do
             "Replacing ParaView_VERSION setting by '$paraviewVersion'"
         shift 2
         ;;
+    -scotchVersion | --scotchVersion)
+        [ "$#" -ge 2 ] || usage "'$1' option requires an argument"
+        scotchVersion="$2"
+        _inlineSed \
+            etc/config/scotch.sh \
+            'SCOTCH_VERSION=.*' \
+            'SCOTCH_VERSION='"$scotchVersion" \
+            "Replacing SCOTCH_VERSION setting by '$scotchVersion'"
+        shift 2
+        ;;
+    -scotchArchPath | --scotchArchPath)
+        [ "$#" -ge 2 ] || usage "'$1' option requires an argument"
+        scotchArchPath="$2"
+        _inlineSed \
+            etc/config/scotch.sh \
+            'SCOTCH_ARCH_PATH=.*' \
+            'SCOTCH_ARCH_PATH='"$scotchArchPath" \
+            "Replacing SCOTCH_ARCH_PATH setting by '$scotchArchPath'"
+        shift 2
+        ;;
     *)
         usage "unknown option/argument: '$*'"
         ;;
     esac
 done
 
-[ -n "$foamInstall" -o -n "$projectName" -o -n "$projectVersion" -o -n "$archOption" -o -n "$paraviewInstall" -o -n "$paraviewVersion" ] || usage "Please specify at least one configure option"
+[ -n "$foamInstall" -o -n "$projectName" -o -n "$projectVersion" -o -n "$archOption" \
+-o -n "$paraviewInstall" -o -n "$paraviewVersion" \
+-o -n "$scotchVersion" -o -n "$scotchArchPath" \
+] || usage "Please specify at least one configure option"
 
 #echo "Replacing WM_PROJECT setting by '$projectName'"
 #sed -i -e 's@WM_PROJECT=.*@WM_PROJECT='"$projectName@" etc/bashrc
diff --git a/etc/caseDicts/foamyHexMeshDict b/etc/caseDicts/foamyHexMeshDict
index cd0c9367a3041bb5e30ef65831dedd1dd6bc3962..c866c832adc595f601186d31873d2f7469f09410 100644
--- a/etc/caseDicts/foamyHexMeshDict
+++ b/etc/caseDicts/foamyHexMeshDict
@@ -107,9 +107,11 @@ motionControl
 
 polyMeshFiltering
 {
-    filterEdges         on;
-    filterFaces         off;
-    writeTetDualMesh    false;
+    filterEdges                         on;
+    filterFaces                         off;
+    writeTetDualMesh                    true;
+    writeCellShapeControlMesh           true;
+    writeBackgroundMeshDecomposition    true;
 }
 
 
diff --git a/src/OpenFOAM/db/IOobject/IOobjectWriteHeader.C b/src/OpenFOAM/db/IOobject/IOobjectWriteHeader.C
index 638d3e209505df01596b77ccd532268e8afe47a0..5c9fd3210ddbd335194458b0fabece9916696d16 100644
--- a/src/OpenFOAM/db/IOobject/IOobjectWriteHeader.C
+++ b/src/OpenFOAM/db/IOobject/IOobjectWriteHeader.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2013 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -28,6 +28,7 @@ Description
 \*---------------------------------------------------------------------------*/
 
 #include "IOobject.H"
+#include "objectRegistry.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -53,7 +54,7 @@ bool Foam::IOobject::writeHeader(Ostream& os, const word& type) const
         os  << "    note        " << note() << ";\n";
     }
 
-    os  << "    location    " << instance()/local() << ";\n"
+    os  << "    location    " << instance()/db().dbDir()/local() << ";\n"
         << "    object      " << name() << ";\n"
         << "}" << nl;
 
diff --git a/src/OpenFOAM/meshes/primitiveShapes/tetrahedron/tetrahedron.H b/src/OpenFOAM/meshes/primitiveShapes/tetrahedron/tetrahedron.H
index 1900aee38728abaebbf70ea16e6596969a47ebcc..6ecdfddbabfc8d07d8fbf2dc445efbf951a65ee8 100644
--- a/src/OpenFOAM/meshes/primitiveShapes/tetrahedron/tetrahedron.H
+++ b/src/OpenFOAM/meshes/primitiveShapes/tetrahedron/tetrahedron.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2013 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -252,7 +252,7 @@ public:
                 List<scalar>& bary
             ) const;
 
-            //- Return nearest point to p on  tetrahedron. Is p itself
+            //- Return nearest point to p on tetrahedron. Is p itself
             //  if inside.
             inline pointHit nearestPoint(const point& p) const;
 
diff --git a/tutorials/mesh/foamyHexMesh/blob/Allrun-parallel b/tutorials/mesh/foamyHexMesh/blob/Allrun-parallel
index dcb5474b1367094e55d1255c6f107326161c988f..3113b19787164c7bc76f5c6d889b8eb45b971a5c 100755
--- a/tutorials/mesh/foamyHexMesh/blob/Allrun-parallel
+++ b/tutorials/mesh/foamyHexMesh/blob/Allrun-parallel
@@ -10,8 +10,8 @@ nProc=$(getNumberOfProcessors)
 # copy flange surface from resources folder
 cp $FOAM_TUTORIALS/resources/geometry/blob.stl.gz constant/triSurface/
 
-runApplication blockMesh
-runApplication decomposePar
+runApplication blockMesh -region backgroundMeshDecomposition
+runApplication decomposePar -region backgroundMeshDecomposition
 
 runParallel foamyHexMesh $nProc
 runParallel collapseEdges $nProc -latestTime -collapseFaces
diff --git a/tutorials/mesh/foamyHexMesh/blob/constant/polyMesh/blockMeshDict b/tutorials/mesh/foamyHexMesh/blob/constant/backgroundMeshDecomposition/polyMesh/blockMeshDict
similarity index 100%
rename from tutorials/mesh/foamyHexMesh/blob/constant/polyMesh/blockMeshDict
rename to tutorials/mesh/foamyHexMesh/blob/constant/backgroundMeshDecomposition/polyMesh/blockMeshDict
diff --git a/tutorials/mesh/foamyHexMesh/blob/system/backgroundMeshDecomposition/decomposeParDict b/tutorials/mesh/foamyHexMesh/blob/system/backgroundMeshDecomposition/decomposeParDict
new file mode 100644
index 0000000000000000000000000000000000000000..3d3806e87382b1f4fef074e2aad6f535c98881b6
--- /dev/null
+++ b/tutorials/mesh/foamyHexMesh/blob/system/backgroundMeshDecomposition/decomposeParDict
@@ -0,0 +1,47 @@
+/*--------------------------------*- 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      decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 2;
+
+method          scotch;
+//method          ptscotch;
+// method          hierarchical;
+
+simpleCoeffs
+{
+    n               ( 2 2 1 );
+    delta           0.001;
+}
+
+hierarchicalCoeffs
+{
+    n               ( 2 1 1 );
+    delta           0.001;
+    order           xyz;
+}
+
+manualCoeffs
+{
+    dataFile        "";
+}
+
+distributed     no;
+
+roots           ( );
+
+
+// ************************************************************************* //
diff --git a/tutorials/mesh/foamyHexMesh/blob/system/backgroundMeshDecomposition/fvSchemes b/tutorials/mesh/foamyHexMesh/blob/system/backgroundMeshDecomposition/fvSchemes
new file mode 120000
index 0000000000000000000000000000000000000000..288d536c8b0f5fc598f73b75a3b34168659b9df5
--- /dev/null
+++ b/tutorials/mesh/foamyHexMesh/blob/system/backgroundMeshDecomposition/fvSchemes
@@ -0,0 +1 @@
+../fvSchemes
\ No newline at end of file
diff --git a/tutorials/mesh/foamyHexMesh/blob/system/backgroundMeshDecomposition/fvSolution b/tutorials/mesh/foamyHexMesh/blob/system/backgroundMeshDecomposition/fvSolution
new file mode 120000
index 0000000000000000000000000000000000000000..4a4e96ba76f1b7aa611bd7956bfcaef773bbfa44
--- /dev/null
+++ b/tutorials/mesh/foamyHexMesh/blob/system/backgroundMeshDecomposition/fvSolution
@@ -0,0 +1 @@
+../fvSolution
\ No newline at end of file
diff --git a/tutorials/mesh/foamyHexMesh/blob/system/decomposeParDict b/tutorials/mesh/foamyHexMesh/blob/system/decomposeParDict
deleted file mode 100644
index 3d3806e87382b1f4fef074e2aad6f535c98881b6..0000000000000000000000000000000000000000
--- a/tutorials/mesh/foamyHexMesh/blob/system/decomposeParDict
+++ /dev/null
@@ -1,47 +0,0 @@
-/*--------------------------------*- 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      decomposeParDict;
-}
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-numberOfSubdomains 2;
-
-method          scotch;
-//method          ptscotch;
-// method          hierarchical;
-
-simpleCoeffs
-{
-    n               ( 2 2 1 );
-    delta           0.001;
-}
-
-hierarchicalCoeffs
-{
-    n               ( 2 1 1 );
-    delta           0.001;
-    order           xyz;
-}
-
-manualCoeffs
-{
-    dataFile        "";
-}
-
-distributed     no;
-
-roots           ( );
-
-
-// ************************************************************************* //
diff --git a/tutorials/mesh/foamyHexMesh/blob/system/decomposeParDict b/tutorials/mesh/foamyHexMesh/blob/system/decomposeParDict
new file mode 120000
index 0000000000000000000000000000000000000000..6fe38b15ec13cdd9b1d68fbf890f865afd36d644
--- /dev/null
+++ b/tutorials/mesh/foamyHexMesh/blob/system/decomposeParDict
@@ -0,0 +1 @@
+backgroundMeshDecomposition/decomposeParDict
\ No newline at end of file
diff --git a/tutorials/mesh/foamyHexMesh/flange/Allrun-parallel b/tutorials/mesh/foamyHexMesh/flange/Allrun-parallel
index 2542d324d9d807af91c453e319d01015079c3fad..237296826d54b95fa01b1298bdc5425a333ca772 100755
--- a/tutorials/mesh/foamyHexMesh/flange/Allrun-parallel
+++ b/tutorials/mesh/foamyHexMesh/flange/Allrun-parallel
@@ -11,12 +11,8 @@ nProc=$(getNumberOfProcessors)
 cp $FOAM_TUTORIALS/resources/geometry/flange.stl.gz constant/triSurface/
 
 # Create tight-fitting background mesh
-runApplication blockMesh
-runApplication topoSet -dict system/topoSetDict-background
-mv log.topoSet log.topoSet.background
-runApplication subsetMesh background -patch walls -overwrite
-
-runApplication decomposePar
+runApplication blockMesh -region backgroundMeshDecomposition
+runApplication decomposePar -region backgroundMeshDecomposition
 
 runParallel foamyHexMesh $nProc
 runParallel collapseEdges $nProc -latestTime -collapseFaces
diff --git a/tutorials/mesh/foamyHexMesh/flange/constant/polyMesh/blockMeshDict b/tutorials/mesh/foamyHexMesh/flange/constant/backgroundMeshDecomposition/polyMesh/blockMeshDict
similarity index 100%
rename from tutorials/mesh/foamyHexMesh/flange/constant/polyMesh/blockMeshDict
rename to tutorials/mesh/foamyHexMesh/flange/constant/backgroundMeshDecomposition/polyMesh/blockMeshDict
diff --git a/tutorials/mesh/foamyHexMesh/flange/constant/polyMesh/boundary b/tutorials/mesh/foamyHexMesh/flange/system/backgroundMeshDecomposition/decomposeParDict
similarity index 64%
rename from tutorials/mesh/foamyHexMesh/flange/constant/polyMesh/boundary
rename to tutorials/mesh/foamyHexMesh/flange/system/backgroundMeshDecomposition/decomposeParDict
index efe6bfe832fedad4de807c79b291f6dcc2b14dde..afb5d8a226cc699ab6db67b043e65ba01103f2d7 100644
--- a/tutorials/mesh/foamyHexMesh/flange/constant/polyMesh/boundary
+++ b/tutorials/mesh/foamyHexMesh/flange/system/backgroundMeshDecomposition/decomposeParDict
@@ -9,20 +9,38 @@ FoamFile
 {
     version     2.0;
     format      ascii;
-    class       polyBoundaryMesh;
-    location    "constant/polyMesh";
-    object      boundary;
+    class       dictionary;
+    location    "system";
+    object      decomposeParDict;
 }
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-1
-(
-    walls
-    {
-        type            wall;
-        nFaces          126;
-        startFace       207;
-    }
-)
+numberOfSubdomains 8;
+
+//method          scotch;
+method          hierarchical;
+
+simpleCoeffs
+{
+    n               ( 2 2 2 );
+    delta           0.001;
+}
+
+hierarchicalCoeffs
+{
+    n               ( 2 2 2 );
+    delta           0.001;
+    order           xyz;
+}
+
+manualCoeffs
+{
+    dataFile        "";
+}
+
+distributed     no;
+
+roots           ( );
+
 
 // ************************************************************************* //
diff --git a/tutorials/mesh/foamyHexMesh/flange/system/backgroundMeshDecomposition/fvSchemes b/tutorials/mesh/foamyHexMesh/flange/system/backgroundMeshDecomposition/fvSchemes
new file mode 120000
index 0000000000000000000000000000000000000000..288d536c8b0f5fc598f73b75a3b34168659b9df5
--- /dev/null
+++ b/tutorials/mesh/foamyHexMesh/flange/system/backgroundMeshDecomposition/fvSchemes
@@ -0,0 +1 @@
+../fvSchemes
\ No newline at end of file
diff --git a/tutorials/mesh/foamyHexMesh/flange/system/backgroundMeshDecomposition/fvSolution b/tutorials/mesh/foamyHexMesh/flange/system/backgroundMeshDecomposition/fvSolution
new file mode 120000
index 0000000000000000000000000000000000000000..4a4e96ba76f1b7aa611bd7956bfcaef773bbfa44
--- /dev/null
+++ b/tutorials/mesh/foamyHexMesh/flange/system/backgroundMeshDecomposition/fvSolution
@@ -0,0 +1 @@
+../fvSolution
\ No newline at end of file
diff --git a/tutorials/mesh/foamyHexMesh/flange/system/decomposeParDict b/tutorials/mesh/foamyHexMesh/flange/system/decomposeParDict
deleted file mode 100644
index afb5d8a226cc699ab6db67b043e65ba01103f2d7..0000000000000000000000000000000000000000
--- a/tutorials/mesh/foamyHexMesh/flange/system/decomposeParDict
+++ /dev/null
@@ -1,46 +0,0 @@
-/*--------------------------------*- 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      decomposeParDict;
-}
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-numberOfSubdomains 8;
-
-//method          scotch;
-method          hierarchical;
-
-simpleCoeffs
-{
-    n               ( 2 2 2 );
-    delta           0.001;
-}
-
-hierarchicalCoeffs
-{
-    n               ( 2 2 2 );
-    delta           0.001;
-    order           xyz;
-}
-
-manualCoeffs
-{
-    dataFile        "";
-}
-
-distributed     no;
-
-roots           ( );
-
-
-// ************************************************************************* //
diff --git a/tutorials/mesh/foamyHexMesh/flange/system/decomposeParDict b/tutorials/mesh/foamyHexMesh/flange/system/decomposeParDict
new file mode 120000
index 0000000000000000000000000000000000000000..6fe38b15ec13cdd9b1d68fbf890f865afd36d644
--- /dev/null
+++ b/tutorials/mesh/foamyHexMesh/flange/system/decomposeParDict
@@ -0,0 +1 @@
+backgroundMeshDecomposition/decomposeParDict
\ No newline at end of file
diff --git a/tutorials/mesh/foamyHexMesh/mixerVessel/Allrun b/tutorials/mesh/foamyHexMesh/mixerVessel/Allrun
index bbe4923241e286dd7e5319f63cdfce46c6ac0a18..865325d1b802fec1ab0e46aaaa2087d93715283e 100755
--- a/tutorials/mesh/foamyHexMesh/mixerVessel/Allrun
+++ b/tutorials/mesh/foamyHexMesh/mixerVessel/Allrun
@@ -43,8 +43,8 @@ mv log.surfaceBooleanFeatures log.surfaceBooleanFeatures.stirrer_shaftRotating
 
 runApplication surfaceFeatureExtract
 
-runApplication blockMesh
-runApplication decomposePar
+runApplication blockMesh -region backgroundMeshDecomposition
+runApplication decomposePar -region backgroundMeshDecomposition
 
 runParallel foamyHexMesh $nProcs
 
diff --git a/tutorials/mesh/foamyHexMesh/mixerVessel/constant/polyMesh/blockMeshDict b/tutorials/mesh/foamyHexMesh/mixerVessel/constant/backgroundMeshDecomposition/polyMesh/blockMeshDict
similarity index 100%
rename from tutorials/mesh/foamyHexMesh/mixerVessel/constant/polyMesh/blockMeshDict
rename to tutorials/mesh/foamyHexMesh/mixerVessel/constant/backgroundMeshDecomposition/polyMesh/blockMeshDict
diff --git a/tutorials/mesh/foamyHexMesh/mixerVessel/system/backgroundMeshDecomposition/decomposeParDict b/tutorials/mesh/foamyHexMesh/mixerVessel/system/backgroundMeshDecomposition/decomposeParDict
new file mode 100644
index 0000000000000000000000000000000000000000..24853f860c83fa3934d4a639a8cd06eef84ab905
--- /dev/null
+++ b/tutorials/mesh/foamyHexMesh/mixerVessel/system/backgroundMeshDecomposition/decomposeParDict
@@ -0,0 +1,47 @@
+/*--------------------------------*- 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      decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 8;
+
+//method          ptscotch;
+//method          hierarchical;
+method          scotch;
+
+simpleCoeffs
+{
+    n               ( 2 2 1 );
+    delta           0.001;
+}
+
+hierarchicalCoeffs
+{
+    n               ( 2 2 2 );
+    delta           0.001;
+    order           xyz;
+}
+
+manualCoeffs
+{
+    dataFile        "";
+}
+
+distributed     no;
+
+roots           ( );
+
+
+// ************************************************************************* //
diff --git a/tutorials/mesh/foamyHexMesh/mixerVessel/system/backgroundMeshDecomposition/fvSchemes b/tutorials/mesh/foamyHexMesh/mixerVessel/system/backgroundMeshDecomposition/fvSchemes
new file mode 120000
index 0000000000000000000000000000000000000000..288d536c8b0f5fc598f73b75a3b34168659b9df5
--- /dev/null
+++ b/tutorials/mesh/foamyHexMesh/mixerVessel/system/backgroundMeshDecomposition/fvSchemes
@@ -0,0 +1 @@
+../fvSchemes
\ No newline at end of file
diff --git a/tutorials/mesh/foamyHexMesh/mixerVessel/system/backgroundMeshDecomposition/fvSolution b/tutorials/mesh/foamyHexMesh/mixerVessel/system/backgroundMeshDecomposition/fvSolution
new file mode 120000
index 0000000000000000000000000000000000000000..4a4e96ba76f1b7aa611bd7956bfcaef773bbfa44
--- /dev/null
+++ b/tutorials/mesh/foamyHexMesh/mixerVessel/system/backgroundMeshDecomposition/fvSolution
@@ -0,0 +1 @@
+../fvSolution
\ No newline at end of file
diff --git a/tutorials/mesh/foamyHexMesh/mixerVessel/system/decomposeParDict b/tutorials/mesh/foamyHexMesh/mixerVessel/system/decomposeParDict
deleted file mode 100644
index 24853f860c83fa3934d4a639a8cd06eef84ab905..0000000000000000000000000000000000000000
--- a/tutorials/mesh/foamyHexMesh/mixerVessel/system/decomposeParDict
+++ /dev/null
@@ -1,47 +0,0 @@
-/*--------------------------------*- 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      decomposeParDict;
-}
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-numberOfSubdomains 8;
-
-//method          ptscotch;
-//method          hierarchical;
-method          scotch;
-
-simpleCoeffs
-{
-    n               ( 2 2 1 );
-    delta           0.001;
-}
-
-hierarchicalCoeffs
-{
-    n               ( 2 2 2 );
-    delta           0.001;
-    order           xyz;
-}
-
-manualCoeffs
-{
-    dataFile        "";
-}
-
-distributed     no;
-
-roots           ( );
-
-
-// ************************************************************************* //
diff --git a/tutorials/mesh/foamyHexMesh/mixerVessel/system/decomposeParDict b/tutorials/mesh/foamyHexMesh/mixerVessel/system/decomposeParDict
new file mode 120000
index 0000000000000000000000000000000000000000..6fe38b15ec13cdd9b1d68fbf890f865afd36d644
--- /dev/null
+++ b/tutorials/mesh/foamyHexMesh/mixerVessel/system/decomposeParDict
@@ -0,0 +1 @@
+backgroundMeshDecomposition/decomposeParDict
\ No newline at end of file