diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
index eb623df2f2e121e1f21936ec017ebee0c60b70ba..aa0c8cedfe5c8e3e04b0543707940f10a231b474 100644
--- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
+++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
@@ -293,7 +293,11 @@ Foam::KinematicCloud<ParcelType>::KinematicCloud
     (
         particleProperties_.lookup("cellValueSourceCorrection")
     ),
-    rndGen_(label(0)),
+    rndGen_
+    (
+        label(0),
+        readLabel(particleProperties_.lookup("randomSampleSize"))
+    ),
     cellOccupancyPtr_(),
     rho_(rho),
     U_(U),
diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H
index f2b489a8c7eba050c7380e5cf96515b63f388b1a..4e95184bece1c8b08576ac00f01a1910badd6f78 100644
--- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H
+++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H
@@ -49,7 +49,7 @@ SourceFiles
 #include "kinematicCloud.H"
 #include "IOdictionary.H"
 #include "autoPtr.H"
-#include "Random.H"
+#include "cachedRandom.H"
 #include "fvMesh.H"
 #include "volFields.H"
 #include "fvMatrices.H"
@@ -206,7 +206,7 @@ protected:
         const Switch cellValueSourceCorrection_;
 
         //- Random number generator - used by some injection routines
-        Random rndGen_;
+        cachedRandom rndGen_;
 
         //- Cell occupancy information for each parcel, (demand driven)
         autoPtr<List<DynamicList<ParcelType*> > > cellOccupancyPtr_;
@@ -358,7 +358,7 @@ public:
             // Cloud data
 
                 //- Return refernce to the random object
-                inline Random& rndGen();
+                inline cachedRandom& rndGen();
 
                 //- Return the cell occupancy information for each
                 //  parcel, non-const access, the caller is
diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H
index d3078fbb1b7b109f6b59e2e2a90bf44d8cf693c6..96cd40ef7e0cc1c01e8bb9c73752052a073b42d9 100644
--- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H
+++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H
@@ -334,7 +334,7 @@ rotationalKineticEnergyOfSystem() const
 
 
 template<class ParcelType>
-inline Foam::Random& Foam::KinematicCloud<ParcelType>::rndGen()
+inline Foam::cachedRandom& Foam::KinematicCloud<ParcelType>::rndGen()
 {
     return rndGen_;
 }
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModel.C b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModel.C
index 5f22f047508c1e411408b97d005a76fed8c0b705..27eee149b8f1565e9a4f8cc631e664f832ce5e03 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModel.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModel.C
@@ -30,9 +30,7 @@ License
 template<class CloudType>
 Foam::CollisionModel<CloudType>::CollisionModel(CloudType& owner)
 :
-    dict_(dictionary::null),
-    owner_(owner),
-    coeffDict_(dictionary::null)
+    SubModelBase<CloudType>(owner)
 {}
 
 
@@ -44,9 +42,14 @@ Foam::CollisionModel<CloudType>::CollisionModel
     const word& type
 )
 :
-    dict_(dict),
-    owner_(owner),
-    coeffDict_(dict.subDict(type + "Coeffs"))
+    SubModelBase<CloudType>(owner, dict, type)
+{}
+
+
+template<class CloudType>
+Foam::CollisionModel<CloudType>::CollisionModel(CollisionModel<CloudType>& cm)
+:
+    SubModelBase<CloudType>(cm)
 {}
 
 
@@ -57,6 +60,36 @@ Foam::CollisionModel<CloudType>::~CollisionModel()
 {}
 
 
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class CloudType>
+Foam::label Foam::CollisionModel<CloudType>::nSubCycles() const
+{
+    notImplemented
+    (
+        "Foam::label Foam::CollisionModel<CloudType>::nSubCycles() const"
+    );
+    return 0;
+}
+
+
+template<class CloudType>
+bool Foam::CollisionModel<CloudType>::controlsWallInteraction() const
+{
+    notImplemented
+    (
+        "bool Foam::CollisionModel<CloudType>::controlsWallInteraction()"
+    );
+    return false;
+}
+
+template<class CloudType>
+void Foam::CollisionModel<CloudType>::collide()
+{
+    notImplemented("void Foam::CollisionModel<CloudType>::collide()");
+}
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 #include "CollisionModelNew.C"
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModel.H b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModel.H
index 4ff1cc0000775122602b841df7735aaf06d78a20..baef80996f5ed0f99c98a3519a1a34c60ffe755f 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModel.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModel.H
@@ -51,21 +51,9 @@ namespace Foam
 
 template<class CloudType>
 class CollisionModel
+:
+    public SubModelBase<CloudType>
 {
-    // Private data
-
-        //- The cloud dictionary
-        const dictionary& dict_;
-
-        //- Reference to the owner cloud class
-        CloudType& owner_;
-
-        //- The coefficients dictionary
-        const dictionary coeffDict_;
-
-
-protected:
-
     // Protected data
 
         //- Convenience typedef for parcel type
@@ -96,7 +84,7 @@ public:
         //- Construct null from owner
         CollisionModel(CloudType& owner);
 
-        //- Construct from dictionary
+        //- Construct from components
         CollisionModel
         (
             const dictionary& dict,
@@ -104,6 +92,18 @@ public:
             const word& type
         );
 
+        //- Construct copy
+        CollisionModel(CollisionModel<CloudType>& cm);
+
+        //- Construct and return a clone
+        virtual autoPtr<CollisionModel<CloudType> > clone()
+        {
+            return autoPtr<CollisionModel<CloudType> >
+            (
+                new CollisionModel<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~CollisionModel();
@@ -117,36 +117,18 @@ public:
     );
 
 
-    // Access
-
-        //- Return the owner cloud dictionary
-        inline const dictionary& dict() const;
-
-        //- Return const access the owner cloud object
-        inline const CloudType& owner() const;
-
-        //- Return non-const access the owner cloud object for manipulation
-        inline CloudType& owner();
-
-        //- Return the coefficients dictionary
-        inline const dictionary& coeffDict() const;
-
-
     // Member Functions
 
         //- Return the number of times to subcycle the current
         //  timestep to meet the criteria of the collision model
-        virtual label nSubCycles() const = 0;
-
-        //- Flag to indicate whether model activates injection model
-        virtual bool active() const = 0;
+        virtual label nSubCycles() const;
 
         //- Indicates whether model determines wall collisions or not,
         //  used to determine what value to use for wallImpactDistance
-        virtual bool controlsWallInteraction() const = 0;
+        virtual bool controlsWallInteraction() const;
 
         // Collision function
-        virtual void collide() = 0;
+        virtual void collide();
 };
 
 
@@ -172,10 +154,6 @@ public:
             add##SS##CloudType##ParcelType##ConstructorToTable_;
 
 
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-#include "CollisionModelI.H"
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 #ifdef NoRepository
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModelI.H b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModelI.H
deleted file mode 100644
index 009d1e20c81fb1f11cada574444f3487b62fe8f7..0000000000000000000000000000000000000000
--- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModelI.H
+++ /dev/null
@@ -1,56 +0,0 @@
-/*---------------------------------------------------------------------------*\
-  =========                 |
-  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-   \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2009-2010 OpenCFD Ltd.
-     \\/     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 "CollisionModel.H"
-
-template<class CloudType>
-const Foam::dictionary& Foam::CollisionModel<CloudType>::dict() const
-{
-    return dict_;
-}
-
-
-template<class CloudType>
-const CloudType& Foam::CollisionModel<CloudType>::owner() const
-{
-    return owner_;
-}
-
-
-template<class CloudType>
-CloudType& Foam::CollisionModel<CloudType>::owner()
-{
-    return owner_;
-}
-
-
-template<class CloudType>
-const Foam::dictionary& Foam::CollisionModel<CloudType>::coeffDict() const
-{
-    return coeffDict_;
-}
-
-
-// ************************************************************************* //
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModelNew.C b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModelNew.C
index 3f06cfbe4eab58b4eb1db1a52a9e1d160e840a55..78f07c01084940d769cfb2a2d8d332a755d361df 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModelNew.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModelNew.C
@@ -35,12 +35,12 @@ Foam::CollisionModel<CloudType>::New
     CloudType& owner
 )
 {
-    word CollisionModelType(dict.lookup("CollisionModel"));
+    word modelType(dict.lookup("CollisionModel"));
 
-    Info<< "Selecting CollisionModel " << CollisionModelType << endl;
+    Info<< "Selecting CollisionModel " << modelType << endl;
 
     typename dictionaryConstructorTable::iterator cstrIter =
-        dictionaryConstructorTablePtr_->find(CollisionModelType);
+        dictionaryConstructorTablePtr_->find(modelType);
 
     if (cstrIter == dictionaryConstructorTablePtr_->end())
     {
@@ -51,8 +51,7 @@ Foam::CollisionModel<CloudType>::New
                 "const dictionary&, "
                 "CloudType&"
             ")"
-        )   << "Unknown CollisionModelType type "
-            << CollisionModelType
+        )   << "Unknown CollisionModelType type " << modelType
             << ", constructor not in hash table" << nl << nl
             << "    Valid CollisionModel types are:" << nl
             << dictionaryConstructorTablePtr_->sortedToc() << exit(FatalError);
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/NoCollision/NoCollision.C b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/NoCollision/NoCollision.C
index 993fe53b7041abab78c8238ea2e013123dfa5bc1..4078423c5be1997b2bef8af29ca5026c76067a25 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/NoCollision/NoCollision.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/NoCollision/NoCollision.C
@@ -38,6 +38,16 @@ Foam::NoCollision<CloudType>::NoCollision
 {}
 
 
+template<class CloudType>
+Foam::NoCollision<CloudType>::NoCollision
+(
+    NoCollision<CloudType>& cm
+)
+:
+    CollisionModel<CloudType>(cm)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/NoCollision/NoCollision.H b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/NoCollision/NoCollision.H
index e0c0ffbc6b5b9400fd4f87aae33804fd47484102..4cd294cf9ea21ff264d766181daad6fadd6faa6d 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/NoCollision/NoCollision.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/NoCollision/NoCollision.H
@@ -60,12 +60,20 @@ public:
 
     // Constructors
 
-        //- Construct from dictionary
-        NoCollision
-        (
-            const dictionary& dict,
-            CloudType& owner
-        );
+        //- Construct from components
+        NoCollision(const dictionary& dict, CloudType& owner);
+
+        //- Construct copy
+        NoCollision(NoCollision<CloudType>& cm);
+
+        //- Construct and return a clone
+        virtual autoPtr<CollisionModel<CloudType> > clone()
+        {
+            return autoPtr<CollisionModel<CloudType> >
+            (
+                new NoCollision<CloudType>(*this)
+            );
+        }
 
 
     //- Destructor
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairCollision.C b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairCollision.C
index 0657ea96a9d5e9bfb56a26a7553531f17d26f549..fc78488bf845df4b2318aaeee3a339bbe5dbe9c5 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairCollision.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairCollision.C
@@ -564,6 +564,24 @@ Foam::PairCollision<CloudType>::PairCollision
 {}
 
 
+template<class CloudType>
+Foam::PairCollision<CloudType>::PairCollision(PairCollision<CloudType>& cm)
+:
+    CollisionModel<CloudType>(cm),
+    pairModel_(NULL),
+    wallModel_(NULL),
+    il_(cm.owner().mesh())
+{
+    notImplemented
+    (
+        "Foam::PairCollision<CloudType>::PairCollision"
+        "("
+            "PairCollision<CloudType>& cm"
+        ")"
+    );
+}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
@@ -602,13 +620,6 @@ Foam::label Foam::PairCollision<CloudType>::nSubCycles() const
 }
 
 
-template<class CloudType>
-bool Foam::PairCollision<CloudType>::active() const
-{
-    return true;
-}
-
-
 template<class CloudType>
 bool Foam::PairCollision<CloudType>::controlsWallInteraction() const
 {
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairCollision.H b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairCollision.H
index 6ad4130e1c783ae53f00d9c1617504bef1aa9497..4c1e660c772c970d2d3046b97fbc2c8c67a5fe31 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairCollision.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairCollision.H
@@ -147,12 +147,20 @@ public:
 
     // Constructors
 
-        //- Construct from dictionary
-        PairCollision
-        (
-            const dictionary& dict,
-            CloudType& owner
-        );
+        //- Construct from components
+        PairCollision(const dictionary& dict, CloudType& owner);
+
+        //- Construct copy
+        PairCollision(PairCollision<CloudType>& cm);
+
+        //- Construct and return a clone
+        virtual autoPtr<CollisionModel<CloudType> > clone()
+        {
+            return autoPtr<CollisionModel<CloudType> >
+            (
+                new PairCollision<CloudType>(*this)
+            );
+        }
 
 
     //- Destructor
@@ -165,9 +173,6 @@ public:
         //  timestep to meet the criteria of the collision model.
         virtual label nSubCycles() const;
 
-        //- Flag to indicate whether model activates injection model
-        virtual bool active() const;
-
         //- Indicates whether model determines wall collisions or not,
         //  used to determine what value to use for wallImpactDistance
         virtual bool controlsWallInteraction() const;
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionModel/DispersionModel.C b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionModel/DispersionModel.C
index 650fd4881b0d4161bc53fe2f54494901f6d5a2dc..d2d49d7c1c9675139a8a1f32faf98beaa2648859 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionModel/DispersionModel.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionModel/DispersionModel.C
@@ -30,8 +30,7 @@ License
 template<class CloudType>
 Foam::DispersionModel<CloudType>::DispersionModel(CloudType& owner)
 :
-    dict_(dictionary::null),
-    owner_(owner)
+    SubModelBase<CloudType>(owner)
 {}
 
 
@@ -39,41 +38,58 @@ template<class CloudType>
 Foam::DispersionModel<CloudType>::DispersionModel
 (
     const dictionary& dict,
-    CloudType& owner
+    CloudType& owner,
+    const word& type
 )
 :
-    dict_(dict),
-    owner_(owner)
+    SubModelBase<CloudType>(dict, owner, type)
 {}
 
 
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
-
 template<class CloudType>
-Foam::DispersionModel<CloudType>::~DispersionModel()
+Foam::DispersionModel<CloudType>::DispersionModel
+(
+    DispersionModel<CloudType>& dm
+)
+:
+    SubModelBase<CloudType>(dm)
 {}
 
 
-// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
-const CloudType& Foam::DispersionModel<CloudType>::owner() const
-{
-    return owner_;
-}
-
+Foam::DispersionModel<CloudType>::~DispersionModel()
+{}
 
-template<class CloudType>
-CloudType& Foam::DispersionModel<CloudType>::owner()
-{
-    return owner_;
-}
 
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class CloudType>
-const Foam::dictionary& Foam::DispersionModel<CloudType>::dict() const
+Foam::vector Foam::DispersionModel<CloudType>::update
+(
+    const scalar,
+    const label,
+    const vector&,
+    const vector& Uc,
+    vector&,
+    scalar&
+)
 {
-    return dict_;
+    notImplemented
+    (
+        "Foam::vector Foam::DispersionModel<CloudType>::update"
+        "("
+            "const scalar, "
+            "const label, "
+            "const vector&, "
+            "const vector&, "
+            "vector&, "
+            "scalar&"
+        ")"
+    );
+
+    return Uc;
 }
 
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionModel/DispersionModel.H b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionModel/DispersionModel.H
index afb063d0f5cd8fe717f4c692dfb196594b9e85ef..90c64f3042921736198bf9b04f1adc2762b9fa52 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionModel/DispersionModel.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionModel/DispersionModel.H
@@ -34,6 +34,7 @@ Description
 #include "IOdictionary.H"
 #include "autoPtr.H"
 #include "runTimeSelectionTables.H"
+#include "SubModelBase.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -46,17 +47,9 @@ namespace Foam
 
 template<class CloudType>
 class DispersionModel
+:
+    public SubModelBase<CloudType>
 {
-
-    // Private data
-
-        //- Cloud dictionary
-        const dictionary& dict_;
-
-        //- Reference to the owner cloud class
-        CloudType& owner_;
-
-
 public:
 
     //- Runtime type information
@@ -90,6 +83,26 @@ public:
             CloudType& owner
         );
 
+        //- Construct from components
+        DispersionModel
+        (
+            const dictionary& dict,
+            CloudType& owner,
+            const word& type
+        );
+
+        //- Construct copy
+        DispersionModel(DispersionModel<CloudType>& dm);
+
+        //- Construct and return a clone
+        virtual autoPtr<DispersionModel<CloudType> > clone()
+        {
+            return autoPtr<DispersionModel<CloudType> >
+            (
+                new DispersionModel<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~DispersionModel();
@@ -103,26 +116,8 @@ public:
     );
 
 
-    // Access
-
-        //- Return the owner cloud object
-        const CloudType& owner() const;
-
-        //- Return the owner cloud object
-        CloudType& owner();
-
-        //- Return the dictionary
-        const dictionary& dict() const;
-
-
     // Member Functions
 
-        //- Flag to indicate whether model activates injection model
-        virtual bool active() const = 0;
-
-        //- Cache carrier fields
-        virtual void cacheFields(const bool store) = 0;
-
         //- Update (disperse particles)
         virtual vector update
         (
@@ -132,7 +127,7 @@ public:
             const vector& Uc,
             vector& UTurb,
             scalar& tTurb
-        ) = 0;
+        );
 };
 
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionRASModel/DispersionRASModel.C b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionRASModel/DispersionRASModel.C
index 6cc31f406e91a5b06a228b7e0187ae9b0fef7f92..250074a975b9fe8d024d38dbe913942bdd7bd143 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionRASModel/DispersionRASModel.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionRASModel/DispersionRASModel.C
@@ -24,17 +24,18 @@ License
 \*---------------------------------------------------------------------------*/
 
 #include "DispersionRASModel.H"
+#include "demandDrivenData.H"
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
 template<class CloudType>
 Foam::DispersionRASModel<CloudType>::DispersionRASModel
 (
-    const dictionary& dict,
+    const dictionary&,
     CloudType& owner
 )
 :
-    DispersionModel<CloudType>(dict, owner),
+    DispersionModel<CloudType>(owner),
     turbulence_
     (
         owner.mesh().objectRegistry::lookupObject<compressible::RASModel>
@@ -49,6 +50,24 @@ Foam::DispersionRASModel<CloudType>::DispersionRASModel
 {}
 
 
+template<class CloudType>
+Foam::DispersionRASModel<CloudType>::DispersionRASModel
+(
+    DispersionRASModel<CloudType>& dm
+)
+:
+    DispersionModel<CloudType>(dm),
+    turbulence_(dm.turbulence_),
+    kPtr_(dm.kPtr_),
+    ownK_(dm.ownK_),
+    epsilonPtr_(dm.epsilonPtr_),
+    ownEpsilon_(dm.ownEpsilon_)
+{
+    dm.ownK_ = false;
+    dm.ownEpsilon_ = false;
+}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
@@ -93,18 +112,27 @@ void Foam::DispersionRASModel<CloudType>::cacheFields(const bool store)
     {
         if (ownK_ && kPtr_)
         {
-            delete kPtr_;
-            kPtr_ = NULL;
+            deleteDemandDrivenData(kPtr_);
             ownK_ = false;
         }
         if (ownEpsilon_ && epsilonPtr_)
         {
-            delete epsilonPtr_;
-            epsilonPtr_ = NULL;
+            deleteDemandDrivenData(epsilonPtr_);
             ownEpsilon_ = false;
         }
     }
 }
 
 
+template<class CloudType>
+void Foam::DispersionRASModel<CloudType>::write(Ostream& os) const
+{
+    DispersionModel<CloudType>::write(os);
+
+    os.writeKeyword("ownK") << ownK_ << token::END_STATEMENT << endl;
+    os.writeKeyword("ownEpsilon") << ownEpsilon_ << token::END_STATEMENT
+        << endl;
+}
+
+
 // ************************************************************************* //
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionRASModel/DispersionRASModel.H b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionRASModel/DispersionRASModel.H
index ebeacc186e4b6c01330d5a650044ccf28371fddd..4a284ef1dce88f30af9ab55b459e7316bede09c0 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionRASModel/DispersionRASModel.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionRASModel/DispersionRASModel.H
@@ -80,11 +80,19 @@ public:
     // Constructors
 
         //- Construct from components
-        DispersionRASModel
-        (
-            const dictionary& dict,
-            CloudType& owner
-        );
+        DispersionRASModel(const dictionary& dict, CloudType& owner);
+
+        //- Construct copy
+        DispersionRASModel(DispersionRASModel<CloudType>& dm);
+
+        //- Construct and return a clone
+        virtual autoPtr<DispersionModel<CloudType> > clone()
+        {
+            return autoPtr<DispersionModel<CloudType> >
+            (
+                new DispersionRASModel<CloudType>(*this)
+            );
+        }
 
 
     //- Destructor
@@ -101,6 +109,12 @@ public:
         {
             return turbulence_;
         }
+
+
+        // I-O
+
+            //- Write
+            virtual void write(Ostream& os) const;
 };
 
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/GradientDispersionRAS/GradientDispersionRAS.C b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/GradientDispersionRAS/GradientDispersionRAS.C
index 05617f25dae9b0af1c9cd06598ce8a2fd473c7cf..da6719a3913d32d39af83dc94051577e80e177c8 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/GradientDispersionRAS/GradientDispersionRAS.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/GradientDispersionRAS/GradientDispersionRAS.C
@@ -24,6 +24,7 @@ License
 \*---------------------------------------------------------------------------*/
 
 #include "GradientDispersionRAS.H"
+#include "demandDrivenData.H"
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
@@ -35,28 +36,36 @@ Foam::GradientDispersionRAS<CloudType>::GradientDispersionRAS
 )
 :
     DispersionRASModel<CloudType>(dict, owner),
-    gradkPtr_(NULL)
+    gradkPtr_(NULL),
+    ownGradK_(false)
 {}
 
 
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
-
 template<class CloudType>
-Foam::GradientDispersionRAS<CloudType>::~GradientDispersionRAS()
+Foam::GradientDispersionRAS<CloudType>::GradientDispersionRAS
+(
+    GradientDispersionRAS<CloudType>& dm
+)
+:
+    DispersionRASModel<CloudType>(dm),
+    gradkPtr_(dm.gradkPtr_),
+    ownGradK_(dm.ownGradK_)
 {
-    cacheFields(false);
+    dm.ownGradK_ = false;
 }
 
 
-// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
-bool Foam::GradientDispersionRAS<CloudType>::active() const
+Foam::GradientDispersionRAS<CloudType>::~GradientDispersionRAS()
 {
-    return true;
+    cacheFields(false);
 }
 
 
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
 template<class CloudType>
 void Foam::GradientDispersionRAS<CloudType>::cacheFields(const bool store)
 {
@@ -65,13 +74,15 @@ void Foam::GradientDispersionRAS<CloudType>::cacheFields(const bool store)
     if (store)
     {
         gradkPtr_ = fvc::grad(*this->kPtr_).ptr();
+        ownGradK_ = true;
     }
     else
     {
-        if (gradkPtr_)
+        if (ownGradK_)
         {
-            delete gradkPtr_;
+            deleteDemandDrivenData(gradkPtr_);
             gradkPtr_ = NULL;
+            ownGradK_ = false;
         }
     }
 }
