diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
index 1a7ba970846633df957532fa649a91b5eebd2043..e2dd07acf1ea8106931ed523afe68fece1e24bce 100644
--- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
+++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
@@ -173,9 +173,32 @@ void Foam::KinematicCloud<ParcelType>::resetSourceTerms()
 }
 
 
+template<class ParcelType>
+void Foam::KinematicCloud<ParcelType>::preEvolve()
+{
+    this->dispersion().cacheFields(true);
+}
+
+
+template<class ParcelType>
+void Foam::KinematicCloud<ParcelType>::postEvolve()
+{
+    if (debug)
+    {
+        this->writePositions();
+    }
+
+    this->dispersion().cacheFields(false);
+
+    this->postProcessing().post();
+}
+
+
 template<class ParcelType>
 void Foam::KinematicCloud<ParcelType>::evolve()
 {
+    preEvolve();
+
     autoPtr<interpolation<scalar> > rhoInterpolator =
         interpolation<scalar>::New
         (
@@ -209,11 +232,6 @@ void Foam::KinematicCloud<ParcelType>::evolve()
 
     this->injection().inject(td);
 
-    if (debug)
-    {
-        this->writePositions();
-    }
-
     if (coupled_)
     {
         resetSourceTerms();
@@ -221,7 +239,7 @@ void Foam::KinematicCloud<ParcelType>::evolve()
 
     Cloud<ParcelType>::move(td);
 
-    this->postProcessing().post();
+    postEvolve();
 }
 
 
diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H
index 538975a912e705f1f4f3f029e23c71d213cc8e1f..077067a97221fa51a0257501ea994d8195f878d9 100644
--- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H
+++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H
@@ -184,6 +184,15 @@ protected:
             DimensionedField<vector, volMesh> UTrans_;
 
 
+        // Cloud evolution functions
+
+            //- Pre-evolve
+            void preEvolve();
+
+            //- Post-evolve
+            void postEvolve();
+
+
 public:
 
     // Constructors
diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C
index d4f4f10c9abe7823f6c99a8fc6605fa8e17ed07b..1e58d2876cc52a74661e11277a2b933524e1d475 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C
+++ b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C
@@ -175,9 +175,25 @@ void Foam::ReactingCloud<ParcelType>::resetSourceTerms()
 }
 
 
+template<class ParcelType>
+void Foam::ReactingCloud<ParcelType>::preEvolve()
+{
+    ThermoCloud<ParcelType>::preEvolve();
+}
+
+
+template<class ParcelType>
+void Foam::ReactingCloud<ParcelType>::postEvolve()
+{
+    ThermoCloud<ParcelType>::postEvolve();
+}
+
+
 template<class ParcelType>
 void Foam::ReactingCloud<ParcelType>::evolve()
 {
+    preEvolve();
+
     const volScalarField& T = this->carrierThermo().T();
     const volScalarField cp = this->carrierThermo().Cp();
     const volScalarField& p = this->carrierThermo().p();
@@ -233,11 +249,6 @@ void Foam::ReactingCloud<ParcelType>::evolve()
 
     this->injection().inject(td);
 
-    if (debug)
-    {
-        this->writePositions();
-    }
-
     if (this->coupled())
     {
         resetSourceTerms();
@@ -245,7 +256,7 @@ void Foam::ReactingCloud<ParcelType>::evolve()
 
     Cloud<ParcelType>::move(td);
 
-    this->postProcessing().post();
+    postEvolve();
 }
 
 
diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.H b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.H
index 4a79c03b6f42ca3ec614c5f782bffcff2bd26c44..74b75ea4162ed61c921b4a3eaf329ed0349fe3f3 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.H
+++ b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.H
@@ -132,6 +132,15 @@ protected:
             );
 
 
+        // Cloud evolution functions
+
+            //- Pre-evolve
+            void preEvolve();
+
+            //- Post-evolve
+            void postEvolve();
+
+
 public:
 
     // Constructors
diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.C b/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.C
index d07db7ed622a5b6efb51f27c2436da58b6f9e478..5e7dee64bcf6f593cde895c9e3f5d34220c269c7 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.C
+++ b/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.C
@@ -129,9 +129,25 @@ void Foam::ReactingMultiphaseCloud<ParcelType>::resetSourceTerms()
 }
 
 
