diff --git a/applications/test/parallel/Test-parallel.C b/applications/test/parallel/Test-parallel.C
index 69fcb2d9ddab0bf0705c293288d220f4577083c1..c0742ceaee4bc3e5da07ecb57def20ace1e51f53 100644
--- a/applications/test/parallel/Test-parallel.C
+++ b/applications/test/parallel/Test-parallel.C
@@ -129,15 +129,7 @@ int main(int argc, char *argv[])
         mapDistribute map(constructSize, sendMap.xfer(), recvMap.xfer());
 
         // Distribute complexData
-        mapDistribute::distribute
-        (
-            Pstream::nonBlocking,
-            List<labelPair>(),
-            map.constructSize(),
-            map.subMap(),
-            map.constructMap(),
-            complexData
-        );
+        mapDistribute::distribute(complexData);
 
         Pout<< "complexData:" << complexData << endl;
     }
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/directMappedFixedValue/directMappedFixedValueFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/derived/directMappedFixedValue/directMappedFixedValueFvPatchField.C
index 0fb5b64b7806d332d0f54647e4311b75289aa93e..8bfb3a05f86379ae9cdbfd75d1c81b0121d1a121 100644
--- a/src/finiteVolume/fields/fvPatchFields/derived/directMappedFixedValue/directMappedFixedValueFvPatchField.C
+++ b/src/finiteVolume/fields/fvPatchFields/derived/directMappedFixedValue/directMappedFixedValueFvPatchField.C
@@ -272,15 +272,7 @@ void directMappedFixedValueFvPatchField<Type>::updateCoeffs()
                 newValues = sampleField();
             }
 
-            mapDistribute::distribute
-            (
-                Pstream::defaultCommsType,
-                distMap.schedule(),
-                distMap.constructSize(),
-                distMap.subMap(),
-                distMap.constructMap(),
-                newValues
-            );
+            distMap.distribute(newValues);
 
             break;
         }
@@ -305,15 +297,7 @@ void directMappedFixedValueFvPatchField<Type>::updateCoeffs()
             const fieldType& nbrField = sampleField();
 
             newValues = nbrField.boundaryField()[nbrPatchID];
-            mapDistribute::distribute
-            (
-                Pstream::defaultCommsType,
-                distMap.schedule(),
-                distMap.constructSize(),
-                distMap.subMap(),
-                distMap.constructMap(),
-                newValues
-            );
+            distMap.distribute(newValues);
 
             break;
         }
@@ -335,16 +319,7 @@ void directMappedFixedValueFvPatchField<Type>::updateCoeffs()
                 }
             }
 
-            mapDistribute::distribute
-            (
-                Pstream::defaultCommsType,
-                distMap.schedule(),
-                distMap.constructSize(),
-                distMap.subMap(),
-                distMap.constructMap(),
-                allValues
-            );
-
+            distMap.distribute(allValues);
             newValues.transfer(allValues);
 
             break;
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/directMappedVelocityFluxFixedValue/directMappedVelocityFluxFixedValueFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/derived/directMappedVelocityFluxFixedValue/directMappedVelocityFluxFixedValueFvPatchField.C
index 8f64aedc7eb165bd0539f1c3a36218a412da2303..6405ab78b4bd698667c20dbc5f52eba4777aac5e 100644
--- a/src/finiteVolume/fields/fvPatchFields/derived/directMappedVelocityFluxFixedValue/directMappedVelocityFluxFixedValueFvPatchField.C
+++ b/src/finiteVolume/fields/fvPatchFields/derived/directMappedVelocityFluxFixedValue/directMappedVelocityFluxFixedValueFvPatchField.C
@@ -212,26 +212,10 @@ void directMappedVelocityFluxFixedValueFvPatchField::updateCoeffs()
                 }
             }
 
-            mapDistribute::distribute
-            (
-                Pstream::defaultCommsType,
-                distMap.schedule(),
-                distMap.constructSize(),
-                distMap.subMap(),
-                distMap.constructMap(),
-                allUValues
-            );
+            distMap.distribute(allUValues);
             newUValues.transfer(allUValues);
 
-            mapDistribute::distribute
-            (
-                Pstream::defaultCommsType,
-                distMap.schedule(),
-                distMap.constructSize(),
-                distMap.subMap(),
-                distMap.constructMap(),
-                allPhiValues
-            );
+            distMap.distribute(allPhiValues);
             newPhiValues.transfer(allPhiValues);
 
             break;
@@ -244,28 +228,10 @@ void directMappedVelocityFluxFixedValueFvPatchField::updateCoeffs()
             );
 
             newUValues = UField.boundaryField()[nbrPatchID];
