diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
index efa21e2a5b7edde7c1ad041ae3aa4c1508cdd19c..9a2a7cd19b579ac23f09c8203c9a90dd7fb926d5 100644
--- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
+++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
@@ -126,6 +126,16 @@ Foam::scalar Foam::KinematicCloud<ParcelType>::cloudSolution::relaxCoeff
 }
 
 
+template<class ParcelType>
+bool Foam::KinematicCloud<ParcelType>::cloudSolution::semiImplicit
+(
+    const word& fieldName
+) const
+{
+    return readBool(sourceTermDict().subDict(fieldName).lookup("semiImplicit"));
+}
+
+
 template<class ParcelType>
 bool Foam::KinematicCloud<ParcelType>::cloudSolution::sourceActive() const
 {
@@ -495,6 +505,22 @@ Foam::KinematicCloud<ParcelType>::KinematicCloud
             mesh_,
             dimensionedVector("zero", dimMass*dimVelocity, vector::zero)
         )
+    ),
+    UCoeff_
+    (
+        new DimensionedField<scalar, volMesh>
+        (
+            IOobject
+            (
+                this->name() + "UCoeff",
+                this->db().time().timeName(),
+                this->db(),
+                IOobject::READ_IF_PRESENT,
+                IOobject::AUTO_WRITE
+            ),
+            mesh_,
+            dimensionedScalar("zero",  dimMass/dimTime, 0.0)
+        )
     )
 {
     if (readFields)
@@ -556,7 +582,24 @@ Foam::KinematicCloud<ParcelType>::KinematicCloud
             c.UTrans_().dimensions(),
             c.UTrans_().field()
         )
