diff --git a/src/OpenFOAM/db/dictionary/dictionary.C b/src/OpenFOAM/db/dictionary/dictionary.C
index e6f7c6c7db97f12fdda697c04890cf4f1b684f59..57ebd84f7611583e54dbf14ff7ecfe77a50dfe7f 100644
--- a/src/OpenFOAM/db/dictionary/dictionary.C
+++ b/src/OpenFOAM/db/dictionary/dictionary.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2013 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -222,6 +222,21 @@ Foam::dictionary::~dictionary()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
+const Foam::dictionary& Foam::dictionary::topDict() const
+{
+    const dictionary& p = parent();
+
+    if (&p != this && !p.name().empty())
+    {
+        return p.topDict();
+    }
+    else
+    {
+        return p;
+    }
+}
+
+
 Foam::label Foam::dictionary::startLineNumber() const
 {
     if (size())
diff --git a/src/OpenFOAM/db/dictionary/dictionary.H b/src/OpenFOAM/db/dictionary/dictionary.H
index 2eab9e2778b62c5d26ab67869fdc41ee9b288b19..f7e7f8668c206d5e3c5cf1dd138de850c08b0bfe 100644
--- a/src/OpenFOAM/db/dictionary/dictionary.H
+++ b/src/OpenFOAM/db/dictionary/dictionary.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2013 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -250,6 +250,9 @@ public:
             return parent_;
         }
 
+        //- Return the top of the tree
+        const dictionary& topDict() const;
+
         //- Return line number of first token in dictionary
         label startLineNumber() const;
 
diff --git a/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.C b/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.C
index 1c774c352bc503846c89f6b226961c623e58e47f..f855f79bc2f94152d0a0bf6628c9c4879a871a6c 100644
--- a/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.C
+++ b/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.C
@@ -65,30 +65,12 @@ const Foam::word Foam::functionEntries::codeStream::codeTemplateC
 
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
-const Foam::dictionary& Foam::functionEntries::codeStream::topDict
-(
-    const dictionary& dict
-)
-{
-    const dictionary& p = dict.parent();
-
-    if (&p != &dict && !p.name().empty())
-    {
-        return topDict(p);
-    }
-    else
-    {
-        return dict;
-    }
-}
-
-
 Foam::dlLibraryTable& Foam::functionEntries::codeStream::libs
 (
     const dictionary& dict
 )
 {
-    const IOdictionary& d = static_cast<const IOdictionary&>(topDict(dict));
+    const IOdictionary& d = static_cast<const IOdictionary&>(dict.topDict());
     return const_cast<Time&>(d.time()).libs();
 }
 
@@ -114,7 +96,7 @@ Foam::functionEntries::codeStream::getFunction
 
     // see if library is loaded
     void* lib = NULL;
-    if (isA<IOdictionary>(topDict(parentDict)))
+    if (isA<IOdictionary>(parentDict.topDict()))
     {
         lib = libs(parentDict).findLibrary(libPath);
     }
@@ -129,7 +111,7 @@ Foam::functionEntries::codeStream::getFunction
     // avoid compilation if possible by loading an existing library
     if (!lib)
     {
-        if (isA<IOdictionary>(topDict(parentDict)))
+        if (isA<IOdictionary>(parentDict.topDict()))
         {
             // Cached access to dl libs. Guarantees clean up upon destruction
             // of Time.
@@ -267,7 +249,7 @@ Foam::functionEntries::codeStream::getFunction
             }
         }
 
