diff --git a/src/OpenFOAM/meshes/polyMesh/polyMesh.C b/src/OpenFOAM/meshes/polyMesh/polyMesh.C
index af15b5edf56f756b504def0e59d1293a95e49853..162e895170999fe2f37d9266765b6fdf44a8610e 100644
--- a/src/OpenFOAM/meshes/polyMesh/polyMesh.C
+++ b/src/OpenFOAM/meshes/polyMesh/polyMesh.C
@@ -265,7 +265,7 @@ Foam::polyMesh::polyMesh(const IOobject& io)
     ),
     globalMeshDataPtr_(NULL),
     moving_(false),
-    changing_(false),
+    topoChanging_(false),
     curMotionTimeIndex_(time().timeIndex()),
     oldPointsPtr_(NULL)
 {
@@ -447,7 +447,7 @@ Foam::polyMesh::polyMesh
     ),
     globalMeshDataPtr_(NULL),
     moving_(false),
-    changing_(false),
+    topoChanging_(false),
     curMotionTimeIndex_(time().timeIndex()),
     oldPointsPtr_(NULL)
 {
@@ -606,7 +606,7 @@ Foam::polyMesh::polyMesh
     ),
     globalMeshDataPtr_(NULL),
     moving_(false),
-    changing_(false),
+    topoChanging_(false),
     curMotionTimeIndex_(time().timeIndex()),
     oldPointsPtr_(NULL)
 {
@@ -673,8 +673,8 @@ void Foam::polyMesh::resetPrimitives
     const bool validBoundary
 )
 {
-    // Clear addressing. Keep geometric props for mapping.
-    clearAddressing();
+    // Clear addressing. Keep geometric props and updateable props for mapping.
+    clearAddressing(true);
 
     // Take over new primitive data.
     // Optimized to avoid overwriting data at all
diff --git a/src/OpenFOAM/meshes/polyMesh/polyMesh.H b/src/OpenFOAM/meshes/polyMesh/polyMesh.H
index 47fe014d60cee03752bed1f9a8b95974e1dbe560..5d95d9cfb876a258b2c89dc5f8e2dbbc3ea7e169 100644
--- a/src/OpenFOAM/meshes/polyMesh/polyMesh.H
+++ b/src/OpenFOAM/meshes/polyMesh/polyMesh.H
@@ -172,8 +172,8 @@ private:
             //- Is the mesh moving
             bool moving_;
 
-            //- Is the mesh changing (moving and/or topology changing)
-            bool changing_;
+            //- Is the mesh topology changing
+            bool topoChanging_;
 
             //- Current time index for mesh motion
             mutable label curMotionTimeIndex_;
@@ -489,24 +489,29 @@ public:
             {
                 bool m0 = moving_;
                 moving_ = m;
-                changing_ = changing_ || moving_;
                 return m0;
             }
 
-            //- Is mesh changing (topology changing and/or moving)
-            bool changing() const
+            //- Is mesh topology changing
+            bool topoChanging() const
             {
-                return changing_;
+                return topoChanging_;
             }
 
-            //- Set the mesh to be changing
-            bool changing(const bool c)
+            //- Set the mesh topology to be changing
+            bool topoChanging(const bool c)
             {
-                bool c0 = changing_;
-                changing_ = c;
+                bool c0 = topoChanging_;
+                topoChanging_ = c;
                 return c0;
             }
 
+            //- Is mesh changing (topology changing and/or moving)
+            bool changing() const
+            {
+                return moving()||topoChanging();
+            }
+
             //- Move points, returns volumes swept by faces in motion
             virtual tmp<scalarField> movePoints(const pointField&);
 
@@ -580,7 +585,7 @@ public:
             void clearGeom();
 
             //- Clear addressing
-            void clearAddressing();
+            void clearAddressing(const bool isMeshUpdate = false);
 
             //- Clear all geometry and addressing unnecessary for CFD
             void clearOut();
diff --git a/src/OpenFOAM/meshes/polyMesh/polyMeshClear.C b/src/OpenFOAM/meshes/polyMesh/polyMeshClear.C
index 7a9558187d54f0b862f09f14be06ff8b59058911..96297ed3e107e79eab6277796f832742b11eddbe 100644
--- a/src/OpenFOAM/meshes/polyMesh/polyMeshClear.C
+++ b/src/OpenFOAM/meshes/polyMesh/polyMeshClear.C
@@ -60,6 +60,7 @@ void Foam::polyMesh::clearGeom()
             << endl;
     }
 
+    // Clear all geometric mesh objects
     meshObject::clear<polyMesh, GeometricMeshObject>(*this);
 
     primitiveMesh::clearGeom();