+    ),
+    UCoeff_
+    (
+        new DimensionedField<scalar, volMesh>
+        (
+            IOobject
+            (
+                name + "UCoeff",
+                this->db().time().timeName(),
+                this->db(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            c.UCoeff_()
+        )
     )
+
 {}
 
 
@@ -602,7 +645,8 @@ Foam::KinematicCloud<ParcelType>::KinematicCloud
     postProcessingModel_(NULL),
     surfaceFilmModel_(NULL),
     UIntegrator_(NULL),
-    UTrans_(NULL)
+    UTrans_(NULL),
+    UCoeff_(NULL)
 {}
 
 
@@ -658,6 +702,7 @@ template<class ParcelType>
 void Foam::KinematicCloud<ParcelType>::resetSourceTerms()
 {
     UTrans().field() = vector::zero;
+    UCoeff().field() = 0.0;
 }
 
 
diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H
index 55b3aa3339c0c45152448ef09f01febebca9410e..a43f20cbb756e2461769585ea8b9a8684b391250 100644
--- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H
+++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H
@@ -187,6 +187,9 @@ public:
                 //- Return relaxation coefficient for field
                 scalar relaxCoeff(const word& fieldName) const;
 
+                //- Return semi-implicit flag coefficient for field
+                bool semiImplicit(const word& fieldName) const;
+
                 //- Return reference to the mesh
                 inline const fvMesh& mesh() const;
 
@@ -323,6 +326,9 @@ protected:
             //- Momentum
             autoPtr<DimensionedField<vector, volMesh> > UTrans_;
 
+            //- Coefficient for carrier phase U equation
+            autoPtr<DimensionedField<scalar, volMesh> > UCoeff_;
+
 
         // Cloud evolution functions
 
@@ -536,8 +542,15 @@ public:
                     inline const DimensionedField<vector, volMesh>&
                         UTrans() const;
 
-                    //- Return tmp momentum source term - fully explicit
-                    inline tmp<DimensionedField<vector, volMesh> > SU() const;
+                     //- Return coefficient for carrier phase U equation
+                    inline DimensionedField<scalar, volMesh>& UCoeff();
+
+                    //- Return const coefficient for carrier phase U equation
+                    inline const DimensionedField<scalar, volMesh>&
+                        UCoeff() const;
+
+                    //- Return tmp momentum source term
+                    inline tmp<fvVectorMatrix> SU(volVectorField& U) const;
 
 
         // Check
diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H
index d7a9ccbc6954079e7abe20060e0712e19b4fb4c6..94b816c8e7d519b2db59c131099d9c16073bb66c 100644
--- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H
+++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H
@@ -410,38 +410,54 @@ Foam::KinematicCloud<ParcelType>::UTrans() const
 
 
 template<class ParcelType>
-inline Foam::tmp<Foam::DimensionedField<Foam::vector, Foam::volMesh> >
-Foam::KinematicCloud<ParcelType>::SU() const
+inline Foam::DimensionedField<Foam::scalar, Foam::volMesh>&
+Foam::KinematicCloud<ParcelType>::UCoeff()
 {
-    tmp<DimensionedField<vector, volMesh> > tSU
-    (
-        new DimensionedField<vector, volMesh>
-        (
-            IOobject
-            (
-                this->name() + "SU",
-                this->db().time().timeName(),
-                this->mesh(),
-                IOobject::NO_READ,
-                IOobject::NO_WRITE
-            ),
-            this->mesh(),
-            dimensionedVector
-            (
-                "zero",
-                dimDensity*dimVelocity/dimTime,
-                vector::zero
-            )
-        )
-    );
+    return UCoeff_();
+}
+
+
+template<class ParcelType>
+inline const Foam::DimensionedField<Foam::scalar, Foam::volMesh>&
+Foam::KinematicCloud<ParcelType>::UCoeff() const
+{
+    return UCoeff_();
+}
+
+
+template<class ParcelType>
+inline Foam::tmp<Foam::fvVectorMatrix>
+Foam::KinematicCloud<ParcelType>::SU(volVectorField& U) const
+{
+    if (debug)
+    {
+        Info<< "UTrans min/max = " << min(UTrans()).value() << ", "
+            << max(UTrans()).value() << nl
+            << "UCoeff min/max = " << min(UCoeff()).value() << ", "
+            << max(UCoeff()).value() << endl;
+    }
 
     if (solution_.sourceActive())
     {
-        vectorField& SU = tSU().field();
-        SU = UTrans()/(mesh_.V()*this->db().time().deltaT());
+        if (solution_.semiImplicit("UTrans"))
+        {
+            return
+                UTrans()/(mesh_.V()*this->db().time().deltaT())
+              + fvm::SuSp(-UCoeff().dimensionedInternalField()/mesh_.V(), U)
+              + UCoeff()/mesh_.V()*U;
+        }
+        else
+        {
+            tmp<fvVectorMatrix> tfvm(new fvVectorMatrix(U, dimForce));
+            fvVectorMatrix& fvm = tfvm();
+
+            fvm.source() = -UTrans()/(this->db().time().deltaT());
+
+            return tfvm;
+        }
     }
 
-    return tSU;
+    return tmp<fvVectorMatrix>(new fvVectorMatrix(U, dimForce));
 }
 
 
diff --git a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C
index 32f5061dd07ba17fc6d1e17d62a13da8965f3922..69cde7fe7c025dcd2e61753c7d37e9db2758a2a5 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C
+++ b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C
@@ -103,7 +103,25 @@ Foam::ThermoCloud<ParcelType>::ThermoCloud
             this->mesh(),
             dimensionedScalar("zero", dimEnergy, 0.0)
         )
+    ),
+    hsCoeff_
+    (
+        new DimensionedField<scalar, volMesh>
+        (
+            IOobject
+            (
+                this->name() + "hsCoeff",
+                this->db().time().timeName(),
+                this->db(),
+                IOobject::READ_IF_PRESENT,
+                IOobject::AUTO_WRITE
+            ),
+            this->mesh(),
+            dimensionedScalar("zero", dimEnergy/dimTime/dimTemperature, 0.0),
+            zeroGradientFvPatchScalarField::typeName
+        )
     )
+
 {
     if (readFields)
     {
@@ -149,6 +167,22 @@ Foam::ThermoCloud<ParcelType>::ThermoCloud
             ),
             c.hsTrans()
         )
