diff --git a/applications/utilities/mesh/generation/blockMesh/addCellZones.H b/applications/utilities/mesh/generation/blockMesh/addCellZones.H
index eca57f2ed4a98bcf46cd04fc2b4e9fe0929e4863..7cec1b4541d1553571d30afa2aac3b841f6c3d51 100644
--- a/applications/utilities/mesh/generation/blockMesh/addCellZones.H
+++ b/applications/utilities/mesh/generation/blockMesh/addCellZones.H
@@ -1,87 +1 @@
-// Set any cellZones
-// Note cell labelling unaffected by previous mergePatchPairs
-
-{
-    const label nZones = blocks.numZonedBlocks();
-    if (nZones)
-    {
-        Info<< nl << "Adding cell zones" << endl;
-
-        // Map from zoneName to cellZone index
-        HashTable<label> zoneMap(nZones);
-
-        // Cells per zone.
-        List<DynamicList<label>> zoneCells(nZones);
-
-        // Running cell counter
-        label celli = 0;
-
-        // Largest zone so far
-        label freeZoneI = 0;
-
-        for (const block& b : blocks)
-        {
-            const word& zoneName = b.zoneName();
-            const label nCellsInBlock = b.cells().size();
-
-            if (zoneName.size())
-            {
-                const auto iter = zoneMap.cfind(zoneName);
-
-                label zonei;
-
-                if (iter.found())
-                {
-                    zonei = *iter;
-                }
-                else
-                {
-                    zonei = freeZoneI++;
-
-                    Info<< "    " << zonei << '\t' << zoneName << endl;
-
-                    zoneMap.insert(zoneName, zonei);
-                }
-
-
-                // Fill with cell ids
-
-                zoneCells[zonei].reserve
-                (
-                    zoneCells[zonei].size() + nCellsInBlock
-                );
-
-                const label endOfFill = celli + nCellsInBlock;
-
-                for (; celli < endOfFill; ++celli)
-                {
-                    zoneCells[zonei].append(celli);
-                }
-            }
-            else
-            {
-                celli += nCellsInBlock;
-            }
-        }
-
-        List<cellZone*> cz(zoneMap.size());
-        forAllConstIters(zoneMap, iter)
-        {
-            const word& zoneName = iter.key();
-            const label zonei = iter.val();
-
-            cz[zonei] = new cellZone
-            (
-                zoneName,
-                zoneCells[zonei].shrink(),
-                zonei,
-                mesh.cellZones()
-            );
-        }
-
-        mesh.pointZones().resize(0);
-        mesh.faceZones().resize(0);
-        mesh.cellZones().resize(0);
-        mesh.addZones(List<pointZone*>(), List<faceZone*>(), cz);
-    }
-}
+#warning File removed - left for old dependency check only
diff --git a/applications/utilities/mesh/generation/blockMesh/blockMesh.C b/applications/utilities/mesh/generation/blockMesh/blockMesh.C
index 0eec9f01b8ea11208a61b0c720b40a3795b47824..b510d911705e4cf78b837823c83563f3de15e0f5 100644
--- a/applications/utilities/mesh/generation/blockMesh/blockMesh.C
+++ b/applications/utilities/mesh/generation/blockMesh/blockMesh.C
@@ -77,7 +77,6 @@ Usage
 #include "foamVtkInternalMeshWriter.H"
 #include "attachPolyTopoChanger.H"
 #include "polyTopoChange.H"
-#include "emptyPolyPatch.H"
 #include "cyclicPolyPatch.H"
 #include "cellSet.H"
 
@@ -85,7 +84,7 @@ Usage
 #include "OSspecific.H"
 #include "OFstream.H"
 
-#include "Pair.H"
+#include "wordPair.H"
 #include "slidingInterface.H"
 
 using namespace Foam;
@@ -122,7 +121,8 @@ int main(int argc, char *argv[])
     argList::addBoolOption
     (
         "write-obj",
-        "Write block edges and centres as obj files and exit"
+        "Write block edges and centres as obj files and exit",
+        true  // (old) mark as advanced option. -write-vtk is preferred
     );
     argList::addOptionCompat("write-obj", {"blockTopology", 1912});
 
@@ -135,9 +135,9 @@ int main(int argc, char *argv[])
     argList::addBoolOption
     (
         "merge-points",
-        "Geometric (point) merging instead of topological merging "
-        "(slower, fails with high-aspect cells. default for 1912 and earlier)",
-        true  // mark as an advanced option
+        "Geometric point merging instead of topological merging"
+        " [default for 1912 and earlier]."
+        // NOTE: " Slower, fails with high-aspect cells."
     );
     argList::addBoolOption
     (
@@ -164,6 +164,9 @@ int main(int argc, char *argv[])
     // Remove old files, unless disabled
     const bool removeOldFiles = !args.found("noClean");
 
+    // Write cellSets
+    const bool writeCellSets = args.found("sets");
+
     // Default merge (topology), unless otherwise specified
     blockMesh::mergeStrategy strategy(blockMesh::DEFAULT_MERGE);
 
@@ -329,56 +332,22 @@ int main(int argc, char *argv[])
     }
 
 
-    Info<< nl << "Creating polyMesh from blockMesh" << endl;
+    // Ensure we get information messages, even if turned off in dictionary
+    blocks.verbose(true);
 
-    polyMesh mesh
-    (
-        IOobject
+    autoPtr<polyMesh> meshPtr =
+        blocks.mesh
         (
-            regionName,
-            meshInstance,
-            runTime
-        ),
-        pointField(blocks.points()),  // Copy, could we re-use space?
-        blocks.cells(),
-        blocks.patches(),
-        blocks.patchNames(),
-        blocks.patchDicts(),
-        "defaultFaces",               // Default patch name
-        emptyPolyPatch::typeName      // Default patch type
-    );
+            IOobject(regionName, meshInstance, runTime)
+        );
 
+    polyMesh& mesh = *meshPtr;
 
-    // Handle merging of patch pairs. Dictionary entry "mergePatchPairs"
+    // Merge patch pairs (dictionary entry "mergePatchPairs")
     #include "mergePatchPairs.H"
 
-    // Set any cellZones
-    #include "addCellZones.H"
-
-
-    // Detect any cyclic patches and force re-ordering of the faces
-    {
-        bool hasCyclic = false;
-        for (const polyPatch& pp : mesh.boundaryMesh())
-        {
-            if (isA<cyclicPolyPatch>(pp))
-            {
-                hasCyclic = true;
-                break;
-            }
-        }
-
-        if (hasCyclic)
-        {
-            Info<< nl << "Detected cyclic patches; ordering boundary faces"
-                << endl;
-            const word oldInstance = mesh.instance();
-            polyTopoChange meshMod(mesh);
-            meshMod.changeMesh(mesh, false);
-            mesh.setInstance(oldInstance);
-        }
-    }
-
+    // Handle cyclic patches
+    #include "handleCyclicPatches.H"
 
     // Set the precision of the points data to 10
     IOstream::defaultPrecision(max(10u, IOstream::defaultPrecision()));
@@ -386,7 +355,7 @@ int main(int argc, char *argv[])
     Info<< nl << "Writing polyMesh with "
         << mesh.cellZones().size() << " cellZones";
 
-    if (args.found("sets") && !mesh.cellZones().empty())
+    if (writeCellSets && !mesh.cellZones().empty())
     {
         Info<< " (written as cellSets too)";
     }
@@ -400,7 +369,7 @@ int main(int argc, char *argv[])
             << exit(FatalError);
     }
 
