diff --git a/src/mesh/snappyHexMesh/meshRefinement/meshRefinement.C b/src/mesh/snappyHexMesh/meshRefinement/meshRefinement.C
index 3c19ea7087253d67716b5d5f83d72362c8092386..0a3ffd140a8ef657001ff8ecd6203b23d124f8b4 100644
--- a/src/mesh/snappyHexMesh/meshRefinement/meshRefinement.C
+++ b/src/mesh/snappyHexMesh/meshRefinement/meshRefinement.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
-    Copyright (C) 2015-2021 OpenCFD Ltd.
+    Copyright (C) 2015-2022 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -129,6 +129,57 @@ static const Foam::polyMesh::cellDecomposition
 
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
+Foam::label Foam::meshRefinement::globalFaceCount(const labelList& elems) const
+{
+    //- Check for duplicates
+    const bitSet isElem(mesh_.nFaces(), elems);
+    if (label(isElem.count()) != elems.size())
+    {
+        FatalErrorInFunction << "Problem Duplicates:"
+            << " isElem:" << isElem.count()
+            << " elems:" << elems.size()
+            << exit(FatalError);
+    }
+
+    //- Check for same entries on coupled faces
+    {
+        bitSet isElem2(isElem);
+        syncTools::swapFaceList(mesh_, isElem2);
+
+        for
+        (
+            label facei = mesh_.nInternalFaces();
+            facei < mesh_.nFaces();
+            facei++
+        )
+        {
+            if (isElem2[facei] != isElem[facei])
+            {
+                FatalErrorInFunction
+                    << "at face:" << facei
+                    << " at:" << mesh_.faceCentres()[facei]
+                    << " patch:" << mesh_.boundaryMesh().whichPatch(facei)
+                    << " isElem:" << isElem[facei]
+                    << " isElem2:" << isElem2[facei]
+                    << exit(FatalError);
+            }
+        }
+    }
+
+    //- Count number of master elements
+    const bitSet isMaster(syncTools::getMasterFaces(mesh_));
+    label count = 0;
+    for (const label i : isElem)
+    {
+        if (isMaster[i])
+        {
+            count++;
+        }
+    }
+    return returnReduce(count, sumOp<label>());
+}
+
+
 void Foam::meshRefinement::calcNeighbourData
 (
     labelList& neiLevel,
diff --git a/src/mesh/snappyHexMesh/meshRefinement/meshRefinement.H b/src/mesh/snappyHexMesh/meshRefinement/meshRefinement.H
index 2afda90edbeb9b38900109a9744070ff9f674b49..0e753f206bb934f22e343a3073aeb261decb47f1 100644
--- a/src/mesh/snappyHexMesh/meshRefinement/meshRefinement.H
+++ b/src/mesh/snappyHexMesh/meshRefinement/meshRefinement.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
-    Copyright (C) 2015-2021 OpenCFD Ltd.
+    Copyright (C) 2015-2022 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -229,6 +229,10 @@ private:
             const labelList& oldCellsToRefine
         );
 
+        // Debug: count number of master-faces (and do some checking
+        // for consistency)
+        label globalFaceCount(const labelList& elems) const;
+
         //- Calculate coupled boundary end vector and refinement level
         void calcNeighbourData(labelList& neiLevel, pointField& neiCc) const;
 
diff --git a/src/mesh/snappyHexMesh/meshRefinement/meshRefinementGapRefine.C b/src/mesh/snappyHexMesh/meshRefinement/meshRefinementGapRefine.C
index ceacaf9fcf16565c6fdee1de8d27d927faa745f4..01af06203290b3070f2fbcbab8ca253f90d7c5bb 100644
--- a/src/mesh/snappyHexMesh/meshRefinement/meshRefinementGapRefine.C
+++ b/src/mesh/snappyHexMesh/meshRefinement/meshRefinementGapRefine.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2015 OpenFOAM Foundation
-    Copyright (C) 2015-2020 OpenCFD Ltd.
+    Copyright (C) 2015-2020,2022 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -1423,6 +1423,14 @@ Foam::label Foam::meshRefinement::markInternalGapRefinement
         // Spread it
         if (spreadGapSize)
         {
+            scalarField boundaryGapSize;
+            syncTools::swapBoundaryCellList
+            (
+                mesh_,
+                detectedGapSize,
+                boundaryGapSize
+            );
+
             // Field on cells and faces
             List<transportData> cellData(mesh_.nCells());
             List<transportData> faceData(mesh_.nFaces());
@@ -1466,7 +1474,13 @@ Foam::label Foam::meshRefinement::markInternalGapRefinement
             {
                 label own = mesh_.faceOwner()[faceI];
 
-                if (detectedGapSize[own] < GREAT)
+                scalar minSize = min
+                (
+                    detectedGapSize[own],
+                    boundaryGapSize[faceI-mesh_.nInternalFaces()]
+                );
+
+                if (minSize < GREAT)
                 {
                     frontFaces.append(faceI);
                     frontData.append
@@ -1474,7 +1488,7 @@ Foam::label Foam::meshRefinement::markInternalGapRefinement
                         transportData
                         (
                             faceCentres[faceI],
-                            detectedGapSize[own],
+                            minSize,
                             0.0
                         )
                     );
diff --git a/src/mesh/snappyHexMesh/meshRefinement/meshRefinementRefine.C b/src/mesh/snappyHexMesh/meshRefinement/meshRefinementRefine.C
index 69deef02ce46f4a6b71145b6b444c02dcac98118..0ee6267660d95deee49c634ee6a3eac827f55295 100644
--- a/src/mesh/snappyHexMesh/meshRefinement/meshRefinementRefine.C
+++ b/src/mesh/snappyHexMesh/meshRefinement/meshRefinementRefine.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
-    Copyright (C) 2015-2021 OpenCFD Ltd.
+    Copyright (C) 2015-2022 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -914,6 +914,9 @@ Foam::labelList Foam::meshRefinement::getRefineCandidateFaces
 
     const labelList& surfIndex = surfaceIndex();
 
+    labelList boundaryRefineCell;
+    syncTools::swapBoundaryCellList(mesh_, refineCell, boundaryRefineCell);
+
     forAll(surfIndex, faceI)
     {
         if (surfIndex[faceI] != -1)
@@ -931,7 +934,8 @@ Foam::labelList Foam::meshRefinement::getRefineCandidateFaces
             }
             else
             {
-                if (refineCell[own] == -1)
+                const label bFacei = faceI - mesh_.nInternalFaces();
+                if (refineCell[own] == -1 || boundaryRefineCell[bFacei] == -1)
                 {
                     testFaces[nTest++] = faceI;
                 }