diff --git a/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C b/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C
index 6b6343091872e0e1dc15997225e917f1a7146516..2406cb667c45098ebd0ae54dfbf61f325e48d68c 100644
--- a/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C
+++ b/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C
@@ -369,7 +369,10 @@ int main(int argc, char *argv[])
     // Add all the surface regions as patches
     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-    labelList globalToPatch;
+    //- Global surface region to patch (non faceZone surface) or patches
+    //  (faceZone surfaces)
+    labelList globalToMasterPatch;
+    labelList globalToSlavePatch;
     {
         Info<< nl
             << "Adding patches for surface regions" << nl
@@ -377,7 +380,8 @@ int main(int argc, char *argv[])
             << endl;
 
         // From global region number to mesh patch.
-        globalToPatch.setSize(surfaces.nRegions(), -1);
+        globalToMasterPatch.setSize(surfaces.nRegions(), -1);
+        globalToSlavePatch.setSize(surfaces.nRegions(), -1);
 
         Info<< "Patch\tType\tRegion" << nl
             << "-----\t----\t------"
@@ -394,36 +398,111 @@ int main(int argc, char *argv[])
 
             Info<< surfaces.names()[surfI] << ':' << nl << nl;
 
-            forAll(regNames, i)
+            if (surfaces.faceZoneNames()[surfI].empty())
             {
-                label globalRegionI = surfaces.globalRegion(surfI, i);
-
-                label patchI;
-
-                if (surfacePatchInfo.set(globalRegionI))
+                // 'Normal' surface
+                forAll(regNames, i)
                 {
-                    patchI = meshRefiner.addMeshedPatch
-                    (
-                        regNames[i],
-                        surfacePatchInfo[globalRegionI]
-                    );
+                    label globalRegionI = surfaces.globalRegion(surfI, i);
+
+                    label patchI;
+
+                    if (surfacePatchInfo.set(globalRegionI))
+                    {
+                        patchI = meshRefiner.addMeshedPatch
+                        (
+                            regNames[i],
+                            surfacePatchInfo[globalRegionI]
+                        );
+                    }
+                    else
+                    {
+                        dictionary patchInfo;
+                        patchInfo.set("type", wallPolyPatch::typeName);
+
+                        patchI = meshRefiner.addMeshedPatch
+                        (
+                            regNames[i],
+                            patchInfo
+                        );
+                    }
+
+                    Info<< patchI << '\t' << mesh.boundaryMesh()[patchI].type()
+                        << '\t' << regNames[i] << nl;
+
+                    globalToMasterPatch[globalRegionI] = patchI;
+                    globalToSlavePatch[globalRegionI] = patchI;
                 }
-                else
+            }
+            else
+            {
+                // Zoned surface
+                forAll(regNames, i)
                 {
-                    dictionary patchInfo;
-                    patchInfo.set("type", wallPolyPatch::typeName);
-
-                    patchI = meshRefiner.addMeshedPatch
-                    (
-                        regNames[i],
-                        patchInfo
-                    );
+                    label globalRegionI = surfaces.globalRegion(surfI, i);
+
+                    // Add master side patch
+                    {
+                        label patchI;
+
+                        if (surfacePatchInfo.set(globalRegionI))
+                        {
+                            patchI = meshRefiner.addMeshedPatch
+                            (
+                                regNames[i],
+                                surfacePatchInfo[globalRegionI]
+                            );
+                        }
+                        else
+                        {
+                            dictionary patchInfo;
+                            patchInfo.set("type", wallPolyPatch::typeName);
+
+                            patchI = meshRefiner.addMeshedPatch
+                            (
+                                regNames[i],
+                                patchInfo
+                            );
+                        }
+
+                        Info<< patchI << '\t'
+                            << mesh.boundaryMesh()[patchI].type()
+                            << '\t' << regNames[i] << nl;
+
+                        globalToMasterPatch[globalRegionI] = patchI;
+                    }
+                    // Add slave side patch
+                    {
+                        const word slaveName = regNames[i] + "_slave";
+                        label patchI;
+
+                        if (surfacePatchInfo.set(globalRegionI))
+                        {
+                            patchI = meshRefiner.addMeshedPatch
+                            (
+                                slaveName,
+                                surfacePatchInfo[globalRegionI]
+                            );
+                        }
+                        else
+                        {
+                            dictionary patchInfo;
+                            patchInfo.set("type", wallPolyPatch::typeName);
+
+                            patchI = meshRefiner.addMeshedPatch
+                            (
+                                slaveName,
+                                patchInfo
+                            );
+                        }
+
+                        Info<< patchI << '\t'
+                            << mesh.boundaryMesh()[patchI].type()
+                            << '\t' << slaveName << nl;
+
+                        globalToSlavePatch[globalRegionI] = patchI;
+                    }
                 }
-
-                Info<< patchI << '\t' << mesh.boundaryMesh()[patchI].type()
-                    << '\t' << regNames[i] << nl;
-
-                globalToPatch[globalRegionI] = patchI;
             }
 
             Info<< nl;
@@ -479,7 +558,8 @@ int main(int argc, char *argv[])
             meshRefiner,
             decomposer,
             distributor,
-            globalToPatch
+            globalToMasterPatch,
+            globalToSlavePatch
         );
 
         // Refinement parameters
