diff --git a/src/OpenFOAM/Make/files b/src/OpenFOAM/Make/files
index 4d2062b421ce99be31940ed4632f827bf6f89803..0e1224505b25afbc3bd5038e34a6f66942da6a24 100644
--- a/src/OpenFOAM/Make/files
+++ b/src/OpenFOAM/Make/files
@@ -73,6 +73,8 @@ primitives/functions/DataEntry/polynomial/polynomialIO.C
 
 primitives/functions/Polynomial/polynomialFunction.C
 
+primitives/subModelBase/subModelBase.C
+
 strings = primitives/strings
 $(strings)/string/string.C
 $(strings)/string/stringIO.C
diff --git a/src/OpenFOAM/primitives/subModelBase/subModelBase.C b/src/OpenFOAM/primitives/subModelBase/subModelBase.C
new file mode 100644
index 0000000000000000000000000000000000000000..41b8af6a29e5f02d070f77316206d2b417ba6393
--- /dev/null
+++ b/src/OpenFOAM/primitives/subModelBase/subModelBase.C
@@ -0,0 +1,180 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2013 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 "subModelBase.H"
+
+// * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * * //
+
+bool Foam::subModelBase::subModelBase::inLine() const
+{
+    return (modelName_ != word::null);
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::subModelBase::subModelBase(dictionary& properties)
+:
+    modelName_(word::null),
+    properties_(properties),
+    dict_(dictionary::null),
+    baseName_(word::null),
+    modelType_(word::null),
+    coeffDict_(dictionary::null)
+{}
+
+
+Foam::subModelBase::subModelBase
+(
+    dictionary& properties,
+    const dictionary& dict,
+    const word& baseName,
+    const word& modelType,
+    const word& dictExt
+)
+:
+    modelName_(word::null),
+    properties_(properties),
+    dict_(dict),
+    baseName_(baseName),
+    modelType_(modelType),
+    coeffDict_(dict.subDict(modelType + dictExt))
+{}
+
+
+Foam::subModelBase::subModelBase
+(
+    const word& modelName,
+    dictionary& properties,
+    const dictionary& dict,
+    const word& baseName,
+    const word& modelType
+)
+:
+    modelName_(modelName),
+    properties_(properties),
+    dict_(dict),
+    baseName_(baseName),
+    modelType_(modelType),
+    coeffDict_(dict)
+{}
+
+
+Foam::subModelBase::subModelBase(const subModelBase& smb)
+:
+    modelName_(smb.modelName_),
+    properties_(smb.properties_),
+    dict_(smb.dict_),
+    baseName_(smb.baseName_),
+    modelType_(smb.modelType_),
+    coeffDict_(smb.coeffDict_)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::subModelBase::~subModelBase()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+const Foam::word& Foam::subModelBase::modelName() const
+{
+    return modelName_;
+}
+
+
+const Foam::dictionary& Foam::subModelBase::dict() const
+{
+    return dict_;
+}
+
+
+const Foam::word& Foam::subModelBase::baseName() const
+{
+    return baseName_;
+}
+
+
+const Foam::word& Foam::subModelBase::modelType() const
+{
+    return modelType_;
+}
+
+
+const Foam::dictionary& Foam::subModelBase::coeffDict() const
+{
+    return coeffDict_;
+}
+
+
+const Foam::dictionary& Foam::subModelBase::properties() const
+{
+    return properties_;
+}
+
+
+bool Foam::subModelBase::defaultCoeffs(const bool printMsg) const
+{
+    bool def = coeffDict_.lookupOrDefault<bool>("defaultCoeffs", false);
+    if (printMsg && def)
+    {
+        Info<< incrIndent;
+        Info<< indent << "Employing default coefficients" << endl;
+        Info<< decrIndent;
+    }
+
+    return def;
+}
+
+
+bool Foam::subModelBase::active() const
+{
+    return true;
+}
+
+
+void Foam::subModelBase::cacheFields(const bool)
+{
+    // do nothing
+}
+
+
+bool Foam::subModelBase::outputTime() const
+{
+    return active();
+}
+
+
+void Foam::subModelBase::write(Ostream& os) const
+{
+    // not writing complete cloud dictionary, only coeffs
+//    os  << dict_;
+    os  << coeffDict_;
+}
+
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/primitives/subModelBase/subModelBase.H b/src/OpenFOAM/primitives/subModelBase/subModelBase.H
new file mode 100644
index 0000000000000000000000000000000000000000..a6fbc65615aeda0cc89077a2d32c241fb59c9c88
--- /dev/null
+++ b/src/OpenFOAM/primitives/subModelBase/subModelBase.H
@@ -0,0 +1,222 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2013 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/>.
+
+Class
+    Foam::subModelBase
+
+Description
+    Base class for generic sub-models requiring to be read from dictionary.
+    Provides a mechanism to read and write properties from a dictionary to
+    enable clean re-starts.  Used by, e.g. clou dsub-models.
+
+SourceFiles
+    subModelBase.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef subModelBase_H
+#define subModelBase_H
+
+#include "dictionary.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+
+/*---------------------------------------------------------------------------*\
+                        Class subModelBase Declaration
+\*---------------------------------------------------------------------------*/
+
+class subModelBase
+{
+private:
+
+    // Private Member Functions
+
+        //- Disallow default bitwise assignment
+        void operator=(const subModelBase&);
+
+
+protected:
+
+    // Protected Data
+
+        //- Name of the sub-model
+        const word modelName_;
+
+        //- Reference to properties dictionary e.g. for restart
+        dictionary& properties_;
+
+        //- Copy of dictionary used during construction
+        const dictionary dict_;
+
+        //- Name of the sub-model base class
+        const word baseName_;
+
+        //- Type of the sub-model
+        const word modelType_;
+
+        //- Coefficients dictionary
+        const dictionary coeffDict_;
+
+
+    // Protected Member Functions
+
+        //- Flag to indicate whether data is/was read in-line
+        bool inLine() const;
+
+
+public:
+
+    // Constructors
+
+        //- Construct null
+        subModelBase(dictionary& properties);
+
+        //- Construct from components without name
+        subModelBase
+        (
+            dictionary& properties,
+            const dictionary& dict,
+            const word& baseName,
+            const word& modelType,
+            const word& dictExt = "Coeffs"
+        );
+
+        //- Construct from components with name
+        subModelBase
+        (
+            const word& modelName,
+            dictionary& properties,
+            const dictionary& dict,
+            const word& baseName,
+            const word& modelType
+        );
+
+        //- Construct as copy
+        subModelBase(const subModelBase& smb);
+
+
+    //- Destructor
+    virtual ~subModelBase();
+
+
+    // Member Functions
+
+        // Access
+
+            //- Return const access to the name of the sub-model
+            const word& modelName() const;
+
+            //- Return const access to the cloud dictionary
+            const dictionary& dict() const;
+
+            //- Return const access to the base name of the sub-model
+            const word& baseName() const;
+
+            //- Return const access to the sub-model type
+            const word& modelType() const;
+
+            //- Return const access to the coefficients dictionary
+            const dictionary& coeffDict() const;
+
+            //- Return const access to the properties dictionary
+            const dictionary& properties() const;
+
+            //- Returns true if defaultCoeffs is true and outputs on printMsg
+            virtual bool defaultCoeffs(const bool printMsg) const;
+
+            //- Return the model 'active' status - default active = true
+            virtual bool active() const;
+
+            //- Cache dependant sub-model fields
+            virtual void cacheFields(const bool store);
+
+            //- Flag to indicate when to write a property
+            virtual bool outputTime() const;
+
+
+        // Edit
+
+            // Base properties
+
+                //- Retrieve generic property from the base model
+                template<class Type>
+                Type getBaseProperty
+                (
+                    const word& entryName,
+                    const Type& defaultValue = pTraits<Type>::zero
+                ) const;
+
+                //- Retrieve generic property from the base model
+                template<class Type>
+                void getBaseProperty(const word& entryName, Type& value) const;
+
+                //- Add generic property to the base model
+                template<class Type>
+                void setBaseProperty(const word& entryName, const Type& value);
+
+
+            // Model properties
+
+                //- Retrieve generic property from the sub-model
+                template<class Type>
+                Type getModelProperty
+                (
+                    const word& entryName,
+                    const Type& defaultValue = pTraits<Type>::zero
+                ) const;
+
+                //- Retrieve generic property from the sub-model
+                template<class Type>
+                void getModelProperty(const word& entryName, Type& value) const;
+
+                //- Add generic property to the sub-model
+                template<class Type>
+                void setModelProperty(const word& entryName, const Type& value);
+
+
+        // I-O
+
+            //- Write
+            virtual void write(Ostream& os) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#   include "subModelBaseTemplates.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/primitives/subModelBase/subModelBaseTemplates.C b/src/OpenFOAM/primitives/subModelBase/subModelBaseTemplates.C
new file mode 100644
index 0000000000000000000000000000000000000000..df881986e8e89a8fc5355c41afff10e17f0271a4
--- /dev/null
+++ b/src/OpenFOAM/primitives/subModelBase/subModelBaseTemplates.C
@@ -0,0 +1,194 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2013 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/>.
+
+\*---------------------------------------------------------------------------*/
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class Type>
+Type Foam::subModelBase::getBaseProperty
+(
+    const word& entryName,
+    const Type& defaultValue
+) const
+{
+    Type result = defaultValue;
+
+    if (properties_.found(baseName_))
+    {
+        const dictionary& baseDict = properties_.subDict(baseName_);
+        baseDict.readIfPresent(entryName, result);
+    }
+
+    return result;
+}
+
+
+template<class Type>
+void Foam::subModelBase::getBaseProperty
+(
+    const word& entryName,
+    Type& value
+) const
+{
+    if (properties_.found(baseName_))
+    {
+        const dictionary& baseDict = properties_.subDict(baseName_);
+        baseDict.readIfPresent(entryName, value);
+    }
+}
+
+
+template<class Type>
+void Foam::subModelBase::setBaseProperty
+(
+    const word& entryName,
+    const Type& value
+)
+{
+    if (properties_.found(baseName_))
+    {
+        dictionary& baseDict = properties_.subDict(baseName_);
+        baseDict.add(entryName, value, true);
+    }
+    else
+    {
+        properties_.add(baseName_, dictionary());
+        properties_.subDict(baseName_).add(entryName, value);
+    }
+}
+
+
+template<class Type>
+Type Foam::subModelBase::getModelProperty
+(
+    const word& entryName,
+    const Type& defaultValue
+) const
+{
+    Type result = defaultValue;
+
+    if (properties_.found(baseName_))
+    {
+        const dictionary& baseDict = properties_.subDict(baseName_);
+
+        if (inLine() && baseDict.found(modelName_))
+        {
+            baseDict.subDict(modelName_).readIfPresent(entryName, result);
+        }
+        else if (baseDict.found(modelType_))
+        {
+            baseDict.subDict(modelType_).readIfPresent(entryName, result);
+        }
+    }
+
+    return result;
+}
+
+
+template<class Type>
+void Foam::subModelBase::getModelProperty
+(
+    const word& entryName,
+    Type& value
+) const
+{
+    if (properties_.found(baseName_))
+    {
+        const dictionary& baseDict = properties_.subDict(baseName_);
+
+        if (inLine() && baseDict.found(modelName_))
+        {
+            baseDict.subDict(modelName_).readIfPresent(entryName, value);
+        }
+        else if (baseDict.found(modelType_))
+        {
+            baseDict.subDict(modelType_).readIfPresent(entryName, value);
+        }
+    }
+}
+
+
+template<class Type>
+void Foam::subModelBase::setModelProperty
+(
+    const word& entryName,
+    const Type& value
+)
+{
+    if (properties_.found(baseName_))
+    {
+        dictionary& baseDict = properties_.subDict(baseName_);
+
+        if (inLine())
+        {
+            if (baseDict.found(modelName_))
+            {
+                baseDict.subDict(modelName_).add(entryName, value, true);
+            }
+            else
+            {
+                baseDict.add(modelName_, dictionary());
+                baseDict.subDict(modelName_).add(entryName, value, true);
+            }
+        }
+        else
+        {
+            if (baseDict.found(modelType_))
+            {
+                baseDict.subDict(modelType_).add(entryName, value, true);
+            }
+            else
+            {
+                baseDict.add(modelType_, dictionary());
+                baseDict.subDict(modelType_).add(entryName, value, true);
+            }
+        }
+    }
+    else
+    {
+        properties_.add(baseName_, dictionary());
+
+        if (inLine())
+        {
+            properties_.subDict(baseName_).add(modelName_, dictionary());
+            properties_.subDict(baseName_).subDict(modelName_).add
+            (
+                entryName,
+                value
+            );
+        }
+        else
+        {
+            properties_.subDict(baseName_).add(modelType_, dictionary());
+            properties_.subDict(baseName_).subDict(modelType_).add
+            (
+                entryName,
+                value
+            );
+        }
+    }
+}
+
+
+// ************************************************************************* //