diff --git a/src/OpenFOAM/dimensionSet/dimensionSets.C b/src/OpenFOAM/dimensionSet/dimensionSets.C
index 10b424a57634266f82ff37fb0fbf83579f0db7aa..1e2b254da1df6c85f34357953756867be4963c69 100644
--- a/src/OpenFOAM/dimensionSet/dimensionSets.C
+++ b/src/OpenFOAM/dimensionSet/dimensionSets.C
@@ -38,32 +38,13 @@ namespace Foam
 //- Since dimensionSystems() can be reread we actually store a copy of
 //  the controlDict subDict (v.s. a reference to the subDict for e.g.
 //  dimensionedConstants)
-autoPtr<dictionary> dimensionSystemsPtr_(NULL);
-
-dictionary& dimensionSystems()
-{
-    if (!dimensionSystemsPtr_.valid())
-    {
-        dictionary* cachedPtr = NULL;
-        dimensionSystemsPtr_.reset
-        (
-            new dictionary
-            (
-                debug::switchSet
-                (
-                    "DimensionSets",
-                    cachedPtr
-                )
-            )
-        );
-    }
-    return dimensionSystemsPtr_();
-}
-
-
-autoPtr<HashTable<dimensionedScalar> > unitSetPtr_;
-autoPtr<dimensionSets> writeUnitSetPtr_;
+dictionary* dimensionSystemsPtr_(NULL);
+HashTable<dimensionedScalar>* unitSetPtr_(NULL);
+dimensionSets* writeUnitSetPtr_(NULL);
 
+//- Helper class to
+//  - register re-reader
+//  - deallocate demand-driven data
 class addDimensionSetsToDebug
 :
     public ::Foam::simpleRegIOobject
@@ -74,12 +55,18 @@ public:
         ::Foam::simpleRegIOobject(Foam::debug::addDimensionSetObject, name)
     {}
     virtual ~addDimensionSetsToDebug()
-    {}
+    {
+        deleteDemandDrivenData(dimensionSystemsPtr_);
+        deleteDemandDrivenData(unitSetPtr_);
+        deleteDemandDrivenData(writeUnitSetPtr_);
+
+    }
     virtual void readData(Foam::Istream& is)
     {
-        unitSetPtr_.clear();
-        writeUnitSetPtr_.clear();
-        dimensionSystemsPtr_.reset(new dictionary(is));
+        deleteDemandDrivenData(dimensionSystemsPtr_);
+        deleteDemandDrivenData(unitSetPtr_);
+        deleteDemandDrivenData(writeUnitSetPtr_);
+        dimensionSystemsPtr_ = new dictionary(is);
     }
     virtual void writeData(Foam::Ostream& os) const
     {
@@ -89,10 +76,27 @@ public:
 addDimensionSetsToDebug addDimensionSetsToDebug_("DimensionSets");
 
 
+dictionary& dimensionSystems()
+{
+    if (!dimensionSystemsPtr_)
+    {
+        dictionary* cachedPtr = NULL;
+        dimensionSystemsPtr_ = new dictionary
+        (
+            debug::switchSet
+            (
+                "DimensionSets",
+                cachedPtr
+            )
+        );
+    }
+    return *dimensionSystemsPtr_;
+}
+
 
 const HashTable<dimensionedScalar>& unitSet()
 {
-    if (!unitSetPtr_.valid())
+    if (!unitSetPtr_)
     {
         const dictionary& dict = dimensionSystems();
 
@@ -114,10 +118,7 @@ const HashTable<dimensionedScalar>& unitSet()
 
         const dictionary& unitDict = dict.subDict(unitSetCoeffs);
 
-        unitSetPtr_.reset
-        (
-            new HashTable<dimensionedScalar>(unitDict.size())
-        );
+        unitSetPtr_ = new HashTable<dimensionedScalar>(unitDict.size());
 
         forAllConstIter(dictionary, unitDict, iter)
         {
@@ -145,14 +146,7 @@ const HashTable<dimensionedScalar>& unitSet()
             )
         );
 
-        writeUnitSetPtr_.reset
-        (
-            new dimensionSets
-            (
-                unitSetPtr_(),
-                writeUnitNames
-            )
-        );
+        writeUnitSetPtr_ = new dimensionSets(*unitSetPtr_, writeUnitNames);
 
         if (writeUnitNames.size() != 0 && writeUnitNames.size() != 7)
         {
@@ -162,17 +156,17 @@ const HashTable<dimensionedScalar>& unitSet()
                 << exit(FatalIOError);
         }
     }
-    return unitSetPtr_();
+    return *unitSetPtr_;
 }
 
 
 const dimensionSets& writeUnitSet()
 {
-    if (!writeUnitSetPtr_.valid())
+    if (!writeUnitSetPtr_)
     {
         (void)unitSet();
     }
-    return writeUnitSetPtr_();
+    return *writeUnitSetPtr_;
 }