@@ -93,16 +94,33 @@ void Foam::polyMesh::clearAdditionalGeom()
 }
 
 
-void Foam::polyMesh::clearAddressing()
+void Foam::polyMesh::clearAddressing(const bool isMeshUpdate)
 {
     if (debug)
     {
         Info<< "void polyMesh::clearAddressing() : "
-            << "clearing topology"
+            << "clearing topology  isMeshUpdate:" << isMeshUpdate
             << endl;
     }
 
-    meshObject::clear<polyMesh, TopologicalMeshObject>(*this);
+    if (isMeshUpdate)
+    {
+        // Part of a mesh update. Keep meshObjects that have an updateMesh
+        // callback
+        meshObject::clearUpto
+        <
+            polyMesh,
+            TopologicalMeshObject,
+            UpdateableMeshObject
+        >
+        (
+            *this
+        );
+    }
+    else
+    {
+        meshObject::clear<polyMesh, TopologicalMeshObject>(*this);
+    }
 
     primitiveMesh::clearAddressing();
 
diff --git a/src/OpenFOAM/meshes/polyMesh/polyMeshFromShapeMesh.C b/src/OpenFOAM/meshes/polyMesh/polyMeshFromShapeMesh.C
index 43d55876cac08c0823a089f0be6dbf638d2fcee1..ef5ee9956c3b7fb071ec5264de5dd590aaf683fd 100644
--- a/src/OpenFOAM/meshes/polyMesh/polyMeshFromShapeMesh.C
+++ b/src/OpenFOAM/meshes/polyMesh/polyMeshFromShapeMesh.C
@@ -553,7 +553,7 @@ Foam::polyMesh::polyMesh
     ),
     globalMeshDataPtr_(NULL),
     moving_(false),
-    changing_(false),
+    topoChanging_(false),
     curMotionTimeIndex_(time().timeIndex()),
     oldPointsPtr_(NULL)
 {
@@ -837,7 +837,7 @@ Foam::polyMesh::polyMesh
     ),
     globalMeshDataPtr_(NULL),
     moving_(false),
-    changing_(false),
+    topoChanging_(false),
     curMotionTimeIndex_(time().timeIndex()),
     oldPointsPtr_(NULL)
 {
diff --git a/src/dynamicFvMesh/dynamicRefineFvMesh/dynamicRefineFvMesh.C b/src/dynamicFvMesh/dynamicRefineFvMesh/dynamicRefineFvMesh.C
index 77fc1f26ca7b18439bb2f1ab57b2b63c13c2f210..bfc6b567f45db7b1e2f6bca7a933227fa55c65df 100644
--- a/src/dynamicFvMesh/dynamicRefineFvMesh/dynamicRefineFvMesh.C
+++ b/src/dynamicFvMesh/dynamicRefineFvMesh/dynamicRefineFvMesh.C
@@ -32,6 +32,7 @@ License
 #include "syncTools.H"
 #include "pointFields.H"
 #include "sigFpe.H"
+#include "cellSet.H"
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
@@ -1072,6 +1073,26 @@ Foam::dynamicRefineFvMesh::dynamicRefineFvMesh(const IOobject& io)
     {
         protectedCell_.clear();
     }
+    else
+    {
+
+        cellSet protectedCells(*this, "protectedCells", nProtected);
+        forAll(protectedCell_, cellI)
+        {
+            if (protectedCell_[cellI])
+            {
+                protectedCells.insert(cellI);
+            }
+        }
+
+        Info<< "Detected " << returnReduce(nProtected, sumOp<label>())
+            << " cells that are projected from refinement."
+            << " Writing these to cellSet "
+            << protectedCells.name()
+            << "." << endl;
+
+        protectedCells.write();
+    }
 }
 
 
@@ -1110,7 +1131,7 @@ bool Foam::dynamicRefineFvMesh::update()
 
     if (refineInterval == 0)
     {
-        changing(hasChanged);
+        topoChanging(hasChanged);
 
         return false;
     }
@@ -1279,7 +1300,13 @@ bool Foam::dynamicRefineFvMesh::update()
         nRefinementIterations_++;
     }
 
-    changing(hasChanged);
+    topoChanging(hasChanged);
+    if (hasChanged)
+    {
+        // Reset moving flag (if any). If not using inflation we'll not move,
+        // if are using inflation any follow on movePoints will set it.
+        moving(false);
+    }
 
     return hasChanged;
 }
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.C b/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.C
index bb53ef1aa02bc86ba1b8105866bab097b4f9cf1e..f35ebd881ceb0e494c2f094675d6e5e9e2503b97 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.C
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.C
@@ -3184,7 +3184,9 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::polyTopoChange::changeMesh
             syncParallel
         );
 