-    if (args.found("sets"))
+    if (writeCellSets)
     {
         for (const cellZone& cz : mesh.cellZones())
         {
diff --git a/applications/utilities/mesh/generation/blockMesh/handleCyclicPatches.H b/applications/utilities/mesh/generation/blockMesh/handleCyclicPatches.H
new file mode 100644
index 0000000000000000000000000000000000000000..eb79d02de20eeae3c30cc572d13ff984e10c79fa
--- /dev/null
+++ b/applications/utilities/mesh/generation/blockMesh/handleCyclicPatches.H
@@ -0,0 +1,22 @@
+// Detect any cyclic patches and force re-ordering of the faces
+{
+    bool hasCyclic = false;
+    for (const polyPatch& pp : mesh.boundaryMesh())
+    {
+        if (isA<cyclicPolyPatch>(pp))
+        {
+            hasCyclic = true;
+            break;
+        }
+    }
+
+    if (hasCyclic)
+    {
+        Info<< nl << "Detected cyclic patches; ordering boundary faces" << endl;
+
+        const word oldInstance = mesh.instance();
+        polyTopoChange meshMod(mesh);
+        meshMod.changeMesh(mesh, false);
+        mesh.setInstance(oldInstance);
+    }
+}
diff --git a/applications/utilities/mesh/generation/blockMesh/mergePatchPairs.H b/applications/utilities/mesh/generation/blockMesh/mergePatchPairs.H
index 2c94bcc0fa68b7d5ab01fe67f54976dd2be568a2..be551d01f604ae4837fdcf1d04f8597722124abb 100644
--- a/applications/utilities/mesh/generation/blockMesh/mergePatchPairs.H
+++ b/applications/utilities/mesh/generation/blockMesh/mergePatchPairs.H
@@ -1,6 +1,6 @@
 // Handle merging of patch pairs
 {
-    List<Pair<word>> mergePatchPairs;
+    wordPairList mergePatchPairs;
 
     // Read in a list of dictionaries for the merge patch pairs
     if
@@ -14,19 +14,19 @@
         // Create and add point and face zones and mesh modifiers
         List<pointZone*> pz(mergePatchPairs.size());
         List<faceZone*> fz(3*mergePatchPairs.size());
-        List<cellZone*> cz(0);
+        List<cellZone*> cz;
 
-        forAll(mergePatchPairs, pairI)
+        forAll(mergePatchPairs, pairi)
         {
             const word mergeName
             (
-                mergePatchPairs[pairI].first()
-              + mergePatchPairs[pairI].second()
-              + name(pairI)
+                mergePatchPairs[pairi].first()
+              + mergePatchPairs[pairi].second()
+              + name(pairi)
             );
 
             // An empty zone for cut points
-            pz[pairI] = new pointZone
+            pz[pairi] = new pointZone
             (
                 mergeName + "CutPointZone",
                 0,
@@ -34,11 +34,11 @@
             );
 
             // Master patch
-            const word masterPatchName(mergePatchPairs[pairI].first());
+            const word masterPatchName(mergePatchPairs[pairi].first());
             const polyPatch& masterPatch =
                 mesh.boundaryMesh()[masterPatchName];
 
-            fz[3*pairI] = new faceZone
+            fz[3*pairi] = new faceZone
             (
                 mergeName + "MasterZone",
                 identity(masterPatch.size(), masterPatch.start()),
@@ -48,11 +48,11 @@
             );
 
             // Slave patch
-            const word slavePatchName(mergePatchPairs[pairI].second());
+            const word slavePatchName(mergePatchPairs[pairi].second());
             const polyPatch& slavePatch =
                 mesh.boundaryMesh()[slavePatchName];
 
-            fz[3*pairI + 1] = new faceZone
+            fz[3*pairi + 1] = new faceZone
             (
                 mergeName + "SlaveZone",
                 identity(slavePatch.size(), slavePatch.start()),
@@ -62,7 +62,7 @@
             );
 
             // An empty zone for cut faces
-            fz[3*pairI + 2] = new faceZone
+            fz[3*pairi + 2] = new faceZone
             (
                 mergeName + "CutFaceZone",
                 2,
@@ -78,30 +78,30 @@
         attachPolyTopoChanger polyMeshAttacher(mesh);
         polyMeshAttacher.setSize(mergePatchPairs.size());
 
-        forAll(mergePatchPairs, pairI)
+        forAll(mergePatchPairs, pairi)
         {
             const word mergeName
             (
-                mergePatchPairs[pairI].first()
-              + mergePatchPairs[pairI].second()
-              + name(pairI)
+                mergePatchPairs[pairi].first()
+              + mergePatchPairs[pairi].second()
+              + name(pairi)
             );
 
             // Add the sliding interface mesh modifier
             polyMeshAttacher.set
             (
-                pairI,
+                pairi,
                 new slidingInterface
                 (
-                    "couple" + name(pairI),
-                    pairI,
+                    "couple" + name(pairi),
+                    pairi,
                     polyMeshAttacher,
                     mergeName + "MasterZone",
                     mergeName + "SlaveZone",
                     mergeName + "CutPointZone",
                     mergeName + "CutFaceZone",
-                    mergePatchPairs[pairI].first(),
-                    mergePatchPairs[pairI].second(),
+                    mergePatchPairs[pairi].first(),
+                    mergePatchPairs[pairi].second(),
                     slidingInterface::INTEGRAL, // always integral
                     false,
                     intersection::VISIBLE
diff --git a/src/mesh/blockMesh/blockEdges/BSplineEdge/BSpline.C b/src/mesh/blockMesh/blockEdges/BSplineEdge/BSpline.C
index 39d3b99b8cb83cdfc120107bea409af2f0c89791..29957a0ceb94440ddb176f45f958e2058ae309cb 100644
--- a/src/mesh/blockMesh/blockEdges/BSplineEdge/BSpline.C
+++ b/src/mesh/blockMesh/blockEdges/BSplineEdge/BSpline.C
@@ -134,7 +134,7 @@ Foam::point Foam::BSpline::position
 Foam::scalar Foam::BSpline::length() const
 {
     NotImplemented;
-    return 1.0;
+    return 1;
 }
 
 
diff --git a/src/mesh/blockMesh/blockEdges/BSplineEdge/BSpline.H b/src/mesh/blockMesh/blockEdges/BSplineEdge/BSpline.H
index e9da49bcdc57b3c924c241de835186f097b187ab..00f77df5b0bdab360cfb5acaa15f5ef1a676d1a3 100644
--- a/src/mesh/blockMesh/blockEdges/BSplineEdge/BSpline.H
+++ b/src/mesh/blockMesh/blockEdges/BSplineEdge/BSpline.H
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -77,21 +78,12 @@ class BSpline
 :
     public polyLine
 {
-    // Private Member Functions
-
-        //- No copy construct
-        BSpline(const BSpline&) = delete;
-
-        //- No copy assignment
-        void operator=(const BSpline&) = delete;
-
-
 public:
 
     // Constructors
 
         //- Construct from components
-        BSpline
+        explicit BSpline
         (
             const pointField& knots,
             const bool notImplementedClosed = false
@@ -100,15 +92,16 @@ public:
 
     // Member Functions
 
-        //- Return the point position corresponding to the curve parameter
+        //- The point position corresponding to the global curve parameter
         //  0 <= lambda <= 1
         point position(const scalar lambda) const;
 
-        //- Return the point position corresponding to the local parameter
-        //  0 <= lambda <= 1 on the given segment
+        //- The point position corresponding to the local lambda (0-1)
+        //- on the given segment
         point position(const label segment, const scalar lambda) const;
 
-        //- Return the length of the curve
+        //- The length of the curve
+        //  \note NotImplemented
         scalar length() const;
 };
 
diff --git a/src/mesh/blockMesh/blockEdges/BSplineEdge/BSplineEdge.C b/src/mesh/blockMesh/blockEdges/BSplineEdge/BSplineEdge.C
index 81c3ab24ee0ee7e6b8bfaa6083992985f775c7d1..af5e4d89ed8f763dc6b31a3c70ace092f2889019 100644
--- a/src/mesh/blockMesh/blockEdges/BSplineEdge/BSplineEdge.C
+++ b/src/mesh/blockMesh/blockEdges/BSplineEdge/BSplineEdge.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2014-2016 OpenFOAM Foundation
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -27,9 +27,9 @@ License
 \*---------------------------------------------------------------------------*/
 
 #include "BSplineEdge.H"
+#include "polyLine.H"
 #include "addToRunTimeSelectionTable.H"
 
-
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
 namespace Foam
@@ -59,7 +59,10 @@ Foam::blockEdges::BSplineEdge::BSplineEdge
 )
 :
     blockEdge(points, start, end),
-    BSpline(appendEndPoints(points, start, end, internalPoints))
+    BSpline
+    (
+        polyLine::concat(points[start_], internalPoints, points[end_])
+    )
 {}
 
 
@@ -73,13 +76,16 @@ Foam::blockEdges::BSplineEdge::BSplineEdge
 )
 :
     blockEdge(dict, index, points, is),
-    BSpline(appendEndPoints(points, start_, end_, pointField(is)))
+    BSpline
+    (
+        polyLine::concat(points[start_], pointField(is), points[end_])
+    )
 {
-    token t(is);
-    is.putBack(t);
+    token tok(is);
+    is.putBack(tok);
 
-    // discard unused start/end tangents
-    if (t == token::BEGIN_LIST)
+    // Discard unused start/end tangents
+    if (tok == token::BEGIN_LIST)
     {
         vector tangent0Ignored(is);
         vector tangent1Ignored(is);
diff --git a/src/mesh/blockMesh/blockEdges/BSplineEdge/BSplineEdge.H b/src/mesh/blockMesh/blockEdges/BSplineEdge/BSplineEdge.H
index e04434c593a14cc9b5cbc51228632bf04abfab07..68eefdab87ec36b9c9cc18b7eea950a536c8edb0 100644
--- a/src/mesh/blockMesh/blockEdges/BSplineEdge/BSplineEdge.H
+++ b/src/mesh/blockMesh/blockEdges/BSplineEdge/BSplineEdge.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2014-2016 OpenFOAM Foundation
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -77,20 +77,20 @@ public:
         //- Construct from components
         BSplineEdge
         (
-            const pointField&,
-            const label start,
-            const label end,
+            const pointField& points,   //!< Referenced point field
+            const label start,      //!< Start point in referenced point field
+            const label end,        //!< End point in referenced point field
             const pointField& internalPoints
         );
 
-        //- Construct from Istream, setting pointsList
+        //- Construct from Istream and point field.
         BSplineEdge
         (
             const dictionary& dict,
             const label index,
             const searchableSurfaces& geometry,
-            const pointField&,
-            Istream&
+            const pointField& points,   //!< Referenced point field
+            Istream& is
         );
 
 
@@ -100,11 +100,12 @@ public:
 
     // Member Functions
 
-        //- Return the point position corresponding to the curve parameter
+        //- The point position corresponding to the curve parameter
         //  0 <= lambda <= 1
         virtual point position(const scalar) const;
 
-        //- Return the length of the spline curve (not implemented)
+        //- The length of the spline curve
+        //  \note NotImplemented
         virtual scalar length() const;
 };
 
diff --git a/src/mesh/blockMesh/blockEdges/arcEdge/arcEdge.C b/src/mesh/blockMesh/blockEdges/arcEdge/arcEdge.C
index 7c614b8829179c37ae90a868feb69267dd2581ea..698fec2a8db45418ebc3f7a8878b1e862728a21d 100644
--- a/src/mesh/blockMesh/blockEdges/arcEdge/arcEdge.C
+++ b/src/mesh/blockMesh/blockEdges/arcEdge/arcEdge.C
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -43,10 +44,15 @@ namespace blockEdges
 
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
-Foam::coordSystem::cylindrical Foam::blockEdges::arcEdge::calcAngle()
+void Foam::blockEdges::arcEdge::calcFromMidPoint
+(
+    const point& p1,
+    const point& p3,
+    const point& p2
+)
 {
-    const vector a = p2_ - p1_;
-    const vector b = p3_ - p1_;
+    const vector a = p2 - p1;
+    const vector b = p3 - p1;
 
     // Find centre of arcEdge
     const scalar asqr = a & a;
@@ -55,7 +61,7 @@ Foam::coordSystem::cylindrical Foam::blockEdges::arcEdge::calcAngle()
 
     const scalar denom = asqr*bsqr - adotb*adotb;
 
-    if (mag(denom) < VSMALL)
+    if (mag(denom) < ROOTVSMALL)
     {
         FatalErrorInFunction
             << denom
@@ -64,63 +70,157 @@ Foam::coordSystem::cylindrical Foam::blockEdges::arcEdge::calcAngle()
 
     const scalar fact = 0.5*(bsqr - adotb)/denom;
 
-    point centre = 0.5*a + fact*((a ^ b) ^ a);
+    const point centre = p1 + 0.5*a + fact*((a ^ b) ^ a);
+
+    // Position vectors from centre
+    const vector r1(p1 - centre);
+    const vector r2(p2 - centre);
+    const vector r3(p3 - centre);
 
-    centre += p1_;
+    const scalar mag1(mag(r1));
+    const scalar mag3(mag(r3));
 
-    // Find position vectors w.r.t. the arcEdge centre
-    const vector r1(p1_ - centre);
-    const vector r2(p2_ - centre);
-    const vector r3(p3_ - centre);
+    vector arcAxis(r1 ^ r3);
+
+    // The radius from r1 and from r3 will be identical
+    radius_ = mag(r3);
 
-    // Find angle (in degrees)
-    angle_ = radToDeg(acos((r3 & r1)/(mag(r3) * mag(r1))));
+
+    // Determine the angle
+    angle_ = acos((r1 & r3)/(mag1*mag3));
 
     // Check if the vectors define an exterior or an interior arcEdge
     if (((r1 ^ r2) & (r1 ^ r3)) < 0.0)
     {
-        angle_ = 360.0 - angle_;
+        angle_ = constant::mathematical::twoPi - angle_;
     }
 
-    vector arcAxis;
-
-    if (angle_ <= 180.0)
+    if (angle_ <= constant::mathematical::pi)
     {
-        arcAxis = r1 ^ r3;
-
-        if (mag(arcAxis)/(mag(r1)*mag(r3)) < 0.001)
+        if (mag(arcAxis)/(mag1*mag3) < 0.001)
         {
             arcAxis = r1 ^ r2;
         }
     }
     else
     {
-        arcAxis = r3 ^ r1;
+        arcAxis = -arcAxis;
     }
 
-    radius_ = mag(r3);
+    // Corresponding local cylindrical coordinate system
+    cs_ = coordSystem::cylindrical(centre, arcAxis, r1);
+}
+
+
+void Foam::blockEdges::arcEdge::calcFromCentre
+(
+    const point& p1,
+    const point& p3,
+    const point& centre,
+    bool adjustCentre,
+    scalar rMultiplier
+)
+{
+    // Position vectors from centre
+    const vector r1(p1 - centre);
+    const vector r3(p3 - centre);
+
+    const scalar mag1(mag(r1));
+    const scalar mag3(mag(r3));
+
+    const vector chord(p3 - p1);
 
-    // The corresponding local cylindrical coordinate system (radians)
-    return coordSystem::cylindrical("arc", centre, arcAxis, r1);
+    const vector arcAxis(r1 ^ r3);
+
+    // The average radius
+    radius_ = 0.5*(mag1 + mag3);
+
+    // The included angle
+    angle_ = acos((r1 & r3)/(mag1*mag3));
+
+    // TODO? check for 180 degrees (co-linear points)?
+
+    bool needsAdjust = false;
+
+    if (adjustCentre)
+    {
+        needsAdjust = !equal(mag1, mag3);
+
+        if (!equal(rMultiplier, 1))
+        {
+            // The min radius is constrained by the chord,
+            // otherwise bad things will happen.
+
+            needsAdjust = true;
+            radius_ *= rMultiplier;
+            radius_ = max(radius_, (1.001*0.5*mag(chord)));
+        }
+    }
+
+    if (needsAdjust)
+    {
+        // The centre is not equidistant to p1 and p3.
+        // Use the chord and the arcAxis to determine the vector to
+        // the midpoint of the chord and adjust the centre along this
+        // line.
+
+        const point newCentre =
+        (
+            (0.5 * (p3 + p1))                   // mid-chord point
+          + sqrt(sqr(radius_) - 0.25 * magSqr(chord))
+          * normalised(arcAxis ^ chord)         // mid-chord -> centre
+        );
+
+        //// Info<< nl << "Adjust centre. r1=" << mag1 << " r3=" << mag3
+        ////     << " radius=" << radius_ << nl
+        ////     << "angle=" << radToDeg(angle_) << ' '
+        ////     << coordSystem::cylindrical(centre, arcAxis, r1) << nl;
+
+        // Recalculate - do attempt to readjust
+        calcFromCentre(p1, p3, newCentre, false);
+    }
+    else
+    {
+        // Corresponding local cylindrical coordinate system
+        cs_ = coordSystem::cylindrical(centre, arcAxis, r1);
+    }
 }
 
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
+Foam::blockEdges::arcEdge::arcEdge
+(
+    const pointField& points,
+    const point& origin,
+    const label start,
+    const label end
+)
+:
+    blockEdge(points, start, end),
+    radius_(0),
+    angle_(0),
+    cs_()
+{
+    calcFromCentre(points[start_], points[end_], origin);
+}
+
+
 Foam::blockEdges::arcEdge::arcEdge
 (
     const pointField& points,
     const label start,
     const label end,
-    const point& pMid
+    const point& midPoint
 )
 :
     blockEdge(points, start, end),
-    p1_(points_[start_]),
-    p2_(pMid),
-    p3_(points_[end_]),
-    cs_(calcAngle())
-{}
+    radius_(0),
+    angle_(0),
+    cs_()
+{
+    calcFromMidPoint(points[start_], points[end_], midPoint);
+}
 
 
 Foam::blockEdges::arcEdge::arcEdge
@@ -133,41 +233,82 @@ Foam::blockEdges::arcEdge::arcEdge
 )
 :
     blockEdge(dict, index, points, is),
-    p1_(points_[start_]),
-    p2_(is),
-    p3_(points_[end_]),
-    cs_(calcAngle())
-{}
+    radius_(0),
+    angle_(0),
+    cs_()
+{
+    point p;
+
+    token tok(is);
+    if (tok.isWord())
+    {
+        // Can be
+        //   - origin (0 0 0)
+        //   - origin 1.2 (0 0 0)
+
+        scalar rMultiplier = 1;
+
+        is >> tok;
+        if (tok.isNumber())
+        {
+            rMultiplier = tok.number();
+        }
+        else
+        {
+            is.putBack(tok);
+        }
+
+        is >> p;  // The origin (centre)
+
+        calcFromCentre(points_[start_], points_[end_], p, true, rMultiplier);
+    }
+    else
+    {
+        is.putBack(tok);
+
+        is >> p;  // A mid-point
+
+        calcFromMidPoint(points_[start_], points_[end_], p);
+    }
+
+    // Debug information
+    #if 0
+    Info<< "arc " << start_ << ' ' << end_
+        << ' ' << position(0.5) << ' ' << cs_
+        // << " radius=" << radius_ << " angle=" << radToDeg(angle_)
+        << nl;
+    #endif
+}
 
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 Foam::point Foam::blockEdges::arcEdge::position(const scalar lambda) const
 {
+    #ifdef FULLDEBUG
     if (lambda < -SMALL || lambda > 1 + SMALL)
     {
-        FatalErrorInFunction
-            << "Parameter out of range, lambda = " << lambda
-            << abort(FatalError);
+        WarningInFunction
+            << "Parameter out of range, lambda = " << lambda << nl;
     }
+    #endif
 
     if (lambda < SMALL)
     {
-        return p1_;
+        return points_[start_];
     }
-    else if (lambda > 1 - SMALL)
+    else if (lambda >= 1 - SMALL)
     {
-        return p3_;
+        return points_[end_];
     }
 
-    // The angle is degrees, the coordinate system in radians
-    return cs_.globalPosition(vector(radius_, degToRad(lambda*angle_), 0));
+    return cs_.globalPosition(vector(radius_, (lambda*angle_), 0));
 }
 
 
-Foam::scalar Foam::blockEdges::arcEdge::length() const
+Foam::scalar Foam::blockEdges::arcEdge::length() const noexcept
 {
-    return degToRad(radius_*angle_);
+    return (radius_*angle_);
 }
 
 
diff --git a/src/mesh/blockMesh/blockEdges/arcEdge/arcEdge.H b/src/mesh/blockMesh/blockEdges/arcEdge/arcEdge.H
index 8db6fcaa97525a54d5faeb24c26bf7479f71e075..459b6a70f0d3f525c42ac06e8ec3d7b14b4f1d96 100644
--- a/src/mesh/blockMesh/blockEdges/arcEdge/arcEdge.H
+++ b/src/mesh/blockMesh/blockEdges/arcEdge/arcEdge.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
-    Copyright (C) 2017 OpenCFD Ltd.
+    Copyright (C) 2017-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -28,7 +28,32 @@ Class
     Foam::blockEdges::arcEdge
 
 Description
-    Defines the arcEdge of a circle in terms of 3 points on its circumference
+    A blockEdge defined as an arc of a circle.
+
+    The arc is normally defined by its endpoints and a point on
+    its circumference, typically a midpoint. For example,
+    \verbatim
+    points ((1 0 0) (0 1 0));
+
+    arc 0 1 (0.707107 0.707107 0);
+    \endverbatim
+    The arc can enclose an angle greater than 0 and less than 360 degrees.
+
+    The arc will frequently enclose an angle less than 180 degrees.
+    For the case, it is possible to define the arc by its endpoints and its
+    centre (origin) point. For example,
+    \verbatim
+    arc 0 1 origin (0 0 0);
+    \endverbatim
+    When defined in the way, any discrepancy in the arc radius for the
+    endpoints is resolved by adjusting the origin to ensure that the average
+    radius is satisfied.
+
+    It is also possible to define a \em flatness factor as a multiplier of
+    the calculated radius. For example,
+    \verbatim
+    arc 0 1 origin 1.1 (0 0 0);
+    \endverbatim
 
 SourceFiles
     arcEdge.C
@@ -56,26 +81,41 @@ class arcEdge
 :
     public blockEdge
 {
-    // Private data
-
-        // Begin, mid, end points
-        point p1_, p2_, p3_;
-
-        //- The arc angle (in degrees)
-        scalar angle_;
+    // Private Data
 
         //- The arc radius
         scalar radius_;
 
+        //- The arc angle (radians)
+        scalar angle_;
+
         //- The local cylindrical coordinate system
         coordSystem::cylindrical cs_;
 
 
     // Private Member Functions
 
-        //- Calculate the angle, radius and axis
-        //  \return the cylindrical coordinate system
-        coordSystem::cylindrical calcAngle();
+        //- Calculate angle, radius, cylindrical coordinate system
+        //- from end points and the given point on the circumference
+        void calcFromMidPoint
+        (
+            const point& p1,        //!< Start point
+            const point& p3,        //!< End point
+            const point& p2         //!< Point on circumference
+        );
+
+        //- Calculate angle, radius, cylindrical coordinate system
+        //- from end points and the given origin.
+        //  Optionally adjust centre to accommodate deviations in the
+        //  effective radius to the end-points
+        void calcFromCentre
+        (
+            const point& p1,        //!< Start point
+            const point& p3,        //!< End point
+            const point& centre,    //!< Centre
+            bool adjustCentre = false,  //!< Adjust centre
+            scalar rMultiplier = 1      //!< Adjust radius by this factor
+        );
 
         //- No copy construct
         arcEdge(const arcEdge&) = delete;
@@ -92,23 +132,34 @@ public:
 
     // Constructors
 
-        //- Construct from components
+        //- Construct from components, given the origin of the circle
+        arcEdge
+        (
+            const pointField& points,   //!< Referenced point field
+            const point& origin,    //!< The origin of the circle
+            const label start,      //!< Start point in referenced point field
+            const label end         //!< End point in referenced point field
+        );
+
+        //- Construct from components, using a point on the circumference
         arcEdge
         (
-            const pointField& points,
-            const label start,
-            const label end,
-            const point& pMid
+            const pointField& points,   //!< Referenced point field
+            const label start,      //!< Start point in referenced point field
+            const label end,        //!< End point in referenced point field
+            const point& midPoint   //!< A point on the circumference
         );
 
-        //- Construct from Istream setting pointsList
+        //- Construct from Istream and point field.
+        //  The Istream can specify either a point on the circumference,
+        //  or with a tag to specify the origin.
         arcEdge
         (
             const dictionary& dict,
             const label index,
-            const searchableSurfaces& geometry,
-            const pointField& points,
-            Istream&
+            const searchableSurfaces& geometry, // unsed
+            const pointField& points,   //!< Referenced point field
+            Istream& is
         );
 
 
@@ -122,7 +173,7 @@ public:
         point position(const scalar lambda) const;
 
         //- The length of the curve
-        scalar length() const;
+        scalar length() const noexcept;
 };
 
 
diff --git a/src/mesh/blockMesh/blockEdges/bezier/bezier.C b/src/mesh/blockMesh/blockEdges/bezier/bezier.C
index b1b884d32a16118ae3f5b53e1c524edd1bcdd5e3..cac55d1ba3bfd3e246ae8b87dbc8238ebaa3a8e0 100644
--- a/src/mesh/blockMesh/blockEdges/bezier/bezier.C
+++ b/src/mesh/blockMesh/blockEdges/bezier/bezier.C
@@ -26,6 +26,7 @@ License
 \*---------------------------------------------------------------------------*/
 
 #include "bezier.H"
+#include "polyLine.H"
 #include "SubList.H"
 #include "addToRunTimeSelectionTable.H"
 
@@ -66,7 +67,10 @@ Foam::blockEdges::bezier::bezier
 )
 :
     blockEdge(dict, index, points, is),
-    control_(appendEndPoints(points, start_, end_, pointField(is)))
+    control_
+    (
+        polyLine::concat(points[start_], pointField(is), points[end_])
+    )
 {}
 
 
@@ -94,7 +98,7 @@ Foam::point Foam::blockEdges::bezier::position(const scalar lambda) const
 Foam::scalar Foam::blockEdges::bezier::length() const
 {
     NotImplemented;
-    return 1.0;
+    return 1;
 }
 
 
diff --git a/src/mesh/blockMesh/blockEdges/bezier/bezier.H b/src/mesh/blockMesh/blockEdges/bezier/bezier.H
index b1f14dab2792783cb38f4525ffd91a778adb8d3a..5feaeb4139205511df37f97fe69f8db89a726bea 100644
--- a/src/mesh/blockMesh/blockEdges/bezier/bezier.H
+++ b/src/mesh/blockMesh/blockEdges/bezier/bezier.H
@@ -63,7 +63,7 @@ class bezier
 :
     public blockEdge
 {
-private:
+    // Private Data
 
         //- Control points
         pointField control_;
@@ -89,20 +89,20 @@ public:
         //- Construct from components
         bezier
         (
-            const pointField& points,
-            const label start,
-            const label end,
-            const pointField& control
+            const pointField& points,   //!< Referenced point field
+            const label start,      //!< Start point in referenced point field
+            const label end,        //!< End point in referenced point field
+            const pointField& control   //!< The control points
         );
 
-        //- Construct from Istream
+        //- Construct from Istream and point field.
         bezier
         (
             const dictionary& dict,
             const label index,
             const searchableSurfaces& geometry,
-            const pointField&,
-            Istream&
+            const pointField& points,   //!< Referenced point field
+            Istream& is
         );
 
 
@@ -117,6 +117,7 @@ public:
         point position(const scalar lambda) const;
 
         //- Return the length of the curve
+        //  \not NotImplemented
         scalar length() const;
 };
 
diff --git a/src/mesh/blockMesh/blockEdges/blockEdge/blockEdge.C b/src/mesh/blockMesh/blockEdges/blockEdge/blockEdge.C
index 01621e08c8a4de5c612f9d0223b790a76d59b995..a49880b12123ee67531c0e05cf97890ef368e52c 100644
--- a/src/mesh/blockMesh/blockEdges/blockEdge/blockEdge.C
+++ b/src/mesh/blockMesh/blockEdges/blockEdge/blockEdge.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -28,6 +28,7 @@ License
 
 #include "blockEdge.H"
 #include "blockVertex.H"
+#include "polyLine.H"
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
@@ -104,32 +105,22 @@ Foam::autoPtr<Foam::blockEdge> Foam::blockEdge::New
 }
 
 
-// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
 
 Foam::pointField Foam::blockEdge::appendEndPoints
 (
-    const pointField& points,
+    const pointField& pts,
     const label start,
     const label end,
-    const pointField& otherKnots
+    const pointField& intermediate
 )
 {
-    pointField allKnots(otherKnots.size() + 2);
-
-    // Start/end knots
-    allKnots[0] = points[start];
-    allKnots[otherKnots.size() + 1] = points[end];
-
-    // Intermediate knots
-    forAll(otherKnots, knotI)
-    {
-        allKnots[knotI+1] = otherKnots[knotI];
-    }
-
-    return allKnots;
+    return pointField(polyLine::concat(pts[start], intermediate, pts[end]));
 }
 
 
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
 Foam::tmp<Foam::pointField>
 Foam::blockEdge::position(const scalarList& lambdas) const
 {
diff --git a/src/mesh/blockMesh/blockEdges/blockEdge/blockEdge.H b/src/mesh/blockMesh/blockEdges/blockEdge/blockEdge.H
index 30d09f00f1b68efd7e4a3c17e17d84576031a97c..dd48cba834356d67b06031a48c65ce1c94f11f70 100644
--- a/src/mesh/blockMesh/blockEdges/blockEdge/blockEdge.H
+++ b/src/mesh/blockMesh/blockEdges/blockEdge/blockEdge.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -24,6 +24,12 @@ License
     You should have received a copy of the GNU General Public License
     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
 
+Namespace
+    Foam::blockEdges
+
+Description
+    A namespace for various blockEdge types.
+
 Class
     Foam::blockEdge
 
@@ -46,13 +52,10 @@ SourceFiles
 namespace Foam
 {
 
-// Forward declaration of friend functions and operators
-
+// Forward Declarations
 class blockEdge;
-
 Ostream& operator<<(Ostream&, const blockEdge&);
 
-
 /*---------------------------------------------------------------------------*\
                          Class blockEdge Declaration
 \*---------------------------------------------------------------------------*/
@@ -61,24 +64,29 @@ class blockEdge
 {
 protected:
 
-    // Protected data
+    // Protected Data
 
+        //- The referenced point field
         const pointField& points_;
 
+        //- Index of the start point
         const label start_;
+
+        //- Index of the end point
         const label end_;
 
 
     // Protected Member Functions
 
         //- Return a complete point field by appending the start/end points
-        //  to the given list
+        //- to the given list
+        //  \deprecated(2020-10) use polyLine::concat
         static pointField appendEndPoints
         (
-            const pointField&,
-            const label start,
-            const label end,
-            const pointField& otherKnots
+            const pointField& points,   //!< Referenced point field
+            const label start,      //!< Start point in referenced point field
+            const label end,        //!< End point in referenced point field
+            const pointField& intermediate  //!< Intermediate points (knots)
         );
 
 
@@ -110,18 +118,18 @@ public:
         //- Construct from components
         blockEdge
         (
-            const pointField& points,
-            const label start,
-            const label end
+            const pointField& points,   //!< Referenced point field
+            const label start,      //!< Start point in referenced point field
+            const label end         //!< End point in referenced point field
         );
 
-        //- Construct from Istream setting pointsList
+        //- Construct from Istream and point field.
         blockEdge
         (
             const dictionary& dict,
             const label index,
-            const pointField&,
-            Istream&
+            const pointField& points,   //!< Referenced point field
+            Istream& is
         );
 
         //- Clone function
@@ -133,8 +141,8 @@ public:
             const dictionary& dict,
             const label index,
             const searchableSurfaces& geometry,
-            const pointField&,
-            Istream&
+            const pointField& points,
+            Istream& is
         );
 
         //- Class used for the read-construction of
@@ -174,10 +182,10 @@ public:
 
     // Member Functions
 
-        //- Return label of start point
+        //- Index of start point
         inline label start() const;
 
-        //- Return label of end point
+        //- Index of end point
         inline label end() const;
 
         //- Compare the given start and end points with this curve
@@ -201,22 +209,22 @@ public:
         //  - -1: same edge, but different orientation
         inline int compare(const label start, const label end) const;
 
-        //- Return the point position corresponding to the curve parameter
+        //- The point position corresponding to the curve parameter
         //  0 <= lambda <= 1
         virtual point position(const scalar) const = 0;
 
-        //- Return the point positions corresponding to the curve parameters
+        //- The point positions corresponding to the curve parameters
         //  0 <= lambda <= 1
         virtual tmp<pointField> position(const scalarList&) const;
 
-        //- Return the length of the curve
+        //- The length of the curve
         virtual scalar length() const = 0;
 
         //- Write edge with variable backsubstitution
         void write(Ostream&, const dictionary&) const;
 
 
-    // Ostream operator
+    // Ostream Operator
 
         friend Ostream& operator<<(Ostream&, const blockEdge&);
 };
diff --git a/src/mesh/blockMesh/blockEdges/blockEdge/blockEdgeI.H b/src/mesh/blockMesh/blockEdges/blockEdge/blockEdgeI.H
index a781be5f968f991a2dfc4274384be52ff4b65ed1..6aab3064f06d052b2d49d07a294b6afbc9546c2a 100644
--- a/src/mesh/blockMesh/blockEdges/blockEdge/blockEdgeI.H
+++ b/src/mesh/blockMesh/blockEdges/blockEdge/blockEdgeI.H
@@ -49,10 +49,8 @@ inline int Foam::blockEdge::compare(const label start, const label end) const
     {
         return -1;
     }
-    else
-    {
-        return 0;
-    }
+
+    return 0;
 }
 
 
diff --git a/src/mesh/blockMesh/blockEdges/lineDivide/lineDivide.H b/src/mesh/blockMesh/blockEdges/lineDivide/lineDivide.H
index acd035602d001210d540e973b85d6cc65e660f90..1c58386a0ffc62093d3bd3144071a81e020f0caf 100644
--- a/src/mesh/blockMesh/blockEdges/lineDivide/lineDivide.H
+++ b/src/mesh/blockMesh/blockEdges/lineDivide/lineDivide.H
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -46,6 +47,7 @@ SourceFiles
 namespace Foam
 {
 
+// Forward Declarations
 class blockEdge;
 
 /*---------------------------------------------------------------------------*\
@@ -54,7 +56,7 @@ class blockEdge;
 
 class lineDivide
 {
-    // Private data
+    // Private Data
 
         pointField points_;
 
@@ -67,18 +69,18 @@ public:
         //- Construct from components
         lineDivide
         (
-            const blockEdge&,
-            const label ndiv,
+            const blockEdge& cedge,
+            const label nDiv,
             const gradingDescriptors& gd = gradingDescriptors()
         );
 
 
     // Member Functions
 
-        //- Return the points
+        //- The points
         const pointField& points() const;
 
-        //- Return the list of lambda values
+        //- The list of lambda values
         const scalarList& lambdaDivisions() const;
 };
 
diff --git a/src/mesh/blockMesh/blockEdges/lineEdge/lineEdge.C b/src/mesh/blockMesh/blockEdges/lineEdge/lineEdge.C
index 713d9bec153bc5aae3865c4d0a50fd8e75b061c8..203f16220a8ac0b5c589f289e51a81ff2d73df84 100644
--- a/src/mesh/blockMesh/blockEdges/lineEdge/lineEdge.C
+++ b/src/mesh/blockMesh/blockEdges/lineEdge/lineEdge.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -71,11 +71,21 @@ Foam::blockEdges::lineEdge::lineEdge
 
 Foam::point Foam::blockEdges::lineEdge::position(const scalar lambda) const
 {
-    if (lambda < -SMALL || lambda > 1+SMALL)
+    #ifdef FULLDEBUG
+    if (lambda < -SMALL || lambda > 1 + SMALL)
     {
-        FatalErrorInFunction
-            << "Parameter out of range, lambda = " << lambda
-            << abort(FatalError);
+        WarningInFunction
+            << "Parameter out of range, lambda = " << lambda << nl;
+    }
+    #endif
+
+    if (lambda < SMALL)
+    {
+        return points_[start_];
+    }
+    else if (lambda >= 1 - SMALL)
+    {
+        return points_[end_];
     }
 
     return points_[start_] + lambda * (points_[end_] - points_[start_]);
diff --git a/src/mesh/blockMesh/blockEdges/lineEdge/lineEdge.H b/src/mesh/blockMesh/blockEdges/lineEdge/lineEdge.H
index b44b3ab14adfffcf01a79599a5d0fa2558a5c500..1bbc9d67ce5b3d6f24bcba2aa4f27488830b3a33 100644
--- a/src/mesh/blockMesh/blockEdges/lineEdge/lineEdge.H
+++ b/src/mesh/blockMesh/blockEdges/lineEdge/lineEdge.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -51,12 +51,10 @@ namespace blockEdges
                           Class lineEdge Declaration
 \*---------------------------------------------------------------------------*/
 
-
 class lineEdge
 :
     public blockEdge
 {
-
 public:
 
     //- Runtime type information
@@ -66,15 +64,20 @@ public:
     // Constructors
 
         //- Construct from components
-        lineEdge(const pointField&, const label start, const label end);
+        lineEdge
+        (
+            const pointField& points,   //!< Referenced point field
+            const label start,      //!< Start point in referenced point field
+            const label end         //!< End point in referenced point field
+        );
 
-        //- Construct from Istream with a pointField
+        //- Construct from Istream and point field.
         lineEdge
         (
             const dictionary& dict,
             const label index,
             const searchableSurfaces& geometry,
-            const pointField&,
+            const pointField& points,   //!< Referenced point field
             Istream& is
         );
 
@@ -85,11 +88,11 @@ public:
 
     // Member Functions
 
-        //- Return the point position corresponding to the curve parameter
+        //- The point position corresponding to the curve parameter
         //  0 <= lambda <= 1
         point position(const scalar) const;
 
-        //- Return the length of the curve
+        //- The length of the curve
         scalar length() const;
 };
 
diff --git a/src/mesh/blockMesh/blockEdges/polyLineEdge/polyLine.C b/src/mesh/blockMesh/blockEdges/polyLineEdge/polyLine.C
index 0703696698e47bb74db3ab5c5f6a647e5a292d88..42f6a74db691bebd9fac04b3fda427d3f7853c9c 100644
--- a/src/mesh/blockMesh/blockEdges/polyLineEdge/polyLine.C
+++ b/src/mesh/blockMesh/blockEdges/polyLineEdge/polyLine.C
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -26,16 +27,41 @@ License
 \*---------------------------------------------------------------------------*/
 
 #include "polyLine.H"
+#include "SubList.H"
+
+// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
+
+Foam::tmp<Foam::pointField> Foam::polyLine::concat
+(
+    const point& p0,
+    const pointField& intermediate,
+    const point& p1
+)
+{
+    auto tresult = tmp<pointField>::New(intermediate.size() + 2);
+    auto& result = tresult.ref();
+
+    // Intermediate points (knots)
+    SubList<point>(result, intermediate.size(), 1) = intermediate;
+
+    // Start/end points (knots)
+    result.first() = p0;
+    result.last() = p1;
+
+    return tresult;
+}
+
 
 // * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
 
 void Foam::polyLine::calcParam()
 {
-    param_.setSize(points_.size());
+    lineLength_ = 0;
+    param_.resize(points_.size());
 
     if (param_.size())
     {
-        param_[0] = 0.0;
+        param_[0] = 0;
 
         for (label i=1; i < param_.size(); i++)
         {
@@ -48,23 +74,34 @@ void Foam::polyLine::calcParam()
         {
             param_[i] /= lineLength_;
         }
-        param_.last() = 1.0;
-    }
-    else
-    {
-        lineLength_ = 0.0;
+        param_.last() = 1;
     }
 }
 
 
-
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
 Foam::polyLine::polyLine(const pointField& ps, const bool)
 :
     points_(ps),
-    lineLength_(0.0),
-    param_(0)
+    lineLength_(0),
+    param_()
+{
+    calcParam();
+}
+
+
+Foam::polyLine::polyLine
+(
+    const point& start,
+    const pointField& intermediate,
+    const point& end,
+    const bool
+)
+:
+    points_(polyLine::concat(start, intermediate, end)),
+    lineLength_(0),
+    param_()
 {
     calcParam();
 }
@@ -101,19 +138,20 @@ Foam::label Foam::polyLine::localParameter(scalar& lambda) const
     // Search table of cumulative distances to find which line-segment
     // we are on.
     // Check the upper bound.
+    // Too small to bother with a binary search...
 
-    label segmentI = 1;
-    while (param_[segmentI] < lambda)
+    label segment = 1;
+    while (param_[segment] < lambda)
     {
-        segmentI++;
+        ++segment;
     }
-    segmentI--;   // We want the corresponding lower bound
+    --segment;   // We want the corresponding lower bound
 
     // The local parameter [0-1] on this line segment
     lambda =
-        (lambda - param_[segmentI])/(param_[segmentI+1] - param_[segmentI]);
+        (lambda - param_[segment])/(param_[segment+1] - param_[segment]);
 
-    return segmentI;
+    return segment;
 }
 
 
@@ -151,8 +189,8 @@ Foam::point Foam::polyLine::position
         return points_.last();
     }
 
-    const point& p0 = points()[segment];
-    const point& p1 = points()[segment+1];
+    const point& p0 = points_[segment];
+    const point& p1 = points_[segment+1];
 
     // Special cases - no calculation needed
     if (mu <= 0.0)
@@ -163,11 +201,9 @@ Foam::point Foam::polyLine::position
     {
         return p1;
     }
-    else
-    {
-        // Linear interpolation
-        return points_[segment] + mu*(p1 - p0);
-    }
+
+    // Linear interpolation
+    return points_[segment] + mu*(p1 - p0);
 }
 
 
diff --git a/src/mesh/blockMesh/blockEdges/polyLineEdge/polyLine.H b/src/mesh/blockMesh/blockEdges/polyLineEdge/polyLine.H
index e7208122013972bd9b683e342df1215957262e0e..b7bf40e8afc424b538418ee179d9649b35ba6c08 100644
--- a/src/mesh/blockMesh/blockEdges/polyLineEdge/polyLine.H
+++ b/src/mesh/blockMesh/blockEdges/polyLineEdge/polyLine.H
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -52,26 +53,16 @@ namespace Foam
                           Class polyLine Declaration
 \*---------------------------------------------------------------------------*/
 
-
 class polyLine
 {
-    // Private Member Functions
-
-        //- No copy construct
-        polyLine(const polyLine&) = delete;
-
-        //- No copy assignment
-        void operator=(const polyLine&) = delete;
-
-
 protected:
 
-    // Protected data
+    // Protected Data
 
         //- The control points or ends of each segments
         pointField points_;
 
-        //- The real line length
+        //- The real (total) line length
         scalar lineLength_;
 
         //- The rational (0-1) cumulative parameter value for each point
@@ -81,11 +72,11 @@ protected:
     // Protected Member Functions
 
         //- Precalculate the rational cumulative parameter value
-        //  and the line-length
+        //- and the line-length
         void calcParam();
 
         //- Return the line segment and the local parameter [0..1]
-        //  corresponding to the global lambda [0..1]
+        //- corresponding to the global lambda [0..1]
         label localParameter(scalar& lambda) const;
 
 
@@ -94,30 +85,50 @@ public:
     // Constructors
 
         //- Construct from components
+        explicit polyLine
+        (
+            const pointField& points,   //!< The poly-line points
+            const bool notImplementedClosed = false
+        );
+
+        //- Construct from begin, intermediate, end points
         polyLine
         (
-            const pointField&,
+            const point& start,             //!< The start point
+            const pointField& intermediate, //!< The intermediate points
+            const point& end,               //!< The end point
             const bool notImplementedClosed = false
         );
 
 
+    // Static Member Functions
+
+        //- Concatenate begin, intermediate and end points
+        static tmp<pointField> concat
+        (
+            const point& start,             //!< The start point
+            const pointField& intermediate, //!< The intermediate points
+            const point& end                //!< The end point
+        );
+
+
     // Member Functions
 
         //- Return const-access to the control-points
         const pointField& points() const;
 
-        //- Return the number of line segments
+        //- The number of line segments
         label nSegments() const;
 
-        //- Return the point position corresponding to the curve parameter
+        //- The point position corresponding to the curve parameter
         //  0 <= lambda <= 1
         point position(const scalar) const;
 
-        //- Return the point position corresponding to the local parameter
+        //- The point position corresponding to the local parameter
         //  0 <= lambda <= 1 on the given segment
         point position(const label segment, const scalar) const;
 
-        //- Return the length of the curve
+        //- The length of the curve
         scalar length() const;
 };
 
diff --git a/src/mesh/blockMesh/blockEdges/polyLineEdge/polyLineEdge.C b/src/mesh/blockMesh/blockEdges/polyLineEdge/polyLineEdge.C
index c350a8232224bde825c15e75c13695eef464bbd3..9a1b014fee0fe3517953d7648bd613515c10ea8d 100644
--- a/src/mesh/blockMesh/blockEdges/polyLineEdge/polyLineEdge.C
+++ b/src/mesh/blockMesh/blockEdges/polyLineEdge/polyLineEdge.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -48,11 +48,11 @@ Foam::blockEdges::polyLineEdge::polyLineEdge
     const pointField& ps,
     const label start,
     const label end,
-    const pointField& otherPoints
+    const pointField& intermediate
 )
 :
     blockEdge(ps, start, end),
-    polyLine(appendEndPoints(ps, start_, end_, otherPoints))
+    polyLine(ps[start_], intermediate, ps[end_])
 {}
 
 
@@ -66,7 +66,7 @@ Foam::blockEdges::polyLineEdge::polyLineEdge
 )
 :
     blockEdge(dict, index, ps, is),
-    polyLine(appendEndPoints(ps, start_, end_, pointField(is)))
+    polyLine(ps[start_], pointField(is), ps[end_])
 {}
 
 
diff --git a/src/mesh/blockMesh/blockEdges/polyLineEdge/polyLineEdge.H b/src/mesh/blockMesh/blockEdges/polyLineEdge/polyLineEdge.H
index 9eb66901431446db27450388042305fd9edecc53..bcce9c738e2599aaafc3655caa3e49b1f79a4dbf 100644
--- a/src/mesh/blockMesh/blockEdges/polyLineEdge/polyLineEdge.H
+++ b/src/mesh/blockMesh/blockEdges/polyLineEdge/polyLineEdge.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -77,19 +77,19 @@ public:
         //- Construct from components
         polyLineEdge
         (
-            const pointField&,
-            const label start,
-            const label end,
-            const pointField& otherPoints
+            const pointField& points,       //!< Referenced point field
+            const label start,      //!< Start point in referenced point field
+            const label end,        //!< End point in referenced point field
+            const pointField& intermediate  //!< The intermediate points
         );
 
-        //- Construct from Istream
+        //- Construct from Istream and point field.
         polyLineEdge
         (
             const dictionary& dict,
             const label index,
             const searchableSurfaces& geometry,
-            const pointField&,
+            const pointField& points,       //!< Referenced point field
             Istream& is
         );
 
@@ -100,11 +100,11 @@ public:
 
     // Member Functions
 
-        //- Return the point position corresponding to the curve parameter
+        //- The point position corresponding to the curve parameter
         //  0 <= lambda <= 1
         point position(const scalar lambda) const;
 
-        //- Return the length of the curve
+        //- The length of the curve
         scalar length() const;
 };
 
diff --git a/src/mesh/blockMesh/blockEdges/projectCurveEdge/projectCurveEdge.C b/src/mesh/blockMesh/blockEdges/projectCurveEdge/projectCurveEdge.C
index 08fa1186a5db81aa32cf8a516ce65af6756c93f4..f6f182207a288aff214ab2e4e22ac8fcd91e4c9f 100644
--- a/src/mesh/blockMesh/blockEdges/projectCurveEdge/projectCurveEdge.C
+++ b/src/mesh/blockMesh/blockEdges/projectCurveEdge/projectCurveEdge.C
@@ -59,7 +59,7 @@ Foam::projectCurveEdge::projectCurveEdge
     geometry_(geometry)
 {
     wordList names(is);
-    surfaces_.setSize(names.size());
+    surfaces_.resize(names.size());
     forAll(names, i)
     {
         surfaces_[i] = geometry_.findSurfaceID(names[i]);
@@ -83,6 +83,14 @@ Foam::projectCurveEdge::projectCurveEdge
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
+Foam::point
+Foam::projectCurveEdge::position(const scalar) const
+{
+    NotImplemented;
+    return point::max;
+}
+
+
 Foam::tmp<Foam::pointField>
 Foam::projectCurveEdge::position(const scalarList& lambdas) const
 {
@@ -101,8 +109,8 @@ Foam::projectCurveEdge::position(const scalarList& lambdas) const
     }
 
 
-    tmp<pointField> tpoints(new pointField(lambdas.size()));
-    pointField& points = tpoints.ref();
+    auto tpoints = tmp<pointField>::New(lambdas.size());
+    auto& points = tpoints.ref();
 
     const point& startPt = points_[start_];
     const point& endPt = points_[end_];
@@ -149,10 +157,11 @@ Foam::projectCurveEdge::position(const scalarList& lambdas) const
 
 
     // Upper limit for number of iterations
-    const label maxIter = 10;
+    constexpr label maxIter = 10;
+
     // Residual tolerance
-    const scalar relTol = 0.1;
-    const scalar absTol = 1e-4;
+    constexpr scalar relTol = 0.1;
+    constexpr scalar absTol = 1e-4;
 
     scalar initialResidual = 0.0;
 
@@ -258,4 +267,11 @@ Foam::projectCurveEdge::position(const scalarList& lambdas) const
 }
 
 
+Foam::scalar Foam::projectCurveEdge::length() const
+{
+    NotImplemented;
+    return 1;
+}
+
+
 // ************************************************************************* //
diff --git a/src/mesh/blockMesh/blockEdges/projectCurveEdge/projectCurveEdge.H b/src/mesh/blockMesh/blockEdges/projectCurveEdge/projectCurveEdge.H
index 1e6ca665eeef4ed8d29937908fe7a53f5a176316..7f939b9d58bc3114882a766a8a6d1b5969002e2a 100644
--- a/src/mesh/blockMesh/blockEdges/projectCurveEdge/projectCurveEdge.H
+++ b/src/mesh/blockMesh/blockEdges/projectCurveEdge/projectCurveEdge.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2016 OpenFOAM Foundation
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -46,6 +46,7 @@ SourceFiles
 namespace Foam
 {
 
+// Forward Declarations
 class pointConstraint;
 
 /*---------------------------------------------------------------------------*\
@@ -81,13 +82,13 @@ public:
 
     // Constructors
 
-        //- Construct from Istream setting pointsList
+        //- Construct from Istream and point field.
         projectCurveEdge
         (
             const dictionary& dict,
             const label index,
             const searchableSurfaces& geometry,
-            const pointField& points,
+            const pointField& points,   //!< Referenced point field
             Istream& is
         );
 
@@ -98,24 +99,18 @@ public:
 
     // Member Functions
 
-        //- Return the point positions corresponding to the curve parameters
+        //- The point position corresponding to the curve parameter
         //  0 <= lambda <= 1
-        virtual point position(const scalar) const
-        {
-            NotImplemented;
-            return point::max;
-        }
+        //  \note NotImplemented
+        virtual point position(const scalar) const;
 
-        //- Return the point positions corresponding to the curve parameters
+        //- The point positions corresponding to the curve parameters
         //  0 <= lambda <= 1
         virtual tmp<pointField> position(const scalarList&) const;
 
-        //- Return the length of the curve
-        virtual scalar length() const
-        {
-            NotImplemented;
-            return 1;
-        }
+        //- The length of the curve
+        //  \note NotImplemented
+        virtual scalar length() const;
 };
 
 
diff --git a/src/mesh/blockMesh/blockEdges/projectEdge/projectEdge.C b/src/mesh/blockMesh/blockEdges/projectEdge/projectEdge.C
index 8259bc77ed6caff66a95af540171985caf4e08ef..16b99b1bbf36f403b89c821357193c10de08f9c9 100644
--- a/src/mesh/blockMesh/blockEdges/projectEdge/projectEdge.C
+++ b/src/mesh/blockMesh/blockEdges/projectEdge/projectEdge.C
@@ -26,13 +26,12 @@ License
 
 \*---------------------------------------------------------------------------*/
 
-#include "searchableSurfacesQueries.H"
 #include "projectEdge.H"
-#include "unitConversion.H"
-#include "addToRunTimeSelectionTable.H"
 #include "pointConstraint.H"
+#include "searchableSurfacesQueries.H"
 #include "OBJstream.H"
 #include "linearInterpolationWeights.H"
+#include "addToRunTimeSelectionTable.H"
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
@@ -146,8 +145,8 @@ Foam::projectEdge::position(const scalarList& lambdas) const
     }
 
 
-    tmp<pointField> tpoints(new pointField(lambdas.size()));
-    pointField& points = tpoints.ref();
+    auto tpoints = tmp<pointField>::New(lambdas.size());
+    auto& points = tpoints.ref();
 
     const point& startPt = points_[start_];
     const point& endPt = points_[end_];
@@ -161,10 +160,11 @@ Foam::projectEdge::position(const scalarList& lambdas) const
 
 
     // Upper limit for number of iterations
-    const label maxIter = 10;
+    constexpr label maxIter = 10;
+
     // Residual tolerance
-    const scalar relTol = 0.1;
-    const scalar absTol = 1e-4;
+    constexpr scalar relTol = 0.1;
+    constexpr scalar absTol = 1e-4;
 
     scalar initialResidual = 0.0;
 
@@ -270,4 +270,11 @@ Foam::projectEdge::position(const scalarList& lambdas) const
 }
 
 
+Foam::scalar Foam::projectEdge::length() const
+{
+    NotImplemented;
+    return 1;
+}
+
+
 // ************************************************************************* //
diff --git a/src/mesh/blockMesh/blockEdges/projectEdge/projectEdge.H b/src/mesh/blockMesh/blockEdges/projectEdge/projectEdge.H
index 1c3d180d7fc1a11a7756c0fac35e62a144d2ee26..44c9d143d8581f1996a86a158042f45cd9f54382 100644
--- a/src/mesh/blockMesh/blockEdges/projectEdge/projectEdge.H
+++ b/src/mesh/blockMesh/blockEdges/projectEdge/projectEdge.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2016 OpenFOAM Foundation
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -46,6 +46,7 @@ SourceFiles
 namespace Foam
 {
 
+// Forward Declarations
 class pointConstraint;
 
 /*---------------------------------------------------------------------------*\
@@ -84,13 +85,13 @@ public:
 
     // Constructors
 
-        //- Construct from Istream setting pointsList
+        //- Construct from Istream and point field.
         projectEdge
         (
             const dictionary& dict,
             const label index,
             const searchableSurfaces& geometry,
-            const pointField& points,
+            const pointField& points,   //!< Referenced point field
             Istream& is
         );
 
@@ -101,20 +102,17 @@ public:
 
     // Member Functions
 
-        //- Return the point positions corresponding to the curve parameters
+        //- The point position corresponding to the curve parameter
         //  0 <= lambda <= 1
         virtual point position(const scalar) const;
 
-        //- Return the point positions corresponding to the curve parameters
+        //- The point positions corresponding to the curve parameters
         //  0 <= lambda <= 1
         virtual tmp<pointField> position(const scalarList&) const;
 
-        //- Return the length of the curve
-        virtual scalar length() const
-        {
-            NotImplemented;
-            return 1;
-        }
+        //- The length of the edge
+        //  \note NotImplemented
+        virtual scalar length() const;
 };
 
 
diff --git a/src/mesh/blockMesh/blockEdges/splineEdge/CatmullRomSpline.C b/src/mesh/blockMesh/blockEdges/splineEdge/CatmullRomSpline.C
index a8ee8c1d712d5ce9b273dccba27705a8bc21a70c..bfa0aaf27b01a809028cc051959a959bc7009c06 100644
--- a/src/mesh/blockMesh/blockEdges/splineEdge/CatmullRomSpline.C
+++ b/src/mesh/blockMesh/blockEdges/splineEdge/CatmullRomSpline.C
@@ -134,7 +134,7 @@ Foam::point Foam::CatmullRomSpline::position
 Foam::scalar Foam::CatmullRomSpline::length() const
 {
     NotImplemented;
-    return 1.0;
+    return 1;
 }
 
 
diff --git a/src/mesh/blockMesh/blockEdges/splineEdge/CatmullRomSpline.H b/src/mesh/blockMesh/blockEdges/splineEdge/CatmullRomSpline.H
index c78803d9d35129d0af972b60be1abc67b21e3fcc..27093f9cbd439b383804b0d163677abe9f7a54ef 100644
--- a/src/mesh/blockMesh/blockEdges/splineEdge/CatmullRomSpline.H
+++ b/src/mesh/blockMesh/blockEdges/splineEdge/CatmullRomSpline.H
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -79,21 +80,12 @@ class CatmullRomSpline
 :
     public polyLine
 {
-    // Private Member Functions
-
-        //- No copy construct
-        CatmullRomSpline(const CatmullRomSpline&) = delete;
-
-        //- No copy assignment
-        void operator=(const CatmullRomSpline&) = delete;
-
-
 public:
 
     // Constructors
 
         //- Construct from components
-        CatmullRomSpline
+        explicit CatmullRomSpline
         (
             const pointField& knots,
             const bool notImplementedClosed = false
@@ -102,15 +94,16 @@ public:
 
     // Member Functions
 
-        //- Return the point position corresponding to the curve parameter
+        //- The point position corresponding to the curve parameter
         //  0 <= lambda <= 1
         point position(const scalar lambda) const;
 
-        //- Return the point position corresponding to the local parameter
+        //- The point position corresponding to the local parameter
         //  0 <= lambda <= 1 on the given segment
         point position(const label segment, const scalar lambda) const;
 
-        //- Return the length of the curve
+        //- The length of the curve
+        //  \note NotImplemented
         scalar length() const;
 };
 
diff --git a/src/mesh/blockMesh/blockEdges/splineEdge/splineEdge.C b/src/mesh/blockMesh/blockEdges/splineEdge/splineEdge.C
index 048d19878bfe76083ee067bf69854c6dee0d7555..5494d4ed884fe19464b05c0dd10a11bdc2f8a380 100644
--- a/src/mesh/blockMesh/blockEdges/splineEdge/splineEdge.C
+++ b/src/mesh/blockMesh/blockEdges/splineEdge/splineEdge.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -27,9 +27,9 @@ License
 \*---------------------------------------------------------------------------*/
 
 #include "splineEdge.H"
+#include "polyLine.H"
 #include "addToRunTimeSelectionTable.H"
 
-
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
 namespace Foam
@@ -59,7 +59,10 @@ Foam::blockEdges::splineEdge::splineEdge
 )
 :
     blockEdge(points, start, end),
-    CatmullRomSpline(appendEndPoints(points, start, end, internalPoints))
+    CatmullRomSpline
+    (
+        polyLine::concat(points[start_], internalPoints, points[end_])
+    )
 {}
 
 
@@ -73,13 +76,16 @@ Foam::blockEdges::splineEdge::splineEdge
 )
 :
     blockEdge(dict, index, points, is),
-    CatmullRomSpline(appendEndPoints(points, start_, end_, pointField(is)))
+    CatmullRomSpline
+    (
+        polyLine::concat(points[start_], pointField(is), points[end_])
+    )
 {
-    token t(is);
-    is.putBack(t);
+    token tok(is);
+    is.putBack(tok);
 
-    // discard unused start/end tangents
-    if (t == token::BEGIN_LIST)
+    // Discard unused start/end tangents
+    if (tok == token::BEGIN_LIST)
     {
         vector tangent0Ignored(is);
         vector tangent1Ignored(is);
diff --git a/src/mesh/blockMesh/blockEdges/splineEdge/splineEdge.H b/src/mesh/blockMesh/blockEdges/splineEdge/splineEdge.H
index a5519ec883d1a150883292cb01fb55b30eed7c7c..3ac595cbac7fc0b87e91ad72cbb475f743a62ba9 100644
--- a/src/mesh/blockMesh/blockEdges/splineEdge/splineEdge.H
+++ b/src/mesh/blockMesh/blockEdges/splineEdge/splineEdge.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -30,6 +30,10 @@ Class
 Description
     A blockEdge interface for Catmull-Rom splines.
 
+See also
+    BSpline
+    CatmullRomSpline
+
 SourceFiles
     splineEdge.C
 
@@ -77,19 +81,19 @@ public:
         //- Construct from components
         splineEdge
         (
-            const pointField&,
-            const label start,
-            const label end,
+            const pointField& points,   //!< Referenced point field
+            const label start,      //!< Start point in referenced point field
+            const label end,        //!< End point in referenced point field
             const pointField& internalPoints
         );
 
-        //- Construct from Istream, setting pointsList
+        //- Construct from Istream and point field.
         splineEdge
         (
             const dictionary& dict,
             const label index,
             const searchableSurfaces& geometry,
-            const pointField&,
+            const pointField& points,   //!< Referenced point field
             Istream&
         );
 
@@ -100,11 +104,12 @@ public:
 
     // Member Functions
 
-        //- Return the point position corresponding to the curve parameter
+        //- The point position corresponding to the curve parameter
         //  0 <= lambda <= 1
         virtual point position(const scalar) const;
 
-        //- Return the length of the spline curve (not implemented)
+        //- The length of the spline curve
+        //  \note NotImplemented
         virtual scalar length() const;
 };
 
diff --git a/src/mesh/blockMesh/blockMesh/blockMesh.C b/src/mesh/blockMesh/blockMesh/blockMesh.C
index 3df87de8d24bd93fa837de119dd71ee0e232c3ed..04db49d80c646754760cb3c3226d134eed7a27cb 100644
--- a/src/mesh/blockMesh/blockMesh/blockMesh.C
+++ b/src/mesh/blockMesh/blockMesh/blockMesh.C
@@ -109,15 +109,23 @@ Foam::blockMesh::blockMesh
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-bool Foam::blockMesh::valid() const
+bool Foam::blockMesh::valid() const noexcept
 {
     return bool(topologyPtr_);
 }
 
 
-void Foam::blockMesh::verbose(const bool on)
+bool Foam::blockMesh::verbose() const noexcept
 {
+    return verboseOutput;
+}
+
+
+bool Foam::blockMesh::verbose(const bool on) noexcept
+{
+    bool old(verboseOutput);
     verboseOutput = on;
+    return old;
 }
 
 
diff --git a/src/mesh/blockMesh/blockMesh/blockMesh.H b/src/mesh/blockMesh/blockMesh/blockMesh.H
index 4227b3de0674212ba458e48f769e324d2e7ff61d..d08a4755859a834226f444834d8ac613b9ffd73d 100644
--- a/src/mesh/blockMesh/blockMesh/blockMesh.H
+++ b/src/mesh/blockMesh/blockMesh/blockMesh.H
@@ -226,10 +226,10 @@ public:
 
         //- Construct from IOdictionary for given region
         //  Default is topological merging.
-        blockMesh
+        explicit blockMesh
         (
             const IOdictionary& dict,
-            const word& regionName,
+            const word& regionName = polyMesh::defaultRegion,
             mergeStrategy strategy = mergeStrategy::DEFAULT_MERGE
         );
 
@@ -255,10 +255,10 @@ public:
             }
 
             //- True if the blockMesh topology exists
-            bool valid() const;
+            bool valid() const noexcept;
 
-            //- Reference to point field defining the blockMesh
-            //  these points have not been scaled by scaleFactor
+            //- Reference to point field defining the blockMesh.
+            //  These points are \b not scaled by scaleFactor
             const pointField& vertices() const;
 
             //- Return the blockMesh topology as a polyMesh
@@ -279,8 +279,8 @@ public:
             //- The scaling factor used to convert to metres
             scalar scaleFactor() const;
 
-            //- The points for the entire mesh
-            //  these points have been scaled by scaleFactor
+            //- The points for the entire mesh.
+            //  These points \b are scaled by scaleFactor
             const pointField& points() const;
 
             //- Return cell shapes list
@@ -299,16 +299,26 @@ public:
             label numZonedBlocks() const;
 
 
-        // Edit
+    // Verbosity
 
-            //- Enable/disable verbose information about the progress
-            void verbose(const bool on=true);
+        //- Verbose information?
+        bool verbose() const noexcept;
 
+        //- Enable/disable verbose information about the progress
+        //  \return old value
+        bool verbose(const bool on) noexcept;
 
-        // Write
 
-            //- Writes edges of blockMesh in OBJ format.
-            void writeTopology(Ostream&) const;
+    // Mesh Generation
+
+        //- Create polyMesh, with cell zones
+        autoPtr<polyMesh> mesh(const IOobject& io) const;
+
+
+    // Write
+
+        //- Writes edges of blockMesh in OBJ format.
+        void writeTopology(Ostream& os) const;
 };
 
 
