diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/hexRef8/hexRef8.C b/src/dynamicMesh/polyTopoChange/polyTopoChange/hexRef8/hexRef8.C
index 373815305fed64f76038a2c171eddfdb65f44f0a..cd1b62ad59f2d01ab1dddd7f079f9dc9ab6e7949 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/hexRef8/hexRef8.C
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/hexRef8/hexRef8.C
@@ -48,6 +48,10 @@ License
 #include "refinementDistanceData.H"
 #include "degenerateMatcher.H"
 
+//#include "fvMesh.H"
+//#include "volFields.H"
+//#include "OBJstream.H"
+
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
 namespace Foam
@@ -2803,17 +2807,90 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
     }
 
 
+    //{
+    //    const fvMesh& fMesh = reinterpret_cast<const fvMesh&>(mesh_);
+    //
+    //    // Dump origin level
+    //    volScalarField originLevel
+    //    (
+    //        IOobject
+    //        (
+    //            "originLevel_before_walk",
+    //            fMesh.time().timeName(),
+    //            fMesh,
+    //            IOobject::NO_READ,
+    //            IOobject::NO_WRITE,
+    //            IOobject::NO_REGISTER
+    //        ),
+    //        fMesh,
+    //        dimensionedScalar(dimless, Zero)
+    //    );
+    //
+    //    forAll(originLevel, celli)
+    //    {
+    //        originLevel[celli] = allCellInfo[celli].originLevel();
+    //    }
+    //    Pout<< "Writing " << originLevel.objectPath() << endl;
+    //    originLevel.write();
+    //}
+    //{
+    //    const auto& cc = mesh_.cellCentres();
+    //
+    //    mkDir(mesh_.time().timePath());
+    //    OBJstream os(mesh_.time().timePath()/"origin_before_walk.obj");
+    //    forAll(allCellInfo, celli)
+    //    {
+    //        os.write(linePointRef(cc[celli], allCellInfo[celli].origin()));
+    //    }
+    //}
+
+
     // Labels of seed faces
     DynamicList<label> seedFaces(mesh_.nFaces()/100);
     // refinementLevel data on seed faces
     DynamicList<refinementDistanceData> seedFacesInfo(mesh_.nFaces()/100);
 
     const pointField& cc = mesh_.cellCentres();
+    const polyBoundaryMesh& patches = mesh_.boundaryMesh();
 
-    forAll(facesToCheck, i)
+    // Get neighbour boundary data:
+    // - coupled faces      : owner data
+    // - non-coupled faces  : owner level + 1 so we can treat
+    pointField nbrCc(mesh_.nBoundaryFaces(), point::max);
+    labelList nbrLevel(mesh_.nBoundaryFaces(), labelMax);
+    bitSet isBoundary(mesh_.nFaces());
     {
-        label facei = facesToCheck[i];
+        for (const polyPatch& pp : patches)
+        {
+            if (pp.coupled())
+            {
+                const auto& faceCells = pp.faceCells();
+                forAll(faceCells, i)
+                {
+                    const label own = faceCells[i];
+                    nbrCc[pp.offset()+i] = cc[own];
+
+                    const label ownLevel =
+                    (
+                        allCellInfo[own].valid(dummyTrackData)
+                      ? allCellInfo[own].originLevel()
+                      : cellLevel_[own]
+                    );
+                    nbrLevel[pp.offset()+i] = ownLevel;
+                }
+            }
+            else
+            {
+                isBoundary.set(pp.range());
+            }
+        }
+        syncTools::swapBoundaryFaceList(mesh_, nbrCc);
+        syncTools::swapBoundaryFaceList(mesh_, nbrLevel);
+    }
+
 