@@ -510,7 +590,8 @@ int main(int argc, char *argv[])
         autoSnapDriver snapDriver
         (
             meshRefiner,
-            globalToPatch
+            globalToMasterPatch,
+            globalToSlavePatch
         );
 
         // Snap parameters
@@ -544,7 +625,12 @@ int main(int argc, char *argv[])
     {
         cpuTime timer;
 
-        autoLayerDriver layerDriver(meshRefiner, globalToPatch);
+        autoLayerDriver layerDriver
+        (
+            meshRefiner,
+            globalToMasterPatch,
+            globalToSlavePatch
+        );
 
         // Layer addition parameters
         layerParameters layerParams(layerDict, mesh.boundaryMesh());
diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C
index b08cccbb85c77cc5ccded24f6617f607d82946fc..7dff414859ad2bcc67ebac9a01653bc7ed17f0b5 100644
--- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C
+++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C
@@ -2372,11 +2372,13 @@ void Foam::autoLayerDriver::getLayerCellsFaces
 Foam::autoLayerDriver::autoLayerDriver
 (
     meshRefinement& meshRefiner,
-    const labelList& globalToPatch
+    const labelList& globalToMasterPatch,
+    const labelList& globalToSlavePatch
 )
 :
     meshRefiner_(meshRefiner),
-    globalToPatch_(globalToPatch)
+    globalToMasterPatch_(globalToMasterPatch),
+    globalToSlavePatch_(globalToSlavePatch)
 {}
 
 
@@ -2435,7 +2437,12 @@ void Foam::autoLayerDriver::addLayers
     // Create baffles (pairs of faces that share the same points)
     // Baffles stored as owner and neighbour face that have been created.
     List<labelPair> baffles;
-    meshRefiner_.createZoneBaffles(globalToPatch_, baffles);
+    meshRefiner_.createZoneBaffles
+    (
+        globalToMasterPatch_,
+        globalToSlavePatch_,
+        baffles
+    );
 
     if (debug&meshRefinement::MESH)
     {
diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.H b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.H
index 272f1af09e8fd06083b641412c5fd356377991af..416544a7199de145d4400e14b2d71c58b8d1d9a0 100644
--- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.H
+++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.H
@@ -99,7 +99,10 @@ class autoLayerDriver
         meshRefinement& meshRefiner_;
 
         //- From surface region to patch
-        const labelList globalToPatch_;
+        const labelList globalToMasterPatch_;
+
+        //- From surface region to patch
+        const labelList globalToSlavePatch_;
 
 
 
@@ -518,7 +521,8 @@ public:
         autoLayerDriver
         (
             meshRefinement& meshRefiner,
-            const labelList& globalToPatch
+            const labelList& globalToMasterPatch,
+            const labelList& globalToSlavePatch
         );
 
 
diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriverShrink.C b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriverShrink.C
index 73d09f449ffbbf6980326229cf30b4e6da480b97..8ffcaa5f57874ef0ee7eb702dbf18cf8f35e801f 100644
--- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriverShrink.C
+++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriverShrink.C
@@ -1135,6 +1135,12 @@ void Foam::autoLayerDriver::medialAxisSmoothingInfo
             << "    " << medialRatio.name()
             << " : ratio of medial distance to wall distance" << nl
             << endl;
+        meshRefiner_.mesh().setInstance(meshRefiner_.timeName());
+        meshRefiner_.write
+        (
+            debug,
+            mesh.time().path()/meshRefiner_.timeName()
+        );
         dispVec.write();
         medialDist.write();
         medialVec.write();
@@ -1409,6 +1415,94 @@ void Foam::autoLayerDriver::shrinkMeshMedialDistance
             *dispVec[pointI];
     }
 
+
+
+//XXXXX
+//    // Smear displacement away from fixed values (medialRatio=0 or 1)
+//    {
+//        const edgeList& edges = mesh.edges();
+//        scalarField edgeWeight(edges.size(), 0.0);
+//        forAll(edges, edgeI)
+//        {
+//            if (isMasterEdge[edgeI])
+//            {
+//                scalar eMag = edges[edgeI].mag(mesh.points());
+//                if (eMag > VSMALL)
+//                {
+//                    edgeWeight[edgeI] = 1.0/eMag;
+//                }
+//                else
+//                {
+//                    edgeWeight[edgeI] = GREAT;
+//                }
+//            }
+//        }
+//        scalarField invSumWeight(mesh.nPoints());
+//        sumWeights(isMasterEdge, edgeWeight, invSumWeight);
+//
+//
+//        // Get smoothly varying patch field.
+//        Info<< "shrinkMeshDistance : Smoothing displacement ..." << endl;
+//
+//        const scalar lambda = 0.33;
+//        const scalar mu = -0.34;
+//
+//        pointField average(mesh.nPoints());
+//        for (label iter = 0; iter < 90; iter++)
+//        {
+//            // Calculate average of field
+//            averageNeighbours
+//            (
+//                mesh,
+//                edgeWeight,
+//                invSumWeight,
+//                displacement,
+//                average
+//            );
+//
+//            forAll(displacement, i)
+//            {
+//                if (medialRatio[i] > SMALL && medialRatio[i] < 1-SMALL)
+//                {
+//                    displacement[i] =
+//                        (1-lambda)*displacement[i]
+//                       +lambda*average[i];
+//                }
+//            }
+//
+//
+//            // Calculate average of field
+//            averageNeighbours
+//            (
+//                mesh,
+//                edgeWeight,
+//                invSumWeight,
+//                displacement,
+//                average
+//            );
+//
+//            forAll(displacement, i)
+//            {
+//                if (medialRatio[i] > SMALL && medialRatio[i] < 1-SMALL)
+//                {
+//                    displacement[i] = (1-mu)*displacement[i]+mu*average[i];
+//                }
+//            }
+//
+//
+//            // Do residual calculation every so often.
+//            if ((iter % 10) == 0)
+//            {
+//                Info<< "    Iteration " << iter << "   residual "
+//                    <<  gSum(mag(displacement-average))
+//                       /returnReduce(average.size(), sumOp<label>())
+//                    << endl;
+//            }
+//        }
+//    }
+//XXXXX
+
+
     if (debug&meshRefinement::MESH || debug&meshRefinement::LAYERINFO)
     {
         const_cast<Time&>(mesh.time())++;
diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.C b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.C
index dfd769fd15002f3474084f4c40bcf11733593c88..d1cb523361e99d17b4a3ddc474eec20096c01196 100644
--- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.C
+++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.C
@@ -57,13 +57,15 @@ Foam::autoRefineDriver::autoRefineDriver
     meshRefinement& meshRefiner,
     decompositionMethod& decomposer,
     fvMeshDistribute& distributor,
-    const labelList& globalToPatch
+    const labelList& globalToMasterPatch,
+    const labelList& globalToSlavePatch
 )
 :
     meshRefiner_(meshRefiner),
     decomposer_(decomposer),
     distributor_(distributor),
-    globalToPatch_(globalToPatch)
+    globalToMasterPatch_(globalToMasterPatch),
+    globalToSlavePatch_(globalToSlavePatch)
 {}
 
 
@@ -313,7 +315,8 @@ void Foam::autoRefineDriver::removeInsideCells
     meshRefiner_.splitMesh
     (
         nBufferLayers,                  // nBufferLayers
-        globalToPatch_,
+        globalToMasterPatch_,
+        globalToSlavePatch_,
         refineParams.keepPoints()[0]
     );
 
@@ -521,7 +524,8 @@ void Foam::autoRefineDriver::baffleAndSplitMesh
         !handleSnapProblems,            // merge free standing baffles?
         motionDict,
         const_cast<Time&>(mesh.time()),
-        globalToPatch_,
+        globalToMasterPatch_,
+        globalToSlavePatch_,
         refineParams.keepPoints()[0]
     );
 }
