diff --git a/applications/solvers/compressible/rhoPimpleFoam/createFields.H b/applications/solvers/compressible/rhoPimpleFoam/createFields.H
index d1ade4b457277fa1a0c35dfa3dd135c7b6b9917c..070f651a999296d7214d5f86e7fec2e021df2b58 100644
--- a/applications/solvers/compressible/rhoPimpleFoam/createFields.H
+++ b/applications/solvers/compressible/rhoPimpleFoam/createFields.H
@@ -39,15 +39,8 @@
 
     #include "compressibleCreatePhi.H"
 
-    dimensionedScalar rhoMax
-    (
-        mesh.solutionDict().subDict("PIMPLE").lookup("rhoMax")
-    );
-
-    dimensionedScalar rhoMin
-    (
-        mesh.solutionDict().subDict("PIMPLE").lookup("rhoMin")
-    );
+    dimensionedScalar rhoMax(pimple.dict().lookup("rhoMax"));
+    dimensionedScalar rhoMin(pimple.dict().lookup("rhoMin"));
 
     Info<< "Creating turbulence model\n" << endl;
     autoPtr<compressible::turbulenceModel> turbulence
diff --git a/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleFoam.C b/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleFoam.C
index 94f3f54de4577b0cce4c749b831133b5ec42c398..0336ceb74d708531aa00f5a6520bb3bb2197f08e 100644
--- a/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleFoam.C
+++ b/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleFoam.C
@@ -46,10 +46,13 @@ int main(int argc, char *argv[])
     #include "setRootCase.H"
     #include "createTime.H"
     #include "createMesh.H"
+
+    pimpleControl pimple(mesh);
+
     #include "createFields.H"
     #include "initContinuityErrs.H"
 
-    pimpleControl pimple(mesh);
+    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
     Info<< "\nStarting time loop\n" << endl;
 
diff --git a/applications/solvers/compressible/rhoPimpleFoam/rhoPorousMRFPimpleFoam/rhoPorousMRFPimpleFoam.C b/applications/solvers/compressible/rhoPimpleFoam/rhoPorousMRFPimpleFoam/rhoPorousMRFPimpleFoam.C
index 5bfbc84d5602851615dbc7626b2e969bb11a3638..8de8a412c350931914bad79d0434dcb051d63a43 100644
--- a/applications/solvers/compressible/rhoPimpleFoam/rhoPorousMRFPimpleFoam/rhoPorousMRFPimpleFoam.C
+++ b/applications/solvers/compressible/rhoPimpleFoam/rhoPorousMRFPimpleFoam/rhoPorousMRFPimpleFoam.C
@@ -48,12 +48,13 @@ int main(int argc, char *argv[])
     #include "setRootCase.H"
     #include "createTime.H"
     #include "createMesh.H"
+
+    pimpleControl pimple(mesh);
+
     #include "createFields.H"
     #include "createZones.H"
     #include "initContinuityErrs.H"
 
-    pimpleControl pimple(mesh);
-
     // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
     Info<< "\nStarting time loop\n" << endl;
diff --git a/applications/solvers/compressible/rhoSimpleFoam/createFields.H b/applications/solvers/compressible/rhoSimpleFoam/createFields.H
index aa3de6d6fbfd9c462d57057451c9f723cede8221..27bfb8313317147b91ca84655b61e7086cf19975 100644
--- a/applications/solvers/compressible/rhoSimpleFoam/createFields.H
+++ b/applications/solvers/compressible/rhoSimpleFoam/createFields.H
@@ -42,17 +42,10 @@
 
     label pRefCell = 0;
     scalar pRefValue = 0.0;
-    setRefCell(p, mesh.solutionDict().subDict("SIMPLE"), pRefCell, pRefValue);
+    setRefCell(p, simple.dict(), pRefCell, pRefValue);
 
-    dimensionedScalar rhoMax
-    (
-        mesh.solutionDict().subDict("SIMPLE").lookup("rhoMax")
-    );
-
-    dimensionedScalar rhoMin
-    (
-        mesh.solutionDict().subDict("SIMPLE").lookup("rhoMin")
-    );
+    dimensionedScalar rhoMax(simple.dict().lookup("rhoMax"));
+    dimensionedScalar rhoMin(simple.dict().lookup("rhoMin"));
 
     Info<< "Creating turbulence model\n" << endl;
     autoPtr<compressible::RASModel> turbulence