+    for (const label facei : facesToCheck)
+    {
         if (allFaceInfo[facei].valid(dummyTrackData))
         {
             // Can only occur if face has already gone through loop below.
@@ -2825,16 +2902,16 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
                 << abort(FatalError);
         }
 
-        label own = faceOwner[facei];
-
-        label ownLevel =
+        const label own = faceOwner[facei];
+        const label ownLevel =
         (
             allCellInfo[own].valid(dummyTrackData)
           ? allCellInfo[own].originLevel()
           : cellLevel_[own]
         );
+        const point& ownCc = cc[own];
 
-        if (!mesh_.isInternalFace(facei))
+        if (isBoundary(facei))
         {
             // Do as if boundary face would have neighbour with one higher
             // refinement level.
@@ -2859,14 +2936,24 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
         }
         else
         {
-            label nei = faceNeighbour[facei];
-
-            label neiLevel =
-            (
-                allCellInfo[nei].valid(dummyTrackData)
-              ? allCellInfo[nei].originLevel()
-              : cellLevel_[nei]
-            );
+            label neiLevel;
+            point neiCc;
+            if (mesh_.isInternalFace(facei))
+            { 
+                const label nei = faceNeighbour[facei];
+                neiLevel =
+                (
+                    allCellInfo[nei].valid(dummyTrackData)
+                  ? allCellInfo[nei].originLevel()
+                  : cellLevel_[nei]
+                );
+                neiCc = cc[nei];
+            }
+            else
+            {
+                neiLevel = nbrLevel[facei-mesh_.nInternalFaces()];
+                neiCc = nbrCc[facei-mesh_.nInternalFaces()];
+            }
 
             if (ownLevel == neiLevel)
             {
@@ -2875,8 +2962,8 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
                 (
                     mesh_,
                     facei,
-                    nei,
-                    refinementDistanceData(level0Size, cc[nei], neiLevel+1),
+                    own,    // not used, should be nei
+                    refinementDistanceData(level0Size, neiCc, neiLevel+1),
                     FaceCellWave<refinementDistanceData, int>::propagationTol(),
                     dummyTrackData
                 );
@@ -2884,8 +2971,8 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
                 (
                     mesh_,
                     facei,
-                    own,
-                    refinementDistanceData(level0Size, cc[own], ownLevel+1),
+                    own,    // not used
+                    refinementDistanceData(level0Size, ownCc, ownLevel+1),
                     FaceCellWave<refinementDistanceData, int>::propagationTol(),
                     dummyTrackData
                 );
@@ -2897,8 +2984,8 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
                 (
                     mesh_,
                     facei,
-                    nei,
-                    refinementDistanceData(level0Size, cc[nei], neiLevel),
+                    own,    // not used, should be nei
+                    refinementDistanceData(level0Size, neiCc, neiLevel),
                     FaceCellWave<refinementDistanceData, int>::propagationTol(),
                     dummyTrackData
                 );
@@ -2906,8 +2993,8 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
                 (
                     mesh_,
                     facei,
-                    own,
-                    refinementDistanceData(level0Size, cc[own], ownLevel),
+                    own,    // not used
+                    refinementDistanceData(level0Size, ownCc, ownLevel),
                     FaceCellWave<refinementDistanceData, int>::propagationTol(),
                     dummyTrackData
                 );
@@ -2918,31 +3005,45 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
     }
 
 
+
     // Create some initial seeds to start walking from. This is only if there
     // are no facesToCheck.
     // Just seed with all faces inbetween different refinement levels for now
-    forAll(faceNeighbour, facei)
+    // Note: no need to handle coupled faces since FaceCellWave below
+    //       already swaps seedInfo upon start
+    //forAll(faceNeighbour, facei)
+    forAll(faceOwner, facei)
     {
         // Check if face already handled in loop above
-        if (!allFaceInfo[facei].valid(dummyTrackData))
+        if (!allFaceInfo[facei].valid(dummyTrackData) && !isBoundary(facei))
         {
-            label own = faceOwner[facei];
-
-            label ownLevel =
+            const label own = faceOwner[facei];
+            const label ownLevel =
             (
                 allCellInfo[own].valid(dummyTrackData)
               ? allCellInfo[own].originLevel()
               : cellLevel_[own]
             );
+            const point& ownCc = cc[own];
 
-            label nei = faceNeighbour[facei];
-
-            label neiLevel =
-            (
-                allCellInfo[nei].valid(dummyTrackData)
-              ? allCellInfo[nei].originLevel()
-              : cellLevel_[nei]
-            );
+            label neiLevel;
+            point neiCc;
+            if (mesh_.isInternalFace(facei))
+            { 
+                const label nei = faceNeighbour[facei];
+                neiLevel =
+                (
+                    allCellInfo[nei].valid(dummyTrackData)
+                  ? allCellInfo[nei].originLevel()
+                  : cellLevel_[nei]
+                );
+                neiCc = cc[nei];
+            }
+            else
+            {
+                neiLevel = nbrLevel[facei-mesh_.nInternalFaces()];
+                neiCc = nbrCc[facei-mesh_.nInternalFaces()];
+            }
 
             if (ownLevel > neiLevel)
             {
@@ -2953,7 +3054,7 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
                     mesh_,
                     facei,
                     own,
-                    refinementDistanceData(level0Size, cc[own], ownLevel),
+                    refinementDistanceData(level0Size, ownCc, ownLevel),
                     FaceCellWave<refinementDistanceData, int>::propagationTol(),
                     dummyTrackData
                 );
@@ -2966,8 +3067,8 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
                 (
                     mesh_,
                     facei,
-                    nei,
-                    refinementDistanceData(level0Size, cc[nei], neiLevel),
+                    own,    // not used, should be nei,
+                    refinementDistanceData(level0Size, neiCc, neiLevel),
                     FaceCellWave<refinementDistanceData, int>::propagationTol(),
                     dummyTrackData
                 );
@@ -2992,8 +3093,45 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
     );
 
 
+    //- noted: origin is different face (? or cell) between non-parallel
+    //         and parallel
+    //{
+    //    const auto& cc = mesh_.cellCentres();
+    //
+    //    mkDir(mesh_.time().timePath());
+    //    OBJstream os(mesh_.time().timePath()/"origin_after_walk.obj");
+    //    forAll(allCellInfo, celli)
+    //    {
+    //        os.write(linePointRef(cc[celli], allCellInfo[celli].origin()));
+    //    }
+    //}
+
+
+
     //if (debug)
     //{
+    //    const fvMesh& fMesh = reinterpret_cast<const fvMesh&>(mesh_);
+    //
+    //    // Dump origin level
+    //    volScalarField originLevel
+    //    (
+    //        IOobject
+    //        (
+    //            "originLevel_after_walk",
+    //            fMesh.time().timeName(),
+    //            fMesh,
+    //            IOobject::NO_READ,
+    //            IOobject::NO_WRITE,
+    //            IOobject::NO_REGISTER
+    //        ),
+    //        fMesh,
+    //        dimensionedScalar(dimless, Zero)
+    //    );
+    //
+    //    forAll(originLevel, celli)
+    //    {
+    //        originLevel[celli] = allCellInfo[celli].originLevel();
+    //    }
     //    // Dump wanted level
     //    volScalarField wantedLevel
     //    (
@@ -3015,6 +3153,9 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
     //        wantedLevel[celli] = allCellInfo[celli].wantedLevel(cc[celli]);
     //    }
     //
+    //    Pout<< "Writing " << originLevel.objectPath() << endl;
+    //    //fMesh.write();
+    //    originLevel.write();
     //    Pout<< "Writing " << wantedLevel.objectPath() << endl;
     //    wantedLevel.write();
     //}