diff --git a/src/mesh/blockMesh/blockMesh/blockMeshCreate.C b/src/mesh/blockMesh/blockMesh/blockMeshCreate.C
index 4e8dad0cc6f08dd18f9d94de6921eb27da3b325e..8d93b69b8725e351d4963cb521cfc418698b41a7 100644
--- a/src/mesh/blockMesh/blockMesh/blockMeshCreate.C
+++ b/src/mesh/blockMesh/blockMesh/blockMeshCreate.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -28,6 +28,7 @@ License
 
 #include "blockMesh.H"
 #include "cellModel.H"
+#include "emptyPolyPatch.H"
 
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
@@ -270,4 +271,129 @@ void Foam::blockMesh::createPatches() const
 }
 
 
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+Foam::autoPtr<Foam::polyMesh>
+Foam::blockMesh::mesh(const IOobject& io) const
+{
+    const blockMesh& blkMesh = *this;
+
+    if (verboseOutput)
+    {
+        Info<< nl << "Creating polyMesh from blockMesh" << endl;
+    }
+
+    auto meshPtr = autoPtr<polyMesh>::New
+    (
+        io,
+        pointField(blkMesh.points()),   // Copy, could we re-use space?
+        blkMesh.cells(),
+        blkMesh.patches(),
+        blkMesh.patchNames(),
+        blkMesh.patchDicts(),
+        "defaultFaces",                 // Default patch name
+        emptyPolyPatch::typeName        // Default patch type
+    );
+
+
+    // Set any cellZones
+    const label nZones = blkMesh.numZonedBlocks();
+
+    if (nZones)
+    {
+        polyMesh& pmesh = *meshPtr;
+
+        if (verboseOutput)
+        {
+            Info<< "Adding cell zones" << endl;
+        }
+
+        // Map from zoneName to cellZone index
+        HashTable<label> zoneMap(2*nZones);
+
+        // Cells per zone
+        List<DynamicList<label>> zoneCells(nZones);
+
+        // Running cell counter
+        label celli = 0;
+
+        // Largest zone so far
+        label freeZonei = 0;
+
+        for (const block& b : blkMesh)
+        {
+            const word& zoneName = b.zoneName();
+            const label nCellsInBlock = b.cells().size();
+
+            if (zoneName.size())
+            {
+                const auto iter = zoneMap.cfind(zoneName);
+
+                label zonei = freeZonei;
+
+                if (iter.found())
+                {
+                    zonei = *iter;
+                }
+                else
+                {
+                    zoneMap.insert(zoneName, zonei);
+                    ++freeZonei;
+
+                    if (verboseOutput)
+                    {
+                        Info<< "    " << zonei << '\t' << zoneName << endl;
+                    }
+                }
+
+
+                // Fill with cell ids
+
+                zoneCells[zonei].reserve
+                (
+                    zoneCells[zonei].size() + nCellsInBlock
+                );
+
+                const label endOfFill = celli + nCellsInBlock;
+
+                for (; celli < endOfFill; ++celli)
+                {
+                    zoneCells[zonei].append(celli);
+                }
+            }
+            else
+            {
+                celli += nCellsInBlock;
+            }
+        }
+
+        List<cellZone*> cz(zoneMap.size());
+        forAllConstIters(zoneMap, iter)
+        {
+            const word& zoneName = iter.key();
+            const label zonei = iter.val();
+
+            cz[zonei] = new cellZone
+            (
+                zoneName,
+                zoneCells[zonei].shrink(),
+                zonei,
+                pmesh.cellZones()
+            );
+        }
+
+        pmesh.pointZones().resize(0);
+        pmesh.faceZones().resize(0);
+        pmesh.cellZones().resize(0);
+        pmesh.addZones(List<pointZone*>(), List<faceZone*>(), cz);
+    }
+
+
+    // Merge patch pairs, cyclic must be done elsewhere
+    // - requires libdynamicMesh
+
+    return meshPtr;
+}
+
+
 // ************************************************************************* //