+template<class ParcelType>
+void Foam::ReactingMultiphaseCloud<ParcelType>::preEvolve()
+{
+    ReactingCloud<ParcelType>::preEvolve();
+}
+
+
+template<class ParcelType>
+void Foam::ReactingMultiphaseCloud<ParcelType>::postEvolve()
+{
+    ReactingCloud<ParcelType>::postEvolve();
+}
+
+
 template<class ParcelType>
 void Foam::ReactingMultiphaseCloud<ParcelType>::evolve()
 {
+    preEvolve();
+
     const volScalarField& T = this->carrierThermo().T();
     const volScalarField cp = this->carrierThermo().Cp();
     const volScalarField& p = this->carrierThermo().p();
@@ -187,11 +203,6 @@ void Foam::ReactingMultiphaseCloud<ParcelType>::evolve()
 
     this->injection().inject(td);
 
-    if (debug)
-    {
-        this->writePositions();
-    }
-
     if (this->coupled())
     {
         resetSourceTerms();
@@ -199,7 +210,7 @@ void Foam::ReactingMultiphaseCloud<ParcelType>::evolve()
 
     Cloud<ParcelType>::move(td);
 
-    this->postProcessing().post();
+    postEvolve();
 }
 
 
diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.H b/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.H
index 525b03983cabf044fbd7ec87ceb5d43d4e151005..b073308407451d7655177fa454a2e770a5c19565 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.H
+++ b/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.H
@@ -68,7 +68,7 @@ class ReactingMultiphaseCloud
     public ReactingCloud<ParcelType>,
     public reactingMultiphaseCloud
 {
-    // Private Member Functions
+    // Private member functions
 
         //- Disallow default bitwise copy construct
         ReactingMultiphaseCloud(const ReactingMultiphaseCloud&);
@@ -112,6 +112,17 @@ protected:
             scalar dMassSurfaceReaction_;
 
 
+    // Protected member functions
+
+        // Cloud evolution functions
+
+            //- Pre-evolve
+            void preEvolve();
+
+            //- Post-evolve
+            void postEvolve();
+
+
 public:
 
     // Constructors
diff --git a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C
index 19428d38a1936f8ad0fa6d764657ec422f4db4ea..0585629246ec074406f04a9d4a11c6ce077deb8c 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C
+++ b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C
@@ -142,9 +142,25 @@ void Foam::ThermoCloud<ParcelType>::resetSourceTerms()
 }
 
 
+template<class ParcelType>
+void Foam::ThermoCloud<ParcelType>::preEvolve()
+{
+    KinematicCloud<ParcelType>::preEvolve();
+}
+
+
+template<class ParcelType>
+void Foam::ThermoCloud<ParcelType>::postEvolve()
+{
+    KinematicCloud<ParcelType>::postEvolve();
+}
+
+
 template<class ParcelType>
 void Foam::ThermoCloud<ParcelType>::evolve()
 {
+    preEvolve();
+
     const volScalarField& T = carrierThermo_.T();
     const volScalarField cp = carrierThermo_.Cp();
 
@@ -192,11 +208,6 @@ void Foam::ThermoCloud<ParcelType>::evolve()
 
     this->injection().inject(td);
 
-    if (debug)
-    {
-        this->writePositions();
-    }
-
     if (this->coupled())
     {
         resetSourceTerms();
@@ -204,7 +215,7 @@ void Foam::ThermoCloud<ParcelType>::evolve()
 
     Cloud<ParcelType>::move(td);
 
-    this->postProcessing().post();
+    postEvolve();
 }
 
 
diff --git a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H
index cc8f0fadc8e1d313cf5e1b74fef6eb5ab97ad490..151b0764117334be96ac1df2b4eb8376d0724349 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H
+++ b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H
@@ -118,6 +118,17 @@ protected:
             DimensionedField<scalar, volMesh> hcTrans_;
 
 
+    // Protected member functions
+
+        // Cloud evolution functions
+
+            //- Pre-evolve
+            void preEvolve();
+
+            //- Post-evolve
+            void postEvolve();
+
+
 public:
 
     // Constructors
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionModel/DispersionModel.H b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionModel/DispersionModel.H
index 74131b6fff2592735c594ac5d6fdd2cd83245fca..8587eacccadd6df46244adbdda9403627d604417 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionModel/DispersionModel.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionModel/DispersionModel.H
@@ -121,6 +121,9 @@ public:
         //- 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
         (
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionRASModel/DispersionRASModel.C b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionRASModel/DispersionRASModel.C
index 6c028d0205602a984a591810be5a2b14d8886e8a..3689acf8f4783b985f7e77f8ef37adf591d3f99d 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionRASModel/DispersionRASModel.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionRASModel/DispersionRASModel.C
@@ -42,7 +42,11 @@ Foam::DispersionRASModel<CloudType>::DispersionRASModel
         (
             "RASProperties"
         )
-    )
+    ),
+    kPtr_(NULL),
+    ownK_(false),
+    epsilonPtr_(NULL),
+    ownEpsilon_(false)
 {}
 
 
@@ -50,7 +54,56 @@ Foam::DispersionRASModel<CloudType>::DispersionRASModel
 
 template<class CloudType>
 Foam::DispersionRASModel<CloudType>::~DispersionRASModel()
-{}
+{
+    cacheFields(false);
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class CloudType>
+void Foam::DispersionRASModel<CloudType>::cacheFields(const bool store)
+{
+    if (store)
+    {
+        tmp<volScalarField> tk = this->turbulence().k();
+        if (tk.isTmp())
+        {
+            kPtr_ = tk.ptr();
+            ownK_ = true;
+        }
+        else
+        {
+            kPtr_ = tk.operator->();
+            ownK_ = false;
+        }
+
+        tmp<volScalarField> tepsilon = this->turbulence().epsilon();
+        if (tepsilon.isTmp())
+        {
+            epsilonPtr_ = tepsilon.ptr();
+            ownEpsilon_ = true;
+        }
+        else
+        {
+            epsilonPtr_ = tepsilon.operator->();
+            ownEpsilon_ = false;
+        }
+    }
+    else
+    {
+        if (ownK_ && kPtr_)
+        {
+            delete kPtr_;
+            ownK_ = false;
+        }
+        if (ownEpsilon_ && epsilonPtr_)
+        {
+            delete epsilonPtr_;
+            ownEpsilon_ = false;
+        }
+    }
+}
 
 
 // ************************************************************************* //
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionRASModel/DispersionRASModel.H b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionRASModel/DispersionRASModel.H
index ecda55be49f4a0135752b3e0eb741192ff12ea62..f95ab368854df24e0dca1a23b12a99d66f23d1d4 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionRASModel/DispersionRASModel.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/DispersionRASModel/DispersionRASModel.H
@@ -50,11 +50,27 @@ class DispersionRASModel
 :
     public DispersionModel<CloudType>
 {
-    // Private data
+protected:
+
+    // Protected data
 
         //- Reference to the compressible turbulence model
         const compressible::RASModel& turbulence_;
 
+        // Locally cached turbulence fields
+
+            //- Turbulence k
+            const volScalarField* kPtr_;
+
+            //- Take ownership of the k field
+            bool ownK_;
+
+            //- Turbulence epsilon
+            const volScalarField* epsilonPtr_;
+
+            //- Take ownership of the epsilon field
+            bool ownEpsilon_;
+
 
 public:
 
@@ -78,6 +94,9 @@ public:
 
     // Member Functions
 
+        //- Cache carrier fields
+        virtual void cacheFields(const bool store);
+
         //- Return const access to the turbulence model
         const compressible::RASModel& turbulence() const
         {
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/GradientDispersionRAS/GradientDispersionRAS.C b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/GradientDispersionRAS/GradientDispersionRAS.C
index 8a0fdd898e37f6a826a3d8a220cb4c608ea1f927..7877af745e61c6f51b427b1e9ae39963773414f3 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/GradientDispersionRAS/GradientDispersionRAS.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/GradientDispersionRAS/GradientDispersionRAS.C
@@ -35,7 +35,8 @@ Foam::GradientDispersionRAS<CloudType>::GradientDispersionRAS
     CloudType& owner
 )
 :
-    DispersionRASModel<CloudType>(dict, owner)
+    DispersionRASModel<CloudType>(dict, owner),
+    gradkPtr_(NULL)
 {}
 
 
@@ -43,7 +44,9 @@ Foam::GradientDispersionRAS<CloudType>::GradientDispersionRAS
 
 template<class CloudType>
 Foam::GradientDispersionRAS<CloudType>::~GradientDispersionRAS()
-{}
+{
+    cacheFields(false);
+}
 
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
@@ -55,6 +58,25 @@ bool Foam::GradientDispersionRAS<CloudType>::active() const
 }
 
 
+template<class CloudType>
+void Foam::GradientDispersionRAS<CloudType>::cacheFields(const bool store)
+{
+    DispersionRASModel<CloudType>::cacheFields(store);
+
+    if (store)
+    {
+        gradkPtr_ = fvc::grad(*this->kPtr_).ptr();
+    }
+    else
+    {
+        if (gradkPtr_)
+        {
+            delete gradkPtr_;
+        }
+    }
+}
+
+
 template<class CloudType>
 Foam::vector Foam::GradientDispersionRAS<CloudType>::update
 (
@@ -68,12 +90,9 @@ Foam::vector Foam::GradientDispersionRAS<CloudType>::update
 {
     const scalar cps = 0.16432;
 
-    const tmp<volScalarField> tk = this->turbulence().k();
-    const volScalarField& k = tk();
-    const tmp<volScalarField> tepsilon = this->turbulence().epsilon();
-    const volScalarField& epsilon = tepsilon();
-
-    const volVectorField gradk = fvc::grad(k);
+    const volScalarField& k = *this->kPtr_;
+    const volScalarField& epsilon = *this->epsilonPtr_;
+    const volVectorField& gradk = *this->gradkPtr_;
 
     const scalar UrelMag = mag(U - Uc - UTurb);
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/GradientDispersionRAS/GradientDispersionRAS.H b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/GradientDispersionRAS/GradientDispersionRAS.H
index 9cf99ecc20256ad2005899279b59b4aad12ec719..18391f4eead858e2aa42ba7e55a22f4d634b803a 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/GradientDispersionRAS/GradientDispersionRAS.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/GradientDispersionRAS/GradientDispersionRAS.H
@@ -51,6 +51,14 @@ class GradientDispersionRAS
 :
     public DispersionRASModel<CloudType>
 {
+protected:
+
+    // Locally cached turbulence fields
+
+        //- Gradient of k
+        const volVectorField* gradkPtr_;
+
+
 public:
 
     //- Runtime type information
@@ -76,8 +84,11 @@ public:
         //- Flag to indicate whether model activates injection model
         bool active() const;
 
+        //- Cache carrier fields
+        virtual void cacheFields(const bool store);
+
         //- Update (disperse particles)
-        vector update
+        virtual vector update
         (
             const scalar dt,
             const label celli,
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/NoDispersion/NoDispersion.C b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/NoDispersion/NoDispersion.C
index 56745ef686818ab433e3b3e11c0df6320ea4c0bd..a1927dfcd48e1e9e14fafeaf163c290a9cb34031 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/NoDispersion/NoDispersion.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/NoDispersion/NoDispersion.C
@@ -55,6 +55,13 @@ 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 48e938cc03e767e2e1ad4966457074f849f5ca60..93482c49ae9a164ff617f13d2ed27ae04c50536a 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/NoDispersion/NoDispersion.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/NoDispersion/NoDispersion.H
@@ -72,10 +72,13 @@ public:
     // Member Functions
 
         //- Flag to indicate whether model activates injection model
-        bool active() const;
+        virtual bool active() const;
+
+        //- Cache carrier fields
+        virtual void cacheFields(const bool store);
 
         //- Update (disperse particles)
-        vector update
+        virtual vector update
         (
             const scalar dt,
             const label celli,
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/StochasticDispersionRAS/StochasticDispersionRAS.C b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/StochasticDispersionRAS/StochasticDispersionRAS.C
index d1999cba4de57d4e8fdb7820e269d509e2f3bec8..ffd3fd974a0fb98b3fe17b20ef5ed70810d1f343 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/StochasticDispersionRAS/StochasticDispersionRAS.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/StochasticDispersionRAS/StochasticDispersionRAS.C
@@ -68,10 +68,8 @@ Foam::vector Foam::StochasticDispersionRAS<CloudType>::update
 {
     const scalar cps = 0.16432;
 
-    const tmp<volScalarField> tk = this->turbulence().k();
-    const volScalarField& k = tk();
-    const tmp<volScalarField> tepsilon = this->turbulence().epsilon();
-    const volScalarField& epsilon = tepsilon();
+    const volScalarField& k = *this->kPtr_;
+    const volScalarField& epsilon = *this->epsilonPtr_;
 
     const scalar UrelMag = mag(U - Uc - UTurb);
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/StochasticDispersionRAS/StochasticDispersionRAS.H b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/StochasticDispersionRAS/StochasticDispersionRAS.H
index 46059d4e83c5af162c1f11acf8b8b5ad297636b3..17c70b7814c9b3da80c891b091b82f2c25e31d5a 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/StochasticDispersionRAS/StochasticDispersionRAS.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/DispersionModel/StochasticDispersionRAS/StochasticDispersionRAS.H
@@ -74,10 +74,10 @@ public:
     // Member Functions
 
         //- Flag to indicate whether model activates injection model
-        bool active() const;
+        virtual bool active() const;
 
         //- Update (disperse particles)
-        vector update
+        virtual vector update
         (
             const scalar dt,
             const label celli,