-        mesh.changing(true);
+        mesh.topoChanging(true);
+        // Note: could already set moving flag as well
+        //       mesh.moving(true);
     }
     else
     {
@@ -3199,7 +3201,7 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::polyTopoChange::changeMesh
             patchStarts,
             syncParallel
         );
-        mesh.changing(true);
+        mesh.topoChanging(true);
     }
 
     // Clear out primitives
diff --git a/src/finiteVolume/fvMesh/fvMesh.C b/src/finiteVolume/fvMesh/fvMesh.C
index 26c3b3342381c39d8427508fcafe163becc0116a..8f99d1f61782495b830bfb8bd3f98ce0a0041f4e 100644
--- a/src/finiteVolume/fvMesh/fvMesh.C
+++ b/src/finiteVolume/fvMesh/fvMesh.C
@@ -110,10 +110,42 @@ void Foam::fvMesh::clearGeom()
 }
 
 
-void Foam::fvMesh::clearAddressing()
+void Foam::fvMesh::clearAddressing(const bool isMeshUpdate)
 {
-    meshObject::clear<fvMesh, TopologicalMeshObject>(*this);
-    meshObject::clear<lduMesh, TopologicalMeshObject>(*this);
+    if (debug)
+    {
+        Info<< "fvMesh::clearAddressing(const bool) :"
+            << " isMeshUpdate:" << isMeshUpdate << endl;
+    }
+
+    if (isMeshUpdate)
+    {
+        // Part of a mesh update. Keep meshObjects that have an updateMesh
+        // callback
+        meshObject::clearUpto
+        <
+            fvMesh,
+            TopologicalMeshObject,
+            UpdateableMeshObject
+        >
+        (
+            *this
+        );
+        meshObject::clearUpto
+        <
+            lduMesh,
+            TopologicalMeshObject,
+            UpdateableMeshObject
+        >
+        (
+            *this
+        );
+    }
+    else
+    {
+        meshObject::clear<fvMesh, TopologicalMeshObject>(*this);
+        meshObject::clear<lduMesh, TopologicalMeshObject>(*this);
+    }
     deleteDemandDrivenData(lduPtr_);
 }
 
@@ -806,7 +838,8 @@ void Foam::fvMesh::updateMesh(const mapPolyMesh& mpm)
     // Clear the current volume and other geometry factors
     surfaceInterpolation::clearOut();
 
-    clearAddressing();
+    // Clear any non-updateable addressing
+    clearAddressing(true);
 
     meshObject::updateMesh<fvMesh>(*this, mpm);
     meshObject::updateMesh<lduMesh>(*this, mpm);
diff --git a/src/finiteVolume/fvMesh/fvMesh.H b/src/finiteVolume/fvMesh/fvMesh.H
index c6c234c495811327949535fa8907e67647e668a5..47c03db1156ce2a84e7546484850c142cd0cef17 100644
--- a/src/finiteVolume/fvMesh/fvMesh.H
+++ b/src/finiteVolume/fvMesh/fvMesh.H
@@ -141,7 +141,7 @@ class fvMesh
             void clearGeom();
 
             //- Clear addressing
-            void clearAddressing();
+            void clearAddressing(const bool isMeshUpdate = false);
 
             //- Preserve old volume(s)
             void storeOldVol(const scalarField&);
diff --git a/src/topoChangerFvMesh/rawTopoChangerFvMesh/rawTopoChangerFvMesh.C b/src/topoChangerFvMesh/rawTopoChangerFvMesh/rawTopoChangerFvMesh.C
index 2234cf1808953bf540ead9c6e12a860a8b6f05b2..a2fb50dc40306689ca42b44ad7bf92cc1079539c 100644
--- a/src/topoChangerFvMesh/rawTopoChangerFvMesh/rawTopoChangerFvMesh.C
+++ b/src/topoChangerFvMesh/rawTopoChangerFvMesh/rawTopoChangerFvMesh.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
@@ -65,6 +65,12 @@ bool Foam::rawTopoChangerFvMesh::update()
     // Do mesh changes (use inflation - put new points in topoChangeMap)
     Info<< "rawTopoChangerFvMesh : Checking for topology changes..."
         << endl;
+
+    // Mesh not moved/changed yet
+    moving(false);
+    topoChanging(false);
+
+    // Do any topology changes. Sets topoChanging (through polyTopoChange)
     autoPtr<mapPolyMesh> topoChangeMap = topoChanger_.changeMesh(true);
 
     bool hasChanged = topoChangeMap.valid();
@@ -170,8 +176,6 @@ bool Foam::rawTopoChangerFvMesh::update()
         //    << " no topology changes..." << endl;
     }
 
-    changing(hasChanged);
-
     return hasChanged;
 }