@@ -606,7 +610,8 @@ void Foam::autoRefineDriver::splitAndMergeBaffles
         //true,                               // merge free standing baffles?
         motionDict,
         const_cast<Time&>(mesh.time()),
-        globalToPatch_,
+        globalToMasterPatch_,
+        globalToSlavePatch_,
         refineParams.keepPoints()[0]
     );
 
diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.H b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.H
index d75dd5daf5f840c5b22d6af6553465a72ba05422..37a0f6b10258fd7ed7a1d54b6a66c447720ee678 100644
--- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.H
+++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -65,7 +65,10 @@ class autoRefineDriver
         fvMeshDistribute& distributor_;
 
         //- From surface region to patch
-        const labelList globalToPatch_;
+        const labelList globalToMasterPatch_;
+
+        //- From surface region to patch
+        const labelList globalToSlavePatch_;
 
 
     // Private Member Functions
@@ -146,7 +149,8 @@ public:
             meshRefinement& meshRefiner,
             decompositionMethod& decomposer,
             fvMeshDistribute& distributor,
-            const labelList& globalToPatch
+            const labelList& globalToMasterPatch,
+            const labelList& globalToSlavePatch
         );
 
 
diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C
index 54a78f477c6a5e7170572da5c8867654c564c543..b7b79d715e3e71cd3ca2656d511ff86b46ac3282 100644
--- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C
+++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C
@@ -573,11 +573,13 @@ bool Foam::autoSnapDriver::outwardsDisplacement
 Foam::autoSnapDriver::autoSnapDriver
 (
     meshRefinement& meshRefiner,
-    const labelList& globalToPatch
+    const labelList& globalToMasterPatch,
+    const labelList& globalToSlavePatch
 )
 :
     meshRefiner_(meshRefiner),
