diff --git a/src/OpenFOAM/db/dictionary/dictionary.C b/src/OpenFOAM/db/dictionary/dictionary.C
index fb6f28af5b89516118eaf0597e46b176122ef1b2..9d022d5111e86400df9d64fa2ef371d0824c87fe 100644
--- a/src/OpenFOAM/db/dictionary/dictionary.C
+++ b/src/OpenFOAM/db/dictionary/dictionary.C
@@ -109,14 +109,21 @@ Foam::dictionary::dictionary()
 {}
 
 
+Foam::dictionary::dictionary(const fileName& name)
+:
+    dictionaryName(name),
+    parent_(dictionary::null)
+{}
+
+
 Foam::dictionary::dictionary
 (
     const dictionary& parentDict,
     const dictionary& dict
 )
 :
+    dictionaryName(parentDict.name() + "::" + dict.name()),
     IDLList<entry>(dict, *this),
-    name_(dict.name()),
     parent_(parentDict)
 {
     forAllIter(IDLList<entry>, *this, iter)
@@ -140,8 +147,8 @@ Foam::dictionary::dictionary
     const dictionary& dict
 )
 :
+    dictionaryName(dict.name()),
     IDLList<entry>(dict, *this),
-    name_(dict.name()),
     parent_(dictionary::null)
 {
     forAllIter(IDLList<entry>, *this, iter)
@@ -183,6 +190,7 @@ Foam::dictionary::dictionary
     parent_(parentDict)
 {
     transfer(dict());
+    name() = parentDict.name() + "::" + name();
 }
 
 
@@ -472,6 +480,24 @@ Foam::dictionary& Foam::dictionary::subDict(const word& keyword)
 }
 
 