diff --git a/applications/solvers/compressible/rhoSimpleFoam/rhoPorousMRFSimpleFoam/createZones.H b/applications/solvers/compressible/rhoSimpleFoam/rhoPorousMRFSimpleFoam/createZones.H
index 78a96429f6da7e213139d7c33c387ae137bd6642..0ed5afa2745897eea93992ba7cad5c8e6a5c6fc2 100644
--- a/applications/solvers/compressible/rhoSimpleFoam/rhoPorousMRFSimpleFoam/createZones.H
+++ b/applications/solvers/compressible/rhoSimpleFoam/rhoPorousMRFSimpleFoam/createZones.H
@@ -9,13 +9,7 @@
     if (pZones.size())
     {
         // nUCorrectors for pressureImplicitPorosity
-        if (mesh.solutionDict().subDict("SIMPLE").found("nUCorrectors"))
-        {
-            nUCorr = readInt
-            (
-                mesh.solutionDict().subDict("SIMPLE").lookup("nUCorrectors")
-            );
-        }
+        simple.dict().readIfPresent("nUCorrectors", nUCorr);
 
         if (nUCorr > 0)
         {
diff --git a/applications/solvers/compressible/rhoSimpleFoam/rhoPorousMRFSimpleFoam/rhoPorousMRFSimpleFoam.C b/applications/solvers/compressible/rhoSimpleFoam/rhoPorousMRFSimpleFoam/rhoPorousMRFSimpleFoam.C
index 5273f50eaa2ee32c0836f503faf0e9620093cc23..1cb421e5f41f9c306b3808b078994737cc903e68 100644
--- a/applications/solvers/compressible/rhoSimpleFoam/rhoPorousMRFSimpleFoam/rhoPorousMRFSimpleFoam.C
+++ b/applications/solvers/compressible/rhoSimpleFoam/rhoPorousMRFSimpleFoam/rhoPorousMRFSimpleFoam.C
@@ -45,12 +45,13 @@ int main(int argc, char *argv[])
     #include "setRootCase.H"
     #include "createTime.H"
     #include "createMesh.H"
+
+    simpleControl simple(mesh);
+
     #include "createFields.H"
     #include "createZones.H"
     #include "initContinuityErrs.H"
 
-    simpleControl simple(mesh);
-
     // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
     Info<< "\nStarting time loop\n" << endl;
diff --git a/applications/solvers/compressible/rhoSimpleFoam/rhoSimpleFoam.C b/applications/solvers/compressible/rhoSimpleFoam/rhoSimpleFoam.C
index 454da314411c1cfd8e9fcff8a99df841a5214f21..e87a35fab27c22ecf7562a0dd4d204dd14b1f4ad 100644
--- a/applications/solvers/compressible/rhoSimpleFoam/rhoSimpleFoam.C
+++ b/applications/solvers/compressible/rhoSimpleFoam/rhoSimpleFoam.C
@@ -42,11 +42,12 @@ int main(int argc, char *argv[])
     #include "setRootCase.H"
     #include "createTime.H"
     #include "createMesh.H"
-    #include "createFields.H"
-    #include "initContinuityErrs.H"
 
     simpleControl simple(mesh);
 
+    #include "createFields.H"
+    #include "initContinuityErrs.H"
+
     // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
     Info<< "\nStarting time loop\n" << endl;
diff --git a/applications/solvers/compressible/rhoSimplecFoam/createFields.H b/applications/solvers/compressible/rhoSimplecFoam/createFields.H
index fab7b70048f6e147427cd3ba75ea545b88cd2e8f..46a382864e72740185c60ca49560ff95f2a2bfdb 100644
--- a/applications/solvers/compressible/rhoSimplecFoam/createFields.H
+++ b/applications/solvers/compressible/rhoSimplecFoam/createFields.H
@@ -41,17 +41,10 @@
 
     label pRefCell = 0;
     scalar pRefValue = 0.0;
-    setRefCell(p, mesh.solutionDict().subDict("SIMPLE"), pRefCell, pRefValue);
+    setRefCell(p, simple.dict(), pRefCell, pRefValue);
 
-    dimensionedScalar rhoMax
-    (
-        mesh.solutionDict().subDict("SIMPLE").lookup("rhoMax")
-    );
-
-    dimensionedScalar rhoMin
-    (
-        mesh.solutionDict().subDict("SIMPLE").lookup("rhoMin")
-    );
+    dimensionedScalar rhoMax(simple.dict().lookup("rhoMax"));
+    dimensionedScalar rhoMin(simple.dict().lookup("rhoMin"));
 
     Info<< "Creating turbulence model\n" << endl;
     autoPtr<compressible::RASModel> turbulence
diff --git a/applications/solvers/compressible/rhoSimplecFoam/rhoSimplecFoam.C b/applications/solvers/compressible/rhoSimplecFoam/rhoSimplecFoam.C
index 278e689bc27c2ee64eb69ceeb12094c01dd1b532..937358e0f5a83619655efca3ded9aece15e90838 100644
--- a/applications/solvers/compressible/rhoSimplecFoam/rhoSimplecFoam.C
+++ b/applications/solvers/compressible/rhoSimplecFoam/rhoSimplecFoam.C
@@ -44,11 +44,12 @@ int main(int argc, char *argv[])
     #include "setRootCase.H"
     #include "createTime.H"
     #include "createMesh.H"
-    #include "createFields.H"
-    #include "initContinuityErrs.H"
 
     simpleControl simple(mesh);
 
+    #include "createFields.H"
+    #include "initContinuityErrs.H"
+
     // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
     Info<< "\nStarting time loop\n" << endl;
diff --git a/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.C b/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.C
index 8707d021ade2e0ea7b9ead32bcd52ddd2b0a4642..87c3f13090bf012ef6f41d39361664e04167ea2a 100644
--- a/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.C
+++ b/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.C
@@ -59,36 +59,37 @@ bool Foam::pimpleControl::criteriaSatisfied()
     bool firstIter = corr_ == 1;
 
     bool achieved = true;
-    const dictionary& solverDict = mesh_.solverPerformanceDict();
+    bool checked = false;    // safety that some checks were indeed performed
 
+    const dictionary& solverDict = mesh_.solverPerformanceDict();
     forAllConstIter(dictionary, solverDict, iter)
     {
         const word& variableName = iter().keyword();
-        label fieldI = applyToField(variableName);
+        const label fieldI = applyToField(variableName);
         if (fieldI != -1)
         {
             const List<lduMatrix::solverPerformance> sp(iter().stream());
             const scalar residual = sp.last().initialResidual();
 
+            checked = true;
+
             if (firstIter)
             {
                 residualControl_[fieldI].initialResidual =
                     sp.first().initialResidual();
             }
 
-            bool absCheck = residual < residualControl_[fieldI].absTol;
-
+            const bool absCheck = residual < residualControl_[fieldI].absTol;
             bool relCheck = false;
 
             scalar relative = 0.0;
             if (!firstIter)
             {
-                scalar iniRes =
+                const scalar iniRes =
                     residualControl_[fieldI].initialResidual
                   + ROOTVSMALL;
 
                 relative = residual/iniRes;
-
                 relCheck = relative < residualControl_[fieldI].relTol;
             }
 
@@ -110,7 +111,7 @@ bool Foam::pimpleControl::criteriaSatisfied()
         }
     }
 
-    return achieved;
+    return checked && achieved;
 }
 
 
@@ -129,7 +130,13 @@ Foam::pimpleControl::pimpleControl(fvMesh& mesh)
     if (nOuterCorr_ > 1)
     {
         Info<< nl;
-        if (!residualControl_.empty())
+        if (residualControl_.empty())
+        {
+            Info<< algorithmName_ << ": no residual control data found. "
+                << "Calculations will employ " << nOuterCorr_
+                << " corrector loops" << nl << endl;
+        }
+        else
         {
             Info<< algorithmName_ << ": max iterations = " << nOuterCorr_
                 << endl;
@@ -142,12 +149,6 @@ Foam::pimpleControl::pimpleControl(fvMesh& mesh)
             }
             Info<< endl;
         }
-        else
-        {
-            Info<< algorithmName_ << ": no residual control data found. " << nl
-                << "Calculations will employ " << nOuterCorr_
-                << " corrector loops" << nl << endl;
-        }
     }
     else
     {
diff --git a/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.H b/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.H
index 54831aa97d9bcee309dd2295019ae8fa5579bc28..3b891a5aa93097e3041aa042b97ee8482b3c17f6 100644
--- a/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.H
+++ b/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.H
@@ -69,10 +69,10 @@ protected:
 
     // Protected Member Functions
 
-        //- Read constrols from fvSolution dictionary
+        //- Read controls from fvSolution dictionary
         virtual void read();
 
-        //- Return true if all convergence checks are satified
+        //- Return true if all convergence checks are satisfied
         virtual bool criteriaSatisfied();
 
         //- Disallow default bitwise copy construct
diff --git a/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControl.C b/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControl.C
index f40f19e04af6ba8ad3886ea425edc0a95120e683..d2b603a5e01961e43e2ef3fa3c4344de0a3497ce 100644
--- a/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControl.C
+++ b/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControl.C
@@ -50,17 +50,20 @@ bool Foam::simpleControl::criteriaSatisfied()
     }
 
     bool achieved = true;
