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
         );