+Foam::dictionary Foam::dictionary::subOrEmptyDict
+(
+    const word& keyword
+) const
+{
+    const entry* entryPtr = lookupEntryPtr(keyword, false, true);
+
+    if (entryPtr == NULL)
+    {
+        return dictionary(*this, dictionary(keyword));
+    }
+    else
+    {
+        return entryPtr->dict();
+    }
+}
+
+
 Foam::wordList Foam::dictionary::toc() const
 {
     wordList keys(size());
@@ -530,7 +556,7 @@ bool Foam::dictionary::add(entry* entryPtr, bool mergeEntry)
 
             if (hashedEntries_.insert(entryPtr->keyword(), entryPtr))
             {
-                entryPtr->name() = name_ + "::" + entryPtr->keyword();
+                entryPtr->name() = name() + "::" + entryPtr->keyword();
 
                 if (entryPtr->keyword().isPattern())
                 {
@@ -558,7 +584,7 @@ bool Foam::dictionary::add(entry* entryPtr, bool mergeEntry)
 
     if (hashedEntries_.insert(entryPtr->keyword(), entryPtr))
     {
-        entryPtr->name() = name_ + "::" + entryPtr->keyword();
+        entryPtr->name() = name() + "::" + entryPtr->keyword();
         IDLList<entry>::append(entryPtr);
 
         if (entryPtr->keyword().isPattern())
@@ -763,7 +789,7 @@ bool Foam::dictionary::changeKeyword
 
     // change name and HashTable, but leave DL-List untouched
     iter()->keyword() = newKeyword;
-    iter()->name() = name_ + "::" + newKeyword;
+    iter()->name() = name() + "::" + newKeyword;
     hashedEntries_.erase(oldKeyword);
     hashedEntries_.insert(newKeyword, iter());
 
@@ -838,7 +864,7 @@ void Foam::dictionary::transfer(dictionary& dict)
 {
     // changing parents probably doesn't make much sense,
     // but what about the names?
-    name_ = dict.name_;
+    name() = dict.name();
 
     IDLList<entry>::transfer(dict);
     hashedEntries_.transfer(dict.hashedEntries_);
@@ -871,7 +897,7 @@ void Foam::dictionary::operator=(const dictionary& rhs)
             << abort(FatalError);
     }
 
-    name_ = rhs.name();
+    name() = rhs.name();
     clear();
 
     // Create clones of the entries in the given dictionary
diff --git a/src/OpenFOAM/db/dictionary/dictionary.H b/src/OpenFOAM/db/dictionary/dictionary.H
index 31ac3142378cb5d10013fa0b7e1ac20191dfacf7..bdfb7e4a8f11c79a2f19537eb7d1270e22830796 100644
--- a/src/OpenFOAM/db/dictionary/dictionary.H
+++ b/src/OpenFOAM/db/dictionary/dictionary.H
@@ -41,7 +41,7 @@ Description
 
 ToDo
     A merge() member function with a non-const dictionary parameter.
-    This would avoid unnecessary cloning in the add(entry*,bool) method
+    This would avoid unnecessary cloning in the add(entry*, bool) method.
 
 SourceFiles
     dictionary.C
@@ -74,6 +74,47 @@ class SHA1Digest;
 Istream& operator>>(Istream&, dictionary&);
 Ostream& operator<<(Ostream&, const dictionary&);
 
+/*---------------------------------------------------------------------------*\
+                        Class dictionaryName Declaration
+\*---------------------------------------------------------------------------*/
+
+class dictionaryName
+{
+    // Private data
+
+        fileName name_;
+
+
+public:
+
+    // Constructors
+
+        //- Construct dictionaryName null
+        dictionaryName()
+        {}
+
+        //- Construct dictionaryName as copy of the given fileName
+        dictionaryName(const fileName& name)
+        :
+            name_(name)
+        {}
+
+
+    // Member functions
+
+        //- Return the dictionary name
+        const fileName& name() const
+        {
+            return name_;
+        }
+
+        //- Return the dictionary name
+        fileName& name()
+        {
+            return name_;
+        }
+};
+
 
 /*---------------------------------------------------------------------------*\
                            Class dictionary Declaration
@@ -81,13 +122,11 @@ Ostream& operator<<(Ostream&, const dictionary&);
 
 class dictionary
 :
+    public dictionaryName,
     public IDLList<entry>
 {
     // Private data
 
-        //- Dictionary name
-        fileName name_;
-
         //- HashTable of the entries held on the DL-list for quick lookup
         HashTable<entry*> hashedEntries_;
 
@@ -100,6 +139,7 @@ class dictionary
         //- Patterns as precompiled regular expressions
         DLList<autoPtr<regExp> > patternRegexps_;
 
+
    // Private Member Functions
 
         //- Search patterns table for exact match or regular expression match
@@ -121,16 +161,6 @@ class dictionary
         );
 
 
-public:
-
-        //- Read dictionary from Istream
-        bool read(Istream&);
-
-        //- Substitute the given keyword prepended by '$' with the
-        //  corresponding sub-dictionary entries
-        bool substituteKeyword(const word& keyword);
-
-
 public:
 
     //- Declare friendship with the entry class for IO
@@ -150,10 +180,14 @@ public:
         //- Construct top-level dictionary null
         dictionary();
 
-        //- Construct from the parent dictionary and Istream, reading entries
-        //  until lastEntry or EOF
+        //- Construct top-level empty dictionary with given name
+        dictionary(const fileName& name);
+
+        //- Construct given the entry name, parent dictionary and Istream,
+        //  reading entries until lastEntry or EOF
         dictionary
         (
+            const fileName& name,
             const dictionary& parentDict,
             Istream&
         );
@@ -192,18 +226,6 @@ public:
 
     // Member functions
 
-        //- Return the dictionary name
-        const fileName& name() const
-        {
-            return name_;
-        }
-
-        //- Return the dictionary name
-        fileName& name()
-        {
-            return name_;
-        }
-
         //- Return the parent dictionary
         const dictionary& parent() const
         {
@@ -320,14 +342,23 @@ public:
             //- Find and return a sub-dictionary for manipulation
             dictionary& subDict(const word&);
 
+            //- Find and return a sub-dictionary as a copy, or
+            //  return an empty dictionary if the sub-dictionary does not exist
+            dictionary subOrEmptyDict(const word&) const;
+
             //- Return the table of contents
             wordList toc() const;
 
             //- Return the list of available keys or patterns
             List<keyType> keys(bool patterns=false) const;
 
+
         // Editing
 
+            //- Substitute the given keyword prepended by '$' with the
+            //  corresponding sub-dictionary entries
+            bool substituteKeyword(const word& keyword);
+
             //- Add a new entry
             //  With the merge option, dictionaries are interwoven and
             //  primitive entries are overwritten
@@ -407,6 +438,12 @@ public:
             Xfer<dictionary> xfer();
 
 
+        // Read
+
+            //- Read dictionary from Istream
+            bool read(Istream&);
+
+
         // Write
 
             void write(Ostream&, bool subDict=true) const;
diff --git a/src/OpenFOAM/db/dictionary/dictionaryEntry/dictionaryEntryIO.C b/src/OpenFOAM/db/dictionary/dictionaryEntry/dictionaryEntryIO.C
index 4ed38340530820d2d88a4852c4c1e15e96abbc80..175553e23ae0007323441d6cfd795efe34400e5f 100644
--- a/src/OpenFOAM/db/dictionary/dictionaryEntry/dictionaryEntryIO.C
+++ b/src/OpenFOAM/db/dictionary/dictionaryEntry/dictionaryEntryIO.C
@@ -58,10 +58,8 @@ Foam::dictionaryEntry::dictionaryEntry
 )
 :
     entry(key),
-    dictionary(parentDict, is)
+    dictionary(key, parentDict, is)
 {
-    name() += "::" + key;
-
     is.fatalCheck
     (
         "dictionaryEntry::dictionaryEntry"
diff --git a/src/OpenFOAM/db/dictionary/dictionaryIO.C b/src/OpenFOAM/db/dictionary/dictionaryIO.C
index 96196e3a11ab9a9b8e2913405f54f85f28262302..446aba828db4d353e2606a6eca374834f16abb62 100644
--- a/src/OpenFOAM/db/dictionary/dictionaryIO.C
+++ b/src/OpenFOAM/db/dictionary/dictionaryIO.C
@@ -95,11 +95,12 @@ bool Foam::dictionary::substituteKeyword(const word& keyword)
 
 Foam::dictionary::dictionary
 (
+    const fileName& name,
     const dictionary& parentDict,
     Istream& is
 )
 :
-    name_(is.name()),
+    dictionaryName(parentDict.name() + "::" + name),
     parent_(parentDict)
 {
     read(is);
@@ -108,7 +109,7 @@ Foam::dictionary::dictionary
 
 Foam::dictionary::dictionary(Istream& is)
 :
-    name_(is.name()),
+    dictionaryName(is.name()),
     parent_(dictionary::null)
 {
     // Reset input mode as this is a "top-level" dictionary
@@ -132,6 +133,7 @@ Foam::Istream& Foam::operator>>(Istream& is, dictionary& dict)
     functionEntries::inputModeEntry::clear();
 
     dict.clear();
+    dict.name() = is.name();
     dict.read(is);
 
     return is;
diff --git a/src/OpenFOAM/db/dictionary/entry/entry.H b/src/OpenFOAM/db/dictionary/entry/entry.H
index ddaefe74402a3a04b6ac00e7270a11a1d6c54cb3..2286c4b4ebac1284d25869196c952f9bd39dba8c 100644
--- a/src/OpenFOAM/db/dictionary/entry/entry.H
+++ b/src/OpenFOAM/db/dictionary/entry/entry.H
@@ -108,10 +108,9 @@ public:
         static autoPtr<entry> New(Istream& is);
 
 
-    // Destructor
-
-        virtual ~entry()
-        {}
+    //- Destructor
+    virtual ~entry()
+    {}
 
 
     // Member functions
diff --git a/src/turbulenceModels/compressible/LES/LESModel/LESModel.C b/src/turbulenceModels/compressible/LES/LESModel/LESModel.C
index c32cb077d8a82a5425ec70060bd6dfb371187e32..6ac295dea68c6bcf8ec213714e6fee2f40b45ed1 100644
--- a/src/turbulenceModels/compressible/LES/LESModel/LESModel.C
+++ b/src/turbulenceModels/compressible/LES/LESModel/LESModel.C
@@ -77,7 +77,7 @@ LESModel::LESModel
     ),
 
     printCoeffs_(lookupOrDefault<Switch>("printCoeffs", false)),
-    coeffDict_(subDictPtr(type + "Coeffs")),
+    coeffDict_(subOrEmptyDict(type + "Coeffs")),
 
     k0_("k0", dimVelocity*dimVelocity, SMALL),
 
diff --git a/src/turbulenceModels/compressible/RAS/RASModel/RASModel.C b/src/turbulenceModels/compressible/RAS/RASModel/RASModel.C
index 642fc686d695e583ef83fe4b3ea0bbada5c986c8..ffab28703b52976b621b8dd3506ded787962e2e6 100644
--- a/src/turbulenceModels/compressible/RAS/RASModel/RASModel.C
+++ b/src/turbulenceModels/compressible/RAS/RASModel/RASModel.C
@@ -79,7 +79,7 @@ RASModel::RASModel
 
     turbulence_(lookup("turbulence")),
     printCoeffs_(lookupOrDefault<Switch>("printCoeffs", false)),
-    coeffDict_(subDictPtr(type + "Coeffs")),
+    coeffDict_(subOrEmptyDict(type + "Coeffs")),
 
     k0_("k0", dimVelocity*dimVelocity, SMALL),
     epsilon0_("epsilon", k0_.dimensions()/dimTime, SMALL),
diff --git a/src/turbulenceModels/incompressible/LES/LESModel/LESModel.C b/src/turbulenceModels/incompressible/LES/LESModel/LESModel.C
index 76c2ef0ba475c0ba25be0728c787087a2bff2db4..fd7791d9f322cfae4c5ba3bd81335d714fe00903 100644
--- a/src/turbulenceModels/incompressible/LES/LESModel/LESModel.C
+++ b/src/turbulenceModels/incompressible/LES/LESModel/LESModel.C
@@ -76,7 +76,7 @@ LESModel::LESModel
     ),
 
     printCoeffs_(lookupOrDefault<Switch>("printCoeffs", false)),
-    coeffDict_(subDictPtr(type + "Coeffs")),
+    coeffDict_(subOrEmptyDict(type + "Coeffs")),
 
     k0_("k0", dimVelocity*dimVelocity, SMALL),
     delta_(LESdelta::New("delta", U.mesh(), *this))
diff --git a/src/turbulenceModels/incompressible/RAS/RASModel/RASModel.C b/src/turbulenceModels/incompressible/RAS/RASModel/RASModel.C
index 9a6a447166bac7a3616a7092fc9ccf28b197afd8..1803075428c9e1ac2a8b9b0317fe9f9ef6f49b79 100644
--- a/src/turbulenceModels/incompressible/RAS/RASModel/RASModel.C
+++ b/src/turbulenceModels/incompressible/RAS/RASModel/RASModel.C
@@ -78,7 +78,7 @@ RASModel::RASModel
 
     turbulence_(lookup("turbulence")),
     printCoeffs_(lookupOrDefault<Switch>("printCoeffs", false)),
-    coeffDict_(subDictPtr(type + "Coeffs")),
+    coeffDict_(subOrEmptyDict(type + "Coeffs")),
 
     k0_("k0", dimVelocity*dimVelocity, SMALL),
     epsilon0_("epsilon", k0_.dimensions()/dimTime, SMALL),