+    ),
+    hsCoeff_
+    (
+        new DimensionedField<scalar, volMesh>
+        (
+            IOobject
+            (
+                this->name() + "hsCoeff",
+                this->db().time().timeName(),
+                this->db(),
+                IOobject::NO_READ,
+                IOobject::NO_WRITE,
+                false
+            ),
+            c.hsCoeff()
+        )
     )
 {}
 
@@ -171,7 +205,8 @@ Foam::ThermoCloud<ParcelType>::ThermoCloud
     heatTransferModel_(NULL),
     TIntegrator_(NULL),
     radiation_(false),
-    hsTrans_(NULL)
+    hsTrans_(NULL),
+    hsCoeff_(NULL)
 {}
 
 
@@ -233,6 +268,7 @@ void Foam::ThermoCloud<ParcelType>::resetSourceTerms()
 {
     KinematicCloud<ParcelType>::resetSourceTerms();
     hsTrans_->field() = 0.0;
+    hsCoeff_->field() = 0.0;
 }
 
 
diff --git a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H
index f730bc04b6ceebb6b4ef381aea770f0e10b0c466..0d5a75f4aea73111c42c9d6bc03650053f643c80 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H
+++ b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H
@@ -122,6 +122,9 @@ protected:
             //- Sensible enthalpy transfer [J/kg]
             autoPtr<DimensionedField<scalar, volMesh> > hsTrans_;
 
+            //- Coefficient for carrier phase hs equation [W/K]
+            autoPtr<DimensionedField<scalar, volMesh> > hsCoeff_;
+
 
     // Protected Member Functions
 
@@ -232,8 +235,15 @@ public:
                     inline const DimensionedField<scalar, volMesh>&
                         hsTrans() const;
 
-                    //- Return enthalpy source [J/kg/m3/s]
-                    inline tmp<DimensionedField<scalar, volMesh> > Sh() const;
+                    //- Return coefficient for carrier phase hs equation
+                    inline DimensionedField<scalar, volMesh>& hsCoeff();
+
+                    //- Return const coefficient for carrier phase hs equation
+                    inline const DimensionedField<scalar, volMesh>&
+                        hsCoeff() const;
+
+                    //- Return sensible enthalpy source term [J/kg/m3/s]
+                    inline tmp<fvScalarMatrix> Sh(volScalarField& hs) const;
 
 
                 // Radiation - overrides thermoCloud virtual abstract members
diff --git a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H
index 4928b61953586bef4ff5340a5d1164c847c65e48..e1c6e88f14c86c4fcb3c4f34ad27ab89d6f7c764 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H
+++ b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H
@@ -98,34 +98,60 @@ Foam::ThermoCloud<ParcelType>::hsTrans() const
 
 
 template<class ParcelType>
-inline Foam::tmp<Foam::DimensionedField<Foam::scalar, Foam::volMesh> >
-Foam::ThermoCloud<ParcelType>::Sh() const
+inline Foam::DimensionedField<Foam::scalar, Foam::volMesh>&
+Foam::ThermoCloud<ParcelType>::hsCoeff()
 {
-    tmp<DimensionedField<scalar, volMesh> > tSh
-    (
-        new DimensionedField<scalar, volMesh>
-        (
-            IOobject
-            (
-                this->name() + "Sh",
-                this->db().time().timeName(),
-                this->mesh(),
-                IOobject::NO_READ,
-                IOobject::NO_WRITE,
-                false
-            ),
-            this->mesh(),
-            dimensionedScalar("zero", dimEnergy/dimVolume/dimTime, 0.0)
-        )
-    );
+    return hsCoeff_();
+}
+
+
+template<class ParcelType>
+inline const Foam::DimensionedField<Foam::scalar, Foam::volMesh>&
+Foam::ThermoCloud<ParcelType>::hsCoeff() const
+{
+    return hsCoeff_();
+}
+
+
+template<class ParcelType>
+inline Foam::tmp<Foam::fvScalarMatrix>
+Foam::ThermoCloud<ParcelType>::Sh(volScalarField& hs) const
+{
+    if (debug)
+    {
+        Info<< "hsTrans min/max = " << min(hsTrans()).value() << ", "
+            << max(hsTrans()).value() << nl
+            << "hsCoeff min/max = " << min(hsCoeff()).value() << ", "
+            << max(hsCoeff()).value() << endl;
+    }
 
     if (this->solution().sourceActive())
     {
-        scalarField& Sh = tSh();
-        Sh = hsTrans_()/(this->mesh().V()*this->db().time().deltaT());
+        if (this->solution().semiImplicit("hsTrans"))
+        {
+            const volScalarField Cp = thermo_.thermo().Cp();
+
+            return
+                hsTrans()/(this->mesh().V()*this->db().time().deltaT())
+              + fvm::SuSp
+                (
+                   -hsCoeff().dimensionedInternalField()/(Cp*this->mesh().V()),
+                    hs
+                )
+              + hsCoeff()/(Cp*this->mesh().V())*hs;
+        }
+        else
+        {
+            tmp<fvScalarMatrix> tfvm(new fvScalarMatrix(hs, dimEnergy/dimTime));
+            fvScalarMatrix& fvm = tfvm();
+
+            fvm.source() = -hsTrans()/(this->db().time().deltaT());
+
+            return tfvm;
+        }
     }
 
-    return tSh;
+    return tmp<fvScalarMatrix>(new fvScalarMatrix(hs, dimEnergy/dimTime));
 }
 
 
diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C
index 08b09cf34f299b6aaf1493db85bf984b9054fa1b..92ce3f88d49c760385899a25d0e44bd8aeb72ec2 100644
--- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C
+++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C
@@ -121,8 +121,23 @@ void Foam::KinematicParcel<ParcelType>::calc
     // ~~~~~~
 
     // Calculate new particle velocity
+    scalar Cud = 0.0;
     vector U1 =
-        calcVelocity(td, dt, cellI, Re, muc_, d0, U0, rho0, mass0, Su, dUTrans);
+        calcVelocity
+        (
+            td,
+            dt,
+            cellI,
+            Re,
+            muc_,
+            d0,
+            U0,
+            rho0,
+            mass0,
+            Su,
+            dUTrans,
+            Cud
+        );
 
 
     // Accumulate carrier phase source terms
@@ -131,6 +146,9 @@ void Foam::KinematicParcel<ParcelType>::calc
     {
         // Update momentum transfer
         td.cloud().UTrans()[cellI] += np0*dUTrans;
+
+        // Update momentum transfer coefficient
+        td.cloud().UCoeff()[cellI] += np0*mass0*Cud;
     }
 
 
@@ -154,7 +172,8 @@ const Foam::vector Foam::KinematicParcel<ParcelType>::calcVelocity
     const scalar rho,
     const scalar mass,
     const vector& Su,