-        if (isA<IOdictionary>(topDict(parentDict)))
+        if (isA<IOdictionary>(parentDict.topDict()))
         {
             // Cached access to dl libs. Guarantees clean up upon destruction
             // of Time.
diff --git a/src/OpenFOAM/meshes/polyMesh/mapPolyMesh/mapPolyMesh.C b/src/OpenFOAM/meshes/polyMesh/mapPolyMesh/mapPolyMesh.C
index f892a0d7c8b3fe0685c77d168f27632ad6633830..faf2922955a255b4fad4f7b28db3d5b6fb4181bc 100644
--- a/src/OpenFOAM/meshes/polyMesh/mapPolyMesh/mapPolyMesh.C
+++ b/src/OpenFOAM/meshes/polyMesh/mapPolyMesh/mapPolyMesh.C
@@ -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-2013 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -26,11 +26,8 @@ License
 #include "mapPolyMesh.H"
 #include "polyMesh.H"
 
-// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
-
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
-// Construct from components
 Foam::mapPolyMesh::mapPolyMesh
 (
     const polyMesh& mesh,
@@ -115,7 +112,6 @@ Foam::mapPolyMesh::mapPolyMesh
 }
 
 
-// Construct from components and optionally reuse storage
 Foam::mapPolyMesh::mapPolyMesh
 (
     const polyMesh& mesh,
@@ -177,31 +173,32 @@ Foam::mapPolyMesh::mapPolyMesh
     oldPatchStarts_(oldPatchStarts, reUse),
     oldPatchNMeshPoints_(oldPatchNMeshPoints, reUse)
 {
-    // Calculate old patch sizes
-    for (label patchI = 0; patchI < oldPatchStarts_.size() - 1; patchI++)
+    if (oldPatchStarts_.size() > 0)
     {
-        oldPatchSizes_[patchI] =
-            oldPatchStarts_[patchI + 1] - oldPatchStarts_[patchI];
-    }
+        // Calculate old patch sizes
+        for (label patchI = 0; patchI < oldPatchStarts_.size() - 1; patchI++)
+        {
+            oldPatchSizes_[patchI] =
+                oldPatchStarts_[patchI + 1] - oldPatchStarts_[patchI];
+        }
 
-    // Set the last one by hand
-    const label lastPatchID = oldPatchStarts_.size() - 1;
+        // Set the last one by hand
+        const label lastPatchID = oldPatchStarts_.size() - 1;
 
-    oldPatchSizes_[lastPatchID] = nOldFaces_ - oldPatchStarts_[lastPatchID];
+        oldPatchSizes_[lastPatchID] = nOldFaces_ - oldPatchStarts_[lastPatchID];
 
-    if (polyMesh::debug)
-    {
-        if (min(oldPatchSizes_) < 0)
+        if (polyMesh::debug)
         {
-            FatalErrorIn("mapPolyMesh::mapPolyMesh(...)")
-                << "Calculated negative old patch size.  Error in mapping data"
-                << abort(FatalError);
+            if (min(oldPatchSizes_) < 0)
+            {
+                FatalErrorIn("mapPolyMesh::mapPolyMesh(...)")
+                    << "Calculated negative old patch size."
+                    << "  Error in mapping data"
+                    << abort(FatalError);
+            }
         }
     }
 }
 
 
-// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
-
-
 // ************************************************************************* //
diff --git a/src/combustionModels/psiCombustionModel/psiCombustionModel/psiCombustionModels.C b/src/combustionModels/psiCombustionModel/psiCombustionModel/psiCombustionModels.C
deleted file mode 100644
index e8d96e9b63f7b54495820a30c3cceb50d4d50869..0000000000000000000000000000000000000000
--- a/src/combustionModels/psiCombustionModel/psiCombustionModel/psiCombustionModels.C
+++ /dev/null
@@ -1,44 +0,0 @@
-/*---------------------------------------------------------------------------*\
-  =========                 |
-  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-   \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2012 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/>.
-
-\*---------------------------------------------------------------------------*/
-
-#include "makeCombustionTypes.H"
-#include "psiCombustionModel.H"
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-namespace Foam
-{
-namespace combustionModels
-{
-    makeCombustionTypes
-    (
-        infinitelyFastChemistry,
-        psiCombustionModel
-    );
-}
-}
-
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/dynamicMesh/layerAdditionRemoval/layerAdditionRemoval.C b/src/dynamicMesh/layerAdditionRemoval/layerAdditionRemoval.C
index b052b4de8612173e820c9865ec19d402e03b4ec2..f99612eed69c4fb0cc68263796a39eb8e4b7703a 100644
--- a/src/dynamicMesh/layerAdditionRemoval/layerAdditionRemoval.C
+++ b/src/dynamicMesh/layerAdditionRemoval/layerAdditionRemoval.C
@@ -58,10 +58,8 @@ void Foam::layerAdditionRemoval::checkDefinition()
 {
     if (!faceZoneID_.active())
     {
-        FatalErrorIn
-        (
-            "void Foam::layerAdditionRemoval::checkDefinition()"
-        )   << "Master face zone named " << faceZoneID_.name()
+        FatalErrorIn("void Foam::layerAdditionRemoval::checkDefinition()")
+            << "Master face zone named " << faceZoneID_.name()
             << " cannot be found."
             << abort(FatalError);
     }
@@ -79,13 +77,15 @@ void Foam::layerAdditionRemoval::checkDefinition()
             << abort(FatalError);
     }
 
-    if (topoChanger().mesh().faceZones()[faceZoneID_.index()].empty())
+    label nFaces = topoChanger().mesh().faceZones()[faceZoneID_.index()].size();
+
+    reduce(nFaces, sumOp<label>());
+
+    if (nFaces == 0)
     {
-        FatalErrorIn
-        (
-            "void Foam::layerAdditionRemoval::checkDefinition()"
-        )   << "Face extrusion zone contains no faces. "
-            << " Please check your mesh definition."
+        FatalErrorIn("void Foam::layerAdditionRemoval::checkDefinition()")
+            << "Face extrusion zone contains no faces. "
+            << "Please check your mesh definition."
             << abort(FatalError);
     }
 
@@ -120,16 +120,18 @@ Foam::layerAdditionRemoval::layerAdditionRemoval
 (
     const word& name,
     const label index,
-    const polyTopoChanger& mme,
+    const polyTopoChanger& ptc,
     const word& zoneName,
     const scalar minThickness,
-    const scalar maxThickness
+    const scalar maxThickness,
+    const Switch thicknessFromVolume
 )
 :
-    polyMeshModifier(name, index, mme, true),
-    faceZoneID_(zoneName, mme.mesh().faceZones()),
+    polyMeshModifier(name, index, ptc, true),
+    faceZoneID_(zoneName, ptc.mesh().faceZones()),
     minLayerThickness_(minThickness),
     maxLayerThickness_(maxThickness),
+    thicknessFromVolume_(thicknessFromVolume),
     oldLayerThickness_(-1.0),
     pointsPairingPtr_(NULL),
     facesPairingPtr_(NULL),
@@ -145,13 +147,17 @@ Foam::layerAdditionRemoval::layerAdditionRemoval
     const word& name,
     const dictionary& dict,
     const label index,
-    const polyTopoChanger& mme
+    const polyTopoChanger& ptc
 )
 :
-    polyMeshModifier(name, index, mme, Switch(dict.lookup("active"))),
-    faceZoneID_(dict.lookup("faceZoneName"), mme.mesh().faceZones()),
+    polyMeshModifier(name, index, ptc, Switch(dict.lookup("active"))),
+    faceZoneID_(dict.lookup("faceZoneName"), ptc.mesh().faceZones()),
     minLayerThickness_(readScalar(dict.lookup("minLayerThickness"))),
     maxLayerThickness_(readScalar(dict.lookup("maxLayerThickness"))),
+    thicknessFromVolume_
+    (
+        dict.lookupOrDefault<Switch>("thicknessFromVolume", true)
+    ),
     oldLayerThickness_(readOldThickness(dict)),
     pointsPairingPtr_(NULL),
     facesPairingPtr_(NULL),
@@ -188,11 +194,13 @@ bool Foam::layerAdditionRemoval::changeTopology() const
     // Layer removal:
     //     When the min thickness falls below the threshold, trigger removal.
 
-    const faceZone& fz = topoChanger().mesh().faceZones()[faceZoneID_.index()];
+    const polyMesh& mesh = topoChanger().mesh();
+
+    const faceZone& fz = mesh.faceZones()[faceZoneID_.index()];
     const labelList& mc = fz.masterCells();
 
-    const scalarField& V = topoChanger().mesh().cellVolumes();
-    const vectorField& S = topoChanger().mesh().faceAreas();
+    const scalarField& V = mesh.cellVolumes();
+    const vectorField& S = mesh.faceAreas();
 
     if (min(V) < -VSMALL)
     {
@@ -205,63 +213,68 @@ bool Foam::layerAdditionRemoval::changeTopology() const
     scalar avgDelta = 0;
     scalar minDelta = GREAT;
     scalar maxDelta = 0;
+    label nDelta = 0;
+
+    if (thicknessFromVolume_)
+    {
+        // Thickness calculated from cell volume/face area
+        forAll(fz, faceI)
+        {
+            scalar curDelta = V[mc[faceI]]/mag(S[fz[faceI]]);
+            avgDelta += curDelta;
+            minDelta = min(minDelta, curDelta);
+            maxDelta = max(maxDelta, curDelta);
+        }
 
-    forAll(fz, faceI)
+        nDelta = fz.size();
+    }
+    else
     {
-        scalar curDelta = V[mc[faceI]]/mag(S[fz[faceI]]);
-        avgDelta += curDelta;
-        minDelta = min(minDelta, curDelta);
-        maxDelta = max(maxDelta, curDelta);
+        // Thickness calculated from edges on layer
+        const Map<label>& zoneMeshPointMap = fz().meshPointMap();
+
+        // Edges with only one point on zone
+        forAll(mc, faceI)
+        {
+            const cell& cFaces = mesh.cells()[mc[faceI]];
+            const edgeList cellEdges(cFaces.edges(mesh.faces()));
+
+            forAll(cellEdges, i)
+            {
+                const edge& e = cellEdges[i];
+
+                if (zoneMeshPointMap.found(e[0]))
+                {
+                    if (!zoneMeshPointMap.found(e[1]))
+                    {
+                        scalar curDelta = e.mag(mesh.points());
+                        avgDelta += curDelta;
+                        nDelta++;
+                        minDelta = min(minDelta, curDelta);
+                        maxDelta = max(maxDelta, curDelta);
+                    }
+                }
+                else
+                {
+                    if (zoneMeshPointMap.found(e[1]))
+                    {
+                        scalar curDelta = e.mag(mesh.points());
+                        avgDelta += curDelta;
+                        nDelta++;
+                        minDelta = min(minDelta, curDelta);
+                        maxDelta = max(maxDelta, curDelta);
+                    }
+                }
+            }
+        }
     }
 
-    avgDelta /= fz.size();
-
-    ////MJ Alternative thickness determination
-    //{
-    //    // Edges on layer.
-    //    const Map<label>& zoneMeshPointMap = fz().meshPointMap();
-    //
-    //    label nDelta = 0;
-    //
-    //    // Edges with only one point on zone
-    //    const polyMesh& mesh = topoChanger().mesh();
-    //
-    //    forAll(mc, faceI)
-    //    {
-    //        const cell& cFaces = mesh.cells()[mc[faceI]];
-    //        const edgeList cellEdges(cFaces.edges(mesh.faces()));
-    //
-    //        forAll(cellEdges, i)
-    //        {
-    //            const edge& e = cellEdges[i];
-    //
-    //            if (zoneMeshPointMap.found(e[0]))
-    //            {
-    //                if (!zoneMeshPointMap.found(e[1]))
-    //                {
-    //                    scalar curDelta = e.mag(mesh.points());
-    //                    avgDelta += curDelta;
-    //                    nDelta++;
-    //                    minDelta = min(minDelta, curDelta);
-    //                    maxDelta = max(maxDelta, curDelta);
-    //                }
-    //            }
-    //            else
-    //            {
-    //                if (zoneMeshPointMap.found(e[1]))
-    //                {
-    //                    scalar curDelta = e.mag(mesh.points());
-    //                    avgDelta += curDelta;
-    //                    nDelta++;
-    //                    minDelta = min(minDelta, curDelta);
-    //                    maxDelta = max(maxDelta, curDelta);
-    //                }
-    //            }
-    //        }
-    //    }
-    //
-    //    avgDelta /= nDelta;
-    //}
+    reduce(minDelta, minOp<scalar>());
+    reduce(maxDelta, maxOp<scalar>());
+    reduce(avgDelta, sumOp<scalar>());
+    reduce(nDelta, sumOp<label>());
+
+    avgDelta /= nDelta;
 
     if (debug)
     {
@@ -286,7 +299,6 @@ bool Foam::layerAdditionRemoval::changeTopology() const
         }
 
         // No topological changes allowed before first mesh motion
-        //
         oldLayerThickness_ = avgDelta;
 
         topologicalChange = false;
@@ -314,7 +326,7 @@ bool Foam::layerAdditionRemoval::changeTopology() const
                             << "Triggering layer removal" << endl;
                     }
 
-                    triggerRemoval_ = topoChanger().mesh().time().timeIndex();
+                    triggerRemoval_ = mesh.time().timeIndex();
 
                     // Old thickness looses meaning.
                     // Set it up to indicate layer removal
@@ -346,7 +358,7 @@ bool Foam::layerAdditionRemoval::changeTopology() const
                     << "Triggering layer addition" << endl;
             }
 