diff --git a/tutorials/basic/potentialFoam/cylinder/system/blockMeshDict b/tutorials/basic/potentialFoam/cylinder/system/blockMeshDict
index ac3995c8dc1d294db01df996844f18564a102cac..ceb0865644c4078845c2466953c6aaddecd413d3 100644
--- a/tutorials/basic/potentialFoam/cylinder/system/blockMeshDict
+++ b/tutorials/basic/potentialFoam/cylinder/system/blockMeshDict
@@ -16,6 +16,10 @@ FoamFile
 
 scale   1;
 
+// Front/back locations
+zmin -0.5;
+zmax 0.5;
+
 vertices #codeStream
 {
     codeInclude
@@ -25,34 +29,39 @@ vertices #codeStream
 
     code
     #{
-        pointField points(19);
-        points[0]  = point(0.5, 0, -0.5);
-        points[1]  = point(1, 0, -0.5);
-        points[2]  = point(2, 0, -0.5);
-        points[3]  = point(2, 0.707107, -0.5);
-        points[4]  = point(0.707107, 0.707107, -0.5);
-        points[5]  = point(0.353553, 0.353553, -0.5);
-        points[6]  = point(2, 2, -0.5);
-        points[7]  = point(0.707107, 2, -0.5);
-        points[8]  = point(0, 2, -0.5);
-        points[9]  = point(0, 1, -0.5);
-        points[10] = point(0, 0.5, -0.5);
-        points[11] = point(-0.5, 0, -0.5);
-        points[12] = point(-1, 0, -0.5);
-        points[13] = point(-2, 0, -0.5);
-        points[14] = point(-2, 0.707107, -0.5);
-        points[15] = point(-0.707107, 0.707107, -0.5);
-        points[16] = point(-0.353553, 0.353553, -0.5);
-        points[17] = point(-2, 2, -0.5);
-        points[18] = point(-0.707107, 2, -0.5);
+        // sin(45), cos(45)
+        const scalar sqrt05 = sqrt(0.5);
+
+        pointField points
+        ({
+            /* 0*/ {0.5, 0, $zmin},
+            /* 1*/ {1, 0, $zmin},
+            /* 2*/ {2, 0, $zmin},
+            /* 3*/ {2, sqrt05, $zmin},
+            /* 4*/ {sqrt05, sqrt05, $zmin},
+            /* 5*/ {sqrt05/2, sqrt05/2, $zmin},
+            /* 6*/ {2, 2, $zmin},
+            /* 7*/ {sqrt05, 2, $zmin},
+            /* 8*/ {0, 2, $zmin},
+            /* 9*/ {0, 1, $zmin},
+            /*10*/ {0, 0.5, $zmin},
+            /*11*/ {-0.5, 0, $zmin},
+            /*12*/ {-1, 0, $zmin},
+            /*13*/ {-2, 0, $zmin},
+            /*14*/ {-2, sqrt05, $zmin},
+            /*15*/ {-sqrt05, sqrt05, $zmin},
+            /*16*/ {-sqrt05/2, sqrt05/2, $zmin},
+            /*17*/ {-2, 2, $zmin},
+            /*18*/ {-sqrt05, 2, $zmin}
+        });
 
-        // Duplicate z points
-        label sz = points.size();
-        points.setSize(2*sz);
-        for (label i = 0; i < sz; i++)
+        // Duplicate z points for zmax
+        const label sz = points.size();
+        points.resize(2*sz);
+        for (label i = 0; i < sz; ++i)
         {
             const point& pt = points[i];
-            points[i+sz] = point(pt.x(), pt.y(), -pt.z());
+            points[i + sz] = point(pt.x(), pt.y(), $zmax);
         }
 
         os  << points;
@@ -76,22 +85,24 @@ blocks
 
 edges
 (
-    arc 0 5 (0.469846 0.17101 -0.5)
-    arc 5 10 (0.17101 0.469846 -0.5)
-    arc 1 4 (0.939693 0.34202 -0.5)
-    arc 4 9 (0.34202 0.939693 -0.5)
-    arc 19 24 (0.469846 0.17101 0.5)
-    arc 24 29 (0.17101 0.469846 0.5)
-    arc 20 23 (0.939693 0.34202 0.5)
-    arc 23 28 (0.34202 0.939693 0.5)
-    arc 11 16 (-0.469846 0.17101 -0.5)
-    arc 16 10 (-0.17101 0.469846 -0.5)
-    arc 12 15 (-0.939693 0.34202 -0.5)
-    arc 15 9 (-0.34202 0.939693 -0.5)
-    arc 30 35 (-0.469846 0.17101 0.5)
-    arc 35 29 (-0.17101 0.469846 0.5)
-    arc 31 34 (-0.939693 0.34202 0.5)
-    arc 34 28 (-0.34202 0.939693 0.5)
+    // Inner cylinder
+    arc  0  5 origin (0 0 $zmin)
+    arc  5 10 origin (0 0 $zmin)
+    arc  1  4 origin (0 0 $zmin)
+    arc  4  9 origin (0 0 $zmin)
+    arc 19 24 origin (0 0 $zmax)
+    arc 24 29 origin (0 0 $zmax)
+    arc 20 23 origin (0 0 $zmax)
+    arc 23 28 origin (0 0 $zmax)
+    // Intermediate cylinder
+    arc 11 16 origin (0 0 $zmin)
+    arc 16 10 origin (0 0 $zmin)
+    arc 12 15 origin (0 0 $zmin)
+    arc 15  9 origin (0 0 $zmin)
+    arc 30 35 origin (0 0 $zmax)
+    arc 35 29 origin (0 0 $zmax)
+    arc 31 34 origin (0 0 $zmax)
+    arc 34 28 origin (0 0 $zmax)
 );
 
 boundary
diff --git a/tutorials/combustion/XiDyMFoam/oscillatingCylinder/system/blockMeshDict b/tutorials/combustion/XiDyMFoam/oscillatingCylinder/system/blockMeshDict
index cc11d554db175baf7f0f4f80af58f6b54e00f075..ee3b75f0bec3812d40b0543b7dac7a6a7a6f1088 100644
--- a/tutorials/combustion/XiDyMFoam/oscillatingCylinder/system/blockMeshDict
+++ b/tutorials/combustion/XiDyMFoam/oscillatingCylinder/system/blockMeshDict
@@ -73,21 +73,22 @@ blocks
 
 edges
 (
-    arc  8  9 (-3.46410161513775 2 0)
-    arc  9 10 (-4                0 0)
-    arc 10 11 (-3.46410161513775 2 0)
-    arc 11 13 ( 0                4 0)
-    arc 13 12 ( 4                0 0)
-    arc 12  8 ( 0               -4 0)
+    arc  8  9 origin (0 0 0)
+    arc  9 10 origin (0 0 0)
+    arc 10 11 origin (0 0 0)
+    arc 11 13 origin (0 0 0)
+    arc 13 12 origin (0 0 0)
+    arc 12  8 origin (0 0 0)
 
-    arc 26 27 (-3.46410161513775 2 1)
-    arc 27 28 (-4                0 1)
-    arc 28 29 (-3.46410161513775 2 1)
-    arc 29 31 ( 0                4 1)
-    arc 31 30 ( 4                0 1)
-    arc 30 26 ( 0               -4 1)
+    arc 26 27 origin (0 0 1)
+    arc 27 28 origin (0 0 1)
+    arc 28 29 origin (0 0 1)
+    arc 29 31 origin (0 0 1)
+    arc 31 30 origin (0 0 1)
+    arc 30 26 origin (0 0 1)
 );
 
+
 defaultPatch
 {
     name    frontAndBack;
diff --git a/tutorials/combustion/fireFoam/LES/compartmentFire/system/blockMeshDict.m4 b/tutorials/combustion/fireFoam/LES/compartmentFire/system/blockMeshDict.m4
index 30801ad7b5755c73784204f71696de5580221b1a..e54dee9a38d1cfa4b56b1c4b133d430f840e4080 100644
--- a/tutorials/combustion/fireFoam/LES/compartmentFire/system/blockMeshDict.m4
+++ b/tutorials/combustion/fireFoam/LES/compartmentFire/system/blockMeshDict.m4
@@ -153,15 +153,15 @@ blocks
 
 edges
 (
-    arc 4 5 (0 0 -R_burner)
-    arc 5 6 (R_burner 0 0)
-    arc 6 7 (0 0 R_burner)
-    arc 7 4 (-R_burner 0 0)
-
-    arc 24 25 (0 H_box -R_burner)
-    arc 25 26 (R_burner H_box 0)
-    arc 26 27 (0 H_box R_burner)
-    arc 27 24 (-R_burner H_box 0)
+    arc 4 5 origin (0 0 0)
+    arc 5 6 origin (0 0 0)
+    arc 6 7 origin (0 0 0)
+    arc 7 4 origin (0 0 0)
+
+    arc 24 25 origin (0 H_box 0)
+    arc 25 26 origin (0 H_box 0)
+    arc 26 27 origin (0 H_box 0)
+    arc 27 24 origin (0 H_box 0)
 );
 
 boundary
diff --git a/tutorials/compressible/rhoPimpleFoam/RAS/externalCoupledSquareBendLiq/system/blockMeshDict b/tutorials/compressible/rhoPimpleFoam/RAS/externalCoupledSquareBendLiq/system/blockMeshDict
index d638986f2e29d318b21b5b0c257b41665f5d04d7..4aa031189d64851f460d3168411c1cbfba82f888 100644
--- a/tutorials/compressible/rhoPimpleFoam/RAS/externalCoupledSquareBendLiq/system/blockMeshDict
+++ b/tutorials/compressible/rhoPimpleFoam/RAS/externalCoupledSquareBendLiq/system/blockMeshDict
@@ -16,36 +16,39 @@ FoamFile
 
 scale   0.001;
 
+zmin -25;
+zmax 25;
+
 vertices
 (
-    // front-plane: z = +25mm
+    // front-plane:
     // inlet region
-    (   -50  25   25)           // pt 0
-    (     0  25   25)           // pt 1
-    (   -50  75   25)           // pt 2
-    (     0  75   25)           // pt 3
+    (   -50  25   $zmax)    // pt 0
+    (     0  25   $zmax)    // pt 1
+    (   -50  75   $zmax)    // pt 2
+    (     0  75   $zmax)    // pt 3
     // outlet region
-    (  -500 -75   25)           // pt 4
-    (     0 -75   25)           // pt 5
-    (  -500 -25   25)           // pt 6
-    (     0 -25   25)           // pt 7
+    (  -500 -75   $zmax)    // pt 4
+    (     0 -75   $zmax)    // pt 5
+    (  -500 -25   $zmax)    // pt 6
+    (     0 -25   $zmax)    // pt 7
     // bend mid-points
-    (    25   0   25)           // pt 8
-    (    75   0   25)           // pt 9
-    // back-plane: z = -25mm
+    (    25   0   $zmax)    // pt 8
+    (    75   0   $zmax)    // pt 9
+    // back-plane:
     // inlet region
-    (   -50  25   -25)          // pt 0 + 10
-    (     0  25   -25)          // pt 1 + 10
-    (   -50  75   -25)          // pt 2 + 10
-    (     0  75   -25)          // pt 3 + 10
+    (   -50  25   $zmin)    // pt 0 + 10
+    (     0  25   $zmin)    // pt 1 + 10
+    (   -50  75   $zmin)    // pt 2 + 10
+    (     0  75   $zmin)    // pt 3 + 10
     // outlet region
-    (  -500 -75   -25)          // pt 4 + 10
-    (     0 -75   -25)          // pt 5 + 10
-    (  -500 -25   -25)          // pt 7 + 10
-    (     0 -25   -25)          // pt 8 + 10
+    (  -500 -75   $zmin)    // pt 4 + 10
+    (     0 -75   $zmin)    // pt 5 + 10
+    (  -500 -25   $zmin)    // pt 7 + 10
+    (     0 -25   $zmin)    // pt 8 + 10
     // bend mid-points
-    (    25   0   -25)          // pt 8 + 10
-    (    75   0   -25)          // pt 9 + 10
+    (    25   0   $zmin)    // pt 8 + 10
+    (    75   0   $zmin)    // pt 9 + 10
 );
 
 blocks
@@ -59,16 +62,16 @@ blocks
 
 edges
 (
-   // block 2
-   arc  1  8  ( 17.678  17.678  25)
-   arc 11 18  ( 17.678  17.678 -25)
-   arc  3  9  ( 53.033  53.033  25)
-   arc 13 19  ( 53.033  53.033 -25)
-   // block 3
-   arc  7  8  ( 17.678  -17.678  25)
-   arc 17 18  ( 17.678  -17.678 -25)
-   arc  5  9  ( 53.033  -53.033  25)
-   arc 15 19  ( 53.033  -53.033 -25)
+    // block 2
+    arc  1  8  origin (0 0 $zmax)
+    arc  3  9  origin (0 0 $zmax)
+    arc 11 18  origin (0 0 $zmin)
+    arc 13 19  origin (0 0 $zmin)
+    // block 3
+    arc  7  8  origin (0 0 $zmax)
+    arc  5  9  origin (0 0 $zmax)
+    arc 17 18  origin (0 0 $zmin)
+    arc 15 19  origin (0 0 $zmin)
 );
 
 boundary
diff --git a/tutorials/compressible/rhoPimpleFoam/RAS/squareBendLiq/system/blockMeshDict b/tutorials/compressible/rhoPimpleFoam/RAS/squareBendLiq/system/blockMeshDict
index 165f4e9b2372a0b853e1817fdcd7dbb2113f6144..366520c4bb42ecc32182917705d664e27dc0debb 100644
--- a/tutorials/compressible/rhoPimpleFoam/RAS/squareBendLiq/system/blockMeshDict
+++ b/tutorials/compressible/rhoPimpleFoam/RAS/squareBendLiq/system/blockMeshDict
@@ -16,36 +16,39 @@ FoamFile
 
 scale   0.001;
 
+zmin -25;
+zmax 25;
+
 vertices
 (
-    // front-plane: z = +25mm
+    // front-plane:
     // inlet region
-    (   -50  25   25)           // pt 0
-    (     0  25   25)           // pt 1
-    (   -50  75   25)           // pt 2
-    (     0  75   25)           // pt 3
+    (   -50  25   $zmax)    // pt 0
+    (     0  25   $zmax)    // pt 1
+    (   -50  75   $zmax)    // pt 2
+    (     0  75   $zmax)    // pt 3
     // outlet region
-    (  -500 -75   25)           // pt 4
-    (     0 -75   25)           // pt 5
-    (  -500 -25   25)           // pt 6
-    (     0 -25   25)           // pt 7
+    (  -500 -75   $zmax)    // pt 4
+    (     0 -75   $zmax)    // pt 5
+    (  -500 -25   $zmax)    // pt 6
+    (     0 -25   $zmax)    // pt 7
     // bend mid-points
-    (    25   0   25)           // pt 8
-    (    75   0   25)           // pt 9
-    // back-plane: z = -25mm
+    (    25   0   $zmax)    // pt 8
+    (    75   0   $zmax)    // pt 9
+    // back-plane:
     // inlet region
-    (   -50  25   -25)          // pt 0 + 10
-    (     0  25   -25)          // pt 1 + 10
-    (   -50  75   -25)          // pt 2 + 10
-    (     0  75   -25)          // pt 3 + 10
+    (   -50  25   $zmin)    // pt 0 + 10
+    (     0  25   $zmin)    // pt 1 + 10
+    (   -50  75   $zmin)    // pt 2 + 10
+    (     0  75   $zmin)    // pt 3 + 10
     // outlet region
-    (  -500 -75   -25)          // pt 4 + 10
-    (     0 -75   -25)          // pt 5 + 10
-    (  -500 -25   -25)          // pt 7 + 10
-    (     0 -25   -25)          // pt 8 + 10
+    (  -500 -75   $zmin)    // pt 4 + 10
+    (     0 -75   $zmin)    // pt 5 + 10
+    (  -500 -25   $zmin)    // pt 7 + 10
+    (     0 -25   $zmin)    // pt 8 + 10
     // bend mid-points
-    (    25   0   -25)          // pt 8 + 10
-    (    75   0   -25)          // pt 9 + 10
+    (    25   0   $zmin)    // pt 8 + 10
+    (    75   0   $zmin)    // pt 9 + 10
 );
 
 blocks
@@ -60,15 +63,15 @@ blocks
 edges
 (
     // block 2
-    arc  1  8   (17.678  17.678  25)
-    arc 11 18   (17.678  17.678 -25)
-    arc  3  9   (53.033  53.033  25)
-    arc 13 19   (53.033  53.033 -25)
+    arc  1  8  origin (0 0 $zmax)
+    arc  3  9  origin (0 0 $zmax)
+    arc 11 18  origin (0 0 $zmin)
+    arc 13 19  origin (0 0 $zmin)
     // block 3
-    arc  7  8   (17.678  -17.678  25)
-    arc 17 18   (17.678  -17.678 -25)
-    arc  5  9   (53.033  -53.033  25)
-    arc 15 19   (53.033  -53.033 -25)
+    arc  7  8  origin (0 0 $zmax)
+    arc  5  9  origin (0 0 $zmax)
+    arc 17 18  origin (0 0 $zmin)
+    arc 15 19  origin (0 0 $zmin)
 );
 
 boundary
diff --git a/tutorials/compressible/rhoSimpleFoam/squareBend/system/blockMeshDict b/tutorials/compressible/rhoSimpleFoam/squareBend/system/blockMeshDict
index 165f4e9b2372a0b853e1817fdcd7dbb2113f6144..366520c4bb42ecc32182917705d664e27dc0debb 100644
--- a/tutorials/compressible/rhoSimpleFoam/squareBend/system/blockMeshDict
+++ b/tutorials/compressible/rhoSimpleFoam/squareBend/system/blockMeshDict
@@ -16,36 +16,39 @@ FoamFile
 
 scale   0.001;
 
+zmin -25;
+zmax 25;
+
 vertices
 (
-    // front-plane: z = +25mm
+    // front-plane:
     // inlet region
-    (   -50  25   25)           // pt 0
-    (     0  25   25)           // pt 1
-    (   -50  75   25)           // pt 2
-    (     0  75   25)           // pt 3
+    (   -50  25   $zmax)    // pt 0
+    (     0  25   $zmax)    // pt 1
+    (   -50  75   $zmax)    // pt 2
+    (     0  75   $zmax)    // pt 3
     // outlet region
-    (  -500 -75   25)           // pt 4
-    (     0 -75   25)           // pt 5
-    (  -500 -25   25)           // pt 6
-    (     0 -25   25)           // pt 7
+    (  -500 -75   $zmax)    // pt 4
+    (     0 -75   $zmax)    // pt 5
+    (  -500 -25   $zmax)    // pt 6
+    (     0 -25   $zmax)    // pt 7
     // bend mid-points
-    (    25   0   25)           // pt 8
-    (    75   0   25)           // pt 9
-    // back-plane: z = -25mm
+    (    25   0   $zmax)    // pt 8
+    (    75   0   $zmax)    // pt 9
+    // back-plane:
     // inlet region
-    (   -50  25   -25)          // pt 0 + 10
-    (     0  25   -25)          // pt 1 + 10
-    (   -50  75   -25)          // pt 2 + 10
-    (     0  75   -25)          // pt 3 + 10
+    (   -50  25   $zmin)    // pt 0 + 10
+    (     0  25   $zmin)    // pt 1 + 10
+    (   -50  75   $zmin)    // pt 2 + 10
+    (     0  75   $zmin)    // pt 3 + 10
     // outlet region
-    (  -500 -75   -25)          // pt 4 + 10
-    (     0 -75   -25)          // pt 5 + 10
-    (  -500 -25   -25)          // pt 7 + 10
-    (     0 -25   -25)          // pt 8 + 10
+    (  -500 -75   $zmin)    // pt 4 + 10
+    (     0 -75   $zmin)    // pt 5 + 10
+    (  -500 -25   $zmin)    // pt 7 + 10
+    (     0 -25   $zmin)    // pt 8 + 10
     // bend mid-points
-    (    25   0   -25)          // pt 8 + 10
-    (    75   0   -25)          // pt 9 + 10
+    (    25   0   $zmin)    // pt 8 + 10
+    (    75   0   $zmin)    // pt 9 + 10
 );
 
 blocks
@@ -60,15 +63,15 @@ blocks
 edges
 (
     // block 2
-    arc  1  8   (17.678  17.678  25)
-    arc 11 18   (17.678  17.678 -25)
-    arc  3  9   (53.033  53.033  25)
-    arc 13 19   (53.033  53.033 -25)
+    arc  1  8  origin (0 0 $zmax)
+    arc  3  9  origin (0 0 $zmax)
+    arc 11 18  origin (0 0 $zmin)
+    arc 13 19  origin (0 0 $zmin)
     // block 3
-    arc  7  8   (17.678  -17.678  25)
-    arc 17 18   (17.678  -17.678 -25)
-    arc  5  9   (53.033  -53.033  25)
-    arc 15 19   (53.033  -53.033 -25)
+    arc  7  8  origin (0 0 $zmax)
+    arc  5  9  origin (0 0 $zmax)
+    arc 17 18  origin (0 0 $zmin)
+    arc 15 19  origin (0 0 $zmin)
 );
 
 boundary
diff --git a/tutorials/compressible/rhoSimpleFoam/squareBendLiq/system/blockMeshDict b/tutorials/compressible/rhoSimpleFoam/squareBendLiq/system/blockMeshDict
index 165f4e9b2372a0b853e1817fdcd7dbb2113f6144..366520c4bb42ecc32182917705d664e27dc0debb 100644
--- a/tutorials/compressible/rhoSimpleFoam/squareBendLiq/system/blockMeshDict
+++ b/tutorials/compressible/rhoSimpleFoam/squareBendLiq/system/blockMeshDict
@@ -16,36 +16,39 @@ FoamFile
 
 scale   0.001;
 
+zmin -25;
+zmax 25;
+
 vertices
 (
-    // front-plane: z = +25mm
+    // front-plane:
     // inlet region
-    (   -50  25   25)           // pt 0
-    (     0  25   25)           // pt 1
-    (   -50  75   25)           // pt 2
-    (     0  75   25)           // pt 3
+    (   -50  25   $zmax)    // pt 0
+    (     0  25   $zmax)    // pt 1
+    (   -50  75   $zmax)    // pt 2
+    (     0  75   $zmax)    // pt 3
     // outlet region
-    (  -500 -75   25)           // pt 4
-    (     0 -75   25)           // pt 5
-    (  -500 -25   25)           // pt 6
-    (     0 -25   25)           // pt 7
+    (  -500 -75   $zmax)    // pt 4
+    (     0 -75   $zmax)    // pt 5
+    (  -500 -25   $zmax)    // pt 6
+    (     0 -25   $zmax)    // pt 7
     // bend mid-points
-    (    25   0   25)           // pt 8
-    (    75   0   25)           // pt 9
-    // back-plane: z = -25mm
+    (    25   0   $zmax)    // pt 8
+    (    75   0   $zmax)    // pt 9
+    // back-plane:
     // inlet region
-    (   -50  25   -25)          // pt 0 + 10
-    (     0  25   -25)          // pt 1 + 10
-    (   -50  75   -25)          // pt 2 + 10
-    (     0  75   -25)          // pt 3 + 10
+    (   -50  25   $zmin)    // pt 0 + 10
+    (     0  25   $zmin)    // pt 1 + 10
+    (   -50  75   $zmin)    // pt 2 + 10
+    (     0  75   $zmin)    // pt 3 + 10
     // outlet region
-    (  -500 -75   -25)          // pt 4 + 10
-    (     0 -75   -25)          // pt 5 + 10
-    (  -500 -25   -25)          // pt 7 + 10
-    (     0 -25   -25)          // pt 8 + 10
+    (  -500 -75   $zmin)    // pt 4 + 10
+    (     0 -75   $zmin)    // pt 5 + 10
+    (  -500 -25   $zmin)    // pt 7 + 10
+    (     0 -25   $zmin)    // pt 8 + 10
     // bend mid-points
-    (    25   0   -25)          // pt 8 + 10
-    (    75   0   -25)          // pt 9 + 10
+    (    25   0   $zmin)    // pt 8 + 10
+    (    75   0   $zmin)    // pt 9 + 10
 );
 
 blocks
@@ -60,15 +63,15 @@ blocks
 edges
 (
     // block 2
-    arc  1  8   (17.678  17.678  25)
-    arc 11 18   (17.678  17.678 -25)
-    arc  3  9   (53.033  53.033  25)
-    arc 13 19   (53.033  53.033 -25)
+    arc  1  8  origin (0 0 $zmax)
+    arc  3  9  origin (0 0 $zmax)
+    arc 11 18  origin (0 0 $zmin)
+    arc 13 19  origin (0 0 $zmin)
     // block 3
-    arc  7  8   (17.678  -17.678  25)
-    arc 17 18   (17.678  -17.678 -25)
-    arc  5  9   (53.033  -53.033  25)
-    arc 15 19   (53.033  -53.033 -25)
+    arc  7  8  origin (0 0 $zmax)
+    arc  5  9  origin (0 0 $zmax)
+    arc 17 18  origin (0 0 $zmin)
+    arc 15 19  origin (0 0 $zmin)
 );
 
 boundary
diff --git a/tutorials/electromagnetics/electrostaticFoam/chargedWire/system/blockMeshDict b/tutorials/electromagnetics/electrostaticFoam/chargedWire/system/blockMeshDict
index 0b40b5bfcf8ea79ab37617fb198909619e1f8da5..57c872d8a04f52cd8186c48e438f45b6a9781f83 100644
--- a/tutorials/electromagnetics/electrostaticFoam/chargedWire/system/blockMeshDict
+++ b/tutorials/electromagnetics/electrostaticFoam/chargedWire/system/blockMeshDict
@@ -53,14 +53,14 @@ blocks
 
 edges
 (
-    arc 0 5 (0.00092387 0.00038268 0)
-    arc 5 10 (0.00038268 0.00092387 0)
-    arc 1 4 (0.0351074 0.0145419 0)
-    arc 4 9 (0.0145419 0.0351074 0)
-    arc 11 16 (0.00092387 0.00038268 0.5)
-    arc 16 21 (0.00038268 0.00092387 0.5)
-    arc 12 15 (0.0351074 0.0145419 0.5)
-    arc 15 20 (0.0145419 0.0351074 0.5)
+    arc 0 5 origin (0 0 0)
+    arc 5 10 origin (0 0 0)
+    arc 1 4 origin (0 0 0)
+    arc 4 9 origin (0 0 0)
+    arc 11 16 origin (0 0 0.5)
+    arc 16 21 origin (0 0 0.5)
+    arc 12 15 origin (0 0 0.5)
+    arc 15 20 origin (0 0 0.5)
 );
 
 boundary
diff --git a/tutorials/finiteArea/liquidFilmFoam/cylinder/system/blockMeshDict b/tutorials/finiteArea/liquidFilmFoam/cylinder/system/blockMeshDict
index aededbfc0f89dc845c5d10ae0d4d4fe7fef6bf06..6b56721ed0c5d81241fbbe77225c091e06b4275a 100644
--- a/tutorials/finiteArea/liquidFilmFoam/cylinder/system/blockMeshDict
+++ b/tutorials/finiteArea/liquidFilmFoam/cylinder/system/blockMeshDict
@@ -14,49 +14,54 @@ FoamFile
 }
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
+// Almost identical to basic/potentialFoam/cylinder
+
 scale   0.016;
 
+// Front/back locations
+zmin 0;
+zmax 0.5;
+
 vertices
 (
-    (0.5 0 0)
-    (1 0 0)
-    (2 0 0)
-    (2 0.707107 0)
-    (0.707107 0.707107 0)
-    (0.353553 0.353553 0)
-    (2 2 0)
-    (0.707107 2 0)
-    (0 2 0)
-    (0 1 0)
-    (0 0.5 0)
-    (-0.5 0 0)
-    (-1 0 0)
-    (-2 0 0)
-    (-2 0.707107 0)
-    (-0.707107 0.707107 0)
-    (-0.353553 0.353553 0)
-    (-2 2 0)
-    (-0.707107 2 0)
-
-    (0.5 0 0.5)
-    (1 0 0.5)
-    (2 0 0.5)
-    (2 0.707107 0.5)
-    (0.707107 0.707107 0.5)
-    (0.353553 0.353553 0.5)
-    (2 2 0.5)
-    (0.707107 2 0.5)
-    (0 2 0.5)
-    (0 1 0.5)
-    (0 0.5 0.5)
-    (-0.5 0 0.5)
-    (-1 0 0.5)
-    (-2 0 0.5)
-    (-2 0.707107 0.5)
-    (-0.707107 0.707107 0.5)
-    (-0.353553 0.353553 0.5)
-    (-2 2 0.5)
-    (-0.707107 2 0.5)
+    (0.5 0 $zmin)
+    (1 0 $zmin)
+    (2 0 $zmin)
+    (2 0.707107 $zmin)
+    (0.707107 0.707107 $zmin)
+    (0.353553 0.353553 $zmin)
+    (2 2 $zmin)
+    (0.707107 2 $zmin)
+    (0 2 $zmin)
+    (0 1 $zmin)
+    (0 0.5 $zmin)
+    (-0.5 0 $zmin)
+    (-1 0 $zmin)
+    (-2 0 $zmin)
+    (-2 0.707107 $zmin)
+    (-0.707107 0.707107 $zmin)
+    (-0.353553 0.353553 $zmin)
+    (-2 2 $zmin)
+    (-0.707107 2 $zmin)
+    (0.5 0 $zmax)
+    (1 0 $zmax)
+    (2 0 $zmax)
+    (2 0.707107 $zmax)
+    (0.707107 0.707107 $zmax)
+    (0.353553 0.353553 $zmax)
+    (2 2 $zmax)
+    (0.707107 2 $zmax)
+    (0 2 $zmax)
+    (0 1 $zmax)
+    (0 0.5 $zmax)
+    (-0.5 0 $zmax)
+    (-1 0 $zmax)
+    (-2 0 $zmax)
+    (-2 0.707107 $zmax)
+    (-0.707107 0.707107 $zmax)
+    (-0.353553 0.353553 $zmax)
+    (-2 2 $zmax)
+    (-0.707107 2 $zmax)
 );
 
 blocks
@@ -75,22 +80,24 @@ blocks
 
 edges
 (
-    arc 0 5 (0.469846 0.17101 0)
-    arc 5 10 (0.17101 0.469846 0)
-    arc 1 4 (0.939693 0.34202 0)
-    arc 4 9 (0.34202 0.939693 0)
-    arc 19 24 (0.469846 0.17101 0.5)
-    arc 24 29 (0.17101 0.469846 0.5)
-    arc 20 23 (0.939693 0.34202 0.5)
-    arc 23 28 (0.34202 0.939693 0.5)
-    arc 11 16 (-0.469846 0.17101 0)
-    arc 16 10 (-0.17101 0.469846 0)
-    arc 12 15 (-0.939693 0.34202 0)
-    arc 15 9 (-0.34202 0.939693 0)
-    arc 30 35 (-0.469846 0.17101 0.5)
-    arc 35 29 (-0.17101 0.469846 0.5)
-    arc 31 34 (-0.939693 0.34202 0.5)
-    arc 34 28 (-0.34202 0.939693 0.5)
+    // Inner cylinder
+    arc  0  5 origin (0 0 $zmin)
+    arc  5 10 origin (0 0 $zmin)
+    arc  1  4 origin (0 0 $zmin)
+    arc  4  9 origin (0 0 $zmin)
+    arc 19 24 origin (0 0 $zmax)
+    arc 24 29 origin (0 0 $zmax)
+    arc 20 23 origin (0 0 $zmax)
+    arc 23 28 origin (0 0 $zmax)
+    // Intermediate cylinder
+    arc 11 16 origin (0 0 $zmin)
+    arc 16 10 origin (0 0 $zmin)
+    arc 12 15 origin (0 0 $zmin)
+    arc 15  9 origin (0 0 $zmin)
+    arc 30 35 origin (0 0 $zmax)
+    arc 35 29 origin (0 0 $zmax)
+    arc 31 34 origin (0 0 $zmax)
+    arc 34 28 origin (0 0 $zmax)
 );
 
 patches
diff --git a/tutorials/incompressible/SRFSimpleFoam/mixer/system/blockMeshDict b/tutorials/incompressible/SRFSimpleFoam/mixer/system/blockMeshDict
index 56729cdf23e4e6008ff9574a316471131e44ac9f..578ecbf576f53579f4cd9326bca466802569e32e 100644
--- a/tutorials/incompressible/SRFSimpleFoam/mixer/system/blockMeshDict
+++ b/tutorials/incompressible/SRFSimpleFoam/mixer/system/blockMeshDict
@@ -17,57 +17,60 @@ FoamFile
 
 scale   0.1;
 
+zmin 0;
+zmax 2;
+
 vertices
 (
-      (       0.500        0.000        0.000)
-      (       0.369        0.338        0.000)
-      (       0.338        0.369        0.000)
-      (       0.000        0.500        0.000)
-      (       0.737        0.676        0.000)
-      (       0.074        0.068        0.000)
-      (       0.676        0.737        0.000)
-      (       0.068        0.074        0.000)
-      (       0.000        1.000        0.000)
-      (       1.000        0.000        0.000)
-      (       0.100        0.000        0.000)
-      (       0.000        0.100        0.000)
-      (       0.500        0.000        2.000)
-      (       0.369        0.338        2.000)
-      (       0.338        0.369        2.000)
-      (       0.000        0.500        2.000)
-      (       0.737        0.676        2.000)
-      (       0.074        0.068        2.000)
-      (       0.676        0.737        2.000)
-      (       0.068        0.074        2.000)
-      (       0.000        1.000        2.000)
-      (       1.000        0.000        2.000)
-      (       0.100        0.000        2.000)
-      (       0.000        0.100        2.000)
+    (0.500        0.000    $zmin)
+    (0.369        0.338    $zmin)
+    (0.338        0.369    $zmin)
+    (0.000        0.500    $zmin)
+    (0.737        0.676    $zmin)
+    (0.074        0.068    $zmin)
+    (0.676        0.737    $zmin)
+    (0.068        0.074    $zmin)
+    (0.000        1.000    $zmin)
+    (1.000        0.000    $zmin)
+    (0.100        0.000    $zmin)
+    (0.000        0.100    $zmin)
+    (0.500        0.000    $zmax)
+    (0.369        0.338    $zmax)
+    (0.338        0.369    $zmax)
+    (0.000        0.500    $zmax)
+    (0.737        0.676    $zmax)
+    (0.074        0.068    $zmax)
+    (0.676        0.737    $zmax)
+    (0.068        0.074    $zmax)
+    (0.000        1.000    $zmax)
+    (1.000        0.000    $zmax)
+    (0.100        0.000    $zmax)
+    (0.000        0.100    $zmax)
 );
 
 blocks
 (
-      hex (1 0 9 4 13 12 21 16) (10 20 40) simpleGrading (1 1 1)
-      hex (2 1 4 6 14 13 16 18) (2 20 40) simpleGrading (1 1 1)
-      hex (3 2 6 8 15 14 18 20) (10 20 40) simpleGrading (1 1 1)
-      hex (5 10 0 1 17 22 12 13) (10 20 40) simpleGrading (1 1 1)
-      hex (11 7 2 3 23 19 14 15) (10 20 40) simpleGrading (1 1 1)
+    hex (1 0 9 4 13 12 21 16) (10 20 40) simpleGrading (1 1 1)
+    hex (2 1 4 6 14 13 16 18) (2 20 40) simpleGrading (1 1 1)
+    hex (3 2 6 8 15 14 18 20) (10 20 40) simpleGrading (1 1 1)
+    hex (5 10 0 1 17 22 12 13) (10 20 40) simpleGrading (1 1 1)
+    hex (11 7 2 3 23 19 14 15) (10 20 40) simpleGrading (1 1 1)
 );
 
 edges
 (
-      arc  0 1 (       0.470        0.171        0.000 )
-      arc  12 13 (       0.470        0.171        2.000 )
-      arc  2 3 (       0.171        0.470        0.000 )
-      arc  14 15 (       0.171        0.470        2.000 )
-      arc  9 4 (       0.940        0.342        0.000 )
-      arc  21 16 (       0.940        0.342        2.000 )
-      arc  5 10 (       0.094        0.034        0.000 )
-      arc  17 22 (       0.094        0.034        2.000 )
-      arc  6 8 (       0.342        0.940        0.000 )
-      arc  18 20 (       0.342        0.940        2.000 )
-      arc  11 7 (       0.034        0.094        0.000 )
-      arc  23 19 (       0.034        0.094        2.000 )
+    arc   0  1 origin (0 0 $zmin)
+    arc  12 13 origin (0 0 $zmax)
+    arc   2  3 origin (0 0 $zmin)
+    arc  14 15 origin (0 0 $zmax)
+    arc   9  4 origin (0 0 $zmin)
+    arc  21 16 origin (0 0 $zmax)
+    arc   5 10 origin (0 0 $zmin)
+    arc  17 22 origin (0 0 $zmax)
+    arc   6  8 origin (0 0 $zmin)
+    arc  18 20 origin (0 0 $zmax)
+    arc  11  7 origin (0 0 $zmin)
+    arc  23 19 origin (0 0 $zmax)
 );
 
 boundary
diff --git a/tutorials/incompressible/nonNewtonianIcoFoam/offsetCylinder/system/blockMeshDict b/tutorials/incompressible/nonNewtonianIcoFoam/offsetCylinder/system/blockMeshDict
index 2ec0e7a55a0557f1f2db1fb313d48dd54dea264d..5ec15e92523cc7fdef2d99ff1585f59b852ace3b 100644
--- a/tutorials/incompressible/nonNewtonianIcoFoam/offsetCylinder/system/blockMeshDict
+++ b/tutorials/incompressible/nonNewtonianIcoFoam/offsetCylinder/system/blockMeshDict
@@ -16,72 +16,75 @@ FoamFile
 
 scale   1;
 
+zmin -1;
+zmax 1;
+
 vertices
 (
-    (1 0 -1)
-    (1.4 0 -1)
-    (5 0 -1)
-    (5 0.989949 -1)
-    (0.989949 0.989949 -1)
-    (0.707107 0.707107 -1)
-    (5 2.5 -1)
-    (0.989949 2.5 -1)
-    (0 2.5 -1)
-    (0 1.4 -1)
-    (0 1 -1)
-    (-1 0 -1)
-    (-1.4 0 -1)
-    (-5 0 -1)
-    (-5 0.989949 -1)
-    (-0.989949 0.989949 -1)
-    (-0.707107 0.707107 -1)
-    (-5 2.5 -1)
-    (-0.989949 2.5 -1)
-    (5 -0.989949 -1)
-    (0.989949 -0.989949 -1)
-    (0.707107 -0.707107 -1)
-    (5 -1.5 -1)
-    (0.989949 -1.5 -1)
-    (0 -1.5 -1)
-    (0 -1.4 -1)
-    (0 -1 -1)
-    (-5 -0.989949 -1)
-    (-0.989949 -0.989949 -1)
-    (-0.707107 -0.707107 -1)
-    (-5 -1.5 -1)
-    (-0.989949 -1.5 -1)
-    (1 0 1)
-    (1.4 0 1)
-    (5 0 1)
-    (5 0.989949 1)
-    (0.989949 0.989949 1)
-    (0.707107 0.707107 1)
-    (5 2.5 1)
-    (0.989949 2.5 1)
-    (0 2.5 1)
-    (0 1.4 1)
-    (0 1 1)
-    (-1 0 1)
-    (-1.4 0 1)
-    (-5 0 1)
-    (-5 0.989949 1)
-    (-0.989949 0.989949 1)
-    (-0.707107 0.707107 1)
-    (-5 2.5 1)
-    (-0.989949 2.5 1)
-    (5 -0.989949 1)
-    (0.989949 -0.989949 1)
-    (0.707107 -0.707107 1)
-    (5 -1.5 1)
-    (0.989949 -1.5 1)
-    (0 -1.5 1)
-    (0 -1.4 1)
-    (0 -1 1)
-    (-5 -0.989949 1)
-    (-0.989949 -0.989949 1)
-    (-0.707107 -0.707107 1)
-    (-5 -1.5 1)
-    (-0.989949 -1.5 1)
+    (1 0 $zmin)
+    (1.4 0 $zmin)
+    (5 0 $zmin)
+    (5 0.989949 $zmin)
+    (0.989949 0.989949 $zmin)
+    (0.707107 0.707107 $zmin)
+    (5 2.5 $zmin)
+    (0.989949 2.5 $zmin)
+    (0 2.5 $zmin)
+    (0 1.4 $zmin)
+    (0 1 $zmin)
+    (-1 0 $zmin)
+    (-1.4 0 $zmin)
+    (-5 0 $zmin)
+    (-5 0.989949 $zmin)
+    (-0.989949 0.989949 $zmin)
+    (-0.707107 0.707107 $zmin)
+    (-5 2.5 $zmin)
+    (-0.989949 2.5 $zmin)
+    (5 -0.989949 $zmin)
+    (0.989949 -0.989949 $zmin)
+    (0.707107 -0.707107 $zmin)
+    (5 -1.5 $zmin)
+    (0.989949 -1.5 $zmin)
+    (0 -1.5 $zmin)
+    (0 -1.4 $zmin)
+    (0 -1 $zmin)
+    (-5 -0.989949 $zmin)
+    (-0.989949 -0.989949 $zmin)
+    (-0.707107 -0.707107 $zmin)
+    (-5 -1.5 $zmin)
+    (-0.989949 -1.5 $zmin)
+    (1 0 $zmax)
+    (1.4 0 $zmax)
+    (5 0 $zmax)
+    (5 0.989949 $zmax)
+    (0.989949 0.989949 $zmax)
+    (0.707107 0.707107 $zmax)
+    (5 2.5 $zmax)
+    (0.989949 2.5 $zmax)
+    (0 2.5 $zmax)
+    (0 1.4 $zmax)
+    (0 1 $zmax)
+    (-1 0 $zmax)
+    (-1.4 0 $zmax)
+    (-5 0 $zmax)
+    (-5 0.989949 $zmax)
+    (-0.989949 0.989949 $zmax)
+    (-0.707107 0.707107 $zmax)
+    (-5 2.5 $zmax)
+    (-0.989949 2.5 $zmax)
+    (5 -0.989949 $zmax)
+    (0.989949 -0.989949 $zmax)
+    (0.707107 -0.707107 $zmax)
+    (5 -1.5 $zmax)
+    (0.989949 -1.5 $zmax)
+    (0 -1.5 $zmax)
+    (0 -1.4 $zmax)
+    (0 -1 $zmax)
+    (-5 -0.989949 $zmax)
+    (-0.989949 -0.989949 $zmax)
+    (-0.707107 -0.707107 $zmax)
+    (-5 -1.5 $zmax)
+    (-0.989949 -1.5 $zmax)
 );
 
 blocks
@@ -110,38 +113,38 @@ blocks
 
 edges
 (
-    arc 5 0 (0.92388 0.382683 -1)
-    arc 5 10 (0.382683 0.923879 -1)
-    arc 1 4 (1.29343 0.535757 -1)
-    arc 4 9 (0.535757 1.29343 -1)
-    arc 32 37 (0.92388 0.382683 1)
-    arc 37 42 (0.382683 0.923879 1)
-    arc 33 36 (1.29343 0.535757 1)
-    arc 36 41 (0.535757 1.29343 1)
-    arc 11 16 (-0.923879 0.382683 -1)
-    arc 16 10 (-0.382683 0.923879 -1)
-    arc 12 15 (-1.29343 0.535757 -1)
-    arc 15 9 (-0.535757 1.29343 -1)
-    arc 43 48 (-0.923879 0.382683 1)
-    arc 48 42 (-0.382683 0.923879 1)
-    arc 44 47 (-1.29343 0.535757 1)
-    arc 47 41 (-0.535757 1.29343 1)
-    arc 0 21 (0.923879 -0.382683 -1)
-    arc 21 26 (0.382683 -0.923879 -1)
-    arc 1 20 (1.29343 -0.535757 -1)
-    arc 20 25 (0.535757 -1.29343 -1)
-    arc 32 53 (0.923879 -0.382683 1)
-    arc 53 58 (0.382683 -0.923879 1)
-    arc 33 52 (1.29343 -0.535757 1)
-    arc 52 57 (0.535757 -1.29343 1)
-    arc 11 29 (-0.923879 -0.382683 -1)
-    arc 29 26 (-0.382683 -0.923879 -1)
-    arc 12 28 (-1.29343 -0.535757 -1)
-    arc 28 25 (-0.535757 -1.29343 -1)
-    arc 43 61 (-0.923879 -0.382683 1)
-    arc 61 58 (-0.382683 -0.923879 1)
-    arc 44 60 (-1.29343 -0.535757 1)
-    arc 60 57 (-0.535757 -1.29343 1)
+    arc 5 0 origin (0 0 $zmin)
+    arc 5 10 origin (0 0 $zmin)
+    arc 1 4 origin (0 0 $zmin)
+    arc 4 9 origin (0 0 $zmin)
+    arc 32 37 origin (0 0 $zmax)
+    arc 37 42 origin (0 0 $zmax)
+    arc 33 36 origin (0 0 $zmax)
+    arc 36 41 origin (0 0 $zmax)
+    arc 11 16 origin (0 0 $zmin)
+    arc 16 10 origin (0 0 $zmin)
+    arc 12 15 origin (0 0 $zmin)
+    arc 15 9 origin (0 0 $zmin)
+    arc 43 48 origin (0 0 $zmax)
+    arc 48 42 origin (0 0 $zmax)
+    arc 44 47 origin (0 0 $zmax)
+    arc 47 41 origin (0 0 $zmax)
+    arc 0 21 origin (0 0 $zmin)
+    arc 21 26 origin (0 0 $zmin)
+    arc 1 20 origin (0 0 $zmin)
+    arc 20 25 origin (0 0 $zmin)
+    arc 32 53 origin (0 0 $zmax)
+    arc 53 58 origin (0 0 $zmax)
+    arc 33 52 origin (0 0 $zmax)
+    arc 52 57 origin (0 0 $zmax)
+    arc 11 29 origin (0 0 $zmin)
+    arc 29 26 origin (0 0 $zmin)
+    arc 12 28 origin (0 0 $zmin)
+    arc 28 25 origin (0 0 $zmin)
+    arc 43 61 origin (0 0 $zmax)
+    arc 61 58 origin (0 0 $zmax)
+    arc 44 60 origin (0 0 $zmax)
+    arc 60 57 origin (0 0 $zmax)
 );
 
 boundary
diff --git a/tutorials/incompressible/pimpleFoam/laminar/cylinder2D/system/blockMeshDict.main b/tutorials/incompressible/pimpleFoam/laminar/cylinder2D/system/blockMeshDict.main
index f6c2adc8f79da8187746b9cbc23378d9da6552a2..223dc50e5ae3c8a19e7d58ac1d770c29092682f0 100644
--- a/tutorials/incompressible/pimpleFoam/laminar/cylinder2D/system/blockMeshDict.main
+++ b/tutorials/incompressible/pimpleFoam/laminar/cylinder2D/system/blockMeshDict.main
@@ -23,18 +23,6 @@ x3        #eval{ 10.0*$R };
 xOutlet   #eval{ 18.6667*$R };
 xInlet    #eval{ -10.125*$R };
 
-RsinPi8   #eval{ $R*sin(0.125*pi()) };
-RsinPi8n  #eval{ -$RsinPi8 };
-RcosPi8   #eval{ $R*cos(0.125*pi()) };
-RcosPi8n  #eval{ -$RcosPi8 };
-RsinPi4   #eval{ $R*sin(0.25*pi()) };
-
-x2sinPi8  #eval{ $x2*sin(0.125*pi()) };
-x2sinPi8n #eval{ -$x2sinPi8 };
-x2cosPi8  #eval{ $x2*cos(0.125*pi()) };
-x2cosPi8n #eval{ -$x2cosPi8 };
-x2sinPi4  #eval{ $x2*sin(0.25*pi()) };
-
 z0        -0.0075;
 z1        0.0075;
 nz        1;
@@ -49,15 +37,18 @@ vertices #codeStream
 
     code
     #{
+        // sin(45), cos(45)
+        const scalar sqrt05 = sqrt(0.5);
+
         pointField points(19);
         points[0] = point($R, 0, $z0);
         points[1] = point($x2, 0, $z0);
         points[2] = point($x3, 0, $z0);
-        points[3] = point($x3, $x2sinPi4, $z0);
-        points[4] = point($x2sinPi4, $x2sinPi4, $z0);
-        points[5] = point($RsinPi4, $RsinPi4, $z0);
+        points[3] = point($x3, $x2*sqrt05, $z0);
+        points[4] = point($x2*sqrt05, $x2*sqrt05, $z0);
+        points[5] = point($R*sqrt05, $R*sqrt05, $z0);
         points[6] = point($x3, $x3, $z0);
-        points[7] = point($x2sinPi4, $x3, $z0);
+        points[7] = point($x2*sqrt05, $x3, $z0);
 
         // Mirror +x points to -x side
         points[11] = point(-points[0].x(), points[0].y(), points[0].z());
@@ -76,7 +67,7 @@ vertices #codeStream
 
         // Mirror -z points to +z side
         label sz = points.size();
-        points.setSize(2*sz);
+        points.resize(2*sz);
         for (label i = 0; i < sz; ++i)
         {
             const point& pt = points[i];
@@ -86,7 +77,7 @@ vertices #codeStream
         // Add an inner cylinder
         sz = points.size();
         label nAdd = 6;
-        points.setSize(sz + nAdd);
+        points.resize(sz + nAdd);
 
         // Points within the inner cylinder
         points[sz] = point(0, 0, $z0);
@@ -102,7 +93,7 @@ vertices #codeStream
 
         // Mirror -z points to +z side
         sz = points.size();
-        points.setSize(sz + nAdd);
+        points.resize(sz + nAdd);
         for (label i = 0; i < nAdd; ++i)
         {
             const point& pt = points[i+sz-nAdd];
@@ -112,21 +103,21 @@ vertices #codeStream
         // Add downstream and upstream blocks
         sz = points.size();
         nAdd = 6;
-        points.setSize(sz + nAdd);
+        points.resize(sz + nAdd);
 
         // Points on outlet
         points[sz] = point($xOutlet, 0, $z0);
         points[sz + 1] = point($xOutlet, $x3, $z0);
-        points[sz + 4] = point($xOutlet, $x2sinPi4, $z0);
+        points[sz + 4] = point($xOutlet, $x2*sqrt05, $z0);
 
         // Points on inlet
         points[sz + 2] = point($xInlet, 0, $z0);
         points[sz + 3] = point($xInlet, $x3, $z0);
-        points[sz + 5] = point($xInlet, $x2sinPi4, $z0);
+        points[sz + 5] = point($xInlet, $x2*sqrt05, $z0);
 
         // Mirror -z points to +z side
         sz = points.size();
-        points.setSize(sz + nAdd);
+        points.resize(sz + nAdd);
         for (label i = 0; i < nAdd; ++i)
         {
             const point& pt = points[i + sz - nAdd];
@@ -158,22 +149,22 @@ blocks
 
 edges
 (
-    arc  0  5 ($RcosPi8   $RsinPi8  $z0)
-    arc  5 10 ($RsinPi8   $RcosPi8  $z0)
-    arc  1  4 ($x2cosPi8  $x2sinPi8 $z0)
-    arc  4  9 ($x2sinPi8  $x2cosPi8 $z0)
-    arc 19 24 ($RcosPi8   $RsinPi8  $z1)
-    arc 24 29 ($RsinPi8   $RcosPi8  $z1)
-    arc 20 23 ($x2cosPi8  $x2sinPi8 $z1)
-    arc 23 28 ($x2sinPi8  $x2cosPi8 $z1)
-    arc 11 16 ($RcosPi8n  $RsinPi8  $z0)
-    arc 16 10 ($RsinPi8n  $RcosPi8  $z0)
-    arc 12 15 ($x2cosPi8n $x2sinPi8 $z0)
-    arc 15  9 ($x2sinPi8n $x2cosPi8 $z0)
-    arc 30 35 ($RcosPi8n  $RsinPi8  $z1)
-    arc 35 29 ($RsinPi8n  $RcosPi8  $z1)
-    arc 31 34 ($x2cosPi8n $x2sinPi8 $z1)
-    arc 34 28 ($x2sinPi8n $x2cosPi8 $z1)
+    arc  0  5 origin (0 0 $z0)
+    arc  5 10 origin (0 0 $z0)
+    arc  1  4 origin (0 0 $z0)
+    arc  4  9 origin (0 0 $z0)
+    arc 19 24 origin (0 0 $z1)
+    arc 24 29 origin (0 0 $z1)
+    arc 20 23 origin (0 0 $z1)
+    arc 23 28 origin (0 0 $z1)
+    arc 11 16 origin (0 0 $z0)
+    arc 16 10 origin (0 0 $z0)
+    arc 12 15 origin (0 0 $z0)
+    arc 15  9 origin (0 0 $z0)
+    arc 30 35 origin (0 0 $z1)
+    arc 35 29 origin (0 0 $z1)
+    arc 31 34 origin (0 0 $z1)
+    arc 34 28 origin (0 0 $z1)
 );
 
 boundary
diff --git a/tutorials/incompressible/simpleFoam/bump2D/system/blockMeshDict b/tutorials/incompressible/simpleFoam/bump2D/system/blockMeshDict
index 890fc02425665e787f19fe714326ecb242006bc2..5d2a59b5cdec8c6f10c70a083ca8f32dab4f3605 100644
--- a/tutorials/incompressible/simpleFoam/bump2D/system/blockMeshDict
+++ b/tutorials/incompressible/simpleFoam/bump2D/system/blockMeshDict
@@ -74,14 +74,14 @@ edges #codeStream
 
     code
     #{
-        const scalar xMin = 0.3;
-        const scalar xMax = 1.2;
-        const label nPoints = 100;
-        const scalar dx = (xMax - xMin)/scalar(nPoints - 1);
+        constexpr scalar xMin = 0.3;
+        constexpr scalar xMax = 1.2;
+        constexpr label nPoints = 100;
+        constexpr scalar dx = (xMax - xMin)/scalar(nPoints - 1);
+        constexpr scalar pi = constant::mathematical::pi;
 
         os  << "(" << nl << "spline 2 3" << nl;
         pointField profile(nPoints);
-        const scalar pi = constant::mathematical::pi;
 
         for (label i = 0; i < nPoints; ++i)
         {
diff --git a/tutorials/incompressible/simpleFoam/pipeCyclic/system/blockMeshDict b/tutorials/incompressible/simpleFoam/pipeCyclic/system/blockMeshDict
index bdbbf798dd014343b2182b3453d7bf87a90d525e..b97babdd44b1739a53c2ad499fd592d5a0c761d7 100644
--- a/tutorials/incompressible/simpleFoam/pipeCyclic/system/blockMeshDict
+++ b/tutorials/incompressible/simpleFoam/pipeCyclic/system/blockMeshDict
@@ -25,34 +25,33 @@ halfAngle 45.0;
 radius  0.5;
 
 y               #eval{ $radius*sin(degToRad($halfAngle)) };
-minY            #eval{ -1*$y };
 z               #eval{ $radius*cos(degToRad($halfAngle)) };
+minY            #eval{ -1*$y };
 minZ            #eval{ -1*$z };
 
 vertices
 (
-    (0.0    0.0 0)      //0
-    (10     0.0 0)
-    (10     0.0 0)      //2
-    (0.0    0.0 0)
+    (0  0 0)        //0
+    (10 0 0)        //1
+    (10 0 0)        //2
+    (0  0 0)        //3
 
-    (0.0    $minY $z)   //4
-    (10     $minY $z)
-    (10     $y $z)      //6
-    (0.0    $y $z)
+    (0  $minY $z)   //4
+    (10 $minY $z)   //5
+    (10 $y $z)      //6
+    (0  $y $z)      //7
 
 );
 
 blocks
 (
-    // inlet block
-    hex (0 1 2 3  4 5 6 7) (50 5 5) simpleGrading (1 1 1)
+    hex (0 1 2 3 4 5 6 7) (50 5 5) simpleGrading (1 1 1)
 );
 
 edges
 (
-    arc 4 7 (0 0 $radius)
-    arc 5 6 (10 0 $radius)
+    arc 4 7 origin (0 0 0)
+    arc 5 6 origin (10 0 0)
 );
 
 boundary
diff --git a/tutorials/incompressible/simpleFoam/squareBend/system/blockMeshDict b/tutorials/incompressible/simpleFoam/squareBend/system/blockMeshDict
index 165f4e9b2372a0b853e1817fdcd7dbb2113f6144..366520c4bb42ecc32182917705d664e27dc0debb 100644
--- a/tutorials/incompressible/simpleFoam/squareBend/system/blockMeshDict
+++ b/tutorials/incompressible/simpleFoam/squareBend/system/blockMeshDict
@@ -16,36 +16,39 @@ FoamFile
 
 scale   0.001;
 
+zmin -25;
+zmax 25;
+
 vertices
 (
-    // front-plane: z = +25mm
+    // front-plane:
     // inlet region
-    (   -50  25   25)           // pt 0
-    (     0  25   25)           // pt 1
-    (   -50  75   25)           // pt 2
-    (     0  75   25)           // pt 3
+    (   -50  25   $zmax)    // pt 0
+    (     0  25   $zmax)    // pt 1
+    (   -50  75   $zmax)    // pt 2
+    (     0  75   $zmax)    // pt 3
     // outlet region
-    (  -500 -75   25)           // pt 4
-    (     0 -75   25)           // pt 5
-    (  -500 -25   25)           // pt 6
-    (     0 -25   25)           // pt 7
+    (  -500 -75   $zmax)    // pt 4
+    (     0 -75   $zmax)    // pt 5
+    (  -500 -25   $zmax)    // pt 6
+    (     0 -25   $zmax)    // pt 7
     // bend mid-points
-    (    25   0   25)           // pt 8
-    (    75   0   25)           // pt 9
-    // back-plane: z = -25mm
+    (    25   0   $zmax)    // pt 8
+    (    75   0   $zmax)    // pt 9
+    // back-plane:
     // inlet region
-    (   -50  25   -25)          // pt 0 + 10
-    (     0  25   -25)          // pt 1 + 10
-    (   -50  75   -25)          // pt 2 + 10
-    (     0  75   -25)          // pt 3 + 10
+    (   -50  25   $zmin)    // pt 0 + 10
+    (     0  25   $zmin)    // pt 1 + 10
+    (   -50  75   $zmin)    // pt 2 + 10
+    (     0  75   $zmin)    // pt 3 + 10
     // outlet region
-    (  -500 -75   -25)          // pt 4 + 10
-    (     0 -75   -25)          // pt 5 + 10
-    (  -500 -25   -25)          // pt 7 + 10
-    (     0 -25   -25)          // pt 8 + 10
+    (  -500 -75   $zmin)    // pt 4 + 10
+    (     0 -75   $zmin)    // pt 5 + 10
+    (  -500 -25   $zmin)    // pt 7 + 10
+    (     0 -25   $zmin)    // pt 8 + 10
     // bend mid-points
-    (    25   0   -25)          // pt 8 + 10
-    (    75   0   -25)          // pt 9 + 10
+    (    25   0   $zmin)    // pt 8 + 10
+    (    75   0   $zmin)    // pt 9 + 10
 );
 
 blocks
@@ -60,15 +63,15 @@ blocks
 edges
 (
     // block 2
-    arc  1  8   (17.678  17.678  25)
-    arc 11 18   (17.678  17.678 -25)
-    arc  3  9   (53.033  53.033  25)
-    arc 13 19   (53.033  53.033 -25)
+    arc  1  8  origin (0 0 $zmax)
+    arc  3  9  origin (0 0 $zmax)
+    arc 11 18  origin (0 0 $zmin)
+    arc 13 19  origin (0 0 $zmin)
     // block 3
-    arc  7  8   (17.678  -17.678  25)
-    arc 17 18   (17.678  -17.678 -25)
-    arc  5  9   (53.033  -53.033  25)
-    arc 15 19   (53.033  -53.033 -25)
+    arc  7  8  origin (0 0 $zmax)
+    arc  5  9  origin (0 0 $zmax)
+    arc 17 18  origin (0 0 $zmin)
+    arc 15 19  origin (0 0 $zmin)
 );
 
 boundary
diff --git a/tutorials/lagrangian/reactingParcelFoam/cylinder/system/blockMeshDict b/tutorials/lagrangian/reactingParcelFoam/cylinder/system/blockMeshDict
index 7445c244285d49afb38e391924596dee60aa51e5..2161b74b1c572db2e9f0ae404f36bb210d0e0e83 100644
--- a/tutorials/lagrangian/reactingParcelFoam/cylinder/system/blockMeshDict
+++ b/tutorials/lagrangian/reactingParcelFoam/cylinder/system/blockMeshDict
@@ -14,48 +14,54 @@ FoamFile
 }
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
+// Almost identical to basic/potentialFoam/cylinder
+
 scale   1;
 
+// Front/back locations
+zmin -0.5;
+zmax 0.5;
+
 vertices
 (
-    (0.5 0 -0.5)
-    (1 0 -0.5)
-    (2 0 -0.5)
-    (2 0.707107 -0.5)
-    (0.707107 0.707107 -0.5)
-    (0.353553 0.353553 -0.5)
-    (2 2 -0.5)
-    (0.707107 2 -0.5)
-    (0 2 -0.5)
-    (0 1 -0.5)
-    (0 0.5 -0.5)
-    (-0.5 0 -0.5)
-    (-1 0 -0.5)
-    (-2 0 -0.5)
-    (-2 0.707107 -0.5)
-    (-0.707107 0.707107 -0.5)
-    (-0.353553 0.353553 -0.5)
-    (-2 2 -0.5)
-    (-0.707107 2 -0.5)
-    (0.5 0 0.5)
-    (1 0 0.5)
-    (2 0 0.5)
-    (2 0.707107 0.5)
-    (0.707107 0.707107 0.5)
-    (0.353553 0.353553 0.5)
-    (2 2 0.5)
-    (0.707107 2 0.5)
-    (0 2 0.5)
-    (0 1 0.5)
-    (0 0.5 0.5)
-    (-0.5 0 0.5)
-    (-1 0 0.5)
-    (-2 0 0.5)
-    (-2 0.707107 0.5)
-    (-0.707107 0.707107 0.5)
-    (-0.353553 0.353553 0.5)
-    (-2 2 0.5)
-    (-0.707107 2 0.5)
+    (0.5 0 $zmin)
+    (1 0 $zmin)
+    (2 0 $zmin)
+    (2 0.707107 $zmin)
+    (0.707107 0.707107 $zmin)
+    (0.353553 0.353553 $zmin)
+    (2 2 $zmin)
+    (0.707107 2 $zmin)
+    (0 2 $zmin)
+    (0 1 $zmin)
+    (0 0.5 $zmin)
+    (-0.5 0 $zmin)
+    (-1 0 $zmin)
+    (-2 0 $zmin)
+    (-2 0.707107 $zmin)
+    (-0.707107 0.707107 $zmin)
+    (-0.353553 0.353553 $zmin)
+    (-2 2 $zmin)
+    (-0.707107 2 $zmin)
+    (0.5 0 $zmax)
+    (1 0 $zmax)
+    (2 0 $zmax)
+    (2 0.707107 $zmax)
+    (0.707107 0.707107 $zmax)
+    (0.353553 0.353553 $zmax)
+    (2 2 $zmax)
+    (0.707107 2 $zmax)
+    (0 2 $zmax)
+    (0 1 $zmax)
+    (0 0.5 $zmax)
+    (-0.5 0 $zmax)
+    (-1 0 $zmax)
+    (-2 0 $zmax)
+    (-2 0.707107 $zmax)
+    (-0.707107 0.707107 $zmax)
+    (-0.353553 0.353553 $zmax)
+    (-2 2 $zmax)
+    (-0.707107 2 $zmax)
 );
 
 blocks
@@ -74,22 +80,24 @@ blocks
 
 edges
 (
-    arc 0 5 (0.469846 0.17101 -0.5)
-    arc 5 10 (0.17101 0.469846 -0.5)
-    arc 1 4 (0.939693 0.34202 -0.5)
-    arc 4 9 (0.34202 0.939693 -0.5)
-    arc 19 24 (0.469846 0.17101 0.5)
-    arc 24 29 (0.17101 0.469846 0.5)
-    arc 20 23 (0.939693 0.34202 0.5)
-    arc 23 28 (0.34202 0.939693 0.5)
-    arc 11 16 (-0.469846 0.17101 -0.5)
-    arc 16 10 (-0.17101 0.469846 -0.5)
-    arc 12 15 (-0.939693 0.34202 -0.5)
-    arc 15 9 (-0.34202 0.939693 -0.5)
-    arc 30 35 (-0.469846 0.17101 0.5)
-    arc 35 29 (-0.17101 0.469846 0.5)
-    arc 31 34 (-0.939693 0.34202 0.5)
-    arc 34 28 (-0.34202 0.939693 0.5)
+    // Inner cylinder
+    arc  0  5 origin (0 0 $zmin)
+    arc  5 10 origin (0 0 $zmin)
+    arc  1  4 origin (0 0 $zmin)
+    arc  4  9 origin (0 0 $zmin)
+    arc 19 24 origin (0 0 $zmax)
+    arc 24 29 origin (0 0 $zmax)
+    arc 20 23 origin (0 0 $zmax)
+    arc 23 28 origin (0 0 $zmax)
+    // Intermediate cylinder
+    arc 11 16 origin (0 0 $zmin)
+    arc 16 10 origin (0 0 $zmin)
+    arc 12 15 origin (0 0 $zmin)
+    arc 15  9 origin (0 0 $zmin)
+    arc 30 35 origin (0 0 $zmax)
+    arc 35 29 origin (0 0 $zmax)
+    arc 31 34 origin (0 0 $zmax)
+    arc 34 28 origin (0 0 $zmax)
 );
 
 defaultPatch
diff --git a/tutorials/mesh/blockMesh/sphere/system/blockMeshDict b/tutorials/mesh/blockMesh/sphere/system/blockMeshDict
index 59d5a948f8ddeebc5df9e53610f5da1cfdeb0bd4..191c1f6a4948528dc2a87f17afb2716ef780cea9 100644
--- a/tutorials/mesh/blockMesh/sphere/system/blockMeshDict
+++ b/tutorials/mesh/blockMesh/sphere/system/blockMeshDict
@@ -16,65 +16,71 @@ FoamFile
 
 scale   1;
 
+// Geometric parameters
+outerRadius 1;
+
+// Divisions in x/y/z directions. Can be unequal.
+nx   10;
+ny   $nx;
+nz   $nx;
+
 geometry
 {
     sphere
     {
         type   sphere;
         origin (0 0 0);
-        radius 1;
+        radius $outerRadius;
     }
 }
 
-v 0.5773502;
-mv -0.5773502;
-
-a 0.7071067;
-ma -0.7071067;
+// Box sizes
+vo   #eval{ sqrt($outerRadius/3) };
+mvo  #eval{ -$vo };
 
 vertices
 (
-    ($mv $mv $mv)
-    ( $v $mv $mv)
-    ( $v  $v $mv)
-    ($mv  $v $mv)
-    ($mv $mv  $v)
-    ( $v $mv  $v)
-    ( $v  $v  $v)
-    ($mv  $v  $v)
+    ($mvo $mvo $mvo)
+    ( $vo $mvo $mvo)
+    ( $vo  $vo $mvo)
+    ($mvo  $vo $mvo)
+    ($mvo $mvo  $vo)
+    ( $vo $mvo  $vo)
+    ( $vo  $vo  $vo)
+    ($mvo  $vo  $vo)
 );
 
 blocks
 (
-    hex (0 1 2 3 4 5 6 7) (10 10 10) simpleGrading (1 1 1)
+    hex (0 1 2 3 4 5 6 7) ($nx $ny $nz) grading (1 1 1)
 );
 
 edges
 (
-    arc 0 1 (0 $ma $ma)
-    arc 2 3 (0 $a $ma)
-    arc 6 7 (0 $a $a)
-    arc 4 5 (0 $ma $a)
+    arc 0 1 origin (0 0 0)
+    arc 2 3 origin (0 0 0)
+    arc 6 7 origin (0 0 0)
+    arc 4 5 origin (0 0 0)
 
-    arc 0 3 ($ma 0 $ma)
-    arc 1 2 ($a 0 $ma)
-    arc 5 6 ($a 0 $a)
-    arc 4 7 ($ma 0 $a)
+    arc 0 3 origin (0 0 0)
+    arc 1 2 origin (0 0 0)
+    arc 5 6 origin (0 0 0)
+    arc 4 7 origin (0 0 0)
 
-    arc 0 4 ($ma $ma 0)
-    arc 1 5 ($a $ma 0)
-    arc 2 6 ($a $a 0)
-    arc 3 7 ($ma $a 0)
+    arc 0 4 origin (0 0 0)
+    arc 1 5 origin (0 0 0)
+    arc 2 6 origin (0 0 0)
+    arc 3 7 origin (0 0 0)
 );
 
 faces
 (
-    project (0 4 7 3) sphere
-    project (2 6 5 1) sphere
-    project (1 5 4 0) sphere
-    project (3 7 6 2) sphere
-    project (0 3 2 1) sphere
-    project (4 5 6 7) sphere
+    project (0 4 7 3) sphere  // x-min
+    project (1 2 6 5) sphere  // x-max
+    project (0 1 5 4) sphere  // y-min
+    project (3 7 6 2) sphere  // y-max
+    project (0 3 2 1) sphere  // z-min
+    project (4 5 6 7) sphere  // z-max
 );
 
 boundary
@@ -84,12 +90,12 @@ boundary
         type wall;
         faces
         (
-            (0 4 7 3)
-            (2 6 5 1)
-            (1 5 4 0)
-            (3 7 6 2)
-            (0 3 2 1)
-            (4 5 6 7)
+            (0 4 7 3)  // x-min
+            (1 2 6 5)  // x-max
+            (0 1 5 4)  // y-min
+            (3 7 6 2)  // y-max
+            (0 3 2 1)  // z-min
+            (4 5 6 7)  // z-max
         );
     }
 );
diff --git a/tutorials/mesh/blockMesh/sphere7/system/blockMeshDict b/tutorials/mesh/blockMesh/sphere7/system/blockMeshDict
index 3e7c71adee678c6ab468479faddbcd85ce0ae0a7..6d19d4a536eb004a4b18efb48edcbf3c41c887d0 100644
--- a/tutorials/mesh/blockMesh/sphere7/system/blockMeshDict
+++ b/tutorials/mesh/blockMesh/sphere7/system/blockMeshDict
@@ -17,103 +17,115 @@ FoamFile
 scale   1;
 verbose no;
 
+// Geometric parameters
+outerRadius 1;
+innerRatio  0.7;
+
+// Divisions in x/y/z and radial directions. Can be unequal.
+nx   10;
+ny   $nx;
+nz   $nx;
+nr   6;
+
 geometry
 {
     sphere
     {
         type   sphere;
         origin (0 0 0);
-        radius 1;
+        radius $outerRadius;
     }
 }
 
+// Outer box sizes
+vo   #eval{ sqrt($outerRadius/3) };
+mvo  #eval{ -$vo };
 
-n    10;
-
-v    0.5773502;
-mv  -0.5773502;
-vh   0.2886751;
-mvh -0.2886751;
-
-a    0.7071067;
-ma  -0.7071067;
-ah   0.3464101;
-mah -0.3464101;
+// Inner box sizes - % of overall dimension
+vi   #eval{ $innerRatio*$vo };
+mvi  #eval{ $innerRatio*$mvo };
 
 vertices
 (
-    ($mvh $mvh $mvh)
-    ( $vh $mvh $mvh)
-    ( $vh  $vh $mvh)
-    ($mvh  $vh $mvh)
-    ($mvh $mvh  $vh)
-    ( $vh $mvh  $vh)
-    ( $vh  $vh  $vh)
-    ($mvh  $vh  $vh)
-
-    ($mv $mv $mv)
-    ( $v $mv $mv)
-    ( $v  $v $mv)
-    ($mv  $v $mv)
-    ($mv $mv  $v)
-    ( $v $mv  $v)
-    ( $v  $v  $v)
-    ($mv  $v  $v)
+    // Inner block
+    ($mvi $mvi $mvi)
+    ( $vi $mvi $mvi)
+    ( $vi  $vi $mvi)
+    ($mvi  $vi $mvi)
+    ($mvi $mvi  $vi)
+    ( $vi $mvi  $vi)
+    ( $vi  $vi  $vi)
+    ($mvi  $vi  $vi)
+
+    // Outer blocks
+    ($mvo $mvo $mvo)
+    ( $vo $mvo $mvo)
+    ( $vo  $vo $mvo)
+    ($mvo  $vo $mvo)
+    ($mvo $mvo  $vo)
+    ( $vo $mvo  $vo)
+    ( $vo  $vo  $vo)
+    ($mvo  $vo  $vo)
 );
 
 blocks
 (
-    hex ( 0  1  2  3  4  5  6  7) ($n $n $n) simpleGrading (1 1 1)
-    hex ( 9  8 12 13  1  0  4  5) ($n $n $n) simpleGrading (1 1 1)
-    hex (10  9 13 14  2  1  5  6) ($n $n $n) simpleGrading (1 1 1)
-    hex (11 10 14 15  3  2  6  7) ($n $n $n) simpleGrading (1 1 1)
-    hex ( 8 11 15 12  0  3  7  4) ($n $n $n) simpleGrading (1 1 1)
-    hex ( 8  9 10 11  0  1  2  3) ($n $n $n) simpleGrading (1 1 1)
-    hex (13 12 15 14  5  4  7  6) ($n $n $n) simpleGrading (1 1 1)
+    hex (0 1 2 3 4 5 6 7) ($nx $ny $nz) grading (1 1 1)  // Inner block
+
+    // Outer blocks
+    hex ( 8  0  3 11 12  4  7 15) ($nr $ny $nz) grading (1 1 1)  // x-min
+    hex ( 1  9 10  2  5 13 14  6) ($nr $ny $nz) grading (1 1 1)  // x-max
+    hex ( 8  9  1  0 12 13  5  4) ($nx $nr $nz) grading (1 1 1)  // y-min
+    hex ( 3  2 10 11  7  6 14 15) ($nx $nr $nz) grading (1 1 1)  // y-max
+    hex ( 8  9 10 11  0  1  2  3) ($nx $ny $nr) grading (1 1 1)  // z-min
+    hex ( 4  5  6  7 12 13 14 15) ($nx $ny $nr) grading (1 1 1)  // z-max
 );
 
+
 edges
 (
-    arc  8  9 (0 $ma $ma)
-    arc 10 11 (0 $a $ma)
-    arc 14 15 (0 $a $a)
-    arc 12 13 (0 $ma $a)
-
-    arc  8 11 ($ma 0 $ma)
-    arc  9 10 ($a 0 $ma)
-    arc 13 14 ($a 0 $a)
-    arc 12 15 ($ma 0 $a)
-
-    arc  8 12 ($ma $ma 0)
-    arc  9 13 ($a $ma 0)
-    arc 10 14 ($a $a 0)
-    arc 11 15 ($ma $a 0)
-
-
-    arc  0  1 (0 $mah $mah)
-    arc  2  3 (0 $ah $mah)
-    arc  6  7 (0 $ah $ah)
-    arc  4  5 (0 $mah $ah)
-
-    arc  0  3 ($mah 0 $mah)
-    arc  1  2 ($ah 0 $mah)
-    arc  5  6 ($ah 0 $ah)
-    arc  4  7 ($mah 0 $ah)
-
-    arc  0  4 ($mah $mah 0)
-    arc  1  5 ($ah $mah 0)
-    arc  2  6 ($ah $ah 0)
-    arc  3  7 ($mah $ah 0)
+    // Outer blocks
+    arc  8  9 origin (0 0 0)
+    arc 10 11 origin (0 0 0)
+    arc 14 15 origin (0 0 0)
+    arc 12 13 origin (0 0 0)
+
+    arc  8 11 origin (0 0 0)
+    arc  9 10 origin (0 0 0)
+    arc 13 14 origin (0 0 0)
+    arc 12 15 origin (0 0 0)
+
+    arc  8 12 origin (0 0 0)
+    arc  9 13 origin (0 0 0)
+    arc 10 14 origin (0 0 0)
+    arc 11 15 origin (0 0 0)
+
+    // Inner block - flattened by factor 1.1
+    arc 0 1 origin 1.1 (0 0 0)
+    arc 2 3 origin 1.1 (0 0 0)
+    arc 6 7 origin 1.1 (0 0 0)
+    arc 4 5 origin 1.1 (0 0 0)
+
+    arc 0 3 origin 1.1 (0 0 0)
+    arc 1 2 origin 1.1 (0 0 0)
+    arc 5 6 origin 1.1 (0 0 0)
+    arc 4 7 origin 1.1 (0 0 0)
+
+    arc 0 4 origin 1.1 (0 0 0)
+    arc 1 5 origin 1.1 (0 0 0)
+    arc 2 6 origin 1.1 (0 0 0)
+    arc 3 7 origin 1.1 (0 0 0)
 );
 
 faces
 (
-    project ( 8 12 15 11) sphere
-    project (10 14 13  9) sphere
-    project ( 9 13 12  8) sphere
-    project (11 15 14 10) sphere
-    project ( 8 11 10  9) sphere
-    project (12 13 14 15) sphere
+    // Outer blocks
+    project ( 8 12 15 11) sphere  // x-min
+    project ( 9 10 14 13) sphere  // x-max
+    project ( 8  9 13 12) sphere  // y-min
+    project (11 15 14 10) sphere  // y-max
+    project ( 8 11 10  9) sphere  // z-min
+    project (12 13 14 15) sphere  // z-max
 );
 
 boundary
@@ -123,12 +135,12 @@ boundary
         type wall;
         faces
         (
-            ( 8 12 15 11)
-            (10 14 13  9)
-            ( 9 13 12  8)
-            (11 15 14 10)
-            ( 8 11 10  9)
-            (12 13 14 15)
+            ( 8 12 15 11)  // x-min
+            ( 9 10 14 13)  // x-max
+            ( 8  9 13 12)  // y-min
+            (11 15 14 10)  // y-max
+            ( 8 11 10  9)  // z-min
+            (12 13 14 15)  // z-max
         );
     }
 );