-
-            mapDistribute::distribute
-            (
-                Pstream::defaultCommsType,
-                distMap.schedule(),
-                distMap.constructSize(),
-                distMap.subMap(),
-                distMap.constructMap(),
-                newUValues
-            );
+            distMap.distribute(newUValues);
 
             newPhiValues = phiField.boundaryField()[nbrPatchID];
-
-            mapDistribute::distribute
-            (
-                Pstream::defaultCommsType,
-                distMap.schedule(),
-                distMap.constructSize(),
-                distMap.subMap(),
-                distMap.constructMap(),
-                newPhiValues
-            );
+            distMap.distribute(newPhiValues);
 
             break;
         }
diff --git a/src/meshTools/directMapped/directMappedPolyPatch/directMappedPatchBase.C b/src/meshTools/directMapped/directMappedPolyPatch/directMappedPatchBase.C
index 957fd0281bc5b7ab13624aa1e678c5cea981dc01..6418c8c8c542e371f3e67e5144591e37e5db63f9 100644
--- a/src/meshTools/directMapped/directMappedPolyPatch/directMappedPatchBase.C
+++ b/src/meshTools/directMapped/directMappedPolyPatch/directMappedPatchBase.C
@@ -527,13 +527,14 @@ void Foam::directMappedPatchBase::calcMapping() const
             constructMap[procI]
         );
 
-        if (debug)
-        {
-            Pout<< "To proc:" << procI << " sending values of cells/faces:"
-                << subMap[procI] << endl;
-            Pout<< "From proc:" << procI << " receiving values of patch faces:"
-                << constructMap[procI] << endl;
-        }
+        //if (debug)
+        //{
+        //    Pout<< "To proc:" << procI << " sending values of cells/faces:"
+        //        << subMap[procI] << endl;
+        //    Pout<< "From proc:" << procI
+        //        << " receiving values of patch faces:"
+        //        << constructMap[procI] << endl;
+        //}
     }
 
     // Redo constructSize
@@ -644,6 +645,28 @@ Foam::directMappedPatchBase::directMappedPatchBase
 {}
 
 
+Foam::directMappedPatchBase::directMappedPatchBase
+(
+    const polyPatch& pp,
+    const word& sampleRegion,
+    const sampleMode mode,
+    const word& samplePatch,
+    const scalar distance
+)
+:
+    patch_(pp),
+    sampleRegion_(sampleRegion),
+    mode_(mode),
+    samplePatch_(samplePatch),
+    offsetMode_(NORMAL),
+    offset_(vector::zero),
+    offsets_(0),
+    distance_(distance),
+    sameRegion_(sampleRegion_ == patch_.boundaryMesh().mesh().name()),
+    mapPtr_(NULL)
+{}
+
+
 Foam::directMappedPatchBase::directMappedPatchBase
 (
     const polyPatch& pp,
diff --git a/src/meshTools/directMapped/directMappedPolyPatch/directMappedPatchBase.H b/src/meshTools/directMapped/directMappedPolyPatch/directMappedPatchBase.H
index 96ac05bf7c26bfae4bbe0ad8d0a8006842179559..6b3513f374cb0d4c4d766c17035bbdf0fc4cb8bd 100644
--- a/src/meshTools/directMapped/directMappedPolyPatch/directMappedPatchBase.H
+++ b/src/meshTools/directMapped/directMappedPolyPatch/directMappedPatchBase.H
@@ -206,15 +206,15 @@ public:
             const vector& offset
         );
 
-        ////- Construct from normal and distance
-        //directMappedPatchBase
-        //(
-        //    const polyPatch& pp,
-        //    const word& sampleRegion,
-        //    const word& samplePatch,
-        //    const sampleMode sampleMode,
-        //    const vector& offset
-        //);
+        //- Construct from offsetMode=normal and distance
+        directMappedPatchBase
+        (
+            const polyPatch& pp,
+            const word& sampleRegion,
+            const sampleMode sampleMode,
+            const word& samplePatch,
+            const scalar distance
+        );
 
         //- Construct from dictionary
         directMappedPatchBase(const polyPatch&, const dictionary&);
diff --git a/src/parallel/distributed/distributedTriSurfaceMesh/distributedTriSurfaceMesh.C b/src/parallel/distributed/distributedTriSurfaceMesh/distributedTriSurfaceMesh.C
index accee92b3f77325c0fa0a54b06b94b3f4ba9610b..740c2184d5ca0c31c118c33454eda2ba2ff48a90 100644
--- a/src/parallel/distributed/distributedTriSurfaceMesh/distributedTriSurfaceMesh.C
+++ b/src/parallel/distributed/distributedTriSurfaceMesh/distributedTriSurfaceMesh.C
@@ -440,15 +440,7 @@ void Foam::distributedTriSurfaceMesh::findLine
         // Exchange the segments
         // ~~~~~~~~~~~~~~~~~~~~~
 
