diff --git a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementMerge.C b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementMerge.C
index dc16bd760f8f7b1985f380517979c69b54642034..6cc8d7c7bb5f7122f037386f0d1256ecab65c460 100644
--- a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementMerge.C
+++ b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementMerge.C
@@ -277,7 +277,11 @@ Foam::label Foam::meshRefinement::mergePatchFacesUndo
         }
     }
 
-    // Get all sets of faces that can be merged
+    // Get all sets of faces that can be merged. Since only faces on the same
+    // patch get merged there is no risk of e.g. patchID faces getting merged
+    // with original patches (or even processor patches). There is a risk
+    // though of original patchfaces getting merged if they make a small
+    // angle. Would be pretty weird starting mesh though.
     labelListList allFaceSets
     (
         faceCombiner.getMergeSets
@@ -352,27 +356,20 @@ Foam::label Foam::meshRefinement::mergePatchFacesUndo
         // Get the kept faces that need to be recalculated.
         // Merging two boundary faces might shift the cell centre
         // (unless the faces are absolutely planar)
-        labelHashSet retestFaces(6*allFaceSets.size());
+        labelHashSet retestFaces(2*allFaceSets.size());
 
         forAll(allFaceSets, setI)
         {
             label oldMasterI = allFaceSets[setI][0];
-
-            label faceI = map().reverseFaceMap()[oldMasterI];
-
-            // faceI is always uncoupled boundary face
-            const cell& cFaces = mesh_.cells()[mesh_.faceOwner()[faceI]];
-
-            forAll(cFaces, i)
-            {
-                retestFaces.insert(cFaces[i]);
-            }
+            retestFaces.insert(map().reverseFaceMap()[oldMasterI]);
         }
-        updateMesh(map, retestFaces.toc());
+        updateMesh(map, growFaceCellFace(retestFaces));
 
         if (debug)
         {
             // Check sync
+            Pout<< "Checking sync after initial merging " << nFaceSets
+                << " faces." << endl;
             checkData();
 
             Pout<< "Writing initial merged-faces mesh to time "
@@ -555,26 +552,18 @@ Foam::label Foam::meshRefinement::mergePatchFacesUndo
             // Get the kept faces that need to be recalculated.
             // Merging two boundary faces might shift the cell centre
             // (unless the faces are absolutely planar)
-            labelHashSet retestFaces(6*restoredFaces.size());
+            labelHashSet retestFaces(2*restoredFaces.size());
 
-            forAll(restoredFaces, setI)
+            forAllConstIter(Map<label>, restoredFaces, iter)
             {
-                label faceI = restoredFaces[setI];
-                // faceI is always uncoupled boundary face
-                const cell& cFaces = mesh_.cells()[mesh_.faceOwner()[faceI]];
-
-                forAll(cFaces, i)
-                {
-                    retestFaces.insert(cFaces[i]);
-                }
+                retestFaces.insert(iter.key());
             }
 
-
             // Experimental:restore all points/face/cells in maps
             updateMesh
             (
                 map,
-                retestFaces.toc(),
+                growFaceCellFace(retestFaces),
                 restoredPoints,
                 restoredFaces,
                 restoredCells
@@ -583,6 +572,8 @@ Foam::label Foam::meshRefinement::mergePatchFacesUndo
             if (debug)
             {
                 // Check sync
+                Pout<< "Checking sync after restoring " << retestFaces.size()
+                    << " faces." << endl;
                 checkData();
 
                 Pout<< "Writing merged-faces mesh to time "
@@ -635,7 +626,26 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::doRemovePoints
     mesh_.setInstance(timeName());
 
     pointRemover.updateMesh(map);
-    updateMesh(map, labelList(0));
+
+
+    // Retest all affected faces and all the cells using them
+    labelHashSet retestFaces(pointRemover.savedFaceLabels().size());
+    forAll(pointRemover.savedFaceLabels(), i)
+    {
+        label faceI = pointRemover.savedFaceLabels()[i];
+        if (faceI >= 0)
+        {
+            retestFaces.insert(faceI);
+        }
+    }
+    updateMesh(map, growFaceCellFace(retestFaces));
+
+    if (debug)
+    {
+        // Check sync
+        Pout<< "Checking sync after removing points." << endl;
+        checkData();
+    }
 
     return map;
 }
@@ -689,7 +699,25 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::doRestorePoints
     mesh_.setInstance(timeName());
 
     pointRemover.updateMesh(map);
-    updateMesh(map, labelList(0));
+
+    labelHashSet retestFaces(2*facesToRestore.size());
+    forAll(facesToRestore, i)
+    {
+        label faceI = map().reverseFaceMap()[facesToRestore[i]];
+        if (faceI >= 0)
+        {
+            retestFaces.insert(faceI);
+        }
+    }
+    updateMesh(map, growFaceCellFace(retestFaces));
+
+    if (debug)
+    {
+        // Check sync
+        Pout<< "Checking sync after restoring points on "
+            << facesToRestore.size() << " faces." << endl;
+        checkData();
+    }
 
     return map;
 }