-    vector& dUTrans
+    vector& dUTrans,
+    scalar& Cud
 ) const
 {
     const polyMesh& mesh = this->cloud().pMesh();
@@ -165,7 +184,7 @@ const Foam::vector Foam::KinematicParcel<ParcelType>::calcVelocity
     tetIndices tetIs = this->currentTetIndices();
 
     // Momentum source due to particle forces
-    const vector FCoupled = mass*td.cloud().forces().calcCoupled
+    const vector Fcp = mass*td.cloud().forces().calcCoupled
     (
         this->position(),
         tetIs,
@@ -177,7 +196,7 @@ const Foam::vector Foam::KinematicParcel<ParcelType>::calcVelocity
         d
     );
 
-    const vector FNonCoupled = mass*td.cloud().forces().calcNonCoupled
+    const vector Fncp = mass*td.cloud().forces().calcNonCoupled
     (
         this->position(),
         tetIs,
@@ -195,15 +214,17 @@ const Foam::vector Foam::KinematicParcel<ParcelType>::calcVelocity
 
     // Update velocity - treat as 3-D
     const scalar As = this->areaS(d);
-    const vector ap = Uc_ + (FCoupled + FNonCoupled + Su)/(utc*As);
+    const vector ap = Uc_ + (Fcp + Fncp + Su)/(utc*As);
     const scalar bp = 6.0*utc/(rho*d);
 
+    Cud = bp;
+
     IntegrationScheme<vector>::integrationResult Ures =
         td.cloud().UIntegrator().integrate(U, dt, ap, bp);
 
     vector Unew = Ures.value();
 
-    dUTrans += dt*(utc*As*(Ures.average() - Uc_) - FCoupled);
+    dUTrans += dt*(utc*As*(Ures.average() - Uc_) - Fcp);
 
     // Apply correction to velocity and dUTrans for reduced-D cases
     meshTools::constrainDirection(mesh, mesh.solutionD(), Unew);
diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H
index 3855b707a2b51970296269d4797e7b1a5bd12c5b..afc6a98e61819222bc904d72601a10aac6f83ec0 100644
--- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H
+++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H
@@ -308,7 +308,8 @@ protected:
             const scalar rho,          // density
             const scalar mass,         // mass
             const vector& Su,          // explicit particle momentum source
-            vector& dUTrans            // momentum transfer to carrier
+            vector& dUTrans,           // momentum transfer to carrier
+            scalar& Cud                // linearised drag coefficient
         ) const;
 
 
diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C
index fe712dd6454255a8e1f7289dbabb34c00bd64dbd..a99f5faeafdf9ebf75ac5ffadac102b18b8f4b2e 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C
+++ b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C
@@ -353,6 +353,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc
     // ~~~~~~~~~~~~~
 
     // Calculate new particle temperature
+    scalar Cuh = 0.0;
     scalar T1 =
         calcHeatTransfer
         (
@@ -368,7 +369,8 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc
             Cp0,
             NCpW,
             Sh,
-            dhsTrans
+            dhsTrans,
+            Cuh
         );
 
 
@@ -376,8 +378,23 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc
     // ~~~~~~
 
     // Calculate new particle velocity
+    scalar Cud = 0;
     vector U1 =
-        calcVelocity(td, dt, cellI, Re, mus, d0, U0, rho0, mass0, Su, dUTrans);
+        calcVelocity
+        (
+            td,
+            dt,
+            cellI,
+            Re,
+            mus,
+            d0,
+            U0,
+            rho0,
+            mass0,
+            Su,
+            dUTrans,
+            Cud
+        );
 
     dUTrans += 0.5*(mass0 - mass1)*(U0 + U1);
 
@@ -414,8 +431,14 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc
         // Update momentum transfer
         td.cloud().UTrans()[cellI] += np0*dUTrans;
 
+        // Update momentum transfer coefficient
+        td.cloud().UCoeff()[cellI] += np0*0.5*(mass0 + mass1)*Cud;
+
         // Update sensible enthalpy transfer
         td.cloud().hsTrans()[cellI] += np0*dhsTrans;
+
+        // Update sensible enthalpy coefficient
+        td.cloud().hsCoeff()[cellI] += np0*Cuh*this->areaS();
     }
 
 
diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C
index a7a1bfb4a1170114cf69a17511e77d9f1b00677b..9fc2f2fb33fe323cb18bb4c2b9f906250f0c661c 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C
+++ b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C
@@ -303,6 +303,7 @@ void Foam::ReactingParcel<ParcelType>::calc
     // ~~~~~~~~~~~~~
 
     // Calculate new particle temperature
+    scalar Cuh = 0.0;
     scalar T1 =
         calcHeatTransfer
         (
@@ -318,7 +319,8 @@ void Foam::ReactingParcel<ParcelType>::calc
             Cp0,
             NCpW,
             Sh,
-            dhsTrans
+            dhsTrans,
+            Cuh
         );
 
 
@@ -326,8 +328,23 @@ void Foam::ReactingParcel<ParcelType>::calc
     // ~~~~~~
 
     // Calculate new particle velocity
+    scalar Cud = 0.0;
     vector U1 =
-        calcVelocity(td, dt, cellI, Re, mus, d0, U0, rho0, mass0, Su, dUTrans);
+        calcVelocity
+        (
+            td,
+            dt,
+            cellI,
+            Re,
+            mus,
+            d0,
+            U0,
+            rho0,
+            mass0,
+            Su,
+            dUTrans,
+            Cud
+        );
 
     dUTrans += 0.5*(mass0 - mass1)*(U0 + U1);
 