-        map.distribute
-        (
-            Pstream::nonBlocking,   //Pstream::scheduled,
-            List<labelPair>(0),     //map.schedule(),
-            map.constructSize(),
-            map.subMap(),           // what to send
-            map.constructMap(),     // what to receive
-            allSegments
-        );
+        map.distribute(allSegments);
 
 
         // Do tests I need to do
@@ -490,21 +482,7 @@ void Foam::distributedTriSurfaceMesh::findLine
         // Exchange the intersections (opposite to segments)
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-        map.distribute
-        (
-            //Pstream::scheduled,
-            //map.schedule            // Note reverse schedule
-            //(
-            //    map.constructMap(),
-            //    map.subMap()
-            //),
-            Pstream::nonBlocking,
-            List<labelPair>(0),
-            nOldAllSegments,
-            map.constructMap(),     // what to send
-            map.subMap(),           // what to receive
-            intersections
-        );
+        map.reverseDistribute(nOldAllSegments, intersections);
 
 
         // Extract the hits
@@ -657,17 +635,7 @@ Foam::distributedTriSurfaceMesh::calcLocalQueries
     // Send over queries
     // ~~~~~~~~~~~~~~~~~
 
-    map.distribute
-    (
-        //Pstream::scheduled,
-        //map.schedule(),
-        Pstream::nonBlocking,
-        List<labelPair>(0),
-        map.constructSize(),
-        map.subMap(),           // what to send
-        map.constructMap(),     // what to receive
-        triangleIndex
-    );
+    map.distribute(triangleIndex);
 
 
     return mapPtr;
@@ -1594,28 +1562,8 @@ void Foam::distributedTriSurfaceMesh::findNearest
         // swap samples to local processor
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-        map.distribute
-        (
-            //Pstream::scheduled,
-            //map.schedule(),
-            Pstream::nonBlocking,
-            List<labelPair>(0),
-            map.constructSize(),
-            map.subMap(),           // what to send
-            map.constructMap(),     // what to receive
-            allCentres
-        );
-        map.distribute
-        (
-            //Pstream::scheduled,
-            //map.schedule(),
-            Pstream::nonBlocking,
-            List<labelPair>(0),
-            map.constructSize(),
-            map.subMap(),           // what to send
-            map.constructMap(),     // what to receive
-            allRadiusSqr
-        );
+        map.distribute(allCentres);
+        map.distribute(allRadiusSqr);
 
 
         // Do my tests
@@ -1639,21 +1587,7 @@ void Foam::distributedTriSurfaceMesh::findNearest
         // Send back results
         // ~~~~~~~~~~~~~~~~~
 
-        map.distribute
-        (
-            //Pstream::scheduled,
-            //map.schedule            // note reverse schedule
-            //(
-            //    map.constructMap(),
-            //    map.subMap()
-            //),
-            Pstream::nonBlocking,
-            List<labelPair>(0),
-            allSegmentMap.size(),
-            map.constructMap(),     // what to send
-            map.subMap(),           // what to receive
-            allInfo
-        );
+        map.reverseDistribute(allSegmentMap.size(), allInfo);
 
 
         // Extract information
@@ -1892,21 +1826,7 @@ void Foam::distributedTriSurfaceMesh::getRegion
     // Send back results
     // ~~~~~~~~~~~~~~~~~
 
-    map.distribute
-    (
-        //Pstream::scheduled,
-        //map.schedule            // note reverse schedule
-        //(
-        //    map.constructMap(),
-        //    map.subMap()
-        //),
-        Pstream::nonBlocking,
-        List<labelPair>(0),
-        info.size(),
-        map.constructMap(),     // what to send
-        map.subMap(),           // what to receive
-        region
-    );
+    map.reverseDistribute(info.size(), region);
 }
 
 
@@ -1956,21 +1876,7 @@ void Foam::distributedTriSurfaceMesh::getNormal
     // Send back results
     // ~~~~~~~~~~~~~~~~~
 
-    map.distribute
-    (
-        //Pstream::scheduled,
-        //map.schedule            // note reverse schedule
-        //(
-        //    map.constructMap(),
-        //    map.subMap()
-        //),
-        Pstream::nonBlocking,
-        List<labelPair>(0),
-        info.size(),
-        map.constructMap(),     // what to send
-        map.subMap(),           // what to receive
-        normal
-    );
+    map.reverseDistribute(info.size(), normal);
 }
 
 