@@ -88,6 +99,8 @@ Foam::vector Foam::GradientDispersionRAS<CloudType>::update
     scalar& tTurb
 )
 {
+    cachedRandom& rnd = this->owner().rndGen();
+
     const scalar cps = 0.16432;
 
     const volScalarField& k = *this->kPtr_;
@@ -120,8 +133,8 @@ Foam::vector Foam::GradientDispersionRAS<CloudType>::update
             scalar rsq = 10.0;
             while ((rsq > 1.0) || (rsq == 0.0))
             {
-                x1 = 2.0*this->owner().rndGen().scalar01() - 1.0;
-                x2 = 2.0*this->owner().rndGen().scalar01() - 1.0;
+                x1 = 2.0*rnd.sample01<scalar>() - 1.0;
+                x2 = 2.0*rnd.sample01<scalar>() - 1.0;
                 rsq = x1*x1 + x2*x2;
             }
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/GradientDispersionRAS/GradientDispersionRAS.H b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/GradientDispersionRAS/GradientDispersionRAS.H
index af74d2578b16dd4952ee243c5670b2d226499c33..910dd1d06e6c74c468b4d5360844457871f26fdc 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/GradientDispersionRAS/GradientDispersionRAS.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/GradientDispersionRAS/GradientDispersionRAS.H
@@ -54,8 +54,13 @@ protected:
 
     // Locally cached turbulence fields
 
-        //- Gradient of k
-        const volVectorField* gradkPtr_;
+        // Locally cached turbulence fields
+
+            //- Gradient of k
+            const volVectorField* gradkPtr_;
+
+            //- Take ownership of the grad(k)
+            bool ownGradK_;
 
 
 public:
@@ -67,11 +72,19 @@ public:
     // Constructors
 
         //- Construct from components
-        GradientDispersionRAS
-        (
-            const dictionary& dict,
-            CloudType& owner
-        );
+        GradientDispersionRAS(const dictionary& dict, CloudType& owner);
+
+        //- Construct copy
+        GradientDispersionRAS(GradientDispersionRAS<CloudType>& dm);
+
+        //- Construct and return a clone
+        virtual autoPtr<DispersionModel<CloudType> > clone()
+        {
+            return autoPtr<DispersionModel<CloudType> >
+            (
+                new GradientDispersionRAS<CloudType>(*this)
+            );
+        }
 
 
     //- Destructor
@@ -80,9 +93,6 @@ public:
 
     // Member Functions
 
-        //- Flag to indicate whether model activates injection model
-        bool active() const;
-
         //- Cache carrier fields
         virtual void cacheFields(const bool store);
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/NoDispersion/NoDispersion.C b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/NoDispersion/NoDispersion.C
index f44c197bb95647e1ac58387572b6951201b25d1e..6f660b1fe14acff0269b29f13d0757ca7cffb5bf 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/NoDispersion/NoDispersion.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/NoDispersion/NoDispersion.C
@@ -28,16 +28,19 @@ License
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
 template<class CloudType>
-Foam::NoDispersion<CloudType>::NoDispersion
-(
-    const dictionary&,
-    CloudType& owner
-)
+Foam::NoDispersion<CloudType>::NoDispersion(const dictionary&, CloudType& owner)
 :
     DispersionModel<CloudType>(owner)
 {}
 
 
+template<class CloudType>
+Foam::NoDispersion<CloudType>::NoDispersion(NoDispersion<CloudType>& dm)
+:
+    DispersionModel<CloudType>(dm.owner_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
@@ -54,13 +57,6 @@ bool Foam::NoDispersion<CloudType>::active() const
 }
 
 
-template<class CloudType>
-void Foam::NoDispersion<CloudType>::cacheFields(const bool)
-{
-// do nothing
-}
-
-
 template<class CloudType>
 Foam::vector Foam::NoDispersion<CloudType>::update
 (
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/NoDispersion/NoDispersion.H b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/NoDispersion/NoDispersion.H
index e63abbda213a81e391626c1c74f891735b9dc0a8..be1f6d05a16bf65410866068ec405686fbf3c520 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/NoDispersion/NoDispersion.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/NoDispersion/NoDispersion.H
@@ -57,11 +57,19 @@ public:
     // Constructors
 
         //- Construct from components
-        NoDispersion
-        (
-            const dictionary& dict,
-            CloudType& owner
-        );
+        NoDispersion(const dictionary& dict, CloudType& owner);
+
+        //- Construct copy
+        NoDispersion(NoDispersion<CloudType>& dm);
+
+        //- Construct and return a clone
+        virtual autoPtr<DispersionModel<CloudType> > clone()
+        {
+            return autoPtr<DispersionModel<CloudType> >
+            (
+                new NoDispersion<CloudType>(*this)
+            );
+        }
 
 
     //- Destructor
@@ -73,9 +81,6 @@ public:
         //- Flag to indicate whether model activates injection model
         virtual bool active() const;
 
-        //- Cache carrier fields
-        virtual void cacheFields(const bool store);
-
         //- Update (disperse particles)
         virtual vector update
         (
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/StochasticDispersionRAS/StochasticDispersionRAS.C b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/StochasticDispersionRAS/StochasticDispersionRAS.C
index a43b00c10f9f07ef6166a8c3a514284d9378af45..e5cb1624f12bb20d3e56b2519b775d8cd7430ef7 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/StochasticDispersionRAS/StochasticDispersionRAS.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/StochasticDispersionRAS/StochasticDispersionRAS.C
@@ -38,6 +38,16 @@ Foam::StochasticDispersionRAS<CloudType>::StochasticDispersionRAS
 {}
 
 
+template<class CloudType>
+Foam::StochasticDispersionRAS<CloudType>::StochasticDispersionRAS
+(
+    StochasticDispersionRAS<CloudType>& dm
+)
+:
+    DispersionRASModel<CloudType>(dm)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
@@ -47,13 +57,6 @@ Foam::StochasticDispersionRAS<CloudType>::~StochasticDispersionRAS()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-template<class CloudType>
-bool Foam::StochasticDispersionRAS<CloudType>::active() const
-{
-    return true;
-}
-
-
 template<class CloudType>
 Foam::vector Foam::StochasticDispersionRAS<CloudType>::update
 (
@@ -65,6 +68,8 @@ Foam::vector Foam::StochasticDispersionRAS<CloudType>::update
     scalar& tTurb
 )
 {
+    cachedRandom& rnd = this->owner().rndGen();
+
     const scalar cps = 0.16432;
 
     const volScalarField& k = *this->kPtr_;
@@ -88,7 +93,7 @@ Foam::vector Foam::StochasticDispersionRAS<CloudType>::update
             tTurb = 0.0;
 
             scalar sigma = sqrt(2.0*k[cellI]/3.0);
-            vector dir = 2.0*this->owner().rndGen().vector01() - vector::one;
+            vector dir = 2.0*rnd.sample01<vector>() - vector::one;
             dir /= mag(dir) + SMALL;
 
             // Numerical Recipes... Ch. 7. Random Numbers...
@@ -97,8 +102,8 @@ Foam::vector Foam::StochasticDispersionRAS<CloudType>::update
             scalar rsq = 10.0;
             while ((rsq > 1.0) || (rsq == 0.0))
             {
-                x1 = 2.0*this->owner().rndGen().scalar01() - 1.0;
-                x2 = 2.0*this->owner().rndGen().scalar01() - 1.0;
+                x1 = 2.0*rnd.sample01<scalar>() - 1.0;
+                x2 = 2.0*rnd.sample01<scalar>() - 1.0;
                 rsq = x1*x1 + x2*x2;
             }
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/StochasticDispersionRAS/StochasticDispersionRAS.H b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/StochasticDispersionRAS/StochasticDispersionRAS.H
index dae1658c9127ccef8540b858013f699cd1824877..7754716b532799180934845c46506358e5da84d9 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/StochasticDispersionRAS/StochasticDispersionRAS.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/StochasticDispersionRAS/StochasticDispersionRAS.H
@@ -59,11 +59,19 @@ public:
     // Constructors
 
         //- Construct from components
-        StochasticDispersionRAS
-        (
-            const dictionary& dict,
-            CloudType& owner
-        );
+        StochasticDispersionRAS(const dictionary& dict, CloudType& owner);
+
+        //- Construct copy
+        StochasticDispersionRAS(StochasticDispersionRAS<CloudType>& dm);
+
+        //- Construct and return a clone
+        virtual autoPtr<DispersionModel<CloudType> > clone()
+        {
+            return autoPtr<DispersionModel<CloudType> >
+            (
+                new StochasticDispersionRAS<CloudType>(*this)
+            );
+        }
 
 
     //- Destructor
@@ -72,9 +80,6 @@ public:
 
     // Member Functions
 
-        //- Flag to indicate whether model activates injection model
-        virtual bool active() const;
-
         //- Update (disperse particles)
         virtual vector update
         (
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.C b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.C
index 7bfc75ea28f3d4a368401f255b7ff3ebf962c507..b27f06bbeb505cd86906111d40515d60de055851 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.C
@@ -30,9 +30,7 @@ License
 template<class CloudType>
 Foam::DragModel<CloudType>::DragModel(CloudType& owner)
 :
-    dict_(dictionary::null),
-    coeffDict_(dictionary::null),
-    owner_(owner)
+    SubModelBase<CloudType>(owner)
 {}
 
 
@@ -44,39 +42,34 @@ Foam::DragModel<CloudType>::DragModel
     const word& type
 )
 :
-    dict_(dict),
-    coeffDict_(dict.subDict(type + "Coeffs")),
-    owner_(owner)
+    SubModelBase<CloudType>(owner, dict, type)
 {}
 
 
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
-
 template<class CloudType>
-Foam::DragModel<CloudType>::~DragModel()
+Foam::DragModel<CloudType>::DragModel(const DragModel<CloudType>& dm)
+:
+    SubModelBase<CloudType>(dm)
 {}
 
 
-// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
-const CloudType& Foam::DragModel<CloudType>::owner() const
-{
-    return owner_;
-}
+Foam::DragModel<CloudType>::~DragModel()
+{}
 
 
-template<class CloudType>
-const Foam::dictionary& Foam::DragModel<CloudType>::dict() const
-{
-    return dict_;
-}
-
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class CloudType>
-const Foam::dictionary& Foam::DragModel<CloudType>::coeffDict() const
+Foam::scalar Foam::DragModel<CloudType>::Cd(const scalar) const
 {
-    return coeffDict_;
+    notImplemented
+    (
+        "Foam::scalar Foam::DragModel<CloudType>::Cd(const scalar) const"
+    );
+    return 0.0;
 }
 
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.H b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.H
index e4fa349f8dcc5757700db8fe7238e89d83e5828b..bdb5c5e506d915fa681926d180a386785a2e6a4e 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.H
@@ -51,19 +51,9 @@ namespace Foam
 
 template<class CloudType>
 class DragModel
+:
+    public SubModelBase<CloudType>
 {
-    // Private data
-
-        //- The cloud dictionary
-        const dictionary& dict_;
-
-        //- The model coefficients dictionary
-        const dictionary& coeffDict_;
-
-        //- Reference to the owner cloud class
-        CloudType& owner_;
-
-
 public:
 
     //- Runtime type information
@@ -96,6 +86,18 @@ public:
             const word& type
         );
 
+        //- Construct copy
+        DragModel(const DragModel<CloudType>& dm);
+
+        //- Construct and return a clone
+        virtual autoPtr<DragModel<CloudType> > clone() const
+        {
+            return autoPtr<DragModel<CloudType> >
+            (
+                new DragModel<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~DragModel();
@@ -109,25 +111,10 @@ public:
     );
 
 
-    // Access
-
-        //- Return the owner cloud object
-        const CloudType& owner() const;
-
-        //- Return the dictionary
-        const dictionary& dict() const;
-
-        //- Return the coefficients dictionary
-        const dictionary& coeffDict() const;
-
-
     // Member Functions
 
-        //- Flag to indicate whether model activates drag model
-        virtual bool active() const = 0;
-
         //- Return drag coefficient
-        virtual scalar Cd(const scalar Re) const = 0;
+        virtual scalar Cd(const scalar Re) const;
 
         //- Return momentum transfer coefficient
         //  Drag force per unit particle surface area = utc(U - Up)
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NoDrag/NoDrag.C b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NoDrag/NoDrag.C
index 584abfbac22f5fa045d2d2c76e6306ff33f7db41..cccb062b7ff98d9a280db2d436f9b0a8b4753b10 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NoDrag/NoDrag.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NoDrag/NoDrag.C
@@ -34,6 +34,13 @@ Foam::NoDrag<CloudType>::NoDrag(const dictionary& dict, CloudType& owner)
 {}
 
 
+template<class CloudType>
+Foam::NoDrag<CloudType>::NoDrag(const NoDrag<CloudType>& dm)
+:
+    DragModel<CloudType>(dm.owner_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template <class CloudType>
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NoDrag/NoDrag.H b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NoDrag/NoDrag.H
index 6e354c236ee78ad321fb52499d431b9343d76400..ef03f59905340a3e69827f022d353d93995906a1 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NoDrag/NoDrag.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NoDrag/NoDrag.H
@@ -56,11 +56,19 @@ public:
     // Constructors
 
         //- Construct from dictionary
-        NoDrag
-        (
-            const dictionary&,
-            CloudType&
-        );
+        NoDrag(const dictionary&, CloudType&);
+
+        //- Construct copy
+        NoDrag(const NoDrag<CloudType>& dm);
+
+        //- Construct and return a clone
+        virtual autoPtr<DragModel<CloudType> > clone() const
+        {
+            return autoPtr<DragModel<CloudType> >
+            (
+                new NoDrag<CloudType>(*this)
+            );
+        }
 
 
     //- Destructor
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NonSphereDrag/NonSphereDrag.C b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NonSphereDrag/NonSphereDrag.C
index a106e307a3a27f981ebcb5229329b5207029bf3b..72d2c9a220328c5137364ef781a0b108cde926d9 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NonSphereDrag/NonSphereDrag.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NonSphereDrag/NonSphereDrag.C
@@ -58,6 +58,21 @@ Foam::NonSphereDrag<CloudType>::NonSphereDrag
 }
 
 
+template<class CloudType>
+Foam::NonSphereDrag<CloudType>::NonSphereDrag
+(
+    const NonSphereDrag<CloudType>& dm
+)
+:
+    DragModel<CloudType>(dm),
+    phi_(dm.phi_),
+    a_(dm.a_),
+    b_(dm.b_),
+    c_(dm.c_),
+    d_(dm.d_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
@@ -67,13 +82,6 @@ Foam::NonSphereDrag<CloudType>::~NonSphereDrag()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-template<class CloudType>
-bool Foam::NonSphereDrag<CloudType>::active() const
-{
-    return true;
-}
-
-
 template<class CloudType>
 Foam::scalar Foam::NonSphereDrag<CloudType>::Cd(const scalar Re) const
 {
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NonSphereDrag/NonSphereDrag.H b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NonSphereDrag/NonSphereDrag.H
index 095805d5e51d17214250af09c6a4399e7db3c781..041bded98a40938cb2b80dd6394e2713fd5693f4 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NonSphereDrag/NonSphereDrag.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/NonSphereDrag/NonSphereDrag.H
@@ -110,6 +110,18 @@ public:
         //- Construct from dictionary
         NonSphereDrag(const dictionary& dict, CloudType& owner);
 
+        //- Construct copy
+        NonSphereDrag(const NonSphereDrag<CloudType>& dm);
+
+        //- Construct and return a clone
+        virtual autoPtr<DragModel<CloudType> > clone() const
+        {
+            return autoPtr<DragModel<CloudType> >
+            (
+                new NonSphereDrag<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~NonSphereDrag();
@@ -117,9 +129,6 @@ public:
 
     // Member Functions
 
-        //- Flag to indicate whether model activates drag model
-        bool active() const;
-
         //- Return drag coefficient
         scalar Cd(const scalar Re) const;
 };
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/SphereDrag/SphereDrag.C b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/SphereDrag/SphereDrag.C
index ba4253bfc9508d46ce1381f3560205d5d61aed65..e71312a30f6cbde29a38d85921db8b9123c4c9c4 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/SphereDrag/SphereDrag.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/SphereDrag/SphereDrag.C
@@ -38,6 +38,13 @@ Foam::SphereDrag<CloudType>::SphereDrag
 {}
 
 
+template<class CloudType>
+Foam::SphereDrag<CloudType>::SphereDrag(const SphereDrag<CloudType>& dm)
+:
+    DragModel<CloudType>(dm)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template <class CloudType>
@@ -47,13 +54,6 @@ Foam::SphereDrag<CloudType>::~SphereDrag()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-template <class CloudType>
-bool Foam::SphereDrag<CloudType>::active() const
-{
-    return true;
-}
-
-
 template <class CloudType>
 Foam::scalar Foam::SphereDrag<CloudType>::Cd(const scalar Re) const
 {
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/SphereDrag/SphereDrag.H b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/SphereDrag/SphereDrag.H
index ca56f3782ef99a423436b42294a2a91d060592dd..5840ea2cb4355f321fd7ba8900aa0d9f56e0d33c 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/SphereDrag/SphereDrag.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/SphereDrag/SphereDrag.H
@@ -56,11 +56,19 @@ public:
     // Constructors
 
         //- Construct from dictionary
-        SphereDrag
-        (
-            const dictionary& dict,
-            CloudType& owner
-        );
+        SphereDrag(const dictionary& dict, CloudType& owner);
+
+        //- Construct copy
+        SphereDrag(const SphereDrag<CloudType>& dm);
+
+        //- Construct and return a clone
+        virtual autoPtr<DragModel<CloudType> > clone() const
+        {
+            return autoPtr<DragModel<CloudType> >
+            (
+                new SphereDrag<CloudType>(*this)
+            );
+        }
 
 
     //- Destructor
@@ -69,9 +77,6 @@ public:
 
     // Member Functions
 
-        //- Flag to indicate whether model activates drag model
-        bool active() const;
-
         //- Return drag coefficient
         scalar Cd(const scalar Re) const;
 };
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C
index 438b32b2252b07350225323df1e0fe8c49c77e35..f460ba1bcc57bb100b8f518e13c42c0e3b750967 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C
@@ -89,43 +89,14 @@ Foam::ConeInjection<CloudType>::ConeInjection
     ),
     flowRateProfile_
     (
-        DataEntry<scalar>::New
-        (
-            "flowRateProfile",
-            this->coeffDict()
-        )
-    ),
-    Umag_
-    (
-        DataEntry<scalar>::New
-        (
-            "Umag",
-            this->coeffDict()
-        )
-    ),
-    thetaInner_
-    (
-        DataEntry<scalar>::New
-        (
-            "thetaInner",
-            this->coeffDict()
-        )
-    ),
-    thetaOuter_
-    (
-        DataEntry<scalar>::New
-        (
-            "thetaOuter",
-            this->coeffDict()
-        )
+        DataEntry<scalar>::New("flowRateProfile", this->coeffDict())
     ),
+    Umag_(DataEntry<scalar>::New("Umag", this->coeffDict())),
+    thetaInner_(DataEntry<scalar>::New("thetaInner", this->coeffDict())),
+    thetaOuter_(DataEntry<scalar>::New("thetaOuter", this->coeffDict())),
     parcelPDF_
     (
-        pdfs::pdf::New
-        (
-            this->coeffDict().subDict("parcelPDF"),
-            owner.rndGen()
-        )
+        pdfs::pdf::New(this->coeffDict().subDict("parcelPDF"), owner.rndGen())
     ),
     tanVec1_(vector::zero),
     tanVec2_(vector::zero)
@@ -137,9 +108,10 @@ Foam::ConeInjection<CloudType>::ConeInjection
     vector tangent = vector::zero;
     scalar magTangent = 0.0;
 
+    cachedRandom& rnd = this->owner().rndGen();
     while (magTangent < SMALL)
     {
-        vector v = this->owner().rndGen().vector01();
+        vector v = rnd.sample01<vector>();
 
         tangent = v - (v & direction_)*direction_;
         magTangent = mag(tangent);
@@ -162,6 +134,30 @@ Foam::ConeInjection<CloudType>::ConeInjection
 }
 
 
+template<class CloudType>
+Foam::ConeInjection<CloudType>::ConeInjection
+(
+    const ConeInjection<CloudType>& im
+)
+:
+    InjectionModel<CloudType>(im),
+    duration_(im.duration_),
+    position_(im.position_),
+    injectorCell_(im.injectorCell_),
+    injectorTetFace_(im.injectorTetFace_),
+    injectorTetPt_(im.injectorTetPt_),
+    direction_(im.direction_),
+    parcelsPerSecond_(im.parcelsPerSecond_),
+    flowRateProfile_(im.flowRateProfile_().clone().ptr()),
+    Umag_(im.Umag_().clone().ptr()),
+    thetaInner_(im.thetaInner_().clone().ptr()),
+    thetaOuter_(im.thetaOuter_().clone().ptr()),
+    parcelPDF_(im.parcelPDF_().clone().ptr()),
+    tanVec1_(im.tanVec1_),
+    tanVec2_(im.tanVec2_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
@@ -171,13 +167,6 @@ Foam::ConeInjection<CloudType>::~ConeInjection()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-template<class CloudType>
-bool Foam::ConeInjection<CloudType>::active() const
-{
-    return true;
-}
-
-
 template<class CloudType>
 Foam::scalar Foam::ConeInjection<CloudType>::timeEnd() const
 {
@@ -207,24 +196,26 @@ void Foam::ConeInjection<CloudType>::setPositionAndCell
 template<class CloudType>
 void Foam::ConeInjection<CloudType>::setProperties
 (
-    const label parcelI,
+    const label,
     const label,
     const scalar time,
     typename CloudType::parcelType& parcel
 )
 {
+    cachedRandom& rnd = this->owner().rndGen();
+
     // set particle velocity
     const scalar deg2Rad = pi/180.0;
 
     scalar t = time - this->SOI_;
     scalar ti = thetaInner_().value(t);
     scalar to = thetaOuter_().value(t);
-    scalar coneAngle = this->owner().rndGen().scalar01()*(to - ti) + ti;
+    scalar coneAngle = deg2Rad*rnd.position<scalar>(ti, to);
 
     coneAngle *= deg2Rad;
     scalar alpha = sin(coneAngle);
     scalar dcorr = cos(coneAngle);
-    scalar beta = twoPi*this->owner().rndGen().scalar01();
+    scalar beta = twoPi*rnd.sample01<scalar>();
 
     vector normal = alpha*(tanVec1_*cos(beta) + tanVec2_*sin(beta));
     vector dirVec = dcorr*direction_;
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H
index a9c289d6d48d44b5be1c59fba2697b6e1c661591..19d2731bd9452258c0e3a5547d17f968f387f776 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H
@@ -119,18 +119,10 @@ protected:
     // Protected Member Functions
 
         //- Number of parcels to introduce over the time step relative to SOI
-        label parcelsToInject
-        (
-            const scalar time0,
-            const scalar time1
-        );
+        virtual label parcelsToInject(const scalar time0, const scalar time1);
 
         //- Number of parcels to introduce over the time step relative to SOI
-        scalar volumeToInject
-        (
-            const scalar time0,
-            const scalar time1
-        );
+        virtual scalar volumeToInject(const scalar time0, const scalar time1);
 
 
 public:
@@ -142,11 +134,19 @@ public:
     // Constructors
 
         //- Construct from dictionary
-        ConeInjection
-        (
-            const dictionary& dict,
-            CloudType& owner
-        );
+        ConeInjection(const dictionary& dict, CloudType& owner);
+
+        //- Construct copy
+        ConeInjection(const ConeInjection<CloudType>& im);
+
+        //- Construct and return a clone
+        virtual autoPtr<InjectionModel<CloudType> > clone() const
+        {
+            return autoPtr<InjectionModel<CloudType> >
+            (
+                new ConeInjection<CloudType>(*this)
+            );
+        }
 
 
     //- Destructor
@@ -155,9 +155,6 @@ public:
 
     // Member Functions
 
-        //- Flag to indicate whether model activates injection model
-        bool active() const;
-
         //- Return the end-of-injection time
         scalar timeEnd() const;
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjectionMP/ConeInjectionMP.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjectionMP/ConeInjectionMP.C
index 6639c43587fc4e7fb237ac09962a53bb73b909cd..fef59269081067714c76f1eee51ea5a36bb68093 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjectionMP/ConeInjectionMP.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjectionMP/ConeInjectionMP.C
@@ -120,43 +120,14 @@ Foam::ConeInjectionMP<CloudType>::ConeInjectionMP
     ),
     flowRateProfile_
     (
-        DataEntry<scalar>::New
-        (
-            "flowRateProfile",
-            this->coeffDict()
-        )
-    ),
-    Umag_
-    (
-        DataEntry<scalar>::New
-        (
-            "Umag",
-            this->coeffDict()
-        )
-    ),
-    thetaInner_
-    (
-        DataEntry<scalar>::New
-        (
-            "thetaInner",
-            this->coeffDict()
-        )
-    ),
-    thetaOuter_
-    (
-        DataEntry<scalar>::New
-        (
-            "thetaOuter",
-            this->coeffDict()
-        )
+        DataEntry<scalar>::New("flowRateProfile", this->coeffDict())
     ),
+    Umag_(DataEntry<scalar>::New("Umag", this->coeffDict())),
+    thetaInner_(DataEntry<scalar>::New("thetaInner", this->coeffDict())),
+    thetaOuter_(DataEntry<scalar>::New("thetaOuter", this->coeffDict())),
     parcelPDF_
     (
-        pdfs::pdf::New
-        (
-            this->coeffDict().subDict("parcelPDF"),
-            owner.rndGen()
-        )
+        pdfs::pdf::New(this->coeffDict().subDict("parcelPDF"), owner.rndGen())
     ),
     nInjected_(this->parcelsAddedTotal()),
     tanVec1_(positions_.size()),
@@ -171,9 +142,10 @@ Foam::ConeInjectionMP<CloudType>::ConeInjectionMP
         vector tangent = vector::zero;
         scalar magTangent = 0.0;
 
+        cachedRandom& rnd = this->owner().rndGen();
         while (magTangent < SMALL)
         {
-            vector v = this->owner().rndGen().vector01();
+            vector v = rnd.sample01<vector>();
 
             tangent = v - (v & axes_[i])*axes_[i];
             magTangent = mag(tangent);
@@ -200,6 +172,33 @@ Foam::ConeInjectionMP<CloudType>::ConeInjectionMP
 }
 
 
+template<class CloudType>
+Foam::ConeInjectionMP<CloudType>::ConeInjectionMP
+(
+    const ConeInjectionMP<CloudType>& im
+)
+:
+    InjectionModel<CloudType>(im),
+    positionsFile_(im.positionsFile_),
+    positions_(im.positions_),
+    injectorCells_(im.injectorCells_),
+    injectorTetFaces_(im.injectorTetFaces_),
+    injectorTetPts_(im.injectorTetPts_),
+    axesFile_(im.axesFile_),
+    axes_(im.axes_),
+    duration_(im.duration_),
+    parcelsPerInjector_(im.parcelsPerInjector_),
+    flowRateProfile_(im.flowRateProfile_().clone().ptr()),
+    Umag_(im.Umag_().clone().ptr()),
+    thetaInner_(im.thetaInner_().clone().ptr()),
+    thetaOuter_(im.thetaOuter_().clone().ptr()),
+    parcelPDF_(im.parcelPDF_().clone().ptr()),
+    nInjected_(im.nInjected_),
+    tanVec1_(im.tanVec1_),
+    tanVec2_(im.tanVec2_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
@@ -209,13 +208,6 @@ Foam::ConeInjectionMP<CloudType>::~ConeInjectionMP()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-template<class CloudType>
-bool Foam::ConeInjectionMP<CloudType>::active() const
-{
-    return true;
-}
-
-
 template<class CloudType>
 Foam::scalar Foam::ConeInjectionMP<CloudType>::timeEnd() const
 {
@@ -253,6 +245,8 @@ void Foam::ConeInjectionMP<CloudType>::setProperties
     typename CloudType::parcelType& parcel
 )
 {
+    cachedRandom& rnd = this->owner().rndGen();
+
     // set particle velocity
     const label i = parcelI%positions_.size();
 
@@ -261,17 +255,16 @@ void Foam::ConeInjectionMP<CloudType>::setProperties
     scalar t = time - this->SOI_;
     scalar ti = thetaInner_().value(t);
     scalar to = thetaOuter_().value(t);
-    scalar coneAngle = this->owner().rndGen().scalar01()*(to - ti) + ti;
+    scalar coneAngle = deg2Rad*rnd.position<scalar>(ti, to);
 
     coneAngle *= deg2Rad;
     scalar alpha = sin(coneAngle);
     scalar dcorr = cos(coneAngle);
-    scalar beta = twoPi*this->owner().rndGen().scalar01();
+    scalar beta = twoPi*rnd.sample01<scalar>();
 
     vector normal = alpha*(tanVec1_[i]*cos(beta) + tanVec2_[i]*sin(beta));
     vector dirVec = dcorr*axes_[i];
     dirVec += normal;
-
     dirVec /= mag(dirVec);
 
     parcel.U() = Umag_().value(t)*dirVec;
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjectionMP/ConeInjectionMP.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjectionMP/ConeInjectionMP.H
index 2b0d4e8c313e5586a92fc20926fa1c58925c1c72..bfbbd7015225bd7834b1ec996737827a36825d2c 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjectionMP/ConeInjectionMP.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjectionMP/ConeInjectionMP.H
@@ -129,18 +129,10 @@ protected:
     // Protected Member Functions
 
         //- Number of parcels to introduce over the time step
-        label parcelsToInject
-        (
-            const scalar time0,
-            const scalar time1
-        );
+        virtual label parcelsToInject(const scalar time0, const scalar time1);
 
         //- Number of parcels to introduce over the time step
-        scalar volumeToInject
-        (
-            const scalar time0,
-            const scalar time1
-        );
+        virtual scalar volumeToInject(const scalar time0, const scalar time1);
 
 
 public:
@@ -152,11 +144,19 @@ public:
     // Constructors
 
         //- Construct from dictionary
-        ConeInjectionMP
-        (
-            const dictionary& dict,
-            CloudType& owner
-        );
+        ConeInjectionMP(const dictionary& dict, CloudType& owner);
+
+        //- Construct copy
+        ConeInjectionMP(const ConeInjectionMP<CloudType>& im);
+
+        //- Construct and return a clone
+        virtual autoPtr<InjectionModel<CloudType> > clone() const
+        {
+            return autoPtr<InjectionModel<CloudType> >
+            (
+                new ConeInjectionMP<CloudType>(*this)
+            );
+        }
 
 
     //- Destructor
@@ -165,9 +165,6 @@ public:
 
     // Member Functions
 
-        //- Flag to indicate whether model activates injection model
-        bool active() const;
-
         //- Return the end-of-injection time
         scalar timeEnd() const;
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.C
index 44cebec90388d605251285ca144b5a2cfaa20516..40f7b61be55658a28879886ff308c40efe630d95 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.C
@@ -147,6 +147,29 @@ Foam::FieldActivatedInjection<CloudType>::FieldActivatedInjection
 }
 
 
+template<class CloudType>
+Foam::FieldActivatedInjection<CloudType>::FieldActivatedInjection
+(
+    const FieldActivatedInjection<CloudType>& im
+)
+:
+    InjectionModel<CloudType>(im),
+    factor_(im.factor_),
+    referenceField_(im.referenceField_),
+    thresholdField_(im.thresholdField_),
+    positionsFile_(im.positionsFile_),
+    positions_(im.positions_),
+    injectorCells_(im.injectorCells_),
+    injectorTetFaces_(im.injectorTetFaces_),
+    injectorTetPts_(im.injectorTetPts_),
+    nParcelsPerInjector_(im.nParcelsPerInjector_),
+    nParcelsInjected_(im.nParcelsInjected_),
+    U0_(im.U0_),
+    diameters_(im.diameters_),
+    parcelPDF_(im.parcelPDF_().clone().ptr())
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.H
index 9acf379154d5f99162cc6744ff48fd7d711366f1..b7d76873e0a08a1f82b7f34709540bbb898596de 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.H
@@ -119,18 +119,10 @@ protected:
     // Protected Member Functions
 
         //- Number of parcels to introduce over the time step relative to SOI
-        label parcelsToInject
-        (
-            const scalar time0,
-            const scalar time1
-        );
+        virtual label parcelsToInject(const scalar time0, const scalar time1);
 
         //- Volume of parcels to introduce over the time step relative to SOI
-        scalar volumeToInject
-        (
-            const scalar time0,
-            const scalar time1
-        );
+        virtual scalar volumeToInject(const scalar time0, const scalar time1);
 
 
 public:
@@ -142,11 +134,19 @@ public:
     // Constructors
 
         //- Construct from dictionary
-        FieldActivatedInjection
-        (
-            const dictionary& dict,
-            CloudType& owner
-        );
+        FieldActivatedInjection(const dictionary& dict, CloudType& owner);
+
+        //- Construct copy
+        FieldActivatedInjection(const FieldActivatedInjection<CloudType>& im);
+
+        //- Construct and return a clone
+        virtual autoPtr<InjectionModel<CloudType> > clone() const
+        {
+            return autoPtr<InjectionModel<CloudType> >
+            (
+                new FieldActivatedInjection<CloudType>(*this)
+            );
+        }
 
 
     //- Destructor
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InflationInjection/InflationInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InflationInjection/InflationInjection.C
index c46d5efc7709cb81532991e1436638721fb59ea4..3cf811416480295a24b9340dd02e68b1994a624d 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InflationInjection/InflationInjection.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InflationInjection/InflationInjection.C
@@ -71,7 +71,7 @@ Foam::label Foam::InflationInjection<CloudType>::parcelsToInject
 
     newParticles_.clear();
 
-    Random& rnd = this->owner().rndGen();
+    cachedRandom& rnd = this->owner().rndGen();
 
     // Diameter factor, when splitting particles into 4, this is the
     // factor that modifies the diameter.
@@ -118,7 +118,7 @@ Foam::label Foam::InflationInjection<CloudType>::parcelsToInject
         }
 
         label cI =
-            generationCells_[rnd.integer(0, generationCells_.size() - 1)];
+            generationCells_[rnd.position(0, generationCells_.size() - 1)];
 
         // Pick a particle at random from the cell - if there are
         // none, insert one at the cell centre.  Otherwise, split an
@@ -146,7 +146,7 @@ Foam::label Foam::InflationInjection<CloudType>::parcelsToInject
         }
         else
         {
-            label cPI = rnd.integer(0, cellOccupancy[cI].size() - 1);
+            label cPI = rnd.position(0, cellOccupancy[cI].size() - 1);
 
             // This has to be a reference to the pointer so that it
             // can be set to NULL when the particle is deleted.
@@ -157,7 +157,7 @@ Foam::label Foam::InflationInjection<CloudType>::parcelsToInject
                 scalar pD = pPtr->d();
 
                 // Select bigger particles by preference
-                if ((pD/pPtr->dTarget()) < rnd.scalar01())
+                if ((pD/pPtr->dTarget()) < rnd.sample01<scalar>())
                 {
                     continue;
                 }
@@ -390,6 +390,29 @@ Foam::InflationInjection<CloudType>::InflationInjection
 }
 
 
+template<class CloudType>
+Foam::InflationInjection<CloudType>::InflationInjection
+(
+    const Foam::InflationInjection<CloudType>& im
+)
+:
+    InjectionModel<CloudType>(im),
+    generationSetName_(im.generationSetName_),
+    inflationSetName_(im.inflationSetName_),
+    generationCells_(im.generationCells_),
+    inflationCells_(im.inflationCells_),
+    duration_(im.duration_),
+    flowRateProfile_(im.flowRateProfile_().clone().ptr()),
+    growthRate_(im.growthRate_().clone().ptr()),
+    newParticles_(im.newParticles_),
+    volumeAccumulator_(im.volumeAccumulator_),
+    fraction_(im.fraction_),
+    selfSeed_(im.selfSeed_),
+    dSeed_(im.dSeed_),
+    parcelPDF_(im.parcelPDF_().clone().ptr())
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
@@ -399,13 +422,6 @@ Foam::InflationInjection<CloudType>::~InflationInjection()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-template<class CloudType>
-bool Foam::InflationInjection<CloudType>::active() const
-{
-    return true;
-}
-
-
 template<class CloudType>
 Foam::scalar Foam::InflationInjection<CloudType>::timeEnd() const
 {
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InflationInjection/InflationInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InflationInjection/InflationInjection.H
index 45a54774d30ae3d7b2baa20b5a2c3778a9a4cf0f..b10c8e17d9dd6fca85488a841e380ca689489543 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InflationInjection/InflationInjection.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InflationInjection/InflationInjection.H
@@ -116,18 +116,10 @@ protected:
     // Protected Member Functions
 
         //- Number of parcels to introduce over the time step relative to SOI
-        label parcelsToInject
-        (
-            const scalar time0,
-            const scalar time1
-        );
+        virtual label parcelsToInject(const scalar time0, const scalar time1);
 
         //- Volume of parcels to introduce over the time step relative to SOI
-        scalar volumeToInject
-        (
-            const scalar time0,
-            const scalar time1
-        );
+        virtual scalar volumeToInject(const scalar time0, const scalar time1);
 
 
 public:
@@ -139,11 +131,19 @@ public:
     // Constructors
 
         //- Construct from dictionary
-        InflationInjection
-        (
-            const dictionary& dict,
-            CloudType& owner
-        );
+        InflationInjection(const dictionary& dict, CloudType& owner);
+
+        //- Construct copy
+        InflationInjection(const InflationInjection<CloudType>& im);
+
+        //- Construct and return a clone
+        virtual autoPtr<InjectionModel<CloudType> > clone() const
+        {
+            return autoPtr<InjectionModel<CloudType> >
+            (
+                new InflationInjection<CloudType>(*this)
+            );
+        }
 
 
     //- Destructor
@@ -152,9 +152,6 @@ public:
 
     // Member Functions
 
-        //- Flag to indicate whether model activates injection model
-        bool active() const;
-
         //- Return the end-of-injection time
         scalar timeEnd() const;
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C
index 5a386e4397e10a863a17b2aae75bb9f8aee9dcfd..72b891079aa299244c206636a14d076ec6188483 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C
@@ -37,9 +37,9 @@ void Foam::InjectionModel<CloudType>::readProps()
     IOobject propsDictHeader
     (
         "injectionProperties",
-        owner_.db().time().timeName(),
-        "uniform"/cloud::prefix/owner_.name(),
-        owner_.db(),
+        this->owner().db().time().timeName(),
+        "uniform"/cloud::prefix/this->owner().name(),
+        this->owner().db(),
         IOobject::MUST_READ_IF_MODIFIED,
         IOobject::NO_WRITE,
         false
@@ -60,16 +60,16 @@ void Foam::InjectionModel<CloudType>::readProps()
 template<class CloudType>
 void Foam::InjectionModel<CloudType>::writeProps()
 {
-    if (owner_.db().time().outputTime())
+    if (this->owner().db().time().outputTime())
     {
         IOdictionary propsDict
         (
             IOobject
             (
                 "injectionProperties",
-                owner_.db().time().timeName(),
-                "uniform"/cloud::prefix/owner_.name(),
-                owner_.db(),
+                this->owner().db().time().timeName(),
+                "uniform"/cloud::prefix/this->owner().name(),
+                this->owner().db(),
                 IOobject::NO_READ,
                 IOobject::NO_WRITE,
                 false
@@ -86,6 +86,58 @@ void Foam::InjectionModel<CloudType>::writeProps()
 }
 
 
+template<class CloudType>
+Foam::label Foam::InjectionModel<CloudType>::parcelsToInject
+(
+    const scalar time0,
+    const scalar time1
+) const
+{
+    notImplemented
+    (
+        "Foam::label Foam::InjectionModel<CloudType>::parcelsToInject"
+        "("
+            "const scalar, "
+            "const scalar"
+        ") const"
+    );
+
+    return 0;
+}
+
+
+template<class CloudType>
+Foam::scalar Foam::InjectionModel<CloudType>::volumeToInject
+(
+    const scalar time0,
+    const scalar time1
+) const
+{
+    notImplemented
+    (
+        "Foam::scalar Foam::InjectionModel<CloudType>::volumeToInject"
+        "("
+            "const scalar, "
+            "const scalar"
+        ") const"
+    );
+
+    return 0.0;
+}
+
+
+template<class CloudType>
+bool Foam::InjectionModel<CloudType>::validInjection(const label parcelI)
+{
+    notImplemented
+    (
+        "bool Foam::InjectionModel<CloudType>::validInjection(const label)"
+    );
+
+    return false;
+}
+
+
 template<class CloudType>
 void Foam::InjectionModel<CloudType>::prepareForNextTimeStep
 (
@@ -138,11 +190,11 @@ bool Foam::InjectionModel<CloudType>::findCellAtPosition
     bool errorOnNotFound
 )
 {
-    const volVectorField& cellCentres = owner_.mesh().C();
+    const volVectorField& cellCentres = this->owner().mesh().C();
 
     const vector p0 = position;
 
-    owner_.findCellFacePt
+    this->owner().findCellFacePt
     (
         position,
         cellI,
@@ -172,13 +224,13 @@ bool Foam::InjectionModel<CloudType>::findCellAtPosition
     // probably on an edge
     if (procI == -1)
     {
-        cellI = owner_.mesh().findNearestCell(position);
+        cellI = this->owner().mesh().findNearestCell(position);
 
         if (cellI >= 0)
         {
             position += SMALL*(cellCentres[cellI] - position);
 
-            if (owner_.mesh().pointInCell(position, cellI))
+            if (this->owner().mesh().pointInCell(position, cellI))
             {
                 procI = Pstream::myProcNo();
             }
@@ -283,7 +335,7 @@ void Foam::InjectionModel<CloudType>::postInjectCheck
     if (allParcelsAdded > 0)
     {
         Info<< nl
-            << "--> Cloud: " << owner_.name() << nl
+            << "--> Cloud: " << this->owner().name() << nl
             << "    Added " << allParcelsAdded << " new parcels" << nl << endl;
     }
 
@@ -294,7 +346,7 @@ void Foam::InjectionModel<CloudType>::postInjectCheck
     massInjected_ += returnReduce(massAdded, sumOp<scalar>());
 
     // Update time for start of next injection
-    time0_ = owner_.db().time().value();
+    time0_ = this->owner().db().time().value();
 
     // Increment number of injections
     nInjections_++;
@@ -309,9 +361,7 @@ void Foam::InjectionModel<CloudType>::postInjectCheck
 template<class CloudType>
 Foam::InjectionModel<CloudType>::InjectionModel(CloudType& owner)
 :
-    dict_(dictionary::null),
-    owner_(owner),
-    coeffDict_(dictionary::null),
+    SubModelBase<CloudType>(owner),
     SOI_(0.0),
     volumeTotal_(0.0),
     massTotal_(0.0),
@@ -335,12 +385,10 @@ Foam::InjectionModel<CloudType>::InjectionModel
     const word& type
 )
 :
-    dict_(dict),
-    owner_(owner),
-    coeffDict_(dict.subDict(type + "Coeffs")),
-    SOI_(readScalar(coeffDict_.lookup("SOI"))),
+    SubModelBase<CloudType>(owner, dict, type),
+    SOI_(readScalar(this->coeffDict().lookup("SOI"))),
     volumeTotal_(0.0),
-    massTotal_(dimensionedScalar(coeffDict_.lookup("massTotal")).value()),
+    massTotal_(readScalar(this->coeffDict().lookup("massTotal"))),
     massInjected_(0.0),
     nInjections_(0),
     parcelsAddedTotal_(0),
@@ -355,7 +403,7 @@ Foam::InjectionModel<CloudType>::InjectionModel
     Info<< "    Constructing " << owner.mesh().nGeometricD() << "-D injection"
         << endl;
 
-    const word parcelBasisType = coeffDict_.lookup("parcelBasisType");
+    const word parcelBasisType = this->coeffDict().lookup("parcelBasisType");
 
     if (parcelBasisType == "mass")
     {
@@ -373,7 +421,7 @@ Foam::InjectionModel<CloudType>::InjectionModel
             << "variable now does not determine anything."
             << endl;
 
-        nParticleFixed_ = readScalar(coeffDict_.lookup("nParticle"));
+        nParticleFixed_ = readScalar(this->coeffDict().lookup("nParticle"));
     }
     else
     {
@@ -393,6 +441,26 @@ Foam::InjectionModel<CloudType>::InjectionModel
 }
 
 
+template<class CloudType>
+Foam::InjectionModel<CloudType>::InjectionModel
+(
+    const InjectionModel<CloudType>& im
+)
+:
+    SubModelBase<CloudType>(im),
+    SOI_(im.SOI_),
+    volumeTotal_(im.volumeTotal_),
+    massTotal_(im.massTotal_),
+    massInjected_(im.massInjected_),
+    nInjections_(im.nInjections_),
+    parcelsAddedTotal_(im.parcelsAddedTotal_),
+    parcelBasis_(im.parcelBasis_),
+    nParticleFixed_(im.nParticleFixed_),
+    time0_(im.time0_),
+    timeStep0_(im.timeStep0_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
@@ -402,18 +470,30 @@ Foam::InjectionModel<CloudType>::~InjectionModel()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
+template<class CloudType>
+Foam::scalar Foam::InjectionModel<CloudType>::timeEnd() const
+{
+    notImplemented
+    (
+        "Foam::scalar Foam::InjectionModel<CloudType>::timeEnd() const"
+    );
+
+    return 0.0;
+}
+
+
 template<class CloudType>
 template<class TrackData>
 void Foam::InjectionModel<CloudType>::inject(TrackData& td)
 {
-    if (!active())
+    if (this->active())
     {
         return;
     }
 
-    const scalar time = owner_.db().time().value();
-    const scalar carrierDt = owner_.db().time().deltaTValue();
-    const polyMesh& mesh = owner_.mesh();
+    const scalar time = this->owner().db().time().value();
+    const scalar carrierDt = this->owner().db().time().deltaTValue();
+    const polyMesh& mesh = this->owner().mesh();
 
     // Prepare for next time step
     label parcelsAdded = 0;
@@ -512,6 +592,68 @@ void Foam::InjectionModel<CloudType>::inject(TrackData& td)
 }
 
 
+template<class CloudType>
+void Foam::InjectionModel<CloudType>::setPositionAndCell
+(
+    const label parcelI,
+    const label nParcels,
+    const scalar time,
+    vector& position,
+    label& cellOwner,
+    label& tetFaceI,
+    label& tetPtI
+)
+{
+    notImplemented
+    (
+        "void Foam::InjectionModel<CloudType>::setPositionAndCell"
+        "("
+            "const label, "
+            "const label, "
+            "const scalar, "
+            "vector&, "
+            "label&, "
+            "label&, "
+            "label&"
+        ")"
+    );
+}
+
+
+template<class CloudType>
+void Foam::InjectionModel<CloudType>::setProperties
+(
+    const label parcelI,
+    const label nParcels,
+    const scalar time,
+    typename CloudType::parcelType& parcel
+)
+{
+    notImplemented
+    (
+        "void Foam::InjectionModel<CloudType>::setProperties"
+        "("
+            "const label, "
+            "const label, "
+            "const scalar, "
+            "typename CloudType::parcelType&"
+        ")"
+    );
+}
+
+
+template<class CloudType>
+bool Foam::InjectionModel<CloudType>::fullyDescribed() const
+{
+    notImplemented
+    (
+        "bool Foam::InjectionModel<CloudType>::fullyDescribed() const"
+    );
+
+    return false;
+}
+
+
 template<class CloudType>
 void Foam::InjectionModel<CloudType>::info(Ostream& os) const
 {
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H
index 5b225c0781487a7b805a9912ef0d07ac759faf82..86fffe68de2551364214c3c2b1c9648a04006709 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H
@@ -51,6 +51,7 @@ SourceFiles
 #include "IOdictionary.H"
 #include "autoPtr.H"
 #include "runTimeSelectionTables.H"
+#include "SubModelBase.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -63,6 +64,8 @@ namespace Foam
 
 template<class CloudType>
 class InjectionModel
+:
+    public SubModelBase<CloudType>
 {
 public:
 
@@ -80,18 +83,6 @@ public:
 
 private:
 
-    // Private data
-
-        //- The cloud dictionary
-        const dictionary& dict_;
-
-        //- Reference to the owner cloud class
-        CloudType& owner_;
-
-        //- The coefficients dictionary
-        const dictionary coeffDict_;
-
-
     // Private Member Functions
 
         //- Read injector properties from previous run (if applicable)
@@ -156,18 +147,18 @@ protected:
         (
             const scalar time0,
             const scalar time1
-        ) = 0;
+        ) const;
 
         //- Volume of parcels to introduce over the time step relative to SOI
         virtual scalar volumeToInject
         (
             const scalar time0,
             const scalar time1
-        ) = 0;
+        ) const;
 
         //- Additional flag to identify whether or not injection of parcelI is
         //  permitted
-        virtual bool validInjection(const label parcelI) = 0;
+        virtual bool validInjection(const label parcelI);
 
         //- Determine properties for next time step/injection interval
         virtual void prepareForNextTimeStep
@@ -238,6 +229,18 @@ public:
             const word& type
         );
 
+        //- Construct copy
+        InjectionModel(const InjectionModel<CloudType>& im);
+
+        //- Construct and return a clone
+        virtual autoPtr<InjectionModel<CloudType> > clone() const
+        {
+            return autoPtr<InjectionModel<CloudType> >
+            (
+                new InjectionModel<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~InjectionModel();
@@ -251,27 +254,8 @@ public:
     );
 
 
-    // Access
-
-        //- Return the owner cloud dictionary
-        inline const dictionary& dict() const;
-
-        //- Return const access the owner cloud object
-        inline const CloudType& owner() const;
-
-        //- Return non-const access the owner cloud object for manipulation
-        inline CloudType& owner();
-
-        //- Return the coefficients dictionary
-        inline const dictionary& coeffDict() const;
-
-
     // Member Functions
 
-        //- Flag to indicate whether model activates injection model
-        virtual bool active() const = 0;
-
-
         // Global information
 
             //- Return the start-of-injection time
@@ -287,7 +271,7 @@ public:
             inline scalar massInjected() const;
 
             //- Return the end-of-injection time
-            virtual scalar timeEnd() const = 0;
+            virtual scalar timeEnd() const;
 
             // Counters
 
@@ -317,7 +301,7 @@ public:
                 label& cellOwner,
                 label& tetFaceI,
                 label& tetPtI
-            ) = 0;
+            );
 
             //- Set the parcel properties
             virtual void setProperties
@@ -326,15 +310,15 @@ public:
                 const label nParcels,
                 const scalar time,
                 typename CloudType::parcelType& parcel
-            ) = 0;
+            );
 
             //- Flag to identify whether model fully describes the parcel
-            virtual bool fullyDescribed() const = 0;
+            virtual bool fullyDescribed() const;
 
 
         // I-O
 
-            //- Write surface film info to stream
+            //- Write injection info to stream
             virtual void info(Ostream& os) const;
 };
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModelI.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModelI.H
index 65f9b3cac09261166873a2ac9ad38691d8c10276..fb432c0be6dec018286172c319dbfa327c2a5aa6 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModelI.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModelI.H
@@ -25,33 +25,7 @@ License
 
 #include "InjectionModel.H"
 
-template<class CloudType>
-const Foam::dictionary& Foam::InjectionModel<CloudType>::dict() const
-{
-    return dict_;
-}
-
-
-template<class CloudType>
-const CloudType& Foam::InjectionModel<CloudType>::owner() const
-{
-    return owner_;
-}
-
-
-template<class CloudType>
-CloudType& Foam::InjectionModel<CloudType>::owner()
-{
-    return owner_;
-}
-
-
-template<class CloudType>
-const Foam::dictionary& Foam::InjectionModel<CloudType>::coeffDict() const
-{
-    return coeffDict_;
-}
-
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 template<class CloudType>
 Foam::scalar Foam::InjectionModel<CloudType>::timeStart() const
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.C
index b87449f225d352beac22560726458b11baaec702..7808407cab86946cb322e1e15eefa92ac1461fa5 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.C
@@ -123,6 +123,23 @@ Foam::KinematicLookupTableInjection<CloudType>::KinematicLookupTableInjection
 }
 
 
+template<class CloudType>
+Foam::KinematicLookupTableInjection<CloudType>::KinematicLookupTableInjection
+(
+    const KinematicLookupTableInjection<CloudType>& im
+)
+:
+    InjectionModel<CloudType>(im),
+    inputFileName_(im.inputFileName_),
+    duration_(im.duration_),
+    nParcelsPerSecond_(im.nParcelsPerSecond_),
+    injectors_(im.injectors_),
+    injectorCells_(im.injectorCells_),
+    injectorTetFaces_(im.injectorTetFaces_),
+    injectorTetPts_(im.injectorTetPts_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
@@ -132,13 +149,6 @@ Foam::KinematicLookupTableInjection<CloudType>::~KinematicLookupTableInjection()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-template<class CloudType>
-bool Foam::KinematicLookupTableInjection<CloudType>::active() const
-{
-    return true;
-}
-
-
 template<class CloudType>
 Foam::scalar Foam::KinematicLookupTableInjection<CloudType>::timeEnd() const
 {
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.H
index ff840187f26d126f3989820ec5ce7043162ad7e0..0c84e17ffba72f0db325b5656ed89728686b56b5 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.H
@@ -96,18 +96,10 @@ protected:
     // Protected Member Functions
 
         //- Number of parcels to introduce over the time step relative to SOI
-        label parcelsToInject
-        (
-            const scalar time0,
-            const scalar time1
-        );
+        virtual label parcelsToInject(const scalar time0, const scalar time1);
 
         //- Volume of parcels to introduce over the time step relative to SOI
-        scalar volumeToInject
-        (
-            const scalar time0,
-            const scalar time1
-        );
+        virtual scalar volumeToInject(const scalar time0, const scalar time1);
 
 
 public:
@@ -119,12 +111,23 @@ public:
     // Constructors
 
         //- Construct from dictionary
+        KinematicLookupTableInjection(const dictionary& dict, CloudType& owner);
+
+        //- Construct copy
         KinematicLookupTableInjection
         (
-            const dictionary& dict,
-            CloudType& owner
+            const KinematicLookupTableInjection<CloudType>& im
         );
 
+        //- Construct and return a clone
+        virtual autoPtr<InjectionModel<CloudType> > clone() const
+        {
+            return autoPtr<InjectionModel<CloudType> >
+            (
+                new KinematicLookupTableInjection<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~KinematicLookupTableInjection();
@@ -132,9 +135,6 @@ public:
 
     // Member Functions
 
-        //- Flag to indicate whether model activates injection model
-        bool active() const;
-
         //- Return the end-of-injection time
         scalar timeEnd() const;
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C
index 48b156d1e2e8b70014adf7020e199d17c2567ae3..88d5c834443f22ef683143060e82adc8353f9932 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C
@@ -157,6 +157,24 @@ Foam::ManualInjection<CloudType>::ManualInjection
 }
 
 
+template<class CloudType>
+Foam::ManualInjection<CloudType>::ManualInjection
+(
+    const ManualInjection<CloudType>& im
+)
+:
+    InjectionModel<CloudType>(im),
+    positionsFile_(im.positionsFile_),
+    positions_(im.positions_),
+    diameters_(im.diameters_),
+    injectorCells_(im.injectorCells_),
+    injectorTetFaces_(im.injectorTetFaces_),
+    injectorTetPts_(im.injectorTetPts_),
+    U0_(im.U0_),
+    parcelPDF_(im.parcelPDF_().clone().ptr())
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
@@ -166,13 +184,6 @@ Foam::ManualInjection<CloudType>::~ManualInjection()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-template<class CloudType>
-bool Foam::ManualInjection<CloudType>::active() const
-{
-    return true;
-}
-
-
 template<class CloudType>
 Foam::scalar Foam::ManualInjection<CloudType>::timeEnd() const
 {
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H
index b4feea97441a0f974912e146914dc93ac1df3391..4825418786b82a23b08555a45e4fb9f7c7024c54 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H
@@ -79,7 +79,7 @@ class ManualInjection
         //- List of tetPt labels corresponding to injector positions
         labelList injectorTetPts_;
 
-    //- Initial parcel velocity
+        //- Initial parcel velocity
         const vector U0_;
 
         //- Parcel size PDF model
@@ -91,18 +91,10 @@ protected:
     // Protected Member Functions
 
         //- Number of parcels to introduce over the time step relative to SOI
-        label parcelsToInject
-        (
-            const scalar time0,
-            const scalar time1
-        );
+        virtual label parcelsToInject(const scalar time0, const scalar time1);
 
         //- Volume of parcels to introduce over the time step relative to SOI
-        scalar volumeToInject
-        (
-            const scalar time0,
-            const scalar time1
-        );
+        virtual scalar volumeToInject(const scalar time0, const scalar time1);
 
 
 public:
@@ -114,11 +106,19 @@ public:
     // Constructors
 
         //- Construct from dictionary
-        ManualInjection
-        (
-            const dictionary& dict,
-            CloudType& owner
-        );
+        ManualInjection(const dictionary& dict, CloudType& owner);
+
+        //- Construct copy
+        ManualInjection(const ManualInjection<CloudType>& im);
+
+        //- Construct and return a clone
+        virtual autoPtr<InjectionModel<CloudType> > clone() const
+        {
+            return autoPtr<InjectionModel<CloudType> >
+            (
+                new ManualInjection<CloudType>(*this)
+            );
+        }
 
 
     //- Destructor
@@ -127,9 +127,6 @@ public:
 
     // Member Functions
 
-        //- Flag to indicate whether model activates injection model
-        bool active() const;
-
         //- Return the end-of-injection time
         scalar timeEnd() const;
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C
index 8391c3654b633b2b1ca6d56ae89f92aa7becda0a..ffc26963dd25ea9fa963eacdc24b5d4bf4173bd0 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C
@@ -63,6 +63,13 @@ Foam::NoInjection<CloudType>::NoInjection
 {}
 
 
+template<class CloudType>
+Foam::NoInjection<CloudType>::NoInjection(const NoInjection<CloudType>& im)
+:
+    InjectionModel<CloudType>(im.owner_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H
index c16a9367785ff5abfb735682fc5cdec156c30beb..4a33d230545dca474e83ba36fefd9a852a3c0f69 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H
@@ -56,18 +56,10 @@ protected:
     // Protected Member Functions
 
         //- Number of parcels to introduce over the time step relative to SOI
-        label parcelsToInject
-        (
-            const scalar,
-            const scalar
-        );
+        virtual label parcelsToInject(const scalar, const scalar);
 
         //- Volume of parcels to introduce over the time step relative to SOI
-        scalar volumeToInject
-        (
-            const scalar,
-            const scalar
-        );
+        virtual scalar volumeToInject(const scalar, const scalar);
 
 
 public:
@@ -79,11 +71,19 @@ public:
     // Constructors
 
         //- Construct from components
-        NoInjection
-        (
-            const dictionary&,
-            CloudType&
-        );
+        NoInjection(const dictionary&, CloudType&);
+
+        //- Construct copy
+        NoInjection(const NoInjection<CloudType>& im);
+
+        //- Construct and return a clone
+        virtual autoPtr<InjectionModel<CloudType> > clone() const
+        {
+            return autoPtr<InjectionModel<CloudType> >
+            (
+                new NoInjection<CloudType>(*this)
+            );
+        }
 
 
     //- Destructor
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/PatchInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/PatchInjection.C
index 088546930733dbc406830eb839272e56fd7a99c0..73de293b433c630e43ec353a451ef783b9fc60da 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/PatchInjection.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/PatchInjection.C
@@ -76,6 +76,7 @@ Foam::PatchInjection<CloudType>::PatchInjection
 :
     InjectionModel<CloudType>(dict, owner, typeName),
     patchName_(this->coeffDict().lookup("patchName")),
+    patchId_(owner.mesh().boundaryMesh().findPatchID(patchName_)),
     duration_(readScalar(this->coeffDict().lookup("duration"))),
     parcelsPerSecond_
     (
@@ -84,26 +85,16 @@ Foam::PatchInjection<CloudType>::PatchInjection
     U0_(this->coeffDict().lookup("U0")),
     flowRateProfile_
     (
-        DataEntry<scalar>::New
-        (
-            "flowRateProfile",
-            this->coeffDict()
-        )
+        DataEntry<scalar>::New("flowRateProfile", this->coeffDict())
     ),
     parcelPDF_
     (
-        pdfs::pdf::New
-        (
-            this->coeffDict().subDict("parcelPDF"),
-            owner.rndGen()
-        )
+        pdfs::pdf::New(this->coeffDict().subDict("parcelPDF"), owner.rndGen())
     ),
-    injectorCells_(),
+    cellOwners_(),
     fraction_(1.0)
 {
-    const label patchId = owner.mesh().boundaryMesh().findPatchID(patchName_);
-
-    if (patchId < 0)
+    if (patchId_ < 0)
     {
         FatalErrorIn
         (
@@ -117,11 +108,11 @@ Foam::PatchInjection<CloudType>::PatchInjection
             << nl << exit(FatalError);
     }
 
-    const polyPatch& patch = owner.mesh().boundaryMesh()[patchId];
+    const polyPatch& patch = owner.mesh().boundaryMesh()[patchId_];
 
-    injectorCells_ = patch.faceCells();
+    cellOwners_ = patch.faceCells();
 
-    label patchSize = injectorCells_.size();
+    label patchSize = cellOwners_.size();
     label totalPatchSize = patchSize;
     reduce(totalPatchSize, sumOp<label>());
     fraction_ = scalar(patchSize)/totalPatchSize;
@@ -132,6 +123,25 @@ Foam::PatchInjection<CloudType>::PatchInjection
 }
 
 
+template<class CloudType>
+Foam::PatchInjection<CloudType>::PatchInjection
+(
+    const PatchInjection<CloudType>& im
+)
+:
+    InjectionModel<CloudType>(im),
+    patchName_(im.patchName_),
+    patchId_(im.patchId_),
+    duration_(im.duration_),
+    parcelsPerSecond_(im.parcelsPerSecond_),
+    U0_(im.U0_),
+    flowRateProfile_(im.flowRateProfile_().clone().ptr()),
+    parcelPDF_(im.parcelPDF_().clone().ptr()),
+    cellOwners_(im.cellOwners_),
+    fraction_(im.fraction_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
@@ -141,13 +151,6 @@ Foam::PatchInjection<CloudType>::~PatchInjection()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-template<class CloudType>
-bool Foam::PatchInjection<CloudType>::active() const
-{
-    return true;
-}
-
-
 template<class CloudType>
 Foam::scalar Foam::PatchInjection<CloudType>::timeEnd() const
 {
@@ -167,26 +170,29 @@ void Foam::PatchInjection<CloudType>::setPositionAndCell
     label& tetPtI
 )
 {
-    if (injectorCells_.size() > 0)
+    if (cellOwners_.size() > 0)
     {
-        label cellI = this->owner().rndGen().integer
-        (
-            0,
-            injectorCells_.size() - 1
-        );
-
-        cellOwner = injectorCells_[cellI];
-
-        // The position is at the cell centre, which could be in any
-        // tet of the decomposed cell, so arbitrarily choose the first
-        // face of the cell as the tetFace and the first point after
-        // the base point on the face as the tetPt.  The tracking will
-        // pick the cell consistent with the motion in the first
-        // tracking step.
+        cachedRandom& rnd = this->owner().rndGen();
+        label cellI = rnd.position<label>(0, cellOwners_.size() - 1);
+
+        cellOwner = cellOwners_[cellI];
+
+        // The position is between the face and cell centre, which could be
+        // in any tet of the decomposed cell, so arbitrarily choose the first
+        // face of the cell as the tetFace and the first point after the base
+        // point on the face as the tetPt.  The tracking will pick the cell
+        // consistent with the motion in the firsttracking step.
         tetFaceI = this->owner().mesh().cells()[cellOwner][0];
         tetPtI = 1;
 
-        position = this->owner().mesh().C()[cellOwner];
+        // position perturbed between cell and patch face centres
+        const vector& pc = this->owner().mesh().C()[cellOwner];
+        const vector& pf =
+            this->owner().mesh().Cf().boundaryField()[patchId_][cellI];
+
+        const scalar a = rnd.sample01<scalar>();
+        const vector d = pf - pc;
+        position = pc + 0.5*a*d;
     }
     else
     {
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/PatchInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/PatchInjection.H
index 85dbb2fcb63b11e7d8bb08067e0ae8f88af2439a..05b1236a8a41f2e0f6d18c9f1a30552af005b078 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/PatchInjection.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/PatchInjection.H
@@ -70,6 +70,9 @@ class PatchInjection
         //- Name of patch
         const word patchName_;
 
+        //- Id of patch
+        const label patchId_;
+
         //- Injection duration [s]
         const scalar duration_;
 
@@ -86,7 +89,7 @@ class PatchInjection
         const autoPtr<pdfs::pdf> parcelPDF_;
 
         //- List of cell labels corresponding to injector positions
-        labelList injectorCells_;
+        labelList cellOwners_;
 
         //- Fraction of injection controlled by this processor
         scalar fraction_;
@@ -97,18 +100,10 @@ protected:
     // Protected Member Functions
 
         //- Number of parcels to introduce over the time step relative to SOI
-        label parcelsToInject
-        (
-            const scalar time0,
-            const scalar time1
-        );
+        virtual label parcelsToInject(const scalar time0, const scalar time1);
 
         //- Volume of parcels to introduce over the time step relative to SOI
-        scalar volumeToInject
-        (
-            const scalar time0,
-            const scalar time1
-        );
+        virtual scalar volumeToInject(const scalar time0, const scalar time1);
 
 
 public:
@@ -120,11 +115,19 @@ public:
     // Constructors
 
         //- Construct from dictionary
-        PatchInjection
-        (
-            const dictionary& dict,
-            CloudType& owner
-        );
+        PatchInjection(const dictionary& dict, CloudType& owner);
+
+        //- Construct copy
+        PatchInjection(const PatchInjection<CloudType>& im);
+
+        //- Construct and return a clone
+        virtual autoPtr<InjectionModel<CloudType> > clone() const
+        {
+            return autoPtr<InjectionModel<CloudType> >
+            (
+                new PatchInjection<CloudType>(*this)
+            );
+        }
 
 
     //- Destructor
@@ -133,9 +136,6 @@ public:
 
     // Member Functions
 
-        //- Flag to indicate whether model activates injection model
-        bool active() const;
-
         //- Return the end-of-injection time
         scalar timeEnd() const;
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/LocalInteraction/LocalInteraction.C b/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/LocalInteraction/LocalInteraction.C
index 0786df08a758aef50dd6eb53b9af7d0c9cfe7208..f331cdce73cfc57a657aada271d1162976fbefc7 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/LocalInteraction/LocalInteraction.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/LocalInteraction/LocalInteraction.C
@@ -55,16 +55,16 @@ Foam::LocalInteraction<CloudType>::LocalInteraction
 )
 :
     PatchInteractionModel<CloudType>(dict, cloud, typeName),
-    patchProperties_(this->coeffDict().lookup("patches")),
-    patchIds_(patchProperties_.size())
+    patchData_(this->coeffDict().lookup("patches")),
+    patchIds_(patchData_.size())
 {
     const polyMesh& mesh = cloud.mesh();
     const polyBoundaryMesh& bMesh = mesh.boundaryMesh();
 
     // check that user patches are valid region patches
-    forAll(patchProperties_, patchI)
+    forAll(patchData_, patchI)
     {
-        const word& patchName = patchProperties_[patchI].patchName();
+        const word& patchName = patchData_[patchI].patchName();
         patchIds_[patchI] = bMesh.findPatchID(patchName);
         if (patchIds_[patchI] < 0)
         {
@@ -97,16 +97,16 @@ Foam::LocalInteraction<CloudType>::LocalInteraction
     }
 
     // check that interactions are valid/specified
-    forAll(patchProperties_, patchI)
+    forAll(patchData_, patchI)
     {
         const word& interactionTypeName =
-            patchProperties_[patchI].interactionTypeName();
+            patchData_[patchI].interactionTypeName();
         const typename PatchInteractionModel<CloudType>::interactionType& it =
             this->wordToInteractionType(interactionTypeName);
 
         if (it == PatchInteractionModel<CloudType>::itOther)
         {
-            const word& patchName = patchProperties_[patchI].patchName();
+            const word& patchName = patchData_[patchI].patchName();
             FatalErrorIn("LocalInteraction(const dictionary&, CloudType&)")
                 << "Unknown patch interaction type "
                 << interactionTypeName << " for patch " << patchName
@@ -118,6 +118,18 @@ Foam::LocalInteraction<CloudType>::LocalInteraction
 }
 
 
+template<class CloudType>
+Foam::LocalInteraction<CloudType>::LocalInteraction
+(
+    const LocalInteraction<CloudType>& pim
+)
+:
+    PatchInteractionModel<CloudType>(pim),
+    patchData_(pim.patchData_),
+    patchIds_(pim.patchIds_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template <class CloudType>
@@ -127,13 +139,6 @@ Foam::LocalInteraction<CloudType>::~LocalInteraction()
 
 // * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
 
-template<class CloudType>
-bool Foam::LocalInteraction<CloudType>::active() const
-{
-    return true;
-}
-
-
 template <class CloudType>
 bool Foam::LocalInteraction<CloudType>::correct
 (
@@ -155,7 +160,7 @@ bool Foam::LocalInteraction<CloudType>::correct
         typename PatchInteractionModel<CloudType>::interactionType it =
             this->wordToInteractionType
             (
-                patchProperties_[patchI].interactionTypeName()
+                patchData_[patchI].interactionTypeName()
             );
 
         switch (it)
@@ -192,10 +197,10 @@ bool Foam::LocalInteraction<CloudType>::correct
 
                 if (Un > 0)
                 {
-                    U -= (1.0 + patchProperties_[patchI].e())*Un*nw;
+                    U -= (1.0 + patchData_[patchI].e())*Un*nw;
                 }
 
-                U -= patchProperties_[patchI].mu()*Ut;
+                U -= patchData_[patchI].mu()*Ut;
 
                 // Return velocity to global space
                 U += Up;
@@ -208,15 +213,16 @@ bool Foam::LocalInteraction<CloudType>::correct
                 (
                     "bool LocalInteraction<CloudType>::correct"
                     "("
+                        "typename CloudType::parcelType&, "
                         "const polyPatch&, "
-                        "const label, "
                         "bool&, "
-                        "vector&"
+                        "scalar&, "
+                        "const tetIndices&"
                     ") const"
                 )   << "Unknown interaction type "
-                    << patchProperties_[patchI].interactionTypeName()
+                    << patchData_[patchI].interactionTypeName()
                     << "(" << it << ") for patch "
-                    << patchProperties_[patchI].patchName()
+                    << patchData_[patchI].patchName()
                     << ". Valid selections are:" << this->interactionTypeNames_
                     << endl << abort(FatalError);
             }
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/LocalInteraction/LocalInteraction.H b/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/LocalInteraction/LocalInteraction.H
index 7b5446209acda9a5e6df7cb1c32d079496227750..5fe6d719ef128315ef20f6dac4d92ed61baba9cd 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/LocalInteraction/LocalInteraction.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/LocalInteraction/LocalInteraction.H
@@ -51,7 +51,7 @@ class LocalInteraction
     // Private data
 
         //- List of participating patches
-        const List<patchInteractionData> patchProperties_;
+        const List<patchInteractionData> patchData_;
 
         //- List of participating patch ids
         List<label> patchIds_;
@@ -73,7 +73,19 @@ public:
     // Constructors
 
         //- Construct from dictionary
-        LocalInteraction(const dictionary& dict, CloudType& cloud);
+        LocalInteraction(const dictionary& dict, CloudType& owner);
+
+        //- Construct copy from owner cloud and patch interaction model
+        LocalInteraction(const LocalInteraction<CloudType>& pim);
+
+        //- Construct and return a clone using supplied owner cloud
+        virtual autoPtr<PatchInteractionModel<CloudType> > clone() const
+        {
+            return autoPtr<PatchInteractionModel<CloudType> >
+            (
+                new LocalInteraction<CloudType>(*this)
+            );
+        }
 
 
     //- Destructor
@@ -82,9 +94,6 @@ public:
 
     // Member Functions
 
-        //- Flag to indicate whether model activates patch interaction model
-        virtual bool active() const;
-
         //- Apply velocity correction
         //  Returns true if particle remains in same cell
         virtual bool correct
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/LocalInteraction/patchInteractionData.H b/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/LocalInteraction/patchInteractionData.H
index 661171e68af9e32cba27501c4f9c09a7299a9523..6b76a69592a0882e5dfb6b655ce895776370a8e9 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/LocalInteraction/patchInteractionData.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/LocalInteraction/patchInteractionData.H
@@ -103,46 +103,7 @@ public:
                 Istream& is,
                 patchInteractionData& pid
             );
-/*            {
-                is.check
-                (
-                    "Istream& operator>>"
-                    "(Istream&, patchInteractionData&)"
-                );
-
-                const dictionaryEntry entry(dictionary::null, is);
-
-                pid.patchName_ = entry.keyword();
-                entry.lookup("type") >> pid.interactionTypeName_;
-                pid.e_ = entry.lookupOrDefault<scalar>("e", 1.0);
-                pid.mu_ = entry.lookupOrDefault<scalar>("mu", 0.0);
-
-                if
-                (
-                    PatchInteractionModel<CloudType>::wordToInteractionType
-                    (
-                        pid.interactionTypeName_
-                    )
-                == PatchInteractionModel<CloudType>::itOther)
-                {
-                    FatalErrorIn
-                    (
-                        "friend Istream& operator>>"
-                        "("
-                            "Istream&, "
-                            "patchInteractionData&"
-                        ")"
-                    )   << "Unknown patch interaction type "
-                        << pid.interactionTypeName_
-                        << ". Valid selections are:"
-                        << PatchInteractionModel<CloudType>::
-                        interactionTypeNames_
-                        << endl << abort(FatalError);
-                }
-
-                return is;
-            }
-*/};
+};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/PatchInteractionModel/PatchInteractionModel.C b/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/PatchInteractionModel/PatchInteractionModel.C
index 0eca6dea6657a23f902587914c003ef7557fcb13..ff6d20dccbe240641c5a8a2765826c17e049aed5 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/PatchInteractionModel/PatchInteractionModel.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/PatchInteractionModel/PatchInteractionModel.C
@@ -104,6 +104,17 @@ Foam::PatchInteractionModel<CloudType>::wordToInteractionType
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
+template<class CloudType>
+Foam::PatchInteractionModel<CloudType>::PatchInteractionModel
+(
+    CloudType& owner
+)
+:
+    SubModelBase<CloudType>(owner),
+    UName_("unknown_UName")
+{}
+
+
 template<class CloudType>
 Foam::PatchInteractionModel<CloudType>::PatchInteractionModel
 (
@@ -112,49 +123,61 @@ Foam::PatchInteractionModel<CloudType>::PatchInteractionModel
     const word& type
 )
 :
-    dict_(dict),
-    owner_(owner),
-    coeffDict_(dict.subDict(type + "Coeffs")),
-    UName_(coeffDict_.lookupOrDefault<word>("UName", "U"))
+    SubModelBase<CloudType>(owner, dict, type),
+//    UName_(this->coeffDict().lookupOrDefault<word>("UName", "U"))
+    UName_(this->coeffDict().lookup("UName"))
 {}
 
 
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
-
 template<class CloudType>
-Foam::PatchInteractionModel<CloudType>::~PatchInteractionModel()
+Foam::PatchInteractionModel<CloudType>::PatchInteractionModel
+(
+    const PatchInteractionModel<CloudType>& pim
+)
+:
+    SubModelBase<CloudType>(pim),
+    UName_(pim.UName_)
 {}
 
 
-// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
-const CloudType&
-Foam::PatchInteractionModel<CloudType>::owner() const
-{
-    return owner_;
-}
-
+Foam::PatchInteractionModel<CloudType>::~PatchInteractionModel()
+{}
 
-template<class CloudType>
-const Foam::dictionary& Foam::PatchInteractionModel<CloudType>::dict() const
-{
-    return dict_;
-}
 
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class CloudType>
-const Foam::dictionary&
-Foam::PatchInteractionModel<CloudType>::coeffDict() const
+const Foam::word& Foam::PatchInteractionModel<CloudType>::UName() const
 {
-    return coeffDict_;
+    return UName_;
 }
 
 
 template<class CloudType>
-const Foam::word& Foam::PatchInteractionModel<CloudType>::UName() const
+bool Foam::PatchInteractionModel<CloudType>::correct
+(
+    typename CloudType::parcelType&,
+    const polyPatch&,
+    bool&,
+    const scalar,
+    const tetIndices&
+) const
 {
-    return UName_;
+    notImplemented
+    (
+        "bool Foam::PatchInteractionModel<CloudType>::correct"
+        "("
+            "typename CloudType::parcelType&, "
+            "const polyPatch&, "
+            "bool&, "
+            "const scalar, "
+            "const tetIndices& "
+        ") const"
+    );
+    return false;
 }
 
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/PatchInteractionModel/PatchInteractionModel.H b/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/PatchInteractionModel/PatchInteractionModel.H
index c3c883eaeb84631c728e00cd75d3208f6c6d9f62..daa3d1e6638019112c32b99d531dac76bf0d9363 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/PatchInteractionModel/PatchInteractionModel.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/PatchInteractionModel/PatchInteractionModel.H
@@ -42,6 +42,7 @@ SourceFiles
 #include "polyPatch.H"
 #include "wallPolyPatch.H"
 #include "tetIndices.H"
+#include "SubModelBase.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -54,6 +55,8 @@ namespace Foam
 
 template<class CloudType>
 class PatchInteractionModel
+:
+    public SubModelBase<CloudType>
 {
 public:
 
@@ -75,15 +78,6 @@ private:
 
     // Private data
 
-        //- The cloud dictionary
-        const dictionary& dict_;
-
-        //- Reference to the owner cloud class
-        CloudType& owner_;
-
-        //- The coefficients dictionary
-        const dictionary coeffDict_;
-
         //- Name of velocity field - default = "U"
         const word UName_;
 
@@ -109,6 +103,9 @@ public:
 
     // Constructors
 
+        //- Construct null from owner
+        PatchInteractionModel(CloudType& owner);
+
         //- Construct from components
         PatchInteractionModel
         (
@@ -117,6 +114,18 @@ public:
             const word& type
         );
 
+        //- Construct copy
+        PatchInteractionModel(const PatchInteractionModel<CloudType>& pim);
+
+        //- Construct and return a clone
+        virtual autoPtr<PatchInteractionModel<CloudType> > clone() const
+        {
+            return autoPtr<PatchInteractionModel<CloudType> >
+            (
+                new PatchInteractionModel<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~PatchInteractionModel();
@@ -132,15 +141,6 @@ public:
 
     // Access
 
-        //- Return the owner cloud object
-        const CloudType& owner() const;
-
-        //- Return the dictionary
-        const dictionary& dict() const;
-
-        //- Return the coefficients dictionary
-        const dictionary& coeffDict() const;
-
         //- Return name of velocity field
         const word& UName() const;
 
@@ -153,9 +153,6 @@ public:
         //- Convert word to interaction result
         static interactionType wordToInteractionType(const word& itWord);
 
-        //- Flag to indicate whether model activates patch interaction model
-        virtual bool active() const = 0;
-
         //- Apply velocity correction
         //  Returns true if particle remains in same cell
         virtual bool correct
@@ -165,7 +162,7 @@ public:
             bool& keepParticle,
             const scalar trackFraction,
             const tetIndices& tetIs
-        ) const = 0;
+        ) const;
 
         //- Calculate the patch normal and velocity to interact with,
         //  accounting for patch motion if required.
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/Rebound/Rebound.C b/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/Rebound/Rebound.C
index 69b3749429cac63506174ad21327c0a1f95f2033..be60656329865fe0dbd16a56aaa5b21b3c2dacf5 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/Rebound/Rebound.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/Rebound/Rebound.C
@@ -39,6 +39,14 @@ Foam::Rebound<CloudType>::Rebound
 {}
 
 
+template<class CloudType>
+Foam::Rebound<CloudType>::Rebound(const Rebound<CloudType>& pim)
+:
+    PatchInteractionModel<CloudType>(pim),
+    UFactor_(pim.UFactor_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
@@ -48,13 +56,6 @@ Foam::Rebound<CloudType>::~Rebound()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-template<class CloudType>
-bool Foam::Rebound<CloudType>::active() const
-{
-    return true;
-}
-
-
 template<class CloudType>
 bool Foam::Rebound<CloudType>::correct
 (
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/Rebound/Rebound.H b/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/Rebound/Rebound.H
index c1ca658470aec4bc8a8433abf90ed117d957840a..20fa72e7c57ccaeb9060f4ec334a0f0f9227d40d 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/Rebound/Rebound.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/Rebound/Rebound.H
@@ -62,19 +62,28 @@ public:
 
     // Constructors
 
+        //- Construct from dictionary
         //- Construct from dictionary
         Rebound(const dictionary& dict, CloudType& cloud);
 
+        //- Construct copy
+        Rebound(const Rebound<CloudType>& pim);
+
+        //- Construct and return a clone
+        virtual autoPtr<PatchInteractionModel<CloudType> > clone() const
+        {
+            return autoPtr<PatchInteractionModel<CloudType> >
+            (
+                new Rebound<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~Rebound();
 
 
     // Member Functions
-
-        //- Flag to indicate whether model activates patch interaction model
-        virtual bool active() const;
-
         //- Apply velocity correction
         //  Returns true if particle remains in same cell
         virtual bool correct
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/StandardWallInteraction/StandardWallInteraction.C b/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/StandardWallInteraction/StandardWallInteraction.C
index 7d2b11cdca428e8e9ccd4d6125d714430eb2dc17..c55dafd83da05f9e854b7e4a95d30c35bebe3cd4 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/StandardWallInteraction/StandardWallInteraction.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/StandardWallInteraction/StandardWallInteraction.C
@@ -76,6 +76,19 @@ Foam::StandardWallInteraction<CloudType>::StandardWallInteraction
 }
 
 
+template<class CloudType>
+Foam::StandardWallInteraction<CloudType>::StandardWallInteraction
+(
+    const StandardWallInteraction<CloudType>& pim
+)
+:
+    PatchInteractionModel<CloudType>(pim),
+    interactionType_(pim.interactionType_),
+    e_(pim.e_),
+    mu_(pim.mu_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template <class CloudType>
@@ -85,13 +98,6 @@ Foam::StandardWallInteraction<CloudType>::~StandardWallInteraction()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-template<class CloudType>
-bool Foam::StandardWallInteraction<CloudType>::active() const
-{
-    return true;
-}
-
-
 template <class CloudType>
 bool Foam::StandardWallInteraction<CloudType>::correct
 (
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/StandardWallInteraction/StandardWallInteraction.H b/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/StandardWallInteraction/StandardWallInteraction.H
index bae46785ea2a86e486428f1634983e7d6a22d697..4a6ed569b22a50a25007992c7a843dcc1feeb324 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/StandardWallInteraction/StandardWallInteraction.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/StandardWallInteraction/StandardWallInteraction.H
@@ -85,6 +85,18 @@ public:
         //- Construct from dictionary
         StandardWallInteraction(const dictionary& dict, CloudType& cloud);
 
+        //- Construct copy from owner cloud and patch interaction model
+        StandardWallInteraction(const StandardWallInteraction<CloudType>& pim);
+
+        //- Construct and return a clone using supplied owner cloud
+        virtual autoPtr<PatchInteractionModel<CloudType> > clone() const
+        {
+            return autoPtr<PatchInteractionModel<CloudType> >
+            (
+                new StandardWallInteraction<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~StandardWallInteraction();
@@ -92,9 +104,6 @@ public:
 
     // Member Functions
 
-        //- Flag to indicate whether model activates patch interaction model
-        virtual bool active() const;
-
         //- Apply velocity correction
         //  Returns true if particle remains in same cell
         virtual bool correct
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/NoPostProcessing/NoPostProcessing.C b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/NoPostProcessing/NoPostProcessing.C
index 98211b4c25a0acb375ea33de8b7aee85cf316431..c00cbc4c0ffbe6cc4984f2e4abc7d0a7a7b5f00f 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/NoPostProcessing/NoPostProcessing.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/NoPostProcessing/NoPostProcessing.C
@@ -30,7 +30,7 @@ License
 template<class CloudType>
 void Foam::NoPostProcessing<CloudType>::write()
 {
-// do nothing
+    // do nothing
 }
 
 
@@ -47,6 +47,16 @@ Foam::NoPostProcessing<CloudType>::NoPostProcessing
 {}
 
 
+template<class CloudType>
+Foam::NoPostProcessing<CloudType>::NoPostProcessing
+(
+    const NoPostProcessing<CloudType>& ppm
+)
+:
+    PostProcessingModel<CloudType>(ppm.owner_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
@@ -70,7 +80,17 @@ void Foam::NoPostProcessing<CloudType>::postPatch
     const label
 )
 {
-// do nothing
+    // do nothing
+}
+
+
+template<class CloudType>
+void Foam::NoPostProcessing<CloudType>::postFace
+(
+    const typename CloudType::parcelType&
+)
+{
+    // do nothing
 }
 
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/NoPostProcessing/NoPostProcessing.H b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/NoPostProcessing/NoPostProcessing.H
index fad85a44875d7963e15ef4d585d1e53459b61b56..bec8d997e12d75ee1427a26deb91d6105adf3d12 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/NoPostProcessing/NoPostProcessing.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/NoPostProcessing/NoPostProcessing.H
@@ -70,6 +70,18 @@ public:
         //- Construct from components
         NoPostProcessing(const dictionary&, CloudType&);
 
+        //- Construct copy
+        NoPostProcessing(const NoPostProcessing<CloudType>& ppm);
+
+        //- Construct and return a clone
+        virtual autoPtr<PostProcessingModel<CloudType> > clone() const
+        {
+            return autoPtr<PostProcessingModel<CloudType> >
+            (
+                new NoPostProcessing<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~NoPostProcessing();
@@ -88,6 +100,9 @@ public:
                 const typename CloudType::parcelType& p,
                 const label patchI
             );
+
+            //- Gather particle data when hit face
+            virtual void postFace(const typename CloudType::parcelType& p);
 };
 
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/PatchPostProcessing/PatchPostProcessing.C b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/PatchPostProcessing/PatchPostProcessing.C
index 9e6b0b10d6a581324f2a5be07f067ca8afa42228..2832732c67ec874997f3f775cbd7cde40a3e807a 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/PatchPostProcessing/PatchPostProcessing.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/PatchPostProcessing/PatchPostProcessing.C
@@ -61,20 +61,20 @@ void Foam::PatchPostProcessing<CloudType>::write()
 
         if (Pstream::master())
         {
-            fileName outputDir;
+            fileName outputDir = this->owner().time().path();
 
             if (Pstream::parRun())
             {
                 // Put in undecomposed case (Note: gives problems for
                 // distributed data running)
                 outputDir =
-                    mesh_.time().path()/".."/"postProcessing"/cloud::prefix/
+                    outputDir/".."/"postProcessing"/cloud::prefix/
                     this->owner().name()/this->owner().time().timeName();
             }
             else
             {
                 outputDir =
-                    mesh_.time().path()/"postProcessing"/cloud::prefix/
+                    outputDir/"postProcessing"/cloud::prefix/
                     this->owner().name()/this->owner().time().timeName();
             }
 
@@ -86,7 +86,7 @@ void Foam::PatchPostProcessing<CloudType>::write()
                 outputDir/patchNames_[patchI] + ".post",
                 IOstream::ASCII,
                 IOstream::currentVersion,
-                mesh_.time().writeCompression()
+                this->owner().time().writeCompression()
             );
 
             List<string> globalData;
@@ -120,15 +120,15 @@ Foam::PatchPostProcessing<CloudType>::PatchPostProcessing
 )
 :
     PostProcessingModel<CloudType>(dict, owner, typeName),
-    mesh_(owner.mesh()),
     maxStoredParcels_(readLabel(this->coeffDict().lookup("maxStoredParcels"))),
     patchNames_(this->coeffDict().lookup("patches")),
     patchData_(patchNames_.size()),
     patchIds_(patchNames_.size())
 {
+    const polyBoundaryMesh& bMesh = this->owner().mesh().boundaryMesh();
     forAll(patchNames_, patchI)
     {
-        const label id = mesh_.boundaryMesh().findPatchID(patchNames_[patchI]);
+        const label id = bMesh.findPatchID(patchNames_[patchI]);
         if (id < 0)
         {
             FatalErrorIn
@@ -139,7 +139,7 @@ Foam::PatchPostProcessing<CloudType>::PatchPostProcessing
                     "CloudType& owner"
                 ")"
             )<< "Requested patch " << patchNames_[patchI] << " not found" << nl
-             << "Available patches are: " << mesh_.boundaryMesh().names() << nl
+             << "Available patches are: " << bMesh.names() << nl
              << exit(FatalError);
         }
         patchIds_[patchI] = id;
@@ -147,6 +147,20 @@ Foam::PatchPostProcessing<CloudType>::PatchPostProcessing
 }
 
 
+template<class CloudType>
+Foam::PatchPostProcessing<CloudType>::PatchPostProcessing
+(
+    const PatchPostProcessing<CloudType>& ppm
+)
+:
+    PostProcessingModel<CloudType>(ppm),
+    maxStoredParcels_(ppm.maxStoredParcels_),
+    patchNames_(ppm.patchNames_),
+    patchData_(ppm.patchData_),
+    patchIds_(ppm.patchIds_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
@@ -156,13 +170,6 @@ Foam::PatchPostProcessing<CloudType>::~PatchPostProcessing()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-template<class CloudType>
-bool Foam::PatchPostProcessing<CloudType>::active() const
-{
-    return true;
-}
-
-
 template<class CloudType>
 void Foam::PatchPostProcessing<CloudType>::postPatch
 (
@@ -180,4 +187,9 @@ void Foam::PatchPostProcessing<CloudType>::postPatch
 }
 
 
+template<class CloudType>
+void Foam::PatchPostProcessing<CloudType>::postFace(const parcelType&)
+{}
+
+
 // ************************************************************************* //
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/PatchPostProcessing/PatchPostProcessing.H b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/PatchPostProcessing/PatchPostProcessing.H
index 9cc1b3ef407294a530273740529d24a2b83f74f8..fbfd6b6231f5354cacbc39b6f249a309ef0586de 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/PatchPostProcessing/PatchPostProcessing.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/PatchPostProcessing/PatchPostProcessing.H
@@ -55,9 +55,6 @@ class PatchPostProcessing
 
         typedef typename CloudType::parcelType parcelType;
 
-        //- Reference to the mesh
-        const polyMesh& mesh_;
-
         //- Maximum number of parcels to store
         label maxStoredParcels_;
 
@@ -96,6 +93,18 @@ public:
         //- Construct from dictionary
         PatchPostProcessing(const dictionary& dict, CloudType& owner);
 
+        //- Construct copy
+        PatchPostProcessing(const PatchPostProcessing<CloudType>& ppm);
+
+        //- Construct and return a clone
+        virtual autoPtr<PostProcessingModel<CloudType> > clone() const
+        {
+            return autoPtr<PostProcessingModel<CloudType> >
+            (
+                new PatchPostProcessing<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~PatchPostProcessing();
@@ -105,9 +114,6 @@ public:
 
         // Access
 
-            //- Return const access to the mesh
-            inline const polyMesh& mesh() const;
-
             //- Return maximum number of parcels to store per patch
             inline label maxStoredParcels() const;
 
@@ -120,15 +126,11 @@ public:
 
         // Evaluation
 
-            //- Flag to indicate whether model activates post-processing model
-            virtual bool active() const;
-
             //- Gather post-processing info on patch
-            virtual void postPatch
-            (
-                const parcelType& p,
-                const label patchI
-            );
+            virtual void postPatch(const parcelType& p, const label patchI);
+
+            //- Gather particle data when hit face - not used
+            virtual void postFace(const parcelType& p);
 };
 
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/PatchPostProcessing/PatchPostProcessingI.H b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/PatchPostProcessing/PatchPostProcessingI.H
index 4365b87c330308a50fa910871688a672ab84e780..3415904d3cee5017a52e901a292ad6dd1ce2b8f9 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/PatchPostProcessing/PatchPostProcessingI.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/PatchPostProcessing/PatchPostProcessingI.H
@@ -23,13 +23,6 @@ License
 
 \*---------------------------------------------------------------------------*/
 
-template<class CloudType>
-const Foam::polyMesh& Foam::PatchPostProcessing<CloudType>::mesh() const
-{
-    return mesh_;
-}
-
-
 template<class CloudType>
 Foam::label Foam::PatchPostProcessing<CloudType>::maxStoredParcels() const
 {
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/PostProcessingModel/PostProcessingModel.C b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/PostProcessingModel/PostProcessingModel.C
index 701af4757b7c0ce3c09e542afbee64d1c0e4e919..eb0b60ca282290cccfdf50b2e7f50b053fe35a17 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/PostProcessingModel/PostProcessingModel.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/PostProcessingModel/PostProcessingModel.C
@@ -25,14 +25,21 @@ License
 
 #include "PostProcessingModel.H"
 
+// * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * * //
+
+template<class CloudType>
+void Foam::PostProcessingModel<CloudType>::write()
+{
+    notImplemented("void Foam::PostProcessingModel<CloudType>::write()");
+}
+
+
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
 template<class CloudType>
 Foam::PostProcessingModel<CloudType>::PostProcessingModel(CloudType& owner)
 :
-    dict_(dictionary::null),
-    owner_(owner),
-    coeffDict_(dictionary::null)
+    SubModelBase<CloudType>(owner)
 {}
 
 
@@ -44,9 +51,17 @@ Foam::PostProcessingModel<CloudType>::PostProcessingModel
     const word& type
 )
 :
-    dict_(dict),
-    owner_(owner),
-    coeffDict_(dict.subDict(type + "Coeffs"))
+    SubModelBase<CloudType>(owner, dict, type)
+{}
+
+
+template<class CloudType>
+Foam::PostProcessingModel<CloudType>::PostProcessingModel
+(
+    const PostProcessingModel<CloudType>& ppm
+)
+:
+    SubModelBase<CloudType>(ppm)
 {}
 
 
@@ -62,13 +77,47 @@ Foam::PostProcessingModel<CloudType>::~PostProcessingModel()
 template<class CloudType>
 void Foam::PostProcessingModel<CloudType>::post()
 {
-    if (owner_.time().outputTime())
+    if (this->owner().time().outputTime())
     {
         this->write();
     }
 }
 
 
+template<class CloudType>
+void Foam::PostProcessingModel<CloudType>::postPatch
+(
+    const typename CloudType::parcelType&,
+    const label
+)
+{
+    notImplemented
+    (
+        "void Foam::PostProcessingModel<CloudType>::postPatch"
+        "("
+            "const typename CloudType::parcelType&,"
+            "const label"
+        ")"
+    );
+}
+
+
+template<class CloudType>
+void Foam::PostProcessingModel<CloudType>::postFace
+(
+    const typename CloudType::parcelType&
+)
+{
+    notImplemented
+    (
+        "void Foam::PostProcessingModel<CloudType>::postFace"
+        "("
+            "const typename CloudType::parcelType&"
+        ")"
+    );
+}
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 #include "PostProcessingModelNew.C"
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/PostProcessingModel/PostProcessingModel.H b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/PostProcessingModel/PostProcessingModel.H
index 0d503bbdc53373bbe0156bd59183683fa4015801..ba8f3bb9ef156a45cb1d8a076e4cb05f4f97137a 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/PostProcessingModel/PostProcessingModel.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/PostProcessingModel/PostProcessingModel.H
@@ -39,6 +39,7 @@ SourceFiles
 #include "IOdictionary.H"
 #include "autoPtr.H"
 #include "runTimeSelectionTables.H"
+#include "SubModelBase.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -51,25 +52,13 @@ namespace Foam
 
 template<class CloudType>
 class PostProcessingModel
+:
+    public SubModelBase<CloudType>
 {
-    // Private data
-
-        //- The cloud dictionary
-        const dictionary& dict_;
-
-        //- Reference to the owner cloud class
-        CloudType& owner_;
-
-        //- The coefficients dictionary
-        const dictionary coeffDict_;
-
-
-protected:
-
     // Protected Member Functions
 
         //- Write post-processing info
-        virtual void write() = 0;
+        virtual void write();
 
 
 public:
@@ -104,6 +93,18 @@ public:
             const word& type
         );
 
+        //- Construct copy
+        PostProcessingModel(const PostProcessingModel<CloudType>& ppm);
+
+        //- Construct and return a clone
+        virtual autoPtr<PostProcessingModel<CloudType> > clone() const
+        {
+            return autoPtr<PostProcessingModel<CloudType> >
+            (
+                new PostProcessingModel<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~PostProcessingModel();
@@ -119,35 +120,20 @@ public:
 
     // Member Functions
 
-        // Access
-
-            //- Return the owner cloud dictionary
-            inline const dictionary& dict() const;
-
-            //- Return const access the owner cloud object
-            inline const CloudType& owner() const;
-
-            //- Return non-const access the owner cloud object for manipulation
-            inline CloudType& owner();
-
-            //- Return the coefficients dictionary
-            inline const dictionary& coeffDict() const;
-
-
         // Evaluation
 
             //- Main post-processing function
             virtual void post();
 
-            //- Flag to indicate whether model activates post-processing model
-            virtual bool active() const = 0;
-
             //- Gather post-processing info on patch
             virtual void postPatch
             (
                 const typename CloudType::parcelType& p,
                 const label patchI
-            ) = 0;
+            );
+
+            //- Gather post-processing info on a face
+            virtual void postFace(const typename CloudType::parcelType& p);
 };
 
 
@@ -177,10 +163,6 @@ public:
             add##SS##CloudType##ParcelType##ConstructorToTable_;
 
 
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-#include "PostProcessingModelI.H"
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 #ifdef NoRepository
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/PostProcessingModel/PostProcessingModelI.H b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/PostProcessingModel/PostProcessingModelI.H
deleted file mode 100644
index 1004d532b811654e4c630281d30e1f9db3b91494..0000000000000000000000000000000000000000
--- a/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/PostProcessingModel/PostProcessingModelI.H
+++ /dev/null
@@ -1,54 +0,0 @@
-/*---------------------------------------------------------------------------*\
-  =========                 |
-  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-   \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2008-2010 OpenCFD Ltd.
-     \\/     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/>.
-
-\*---------------------------------------------------------------------------*/
-
-template<class CloudType>
-const Foam::dictionary& Foam::PostProcessingModel<CloudType>::dict() const
-{
-    return dict_;
-}
-
-
-template<class CloudType>
-const CloudType& Foam::PostProcessingModel<CloudType>::owner() const
-{
-    return owner_;
-}
-
-
-template<class CloudType>
-CloudType& Foam::PostProcessingModel<CloudType>::owner()
-{
-    return owner_;
-}
-
-
-template<class CloudType>
-const Foam::dictionary& Foam::PostProcessingModel<CloudType>::coeffDict() const
-{
-    return coeffDict_;
-}
-
-
-// ************************************************************************* //
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/NoSurfaceFilm/NoSurfaceFilm.C b/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/NoSurfaceFilm/NoSurfaceFilm.C
index 3e647f9fdb4cca19dad3f3aea42b1e311e1168c7..651648ee642cc53ea94e2548781c66120b82ec63 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/NoSurfaceFilm/NoSurfaceFilm.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/NoSurfaceFilm/NoSurfaceFilm.C
@@ -40,6 +40,16 @@ Foam::NoSurfaceFilm<CloudType>::NoSurfaceFilm
 {}
 
 
+template<class CloudType>
+Foam::NoSurfaceFilm<CloudType>::NoSurfaceFilm
+(
+    const NoSurfaceFilm<CloudType>& sfm
+)
+:
+    SurfaceFilmModel<CloudType>(sfm.owner_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/NoSurfaceFilm/NoSurfaceFilm.H b/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/NoSurfaceFilm/NoSurfaceFilm.H
index 0fbbecee3bc564ab32948ad2661b16c8fa316224..9ef7814f825c2b5e11c83be3574b7327fe9b05fb 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/NoSurfaceFilm/NoSurfaceFilm.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/NoSurfaceFilm/NoSurfaceFilm.H
@@ -67,13 +67,20 @@ public:
 
     // Constructors
 
-        //- Construct from components
-        NoSurfaceFilm
-        (
-            const dictionary&,
-            CloudType&,
-            const dimensionedVector&
-        );
+        //- Construct from dictionary
+        NoSurfaceFilm(const dictionary&, CloudType&, const dimensionedVector&);
+
+        //- Construct copy
+        NoSurfaceFilm(const NoSurfaceFilm<CloudType>& dm);
+
+        //- Construct and return a clone
+        virtual autoPtr<SurfaceFilmModel<CloudType> > clone() const
+        {
+            return autoPtr<SurfaceFilmModel<CloudType> >
+            (
+                new NoSurfaceFilm<CloudType>(*this)
+            );
+        }
 
 
     //- Destructor
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModel.C b/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModel.C
index 41d31901cad0a2c095dcb5bcd3d6a2da11382728..d71ab361723695b6358df55f8dcae58f7222e90d 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModel.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModel.C
@@ -35,11 +35,8 @@ using namespace Foam::constant;
 template<class CloudType>
 Foam::SurfaceFilmModel<CloudType>::SurfaceFilmModel(CloudType& owner)
 :
-    dict_(dictionary::null),
-    owner_(owner),
+    SubModelBase<CloudType>(owner),
     g_(dimensionedVector("zero", dimAcceleration, vector::zero)),
-    coeffDict_(dictionary::null),
-    active_(false),
     massParcelPatch_(0),
     diameterParcelPatch_(0),
     UFilmPatch_(0),
@@ -58,11 +55,8 @@ Foam::SurfaceFilmModel<CloudType>::SurfaceFilmModel
     const word& type
 )
 :
-    dict_(dict),
-    owner_(owner),
+    SubModelBase<CloudType>(owner, dict, type),
     g_(g),
-    coeffDict_(dict.subDict(type + "Coeffs")),
-    active_(true),
     massParcelPatch_(0),
     diameterParcelPatch_(0),
     UFilmPatch_(0),
@@ -72,6 +66,23 @@ Foam::SurfaceFilmModel<CloudType>::SurfaceFilmModel
 {}
 
 
+template<class CloudType>
+Foam::SurfaceFilmModel<CloudType>::SurfaceFilmModel
+(
+    const SurfaceFilmModel<CloudType>& sfm
+)
+:
+    SubModelBase<CloudType>(sfm),
+    g_(sfm.g_),
+    massParcelPatch_(sfm.massParcelPatch_),
+    diameterParcelPatch_(sfm.diameterParcelPatch_),
+    UFilmPatch_(sfm.UFilmPatch_),
+    rhoFilmPatch_(sfm.rhoFilmPatch_),
+    nParcelsTransferred_(sfm.nParcelsTransferred_),
+    nParcelsInjected_(sfm.nParcelsInjected_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
@@ -81,11 +92,31 @@ Foam::SurfaceFilmModel<CloudType>::~SurfaceFilmModel()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
+template<class CloudType>
+bool Foam::SurfaceFilmModel<CloudType>::transferParcel
+(
+    const parcelType& p,
+    const label patchI
+)
+{
+    notImplemented
+    (
+        "bool Foam::SurfaceFilmModel<CloudType>::transferParcel"
+        "("
+            "const parcelType&, "
+            "const label"
+        ")"
+    );
+
+    return false;
+}
+
+
 template<class CloudType>
 template<class TrackData>
 void Foam::SurfaceFilmModel<CloudType>::inject(TrackData& td)
 {
-    if (!active_)
+    if (!this->active())
     {
         return;
     }
@@ -201,6 +232,13 @@ void Foam::SurfaceFilmModel<CloudType>::setParcelProperties
 }
 
 
+template<class CloudType>
+void Foam::SurfaceFilmModel<CloudType>::info(Ostream& os) const
+{
+    // do nothing
+}
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 #include "SurfaceFilmModelNew.C"
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModel.H b/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModel.H
index f94c3c29bd9189954ebf402cdac08bdc4fc0756c..25452ce1d7afb3f104f6661752562bd0022ad5cc 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModel.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModel.H
@@ -39,6 +39,7 @@ SourceFiles
 #include "IOdictionary.H"
 #include "autoPtr.H"
 #include "runTimeSelectionTables.H"
+#include "SubModelBase.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -59,6 +60,8 @@ class mapDistribute;
 
 template<class CloudType>
 class SurfaceFilmModel
+:
+    public SubModelBase<CloudType>
 {
 protected:
 
@@ -67,21 +70,9 @@ protected:
         //- Convenience typedef to the cloud's parcel type
         typedef typename CloudType::parcelType parcelType;
 
-        //- The cloud dictionary
-        const dictionary& dict_;
-
-        //- Reference to the owner cloud class
-        CloudType& owner_;
-
         //- Gravitational acceleration constant
         const dimensionedVector& g_;
 
-        //- The coefficients dictionary
-        const dictionary coeffDict_;
-
-        //- Active flag
-        bool active_;
-
 
         // Cached injector fields per film patch
 
@@ -150,7 +141,7 @@ public:
         //- Construct null from owner
         SurfaceFilmModel(CloudType& owner);
 
-        //- Construct from dictionary
+        //- Construct from components
         SurfaceFilmModel
         (
             const dictionary& dict,
@@ -159,6 +150,18 @@ public:
             const word& type
         );
 
+        //- Construct copy
+        SurfaceFilmModel(const SurfaceFilmModel<CloudType>& sfm);
+
+        //- Construct and return a clone
+        virtual autoPtr<SurfaceFilmModel<CloudType> > clone() const
+        {
+            return autoPtr<SurfaceFilmModel<CloudType> >
+            (
+                new SurfaceFilmModel<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~SurfaceFilmModel();
@@ -177,21 +180,9 @@ public:
 
         // Access
 
-            //- Return the owner cloud dictionary
-            inline const dictionary& dict() const;
-
-            //- Return const access the owner cloud object
-            inline const CloudType& owner() const;
-
-            //- Return non-const access the owner cloud object for manipulation
-            inline CloudType& owner();
-
             //- Return gravitational acceleration constant
             inline const dimensionedVector& g() const;
 
-            //- Return the coefficients dictionary
-            inline const dictionary& coeffDict() const;
-
             //- Return const access to the number of parcels transferred to the
             //  film model
             inline label nParcelsTransferred() const;
@@ -211,16 +202,13 @@ public:
 
         // Member Functions
 
-            //- Flag to indicate whether model activates the surface film model
-            virtual bool active() const = 0;
-
             //- Transfer parcel from cloud to surface film
             //  Returns true if parcel is to be transferred
             virtual bool transferParcel
             (
                 const parcelType& p,
                 const label patchI
-            ) = 0;
+            );
 
             //- Inject parcels into the cloud
             template<class TrackData>
@@ -230,7 +218,7 @@ public:
         // I-O
 
             //- Write surface film info to stream
-            virtual void info(Ostream& os) const = 0;
+            virtual void info(Ostream& os) const;
 };
 
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModelI.H b/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModelI.H
index af3deb48e69742ca96378d183f075775e96addb5..f7772480c52354a2ee774119720d03f789495ce6 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModelI.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModelI.H
@@ -27,27 +27,6 @@ License
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-template<class CloudType>
-const Foam::dictionary& Foam::SurfaceFilmModel<CloudType>::dict() const
-{
-    return dict_;
-}
-
-
-template<class CloudType>
-const CloudType& Foam::SurfaceFilmModel<CloudType>::owner() const
-{
-    return owner_;
-}
-
-
-template<class CloudType>
-CloudType& Foam::SurfaceFilmModel<CloudType>::owner()
-{
-    return owner_;
-}
-
-
 template<class CloudType>
 const Foam::dimensionedVector& Foam::SurfaceFilmModel<CloudType>::g() const
 {
@@ -55,13 +34,6 @@ const Foam::dimensionedVector& Foam::SurfaceFilmModel<CloudType>::g() const
 }
 
 
-template<class CloudType>
-const Foam::dictionary& Foam::SurfaceFilmModel<CloudType>::coeffDict() const
-{
-    return coeffDict_;
-}
-
-
 template<class CloudType>
 Foam::label& Foam::SurfaceFilmModel<CloudType>::nParcelsTransferred()
 {
diff --git a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.C b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.C
index fff52dd90b03e12699d4be2dbdd84e4ad80194cc..6cf80b2c17144a0b472a6e7fcd23d095fa72f122 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.C
+++ b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.C
@@ -27,6 +27,15 @@ License
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
+template<class CloudType>
+Foam::CompositionModel<CloudType>::CompositionModel(CloudType& owner)
+:
+    SubModelBase<CloudType>(owner),
+    thermo_(owner.thermo()),
+    phaseProps_()
+{}
+
+
 template<class CloudType>
 Foam::CompositionModel<CloudType>::CompositionModel
 (
@@ -35,13 +44,11 @@ Foam::CompositionModel<CloudType>::CompositionModel
     const word& type
 )
 :
-    dict_(dict),
-    owner_(owner),
-    coeffDict_(dict.subDict(type + "Coeffs")),
+    SubModelBase<CloudType>(owner, dict, type),
     thermo_(owner.thermo()),
     phaseProps_
     (
-        coeffDict_.lookup("phases"),
+        this->coeffDict().lookup("phases"),
         thermo_.carrier().species(),
         thermo_.liquids().components(),
         thermo_.solids().components()
@@ -49,35 +56,26 @@ Foam::CompositionModel<CloudType>::CompositionModel
 {}
 
 
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
-
 template<class CloudType>
-Foam::CompositionModel<CloudType>::~CompositionModel()
+Foam::CompositionModel<CloudType>::CompositionModel
+(
+    const CompositionModel<CloudType>& cm
+)
+:
+    SubModelBase<CloudType>(cm),
+    thermo_(cm.thermo_),
+    phaseProps_(cm.phaseProps_)
 {}
 
 
-// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
-
-template<class CloudType>
-const CloudType& Foam::CompositionModel<CloudType>::owner() const
-{
-    return owner_;
-}
-
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
-const Foam::dictionary& Foam::CompositionModel<CloudType>::dict() const
-{
-    return dict_;
-}
+Foam::CompositionModel<CloudType>::~CompositionModel()
+{}
 
 
-template<class CloudType>
-const Foam::dictionary& Foam::CompositionModel<CloudType>::coeffDict() const
-{
-    return coeffDict_;
-}
-
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class CloudType>
 const Foam::SLGThermo& Foam::CompositionModel<CloudType>::thermo() const
@@ -328,6 +326,55 @@ Foam::scalarField Foam::CompositionModel<CloudType>::X
 }
 
 
+template<class CloudType>
+const Foam::scalarField& Foam::CompositionModel<CloudType>::YMixture0() const
+{
+    notImplemented
+    (
+        "const scalarField& Foam::CompositionModel<CloudType>::YMixture0() "
+        "const"
+    );
+
+    return scalarField::null();
+}
+
+
+template<class CloudType>
+Foam::label Foam::CompositionModel<CloudType>::idGas() const
+{
+    notImplemented
+    (
+        "Foam::label Foam::CompositionModel<CloudType>::idGas() const"
+    );
+
+    return -1;
+}
+
+
+template<class CloudType>
+Foam::label Foam::CompositionModel<CloudType>::idLiquid() const
+{
+    notImplemented
+    (
+        "Foam::label Foam::CompositionModel<CloudType>::idLiquid() const"
+    );
+
+    return -1;
+}
+
+
+template<class CloudType>
+Foam::label Foam::CompositionModel<CloudType>::idSolid() const
+{
+    notImplemented
+    (
+        "Foam::label Foam::CompositionModel<CloudType>::idSolid() const"
+    );
+
+    return -1;
+}
+
+
 template<class CloudType>
 Foam::scalar Foam::CompositionModel<CloudType>::H
 (
diff --git a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.H b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.H
index 0e971d203803c4d2c45a65f123adde082ab9bc22..7becea45510560de561f8137a976d0b4602f7034 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.H
+++ b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.H
@@ -58,18 +58,10 @@ namespace Foam
 
 template<class CloudType>
 class CompositionModel
+:
+    public SubModelBase<CloudType>
 {
     // Private data
-
-        //- The cloud dictionary
-        const dictionary& dict_;
-
-        //- Reference to the owner injection class
-        CloudType& owner_;
-
-        //- The coefficients dictionary
-        const dictionary& coeffDict_;
-
         //- Reference to the thermo database
         const SLGThermo& thermo_;
 
@@ -98,6 +90,9 @@ public:
 
     // Constructors
 
+        //- Construct null from owner
+        CompositionModel(CloudType& owner);
+
         //- Construct from dictionary
         CompositionModel
         (
@@ -106,6 +101,18 @@ public:
             const word& type
         );
 
+        //- Construct copy
+        CompositionModel(const CompositionModel<CloudType>& cm);
+
+        //- Construct and return a clone
+        virtual autoPtr<CompositionModel<CloudType> > clone() const
+        {
+            return autoPtr<CompositionModel<CloudType> >
+            (
+                new CompositionModel<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~CompositionModel();
@@ -123,15 +130,6 @@ public:
 
         // Access
 
-            //- Return the cloud object
-            const CloudType& owner() const;
-
-            //- Return the cloud dictionary
-            const dictionary& dict() const;
-
-            //- Return the coefficients dictionary
-            const dictionary& coeffDict() const;
-
             //- Return the thermo database
             const SLGThermo& thermo() const;
 
@@ -197,19 +195,19 @@ public:
 
                 //- Return the list of mixture mass fractions
                 //  If only 1 phase, return component fractions of that phase
-                virtual const scalarField& YMixture0() const = 0;
+                virtual const scalarField& YMixture0() const;
 
                 // Indices of gas, liquid and solid phases in phase properties
                 // list - returns -1 if not applicable
 
                     //- Gas id
-                    virtual label idGas() const = 0;
+                    virtual label idGas() const;
 
                     //- Liquid id
-                    virtual label idLiquid() const = 0;
+                    virtual label idLiquid() const;
 
                     //- Solid id
-                    virtual label idSolid() const = 0;
+                    virtual label idSolid() const;
 
 
         // Evaluation
diff --git a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SingleMixtureFraction/SingleMixtureFraction.C b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SingleMixtureFraction/SingleMixtureFraction.C
index 76abdaf2ff97ef47aa9d7b78457c71643ffedbeb..e14c0dd55c0119e4d1bde790dc355be761fd1e7d 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SingleMixtureFraction/SingleMixtureFraction.C
+++ b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SingleMixtureFraction/SingleMixtureFraction.C
@@ -135,6 +135,20 @@ Foam::SingleMixtureFraction<CloudType>::SingleMixtureFraction
 }
 
 
+template<class CloudType>
+Foam::SingleMixtureFraction<CloudType>::SingleMixtureFraction
+(
+    const SingleMixtureFraction<CloudType>& cm
+)
+:
+    CompositionModel<CloudType>(cm),
+    idGas_(cm.idGas_),
+    idLiquid_(cm.idLiquid_),
+    idSolid_(cm.idSolid_),
+    YMixture0_(cm.YMixture0_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
diff --git a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SingleMixtureFraction/SingleMixtureFraction.H b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SingleMixtureFraction/SingleMixtureFraction.H
index 4cad8f2a187eef1501863d012d4860d442b21004..5b1186b3d1dfadb15fa5840524feade4ab85f200 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SingleMixtureFraction/SingleMixtureFraction.H
+++ b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SingleMixtureFraction/SingleMixtureFraction.H
@@ -89,6 +89,18 @@ public:
         //- Construct from dictionary
         SingleMixtureFraction(const dictionary& dict, CloudType& owner);
 
+        //- Construct copy
+        SingleMixtureFraction(const SingleMixtureFraction<CloudType>& cm);
+
+        //- Construct and return a clone
+        virtual autoPtr<CompositionModel<CloudType> > clone() const
+        {
+            return autoPtr<CompositionModel<CloudType> >
+            (
+                new SingleMixtureFraction<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~SingleMixtureFraction();
diff --git a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SinglePhaseMixture/SinglePhaseMixture.C b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SinglePhaseMixture/SinglePhaseMixture.C
index f1fd80384d43b73f5acbe2eaab18209af90f2cc1..197611d60e561ca383b7b6fcefb799522b93a25f 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SinglePhaseMixture/SinglePhaseMixture.C
+++ b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SinglePhaseMixture/SinglePhaseMixture.C
@@ -91,6 +91,19 @@ Foam::SinglePhaseMixture<CloudType>::SinglePhaseMixture
 }
 
 
+template<class CloudType>
+Foam::SinglePhaseMixture<CloudType>::SinglePhaseMixture
+(
+    const SinglePhaseMixture<CloudType>& cm
+)
+:
+    CompositionModel<CloudType>(cm),
+    idGas_(cm.idGas_),
+    idLiquid_(cm.idLiquid_),
+    idSolid_(cm.idSolid_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
diff --git a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SinglePhaseMixture/SinglePhaseMixture.H b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SinglePhaseMixture/SinglePhaseMixture.H
index 9323b5b0af8350ac54a506d6db45394a0b87af5d..0c58c923c70749702807b7b394806e88d51fdfe5 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SinglePhaseMixture/SinglePhaseMixture.H
+++ b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SinglePhaseMixture/SinglePhaseMixture.H
@@ -83,6 +83,18 @@ public:
         //- Construct from dictionary
         SinglePhaseMixture(const dictionary& dict, CloudType& owner);
 
+        //- Construct copy
+        SinglePhaseMixture(const SinglePhaseMixture<CloudType>& cm);
+
+        //- Construct and return a clone
+        virtual autoPtr<CompositionModel<CloudType> > clone() const
+        {
+            return autoPtr<CompositionModel<CloudType> >
+            (
+                new SinglePhaseMixture<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~SinglePhaseMixture();
diff --git a/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/ReactingLookupTableInjection.C b/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/ReactingLookupTableInjection.C
index 74629877d3ff08df54fb995d272085e9c5ea8cfc..761ce13fcc5782e973959e395fec47ada2680e10 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/ReactingLookupTableInjection.C
+++ b/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/ReactingLookupTableInjection.C
@@ -122,6 +122,23 @@ Foam::ReactingLookupTableInjection<CloudType>::ReactingLookupTableInjection
 }
 
 
+template<class CloudType>
+Foam::ReactingLookupTableInjection<CloudType>::ReactingLookupTableInjection
+(
+    const ReactingLookupTableInjection<CloudType>& im
+)
+:
+    InjectionModel<CloudType>(im),
+    inputFileName_(im.inputFileName_),
+    duration_(im.duration_),
+    nParcelsPerSecond_(im.nParcelsPerSecond_),
+    injectors_(im.injectors_),
+    injectorCells_(im.injectorCells_),
+    injectorTetFaces_(im.injectorTetFaces_),
+    injectorTetPts_(im.injectorTetPts_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
@@ -131,13 +148,6 @@ Foam::ReactingLookupTableInjection<CloudType>::~ReactingLookupTableInjection()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-template<class CloudType>
-bool Foam::ReactingLookupTableInjection<CloudType>::active() const
-{
-    return true;
-}
-
-
 template<class CloudType>
 Foam::scalar Foam::ReactingLookupTableInjection<CloudType>::timeEnd() const
 {
diff --git a/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/ReactingLookupTableInjection.H b/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/ReactingLookupTableInjection.H
index e13169a5b75318ffe4b33d06e12dec1d9ccfde53..a65a19588c6f159e100770a23c88892d33d3c8d3 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/ReactingLookupTableInjection.H
+++ b/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/ReactingLookupTableInjection.H
@@ -99,18 +99,10 @@ protected:
     // Protected Member Functions
 
         //- Number of parcels to introduce over the time step relative to SOI
-        label parcelsToInject
-        (
-            const scalar time0,
-            const scalar time1
-        );
+        virtual label parcelsToInject(const scalar time0, const scalar time1);
 
         //- Volume of parcels to introduce over the time step relative to SOI
-        scalar volumeToInject
-        (
-            const scalar time0,
-            const scalar time1
-        );
+        virtual scalar volumeToInject(const scalar time0, const scalar time1);
 
 
 public:
@@ -128,6 +120,21 @@ public:
             CloudType& owner
         );
 
+        //- Construct copy
+        ReactingLookupTableInjection
+        (
+            const ReactingLookupTableInjection<CloudType>& im
+        );
+
+        //- Construct and return a clone
+        virtual autoPtr<InjectionModel<CloudType> > clone() const
+        {
+            return autoPtr<InjectionModel<CloudType> >
+            (
+                new ReactingLookupTableInjection<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~ReactingLookupTableInjection();
@@ -135,9 +142,6 @@ public:
 
     // Member Functions
 
-        //- Flag to indicate whether model activates injection model
-        bool active() const;
-
         //- Return the end-of-injection time
         scalar timeEnd() const;
 
diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.C b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.C
index fc7673f8a28d1f9015b3c318bf4efb0786ae19ed..5ac028291ba0d6984334dcee42b6645d57cbe135 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.C
+++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.C
@@ -106,6 +106,20 @@ Foam::LiquidEvaporation<CloudType>::LiquidEvaporation
 }
 
 
+template<class CloudType>
+Foam::LiquidEvaporation<CloudType>::LiquidEvaporation
+(
+    const LiquidEvaporation<CloudType>& pcm
+)
+:
+    PhaseChangeModel<CloudType>(pcm),
+    liquids_(pcm.owner().thermo().liquids()),
+    activeLiquids_(pcm.activeLiquids_),
+    liqToCarrierMap_(pcm.liqToCarrierMap_),
+    liqToLiqMap_(pcm.liqToLiqMap_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template <class CloudType>
@@ -115,13 +129,6 @@ Foam::LiquidEvaporation<CloudType>::~LiquidEvaporation()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-template<class CloudType>
-bool Foam::LiquidEvaporation<CloudType>::active() const
-{
-    return true;
-}
-
-
 template<class CloudType>
 void Foam::LiquidEvaporation<CloudType>::calculate
 (
diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.H b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.H
index bef4d3e8889af5a50d9f5f4d07a26d329fa50957..b998e9e4d2a8b84dbdc445daf802be04fd8064f3 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.H
+++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.H
@@ -84,11 +84,19 @@ public:
     // Constructors
 
         //- Construct from dictionary
-        LiquidEvaporation
-        (
-            const dictionary& dict,
-            CloudType& cloud
-        );
+        LiquidEvaporation(const dictionary& dict, CloudType& cloud);
+
+        //- Construct copy
+        LiquidEvaporation(const LiquidEvaporation<CloudType>& pcm);
+
+        //- Construct and return a clone
+        virtual autoPtr<PhaseChangeModel<CloudType> > clone() const
+        {
+            return autoPtr<PhaseChangeModel<CloudType> >
+            (
+                new LiquidEvaporation<CloudType>(*this)
+            );
+        }
 
 
     //- Destructor
@@ -97,9 +105,6 @@ public:
 
     // Member Functions
 
-        //- Flag to indicate whether model activates phase change model
-        virtual bool active() const;
-
         //- Update model
         virtual void calculate
         (
diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.C b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.C
index 260de0b83660900a4e4022c90bff76973d337c2f..ea047890278693ff22d7c0e7fd5ea12050da7da2 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.C
+++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.C
@@ -38,6 +38,16 @@ Foam::NoPhaseChange<CloudType>::NoPhaseChange
 {}
 
 
+template<class CloudType>
+Foam::NoPhaseChange<CloudType>::NoPhaseChange
+(
+    const NoPhaseChange<CloudType>& pcm
+)
+:
+    PhaseChangeModel<CloudType>(pcm.owner_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template <class CloudType>
diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.H b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.H
index 3876791b5b3b9c1ca3906928c4bd852873f51700..5326ee3b4ca01fd8145b003ad7dbbaff7a481b36 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.H
+++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.H
@@ -58,6 +58,18 @@ public:
         //- Construct from dictionary
         NoPhaseChange(const dictionary&, CloudType&);
 
+        //- Construct copy
+        NoPhaseChange(const NoPhaseChange<CloudType>& pcm);
+
+        //- Construct and return a clone
+        virtual autoPtr<PhaseChangeModel<CloudType> > clone() const
+        {
+            return autoPtr<PhaseChangeModel<CloudType> >
+            (
+                new NoPhaseChange<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~NoPhaseChange();
diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.C b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.C
index 149bd70e520b597633f3427941801af72f7f2887..9d5db2b56092d503407b319bbf48e003c90f3e72 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.C
+++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.C
@@ -75,13 +75,22 @@ Foam::PhaseChangeModel<CloudType>::PhaseChangeModel
     CloudType& owner
 )
 :
-    dict_(dictionary::null),
-    owner_(owner),
-    coeffDict_(dictionary::null),
+    SubModelBase<CloudType>(owner),
     enthalpyTransfer_(etLatentHeat)
 {}
 
 
+template<class CloudType>
+Foam::PhaseChangeModel<CloudType>::PhaseChangeModel
+(
+    const PhaseChangeModel<CloudType>& pcm
+)
+:
+    SubModelBase<CloudType>(pcm),
+    enthalpyTransfer_(pcm.enthalpyTransfer_)
+{}
+
+
 template<class CloudType>
 Foam::PhaseChangeModel<CloudType>::PhaseChangeModel
 (
@@ -90,12 +99,10 @@ Foam::PhaseChangeModel<CloudType>::PhaseChangeModel
     const word& type
 )
 :
-    dict_(dict),
-    owner_(owner),
-    coeffDict_(dict.subDict(type + "Coeffs")),
+    SubModelBase<CloudType>(owner, dict, type),
     enthalpyTransfer_
     (
-        wordToEnthalpyTransfer(coeffDict_.lookup("enthalpyTransfer"))
+        wordToEnthalpyTransfer(this->coeffDict().lookup("enthalpyTransfer"))
     )
 {}
 
@@ -108,32 +115,44 @@ Foam::PhaseChangeModel<CloudType>::~PhaseChangeModel()
 
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
-template<class CloudType>
-const CloudType& Foam::PhaseChangeModel<CloudType>::owner() const
-{
-    return owner_;
-}
-
-
-template<class CloudType>
-const Foam::dictionary& Foam::PhaseChangeModel<CloudType>::dict() const
-{
-    return dict_;
-}
-
 
 template<class CloudType>
-const Foam::dictionary& Foam::PhaseChangeModel<CloudType>::coeffDict() const
+const typename Foam::PhaseChangeModel<CloudType>::enthalpyTransferType&
+Foam::PhaseChangeModel<CloudType>::enthalpyTransfer() const
 {
-    return coeffDict_;
+    return enthalpyTransfer_;
 }
 
 
 template<class CloudType>
-const typename Foam::PhaseChangeModel<CloudType>::enthalpyTransferType&
-Foam::PhaseChangeModel<CloudType>::enthalpyTransfer() const
+void Foam::PhaseChangeModel<CloudType>::calculate
+(
+    const scalar,
+    const label,
+    const scalar,
+    const scalar,
+    const scalar,
+    const scalar,
+    const scalar,
+    const scalar,
+    scalarField&
+) const
 {
-    return enthalpyTransfer_;
+    notImplemented
+    (
+        "void Foam::PhaseChangeModel<CloudType>::calculate"
+        "("
+            "const scalar, "
+            "const label, "
+            "const scalar, "
+            "const scalar, "
+            "const scalar, "
+            "const scalar, "
+            "const scalar, "
+            "const scalar, "
+            "scalarField&"
+        ") const"
+    );
 }
 
 
diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.H b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.H
index a216409d33019f83ea060a01af5e2289d2d07a55..5ca5cd651d2c7ae983465315a5614d36ba1505ad 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.H
+++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.H
@@ -39,6 +39,7 @@ SourceFiles
 #include "IOdictionary.H"
 #include "autoPtr.H"
 #include "runTimeSelectionTables.H"
+#include "SubModelBase.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -51,6 +52,8 @@ namespace Foam
 
 template<class CloudType>
 class PhaseChangeModel
+:
+    public SubModelBase<CloudType>
 {
 public:
 
@@ -71,15 +74,6 @@ protected:
 
     // Protected data
 
-        //- The cloud dictionary
-        const dictionary& dict_;
-
-        //- Reference to the owner cloud class
-        CloudType& owner_;
-
-        //- The coefficient dictionary
-        const dictionary coeffDict_;
-
         //- Enthalpy transfer type enumeration
         enthalpyTransferType enthalpyTransfer_;
 
@@ -125,6 +119,18 @@ public:
             const word& type
         );
 
+        //- Construct copy
+        PhaseChangeModel(const PhaseChangeModel<CloudType>& pcm);
+
+        //- Construct and return a clone
+        virtual autoPtr<PhaseChangeModel<CloudType> > clone() const
+        {
+            return autoPtr<PhaseChangeModel<CloudType> >
+            (
+                new PhaseChangeModel<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~PhaseChangeModel();
@@ -140,24 +146,12 @@ public:
 
     // Access
 
-        //- Return the owner cloud object
-        const CloudType& owner() const;
-
-        //- Return the cloud dictionary
-        const dictionary& dict() const;
-
-        //- Return the coefficient dictionary
-        const dictionary& coeffDict() const;
-
         //- Return the enthalpy transfer type enumeration
         const enthalpyTransferType& enthalpyTransfer() const;
 
 
     // Member Functions
 
-        //- Flag to indicate whether model activates phase change model
-        virtual bool active() const = 0;
-
         //- Update model
         virtual void calculate
         (
@@ -170,7 +164,7 @@ public:
             const scalar Ts,
             const scalar pc,
             scalarField& dMassPC
-        ) const = 0;
+        ) const;
 };
 
 
diff --git a/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/ConstantRateDevolatilisation/ConstantRateDevolatilisation.C b/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/ConstantRateDevolatilisation/ConstantRateDevolatilisation.C
index 4d5d644c80235848f75813b71ebf75ed19ad6859..ca73a935a5da2651f143f10a0e90b9a54a7c2fc9 100644
--- a/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/ConstantRateDevolatilisation/ConstantRateDevolatilisation.C
+++ b/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/ConstantRateDevolatilisation/ConstantRateDevolatilisation.C
@@ -43,6 +43,18 @@ Foam::ConstantRateDevolatilisation<CloudType>::ConstantRateDevolatilisation
 {}
 
 
+template <class CloudType>
+Foam::ConstantRateDevolatilisation<CloudType>::ConstantRateDevolatilisation
+(
+    const ConstantRateDevolatilisation<CloudType>& dm
+)
+:
+    DevolatilisationModel<CloudType>(dm),
+    A0_(dm.A0_),
+    volatileResidualCoeff_(dm.volatileResidualCoeff_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template <class CloudType>
@@ -52,13 +64,6 @@ Foam::ConstantRateDevolatilisation<CloudType>::~ConstantRateDevolatilisation()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-template<class CloudType>
-bool Foam::ConstantRateDevolatilisation<CloudType>::active() const
-{
-    return true;
-}
-
-
 template<class CloudType>
 Foam::scalar Foam::ConstantRateDevolatilisation<CloudType>::calculate
 (
diff --git a/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/ConstantRateDevolatilisation/ConstantRateDevolatilisation.H b/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/ConstantRateDevolatilisation/ConstantRateDevolatilisation.H
index 48dfb19f4c19d965ae4f53ed9e8ed79efd55cc50..9477ca5d2502e0311545cbd1875e4c6e0fb74dfc 100644
--- a/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/ConstantRateDevolatilisation/ConstantRateDevolatilisation.H
+++ b/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/ConstantRateDevolatilisation/ConstantRateDevolatilisation.H
@@ -70,12 +70,23 @@ public:
     // Constructors
 
         //- Construct from dictionary
+        ConstantRateDevolatilisation(const dictionary& dict, CloudType& owner);
+
+        //- Construct copy
         ConstantRateDevolatilisation
         (
-            const dictionary& dict,
-            CloudType& owner
+            const ConstantRateDevolatilisation<CloudType>& dm
         );
 
+        //- Construct and return a clone
+        virtual autoPtr<DevolatilisationModel<CloudType> > clone() const
+        {
+            return autoPtr<DevolatilisationModel<CloudType> >
+            (
+                new ConstantRateDevolatilisation<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~ConstantRateDevolatilisation();
@@ -83,9 +94,6 @@ public:
 
     // Member Functions
 
-        //- Flag to indicate whether model activates devolatilisation model
-        virtual bool active() const;
-
         //- Update model
         virtual scalar calculate
         (
diff --git a/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/DevolatilisationModel/DevolatilisationModel.C b/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/DevolatilisationModel/DevolatilisationModel.C
index c2202ddef5fa40aa29470af52610d11f0bc4fa23..982ceb6cf43bc41437a86826de64c7b04ff17468 100644
--- a/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/DevolatilisationModel/DevolatilisationModel.C
+++ b/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/DevolatilisationModel/DevolatilisationModel.C
@@ -33,9 +33,7 @@ Foam::DevolatilisationModel<CloudType>::DevolatilisationModel
     CloudType& owner
 )
 :
-    dict_(dictionary::null),
-    owner_(owner),
-    coeffDict_(dictionary::null)
+    SubModelBase<CloudType>(owner)
 {}
 
 
@@ -47,9 +45,17 @@ Foam::DevolatilisationModel<CloudType>::DevolatilisationModel
     const word& type
 )
 :
-    dict_(dict),
-    owner_(owner),
-    coeffDict_(dict.subDict(type + "Coeffs"))
+    SubModelBase<CloudType>(owner, dict, type)
+{}
+
+
+template<class CloudType>
+Foam::DevolatilisationModel<CloudType>::DevolatilisationModel
+(
+    const DevolatilisationModel<CloudType>& dm
+)
+:
+    SubModelBase<CloudType>(dm)
 {}
 
 
@@ -61,25 +67,34 @@ Foam::DevolatilisationModel<CloudType>::~DevolatilisationModel()
 
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
-template<class CloudType>
-const CloudType& Foam::DevolatilisationModel<CloudType>::owner() const
-{
-    return owner_;
-}
-
 
 template<class CloudType>
-const Foam::dictionary& Foam::DevolatilisationModel<CloudType>::dict() const
-{
-    return dict_;
-}
-
-
-template<class CloudType>
-const Foam::dictionary&
-Foam::DevolatilisationModel<CloudType>::coeffDict() const
+Foam::scalar Foam::DevolatilisationModel<CloudType>::calculate
+(
+    const scalar,
+    const scalar,
+    const scalar,
+    const scalar,
+    const scalar,
+    const scalar,
+    bool&
+) const
 {
-    return coeffDict_;
+    notImplemented
+    (
+        "void Foam::DevolatilisationModel<CloudType>::calculate"
+        "("
+            "const scalar, "
+            "const scalar, "
+            "const scalar, "
+            "const scalar, "
+            "const scalar, "
+            "const scalar, "
+            "bool&, "
+        ") const"
+    );
+
+    return 0.0;
 }
 
 
diff --git a/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/DevolatilisationModel/DevolatilisationModel.H b/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/DevolatilisationModel/DevolatilisationModel.H
index 21c6b79594fe6e7383004fe8ff3e5fe5cb39ac6a..cdb1bdbb46c145847814af042a863067ea885bfc 100644
--- a/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/DevolatilisationModel/DevolatilisationModel.H
+++ b/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/DevolatilisationModel/DevolatilisationModel.H
@@ -39,6 +39,7 @@ SourceFiles
 #include "IOdictionary.H"
 #include "autoPtr.H"
 #include "runTimeSelectionTables.H"
+#include "SubModelBase.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -51,21 +52,9 @@ namespace Foam
 
 template<class CloudType>
 class DevolatilisationModel
+:
+    public SubModelBase<CloudType>
 {
-protected:
-
-    // Protected data
-
-        //- The cloud dictionary
-        const dictionary& dict_;
-
-        //- Reference to the owner cloud class
-        CloudType& owner_;
-
-        //- The coefficient dictionary
-        const dictionary coeffDict_;
-
-
 public:
 
     //- Runtime type information
@@ -98,6 +87,18 @@ public:
             const word& type
         );
 
+        //- Construct copy
+        DevolatilisationModel(const DevolatilisationModel<CloudType>& dm);
+
+        //- Construct and return a clone
+        virtual autoPtr<DevolatilisationModel<CloudType> > clone() const
+        {
+            return autoPtr<DevolatilisationModel<CloudType> >
+            (
+                new DevolatilisationModel<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~DevolatilisationModel();
@@ -111,23 +112,8 @@ public:
     );
 
 
-    // Access
-
-        //- Return the owner cloud object
-        const CloudType& owner() const;
-
-        //- Return the cloud dictionary
-        const dictionary& dict() const;
-
-        //- Return the coefficient dictionary
-        const dictionary& coeffDict() const;
-
-
     // Member Functions
 
-        //- Flag to indicate whether model activates devolatilisation model
-        virtual bool active() const = 0;
-
         //- Update model
         virtual scalar calculate
         (
@@ -138,7 +124,7 @@ public:
             const scalar YVolatile0,
             const scalar YVolatile,
             bool& canCombust
-        ) const = 0;
+        ) const;
 };
 
 
diff --git a/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/NoDevolatilisation/NoDevolatilisation.C b/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/NoDevolatilisation/NoDevolatilisation.C
index 0bfe2cb022ee47939d71eb01814b5f9c1ca1da41..a4da5311eba411a44d340d4d92cf02b39d9ca528 100644
--- a/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/NoDevolatilisation/NoDevolatilisation.C
+++ b/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/NoDevolatilisation/NoDevolatilisation.C
@@ -38,6 +38,16 @@ Foam::NoDevolatilisation<CloudType>::NoDevolatilisation
 {}
 
 
+template<class CloudType>
+Foam::NoDevolatilisation<CloudType>::NoDevolatilisation
+(
+    const NoDevolatilisation<CloudType>& dm
+)
+:
+    DevolatilisationModel<CloudType>(dm.owner_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template <class CloudType>
@@ -69,7 +79,6 @@ Foam::scalar Foam::NoDevolatilisation<CloudType>::calculate
     // Model does not stop combustion taking place
     canCombust = true;
 
-    // Nothing more to do...
     return 0.0;
 }
 
diff --git a/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/NoDevolatilisation/NoDevolatilisation.H b/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/NoDevolatilisation/NoDevolatilisation.H
index d09c8d9b74de650f4f8f34dc7e5266e9a8956f34..4b0aadf075ebcbf8afd6a10bccb317f3c1395b18 100644
--- a/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/NoDevolatilisation/NoDevolatilisation.H
+++ b/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/NoDevolatilisation/NoDevolatilisation.H
@@ -59,6 +59,18 @@ public:
         //- Construct from dictionary
         NoDevolatilisation(const dictionary&, CloudType& owner);
 
+        //- Construct copy
+        NoDevolatilisation(const NoDevolatilisation<CloudType>& dm);
+
+        //- Construct and return a clone
+        virtual autoPtr<DevolatilisationModel<CloudType> > clone() const
+        {
+            return autoPtr<DevolatilisationModel<CloudType> >
+            (
+                new NoDevolatilisation<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~NoDevolatilisation();
diff --git a/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/SingleKineticRateDevolatilisation/SingleKineticRateDevolatilisation.C b/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/SingleKineticRateDevolatilisation/SingleKineticRateDevolatilisation.C
index 04a6c63b011fd3d1b2a1f4e0ad52b6a766424d98..f7b25904f578d6982af9ba58a21bdaa584597953 100644
--- a/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/SingleKineticRateDevolatilisation/SingleKineticRateDevolatilisation.C
+++ b/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/SingleKineticRateDevolatilisation/SingleKineticRateDevolatilisation.C
@@ -45,6 +45,20 @@ SingleKineticRateDevolatilisation
 {}
 
 
+template<class CloudType>
+Foam::SingleKineticRateDevolatilisation<CloudType>::
+SingleKineticRateDevolatilisation
+(
+    const SingleKineticRateDevolatilisation<CloudType>& dm
+)
+:
+    DevolatilisationModel<CloudType>(dm),
+    A1_(dm.A1_),
+    E_(dm.E_),
+    volatileResidualCoeff_(dm.volatileResidualCoeff_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template <class CloudType>
@@ -55,13 +69,6 @@ Foam::SingleKineticRateDevolatilisation<CloudType>::
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-template<class CloudType>
-bool Foam::SingleKineticRateDevolatilisation<CloudType>::active() const
-{
-    return true;
-}
-
-
 template<class CloudType>
 Foam::scalar Foam::SingleKineticRateDevolatilisation<CloudType>::calculate
 (
diff --git a/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/SingleKineticRateDevolatilisation/SingleKineticRateDevolatilisation.H b/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/SingleKineticRateDevolatilisation/SingleKineticRateDevolatilisation.H
index 5536d896a160533922df081141f47136962ca4bf..f32a1f8bf763c37ae4da77a9c20fbf007f2c3cfc 100644
--- a/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/SingleKineticRateDevolatilisation/SingleKineticRateDevolatilisation.H
+++ b/src/lagrangian/intermediate/submodels/ReactingMultiphase/DevolatilisationModel/SingleKineticRateDevolatilisation/SingleKineticRateDevolatilisation.H
@@ -78,6 +78,21 @@ public:
             CloudType& owner
         );
 
+        //- Construct copy
+        SingleKineticRateDevolatilisation
+        (
+            const SingleKineticRateDevolatilisation<CloudType>& dm
+        );
+
+        //- Construct and return a clone
+        virtual autoPtr<DevolatilisationModel<CloudType> > clone() const
+        {
+            return autoPtr<DevolatilisationModel<CloudType> >
+            (
+                new SingleKineticRateDevolatilisation<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~SingleKineticRateDevolatilisation();
@@ -85,9 +100,6 @@ public:
 
     // Member Functions
 
-        //- Flag to indicate whether model activates devolatilisation model
-        virtual bool active() const;
-
         //- Update model
         virtual scalar calculate
         (
diff --git a/src/lagrangian/intermediate/submodels/ReactingMultiphase/InjectionModel/ReactingMultiphaseLookupTableInjection/ReactingMultiphaseLookupTableInjection.C b/src/lagrangian/intermediate/submodels/ReactingMultiphase/InjectionModel/ReactingMultiphaseLookupTableInjection/ReactingMultiphaseLookupTableInjection.C
index cfdb19dfcdc1d42bf7b842ecd2edc956b5c27aa7..caf3acff4bd9f8c685ed968b4d42e4d3ccc8f265 100644
--- a/src/lagrangian/intermediate/submodels/ReactingMultiphase/InjectionModel/ReactingMultiphaseLookupTableInjection/ReactingMultiphaseLookupTableInjection.C
+++ b/src/lagrangian/intermediate/submodels/ReactingMultiphase/InjectionModel/ReactingMultiphaseLookupTableInjection/ReactingMultiphaseLookupTableInjection.C
@@ -125,6 +125,24 @@ ReactingMultiphaseLookupTableInjection
 }
 
 
+template<class CloudType>
+Foam::ReactingMultiphaseLookupTableInjection<CloudType>::
+ReactingMultiphaseLookupTableInjection
+(
+    const ReactingMultiphaseLookupTableInjection<CloudType>& im
+)
+:
+    InjectionModel<CloudType>(im),
+    inputFileName_(im.inputFileName_),
+    duration_(im.duration_),
+    nParcelsPerSecond_(im.nParcelsPerSecond_),
+    injectors_(im.injectors_),
+    injectorCells_(im.injectorCells_),
+    injectorTetFaces_(im.injectorTetFaces_),
+    injectorTetPts_(im.injectorTetPts_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
@@ -135,13 +153,6 @@ Foam::ReactingMultiphaseLookupTableInjection<CloudType>::
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-template<class CloudType>
-bool Foam::ReactingMultiphaseLookupTableInjection<CloudType>::active() const
-{
-    return true;
-}
-
-
 template<class CloudType>
 Foam::scalar
 Foam::ReactingMultiphaseLookupTableInjection<CloudType>::timeEnd() const
diff --git a/src/lagrangian/intermediate/submodels/ReactingMultiphase/InjectionModel/ReactingMultiphaseLookupTableInjection/ReactingMultiphaseLookupTableInjection.H b/src/lagrangian/intermediate/submodels/ReactingMultiphase/InjectionModel/ReactingMultiphaseLookupTableInjection/ReactingMultiphaseLookupTableInjection.H
index 5b0ecae379350a54a13a1dcb58dc70337830674b..807630b2c2b9ce9e5248c08f3ba05ae29ff21229 100644
--- a/src/lagrangian/intermediate/submodels/ReactingMultiphase/InjectionModel/ReactingMultiphaseLookupTableInjection/ReactingMultiphaseLookupTableInjection.H
+++ b/src/lagrangian/intermediate/submodels/ReactingMultiphase/InjectionModel/ReactingMultiphaseLookupTableInjection/ReactingMultiphaseLookupTableInjection.H
@@ -102,18 +102,10 @@ protected:
     // Protected Member Functions
 
         //- Number of parcels to introduce over the time step relative to SOI
-        label parcelsToInject
-        (
-            const scalar time0,
-            const scalar time1
-        );
+        virtual label parcelsToInject(const scalar time0, const scalar time1);
 
         //- Volume of parcels to introduce over the time step relative to SOI
-        scalar volumeToInject
-        (
-            const scalar time0,
-            const scalar time1
-        );
+        virtual scalar volumeToInject(const scalar time0, const scalar time1);
 
 
 public:
@@ -131,6 +123,21 @@ public:
             CloudType& owner
         );
 
+        //- Construct copy
+        ReactingMultiphaseLookupTableInjection
+        (
+            const ReactingMultiphaseLookupTableInjection<CloudType>& im
+        );
+
+        //- Construct and return a clone
+        virtual autoPtr<InjectionModel<CloudType> > clone() const
+        {
+            return autoPtr<InjectionModel<CloudType> >
+            (
+                new ReactingMultiphaseLookupTableInjection<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~ReactingMultiphaseLookupTableInjection();
@@ -138,9 +145,6 @@ public:
 
     // Member Functions
 
-        //- Flag to indicate whether model activates injection model
-        bool active() const;
-
         //- Return the end-of-injection time
         scalar timeEnd() const;
 
diff --git a/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/NoSurfaceReaction/NoSurfaceReaction.C b/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/NoSurfaceReaction/NoSurfaceReaction.C
index 18ecbaf48ed30dde3e23b2a5dc642b22908c6f3f..c72e63e1ab250b4ac3e5c6c4082b0ae074524119 100644
--- a/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/NoSurfaceReaction/NoSurfaceReaction.C
+++ b/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/NoSurfaceReaction/NoSurfaceReaction.C
@@ -27,7 +27,7 @@ License
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
-template <class CloudType>
+template<class CloudType>
 Foam::NoSurfaceReaction<CloudType>::NoSurfaceReaction
 (
     const dictionary&,
@@ -38,6 +38,16 @@ Foam::NoSurfaceReaction<CloudType>::NoSurfaceReaction
 {}
 
 
+template<class CloudType>
+Foam::NoSurfaceReaction<CloudType>::NoSurfaceReaction
+(
+    const NoSurfaceReaction<CloudType>& srm
+)
+:
+    SurfaceReactionModel<CloudType>(srm.owner_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template <class CloudType>
diff --git a/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/NoSurfaceReaction/NoSurfaceReaction.H b/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/NoSurfaceReaction/NoSurfaceReaction.H
index e0d0d060d0477a549717a9b1fdd18d15720fb8c9..cbc6bc612a70f96d249033ea76bbf14de84c19bd 100644
--- a/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/NoSurfaceReaction/NoSurfaceReaction.H
+++ b/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/NoSurfaceReaction/NoSurfaceReaction.H
@@ -56,11 +56,19 @@ public:
     // Constructors
 
         //- Construct from dictionary
-        NoSurfaceReaction
-        (
-            const dictionary& dict,
-            CloudType& owner
-        );
+        NoSurfaceReaction(const dictionary& dict, CloudType& owner);
+
+        //- Construct copy
+        NoSurfaceReaction(const NoSurfaceReaction<CloudType>& srm);
+
+        //- Construct and return a clone
+        virtual autoPtr<SurfaceReactionModel<CloudType> > clone() const
+        {
+            return autoPtr<SurfaceReactionModel<CloudType> >
+            (
+                new NoSurfaceReaction<CloudType>(*this)
+            );
+        }
 
 
     //- Destructor
diff --git a/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/SurfaceReactionModel/SurfaceReactionModel.C b/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/SurfaceReactionModel/SurfaceReactionModel.C
index a6d711b6a14b53a45c607a6efcc40e1c4354d931..8d4eaf4414765d70db7260067cd50b688d6855d6 100644
--- a/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/SurfaceReactionModel/SurfaceReactionModel.C
+++ b/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/SurfaceReactionModel/SurfaceReactionModel.C
@@ -33,9 +33,7 @@ Foam::SurfaceReactionModel<CloudType>::SurfaceReactionModel
     CloudType& owner
 )
 :
-    dict_(dictionary::null),
-    owner_(owner),
-    coeffDict_(dictionary::null)
+    SubModelBase<CloudType>(owner)
 {}
 
 
@@ -47,39 +45,76 @@ Foam::SurfaceReactionModel<CloudType>::SurfaceReactionModel
     const word& type
 )
 :
-    dict_(dict),
-    owner_(owner),
-    coeffDict_(dict.subDict(type + "Coeffs"))
+    SubModelBase<CloudType>(owner, dict, type)
 {}
 
 
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
-
 template<class CloudType>
-Foam::SurfaceReactionModel<CloudType>::~SurfaceReactionModel()
+Foam::SurfaceReactionModel<CloudType>::SurfaceReactionModel
+(
+    const SurfaceReactionModel<CloudType>& srm
+)
+:
+    SubModelBase<CloudType>(srm)
 {}
 
 
-// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
-const CloudType& Foam::SurfaceReactionModel<CloudType>::owner() const
-{
-    return owner_;
-}
+Foam::SurfaceReactionModel<CloudType>::~SurfaceReactionModel()
+{}
 
 
-template<class CloudType>
-const Foam::dictionary& Foam::SurfaceReactionModel<CloudType>::dict() const
-{
-    return dict_;
-}
-
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class CloudType>
-const Foam::dictionary& Foam::SurfaceReactionModel<CloudType>::coeffDict() const
+Foam::scalar Foam::SurfaceReactionModel<CloudType>::calculate
+(
+    const scalar,
+    const label,
+    const scalar,
+    const scalar,
+    const scalar,
+    const scalar,
+    const scalar,
+    const scalar,
+    const scalarField&,
+    const scalarField&,
+    const scalarField&,
+    const scalarField&,
+    const scalar,
+    scalarField&,
+    scalarField&,
+    scalarField&,
+    scalarField&
+) const
 {
-    return coeffDict_;
+    notImplemented
+    (
+        "Foam::scalar Foam::SurfaceReactionModel<CloudType>::calculate"
+        "("
+            "const scalar, "
+            "const label, "
+            "const scalar, "
+            "const scalar, "
+            "const scalar, "
+            "const scalar, "
+            "const scalar, "
+            "const scalar, "
+            "const scalarField&, "
+            "const scalarField&, "
+            "const scalarField&, "
+            "const scalarField&, "
+            "const scalar, "
+            "scalarField&, "
+            "scalarField&, "
+            "scalarField&, "
+            "scalarField&"
+        ") const"
+    );
+
+    return 0.0;
 }
 
 
diff --git a/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/SurfaceReactionModel/SurfaceReactionModel.H b/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/SurfaceReactionModel/SurfaceReactionModel.H
index 8ee2fb1874e1b7f9d55478b104ba623ae7eb1d70..e3db3da1677fc4ebe9da224890973dcab8309efa 100644
--- a/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/SurfaceReactionModel/SurfaceReactionModel.H
+++ b/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/SurfaceReactionModel/SurfaceReactionModel.H
@@ -39,7 +39,7 @@ SourceFiles
 #include "IOdictionary.H"
 #include "autoPtr.H"
 #include "runTimeSelectionTables.H"
-
+#include "SubModelBase.H"
 #include "scalarField.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -53,19 +53,9 @@ namespace Foam
 
 template<class CloudType>
 class SurfaceReactionModel
+:
+    public SubModelBase<CloudType>
 {
-    // Private data
-
-        //- The cloud dictionary
-        const dictionary& dict_;
-
-        //- Reference to the owner cloud class
-        CloudType& owner_;
-
-        //- The coefficients dictionary
-        const dictionary coeffDict_;
-
-
 public:
 
     //-Runtime type information
@@ -99,6 +89,18 @@ public:
             const word& type
         );
 
+        //- Construct copy
+        SurfaceReactionModel(const SurfaceReactionModel<CloudType>& srm);
+
+        //- Construct and return a clone
+        virtual autoPtr<SurfaceReactionModel<CloudType> > clone() const
+        {
+            return autoPtr<SurfaceReactionModel<CloudType> >
+            (
+                new SurfaceReactionModel<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~SurfaceReactionModel();
@@ -112,23 +114,8 @@ public:
     );
 
 
-    // Access
-
-        //- Return the owner cloud object
-        const CloudType& owner() const;
-
-        //- Return the cloud dictionary
-        const dictionary& dict() const;
-
-        //- Return the coefficients dictionary
-        const dictionary& coeffDict() const;
-
-
     // Member Functions
 
-        //- Flag to indicate whether model activates surface reaction model
-        virtual bool active() const = 0;
-
         //- Update surface reactions
         //  Returns the heat of reaction
         virtual scalar calculate
@@ -150,7 +137,7 @@ public:
             scalarField& dMassLiquid,
             scalarField& dMassSolid,
             scalarField& dMassSRCarrier
-        ) const = 0;
+        ) const;
 };
 
 
diff --git a/src/lagrangian/intermediate/submodels/SubModelBase.C b/src/lagrangian/intermediate/submodels/SubModelBase.C
new file mode 100644
index 0000000000000000000000000000000000000000..4900b1c8f7bc21e69150500bdcce6552c22e8e07
--- /dev/null
+++ b/src/lagrangian/intermediate/submodels/SubModelBase.C
@@ -0,0 +1,125 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 OpenCFD Ltd.
+     \\/     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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "SubModelBase.H"
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+template<class CloudType>
+Foam::SubModelBase<CloudType>::SubModelBase(CloudType& owner)
+:
+    owner_(owner),
+    dict_(dictionary::null),
+    coeffDict_(dictionary::null)
+{}
+
+
+template<class CloudType>
+Foam::SubModelBase<CloudType>::SubModelBase
+(
+    CloudType& owner,
+    const dictionary& dict,
+    const word& name
+)
+:
+    owner_(owner),
+    dict_(dict),
+    coeffDict_(dict.subDict(name + "Coeffs"))
+{}
+
+
+template<class CloudType>
+Foam::SubModelBase<CloudType>::SubModelBase(const SubModelBase<CloudType>& smb)
+:
+    owner_(smb.owner_),
+    dict_(smb.dict_),
+    coeffDict_(smb.coeffDict_)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+template<class CloudType>
+Foam::SubModelBase<CloudType>::~SubModelBase()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class CloudType>
+const CloudType& Foam::SubModelBase<CloudType>::owner() const
+{
+    return owner_;
+}
+
+
+template<class CloudType>
+const Foam::dictionary& Foam::SubModelBase<CloudType>::dict() const
+{
+    return dict_;
+}
+
+
+template<class CloudType>
+const Foam::dictionary& Foam::SubModelBase<CloudType>::coeffDict() const
+{
+    return coeffDict_;
+}
+
+
+template<class CloudType>
+CloudType& Foam::SubModelBase<CloudType>::owner()
+{
+    return owner_;
+}
+
+
+template<class CloudType>
+bool Foam::SubModelBase<CloudType>::active() const
+{
+    return true;
+}
+
+
+template<class CloudType>
+void  Foam::SubModelBase<CloudType>::cacheFields(const bool)
+{
+    // do nothing
+}
+
+
+template<class CloudType>
+void Foam::SubModelBase<CloudType>::write(Ostream& os) const
+{
+    os.writeKeyword("owner") << owner_.name() << token::END_STATEMENT << nl;
+
+    // not writing complete cloud dictionary, only coeffs
+//    os  << dict_;
+    os  << coeffDict_;
+}
+
+
+// ************************************************************************* //
diff --git a/src/lagrangian/intermediate/submodels/SubModelBase.H b/src/lagrangian/intermediate/submodels/SubModelBase.H
new file mode 100644
index 0000000000000000000000000000000000000000..639fb0849ef66c4166d90fe860892ac284546a8d
--- /dev/null
+++ b/src/lagrangian/intermediate/submodels/SubModelBase.H
@@ -0,0 +1,142 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 OpenCFD Ltd.
+     \\/     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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::SubModelBase
+
+Description
+    Base class for cloud sub-models
+
+SourceFiles
+    SubModelBase.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef SubModelBase_H
+#define SubModelBase_H
+
+#include "dictionary.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// Forward declaration of classes
+template<class CloudType>
+class SubModelBase;
+
+/*---------------------------------------------------------------------------*\
+                       Class SubModelBase Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class CloudType>
+class SubModelBase
+{
+protected:
+
+    // Protected Data
+
+        //- Reference to the cloud
+        CloudType& owner_;
+
+        //- Reference to the cloud dictionary
+        const dictionary& dict_;
+
+        //- Reference to the coefficients dictionary
+        const dictionary& coeffDict_;
+
+
+
+public:
+
+    // Constructors
+
+        //- Construct null from owner cloud
+        SubModelBase(CloudType& owner);
+
+        //- Construct from owner cloud, dictionary, and model type name
+        SubModelBase
+        (
+            CloudType& owner,
+            const dictionary& dict,
+            const word& name
+        );
+
+        //- Construct as copy
+        SubModelBase(const SubModelBase<CloudType>& smb);
+
+
+    //- Destructor
+    virtual ~SubModelBase();
+
+
+    // Member Functions
+
+        // Access
+
+            //- Return const access to the cloud dictionary
+            const dictionary& dict() const;
+
+            //- Return const access to the owner cloud
+            const CloudType& owner() const;
+
+            //- Return const access to the coefficients dictionary
+            const dictionary& coeffDict() const;
+
+            //- Return the model 'active' status - default active = true
+            virtual bool active() const;
+
+            //- Cache dependant sub-model fields
+            virtual void cacheFields(const bool store);
+
+
+        // Edit
+
+            //- Return non-const access to the owner cloud for manipulation
+            CloudType& owner();
+
+
+        // I-O
+
+            //- Write
+            virtual void write(Ostream& os) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#   include "SubModelBase.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/HeatTransferModel/HeatTransferModel.C b/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/HeatTransferModel/HeatTransferModel.C
index f609752bf496021ad3950c05e2fb40894ecf3608..d0894c02a10ada0ec0f9b4ddcd2fc2d71dc550b4 100644
--- a/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/HeatTransferModel/HeatTransferModel.C
+++ b/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/HeatTransferModel/HeatTransferModel.C
@@ -30,9 +30,7 @@ License
 template<class CloudType>
 Foam::HeatTransferModel<CloudType>::HeatTransferModel(CloudType& owner)
 :
-    dict_(dictionary::null),
-    owner_(owner),
-    coeffDict_(dictionary::null),
+    SubModelBase<CloudType>(owner),
     BirdCorrection_(false)
 {}
 
@@ -45,47 +43,56 @@ Foam::HeatTransferModel<CloudType>::HeatTransferModel
     const word& type
 )
 :
-    dict_(dict),
-    owner_(owner),
-    coeffDict_(dict.subDict(type + "Coeffs")),
-    BirdCorrection_(coeffDict_.lookup("BirdCorrection"))
+    SubModelBase<CloudType>(owner, dict, type),
+    BirdCorrection_(this->coeffDict().lookup("BirdCorrection"))
 {}
 
 
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
-
 template<class CloudType>
-Foam::HeatTransferModel<CloudType>::~HeatTransferModel()
+Foam::HeatTransferModel<CloudType>::HeatTransferModel
+(
+    const HeatTransferModel<CloudType>& htm
+)
+:
+    SubModelBase<CloudType>(htm),
+    BirdCorrection_(htm.BirdCorrection_)
 {}
 
 
-// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
-
-template<class CloudType>
-const CloudType& Foam::HeatTransferModel<CloudType>::owner() const
-{
-    return owner_;
-}
 
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
-const Foam::dictionary& Foam::HeatTransferModel<CloudType>::dict() const
-{
-    return dict_;
-}
+Foam::HeatTransferModel<CloudType>::~HeatTransferModel()
+{}
 
 
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
 template<class CloudType>
-const Foam::dictionary& Foam::HeatTransferModel<CloudType>::coeffDict() const
+const Foam::Switch& Foam::HeatTransferModel<CloudType>::BirdCorrection() const
 {
-    return coeffDict_;
+    return BirdCorrection_;
 }
 
 
 template<class CloudType>
-const Foam::Switch& Foam::HeatTransferModel<CloudType>::BirdCorrection() const
+Foam::scalar Foam::HeatTransferModel<CloudType>::Nu
+(
+    const scalar Re,
+    const scalar Pr
+) const
 {
-    return BirdCorrection_;
+    notImplemented
+    (
+        "Foam::scalar Foam::HeatTransferModel<CloudType>::Nu"
+        "("
+            "const scalar, "
+            "const scalar"
+        ") const"
+    );
+
+    return 0.0;
 }
 
 
diff --git a/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/HeatTransferModel/HeatTransferModel.H b/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/HeatTransferModel/HeatTransferModel.H
index de10004531fe6070b57d1112bf9636a699adb4d7..b6477c001f141ef1d681c0938d9b7e71d9de965d 100644
--- a/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/HeatTransferModel/HeatTransferModel.H
+++ b/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/HeatTransferModel/HeatTransferModel.H
@@ -39,6 +39,7 @@ SourceFiles
 #include "IOdictionary.H"
 #include "autoPtr.H"
 #include "runTimeSelectionTables.H"
+#include "SubModelBase.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -51,18 +52,11 @@ namespace Foam
 
 template<class CloudType>
 class HeatTransferModel
+:
+    public SubModelBase<CloudType>
 {
     // Private data
 
-        //- The cloud dictionary
-        const dictionary& dict_;
-
-        //- Reference to the owner cloud class
-        CloudType& owner_;
-
-        //- The coefficients dictionary
-        const dictionary coeffDict_;
-
         //- Apply Bird's correction to the htc
         const Switch BirdCorrection_;
 
@@ -99,6 +93,18 @@ public:
             const word& type
         );
 
+        //- Construct copy
+        HeatTransferModel(const HeatTransferModel<CloudType>& htm);
+
+        //- Construct and return a clone
+        virtual autoPtr<HeatTransferModel<CloudType> > clone() const
+        {
+            return autoPtr<HeatTransferModel<CloudType> >
+            (
+                new HeatTransferModel<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~HeatTransferModel();
@@ -116,21 +122,9 @@ public:
 
         // Access
 
-            //- Return the cloud dictionary
-            const dictionary& dict() const;
-
-            //- Return the coefficients dictionary
-            const dictionary& coeffDict() const;
-
-            //- Return the owner cloud object
-            const CloudType& owner() const;
-
             //- Return the Bird htc correction flag
             const Switch& BirdCorrection() const;
 
-            //- Flag to indicate whether model activates heat transfer model
-            virtual bool active() const = 0;
-
 
         // Evaluation
 
@@ -139,7 +133,7 @@ public:
             (
                 const scalar Re,
                 const scalar Pr
-            ) const = 0;
+            ) const;
 
             //- Return heat transfer coefficient
             virtual scalar htc
diff --git a/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/NoHeatTransfer/NoHeatTransfer.C b/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/NoHeatTransfer/NoHeatTransfer.C
index baa929804b191b1687f0a936113c4318ae393539..5ba7ddf56a3b8603530e1eac31cada2e8b687728 100644
--- a/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/NoHeatTransfer/NoHeatTransfer.C
+++ b/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/NoHeatTransfer/NoHeatTransfer.C
@@ -38,6 +38,16 @@ Foam::NoHeatTransfer<CloudType>::NoHeatTransfer
 {}
 
 
+template<class CloudType>
+Foam::NoHeatTransfer<CloudType>::NoHeatTransfer
+(
+    const NoHeatTransfer<CloudType>& htm
+)
+:
+    HeatTransferModel<CloudType>(htm.owner_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template <class CloudType>
@@ -47,13 +57,6 @@ Foam::NoHeatTransfer<CloudType>::~NoHeatTransfer()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-template <class CloudType>
-bool Foam::NoHeatTransfer<CloudType>::active() const
-{
-    return false;
-}
-
-
 template <class CloudType>
 Foam::scalar Foam::NoHeatTransfer<CloudType>::Nu
 (
diff --git a/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/NoHeatTransfer/NoHeatTransfer.H b/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/NoHeatTransfer/NoHeatTransfer.H
index 62a07aa4963f110f3bb6eb22c6475722d1afa3c3..6902b46e9508a48036492aa48f7314f7555052ea 100644
--- a/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/NoHeatTransfer/NoHeatTransfer.H
+++ b/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/NoHeatTransfer/NoHeatTransfer.H
@@ -59,6 +59,18 @@ public:
         //- Construct from dictionary
         NoHeatTransfer(const dictionary&, CloudType& owner);
 
+        //- Construct copy
+        NoHeatTransfer(const NoHeatTransfer<CloudType>& im);
+
+        //- Construct and return a clone
+        virtual autoPtr<HeatTransferModel<CloudType> > clone() const
+        {
+            return autoPtr<HeatTransferModel<CloudType> >
+            (
+                new NoHeatTransfer<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~NoHeatTransfer();
@@ -66,15 +78,8 @@ public:
 
     // Member Functions
 
-        //- Flag to indicate whether model activates heat transfer model
-        virtual bool active() const;
-
         //- Nusselt number
-        virtual scalar Nu
-        (
-            const scalar,
-            const scalar
-        ) const;
+        virtual scalar Nu(const scalar, const scalar) const;
 
         //- Prandtl number
         virtual scalar Pr() const;
diff --git a/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/RanzMarshall/RanzMarshall.C b/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/RanzMarshall/RanzMarshall.C
index 6860b04ca546a8767611ef619da40acc2c5be2ad..b4b8a63c38ee17982fa99626841c01f7061c75e6 100644
--- a/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/RanzMarshall/RanzMarshall.C
+++ b/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/RanzMarshall/RanzMarshall.C
@@ -38,6 +38,13 @@ Foam::RanzMarshall<CloudType>::RanzMarshall
 {}
 
 
+template<class CloudType>
+Foam::RanzMarshall<CloudType>::RanzMarshall(const RanzMarshall<CloudType>& htm)
+:
+    HeatTransferModel<CloudType>(htm)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template <class CloudType>
@@ -47,13 +54,6 @@ Foam::RanzMarshall<CloudType>::~RanzMarshall()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-template <class CloudType>
-bool Foam::RanzMarshall<CloudType>::active() const
-{
-    return true;
-}
-
-
 template <class CloudType>
 Foam::scalar Foam::RanzMarshall<CloudType>::Nu
 (
diff --git a/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/RanzMarshall/RanzMarshall.H b/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/RanzMarshall/RanzMarshall.H
index 6d2f9e6a6e3416626f6d631480daa2411bd0e197..e8278bd68ceb7ab565ed03e3505919d6b6876f3b 100644
--- a/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/RanzMarshall/RanzMarshall.H
+++ b/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/RanzMarshall/RanzMarshall.H
@@ -58,11 +58,19 @@ public:
     // Constructors
 
         //- Construct from dictionary
-        RanzMarshall
-        (
-            const dictionary& dict,
-            CloudType& cloud
-        );
+        RanzMarshall(const dictionary& dict, CloudType& cloud);
+
+        //- Construct copy
+        RanzMarshall(const RanzMarshall<CloudType>& im);
+
+        //- Construct and return a clone
+        virtual autoPtr<HeatTransferModel<CloudType> > clone() const
+        {
+            return autoPtr<HeatTransferModel<CloudType> >
+            (
+                new RanzMarshall<CloudType>(*this)
+            );
+        }
 
 
     //- Destructor
@@ -71,12 +79,6 @@ public:
 
     // Member Functions
 
-        // Access
-
-            //- Flag to indicate whether model activates heat transfer model
-            virtual bool active() const;
-
-
         // Evaluation
 
             //- Nusselt number
diff --git a/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/ThermoLookupTableInjection.C b/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/ThermoLookupTableInjection.C
index 6d7c9aef2cbc416a824da9e538e6a6dc5258f570..5a4df7d0b38ca3003bbe72f3c3fbd1825d6363e9 100644
--- a/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/ThermoLookupTableInjection.C
+++ b/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/ThermoLookupTableInjection.C
@@ -123,6 +123,23 @@ Foam::ThermoLookupTableInjection<CloudType>::ThermoLookupTableInjection
 }
 
 
+template<class CloudType>
+Foam::ThermoLookupTableInjection<CloudType>::ThermoLookupTableInjection
+(
+    const ThermoLookupTableInjection<CloudType>& im
+)
+:
+    InjectionModel<CloudType>(im),
+    inputFileName_(im.inputFileName_),
+    duration_(im.duration_),
+    nParcelsPerSecond_(im.nParcelsPerSecond_),
+    injectors_(im.injectors_),
+    injectorCells_(im.injectorCells_),
+    injectorTetFaces_(im.injectorTetFaces_),
+    injectorTetPts_(im.injectorTetPts_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
@@ -132,13 +149,6 @@ Foam::ThermoLookupTableInjection<CloudType>::~ThermoLookupTableInjection()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-template<class CloudType>
-bool Foam::ThermoLookupTableInjection<CloudType>::active() const
-{
-    return true;
-}
-
-
 template<class CloudType>
 Foam::scalar Foam::ThermoLookupTableInjection<CloudType>::timeEnd() const
 {
diff --git a/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/ThermoLookupTableInjection.H b/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/ThermoLookupTableInjection.H
index 4fd93884b46fa6ea5afdbc9b0b4be8cc239be36f..cf7277428f2ad4d785c36609ed5ac40badd22093 100644
--- a/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/ThermoLookupTableInjection.H
+++ b/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/ThermoLookupTableInjection.H
@@ -98,18 +98,10 @@ protected:
     // Protected Member Functions
 
         //- Number of parcels to introduce over the time step relative to SOI
-        label parcelsToInject
-        (
-            const scalar time0,
-            const scalar time1
-        );
+        virtual label parcelsToInject(const scalar time0, const scalar time1);
 
         //- Volume of parcels to introduce over the time step relative to SOI
-        scalar volumeToInject
-        (
-            const scalar time0,
-            const scalar time1
-        );
+        virtual scalar volumeToInject(const scalar time0, const scalar time1);
 
 
 public:
@@ -121,12 +113,24 @@ public:
     // Constructors
 
         //- Construct from dictionary
+        ThermoLookupTableInjection(const dictionary& dict, CloudType& owner);
+
+        //- Construct copy from owner cloud and injection model
         ThermoLookupTableInjection
         (
-            const dictionary& dict,
-            CloudType& owner
+            CloudType& owner,
+            const ThermoLookupTableInjection<CloudType>& im
         );
 
+        //- Construct and return a clone using supplied owner cloud
+        virtual autoPtr<InjectionModel<CloudType> > clone() const
+        {
+            return autoPtr<InjectionModel<CloudType> >
+            (
+                new ThermoLookupTableInjection<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~ThermoLookupTableInjection();
@@ -134,9 +138,6 @@ public:
 
     // Member Functions
 
-        //- Flag to indicate whether model activates injection model
-        bool active() const;
-
         //- Return the end-of-injection time
         scalar timeEnd() const;
 
diff --git a/src/lagrangian/intermediate/submodels/Thermodynamic/SurfaceFilmModel/ThermoSurfaceFilm/ThermoSurfaceFilm.C b/src/lagrangian/intermediate/submodels/Thermodynamic/SurfaceFilmModel/ThermoSurfaceFilm/ThermoSurfaceFilm.C
index 350017913ca453922a9e81875ba50c72d3a71d16..efc60d46b6751467f390f5608df1a2fe1f6d52ac 100644
--- a/src/lagrangian/intermediate/submodels/Thermodynamic/SurfaceFilmModel/ThermoSurfaceFilm/ThermoSurfaceFilm.C
+++ b/src/lagrangian/intermediate/submodels/Thermodynamic/SurfaceFilmModel/ThermoSurfaceFilm/ThermoSurfaceFilm.C
@@ -42,6 +42,18 @@ Foam::ThermoSurfaceFilm<CloudType>::ThermoSurfaceFilm
 {}
 
 
+template<class CloudType>
+Foam::ThermoSurfaceFilm<CloudType>::ThermoSurfaceFilm
+(
+    const ThermoSurfaceFilm<CloudType>& sfm
+)
+:
+    SurfaceFilmModel<CloudType>(sfm),
+    TFilmPatch_(sfm.TFilmPatch_),
+    CpFilmPatch_(sfm.CpFilmPatch_)
+{}
+
+
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
@@ -51,13 +63,6 @@ Foam::ThermoSurfaceFilm<CloudType>::~ThermoSurfaceFilm()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-template<class CloudType>
-bool Foam::ThermoSurfaceFilm<CloudType>::active() const
-{
-    return true;
-}
-
-
 template<class CloudType>
 bool Foam::ThermoSurfaceFilm<CloudType>::transferParcel
 (
diff --git a/src/lagrangian/intermediate/submodels/Thermodynamic/SurfaceFilmModel/ThermoSurfaceFilm/ThermoSurfaceFilm.H b/src/lagrangian/intermediate/submodels/Thermodynamic/SurfaceFilmModel/ThermoSurfaceFilm/ThermoSurfaceFilm.H
index 4e67803f97f660b31cf1140843a70915eee07ec6..74944fc58c4aa58401bde23bbe17d7c6a9f1f155 100644
--- a/src/lagrangian/intermediate/submodels/Thermodynamic/SurfaceFilmModel/ThermoSurfaceFilm/ThermoSurfaceFilm.H
+++ b/src/lagrangian/intermediate/submodels/Thermodynamic/SurfaceFilmModel/ThermoSurfaceFilm/ThermoSurfaceFilm.H
@@ -95,7 +95,7 @@ public:
 
     // Constructors
 
-        //- Construct from components
+         //- Construct from components
         ThermoSurfaceFilm
         (
             const dictionary& dict,
@@ -103,6 +103,18 @@ public:
             const dimensionedVector& g
         );
 
+        //- Construct copy
+        ThermoSurfaceFilm(const ThermoSurfaceFilm<CloudType>& sfm);
+
+        //- Construct and return a clone using supplied owner cloud
+        virtual autoPtr<SurfaceFilmModel<CloudType> > clone()
+        {
+            return autoPtr<SurfaceFilmModel<CloudType> >
+            (
+                new ThermoSurfaceFilm<CloudType>(*this)
+            );
+        }
+
 
     //- Destructor
     virtual ~ThermoSurfaceFilm();
@@ -112,9 +124,6 @@ public:
 
         // Evaluation
 
-            //- Flag to indicate whether model activates surface film model
-            virtual bool active() const;
-
             //- Transfer parcel from cloud to surface film
             //  Returns true if parcel is to be transferred
             virtual bool transferParcel