-    const dictionary& solverDict = mesh_.solverPerformanceDict();
+    bool checked = false;    // safety that some checks were indeed performed
 
+    const dictionary& solverDict = mesh_.solverPerformanceDict();
     forAllConstIter(dictionary, solverDict, iter)
     {
         const word& variableName = iter().keyword();
-        label fieldI = applyToField(variableName);
+        const label fieldI = applyToField(variableName);
         if (fieldI != -1)
         {
             const List<lduMatrix::solverPerformance> sp(iter().stream());
             const scalar residual = sp.first().initialResidual();
 
+            checked = true;
+
             bool absCheck = residual < residualControl_[fieldI].absTol;
             achieved = achieved && absCheck;
 
@@ -75,7 +78,7 @@ bool Foam::simpleControl::criteriaSatisfied()
         }
     }
 
-    return achieved;
+    return checked && achieved;
 }
 
 
@@ -90,7 +93,13 @@ Foam::simpleControl::simpleControl(fvMesh& mesh)
 
     Info<< nl;
 
-    if (residualControl_.size() > 0)
+    if (residualControl_.empty())
+    {
+        Info<< algorithmName_ << ": no convergence criteria found. "
+            << "Calculations will run for " << mesh_.time().endTime().value()
+            << " steps." << nl << endl;
+    }
+    else
     {
         Info<< algorithmName_ << ": convergence criteria" << nl;
         forAll(residualControl_, i)
@@ -101,12 +110,6 @@ Foam::simpleControl::simpleControl(fvMesh& mesh)
         }
         Info<< endl;
     }
-    else
-    {
-        Info<< algorithmName_ << ": no convergence criteria found. "
-            << "Calculations will run for " << mesh_.time().endTime().value()
-            << " steps." << nl << endl;
-    }
 }
 
 
diff --git a/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControl.H b/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControl.H
index e4a2e69cbaea328c943ee04522ccf310983c3d02..ee718ce424b884e6c894e2c1acdb12e5888397ca 100644
--- a/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControl.H
+++ b/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControl.H
@@ -59,10 +59,10 @@ protected:
 
     // Protected Member Functions
 
-        //- Read constrols from fvSolution dictionary
+        //- Read controls from fvSolution dictionary
         void read();
 
-        //- Return true if all convergence checks are satified
+        //- Return true if all convergence checks are satisfied
         bool criteriaSatisfied();
 
         //- Disallow default bitwise copy construct
diff --git a/src/finiteVolume/cfdTools/general/solutionControl/solutionControl/solutionControl.H b/src/finiteVolume/cfdTools/general/solutionControl/solutionControl/solutionControl.H
index 75565551a290e5b4d9a6dd736f73ed8b188457bc..82dd73dd9a11d9ee814f391f2dde40d82f08957d 100644
--- a/src/finiteVolume/cfdTools/general/solutionControl/solutionControl/solutionControl.H
+++ b/src/finiteVolume/cfdTools/general/solutionControl/solutionControl/solutionControl.H
@@ -40,7 +40,7 @@ namespace Foam
 {
 
 /*---------------------------------------------------------------------------*\
-                  Class solutionControl Declaration
+                       Class solutionControl Declaration
 \*---------------------------------------------------------------------------*/
 
 class solutionControl
@@ -78,19 +78,19 @@ protected:
             //- Flag to indicate to solve for momentum
             bool momentumPredictor_;
 
-            //- Flag to indictae to solve using transonic algorithm
+            //- Flag to indicate to solve using transonic algorithm
             bool transonic_;
 
 
     // Protected Member Functions
 
-        //- Read constrols from fvSolution dictionary
+        //- Read controls from fvSolution dictionary
         virtual void read(const bool absTolOnly);
 
         //- Return index of field in residualControl_ if present
         virtual label applyToField(const word& fieldName) const;
 
-        //- Return true if all convergence checks are satified
+        //- Return true if all convergence checks are satisfied
         virtual bool criteriaSatisfied() = 0;
 
         //- Store previous iteration fields
@@ -142,7 +142,7 @@ public:
             //- Flag to indicate to solve for momentum
             inline bool momentumPredictor() const;
 
-            //- Flag to indictae to solve using transonic algorithm
+            //- Flag to indicate to solve using transonic algorithm
             inline bool transonic() const;
 };
 
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/mappedField/mappedFieldFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/derived/mappedField/mappedFieldFvPatchField.C
index 19aeaa4a5a1b2d4d78a5db22ba9778e02863b1d7..ae597b4bfccd5b97ef7a2cda69a9623c62b4d16f 100644
--- a/src/finiteVolume/fields/fvPatchFields/derived/mappedField/mappedFieldFvPatchField.C
+++ b/src/finiteVolume/fields/fvPatchFields/derived/mappedField/mappedFieldFvPatchField.C
@@ -227,7 +227,6 @@ void mappedFieldFvPatchField<Type>::updateCoeffs()
 
             const fieldType& nbrField = sampleField();
 