-            triggerAddition_ = topoChanger().mesh().time().timeIndex();
+            triggerAddition_ = mesh.time().timeIndex();
 
             // Old thickness looses meaning.
             // Set it up to indicate layer removal
@@ -377,8 +389,8 @@ void Foam::layerAdditionRemoval::setRefinement(polyTopoChange& ref) const
         if (debug)
         {
             Pout<< "layerAdditionRemoval::setRefinement(polyTopoChange&) "
-                << " for object " << name() << " : "
-                << "Clearing addressing after layer removal. " << endl;
+                << "for object " << name() << " : "
+                << "Clearing addressing after layer removal" << endl;
         }
 
         triggerRemoval_ = -1;
@@ -393,8 +405,8 @@ void Foam::layerAdditionRemoval::setRefinement(polyTopoChange& ref) const
         if (debug)
         {
             Pout<< "layerAdditionRemoval::setRefinement(polyTopoChange&) "
-                << " for object " << name() << " : "
-                << "Clearing addressing after layer addition. " << endl;
+                << "for object " << name() << " : "
+                << "Clearing addressing after layer addition" << endl;
         }
 
         triggerAddition_ = -1;
@@ -408,8 +420,8 @@ void Foam::layerAdditionRemoval::updateMesh(const mapPolyMesh&)
     if (debug)
     {
         Pout<< "layerAdditionRemoval::updateMesh(const mapPolyMesh&) "
-            << " for object " << name() << " : "
-            << "Clearing addressing on external request. ";
+            << "for object " << name() << " : "
+            << "Clearing addressing on external request";
 
         if (pointsPairingPtr_ || facesPairingPtr_)
         {
@@ -471,7 +483,8 @@ void Foam::layerAdditionRemoval::write(Ostream& os) const
         << faceZoneID_ << nl
         << minLayerThickness_ << nl
         << oldLayerThickness_ << nl
-        << maxLayerThickness_ << endl;
+        << maxLayerThickness_ << nl
+        << thicknessFromVolume_ << endl;
 }
 
 
@@ -486,6 +499,8 @@ void Foam::layerAdditionRemoval::writeDict(Ostream& os) const
         << token::END_STATEMENT << nl
         << "    maxLayerThickness " << maxLayerThickness_
         << token::END_STATEMENT << nl
+        << "    thicknessFromVolume " << thicknessFromVolume_
+        << token::END_STATEMENT << nl
         << "    oldLayerThickness " << oldLayerThickness_
         << token::END_STATEMENT << nl
         << "    active " << active()
diff --git a/src/dynamicMesh/layerAdditionRemoval/layerAdditionRemoval.H b/src/dynamicMesh/layerAdditionRemoval/layerAdditionRemoval.H
index daef7650974a5beedd09448ace1a3d78a272ed16..edb3218eaebb7d1535196aa86ddb5db0dda68ad4 100644
--- a/src/dynamicMesh/layerAdditionRemoval/layerAdditionRemoval.H
+++ b/src/dynamicMesh/layerAdditionRemoval/layerAdditionRemoval.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-2013 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -65,6 +65,10 @@ class layerAdditionRemoval
         //- Max thickness of extrusion layer.  Triggers layer addition
         mutable scalar maxLayerThickness_;
 
+        //- Switch to calculate thickness as volume/area
+        //  If false, thickness calculated from edges
+        const bool thicknessFromVolume_;
+
         //- Layer thickness from previous step
         //  Used to decide whether to add or remove layers
         mutable scalar oldLayerThickness_;
@@ -78,7 +82,7 @@ class layerAdditionRemoval
         //- Layer removal trigger time index
         mutable label triggerRemoval_;
 
-        //- Layer addition trigger  time index
+        //- Layer addition trigger time index
         mutable label triggerAddition_;
 
 
@@ -120,6 +124,7 @@ class layerAdditionRemoval
             //- Clear addressing
             void clearAddressing() const;
 
+
         // Helpers
 
             //- Optionally read old thickness
@@ -149,10 +154,11 @@ public:
         (
             const word& name,
             const label index,
-            const polyTopoChanger& mme,
+            const polyTopoChanger& ptc,
             const word& zoneName,
             const scalar minThickness,
-            const scalar maxThickness
+            const scalar maxThickness,
+            const Switch thicknessFromVolume = true
         );
 
         //- Construct from dictionary
@@ -161,7 +167,7 @@ public:
             const word& name,
             const dictionary& dict,
             const label index,
-            const polyTopoChanger& mme
+            const polyTopoChanger& ptc
         );
 
 
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.C b/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.C
index 49ee1a445e70abd754853161e3d791d9aabe4786..23e39f203d517081532b5e7927fd4c1d1c79dc9d 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.C
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.C
@@ -818,22 +818,25 @@ void Foam::polyTopoChange::getFaceOrder
     patchSizes.setSize(nPatches_);
     patchSizes = 0;
 