diff --git a/tutorials/mesh/blockMesh/sphere7ProjectedEdges/system/blockMeshDict b/tutorials/mesh/blockMesh/sphere7ProjectedEdges/system/blockMeshDict
index 27624af9302c8f0abc632035b5de717d260f4685..6f7108118ffc581c11a3823e5aebad685a7b0c78 100644
--- a/tutorials/mesh/blockMesh/sphere7ProjectedEdges/system/blockMeshDict
+++ b/tutorials/mesh/blockMesh/sphere7ProjectedEdges/system/blockMeshDict
@@ -17,68 +17,81 @@ FoamFile
 scale   1;
 verbose no;
 
+// Geometric parameters
+outerRadius 1;
+innerRatio  0.5;
+
+// Divisions in x/y/z and radial directions. Can be unequal.
+nx   10;
+ny   $nx;
+nz   $nx;
+nr   6;
+
 geometry
 {
     sphere
     {
         type   sphere;
         origin (0 0 0);
-        radius 1;
+        radius $outerRadius;
     }
 
     innerSphere
     {
         type   sphere;
         origin (0 0 0);
-        radius 0.5;
+        radius #eval{ $innerRatio * $outerRadius };
     }
 }
 
-n    10;
 
-// Rough approximation of corner points
-v    0.5773502;
-mv  -0.5773502;
-vh   0.2886751;
-mvh -0.2886751;
+// Outer box sizes (approximate)
+vo   #eval{ sqrt($outerRadius/3) };
+mvo  #eval{ -$vo };
+
+// Inner box sizes - % of overall dimension
+vi   #eval{ $innerRatio*$vo };
+mvi  #eval{ $innerRatio*$mvo };
 
 vertices
 (
     // Inner block points
-    project ($mvh $mvh $mvh) (innerSphere)
-    project ( $vh $mvh $mvh) (innerSphere)
-    project ( $vh  $vh $mvh) (innerSphere)
-    project ($mvh  $vh $mvh) (innerSphere)
-    project ($mvh $mvh  $vh) (innerSphere)
-    project ( $vh $mvh  $vh) (innerSphere)
-    project ( $vh  $vh  $vh) (innerSphere)
-    project ($mvh  $vh  $vh) (innerSphere)
+    project ($mvi $mvi $mvi) (innerSphere)
+    project ( $vi $mvi $mvi) (innerSphere)
+    project ( $vi  $vi $mvi) (innerSphere)
+    project ($mvi  $vi $mvi) (innerSphere)
+    project ($mvi $mvi  $vi) (innerSphere)
+    project ( $vi $mvi  $vi) (innerSphere)
+    project ( $vi  $vi  $vi) (innerSphere)
+    project ($mvi  $vi  $vi) (innerSphere)
 
     // Outer block points
-    project ($mv $mv $mv) (sphere)
-    project ( $v $mv $mv) (sphere)
-    project ( $v  $v $mv) (sphere)
-    project ($mv  $v $mv) (sphere)
-    project ($mv $mv  $v) (sphere)
-    project ( $v $mv  $v) (sphere)
-    project ( $v  $v  $v) (sphere)
-    project ($mv  $v  $v) (sphere)
+    project ($mvo $mvo $mvo) (sphere)
+    project ( $vo $mvo $mvo) (sphere)
+    project ( $vo  $vo $mvo) (sphere)
+    project ($mvo  $vo $mvo) (sphere)
+    project ($mvo $mvo  $vo) (sphere)
+    project ( $vo $mvo  $vo) (sphere)
+    project ( $vo  $vo  $vo) (sphere)
+    project ($mvo  $vo  $vo) (sphere)
 );
 
 blocks
 (
-    hex ( 0  1  2  3  4  5  6  7) ($n $n $n) simpleGrading (1 1 1)
-    hex ( 9  8 12 13  1  0  4  5) ($n $n $n) simpleGrading (1 1 1)
-    hex (10  9 13 14  2  1  5  6) ($n $n $n) simpleGrading (1 1 1)
-    hex (11 10 14 15  3  2  6  7) ($n $n $n) simpleGrading (1 1 1)
-    hex ( 8 11 15 12  0  3  7  4) ($n $n $n) simpleGrading (1 1 1)
-    hex ( 8  9 10 11  0  1  2  3) ($n $n $n) simpleGrading (1 1 1)
-    hex (13 12 15 14  5  4  7  6) ($n $n $n) simpleGrading (1 1 1)
+    hex (0 1 2 3 4 5 6 7) ($nx $ny $nz) grading (1 1 1)  // Inner block
+
+    // Outer blocks
+    hex ( 8  0  3 11 12  4  7 15) ($nr $ny $nz) grading (1 1 1)  // x-min
+    hex ( 1  9 10  2  5 13 14  6) ($nr $ny $nz) grading (1 1 1)  // x-max
+    hex ( 8  9  1  0 12 13  5  4) ($nx $nr $nz) grading (1 1 1)  // y-min
+    hex ( 3  2 10 11  7  6 14 15) ($nx $nr $nz) grading (1 1 1)  // y-max
+    hex ( 8  9 10 11  0  1  2  3) ($nx $ny $nr) grading (1 1 1)  // z-min
+    hex ( 4  5  6  7 12 13 14 15) ($nx $ny $nr) grading (1 1 1)  // z-max
 );
 
 edges
 (
-    // Outer edges
+    // Outer blocks
     project  8  9 (sphere)
     project 10 11 (sphere)
     project 14 15 (sphere)
@@ -94,32 +107,32 @@ edges
     project 10 14 (sphere)
     project 11 15 (sphere)
 
-
-    // Inner edges
-    project  0  1 (innerSphere)
-    project  2  3 (innerSphere)
-    project  6  7 (innerSphere)
-    project  4  5 (innerSphere)
-
-    project  0  3 (innerSphere)
-    project  1  2 (innerSphere)
-    project  5  6 (innerSphere)
-    project  4  7 (innerSphere)
-
-    project  0  4 (innerSphere)
-    project  1  5 (innerSphere)
-    project  2  6 (innerSphere)
-    project  3  7 (innerSphere)
+    // Inner block
+    project 0 1 (innerSphere)
+    project 2 3 (innerSphere)
+    project 6 7 (innerSphere)
+    project 4 5 (innerSphere)
+
+    project 0 3 (innerSphere)
+    project 1 2 (innerSphere)
+    project 5 6 (innerSphere)
+    project 4 7 (innerSphere)
+
+    project 0 4 (innerSphere)
+    project 1 5 (innerSphere)
+    project 2 6 (innerSphere)
+    project 3 7 (innerSphere)
 );
 
 faces
 (
-    project ( 8 12 15 11) sphere
-    project (10 14 13  9) sphere
-    project ( 9 13 12  8) sphere
-    project (11 15 14 10) sphere
-    project ( 8 11 10  9) sphere
-    project (12 13 14 15) sphere
+    // Outer blocks
+    project ( 8 12 15 11) sphere  // x-min
+    project ( 9 10 14 13) sphere  // x-max
+    project ( 8  9 13 12) sphere  // y-min
+    project (11 15 14 10) sphere  // y-max
+    project ( 8 11 10  9) sphere  // z-min
+    project (12 13 14 15) sphere  // z-max
 );
 
 boundary