-    globalToPatch_(globalToPatch)
+    globalToMasterPatch_(globalToMasterPatch),
+    globalToSlavePatch_(globalToSlavePatch)
 {}
 
 
@@ -1191,7 +1193,7 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::autoSnapDriver::repatchToSurface
 
             if (hitSurface[i] != -1 && !isZonedFace.get(faceI))
             {
-                closestPatch[i] = globalToPatch_
+                closestPatch[i] = globalToMasterPatch_
                 [
                     surfaces.globalRegion
                     (
@@ -1265,7 +1267,12 @@ void Foam::autoSnapDriver::doSnap
     // Create baffles (pairs of faces that share the same points)
     // Baffles stored as owner and neighbour face that have been created.
     List<labelPair> baffles;
-    meshRefiner_.createZoneBaffles(globalToPatch_, baffles);
+    meshRefiner_.createZoneBaffles
+    (
+        globalToMasterPatch_,
+        globalToSlavePatch_,
+        baffles
+    );
 
 
     // Selectively 'forget' about the baffles, i.e. not check across them
diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.H b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.H
index e4cea95be28ea6efe80a06f044f96a678ef3b0a2..e6763bc084850a9150d726e7a880544093755f59 100644
--- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.H
+++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.H
@@ -59,8 +59,11 @@ class autoSnapDriver
         //- Mesh+surface
         meshRefinement& meshRefiner_;
 
-        //- From surface region to patch
-        const labelList globalToPatch_;
+        //- From global surface region to master side patch
+        const labelList globalToMasterPatch_;
+
+        //- From global surface region to slave side patch
+        const labelList globalToSlavePatch_;
 
 
     // Private Member Functions
@@ -390,7 +393,8 @@ public:
         autoSnapDriver
         (
             meshRefinement& meshRefiner,
-            const labelList& globalToPatch
+            const labelList& globalToMasterPatch,
+            const labelList& globalToSlavePatch
         );
 
 
diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriverFeature.C b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriverFeature.C
index b9990cb078b09ab7c927276aacec3a8fa9195dc1..7285c1ed003b3a3de61b1c54c38bed4f8acc6b54 100644
--- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriverFeature.C
+++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriverFeature.C
@@ -573,7 +573,7 @@ void Foam::autoSnapDriver::calcNearestFacePointProperties
             pFc[i] = pp.faceCentres()[faceI];
             //label meshFaceI = pp.addressing()[faceI];
             //pFid[i] = mesh.boundaryMesh().whichPatch(meshFaceI);
-            pFid[i] = globalToPatch_[faceSurfaceGlobalRegion[faceI]];
+            pFid[i] = globalToMasterPatch_[faceSurfaceGlobalRegion[faceI]];
         }
     }
 
diff --git a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.C b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.C
index 26a40327d6f610118c88c560b43419e7b8c86587..69cdf234cdb41828140af5bc4553d348a05f2de9 100644
--- a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.C
+++ b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.C
@@ -55,6 +55,7 @@ License
 #include "searchableSurfaces.H"
 #include "treeBoundBox.H"
 #include "zeroGradientFvPatchFields.H"
+#include "fvMeshTools.H"
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
@@ -1700,7 +1701,7 @@ Foam::label Foam::meshRefinement::addPatch
     oldToNew[addedPatchI] = insertPatchI;
 
     // Shuffle into place
-    polyPatches.reorder(oldToNew);
+    polyPatches.reorder(oldToNew, true);
     fvPatches.reorder(oldToNew);
 
     reorderPatchFields<volScalarField>(mesh, oldToNew);
@@ -1736,6 +1737,28 @@ Foam::label Foam::meshRefinement::addMeshedPatch
         // Add patch
         label patchI = addPatch(mesh_, name, patchInfo);
 
+//        dictionary patchDict(patchInfo);
+//        patchDict.set("nFaces", 0);
+//        patchDict.set("startFace", 0);
+//        autoPtr<polyPatch> ppPtr
+//        (
+//            polyPatch::New
+//            (
+//                name,
+//                patchDict,
+//                0,
+//                mesh_.boundaryMesh()
+//            )
+//        );
+//        label patchI = fvMeshTools::addPatch
+//        (
+//            mesh_,
+//            ppPtr(),
+//            dictionary(),       // optional field values
+//            calculatedFvPatchField<scalar>::typeName,
+//            true
+//        );
+
         // Store
         label sz = meshedPatches_.size();
         meshedPatches_.setSize(sz+1);
diff --git a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H
index b98230e4122c925527c9158dbcc57b8bc8c8abc4..c265f05257568c8444f9562991ec6e6cf11c9c3a 100644
--- a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H
+++ b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H
@@ -330,10 +330,11 @@ private:
         // Baffle handling
 
             //- Get faces to repatch. Returns map from face to patch.
-            Map<label> getZoneBafflePatches
+            Map<labelPair> getZoneBafflePatches
             (
                 const bool allowBoundary,
-                const labelList& globalToPatch
+                const labelList& globalToMasterPatch,
+                const labelList& globalToSlavePatch
             ) const;
 
             //- Geometric test on see whether face needs to be baffled:
@@ -349,7 +350,7 @@ private:
             //- Determine patches for baffles
             void getBafflePatches
             (
-                const labelList& globalToPatch,
+                const labelList& globalToMasterPatch,
                 const labelList& neiLevel,
                 const pointField& neiCc,
                 labelList& ownPatch,
@@ -426,7 +427,7 @@ private:
                 const dictionary& motionDict,
                 const bool removeEdgeConnectedCells,
                 const scalarField& perpendicularAngle,
-                const labelList& globalToPatch
+                const labelList& globalToMasterPatch
             ) const;
 
 
@@ -707,7 +708,8 @@ public:
                 const bool mergeFreeStanding,
                 const dictionary& motionDict,
                 Time& runTime,
-                const labelList& globalToPatch,
+                const labelList& globalToMasterPatch,
+                const labelList& globalToSlavePatch,
                 const point& keepPoint
             );
 