-            const mapDistribute& distMap = mappedPatchBase::map();
             newValues = nbrField.boundaryField()[nbrPatchID];
             this->distribute(newValues);
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModel.C b/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModel.C
index 36dca28f6a4fcc09a01204b36abd82060d122f76..d080a624a2f68ca809fbcac43d5bdeaa1716ab1b 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModel.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModel.C
@@ -114,8 +114,8 @@ bool Foam::SurfaceFilmModel<CloudType>::transferParcel
         "bool Foam::SurfaceFilmModel<CloudType>::transferParcel"
         "("
             "parcelType&, "
-            "const label, "
-            "const bool&"
+            "const polyPatch&, "
+            "bool&"
         ")"
     );
 
@@ -156,11 +156,9 @@ void Foam::SurfaceFilmModel<CloudType>::inject(TrackData& td)
         const label filmPatchI = filmPatches[i];
         const label primaryPatchI = primaryPatches[i];
 
-        const mappedPatchBase& mapPatch = filmModel.mappedPatches()[filmPatchI];
-
         const labelList& injectorCellsPatch = pbm[primaryPatchI].faceCells();
 
-        cacheFilmFields(filmPatchI, primaryPatchI, mapPatch, filmModel);
+        cacheFilmFields(filmPatchI, primaryPatchI, filmModel);
 
         const vectorField& Cf = mesh.C().boundaryField()[primaryPatchI];
         const vectorField& Sf = mesh.Sf().boundaryField()[primaryPatchI];
@@ -172,13 +170,11 @@ void Foam::SurfaceFilmModel<CloudType>::inject(TrackData& td)
             {
                 const label cellI = injectorCellsPatch[j];
 
-                // The position is at the cell centre, which could be
-                // in any tet of the decomposed cell, so arbitrarily
-                // choose the first face of the cell as the tetFace
-                // and the first point on the face after the base
-                // point as the tetPt.  The tracking will
-                // pick the cell consistent with the motion in the
-                // first tracking step.
+                // The position could bein any tet of the decomposed cell,
+                // so arbitrarily choose the first face of the cell as the
+                // tetFace and the first point on the face after the base
+                // point as the tetPt.  The tracking will pick the cell
+                // consistent with the motion in the first tracking step.
                 const label tetFaceI = this->owner().mesh().cells()[cellI][0];
                 const label tetPtI = 1;
 
@@ -208,14 +204,22 @@ void Foam::SurfaceFilmModel<CloudType>::inject(TrackData& td)
 
                 setParcelProperties(*pPtr, j);
 
-                // Check new parcel properties
-//                td.cloud().checkParcelProperties(*pPtr, 0.0, true);
-                td.cloud().checkParcelProperties(*pPtr, 0.0, false);
-
-                // Add the new parcel to the cloud
-                td.cloud().addParticle(pPtr);
-
-                nParcelsInjected_++;
+                if (pPtr->nParticle() > 0.001)
+                {
+                    // Check new parcel properties
+    //                td.cloud().checkParcelProperties(*pPtr, 0.0, true);
+                    td.cloud().checkParcelProperties(*pPtr, 0.0, false);
+
+                    // Add the new parcel to the cloud
+                    td.cloud().addParticle(pPtr);
+
+                    nParcelsInjected_++;
+                }
+                else
+                {
+                    // TODO: cache mass and re-distribute?
+                    delete pPtr;
+                }
             }
         }
     }
@@ -227,26 +231,25 @@ void Foam::SurfaceFilmModel<CloudType>::cacheFilmFields
 (
     const label filmPatchI,
     const label primaryPatchI,
-    const mappedPatchBase& mapPatch,
     const regionModels::surfaceFilmModels::surfaceFilmModel& filmModel
 )
 {
     massParcelPatch_ = filmModel.cloudMassTrans().boundaryField()[filmPatchI];
-    mapPatch.distribute(massParcelPatch_);
+    filmModel.toPrimary(filmPatchI, massParcelPatch_);
 
     diameterParcelPatch_ =
         filmModel.cloudDiameterTrans().boundaryField()[filmPatchI];
-    mapPatch.distribute(diameterParcelPatch_);
+    filmModel.toPrimary(filmPatchI, diameterParcelPatch_);
 
     UFilmPatch_ = filmModel.Us().boundaryField()[filmPatchI];
-    mapPatch.distribute(UFilmPatch_);
+    filmModel.toPrimary(filmPatchI, UFilmPatch_);
 
     rhoFilmPatch_ = filmModel.rho().boundaryField()[filmPatchI];
-    mapPatch.distribute(rhoFilmPatch_);
+    filmModel.toPrimary(filmPatchI, rhoFilmPatch_);
 
     deltaFilmPatch_[primaryPatchI] =
         filmModel.delta().boundaryField()[filmPatchI];
-    mapPatch.distribute(deltaFilmPatch_[primaryPatchI]);
+    filmModel.toPrimary(filmPatchI, deltaFilmPatch_[primaryPatchI]);
 }
 
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModel.H b/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModel.H
index ae35db7ec57e9babb1e9a5d22f2442605efd9f0c..967e748f56c8385483aca4dd3c2f4f280fa42da6 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModel.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModel.H
@@ -116,7 +116,6 @@ protected:
         (
             const label filmPatchI,
             const label primaryPatchI,
-            const mappedPatchBase& mapPatch,
             const regionModels::surfaceFilmModels::surfaceFilmModel& filmModel
         );
 