@@ -2024,15 +1930,7 @@ void Foam::distributedTriSurfaceMesh::getField
         // Send back results
         // ~~~~~~~~~~~~~~~~~
 
-        map.distribute
-        (
-            Pstream::nonBlocking,
-            List<labelPair>(0),
-            info.size(),
-            map.constructMap(),     // what to send
-            map.subMap(),           // what to receive
-            values
-        );
+        map.reverseDistribute(info.size(), values);
     }
 }
 
diff --git a/src/parallel/distributed/distributedTriSurfaceMesh/distributedTriSurfaceMeshTemplates.C b/src/parallel/distributed/distributedTriSurfaceMesh/distributedTriSurfaceMeshTemplates.C
index dca179bb72dcf4225ee995ca8df6c96b3e73fdf0..0871645154ab5e9075751e35498037e1aa57dc63 100644
--- a/src/parallel/distributed/distributedTriSurfaceMesh/distributedTriSurfaceMeshTemplates.C
+++ b/src/parallel/distributed/distributedTriSurfaceMesh/distributedTriSurfaceMeshTemplates.C
@@ -76,15 +76,7 @@ License
 //    // Send back results
 //    // ~~~~~~~~~~~~~~~~~
 //
-//    map.distribute
-//    (
-//        Pstream::nonBlocking,
-//        List<labelPair>(0),
-//        info.size(),
-//        map.constructMap(),     // what to send
-//        map.subMap(),           // what to receive
-//        values
-//    );
+//    map.reverseDistribute(info.size(), values);
 //}
 
 
@@ -115,15 +107,7 @@ void Foam::distributedTriSurfaceMesh::distributeFields
 
         label oldSize = field.size();
 
-        map.distribute
-        (
-            Pstream::nonBlocking,
-            List<labelPair>(0),
-            map.constructSize(),
-            map.subMap(),
-            map.constructMap(),
-            field
-        );
+        map.distribute(field);
 
         if (debug)
         {
diff --git a/src/postProcessing/functionObjects/field/streamLine/streamLine.C b/src/postProcessing/functionObjects/field/streamLine/streamLine.C
index 42b324e8d27b1390ebdff14bc6be3f51111daecb..22b50232a6a6b7e6b801c536ab7b73b0c0401765 100644
--- a/src/postProcessing/functionObjects/field/streamLine/streamLine.C
+++ b/src/postProcessing/functionObjects/field/streamLine/streamLine.C
@@ -426,7 +426,8 @@ void Foam::streamLine::write()
             );
 
 