-    patchStarts[0] = newFaceI;
-
-    for (label faceI = 0; faceI < nActiveFaces; faceI++)
+    if (nPatches_ > 0)
     {
-        if (region_[faceI] >= 0)
+        patchStarts[0] = newFaceI;
+
+        for (label faceI = 0; faceI < nActiveFaces; faceI++)
         {
-            patchSizes[region_[faceI]]++;
+            if (region_[faceI] >= 0)
+            {
+                patchSizes[region_[faceI]]++;
+            }
         }
-    }
 
-    label faceI = patchStarts[0];
+        label faceI = patchStarts[0];
 
-    forAll(patchStarts, patchI)
-    {
-        patchStarts[patchI] = faceI;
-        faceI += patchSizes[patchI];
+        forAll(patchStarts, patchI)
+        {
+            patchStarts[patchI] = faceI;
+            faceI += patchSizes[patchI];
+        }
     }
 
     //if (debug)
diff --git a/src/lagrangian/spray/submodels/BreakupModel/PilchErdman/PilchErdman.C b/src/lagrangian/spray/submodels/BreakupModel/PilchErdman/PilchErdman.C
index d2ca617bbd77d018e52e52b68ab6ed074a2458e4..e6863ad0db7c34dfffa327079244576080d02c4e 100644
--- a/src/lagrangian/spray/submodels/BreakupModel/PilchErdman/PilchErdman.C
+++ b/src/lagrangian/spray/submodels/BreakupModel/PilchErdman/PilchErdman.C
@@ -36,7 +36,7 @@ Foam::PilchErdman<CloudType>::PilchErdman
 :
     BreakupModel<CloudType>(dict, owner, typeName),
     B1_(0.375),