diff --git a/src/lagrangian/intermediate/submodels/Thermodynamic/SurfaceFilmModel/ThermoSurfaceFilm/ThermoSurfaceFilm.C b/src/lagrangian/intermediate/submodels/Thermodynamic/SurfaceFilmModel/ThermoSurfaceFilm/ThermoSurfaceFilm.C
index c6f4b4054a84ce8434935a81a179c3495890079c..6a6c60db3984390169d526e356537dd40f29575a 100644
--- a/src/lagrangian/intermediate/submodels/Thermodynamic/SurfaceFilmModel/ThermoSurfaceFilm/ThermoSurfaceFilm.C
+++ b/src/lagrangian/intermediate/submodels/Thermodynamic/SurfaceFilmModel/ThermoSurfaceFilm/ThermoSurfaceFilm.C
@@ -643,7 +643,6 @@ void Foam::ThermoSurfaceFilm<CloudType>::cacheFilmFields
 (
     const label filmPatchI,
     const label primaryPatchI,
-    const mappedPatchBase& mapPatch,
     const regionModels::surfaceFilmModels::surfaceFilmModel& filmModel
 )
 {
@@ -651,15 +650,14 @@ void Foam::ThermoSurfaceFilm<CloudType>::cacheFilmFields
     (
         filmPatchI,
         primaryPatchI,
-        mapPatch,
         filmModel
     );
 
     TFilmPatch_ = filmModel.Ts().boundaryField()[filmPatchI];
-    mapPatch.distribute(TFilmPatch_);
+    filmModel.toPrimary(filmPatchI, TFilmPatch_);
 
     CpFilmPatch_ = filmModel.Cp().boundaryField()[filmPatchI];
-    mapPatch.distribute(CpFilmPatch_);
+    filmModel.toPrimary(filmPatchI, CpFilmPatch_);
 }
 
 
diff --git a/src/lagrangian/intermediate/submodels/Thermodynamic/SurfaceFilmModel/ThermoSurfaceFilm/ThermoSurfaceFilm.H b/src/lagrangian/intermediate/submodels/Thermodynamic/SurfaceFilmModel/ThermoSurfaceFilm/ThermoSurfaceFilm.H
index 66bd1395682b2b38de27006916ed5ab74e42604a..bddbfcc66e9f28034472ff045a00e984850fc896 100644
--- a/src/lagrangian/intermediate/submodels/Thermodynamic/SurfaceFilmModel/ThermoSurfaceFilm/ThermoSurfaceFilm.H
+++ b/src/lagrangian/intermediate/submodels/Thermodynamic/SurfaceFilmModel/ThermoSurfaceFilm/ThermoSurfaceFilm.H
@@ -227,7 +227,6 @@ protected:
             (
                 const label filmPatchI,
                 const label primaryPatchI,
-                const mappedPatchBase& distMap,
                 const regionModels::surfaceFilmModels::surfaceFilmModel&
                     filmModel
             );
diff --git a/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.C b/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.C
index aa638ebd3876a9ee9e7439cd4dc2fec1e6829d8c..535583a9e13578de3a750ce3804e15122273fc17 100644
--- a/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.C
+++ b/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.C
@@ -119,6 +119,37 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::checkPatches
 }
 
 
+template<class SourcePatch, class TargetPatch>
+bool Foam::AMIInterpolation<SourcePatch, TargetPatch>::distributed
+(
+    const primitivePatch& srcPatch,
+    const primitivePatch& tgtPatch
+)
+{
+    if (Pstream::parRun())
+    {
+        List<label> facesPresentOnProc(Pstream::nProcs(), 0);
+        if ((srcPatch.size() > 0) || (tgtPatch.size() > 0))
+        {
+            facesPresentOnProc[Pstream::myProcNo()] = 1;
+        }
+        else
+        {
+            facesPresentOnProc[Pstream::myProcNo()] = 0;
+        }
+
+        Pstream::gatherList(facesPresentOnProc);
+        Pstream::scatterList(facesPresentOnProc);
+        if (sum(facesPresentOnProc) > 1)
+        {
+            return true;
+        }
+    }
+    
+    return false;
+}
+
+
 template<class SourcePatch, class TargetPatch>
 Foam::label
 Foam::AMIInterpolation<SourcePatch, TargetPatch>::calcOverlappingProcs