@@ -345,8 +362,14 @@ void Foam::ReactingParcel<ParcelType>::calc
         // Update momentum transfer
         td.cloud().UTrans()[cellI] += np0*dUTrans;
 
+        // Update momentum transfer coefficient
+        td.cloud().UCoeff()[cellI] += np0*0.5*(mass0 + mass1)*Cud;
+
         // Update sensible enthalpy transfer
         td.cloud().hsTrans()[cellI] += np0*dhsTrans;
+
+        // Update sensible enthalpy coefficient
+        td.cloud().hsCoeff()[cellI] += np0*Cuh*this->areaS();
     }
 
 
diff --git a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C
index 9f066355b8d23ecae5010d0a05ee872084f17c1e..9c44d1cb7f47808c514af7000d8ceec01f0d6928 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C
+++ b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C
@@ -164,6 +164,7 @@ void Foam::ThermoParcel<ParcelType>::calc
     scalar NCpW = 0.0;
 
     // Calculate new particle velocity
+    scalar Cuh = 0.0;
     scalar T1 =
         calcHeatTransfer
         (
@@ -179,7 +180,8 @@ void Foam::ThermoParcel<ParcelType>::calc
             Cp0,
             NCpW,
             Sh,
-            dhsTrans
+            dhsTrans,
+            Cuh
         );
 
 
@@ -187,8 +189,23 @@ void Foam::ThermoParcel<ParcelType>::calc
     // ~~~~~~
 
     // Calculate new particle velocity
+    scalar Cud = 0.0;
     vector U1 =
-        calcVelocity(td, dt, cellI, Re, mus, d0, U0, rho0, mass0, Su, dUTrans);
+        calcVelocity
+        (
+            td,
+            dt,
+            cellI,
+            Re,
+            mus,
+            d0,
+            U0,
+            rho0,
+            mass0,
+            Su,
+            dUTrans,
+            Cud
+        );
 
 
     //  Accumulate carrier phase source terms
@@ -198,8 +215,14 @@ void Foam::ThermoParcel<ParcelType>::calc
         // Update momentum transfer
         td.cloud().UTrans()[cellI] += np0*dUTrans;
 
+        // Update momentum transfer coefficient
+        td.cloud().UCoeff()[cellI] += np0*mass0*Cud;
+
         // Update sensible enthalpy transfer
         td.cloud().hsTrans()[cellI] += np0*dhsTrans;
+
+        // Update sensible enthalpy coefficient
+        td.cloud().hsCoeff()[cellI] += np0*Cuh*this->areaS();
     }
 
     // Set new particle properties
@@ -225,7 +248,8 @@ Foam::scalar Foam::ThermoParcel<ParcelType>::calcHeatTransfer
     const scalar Cp,
     const scalar NCpW,
     const scalar Sh,
-    scalar& dhsTrans
+    scalar& dhsTrans,
+    scalar& Cuh
 )
 {
     if (!td.cloud().heatTransfer().active())
@@ -270,6 +294,8 @@ Foam::scalar Foam::ThermoParcel<ParcelType>::calcHeatTransfer
 
     dhsTrans += dt*htc*As*(0.5*(T + Tnew) - Tc_);
 
+    Cuh = bp;
+
     return Tnew;
 }
 
diff --git a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H
index 77a98c60917f2b5ffb906deedc8499cdd8780b48..ba2001f5b2ba7e50cc3e193d23288d249f946477 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H
+++ b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H
@@ -223,7 +223,8 @@ protected:
             const scalar Cp,           // specific heat capacity
             const scalar NCpW,         // Sum of N*Cp*W of emission species
             const scalar Sh,           // explicit particle enthalpy source
-            scalar& dhsTrans           // sensible enthalpy transfer to carrier
+            scalar& dhsTrans,          // sensible enthalpy transfer to carrier
+            scalar& Cuh                // linearised heat transfer coefficient
         );