-    B2_(0.236)
+    B2_(0.2274)
 {
     if (!this->defaultCoeffs(true))
     {
@@ -90,58 +90,79 @@ bool Foam::PilchErdman<CloudType>::update
     scalar& massChild
 )
 {
-    scalar semiMass = nParticle*pow3(d);
-    scalar We = 0.5*rhoc*sqr(Urmag)*d/sigma;
+    // Weber number - eq (1)
+    scalar We = rhoc*sqr(Urmag)*d/sigma;
+
+    // Ohnesorge number - eq (2)
     scalar Oh = mu/sqrt(rho*d*sigma);
 
-    scalar Wec = 6.0*(1.0 + 1.077*pow(Oh, 1.6));
+    // Critical Weber number - eq (5)
+    scalar Wec = 12.0*(1.0 + 1.077*pow(Oh, 1.6));
 
     if (We > Wec)
     {
-        // We > 1335, wave crest stripping
+        // We > 2670, wave crest stripping - eq (12)
         scalar taubBar = 5.5;
 
-        if (We < 1335)
+        if (We < 2670)
         {
-            if (We > 175.0)
+            if (We > 351)
+            {
+                // sheet stripping - eq (11)
+                taubBar = 0.766*pow(We - 12.0, 0.25);
+            }
+            else if (We > 45)
             {
-                // sheet stripping
-                taubBar = 0.766*pow(2.0*We - 12.0, 0.25);
+                // bag-and-stamen breakup  - eq (10)
+                taubBar = 14.1*pow(We - 12.0, 0.25);
             }
-            else if (We > 22.0)
+            else if (We > 18)
             {
-                // Bag-and-stamen breakup
-                taubBar = 14.1*pow(2.0*We - 12.0, -0.25);
+                // bag breakup - eq (9)
+                taubBar = 2.45*pow(We - 12.0, 0.25);
             }
-            else if (We > 9.0)
+            else if (We > 12)
             {
-                // Bag breakup
-                taubBar = 2.45*pow(2.0*We - 12.0, 0.25);
+                // vibrational breakup - eq (8)
+                taubBar = 6.0*pow(We - 12.0, -0.25);
             }
-            else if (We > 6.0)
+            else
             {
-                // Vibrational breakup
-                taubBar = 6.0*pow(2.0*We - 12.0, -0.25);
+                // no break-up
+                taubBar = GREAT;
             }
         }
 
         scalar rho12 = sqrt(rhoc/rho);
 
-        scalar Vd = Urmag*rho12*(B1_*taubBar + B2_*taubBar*taubBar);
+        // velocity of fragmenting drop - eq (20)
+        scalar Vd = Urmag*rho12*(B1_*taubBar + B2_*sqr(taubBar));
+
+        // maximum stable diameter - eq (33)
         scalar Vd1 = sqr(1.0 - Vd/Urmag);
         Vd1 = max(Vd1, SMALL);
-        scalar Ds = 2.0*Wec*sigma/(Vd1*rhoc*sqr(Urmag));
-        scalar A = Urmag*rho12/d;
+        scalar dStable = Wec*sigma/(Vd1*rhoc*sqr(Urmag));
 
-        scalar taub = taubBar/A;
+        if (d < dStable)
+        {
+            // droplet diameter already stable = no break-up
+            // - do not update d and nParticle
+            return false;
+        }
+        else
+        {
+            scalar semiMass = nParticle*pow3(d);
 
-        scalar frac = dt/taub;
+            // invert eq (3) to create a dimensional break-up time
+            scalar taub = taubBar*d/(Urmag*rho12);
 
-        // update the droplet diameter according to the rate eq. (implicitly)
-        d = (d + frac*Ds)/(1.0 + frac);
+            // update droplet diameter according to the rate eq (implicitly)
+            scalar frac = dt/taub;
+            d = (d + frac*dStable)/(1.0 + frac);
 
-        // correct the number of particles to conserve mass
-        nParticle = semiMass/pow3(d);
+            // correct the number of particles to conserve mass
+            nParticle = semiMass/pow3(d);
+        }
     }
 
     return false;
diff --git a/src/lagrangian/spray/submodels/BreakupModel/PilchErdman/PilchErdman.H b/src/lagrangian/spray/submodels/BreakupModel/PilchErdman/PilchErdman.H
index 830c1feeb50e872ca7611b9e9eb06e6e757f06d0..09d1f3fe0312a7729550514041bda00a6da15a09 100644
--- a/src/lagrangian/spray/submodels/BreakupModel/PilchErdman/PilchErdman.H
+++ b/src/lagrangian/spray/submodels/BreakupModel/PilchErdman/PilchErdman.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-2013 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -25,7 +25,7 @@ Class
     Foam::PilchErdman
 
 Description
-    secondary breakup model
+    Particle secondary breakup model, based on the reference:
 
     @verbatim
     Pilch, M. and Erdman, C.A.
@@ -35,6 +35,24 @@ Description
     Int. J. Multiphase Flows 13 (1987), 741-757
     @endverbatim
 
+    The droplet fragment velocity is described by the equation:
+
+    \f[
+        V_d = V sqrt(epsilon)(B1 T + B2 T^2)
+    \f]
+
+    Where:
+        V_d     : fragment velocity
+        V       : magnitude of the relative velocity
+        epsilon : density ratio (rho_carrier/rho_droplet)
+        T       : characteristic break-up time
+        B1, B2  : model input coefficients
+
+    The authors suggest that:
+        compressible flow   : B1 = 0.75*1.0; B2 = 3*0.116
+        incompressible flow : B1 = 0.75*0.5; B2 = 3*0.0758
+
+
 \*---------------------------------------------------------------------------*/
 
 #ifndef PilchErdman_H
diff --git a/src/sampling/sampledSurface/writers/nastran/nastranSurfaceWriter.H b/src/sampling/sampledSurface/writers/nastran/nastranSurfaceWriter.H
index 35374a7d94b50ac74c502c0fd3f24f5bd2fbd852..e80383a3037765cebc6dee6cbe7d0dfa12c7ec5a 100644
--- a/src/sampling/sampledSurface/writers/nastran/nastranSurfaceWriter.H
+++ b/src/sampling/sampledSurface/writers/nastran/nastranSurfaceWriter.H
@@ -27,6 +27,19 @@ Class
 Description
     A surface writer for the Nastran file format - both surface mesh and fields
 
+    formatOptions
+    {
+        nastran
+        {
+            // From OpenFOAM field name to Nastran field name
+            fields ((pMean PLOAD2));
+            // Optional scale
+            scale 2.0;
+            // Optional format
+            format free;    //short, long, free
+        }
+    };
+
 SourceFiles
     nastranSurfaceWriter.C
     nastranSurfaceWriterTemplates.C