@@ -1160,7 +1191,7 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::update
 {
     static label patchI = 0;
 
-    if (Pstream::parRun())
+    if (Pstream::parRun() && distributed(srcPatch, tgtPatch))
     {
         // convert local addressing to global addressing
         globalIndex globalSrcFaces(srcPatch.size());
diff --git a/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.H b/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.H
index 8ad3be39ba079b7f9d4aa2782220acc563603bea..b9d73f24ee3446bae541fea490636b7d0a56df8d 100644
--- a/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.H
+++ b/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.H
@@ -167,6 +167,13 @@ class AMIInterpolation
 
         // Parallel functionality
 
+            //- Return true if faces are spread over multiple domains
+            bool distributed
+            (
+                const primitivePatch& srcPatch,
+                const primitivePatch& tgtPatch
+            );
+
             label calcOverlappingProcs
             (
                 const List<treeBoundBoxList>& procBb,
diff --git a/src/meshTools/mappedPatches/mappedPolyPatch/mappedPatchBase.H b/src/meshTools/mappedPatches/mappedPolyPatch/mappedPatchBase.H
index 8ee8022f6c85c3d0ab63c49ec3ee0b652c273cfd..3afb9d8c4b67824509e38506fd377a4766d5885c 100644
--- a/src/meshTools/mappedPatches/mappedPolyPatch/mappedPatchBase.H
+++ b/src/meshTools/mappedPatches/mappedPolyPatch/mappedPatchBase.H
@@ -339,6 +339,26 @@ public:
         }
 
 
+        //- Wrapper around map/interpolate data distribution
+        template<class Type>
+        void reverseDistribute(List<Type>& lst) const
+        {
+            switch (mode_)
+            {
+                case NEARESTPATCHFACEAMI:
+                {
+                    lst = AMI().interpolateToTarget(Field<Type>(lst.xfer()));
+                    break;
+                }
+                default:
+                {
+                    label cSize = patch_.size();
+                    map().reverseDistribute(cSize, lst);
+                }
+            }
+        }
+
+
         //- Return reference to the parallel distribution map
         const mapDistribute& map() const
         {
diff --git a/src/regionModels/regionCoupling/derivedFvPatchFields/filmPyrolysisTemperatureCoupled/filmPyrolysisTemperatureCoupledFvPatchScalarField.C b/src/regionModels/regionCoupling/derivedFvPatchFields/filmPyrolysisTemperatureCoupled/filmPyrolysisTemperatureCoupledFvPatchScalarField.C
index 8351d49d2da3ecc1cc8b04df86ad661bffffff0b..b0f8d1629a919d008f1267e6dcb99cc5562aef3b 100644
--- a/src/regionModels/regionCoupling/derivedFvPatchFields/filmPyrolysisTemperatureCoupled/filmPyrolysisTemperatureCoupledFvPatchScalarField.C
+++ b/src/regionModels/regionCoupling/derivedFvPatchFields/filmPyrolysisTemperatureCoupled/filmPyrolysisTemperatureCoupledFvPatchScalarField.C
@@ -151,13 +151,11 @@ void Foam::filmPyrolysisTemperatureCoupledFvPatchScalarField::updateCoeffs()
 
     const label filmPatchI = filmModel.regionPatchID(patchI);
 
-    const mappedPatchBase& filmMap = filmModel.mappedPatches()[filmPatchI];
-
     scalarField deltaFilm = filmModel.delta().boundaryField()[filmPatchI];
-    filmMap.distribute(deltaFilm);
+    filmModel.toPrimary(filmPatchI, deltaFilm);
 
     scalarField TFilm = filmModel.Ts().boundaryField()[filmPatchI];
-    filmMap.distribute(TFilm);
+    filmModel.toPrimary(filmPatchI, TFilm);
 
 
     // Retrieve pyrolysis model
@@ -166,10 +164,8 @@ void Foam::filmPyrolysisTemperatureCoupledFvPatchScalarField::updateCoeffs()
 
     const label pyrPatchI = pyrModel.regionPatchID(patchI);
 
-    const mappedPatchBase& pyrMap = pyrModel.mappedPatches()[pyrPatchI];
-
     scalarField TPyr = pyrModel.T().boundaryField()[pyrPatchI];
-    pyrMap.distribute(TPyr);
+    pyrModel.toPrimary(pyrPatchI, TPyr);
 
 
     forAll(deltaFilm, i)
diff --git a/src/regionModels/regionCoupling/derivedFvPatchFields/filmPyrolysisVelocityCoupled/filmPyrolysisVelocityCoupledFvPatchVectorField.C b/src/regionModels/regionCoupling/derivedFvPatchFields/filmPyrolysisVelocityCoupled/filmPyrolysisVelocityCoupledFvPatchVectorField.C
index a516534fa81d8b88fa72f28159f6175a893169ed..29b3e345868bcc112d33535b76bb42e1f89448f6 100644
--- a/src/regionModels/regionCoupling/derivedFvPatchFields/filmPyrolysisVelocityCoupled/filmPyrolysisVelocityCoupledFvPatchVectorField.C
+++ b/src/regionModels/regionCoupling/derivedFvPatchFields/filmPyrolysisVelocityCoupled/filmPyrolysisVelocityCoupledFvPatchVectorField.C
@@ -154,13 +154,11 @@ void Foam::filmPyrolysisVelocityCoupledFvPatchVectorField::updateCoeffs()
 
     const label filmPatchI = filmModel.regionPatchID(patchI);
 
-    const mappedPatchBase& filmMap = filmModel.mappedPatches()[filmPatchI];
-
     scalarField deltaFilm = filmModel.delta().boundaryField()[filmPatchI];
-    filmMap.distribute(deltaFilm);
+    filmModel.toPrimary(filmPatchI, deltaFilm);
 
     vectorField UFilm = filmModel.Us().boundaryField()[filmPatchI];
-    filmMap.distribute(UFilm);
+    filmModel.toPrimary(filmPatchI, UFilm);
 
 
     // Retrieve pyrolysis model
@@ -172,10 +170,8 @@ void Foam::filmPyrolysisVelocityCoupledFvPatchVectorField::updateCoeffs()
 
     const label pyrPatchI = pyrModel.regionPatchID(patchI);
 
-    const mappedPatchBase& pyrMap = pyrModel.mappedPatches()[pyrPatchI];
-
     scalarField phiPyr = pyrModel.phiGas().boundaryField()[pyrPatchI];
-    pyrMap.distribute(phiPyr);
+    pyrModel.toPrimary(pyrPatchI, phiPyr);
 
 
     const surfaceScalarField& phi =
diff --git a/src/regionModels/regionModel/regionModel/regionModel.C b/src/regionModels/regionModel/regionModel/regionModel.C
index 1d74a9c6465fd62809fb415218797839a51b5f6d..f7f630147eb734424cf6ea8cab833d636df100c6 100644
--- a/src/regionModels/regionModel/regionModel/regionModel.C
+++ b/src/regionModels/regionModel/regionModel/regionModel.C
@@ -93,8 +93,6 @@ void Foam::regionModels::regionModel::initialise()
     DynamicList<label> primaryPatchIDs;
     DynamicList<label> intCoupledPatchIDs;
     const polyBoundaryMesh& rbm = regionMesh().boundaryMesh();
-    const polyBoundaryMesh& pbm = primaryMesh().boundaryMesh();
-    mappedPatches_.setSize(rbm.size());
 
     forAll(rbm, patchI)
     {
@@ -116,19 +114,6 @@ void Foam::regionModels::regionModel::initialise()
 
             const label primaryPatchI = mapPatch.samplePolyPatch().index();
             primaryPatchIDs.append(primaryPatchI);
-
-            mappedPatches_.set
-            (
-                patchI,
-                new mappedPatchBase
-                (
-                    pbm[primaryPatchI],
-                    regionMesh().name(),
-                    mapPatch.mode(),
-                    regionPatch.name(),
-                    vector::zero
-                )
-            );
         }
     }
 
@@ -212,8 +197,7 @@ Foam::regionModels::regionModel::regionModel(const fvMesh& mesh)
     regionMeshPtr_(NULL),
     coeffs_(dictionary::null),
     primaryPatchIDs_(),
-    intCoupledPatchIDs_(),
-    mappedPatches_()
+    intCoupledPatchIDs_()
 {}
 
 
@@ -244,8 +228,7 @@ Foam::regionModels::regionModel::regionModel
     regionMeshPtr_(NULL),
     coeffs_(subOrEmptyDict(modelName + "Coeffs")),
     primaryPatchIDs_(),
-    intCoupledPatchIDs_(),
-    mappedPatches_()
+    intCoupledPatchIDs_()
 {
     if (active_)
     {
@@ -290,8 +273,7 @@ Foam::regionModels::regionModel::regionModel
     regionMeshPtr_(NULL),
     coeffs_(dict.subOrEmptyDict(modelName + "Coeffs")),
     primaryPatchIDs_(),
-    intCoupledPatchIDs_(),
-    mappedPatches_()
+    intCoupledPatchIDs_()
 {
     if (active_)
     {
diff --git a/src/regionModels/regionModel/regionModel/regionModel.H b/src/regionModels/regionModel/regionModel/regionModel.H
index bc9fb54a335335be346beefd7807d3784dd7090a..2af98421d108216d76b5606f0ff7d3bf4abc28cc 100644
--- a/src/regionModels/regionModel/regionModel/regionModel.H
+++ b/src/regionModels/regionModel/regionModel/regionModel.H
@@ -117,9 +117,6 @@ protected:
             //- List of patch IDs internally coupled with the primary region
             labelList intCoupledPatchIDs_;
 
-            //- List of patch map info
-            PtrList<mappedPatchBase> mappedPatches_;
-
 
     // Protected member functions
 
@@ -212,13 +209,29 @@ public:
                 //  primary region
                 inline const labelList& intCoupledPatchIDs() const;
 
-                //- Return the list of patch map info
-                inline const PtrList<mappedPatchBase>& mappedPatches() const;
-
                 //- Return region ID corresponding to primaryPatchID
                 inline label regionPatchID(const label primaryPatchID) const;
 
 
+        // Helper
+
+            //- Convert a local region field to the primary region
+            template<class Type>
+            void toPrimary
+            (
+                const label regionPatchI,
+                List<Type>& regionField
+            ) const;
+
+            //- Convert a primary region field to the local region
+            template<class Type>
+            void toRegion
+            (
+                const label regionPatchI,
+                List<Type>& primaryFieldField
+            ) const;
+
+
         // Evolution
 
             //- Pre-evolve region
@@ -249,6 +262,12 @@ public:
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
+#ifdef NoRepository
+    #include "regionModelTemplates.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
 #endif
 
 // ************************************************************************* //
diff --git a/src/regionModels/regionModel/regionModel/regionModelI.H b/src/regionModels/regionModel/regionModel/regionModelI.H
index 197e663d503e2a5dd72eaab257018a5184cebe99..a0e43403f7021bed6682847a1d1d82337304ca5f 100644
--- a/src/regionModels/regionModel/regionModel/regionModelI.H
+++ b/src/regionModels/regionModel/regionModel/regionModelI.H
@@ -132,13 +132,6 @@ Foam::regionModels::regionModel::intCoupledPatchIDs() const
 }
 
 
-inline const Foam::PtrList<Foam::mappedPatchBase>&
-Foam::regionModels::regionModel::mappedPatches() const
-{
-    return mappedPatches_;
-}
-
-
 inline Foam::label Foam::regionModels::regionModel::regionPatchID
 (
     const label primaryPatchID
diff --git a/src/regionModels/regionModel/regionModel/regionModelTemplates.C b/src/regionModels/regionModel/regionModel/regionModelTemplates.C
new file mode 100644
index 0000000000000000000000000000000000000000..977da7dd8167df5a3b5acf703cc09f434602c5b6
--- /dev/null
+++ b/src/regionModels/regionModel/regionModel/regionModelTemplates.C
@@ -0,0 +1,80 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+template<class Type>
+void Foam::regionModels::regionModel::toPrimary
+(
+    const label regionPatchI,
+    List<Type>& regionField
+) const
+{
+    forAll(intCoupledPatchIDs_, i)
+    {
+        if (intCoupledPatchIDs_[i] == regionPatchI)
+        {
+            const mappedPatchBase& mpb =
+                refCast<const mappedPatchBase>
+                (
+                    regionMesh().boundaryMesh()[regionPatchI]
+                );
+            mpb.reverseDistribute(regionField);
+            return;
+        }
+    }
+
+    FatalErrorIn("const void toPrimary(const label, List<Type>&) const")
+        << "Region patch ID " << regionPatchI << " not found in region mesh"
+        << abort(FatalError);
+}
+
+
+template<class Type>
+void Foam::regionModels::regionModel::toRegion
+(
+    const label regionPatchI,
+    List<Type>& primaryField
+) const
+{
+    forAll(intCoupledPatchIDs_, i)
+    {
+        if (intCoupledPatchIDs_[i] == regionPatchI)
+        {
+            const mappedPatchBase& mpb =
+                refCast<const mappedPatchBase>
+                (
+                    regionMesh().boundaryMesh()[regionPatchI]
+                );
+            mpb.distribute(primaryField);
+            return;
+        }
+    }
+
+    FatalErrorIn("const void toRegion(const label, List<Type>&) const")
+        << "Region patch ID " << regionPatchI << " not found in region mesh"
+        << abort(FatalError);
+}
+
+
+// ************************************************************************* //
diff --git a/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/alphatFilmWallFunction/alphatFilmWallFunctionFvPatchScalarField.C b/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/alphatFilmWallFunction/alphatFilmWallFunctionFvPatchScalarField.C
index 8b8ef3be1fbbb1001e5188696705ad0ce5de078f..fd3be5ac38564d18c5fb6e02478b04c3d0d65822 100644
--- a/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/alphatFilmWallFunction/alphatFilmWallFunctionFvPatchScalarField.C
+++ b/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/alphatFilmWallFunction/alphatFilmWallFunctionFvPatchScalarField.C
@@ -158,11 +158,9 @@ void alphatFilmWallFunctionFvPatchScalarField::updateCoeffs()
 
     const label filmPatchI = filmModel.regionPatchID(patchI);
 
-    const mappedPatchBase& filmMap = filmModel.mappedPatches()[filmPatchI];
-
     tmp<volScalarField> mDotFilm(filmModel.primaryMassTrans());
     scalarField mDotFilmp = mDotFilm().boundaryField()[filmPatchI];
-    filmMap.distribute(mDotFilmp);
+    filmModel.toPrimary(filmPatchI, mDotFilmp);
 
     // Retrieve RAS turbulence model
     const RASModel& rasModel = db().lookupObject<RASModel>("RASProperties");
diff --git a/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/mutkFilmWallFunction/mutkFilmWallFunctionFvPatchScalarField.C b/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/mutkFilmWallFunction/mutkFilmWallFunctionFvPatchScalarField.C
index 8cd0aaf5aa455cf2374442535a03457fc8ef16b9..7374f80e034b2191b6dceeb2500308642c87d1a8 100644
--- a/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/mutkFilmWallFunction/mutkFilmWallFunctionFvPatchScalarField.C
+++ b/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/mutkFilmWallFunction/mutkFilmWallFunctionFvPatchScalarField.C
@@ -70,11 +70,9 @@ tmp<scalarField> mutkFilmWallFunctionFvPatchScalarField::calcUTau
 
     const label filmPatchI = filmModel.regionPatchID(patchI);
 
-    const mappedPatchBase& filmMap = filmModel.mappedPatches()[filmPatchI];
-
     tmp<volScalarField> mDotFilm(filmModel.primaryMassTrans());
     scalarField mDotFilmp = mDotFilm().boundaryField()[filmPatchI];
-    filmMap.distribute(mDotFilmp);
+    filmModel.toPrimary(filmPatchI, mDotFilmp);
 
 
     // Retrieve RAS turbulence model
diff --git a/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayer.C b/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayer.C
index 461fbd10ae9da1509c56a4474a207959bfcc1cd2..a448083f997ce136619e8e4bfab473af3ef6629d 100644
--- a/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayer.C
+++ b/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayer.C
@@ -827,7 +827,7 @@ void kinematicSingleLayer::preEvolveRegion()
 //    availableMass_ = mass();
     availableMass_ = netMass();
     cloudMassTrans_ == dimensionedScalar("zero", dimMass, 0.0);
-    cloudDiameterTrans_ == dimensionedScalar("zero", dimLength, -1.0);
+    cloudDiameterTrans_ == dimensionedScalar("zero", dimLength, 0.0);
 }
 
 
diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/drippingInjection/drippingInjection.C b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/drippingInjection/drippingInjection.C
index 076e6abb231a74b092748953034069ac39ac7c8c..e271674b10d551e594e5752a71427aca98eae0ba 100644
--- a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/drippingInjection/drippingInjection.C
+++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/drippingInjection/drippingInjection.C
@@ -139,7 +139,7 @@ void drippingInjection::correct
         {
             // Mass below minimum threshold - cannot be injected
             massToInject[cellI] = 0.0;
-            diameterToInject[cellI] = -1.0;
+            diameterToInject[cellI] = 0.0;
         }
     }
 }
diff --git a/src/regionModels/surfaceFilmModels/thermoSingleLayer/thermoSingleLayer.C b/src/regionModels/surfaceFilmModels/thermoSingleLayer/thermoSingleLayer.C
index c6c373500f5848da211c4df8f04527ca2d4cdbb5..c405d98fa9fc20206f80cf1ad33f7cca8289f4f8 100644
--- a/src/regionModels/surfaceFilmModels/thermoSingleLayer/thermoSingleLayer.C
+++ b/src/regionModels/surfaceFilmModels/thermoSingleLayer/thermoSingleLayer.C
@@ -705,12 +705,11 @@ tmp<DimensionedField<scalar, volMesh> > thermoSingleLayer::Srho() const
     forAll(intCoupledPatchIDs(), i)
     {
         const label filmPatchI = intCoupledPatchIDs()[i];
-        const mappedPatchBase& filmMap = mappedPatches_[filmPatchI];
 
         scalarField patchMass =
             primaryMassPCTrans_.boundaryField()[filmPatchI];
 
-        filmMap.distribute(patchMass);
+        toPrimary(filmPatchI, patchMass);
 
         const label primaryPatchI = primaryPatchIDs()[i];
         const unallocLabelList& cells =
@@ -761,12 +760,11 @@ tmp<DimensionedField<scalar, volMesh> > thermoSingleLayer::Srho
         forAll(intCoupledPatchIDs_, i)
         {
             const label filmPatchI = intCoupledPatchIDs_[i];
-            const mappedPatchBase& filmMap = mappedPatches_[filmPatchI];
 
             scalarField patchMass =
                 primaryMassPCTrans_.boundaryField()[filmPatchI];
 
-            filmMap.distribute(patchMass);
+            toPrimary(filmPatchI, patchMass);
 
             const label primaryPatchI = primaryPatchIDs()[i];
             const unallocLabelList& cells =
@@ -812,12 +810,11 @@ tmp<DimensionedField<scalar, volMesh> > thermoSingleLayer::Sh() const
     forAll(intCoupledPatchIDs_, i)
     {
         const label filmPatchI = intCoupledPatchIDs_[i];
-        const mappedPatchBase& filmMap = mappedPatches_[filmPatchI];
 
         scalarField patchEnergy =
             primaryEnergyPCTrans_.boundaryField()[filmPatchI];
 
-        filmMap.distribute(patchEnergy);
+        toPrimary(filmPatchI, patchEnergy);
 
         const label primaryPatchI = primaryPatchIDs()[i];
         const unallocLabelList& cells =