@@ -716,7 +718,8 @@ public:
             autoPtr<mapPolyMesh> splitMesh
             (
                 const label nBufferLayers,
-                const labelList& globalToPatch,
+                const labelList& globalToMasterPatch,
+                const labelList& globalToSlavePatch,
                 const point& keepPoint
             );
 
@@ -741,7 +744,8 @@ public:
             //  baffles.
             autoPtr<mapPolyMesh> createZoneBaffles
             (
-                const labelList& globalToPatch,
+                const labelList& globalToMasterPatch,
+                const labelList& globalToSlavePatch,
                 List<labelPair>&
             );
 
diff --git a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C
index aeaa5ac4cb61387d684a2af31c148b4b975c161a..350bda61c865c2716be98639dc5df9dcd9feb436 100644
--- a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C
+++ b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C
@@ -259,7 +259,7 @@ bool Foam::meshRefinement::validBaffleTopology
 // Determine patches for baffles on all intersected unnamed faces
 void Foam::meshRefinement::getBafflePatches
 (
-    const labelList& globalToPatch,
+    const labelList& globalToMasterPatch,
     const labelList& neiLevel,
     const pointField& neiCc,
 
@@ -376,11 +376,11 @@ void Foam::meshRefinement::getBafflePatches
             }
 
             // Pick up the patches