@@ -129,12 +142,12 @@ boundary
         type wall;
         faces
         (
-            ( 8 12 15 11)
-            (10 14 13  9)
-            ( 9 13 12  8)
-            (11 15 14 10)
-            ( 8 11 10  9)
-            (12 13 14 15)
+            ( 8 12 15 11)  // x-min
+            ( 9 10 14 13)  // x-max
+            ( 8  9 13 12)  // y-min
+            (11 15 14 10)  // y-max
+            ( 8 11 10  9)  // z-min
+            (12 13 14 15)  // z-max
         );
     }
 );
diff --git a/tutorials/mesh/refineMesh/refineFieldDirs/system/blockMeshDict b/tutorials/mesh/refineMesh/refineFieldDirs/system/blockMeshDict
index a7266f14e154fb5b8e07e04efdf3a6ca0f9eebc8..f97a1d33872fbfa42ae9aff6acc086f705b52c1e 100644
--- a/tutorials/mesh/refineMesh/refineFieldDirs/system/blockMeshDict
+++ b/tutorials/mesh/refineMesh/refineFieldDirs/system/blockMeshDict
@@ -1,9 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v2006                                 |
+|   \\  /    A nd           | Website:  www.openfoam.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
 FoamFile
 {
     version     2.0;
     format      ascii;
     class       dictionary;
-    location    "system";
     object      blockMeshDict;
 }
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -25,13 +31,10 @@ scale   1;
                          D
 */
 
