diff --git a/src/mesh/autoMesh/autoHexMesh/externalDisplacementMeshMover/medialAxisMeshMover.C b/src/mesh/autoMesh/autoHexMesh/externalDisplacementMeshMover/medialAxisMeshMover.C
index a6db1ff0b9c5d00ed487ea8d8485cc945d1d0974..0aa74be6c908020c934f2e7d1818fd59f3bb6332 100644
--- a/src/mesh/autoMesh/autoHexMesh/externalDisplacementMeshMover/medialAxisMeshMover.C
+++ b/src/mesh/autoMesh/autoHexMesh/externalDisplacementMeshMover/medialAxisMeshMover.C
@@ -51,7 +51,6 @@ namespace Foam
 
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
-
 Foam::labelList Foam::medialAxisMeshMover::getFixedValueBCs
 (
     const pointVectorField& fld
@@ -118,63 +117,6 @@ Foam::medialAxisMeshMover::getPatch
 }
 
 
-void Foam::medialAxisMeshMover::calculateEdgeWeights
-(
-    const PackedBoolList& isMasterEdge,
-    const labelList& meshEdges,
-    const labelList& meshPoints,
-    const edgeList& edges,
-    scalarField& edgeWeights,
-    scalarField& invSumWeight
-) const
-{
-    const pointField& pts = mesh().points();
-
-    // Calculate edgeWeights and inverse sum of edge weights
-    edgeWeights.setSize(meshEdges.size());
-    invSumWeight.setSize(meshPoints.size());
-
-    forAll(edges, edgeI)
-    {
-        const edge& e = edges[edgeI];
-        scalar eMag = max
-        (
-            VSMALL,
-            mag
-            (
-                pts[meshPoints[e[1]]]
-              - pts[meshPoints[e[0]]]
-            )
-        );
-        edgeWeights[edgeI] = 1.0/eMag;
-    }
-
-    // Sum per point all edge weights
-    weightedSum
-    (
-        mesh(),
-        isMasterEdge,
-        meshEdges,
-        meshPoints,
-        edges,
-        edgeWeights,
-        scalarField(meshPoints.size(), 1.0),  // data
-        invSumWeight
-    );
-
-    // Inplace invert
-    forAll(invSumWeight, pointI)
-    {
-        scalar w = invSumWeight[pointI];
-
-        if (w > 0.0)
-        {
-            invSumWeight[pointI] = 1.0/w;
-        }
-    }
-}
-
-
 void Foam::medialAxisMeshMover::smoothPatchNormals
 (
     const label nSmoothDisp,
@@ -193,8 +135,9 @@ void Foam::medialAxisMeshMover::smoothPatchNormals
 
     scalarField edgeWeights(meshEdges.size());
     scalarField invSumWeight(meshPoints.size());
-    calculateEdgeWeights
+    meshRefinement::calculateEdgeWeights
     (
+        mesh(),
         isMasterEdge,
         meshEdges,
         meshPoints,
@@ -207,7 +150,7 @@ void Foam::medialAxisMeshMover::smoothPatchNormals
     vectorField average;
     for (label iter = 0; iter < nSmoothDisp; iter++)
     {
-        weightedSum
+        meshRefinement::weightedSum
         (
             mesh(),
             isMasterEdge,
@@ -284,8 +227,9 @@ void Foam::medialAxisMeshMover::smoothNormals
 
     scalarField edgeWeights(meshEdges.size());
     scalarField invSumWeight(meshPoints.size());
-    calculateEdgeWeights
+    meshRefinement::calculateEdgeWeights
     (
+        mesh(),
         isMasterEdge,
         meshEdges,
         meshPoints,
@@ -297,7 +241,7 @@ void Foam::medialAxisMeshMover::smoothNormals
     vectorField average;
     for (label iter = 0; iter < nSmoothDisp; iter++)
     {
-        weightedSum
+        meshRefinement::weightedSum
         (
             mesh(),
             isMasterEdge,
@@ -1059,8 +1003,9 @@ void Foam::medialAxisMeshMover::minSmoothField
 
     scalarField edgeWeights(meshEdges.size());
     scalarField invSumWeight(meshPoints.size());
-    calculateEdgeWeights
+    meshRefinement::calculateEdgeWeights
     (
+        mesh(),
         isMasterEdge,
         meshEdges,
         meshPoints,
@@ -1075,7 +1020,7 @@ void Foam::medialAxisMeshMover::minSmoothField
     for (label iter = 0; iter < nSmoothDisp; iter++)
     {
         scalarField average(pp.nPoints());
-        weightedSum
+        meshRefinement::weightedSum
         (
             mesh(),
             isMasterEdge,
@@ -1534,8 +1479,9 @@ void Foam::medialAxisMeshMover::smoothLambdaMuDisplacement
     // Calculate inverse sum of weights
     scalarField edgeWeights(meshEdges.size());
     scalarField invSumWeight(meshPoints.size());
-    calculateEdgeWeights
+    meshRefinement::calculateEdgeWeights
     (
+        mesh(),
         isMasterEdge,
         meshEdges,
         meshPoints,
@@ -1554,7 +1500,7 @@ void Foam::medialAxisMeshMover::smoothLambdaMuDisplacement
 
     for (label iter = 0; iter < nSmoothDisp; iter++)
     {
-        weightedSum
+        meshRefinement::weightedSum
         (
             mesh(),
             isMasterEdge,
@@ -1575,7 +1521,7 @@ void Foam::medialAxisMeshMover::smoothLambdaMuDisplacement
             }
         }
 
-        weightedSum
+        meshRefinement::weightedSum
         (
             mesh(),
             isMasterEdge,
diff --git a/src/mesh/autoMesh/autoHexMesh/externalDisplacementMeshMover/medialAxisMeshMover.H b/src/mesh/autoMesh/autoHexMesh/externalDisplacementMeshMover/medialAxisMeshMover.H
index b402ecba259731069ccc03c8f02b8be9a87f2fb4..1c270de274fd857db5df10b3e594e1acba7fe876 100644
--- a/src/mesh/autoMesh/autoHexMesh/externalDisplacementMeshMover/medialAxisMeshMover.H
+++ b/src/mesh/autoMesh/autoHexMesh/externalDisplacementMeshMover/medialAxisMeshMover.H
@@ -105,31 +105,6 @@ class medialAxisMeshMover
             const labelList&
         );
 
-        //- Weighted sum (over all subset of mesh points) by
-        //  summing contribution from (master) edges
-        template<class Type>
-        static void weightedSum
-        (
-            const polyMesh& mesh,
-            const PackedBoolList& isMasterEdge,
-            const labelList& meshEdges,
-            const labelList& meshPoints,
-            const edgeList& edges,
-            const scalarField& edgeWeights,
-            const Field<Type>& data,
-            Field<Type>& sum
-        );
-
-        void calculateEdgeWeights
-        (
-            const PackedBoolList& isMasterEdge,
-            const labelList& meshEdges,
-            const labelList& meshPoints,
-            const edgeList& edges,
-            scalarField& edgeWeights,
-            scalarField& invSumWeight
-        ) const;
-
 
         // Calculation of medial axis information
 
@@ -314,12 +289,6 @@ public:
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-#ifdef NoRepository
-#   include "medialAxisMeshMoverTemplates.C"
-#endif
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
 #endif
 
 // ************************************************************************* //
diff --git a/src/mesh/autoMesh/autoHexMesh/externalDisplacementMeshMover/medialAxisMeshMoverTemplates.C b/src/mesh/autoMesh/autoHexMesh/externalDisplacementMeshMover/medialAxisMeshMoverTemplates.C
deleted file mode 100644
index edd053f63ff270de357ec0ca2d7c253ab51fb038..0000000000000000000000000000000000000000
--- a/src/mesh/autoMesh/autoHexMesh/externalDisplacementMeshMover/medialAxisMeshMoverTemplates.C
+++ /dev/null
@@ -1,93 +0,0 @@
-/*---------------------------------------------------------------------------*\
-  =========                 |
-  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-   \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2013 OpenFOAM Foundation
-     \\/     M anipulation  |
--------------------------------------------------------------------------------
-License
-    This file is part of OpenFOAM.
-
-    OpenFOAM is free software: you can redistribute it and/or modify it
-    under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
-    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-    for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
-
-\*---------------------------------------------------------------------------*/
-
-#include "medialAxisMeshMover.H"
-#include "syncTools.H"
-
-// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
-
-template<class Type>
-void Foam::medialAxisMeshMover::weightedSum
-(
-    const polyMesh& mesh,
-    const PackedBoolList& isMasterEdge,
-    const labelList& meshEdges,
-    const labelList& meshPoints,
-    const edgeList& edges,
-    const scalarField& edgeWeights,
-    const Field<Type>& pointData,
-    Field<Type>& sum
-)
-{
-    if
-    (
-        mesh.nEdges() != isMasterEdge.size()
-     || edges.size() != meshEdges.size()
-     || edges.size() != edgeWeights.size()
-     || meshPoints.size() != pointData.size()
-    )
-    {
-        FatalErrorIn("medialAxisMeshMover::weightedSum(..)")
-            << "Inconsistent sizes for edge or point data:"
-            << " meshEdges:" << meshEdges.size()
-            << " isMasterEdge:" << isMasterEdge.size()
-            << " edgeWeights:" << edgeWeights.size()
-            << " edges:" << edges.size()
-            << " pointData:" << pointData.size()
-            << " meshPoints:" << meshPoints.size()
-            << abort(FatalError);
-    }
-
-    sum.setSize(meshPoints.size());
-    sum = pTraits<Type>::zero;
-
-    forAll(edges, edgeI)
-    {
-        if (isMasterEdge.get(meshEdges[edgeI]) == 1)
-        {
-            const edge& e = edges[edgeI];
-
-            scalar eWeight = edgeWeights[edgeI];
-
-            label v0 = e[0];
-            label v1 = e[1];
-
-            sum[v0] += eWeight*pointData[v1];
-            sum[v1] += eWeight*pointData[v0];
-        }
-    }
-
-    syncTools::syncPointList
-    (
-        mesh,
-        meshPoints,
-        sum,
-        plusEqOp<Type>(),
-        pTraits<Type>::zero     // null value
-    );
-}
-
-
-// ************************************************************************* //
diff --git a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.C b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.C
index d93a5ca6d37b501bf12a060f503b2adda2c2d2e1..8d41eebd2540a279e5c3c95d5154624da9808725 100644
--- a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.C
+++ b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.C
@@ -1949,6 +1949,64 @@ void Foam::meshRefinement::checkCoupledFaceZones(const polyMesh& mesh)
 }
 
 
+void Foam::meshRefinement::calculateEdgeWeights
+(
+    const polyMesh& mesh,
+    const PackedBoolList& isMasterEdge,
+    const labelList& meshEdges,
+    const labelList& meshPoints,
+    const edgeList& edges,
+    scalarField& edgeWeights,
+    scalarField& invSumWeight
+)
+{
+    const pointField& pts = mesh.points();
+
+    // Calculate edgeWeights and inverse sum of edge weights
+    edgeWeights.setSize(meshEdges.size());
+    invSumWeight.setSize(meshPoints.size());
+
+    forAll(edges, edgeI)
+    {
+        const edge& e = edges[edgeI];
+        scalar eMag = max
+        (
+            VSMALL,
+            mag
+            (
+                pts[meshPoints[e[1]]]
+              - pts[meshPoints[e[0]]]
+            )
+        );
+        edgeWeights[edgeI] = 1.0/eMag;
+    }
+
+    // Sum per point all edge weights
+    weightedSum
+    (
+        mesh,
+        isMasterEdge,
+        meshEdges,
+        meshPoints,
+        edges,
+        edgeWeights,
+        scalarField(meshPoints.size(), 1.0),  // data
+        invSumWeight
+    );
+
+    // Inplace invert
+    forAll(invSumWeight, pointI)
+    {
+        scalar w = invSumWeight[pointI];
+
+        if (w > 0.0)
+        {
+            invSumWeight[pointI] = 1.0/w;
+        }
+    }
+}
+
+
 Foam::label Foam::meshRefinement::appendPatch
 (
     fvMesh& mesh,
@@ -2167,9 +2225,7 @@ Foam::label Foam::meshRefinement::addMeshedPatch
 //        );
 
         // Store
-        label sz = meshedPatches_.size();
-        meshedPatches_.setSize(sz+1);
-        meshedPatches_[sz] = name;
+        meshedPatches_.append(name);
 
         return patchI;
     }
diff --git a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H
index f8d6258ba7c88deb888272674a583525308a19ba..57114bd7404e6358535df9f598a2de00f01fe84f 100644
--- a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H
+++ b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H
@@ -729,6 +729,33 @@ public:
             //- Helper function: check that face zones are synced
             static void checkCoupledFaceZones(const polyMesh&);
 
+            //- Helper: calculate edge weights (1/length)
+            static void calculateEdgeWeights
+            (
+                const polyMesh& mesh,
+                const PackedBoolList& isMasterEdge,
+                const labelList& meshEdges,
+                const labelList& meshPoints,
+                const edgeList& edges,
+                scalarField& edgeWeights,
+                scalarField& invSumWeight
+            );
+
+            //- Helper: weighted sum (over all subset of mesh points) by
+            //  summing contribution from (master) edges
+            template<class Type>
+            static void weightedSum
+            (
+                const polyMesh& mesh,
+                const PackedBoolList& isMasterEdge,
+                const labelList& meshEdges,
+                const labelList& meshPoints,
+                const edgeList& edges,
+                const scalarField& edgeWeights,
+                const Field<Type>& data,
+                Field<Type>& sum
+            );
+
 
         // Refinement
 
diff --git a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementRefine.C b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementRefine.C
index a7084e9fc6ef204bd6e1c658ea5bf617e7fe44cd..701c0dbbc077d1f58f5b92cff33265c6cefb711f 100644
--- a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementRefine.C
+++ b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementRefine.C
@@ -458,10 +458,18 @@ void Foam::meshRefinement::markFeatureCellLevel
     // Database to pass into trackedParticle::move
     trackedParticle::trackingData td(startPointCloud, maxFeatureLevel);
 
+
     // Track all particles to their end position (= starting feature point)
     // Note that the particle might have started on a different processor
     // so this will transfer across nicely until we can start tracking proper.
     scalar maxTrackLen = 2.0*mesh_.bounds().mag();
+
+    if (debug&meshRefinement::FEATURESEEDS)
+    {
+        Pout<< "Tracking " << startPointCloud.size()
+            << " particles over distance " << maxTrackLen
+            << " to find the starting cell" << endl;
+    }
     startPointCloud.move(td, maxTrackLen);
 
 
@@ -485,6 +493,11 @@ void Foam::meshRefinement::markFeatureCellLevel
         IDLList<trackedParticle>()
     );
 
+    if (debug&meshRefinement::FEATURESEEDS)
+    {
+        Pout<< "Constructing cloud for cell marking" << endl;
+    }
+
     forAllIter(Cloud<trackedParticle>, startPointCloud, iter)
     {
         const trackedParticle& startTp = iter();
@@ -532,11 +545,14 @@ void Foam::meshRefinement::markFeatureCellLevel
     while (true)
     {
         // Track all particles to their end position.
+        if (debug&meshRefinement::FEATURESEEDS)
+        {
+            Pout<< "Tracking " << cloud.size()
+                << " particles over distance " << maxTrackLen
+                << " to mark cells" << endl;
+        }
         cloud.move(td, maxTrackLen);
 
-
-        label nParticles = 0;
-
         // Make particle follow edge.
         forAllIter(Cloud<trackedParticle>, cloud, iter)
         {
@@ -578,15 +594,15 @@ void Foam::meshRefinement::markFeatureCellLevel
                 // seeded. Delete particle.
                 cloud.deleteParticle(tp);
             }
-            else
-            {
-                // Keep particle
-                nParticles++;
-            }
         }
 
-        reduce(nParticles, sumOp<label>());
-        if (nParticles == 0)
+
+        if (debug&meshRefinement::FEATURESEEDS)
+        {
+            Pout<< "Remaining particles " << cloud.size() << endl;
+        }
+
+        if (returnReduce(cloud.size(), sumOp<label>()) == 0)
         {
             break;
         }
diff --git a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementTemplates.C b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementTemplates.C
index 45fcee4d5d793861002b045680ef7763618c8005..528e812197f2da2fd1870d9a5b43bdb04be5042e 100644
--- a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementTemplates.C
+++ b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementTemplates.C
@@ -26,16 +26,12 @@ License
 #include "meshRefinement.H"
 #include "fvMesh.H"
 #include "globalIndex.H"
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-namespace Foam
-{
+#include "syncTools.H"
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 // Add a T entry
-template<class T> void meshRefinement::updateList
+template<class T> void Foam::meshRefinement::updateList
 (
     const labelList& newToOld,
     const T& nullValue,
@@ -59,7 +55,7 @@ template<class T> void meshRefinement::updateList
 
 
 template<class T>
-T meshRefinement::gAverage
+T Foam::meshRefinement::gAverage
 (
     const polyMesh& mesh,
     const PackedBoolList& isMasterElem,
@@ -109,7 +105,7 @@ T meshRefinement::gAverage
 
 
 template<class T>
-T meshRefinement::gAverage
+T Foam::meshRefinement::gAverage
 (
     const polyMesh& mesh,
     const PackedBoolList& isMasterElem,
@@ -162,7 +158,7 @@ T meshRefinement::gAverage
 
 // Compare two lists over all boundary faces
 template<class T>
-void meshRefinement::testSyncBoundaryFaceList
+void Foam::meshRefinement::testSyncBoundaryFaceList
 (
     const scalar tol,
     const string& msg,
@@ -222,7 +218,7 @@ void meshRefinement::testSyncBoundaryFaceList
 // Print list sorted by coordinates. Used for comparing non-parallel v.s.
 // parallel operation
 template<class T>
-void meshRefinement::collectAndPrint
+void Foam::meshRefinement::collectAndPrint
 (
     const UList<point>& points,
     const UList<T>& data
@@ -268,7 +264,11 @@ void meshRefinement::collectAndPrint
 
 //template<class T, class Mesh>
 template<class GeoField>
-void meshRefinement::addPatchFields(fvMesh& mesh, const word& patchFieldType)
+void Foam::meshRefinement::addPatchFields
+(
+    fvMesh& mesh,
+    const word& patchFieldType
+)
 {
     HashTable<GeoField*> flds
     (
@@ -298,7 +298,11 @@ void meshRefinement::addPatchFields(fvMesh& mesh, const word& patchFieldType)
 
 // Reorder patch field
 template<class GeoField>
-void meshRefinement::reorderPatchFields(fvMesh& mesh, const labelList& oldToNew)
+void Foam::meshRefinement::reorderPatchFields
+(
+    fvMesh& mesh,
+    const labelList& oldToNew
+)
 {
     HashTable<GeoField*> flds
     (
@@ -316,7 +320,11 @@ void meshRefinement::reorderPatchFields(fvMesh& mesh, const labelList& oldToNew)
 
 
 template<class Enum>
-int meshRefinement::readFlags(const Enum& namedEnum, const wordList& words)
+int Foam::meshRefinement::readFlags
+(
+    const Enum& namedEnum,
+    const wordList& words
+)
 {
     int flags = 0;
 
@@ -330,8 +338,66 @@ int meshRefinement::readFlags(const Enum& namedEnum, const wordList& words)
 }
 
 
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+template<class Type>
+void Foam::meshRefinement::weightedSum
+(
+    const polyMesh& mesh,
+    const PackedBoolList& isMasterEdge,
+    const labelList& meshEdges,
+    const labelList& meshPoints,
+    const edgeList& edges,
+    const scalarField& edgeWeights,
+    const Field<Type>& pointData,
+    Field<Type>& sum
+)
+{
+    if
+    (
+        mesh.nEdges() != isMasterEdge.size()
+     || edges.size() != meshEdges.size()
+     || edges.size() != edgeWeights.size()
+     || meshPoints.size() != pointData.size()
+    )
+    {
+        FatalErrorIn("medialAxisMeshMover::weightedSum(..)")
+            << "Inconsistent sizes for edge or point data:"
+            << " meshEdges:" << meshEdges.size()
+            << " isMasterEdge:" << isMasterEdge.size()
+            << " edgeWeights:" << edgeWeights.size()
+            << " edges:" << edges.size()
+            << " pointData:" << pointData.size()
+            << " meshPoints:" << meshPoints.size()
+            << abort(FatalError);
+    }
+
+    sum.setSize(meshPoints.size());
+    sum = pTraits<Type>::zero;
+
+    forAll(edges, edgeI)
+    {
+        if (isMasterEdge.get(meshEdges[edgeI]) == 1)
+        {
+            const edge& e = edges[edgeI];
+
+            scalar eWeight = edgeWeights[edgeI];
+
+            label v0 = e[0];
+            label v1 = e[1];
+
+            sum[v0] += eWeight*pointData[v1];
+            sum[v1] += eWeight*pointData[v0];
+        }
+    }
+
+    syncTools::syncPointList
+    (
+        mesh,
+        meshPoints,
+        sum,
+        plusEqOp<Type>(),
+        pTraits<Type>::zero     // null value
+    );
+}
 
-} // End namespace Foam
 
 // ************************************************************************* //