-            ownPatch[faceI] = globalToPatch
+            ownPatch[faceI] = globalToMasterPatch
             [
                 surfaces_.globalRegion(surface1[i], region1[i])
             ];
-            neiPatch[faceI] = globalToPatch
+            neiPatch[faceI] = globalToMasterPatch
             [
                 surfaces_.globalRegion(surface2[i], region2[i])
             ];
@@ -406,14 +406,14 @@ void Foam::meshRefinement::getBafflePatches
 }
 
 
-// Get faces to repatch. Returns map from face to patch.
-Foam::Map<Foam::label> Foam::meshRefinement::getZoneBafflePatches
+Foam::Map<Foam::labelPair>  Foam::meshRefinement::getZoneBafflePatches
 (
     const bool allowBoundary,
-    const labelList& globalToPatch
+    const labelList& globalToMasterPatch,
+    const labelList& globalToSlavePatch
 ) const
 {
-    Map<label> bafflePatch(mesh_.nFaces()/1000);
+    Map<labelPair> bafflePatch(mesh_.nFaces()/1000);
 
     const wordList& faceZoneNames = surfaces_.faceZoneNames();
     const faceZoneMesh& fZones = mesh_.faceZones();
@@ -427,40 +427,39 @@ Foam::Map<Foam::label> Foam::meshRefinement::getZoneBafflePatches
 
             const faceZone& fZone = fZones[zoneI];
 
-            //// Get patch allocated for zone
-            //label patchI = surfaceToCyclicPatch_[surfI];
-            // Get patch of (first region) of surface
-            label patchI = globalToPatch[surfaces_.globalRegion(surfI, 0)];
+            // Get patch allocated for zone
+            label globalRegionI = surfaces_.globalRegion(surfI, 0);
+            labelPair zPatches
+            (
+                globalToMasterPatch[globalRegionI],
+                globalToSlavePatch[globalRegionI]
+            );
 
-            Info<< "For surface "
-                << surfaces_.names()[surfI]
-                << " found faceZone " << fZone.name()
-                << " and patch " << mesh_.boundaryMesh()[patchI].name()
+            Info<< "For zone " << fZone.name() << " found patches "
+                << mesh_.boundaryMesh()[zPatches[0]].name() << " and "
+                << mesh_.boundaryMesh()[zPatches[1]].name()
                 << endl;
 
-
             forAll(fZone, i)
             {
                 label faceI = fZone[i];
 
                 if (allowBoundary || mesh_.isInternalFace(faceI))
                 {
-                    if (!bafflePatch.insert(faceI, patchI))
+                    labelPair patches = zPatches;
+                    if (fZone.flipMap()[i])
                     {
-                        label oldPatchI = bafflePatch[faceI];
+                       patches = patches.reversePair();
+                    }
 
-                        if (oldPatchI != patchI)
-                        {
-                            FatalErrorIn("getZoneBafflePatches(const bool)")
-                                << "Face " << faceI
-                                << " fc:" << mesh_.faceCentres()[faceI]
-                                << " in zone " << fZone.name()
-                                << " is in patch "
-                                << mesh_.boundaryMesh()[oldPatchI].name()
-                                << " and in patch "
-                                << mesh_.boundaryMesh()[patchI].name()
-                                << abort(FatalError);
-                        }
+                    if (!bafflePatch.insert(faceI, patches))
+                    {
+                        FatalErrorIn("getZoneBafflePatches(..)")
+                            << "Face " << faceI
+                            << " fc:" << mesh_.faceCentres()[faceI]
+                            << " in zone " << fZone.name()
+                            << " is in multiple zones!"
+                            << abort(FatalError);
                     }
                 }
             }
@@ -698,7 +697,8 @@ Foam::List<Foam::labelPair> Foam::meshRefinement::getDuplicateFaces
 
 Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::createZoneBaffles
 (
-    const labelList& globalToPatch,
+    const labelList& globalToMasterPatch,
+    const labelList& globalToSlavePatch,
     List<labelPair>& baffles
 )
 {
@@ -714,20 +714,30 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::createZoneBaffles
 
         // Get faces (internal only) to be baffled. Map from face to patch
         // label.
-        Map<label> faceToPatch(getZoneBafflePatches(false, globalToPatch));
+        Map<labelPair> faceToPatch
+        (
+            getZoneBafflePatches
+            (
+                false,
+                globalToMasterPatch,
+                globalToSlavePatch
+            )
+        );
 
         label nZoneFaces = returnReduce(faceToPatch.size(), sumOp<label>());
         if (nZoneFaces > 0)
         {
             // Convert into labelLists
             labelList ownPatch(mesh_.nFaces(), -1);
-            forAllConstIter(Map<label>, faceToPatch, iter)
+            labelList neiPatch(mesh_.nFaces(), -1);
+            forAllConstIter(Map<labelPair>, faceToPatch, iter)
             {
-                ownPatch[iter.key()] = iter();
+                ownPatch[iter.key()] = iter().first();
+                neiPatch[iter.key()] = iter().second();
             }
 
             // Create baffles. both sides same patch.
-            map = createBaffles(ownPatch, ownPatch);
+            map = createBaffles(ownPatch, neiPatch);
 
             // Get pairs of faces created.
             // Just loop over faceMap and store baffle if we encounter a slave
@@ -744,7 +754,10 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::createZoneBaffles
                 label oldFaceI = faceMap[faceI];
 
                 // Does face originate from face-to-patch
-                Map<label>::const_iterator iter = faceToPatch.find(oldFaceI);
+                Map<labelPair>::const_iterator iter = faceToPatch.find
+                (
+                    oldFaceI
+                );
 
                 if (iter != faceToPatch.end())
                 {
@@ -1344,7 +1357,8 @@ void Foam::meshRefinement::findCellZoneGeometric
     // Sync
     syncTools::syncFaceList(mesh_, namedSurfaceIndex, maxEqOp<label>());
 }
-//XXXXXXXXX
+
+
 void Foam::meshRefinement::findCellZoneInsideWalk
 (
     const labelList& locationSurfaces,  // indices of surfaces with inside point
@@ -1446,7 +1460,6 @@ void Foam::meshRefinement::findCellZoneInsideWalk
         }
     }
 }
-//XXXXXXXXX
 
 
 bool Foam::meshRefinement::calcRegionToZone
@@ -1827,7 +1840,8 @@ void Foam::meshRefinement::baffleAndSplitMesh
     const bool mergeFreeStanding,
     const dictionary& motionDict,
     Time& runTime,
-    const labelList& globalToPatch,
+    const labelList& globalToMasterPatch,
+    const labelList& globalToSlavePatch,
     const point& keepPoint
 )
 {
@@ -1849,7 +1863,7 @@ void Foam::meshRefinement::baffleAndSplitMesh
     labelList ownPatch, neiPatch;
     getBafflePatches
     (
-        globalToPatch,
+        globalToMasterPatch,
         neiLevel,
         neiCc,
 
@@ -1899,7 +1913,7 @@ void Foam::meshRefinement::baffleAndSplitMesh
                 motionDict,
                 removeEdgeConnectedCells,
                 perpendicularAngle,
-                globalToPatch
+                globalToMasterPatch
             )
             //markFacesOnProblemCellsGeometric(motionDict)
         );