-Ax  0.438912;    Ay  0.000000;
-Bx  18.28800;    By  0.000000;
-Cx  0.310358;    Cy  -0.310358;
-Dx  12.931569;   Dy  -12.931569;
-
-Hx  0.405502;    Hy  -0.167964;
-Gx  16.895909;   Gy  -6.998515;
+Ax  0.438912;    Ay  0;
+Bx  18.28800;    By  0;
+Cx  0.310358;    Cy  #eval{-$Cx};
+Dx  12.931569;   Dy  #eval{-$Dx};
 
 Z_DB_low  -0.88706;
 Z_AC_low  -1.07;
@@ -51,16 +54,15 @@ vertices
 
 blocks
 (
-   hex (0 1 2 3 4 5 6 7)    (47 10 4) simpleGrading (41.6669 1 1)
+    hex (0 1 2 3 4 5 6 7) (47 10 4) simpleGrading (41.6669 1 1)
 );
 
 edges
 (
-  arc 0 3 ($Hx $Hy $Z_AC_low)
-  arc 4 7 ($Hx $Hy $Z_high)
-
-  arc 1 2 ($Gx $Gy $Z_DB_low)
-  arc 5 6 ($Gx $Gy $Z_high)
+    arc 0 3 origin (0 0 $Z_AC_low)
+    arc 4 7 origin (0 0 $Z_high)
+    arc 1 2 origin (0 0 $Z_DB_low)
+    arc 5 6 origin (0 0 $Z_high)
 );
 
 patches