-            // Distribute the track positions
+            // Distribute the track positions. Note: use scheduled comms
+            // to prevent buffering.
             mapDistribute::distribute
             (
                 Pstream::scheduled,
diff --git a/src/surfaceFilmModels/derivedFvPatchFields/directMappedFixedInternalValue/directMappedFixedInternalValueFvPatchField.C b/src/surfaceFilmModels/derivedFvPatchFields/directMappedFixedInternalValue/directMappedFixedInternalValueFvPatchField.C
index 9c84101d853ce3d247013d327aa773bfbc66e2db..c524491307e7ac22a58db4aa56609590731577e1 100644
--- a/src/surfaceFilmModels/derivedFvPatchFields/directMappedFixedInternalValue/directMappedFixedInternalValueFvPatchField.C
+++ b/src/surfaceFilmModels/derivedFvPatchFields/directMappedFixedInternalValue/directMappedFixedInternalValueFvPatchField.C
@@ -132,15 +132,7 @@ void directMappedFixedInternalValueFvPatchField<Type>::updateCoeffs()
 
     // Retrieve the neighbour patch internal field
     Field<Type> nbrIntFld = nbrField.patchInternalField();
-    mapDistribute::distribute
-    (
-        Pstream::defaultCommsType,
-        distMap.schedule(),
-        distMap.constructSize(),
-        distMap.subMap(),           // what to send
-        distMap.constructMap(),     // what to receive
-        nbrIntFld
-    );
+    distMap.distribute(nbrIntFld);
 
     // Assign (this) patch internal field to its neighbour values
     Field<Type>& intFld = const_cast<Field<Type>&>(this->internalField());
diff --git a/src/turbulenceModels/compressible/turbulenceModel/derivedFvPatchFields/turbulentTemperatureCoupledBaffle/turbulentTemperatureCoupledBaffleFvPatchScalarField.C b/src/turbulenceModels/compressible/turbulenceModel/derivedFvPatchFields/turbulentTemperatureCoupledBaffle/turbulentTemperatureCoupledBaffleFvPatchScalarField.C
index e417067ce125f7446c07e90d88cb0588996b80e3..3d6a68a0f4c1d72a3ede9d3b6b9e904453470443 100644
--- a/src/turbulenceModels/compressible/turbulenceModel/derivedFvPatchFields/turbulentTemperatureCoupledBaffle/turbulentTemperatureCoupledBaffleFvPatchScalarField.C
+++ b/src/turbulenceModels/compressible/turbulenceModel/derivedFvPatchFields/turbulentTemperatureCoupledBaffle/turbulentTemperatureCoupledBaffleFvPatchScalarField.C
@@ -222,27 +222,11 @@ void Foam::turbulentTemperatureCoupledBaffleFvPatchScalarField::updateCoeffs()
 
         // Swap to obtain full local values of neighbour internal field
         scalarField nbrIntFld = nbrField.patchInternalField();
-        mapDistribute::distribute
-        (
-            Pstream::defaultCommsType,
-            distMap.schedule(),
-            distMap.constructSize(),
-            distMap.subMap(),           // what to send
-            distMap.constructMap(),     // what to receive
-            nbrIntFld
-        );
+        distMap.distribute(nbrIntFld);
 
         // Swap to obtain full local values of neighbour K*delta
         scalarField nbrKDelta = nbrField.K(nbrField)*nbrPatch.deltaCoeffs();
-        mapDistribute::distribute
-        (
-            Pstream::defaultCommsType,
-            distMap.schedule(),
-            distMap.constructSize(),
-            distMap.subMap(),           // what to send
-            distMap.constructMap(),     // what to receive
-            nbrKDelta
-        );
+        distMap.distribute(nbrKDelta);
 
         tmp<scalarField> myKDelta = K(*this)*patch().deltaCoeffs();
 
@@ -255,15 +239,7 @@ void Foam::turbulentTemperatureCoupledBaffleFvPatchScalarField::updateCoeffs()
         // Assign to me
         fvPatchScalarField::operator=(Twall);
         // Distribute back and assign to neighbour
-        mapDistribute::distribute
-        (
-            Pstream::defaultCommsType,
-            distMap.schedule(),
-            nbrField.size(),
-            distMap.constructMap(),     // reverse : what to send
-            distMap.subMap(),
-            Twall
-        );
+        distMap.reverseDistribute(nbrField.size(), Twall);
         const_cast<turbulentTemperatureCoupledBaffleFvPatchScalarField&>
         (
             nbrField
diff --git a/src/turbulenceModels/compressible/turbulenceModel/derivedFvPatchFields/turbulentTemperatureCoupledBaffleMixed/turbulentTemperatureCoupledBaffleMixedFvPatchScalarField.C b/src/turbulenceModels/compressible/turbulenceModel/derivedFvPatchFields/turbulentTemperatureCoupledBaffleMixed/turbulentTemperatureCoupledBaffleMixedFvPatchScalarField.C
index 2a66378751a267858f83b8da9899ee4f9802f521..dc62bfd4e6477518e04edc2502642f38e8884dd4 100644
--- a/src/turbulenceModels/compressible/turbulenceModel/derivedFvPatchFields/turbulentTemperatureCoupledBaffleMixed/turbulentTemperatureCoupledBaffleMixedFvPatchScalarField.C
+++ b/src/turbulenceModels/compressible/turbulenceModel/derivedFvPatchFields/turbulentTemperatureCoupledBaffleMixed/turbulentTemperatureCoupledBaffleMixedFvPatchScalarField.C
@@ -179,27 +179,11 @@ void turbulentTemperatureCoupledBaffleMixedFvPatchScalarField::updateCoeffs()
 
     // Swap to obtain full local values of neighbour internal field
     scalarField nbrIntFld = nbrField.patchInternalField();
-    mapDistribute::distribute
-    (
-        Pstream::defaultCommsType,
-        distMap.schedule(),
-        distMap.constructSize(),
-        distMap.subMap(),           // what to send
-        distMap.constructMap(),     // what to receive
-        nbrIntFld
-    );
+    distMap.distribute(nbrIntFld);
 
     // Swap to obtain full local values of neighbour K*delta
     scalarField nbrKDelta = nbrField.K(nbrField)*nbrPatch.deltaCoeffs();
-    mapDistribute::distribute
-    (
-        Pstream::defaultCommsType,
-        distMap.schedule(),
-        distMap.constructSize(),
-        distMap.subMap(),           // what to send
-        distMap.constructMap(),     // what to receive
-        nbrKDelta
-    );
+    distMap.distribute(nbrKDelta);
 
     tmp<scalarField> myKDelta = K(*this)*patch().deltaCoeffs();