@@ -1917,7 +1931,7 @@ void Foam::meshRefinement::baffleAndSplitMesh
                     motionDict,
                     removeEdgeConnectedCells,
                     perpendicularAngle,
-                    globalToPatch
+                    globalToMasterPatch
                 )
             );
             forAll(facePatchTopo, faceI)
@@ -2051,7 +2065,8 @@ void Foam::meshRefinement::baffleAndSplitMesh
 Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::splitMesh
 (
     const label nBufferLayers,
-    const labelList& globalToPatch,
+    const labelList& globalToMasterPatch,
+    const labelList& globalToSlavePatch,
     const point& keepPoint
 )
 {
@@ -2066,7 +2081,7 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::splitMesh
     labelList ownPatch, neiPatch;
     getBafflePatches
     (
-        globalToPatch,
+        globalToMasterPatch,
         neiLevel,
         neiCc,
 
@@ -2129,9 +2144,9 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::splitMesh
 
     // Patch for exposed faces for lack of anything sensible.
     label defaultPatch = 0;
-    if (globalToPatch.size())
+    if (globalToMasterPatch.size())
     {
-        defaultPatch = globalToPatch[0];
+        defaultPatch = globalToMasterPatch[0];
     }
 
     for (label i = 0; i < nBufferLayers; i++)