diff --git a/tutorials/stressAnalysis/solidDisplacementFoam/plateHole/system/blockMeshDict b/tutorials/stressAnalysis/solidDisplacementFoam/plateHole/system/blockMeshDict
index bce421f9a9142cdf99073fa91943f07da006a5dc..b194cb8d50b037b77feffad798ad30e138476546 100644
--- a/tutorials/stressAnalysis/solidDisplacementFoam/plateHole/system/blockMeshDict
+++ b/tutorials/stressAnalysis/solidDisplacementFoam/plateHole/system/blockMeshDict
@@ -53,14 +53,14 @@ blocks
 
 edges
 (
-    arc 0 5 (0.469846 0.17101 0)
-    arc 5 10 (0.17101 0.469846 0)
-    arc 1 4 (0.939693 0.34202 0)
-    arc 4 9 (0.34202 0.939693 0)
-    arc 11 16 (0.469846 0.17101 0.5)
-    arc 16 21 (0.17101 0.469846 0.5)
-    arc 12 15 (0.939693 0.34202 0.5)
-    arc 15 20 (0.34202 0.939693 0.5)
+    arc  0  5 origin (0 0 0)
+    arc  5 10 origin (0 0 0)
+    arc  1  4 origin (0 0 0)
+    arc  4  9 origin (0 0 0)
+    arc 11 16 origin (0 0 0.5)
+    arc 16 21 origin (0 0 0.5)
+    arc 12 15 origin (0 0 0.5)
+    arc 15 20 origin (0 0 0.5)
 );
 
 boundary