diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
index 63bb2eb7c2b0a0459fea0d9caf1ef56e1f5dec89..b7d6d49e4a965e3c027f2f13fec8aa3a1273e98c 100644
--- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
+++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
@@ -104,7 +104,7 @@ void Foam::KinematicCloud<CloudType>::solve
     {
         cloud.storeState();
 
-        cloud.preEvolve();
+        cloud.preEvolve(td);
 
         evolveCloud(cloud, td);
 
@@ -115,7 +115,7 @@ void Foam::KinematicCloud<CloudType>::solve
     }
     else
     {
-        cloud.preEvolve();
+        cloud.preEvolve(td);
 
         evolveCloud(cloud, td);
 
@@ -127,7 +127,7 @@ void Foam::KinematicCloud<CloudType>::solve
 
     cloud.info();
 
-    cloud.postEvolve();
+    cloud.postEvolve(td);
 
     if (solution_.steadyState())
     {
@@ -230,7 +230,10 @@ void Foam::KinematicCloud<CloudType>::evolveCloud
 
 
 template<class CloudType>
-void Foam::KinematicCloud<CloudType>::postEvolve()
+void Foam::KinematicCloud<CloudType>::postEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {
     Info<< endl;
 
@@ -243,7 +246,7 @@ void Foam::KinematicCloud<CloudType>::postEvolve()
 
     forces_.cacheFields(false);
 
-    functions_.postEvolve();
+    functions_.postEvolve(td);
 
     solution_.nextIter();
 
@@ -306,8 +309,8 @@ Foam::KinematicCloud<CloudType>::KinematicCloud
         IOobject
         (
             cloudName + "Properties",
-            rho.mesh().time().constant(),
-            rho.mesh(),
+            mesh_.time().constant(),
+            mesh_,
             IOobject::MUST_READ_IF_MODIFIED,
             IOobject::NO_WRITE
         )
@@ -506,8 +509,8 @@ Foam::KinematicCloud<CloudType>::KinematicCloud
         IOobject
         (
             name + "Properties",
-            mesh.time().constant(),
-            mesh,
+            mesh_.time().constant(),
+            mesh_,
             IOobject::NO_READ,
             IOobject::NO_WRITE,
             false
@@ -657,7 +660,10 @@ void Foam::KinematicCloud<CloudType>::scaleSources()
 
 
 template<class CloudType>
-void Foam::KinematicCloud<CloudType>::preEvolve()
+void Foam::KinematicCloud<CloudType>::preEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {
     // force calculation of mesh dimensions - needed for parallel runs
     // with topology change due to lazy evaluation of valid mesh dimensions
@@ -672,7 +678,7 @@ void Foam::KinematicCloud<CloudType>::preEvolve()
     pAmbient_ = constProps_.dict().template
         getOrDefault<scalar>("pAmbient", pAmbient_);
 
-    functions_.preEvolve();
+    functions_.preEvolve(td);
 }
 
 
diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H
index 2d71032dbb3909e6a6bedfdcacb7edc18075f9f3..4534c2a36a2551c522c0efef17a170e6fcec03c7 100644
--- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H
+++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
-    Copyright (C) 2016-2019 OpenCFD Ltd.
+    Copyright (C) 2016-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -273,7 +273,7 @@ protected:
             );
 
             //- Post-evolve
-            void postEvolve();
+            void postEvolve(const typename parcelType::trackingData& td);
 
             //- Reset state of cloud
             void cloudReset(KinematicCloud<CloudType>& c);
@@ -590,7 +590,7 @@ public:
             void scaleSources();
 
             //- Pre-evolve
-            void preEvolve();
+            void preEvolve(const typename parcelType::trackingData& td);
 
             //- Evolve the cloud
             void evolve();
diff --git a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C
index a889876ed189ce5d0697577f095a164db4928632..35a0e140b3d48f116a0e16966eadaf122ffc5191 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C
+++ b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -446,9 +447,12 @@ void Foam::ThermoCloud<CloudType>::scaleSources()
 
 
 template<class CloudType>
-void Foam::ThermoCloud<CloudType>::preEvolve()
+void Foam::ThermoCloud<CloudType>::preEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {
-    CloudType::preEvolve();
+    CloudType::preEvolve(td);
 
     this->pAmbient() = thermo_.thermo().p().average().value();
 }
diff --git a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H
index 158e80594e7ff9438634aba9a3b8d337754d4bc1..47dfcb3949ab41bc38a32cd226062b48d54ffebc 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H
+++ b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -358,7 +359,7 @@ public:
             void scaleSources();
 
             //- Pre-evolve
-            void preEvolve();
+            void preEvolve(const typename parcelType::trackingData& td);
 
             //- Evolve the cloud
             void evolve();
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.C
index ed89fc43e4e849eacc0806d16f1270a36c713d00..57bca3973ffe08c91f8490ca7bf096579ee3f6b6 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.C
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.C
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2019 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -84,22 +85,21 @@ Foam::CloudFunctionObject<CloudType>::CloudFunctionObject
 {}
 
 
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
-
-template<class CloudType>
-Foam::CloudFunctionObject<CloudType>::~CloudFunctionObject()
-{}
-
-
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class CloudType>
-void Foam::CloudFunctionObject<CloudType>::preEvolve()
+void Foam::CloudFunctionObject<CloudType>::preEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {}
 
 
 template<class CloudType>
-void Foam::CloudFunctionObject<CloudType>::postEvolve()
+void Foam::CloudFunctionObject<CloudType>::postEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {
     if (this->owner().time().writeTime())
     {
@@ -111,7 +111,7 @@ void Foam::CloudFunctionObject<CloudType>::postEvolve()
 template<class CloudType>
 void Foam::CloudFunctionObject<CloudType>::postMove
 (
-    typename CloudType::parcelType&,
+    parcelType&,
     const scalar,
     const point&,
     bool&
@@ -122,7 +122,7 @@ void Foam::CloudFunctionObject<CloudType>::postMove
 template<class CloudType>
 void Foam::CloudFunctionObject<CloudType>::postPatch
 (
-    const typename CloudType::parcelType&,
+    const parcelType&,
     const polyPatch&,
     bool&
 )
@@ -132,7 +132,7 @@ void Foam::CloudFunctionObject<CloudType>::postPatch
 template<class CloudType>
 void Foam::CloudFunctionObject<CloudType>::postFace
 (
-    const typename CloudType::parcelType&,
+    const parcelType&,
     bool&
 )
 {}
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.H b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.H
index 746f03947c9be60c368db40b0c760da76c9d262d..0949a2ffe18d799e3a0a62a9a7f737bde0944ec4 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.H
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.H
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -63,6 +64,11 @@ class CloudFunctionObject
 :
     public CloudSubModelBase<CloudType>
 {
+private:
+
+        //- Convenience typedef for parcel type
+        typedef typename CloudType::parcelType parcelType;
+
     // Private data
 
         //- Output path
@@ -126,7 +132,7 @@ public:
 
 
     //- Destructor
-    virtual ~CloudFunctionObject();
+    virtual ~CloudFunctionObject() = default;
 
 
     //- Selector
@@ -144,15 +150,18 @@ public:
         // Evaluation
 
             //- Pre-evolve hook
-            virtual void preEvolve();
+            virtual void preEvolve(const typename parcelType::trackingData& td);
 
             //- Post-evolve hook
-            virtual void postEvolve();
+            virtual void postEvolve
+            (
+                const typename parcelType::trackingData& td
+            );
 
             //- Post-move hook
             virtual void postMove
             (
-                typename CloudType::parcelType& p,
+                parcelType& p,
                 const scalar dt,
                 const point& position0,
                 bool& keepParticle
@@ -161,7 +170,7 @@ public:
             //- Post-patch hook
             virtual void postPatch
             (
-                const typename CloudType::parcelType& p,
+                const parcelType& p,
                 const polyPatch& pp,
                 bool& keepParticle
             );
@@ -169,7 +178,7 @@ public:
             //- Post-face hook
             virtual void postFace
             (
-                const typename CloudType::parcelType& p,
+                const parcelType& p,
                 bool& keepParticle
             );
 
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.C
index de2822ed1c2a11c5e830a452e1bcea1d16ec6541..17130ec921bc7100216a9e3278917c18263a0b7f 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.C
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.C
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -103,31 +104,30 @@ Foam::CloudFunctionObjectList<CloudType>::CloudFunctionObjectList
 {}
 
 
-// * * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * //
-
-template<class CloudType>
-Foam::CloudFunctionObjectList<CloudType>::~CloudFunctionObjectList()
-{}
-
-
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class CloudType>
-void Foam::CloudFunctionObjectList<CloudType>::preEvolve()
+void Foam::CloudFunctionObjectList<CloudType>::preEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {
     forAll(*this, i)
     {
-        this->operator[](i).preEvolve();
+        this->operator[](i).preEvolve(td);
     }
 }
 
 
 template<class CloudType>
-void Foam::CloudFunctionObjectList<CloudType>::postEvolve()
+void Foam::CloudFunctionObjectList<CloudType>::postEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {
     forAll(*this, i)
     {
-        this->operator[](i).postEvolve();
+        this->operator[](i).postEvolve(td);
     }
 }
 
@@ -135,7 +135,7 @@ void Foam::CloudFunctionObjectList<CloudType>::postEvolve()
 template<class CloudType>
 void Foam::CloudFunctionObjectList<CloudType>::postMove
 (
-    typename CloudType::parcelType& p,
+    parcelType& p,
     const scalar dt,
     const point& position0,
     bool& keepParticle
@@ -156,7 +156,7 @@ void Foam::CloudFunctionObjectList<CloudType>::postMove
 template<class CloudType>
 void Foam::CloudFunctionObjectList<CloudType>::postPatch
 (
-    const typename CloudType::parcelType& p,
+    const parcelType& p,
     const polyPatch& pp,
     bool& keepParticle
 )
@@ -176,7 +176,7 @@ void Foam::CloudFunctionObjectList<CloudType>::postPatch
 template<class CloudType>
 void Foam::CloudFunctionObjectList<CloudType>::postFace
 (
-    const typename CloudType::parcelType& p,
+    const parcelType& p,
     bool& keepParticle
 )
 {
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.H b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.H
index 4354bf451c1c97ec345c30a99b611d13b334a0b9..41e0a28df4bcaab4140d93b06681d049e435ef96 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.H
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.H
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -55,6 +56,12 @@ class CloudFunctionObjectList
 :
     public PtrList<CloudFunctionObject<CloudType>>
 {
+private:
+
+        //- Convenience typedef for parcel type
+        typedef typename CloudType::parcelType parcelType;
+
+
 protected:
 
     // Protected Data
@@ -86,7 +93,7 @@ public:
 
 
     //- Destructor
-    virtual ~CloudFunctionObjectList();
+    virtual ~CloudFunctionObjectList() = default;
 
 
     // Member Functions
@@ -106,15 +113,21 @@ public:
         // Evaluation
 
             //- Pre-evolve hook
-            virtual void preEvolve();
+            virtual void preEvolve
+            (
+                const typename parcelType::trackingData& td
+            );
 
             //- Post-evolve hook
-            virtual void postEvolve();
+            virtual void postEvolve
+            (
+                const typename parcelType::trackingData& td
+            );
 
             //- Post-move hook
             virtual void postMove
             (
-                typename CloudType::parcelType& p,
+                parcelType& p,
                 const scalar dt,
                 const point& position0,
                 bool& keepParticle
@@ -123,7 +136,7 @@ public:
             //- Post-patch hook
             virtual void postPatch
             (
-                const typename CloudType::parcelType& p,
+                const parcelType& p,
                 const polyPatch& pp,
                 bool& keepParticle
             );
@@ -131,7 +144,7 @@ public:
             //- Post-face hook
             virtual void postFace
             (
-                const typename CloudType::parcelType& p,
+                const parcelType& p,
                 bool& keepParticle
             );
 };
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.C
index ba9b0ffc9b7cf09fdfbcfb3ae9179d47e578ff11..a5e187ca062e509f0aa139cf1f39e4fe17935053 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.C
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.C
@@ -347,13 +347,6 @@ Foam::FacePostProcessing<CloudType>::FacePostProcessing
 {}
 
 
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
-
-template<class CloudType>
-Foam::FacePostProcessing<CloudType>::~FacePostProcessing()
-{}
-
-
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class CloudType>
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.H b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.H
index 5c8c81f3bd40cd4bdb0c51e1eeb6491e17b49a6c..087b116d4018c613039db075299d8949121ab46e 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.H
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.H
@@ -149,19 +149,14 @@ public:
 
 
     //- Destructor
-    virtual ~FacePostProcessing();
+    virtual ~FacePostProcessing() = default;
 
 
     // Member Functions
 
-    // Access
-
         //- Should data be reset on write?
         inline bool resetOnWrite() const;
 
-
-    // Evaluation
-
         //- Post-face hook
         virtual void postFace(const parcelType& p, bool& keepParticle);
 };
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.C
index 94b5b2a50646fcdac983048b3c32e21b6fea861b..3764a682ace0a2485c11150facbd5db21c38d572 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.C
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.C
@@ -636,13 +636,6 @@ Foam::ParticleCollector<CloudType>::ParticleCollector
 {}
 
 
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
-
-template<class CloudType>
-Foam::ParticleCollector<CloudType>::~ParticleCollector()
-{}
-
-
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class CloudType>
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.H b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.H
index afd837efa2b7f1846ca79c827282b020863edc0e..b4bdd2ce3eb9db788dc2afaa44af6f0215ed03f7 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.H
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.H
@@ -273,19 +273,14 @@ public:
 
 
     //- Destructor
-    virtual ~ParticleCollector();
+    virtual ~ParticleCollector() = default;
 
 
     // Member Functions
 
-    // Access
-
         //- Should data be reset on write?
         inline bool resetOnWrite() const;
 
-
-    // Evaluation
-
         //- Post-move hook
         virtual void postMove
         (
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleErosion/ParticleErosion.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleErosion/ParticleErosion.C
index 289fc93fde59ac85945e4e8954b20d03b79c15ed..a0aaae320246083ae211c79631e6698d6a8217a6 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleErosion/ParticleErosion.C
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleErosion/ParticleErosion.C
@@ -30,6 +30,37 @@ License
 
 // * * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * //
 
+template<class CloudType>
+void Foam::ParticleErosion<CloudType>::resetQ()
+{
+    if (QPtr_.valid())
+    {
+        QPtr_->primitiveFieldRef() = 0.0;
+    }
+    else
+    {
+        const fvMesh& mesh = this->owner().mesh();
+
+        QPtr_.reset
+        (
+            new volScalarField
+            (
+                IOobject
+                (
+                    this->owner().name() + "Q",
+                    mesh.time().timeName(),
+                    mesh,
+                    IOobject::READ_IF_PRESENT,
+                    IOobject::NO_WRITE
+                ),
+                mesh,
+                dimensionedScalar(dimVolume, Zero)
+            )
+        );
+    }
+}
+
+
 template<class CloudType>
 Foam::label Foam::ParticleErosion<CloudType>::applyToPatch
 (
@@ -103,8 +134,8 @@ Foam::ParticleErosion<CloudType>::ParticleErosion
 
     patchIDs_ = uniqIds.sortedToc();
 
-    // trigger creation of the Q field
-    preEvolve();
+    // Trigger creation of the Q field
+    resetQ();
 }
 
 
@@ -126,33 +157,12 @@ Foam::ParticleErosion<CloudType>::ParticleErosion
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class CloudType>
-void Foam::ParticleErosion<CloudType>::preEvolve()
+void Foam::ParticleErosion<CloudType>::preEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {
-    if (QPtr_.valid())
-    {
-        QPtr_->primitiveFieldRef() = 0.0;
-    }
-    else
-    {
-        const fvMesh& mesh = this->owner().mesh();
-
-        QPtr_.reset
-        (
-            new volScalarField
-            (
-                IOobject
-                (
-                    this->owner().name() + "Q",
-                    mesh.time().timeName(),
-                    mesh,
-                    IOobject::READ_IF_PRESENT,
-                    IOobject::NO_WRITE
-                ),
-                mesh,
-                dimensionedScalar(dimVolume, Zero)
-            )
-        );
-    }
+    resetQ();
 }
 
 
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleErosion/ParticleErosion.H b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleErosion/ParticleErosion.H
index a9b54bf79b3de244645211e630a260fc979de127..2a818fa7d91195636e0fbd243eb4dd89a41d9f21 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleErosion/ParticleErosion.H
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleErosion/ParticleErosion.H
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -85,6 +86,9 @@ protected:
 
     // Protected Member Functions
 
+        //- Create|read|reset the Q field
+        void resetQ();
+
         //- Returns local patchi if patch is in patchIds_ list
         label applyToPatch(const label globalPatchi) const;
 
@@ -130,7 +134,10 @@ public:
         // Evaluation
 
             //- Pre-evolve hook
-            virtual void preEvolve();
+            virtual void preEvolve
+            (
+                const typename parcelType::trackingData& td
+            );
 
             //- Post-patch hook
             virtual void postPatch
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTracks/ParticleTracks.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTracks/ParticleTracks.C
index 2730359b5e0f8363f5efb463a867fc2d81d605a2..52f75c099a71edc1f577745376ce18e84ff92105 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTracks/ParticleTracks.C
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTracks/ParticleTracks.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -86,17 +86,13 @@ Foam::ParticleTracks<CloudType>::ParticleTracks
 {}
 
 
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
-
-template<class CloudType>
-Foam::ParticleTracks<CloudType>::~ParticleTracks()
-{}
-
-
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class CloudType>
-void Foam::ParticleTracks<CloudType>::preEvolve()
+void Foam::ParticleTracks<CloudType>::preEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {
     if (!cloudPtr_.valid())
     {
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTracks/ParticleTracks.H b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTracks/ParticleTracks.H
index 05b156554d047cd7113591cc0a76c53ca3480cd2..3bd704aeb0a13a632d08583e316d37ef0b1c0dda 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTracks/ParticleTracks.H
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTracks/ParticleTracks.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -118,7 +118,7 @@ public:
 
 
     //- Destructor
-    virtual ~ParticleTracks();
+    virtual ~ParticleTracks() = default;
 
 
     // Member Functions
@@ -144,7 +144,10 @@ public:
     // Evaluation
 
         //- Pre-evolve hook
-        virtual void preEvolve();
+        virtual void preEvolve
+        (
+            const typename parcelType::trackingData& td
+        );
 
         //- Post-face hook
         virtual void postFace(const parcelType& p, bool& keepParticle);
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTrap/ParticleTrap.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTrap/ParticleTrap.C
index e0c5c2e462dd4e44ea32c2a3b2836dbad4b9fe6f..6e4f0b4d2f42beab628e4c1cdb5af51d067bd341 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTrap/ParticleTrap.C
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTrap/ParticleTrap.C
@@ -64,17 +64,13 @@ Foam::ParticleTrap<CloudType>::ParticleTrap
 {}
 
 
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
-
-template<class CloudType>
-Foam::ParticleTrap<CloudType>::~ParticleTrap()
-{}
-
-
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class CloudType>
-void Foam::ParticleTrap<CloudType>::preEvolve()
+void Foam::ParticleTrap<CloudType>::preEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {
     if (alphaPtr_ == nullptr)
     {
@@ -97,7 +93,10 @@ void Foam::ParticleTrap<CloudType>::preEvolve()
 
 
 template<class CloudType>
-void Foam::ParticleTrap<CloudType>::postEvolve()
+void Foam::ParticleTrap<CloudType>::postEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {
     gradAlphaPtr_.clear();
 }
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTrap/ParticleTrap.H b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTrap/ParticleTrap.H
index 3a02c963e2c54c7cdfb58959e99314cca3de6e58..500dd9d595df30ae24548d2a2528a528884f843e 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTrap/ParticleTrap.H
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTrap/ParticleTrap.H
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2012-2017 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -119,7 +120,7 @@ public:
 
 
     //- Destructor
-    virtual ~ParticleTrap();
+    virtual ~ParticleTrap() = default;
 
 
     // Member Functions
@@ -127,15 +128,21 @@ public:
         // Evaluation
 
             //- Pre-evolve hook
-            virtual void preEvolve();
+            virtual void preEvolve
+            (
+                const typename parcelType::trackingData& td
+            );
 
             //- Post-evolve hook
-            virtual void postEvolve();
+            virtual void postEvolve
+            (
+                const typename parcelType::trackingData& td
+            );
 
             //- Post-move hook
             virtual void postMove
             (
-                typename CloudType::parcelType& p,
+                parcelType& p,
                 const scalar dt,
                 const point& position0,
                 bool& keepParticle
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/PatchCollisionDensity/PatchCollisionDensity.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/PatchCollisionDensity/PatchCollisionDensity.C
index 9b7665d7c171fad5e871486bbb96fc99377cec2e..e61404fb013c19481f123d298f4d9f63ad010947 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/PatchCollisionDensity/PatchCollisionDensity.C
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/PatchCollisionDensity/PatchCollisionDensity.C
@@ -136,13 +136,6 @@ Foam::PatchCollisionDensity<CloudType>::PatchCollisionDensity
 {}
 
 
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
-
-template<class CloudType>
-Foam::PatchCollisionDensity<CloudType>::~PatchCollisionDensity()
-{}
-
-
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class CloudType>
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/PatchCollisionDensity/PatchCollisionDensity.H b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/PatchCollisionDensity/PatchCollisionDensity.H
index 5e97b8811f45f8fe4c22e25aeb8018d9a1a0338d..f9ae499115f68ef70587096153e975bac862302e 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/PatchCollisionDensity/PatchCollisionDensity.H
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/PatchCollisionDensity/PatchCollisionDensity.H
@@ -120,20 +120,18 @@ public:
 
 
     //- Destructor
-    virtual ~PatchCollisionDensity();
+    virtual ~PatchCollisionDensity() = default;
 
 
     // Member Functions
 
-        // Evaluation
-
-            //- Post-patch hook
-            virtual void postPatch
-            (
-                const parcelType& p,
-                const polyPatch& pp,
-                bool& keepParticle
-            );
+        //- Post-patch hook
+        virtual void postPatch
+        (
+            const parcelType& p,
+            const polyPatch& pp,
+            bool& keepParticle
+        );
 };
 
 
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/VoidFraction/VoidFraction.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/VoidFraction/VoidFraction.C
index c5a8c56d3dce551b231f920431f84fa3c85cb08b..67028c47e69c39ac937019ee8385d2c7fc2e1bc0 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/VoidFraction/VoidFraction.C
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/VoidFraction/VoidFraction.C
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -70,17 +71,13 @@ Foam::VoidFraction<CloudType>::VoidFraction
 {}
 
 
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
-
-template<class CloudType>
-Foam::VoidFraction<CloudType>::~VoidFraction()
-{}
-
-
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class CloudType>
-void Foam::VoidFraction<CloudType>::preEvolve()
+void Foam::VoidFraction<CloudType>::preEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {
     if (thetaPtr_.valid())
     {
@@ -111,7 +108,10 @@ void Foam::VoidFraction<CloudType>::preEvolve()
 
 
 template<class CloudType>
-void Foam::VoidFraction<CloudType>::postEvolve()
+void Foam::VoidFraction<CloudType>::postEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {
     volScalarField& theta = thetaPtr_();
 
@@ -119,7 +119,7 @@ void Foam::VoidFraction<CloudType>::postEvolve()
 
     theta.primitiveFieldRef() /= mesh.time().deltaTValue()*mesh.V();
 
-    CloudFunctionObject<CloudType>::postEvolve();
+    CloudFunctionObject<CloudType>::postEvolve(td);
 }
 
 
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/VoidFraction/VoidFraction.H b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/VoidFraction/VoidFraction.H
index 79590532e9c762161e40d32983258bc42b73306e..b8761066838ed9aa84a717780c3882a6392a37e9 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/VoidFraction/VoidFraction.H
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/VoidFraction/VoidFraction.H
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -107,7 +108,7 @@ public:
 
 
     //- Destructor
-    virtual ~VoidFraction();
+    virtual ~VoidFraction() = default;
 
 
     // Member Functions
@@ -115,10 +116,16 @@ public:
         // Evaluation
 
             //- Pre-evolve hook
-            virtual void preEvolve();
+            virtual void preEvolve
+            (
+                const typename parcelType::trackingData& td
+            );
 
             //- Post-evolve hook
-            virtual void postEvolve();
+            virtual void postEvolve
+            (
+                const typename parcelType::trackingData& td
+            );
 
             //- Post-move hook
             virtual void postMove