diff --git a/src/lagrangian/intermediate/Make/files b/src/lagrangian/intermediate/Make/files
index 4882f36e0a44a2740004d9ac978e24c218bda6bd..44d371fdefa154b35a84bf3bc5ac81a7776f3432 100644
--- a/src/lagrangian/intermediate/Make/files
+++ b/src/lagrangian/intermediate/Make/files
@@ -68,8 +68,12 @@ submodels/addOns/radiation/scatter/cloudScatter/cloudScatter.C
 /* integration schemes */
 IntegrationScheme/makeIntegrationSchemes.C
 
+/* phase properties */
+phaseProperties/phaseProperties/phaseProperties.C
+phaseProperties/phaseProperties/phasePropertiesIO.C
+phaseProperties/phasePropertiesList/phasePropertiesList.C
 
-/* Data entries */
+/* data entries */
 submodels/IO/DataEntry/makeDataEntries.C
 
 
diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C
index a77a843eee0dd4933119346e731f37ace71bd933..640ce508d510a7e513b7784681bceb2da6195daf 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C
+++ b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C
@@ -52,9 +52,6 @@ void Foam::ReactingCloud<ParcelType>::addNewParcel
         d,
         U,
         nParticles,
-        composition().YGas0(),
-        composition().YLiquid0(),
-        composition().YSolid0(),
         composition().YMixture0(),
         constProps_
     );
@@ -120,12 +117,12 @@ Foam::ReactingCloud<ParcelType>::ReactingCloud
             (
                 IOobject
                 (
-                     this->name() + "rhoTrans" + Foam::name(i),
-                     this->db().time().timeName(),
-                     this->db(),
-                     IOobject::NO_READ,
-                     IOobject::NO_WRITE,
-                     false
+                    this->name() + "rhoTrans" + Foam::name(i),
+                    this->db().time().timeName(),
+                    this->db(),
+                    IOobject::NO_READ,
+                    IOobject::NO_WRITE,
+                    false
                 ),
                 this->mesh(),
                 dimensionedScalar("zero", dimMass, 0.0)
diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.C b/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.C
index 7f32fd7d2611fa7c74ef101f0c78612e1d1ff61f..79a0581acdef22ac302df6001644606739465b2f 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.C
+++ b/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.C
@@ -43,6 +43,10 @@ void Foam::ReactingMultiphaseCloud<ParcelType>::addNewParcel
     const scalar lagrangianDt
 )
 {
+    label idGas = this->composition().idGas();
+    label idLiquid = this->composition().idLiquid();
+    label idSolid = this->composition().idSolid();
+
     ParcelType* pPtr = new ParcelType
     (
         *this,
@@ -52,9 +56,9 @@ void Foam::ReactingMultiphaseCloud<ParcelType>::addNewParcel
         d,
         U,
         nParticles,
-        this->composition().YGas0(),
-        this->composition().YLiquid0(),
-        this->composition().YSolid0(),
+        this->composition().Y0(idGas),
+        this->composition().Y0(idLiquid),
+        this->composition().Y0(idSolid),
         this->composition().YMixture0(),
         constProps_
     );
@@ -112,9 +116,9 @@ void Foam::ReactingMultiphaseCloud<ParcelType>::resetSourceTerms()
 template<class ParcelType>
 void Foam::ReactingMultiphaseCloud<ParcelType>::evolve()
 {
-    const volScalarField& T = carrierThermo_.T();
-    const volScalarField cp = carrierThermo_.Cp();
-    const volScalarField& p = carrierThermo_.p();
+    const volScalarField& T = this->carrierThermo().T();
+    const volScalarField cp = this->carrierThermo().Cp();
+    const volScalarField& p = this->carrierThermo().p();
 
     autoPtr<interpolation<scalar> > rhoInterp = interpolation<scalar>::New
     (
diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.H b/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.H
index 9409d12a4958b3c39babe5aedf20cb39fe643517..0feece303fd920ba0fdcbcc152e7519d2db93bd7 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.H
+++ b/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.H
@@ -68,12 +68,6 @@ class ReactingMultiphaseCloud
         //- Parcel constant properties
         typename ParcelType::constantProperties constProps_;
 
-        //- Thermodynamics package (combustion)
-        hCombustionThermo& carrierThermo_;
-
-        //- Gas phase properties
-        PtrList<specieReactingProperties>& gases_;
-
 
         // References to the cloud sub-models
 
@@ -85,13 +79,6 @@ class ReactingMultiphaseCloud
             devolatilisationModel_;
 
 
-
-        // Sources
-
-            //- Mass transfer fields - one per carrier phase specie
-            PtrList<DimensionedField<scalar, volMesh> > rhoTrans_;
-
-
     // Private Member Functions
 
         //- Disallow default bitwise copy construct
@@ -125,16 +112,6 @@ public:
 
         // Access
 
-            //- Return const access to carrier phase thermo package
-            inline const hCombustionThermo& carrierThermo() const;
-
-            //- Return access to carrier phase thermo package
-            inline hCombustionThermo& carrierThermo();
-
-            //- Gas phase properties
-            inline const PtrList<specieReactingProperties>& gases() const;
-
-
             // Sub-models
 
                 //- Return reference to devolatilisation model
@@ -145,29 +122,6 @@ public:
                 devolatilisation() const;
 
 
-            // Sources
-
-                //- Mass
-
-                    //- Return reference to mass source for field i
-                    inline DimensionedField<scalar, volMesh>&
-                        rhoTrans(const label i);
-
-                    //- Return reference to mass source fields
-                    inline PtrList<DimensionedField<scalar, volMesh> >&
-                        rhoTrans();
-
-                    //- Return tmp mass source for field i
-                    //  Fully explicit
-                    inline tmp<DimensionedField<scalar, volMesh> >
-                        Srho1(const label i) const;
-
-                    //- Return tmp total mass source for carrier phase
-                    //  Fully explicit
-                    inline tmp<DimensionedField<scalar, volMesh> >
-                        Srho1() const;
-
-
         // Cloud evolution functions
 
             //- Add new parcel
diff --git a/src/lagrangian/intermediate/clouds/derived/basicReactingMultiphaseCloud/basicReactingMultiphaseCloud.C b/src/lagrangian/intermediate/clouds/derived/basicReactingMultiphaseCloud/basicReactingMultiphaseCloud.C
index a532276deedbb692ee574b04bc6718f8575de153..c83cf4a20d58e588824683ebd799f59f4048e16b 100644
--- a/src/lagrangian/intermediate/clouds/derived/basicReactingMultiphaseCloud/basicReactingMultiphaseCloud.C
+++ b/src/lagrangian/intermediate/clouds/derived/basicReactingMultiphaseCloud/basicReactingMultiphaseCloud.C
@@ -46,7 +46,7 @@ Foam::basicReactingMultiphaseCloud::basicReactingMultiphaseCloud
     PtrList<specieReactingProperties>& gases
 )
 :
-    ReactingCloud<basicReactingMultiphaseParcel>
+    ReactingMultiphaseCloud<basicReactingMultiphaseParcel>
     (
         cloudType,
         rho,
diff --git a/src/lagrangian/intermediate/clouds/derived/basicReactingMultiphaseCloud/basicReactingMultiphaseCloud.H b/src/lagrangian/intermediate/clouds/derived/basicReactingMultiphaseCloud/basicReactingMultiphaseCloud.H
index fb1b946e1d69b2a15f2576f2605669e30bdd7b30..7ccdc7a7ae9df3286a41979c35742b3abab584c2 100644
--- a/src/lagrangian/intermediate/clouds/derived/basicReactingMultiphaseCloud/basicReactingMultiphaseCloud.H
+++ b/src/lagrangian/intermediate/clouds/derived/basicReactingMultiphaseCloud/basicReactingMultiphaseCloud.H
@@ -36,7 +36,7 @@ SourceFiles
 #ifndef basicReactingMultiphaseCloud_H
 #define basicReactingMultiphaseCloud_H
 
-#include "ReactingCloud.H"
+#include "ReactingMultiphaseCloud.H"
 #include "basicReactingMultiphaseParcel.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -50,7 +50,7 @@ namespace Foam
 
 class basicReactingMultiphaseCloud
 :
-    public ReactingCloud<basicReactingMultiphaseParcel>
+    public ReactingMultiphaseCloud<basicReactingMultiphaseParcel>
 {
     // Private Member Functions
 
diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C
index c25a24163ac53fafb2e7297de6312e31223ecc3f..35d969714f8d3d7280a1487509ba158fdf98ab0a 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C
+++ b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C
@@ -58,7 +58,11 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calcCoupled
     const scalar cp0 = this->cp_;
     const scalar np0 = this->nParticle_;
     const scalar T0 = this->T_;
-    scalarList& YMix = this->YMixture_;
+    scalarField& YMix = this->YMixture_;
+
+    label idGas = td.cloud().composition().idGas();
+    label idLiquid = td.cloud().composition().idLiquid();
+    label idSolid = td.cloud().composition().idSolid();
 
     // ~~~~~~~~~~~~~~~~~~~~~~~~~
     // Initialise transfer terms
@@ -96,7 +100,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calcCoupled
     // ~~~~~~~~~~~~~~~~~~~~~~
     // Calculate phase change
     // ~~~~~~~~~~~~~~~~~~~~~~
-    calcPhaseChange(td, dt, T0, T1, dMassMT);
+    calcPhaseChange(td, dt, T0, dMassMT);
 
 
     // ~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -104,7 +108,6 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calcCoupled
     // ~~~~~~~~~~~~~~~~~~~~~~~~~~
     calcDevolatilisation(td, dt, T0, T1, dMassMT);
 
-
     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~
     // Calculate surface reactions
     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -132,12 +135,12 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calcCoupled
     // Correct dhTrans to account for enthalpy of evolved volatiles
     dhTrans +=
         sum(dMassMT)
-       *td.cloud().composition().HGas(YGas_, 0.5*(T0 + T1));
+       *td.cloud().composition().H(idGas, YGas_, this->pc_, 0.5*(T0 + T1));
 
     // Correct dhTrans to account for enthalpy of consumed solids
     dhTrans +=
         sum(dMassSR)
-       *td.cloud().composition().HSolid(YSolid_, 0.5*(T0 + T1));
+       *td.cloud().composition().H(idSolid, YSolid_, this->pc_, 0.5*(T0 + T1));
 
 
     // ~~~~~~~~~~~~~~~~~~~~~~~
@@ -179,8 +182,10 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calcCoupled
         td.cloud().hTrans()[celli] +=
             np0*mass1
            *(
-                YMix[0]*td.cloud().composition().HGas(YGas_, T1)
-              + YMix[2]*td.cloud().composition().HSolid(YSolid_, T1)
+                YMix[0]
+               *td.cloud().composition().H(idGas, YGas_, this->pc_, T1)
+              + YMix[2]
+               *td.cloud().composition().H(idSolid, YSolid_, this->pc_, T1)
             );
         td.cloud().UTrans()[celli] += np0*mass1*U1;
     }
@@ -192,9 +197,9 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calcCoupled
         this->U_ = U1;
         this->T_ = T1;
         this->cp_ =
-            YMix[0]*td.cloud().composition().cpGas(YGas_, T1)
-          + YMix[1]*td.cloud().composition().cpLiquid(YLiquid_, this->pc_, T1)
-          + YMix[2]*td.cloud().composition().cpSolid(YSolid_);
+            YMix[0]*td.cloud().composition().cp(idGas, YGas_, this->pc_, T1)
+          + YMix[1]*td.cloud().composition().cp(idLiquid, YLiquid_, this->pc_, T1)
+          + YMix[2]*td.cloud().composition().cp(idSolid, YSolid_, this->pc_, T1);
 
         // Update particle density or diameter
         if (td.constProps().constantVolume())
@@ -224,7 +229,11 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calcUncoupled
     const scalar T0 = this->T_;
     const scalar mass0 = this->mass();
     const scalar cp0 = this->cp_;
-    scalarList& YMix = this->YMixture_;
+    scalarField& YMix = this->YMixture_;
+
+    label idGas = td.cloud().composition().idGas();
+    label idLiquid = td.cloud().composition().idLiquid();
+    label idSolid = td.cloud().composition().idSolid();
 
     // ~~~~~~~~~~~~~~~~~~~~~~~~~
     // Initialise transfer terms
@@ -262,7 +271,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calcUncoupled
     // ~~~~~~~~~~~~~~~~~~~~~~
     // Calculate phase change
     // ~~~~~~~~~~~~~~~~~~~~~~
-    calcPhaseChange(td, dt, T0, T1, dMassMT);
+    calcPhaseChange(td, dt, T0, dMassMT);
 
 
     // ~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -285,9 +294,9 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calcUncoupled
 
     // New specific heat capacity
     const scalar cp1 =
-        YMix[0]*td.cloud().composition().cpGas(YGas_, T1)
-      + YMix[1]*td.cloud().composition().cpLiquid(YLiquid_, this->pc_, T1)
-      + YMix[2]*td.cloud().composition().cpSolid(YSolid_);
+        YMix[0]*td.cloud().composition().cp(idGas, YGas_, this->pc_, T1)
+      + YMix[1]*td.cloud().composition().cp(idLiquid, YLiquid_, this->pc_, T1)
+      + YMix[2]*td.cloud().composition().cp(idSolid, YSolid_, this->pc_, T1);
 
     // Add retained enthalpy to particle
     T1 += dhRet/(mass0*0.5*(cp0 + cp1));
@@ -364,7 +373,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calcDevolatilisation
 
     // Determine mass to add to carrier phase
     const scalar mass = this->mass();
-    scalarList& YMix = this->YMixture_;
+    scalarField& YMix = this->YMixture_;
     const scalar dMassTot = td.cloud().devolatilisation().calculate
     (
         dt,
@@ -382,9 +391,10 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calcDevolatilisation
     YMix[2] = 1.0 - YMix[0] - YMix[1];
 
     // Add to cummulative mass transfer
+    label idGas = td.cloud().composition().idGas();
     forAll (YGas_, i)
     {
-        label id = td.cloud().composition().gasGlobalIds()[i];
+        label id = td.cloud().composition().globalIds(idGas)[i];
 
         // Volatiles mass transfer
         scalar volatileMass = YGas_[i]*dMassTot;
diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.H b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.H
index 6c93a116db7c9a87f39123f2f4a87bf4a3d3f304..416dc63d8bc89e653e08dec3ad96cc47d2e99520 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.H
+++ b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.H
@@ -40,6 +40,7 @@ SourceFiles
 #define ReactingMultiphaseParcel_H
 
 #include "ReactingParcel.H"
+#include "ReactingMultiphaseCloud.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -110,6 +111,9 @@ public:
     {
         // Private data
 
+            //- Reference to the cloud containing this particle
+            ReactingMultiphaseCloud<ParcelType>& cloud_;
+
             //- Particle constant properties
             const constantProperties& constProps_;
 
@@ -121,7 +125,7 @@ public:
             //- Construct from components
             inline trackData
             (
-                ReactingCloud<ParcelType>& cloud,
+                ReactingMultiphaseCloud<ParcelType>& cloud,
                 const constantProperties& constProps,
                 const interpolation<scalar>& rhoInterp,
                 const interpolation<vector>& UInterp,
@@ -135,6 +139,9 @@ public:
 
         // Member functions
 
+            //- Return access to the owner cloud
+            inline ReactingMultiphaseCloud<ParcelType>& cloud();
+
             //- Return const access to the constant properties
             inline const constantProperties& constProps() const;
     };
@@ -201,7 +208,7 @@ public:
         //- Construct from components
         inline ReactingMultiphaseParcel
         (
-            ReactingCloud<ParcelType>& owner,
+            ReactingMultiphaseCloud<ParcelType>& owner,
             const label typeId,
             const vector& position,
             const label celli,
@@ -292,10 +299,13 @@ public:
         // I-O
 
             //- Read
-            static void readFields(ReactingCloud<ParcelType>& c);
+            static void readFields(ReactingMultiphaseCloud<ParcelType>& c);
 
             //- Write
-            static void writeFields(const ReactingCloud<ParcelType>& c);
+            static void writeFields
+            (
+                const ReactingMultiphaseCloud<ParcelType>& c
+            );
 
 
     // Ostream Operator
diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcelI.H b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcelI.H
index 87a7cb2d8c861adc96329967b9543bcb37c5a025..7becf84d6cd78e8027c6155b03dca23cb8720eaa 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcelI.H
+++ b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcelI.H
@@ -43,7 +43,7 @@ constantProperties
 template<class ParcelType>
 inline Foam::ReactingMultiphaseParcel<ParcelType>::trackData::trackData
 (
-    ReactingCloud<ParcelType>& cloud,
+    ReactingMultiphaseCloud<ParcelType>& cloud,
     const constantProperties& constProps,
     const interpolation<scalar>& rhoInterp,
     const interpolation<vector>& UInterp,
@@ -65,14 +65,16 @@ inline Foam::ReactingMultiphaseParcel<ParcelType>::trackData::trackData
         CpInterp,
         pInterp,
         g
-    )
+    ),
+    cloud_(cloud),
+    constProps_(constProps)
 {}
 
 
 template<class ParcelType>
 inline Foam::ReactingMultiphaseParcel<ParcelType>::ReactingMultiphaseParcel
 (
-    ReactingCloud<ParcelType>& owner,
+    ReactingMultiphaseCloud<ParcelType>& owner,
     const label typeId,
     const vector& position,
     const label celli,
@@ -132,6 +134,14 @@ Foam::ReactingMultiphaseParcel<ParcelType>::constantProperties::Ldevol() const
 
 // * * * * * * * * * * * trackData Member Functions  * * * * * * * * * * * * //
 
+template<class ParcelType>
+inline Foam::ReactingMultiphaseCloud<ParcelType>&
+Foam::ReactingMultiphaseParcel<ParcelType>::trackData::cloud()
+{
+    return cloud_;
+}
+
+
 template<class ParcelType>
 inline const typename Foam::ReactingMultiphaseParcel<ParcelType>::
 constantProperties&
diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcelIO.C b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcelIO.C
index bc1e46336ee26aed5ff6cdf1b98ee3ba8f1981a9..bb53f10a20515ff9c3c926d568222e7adb22032b 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcelIO.C
+++ b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcelIO.C
@@ -44,32 +44,34 @@ Foam::ReactingMultiphaseParcel<ParcelType>::ReactingMultiphaseParcel
 {
     if (readFields)
     {
-        const ReactingCloud<ParcelType>& cR =
-            dynamic_cast<const ReactingCloud<ParcelType>& >(cloud);
+        const ReactingMultiphaseCloud<ParcelType>& cR =
+            dynamic_cast<const ReactingMultiphaseCloud<ParcelType>& >(cloud);
 
-        const label nGas = cR.composition().gasNames().size();
-        const label nLiquid = cR.composition().liquidNames().size();
-        const label nSolid = cR.composition().solidNames().size();
+        const label idGas = cR.composition().idGas();
+        const label nGas = cR.composition().componentNames(idGas).size();
+        const label idLiquid = cR.composition().idLiquid();
+        const label nLiquid = cR.composition().componentNames(idLiquid).size();
+        const label idSolid = cR.composition().idGas();
+        const label nSolid = cR.composition().componentNames(idSolid).size();
 
         YGas_.setSize(nGas);
         YLiquid_.setSize(nLiquid);
         YSolid_.setSize(nSolid);
 
-        const scalarField& YMix = this->YMixture_;
         if (is.format() == IOstream::ASCII)
         {
             is >> YGas_ >> YLiquid_ >> YSolid_;
-            YGas_ /= YMix[0] + VSMALL;
-            YLiquid_ /= YMix[1] + VSMALL;
-            YSolid_ /= YMix[2] + VSMALL;
         }
         else
         {
             is >> YGas_ >> YLiquid_ >> YSolid_;
-            YGas_ /= YMix[0] + VSMALL;
-            YLiquid_ /= YMix[1] + VSMALL;
-            YSolid_ /= YMix[2] + VSMALL;
         }
+
+        // scale the mass fractions
+        const scalarField& YMix = this->YMixture_;
+        YGas_ /= YMix[0] + ROOTVSMALL;
+        YLiquid_ /= YMix[1] + ROOTVSMALL;
+        YSolid_ /= YMix[2] + ROOTVSMALL;
     }
 
     // Check state of Istream
@@ -88,7 +90,7 @@ Foam::ReactingMultiphaseParcel<ParcelType>::ReactingMultiphaseParcel
 template<class ParcelType>
 void Foam::ReactingMultiphaseParcel<ParcelType>::readFields
 (
-    ReactingCloud<ParcelType>& c
+    ReactingMultiphaseCloud<ParcelType>& c
 )
 {
     if (!c.size())
@@ -99,20 +101,20 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::readFields
     ReactingParcel<ParcelType>::readFields(c);
 
     // Get names and sizes for each Y...
-    const wordList gasNames = c.composition().gasNames();
-    const wordList liquidNames = c.composition().liquidNames();
-    const wordList solidNames = c.composition().solidNames();
-    const label nGas = gasNames.size();
-    const label nLiquid = liquidNames.size();
-    const label nSolid = solidNames.size();
+    const label idGas = c.composition().idGas();
+    const wordList gasNames = c.composition().componentNames(idGas);
+    const label idLiquid = c.composition().idLiquid();
+    const wordList liquidNames = c.composition().componentNames(idLiquid);
+    const label idSolid = c.composition().idSolid();
+    const wordList solidNames = c.composition().componentNames(idSolid);
 
     // Set storage for each Y... for each parcel
     forAllIter(typename Cloud<ParcelType>, c, iter)
     {
         ReactingMultiphaseParcel<ParcelType>& p = iter();
-        p.YGas_.setSize(nGas, 0.0);
-        p.YLiquid_.setSize(nLiquid, 0.0);
-        p.YSolid_.setSize(nSolid, 0.0);
+        p.YGas_.setSize(gasNames.size(), 0.0);
+        p.YLiquid_.setSize(liquidNames.size(), 0.0);
+        p.YSolid_.setSize(solidNames.size(), 0.0);
     }
 
     // Populate YGas for each parcel
@@ -127,7 +129,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::readFields
         forAllIter(typename Cloud<ParcelType>, c, iter)
         {
             ReactingMultiphaseParcel<ParcelType>& p = iter();
-            p.YGas_[j] = YGas[i++]/p.YMixture()[0];
+            p.YGas_[j] = YGas[i++]/(p.YMixture()[0] + ROOTVSMALL);
         }
     }
     // Populate YLiquid for each parcel
@@ -142,7 +144,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::readFields
         forAllIter(typename Cloud<ParcelType>, c, iter)
         {
             ReactingMultiphaseParcel<ParcelType>& p = iter();
-            p.YLiquid_[j] = YLiquid[i++]/p.YMixture()[1];
+            p.YLiquid_[j] = YLiquid[i++]/(p.YMixture()[1] + ROOTVSMALL);
         }
     }
     // Populate YSolid for each parcel
@@ -157,7 +159,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::readFields
         forAllIter(typename Cloud<ParcelType>, c, iter)
         {
             ReactingMultiphaseParcel<ParcelType>& p = iter();
-            p.YSolid_[j] = YSolid[i++]/p.YMixture()[2];
+            p.YSolid_[j] = YSolid[i++]/(p.YMixture()[2] + ROOTVSMALL);
         }
     }
 }
@@ -166,7 +168,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::readFields
 template<class ParcelType>
 void Foam::ReactingMultiphaseParcel<ParcelType>::writeFields
 (
-    const ReactingCloud<ParcelType>& c
+    const ReactingMultiphaseCloud<ParcelType>& c
 )
 {
     ReactingParcel<ParcelType>::writeFields(c);
@@ -176,7 +178,8 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::writeFields
     // Write the composition fractions
     if (np > 0)
     {
-        const wordList& gasNames = c.composition().gasNames();
+        const label idGas = c.composition().idGas();
+        const wordList gasNames = c.composition().componentNames(idGas);
         forAll(gasNames, j)
         {
             IOField<scalar> YGas
@@ -194,7 +197,8 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::writeFields
 
             YGas.write();
         }
-        const wordList& liquidNames = c.composition().liquidNames();
+        const label idLiquid = c.composition().idLiquid();
+        const wordList liquidNames = c.composition().componentNames(idLiquid);
         forAll(liquidNames, j)
         {
             IOField<scalar> YLiquid
@@ -212,7 +216,8 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::writeFields
 
             YLiquid.write();
         }
-        const wordList& solidNames = c.composition().solidNames();
+        const label idSolid = c.composition().idSolid();
+        const wordList solidNames = c.composition().componentNames(idSolid);
         forAll(solidNames, j)
         {
             IOField<scalar> YSolid
@@ -248,14 +253,14 @@ Foam::Ostream& Foam::operator<<
     scalarField YSolidLoc = p.YSolid()*p.YMixture()[2];
     if (os.format() == IOstream::ASCII)
     {
-        os  << static_cast<const ReactingParcel<ParcelType>& >(p)
+        os  << static_cast<const ReactingMultiphaseParcel<ParcelType>& >(p)
             << token::SPACE << YGasLoc
             << token::SPACE << YLiquidLoc
             << token::SPACE << YSolidLoc;
     }
     else
     {
-        os  << static_cast<const ReactingParcel<ParcelType>& >(p);
+        os  << static_cast<const ReactingMultiphaseParcel<ParcelType>& >(p);
         os << YGasLoc << YLiquidLoc << YSolidLoc;
     }
 
diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C
index a2ae89a504a6a3c3163d085104712703bdd9249c..daaa9ac66af65e9d40c6886d82228b0f4ff82ca2 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C
+++ b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C
@@ -97,7 +97,7 @@ void Foam::ReactingParcel<ParcelType>::calcCoupled
     // ~~~~~~~~~~~~~~~~~~~~~~
     // Calculate phase change
     // ~~~~~~~~~~~~~~~~~~~~~~
-    calcPhaseChange(td, dt, T0, T1, dMassMT);
+    calcPhaseChange(td, dt, T, dMassMT);
 
 
     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -117,6 +117,7 @@ void Foam::ReactingParcel<ParcelType>::calcCoupled
     T1 += dhRet/(0.5*(mass0 + mass1)*cp0);
     dhTrans -= dhRet;
 
+
     // ~~~~~~~~~~~~~~~~~~~~~~~
     // Accumulate source terms
     // ~~~~~~~~~~~~~~~~~~~~~~~
@@ -134,7 +135,6 @@ void Foam::ReactingParcel<ParcelType>::calcCoupled
     td.cloud().UCoeff()[celli] += np0*mass0*Cud;
 
     // Update enthalpy transfer
-    // - enthalpy of lost solids already accounted for
     td.cloud().hTrans()[celli] += np0*dhTrans;
 
     // Accumulate coefficient to be applied in carrier phase enthalpy coupling
@@ -229,7 +229,7 @@ void Foam::ReactingParcel<ParcelType>::calcUncoupled
     // ~~~~~~~~~~~~~~~~~~~~~~
     // Calculate phase change
     // ~~~~~~~~~~~~~~~~~~~~~~
-    calcPhaseChange(td, dt, T0, T1, dMassMT);
+    calcPhaseChange(td, dt, T, dMassMT);
 
 
     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -285,16 +285,17 @@ void Foam::ReactingParcel<ParcelType>::calcPhaseChange
 (
     TrackData& td,
     const scalar dt,
-    const scalar T0,
-    const scalar T1,
+    const scalar T,
     scalarList& dMassMT
 )
 {
-    //    if (!td.cloud().phaseChange().active())
+    if (!td.cloud().phaseChange().active())
     {
         return;
     }
 
+    // TODO: separate treatment for boiling
+
     /*
     // Determine mass to add to carrier phase
     const scalar mass = this->mass();
diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H
index 92da3160ccd37882eb78a1f2e810e9bc67783d10..763f1e2a6c1d0bf31e7c0b505c6961d3ff17639d 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H
+++ b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H
@@ -174,8 +174,7 @@ protected:
         (
             TrackData& td,
             const scalar dt,
-            const scalar T0,
-            const scalar T1,
+            const scalar T,
             scalarList& dMassMT
         );
 
diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcelIO.C b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcelIO.C
index 0a81cdfd3fd8b78fb4bc1cb785bdc7fe4ae1afa0..98076d4b27d9eb4d97c987cbc4982178888fc412 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcelIO.C
+++ b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcelIO.C
@@ -47,7 +47,7 @@ Foam::ReactingParcel<ParcelType>::ReactingParcel
         const ReactingCloud<ParcelType>& cR =
             dynamic_cast<const ReactingCloud<ParcelType>& >(cloud);
 
-        const label nMixture = cR.composition().compositionNames().size();
+        const label nMixture = cR.composition().phaseTypes().size();
         YMixture_.setSize(nMixture);
 
         if (is.format() == IOstream::ASCII)
@@ -102,22 +102,22 @@ void Foam::ReactingParcel<ParcelType>::readFields
     }
 
     // Get names and sizes for each Y...
-    const wordList compositionNames = c.composition().compositionNames();
-    const label nComposition = compositionNames.size();
+    const wordList phaseTypes = c.composition().phaseTypes();
+    const label nPhases = phaseTypes.size();
 
     // Set storage for each Y... for each parcel
     forAllIter(typename Cloud<ParcelType>, c, iter)
     {
         ReactingParcel<ParcelType>& p = iter();
-        p.YMixture_.setSize(nComposition, 0.0);
+        p.YMixture_.setSize(nPhases, 0.0);
     }
 
     // Populate YMixture for each parcel
-    forAll(compositionNames, j)
+    forAll(phaseTypes, j)
     {
         IOField<scalar> YMixture
         (
-            c.fieldIOobject("Y" + compositionNames[j], IOobject::MUST_READ)
+            c.fieldIOobject("Y" + phaseTypes[j], IOobject::MUST_READ)
         );
 
         label i = 0;
@@ -154,12 +154,12 @@ void Foam::ReactingParcel<ParcelType>::writeFields
     // Write the composition fractions
     if (np > 0)
     {
-        const wordList compositionNames = c.composition().compositionNames();
-        forAll(compositionNames, j)
+        const wordList phaseTypes = c.composition().phaseTypes();
+        forAll(phaseTypes, j)
         {
             IOField<scalar> YMixture
             (
-                c.fieldIOobject("Y" + compositionNames[j], IOobject::NO_READ),
+                c.fieldIOobject("Y" + phaseTypes[j], IOobject::NO_READ),
                 np
             );
 
@@ -196,6 +196,7 @@ Foam::Ostream& Foam::operator<<
         os  << static_cast<const ThermoParcel<ParcelType>& >(p);
         os.write
         (
+
             reinterpret_cast<const char*>(&p.mass0_),
             sizeof(p.mass0())
         );
diff --git a/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/basicReactingMultiphaseParcel.C b/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/basicReactingMultiphaseParcel.C
index 8d9c68b8f6b354f96415f6bec3bdaa4eb0073cad..99d4ec05b0ac65f118bd853052042037b2fab6fd 100644
--- a/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/basicReactingMultiphaseParcel.C
+++ b/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/basicReactingMultiphaseParcel.C
@@ -40,7 +40,7 @@ namespace Foam
 
 Foam::basicReactingMultiphaseParcel::basicReactingMultiphaseParcel
 (
-    ReactingCloud<basicReactingMultiphaseParcel>& owner,
+    ReactingMultiphaseCloud<basicReactingMultiphaseParcel>& owner,
     const label typeId,
     const vector& position,
     const label celli,
diff --git a/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/basicReactingMultiphaseParcel.H b/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/basicReactingMultiphaseParcel.H
index 7009ca98e0870489426f2ecfdab71b53db602650..c39fae262eee229fddc82629d0b16a8ebd751397 100644
--- a/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/basicReactingMultiphaseParcel.H
+++ b/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/basicReactingMultiphaseParcel.H
@@ -63,7 +63,7 @@ public:
         //- Construct from components
         basicReactingMultiphaseParcel
         (
-             ReactingCloud<basicReactingMultiphaseParcel>& owner,
+             ReactingMultiphaseCloud<basicReactingMultiphaseParcel>& owner,
              const label typeId,
              const vector& position,
              const label celli,
diff --git a/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/defineBasicReactingMultiphaseParcel.C b/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/defineBasicReactingMultiphaseParcel.C
index 487b0f852d4c91d5455aa5b3d258edeffdb18c45..5278c5e0f5a27a944b69207ea4c543473016b80e 100644
--- a/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/defineBasicReactingMultiphaseParcel.C
+++ b/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/defineBasicReactingMultiphaseParcel.C
@@ -61,50 +61,37 @@ namespace Foam
         ReactingParcel<basicReactingMultiphaseParcel>,
         0
     );
+    defineParcelTypeNameAndDebug
+    (
+        ReactingMultiphaseParcel<basicReactingMultiphaseParcel>,
+        0
+    );
+    defineTemplateTypeNameAndDebug
+    (
+        ReactingMultiphaseParcel<basicReactingMultiphaseParcel>,
+        0
+    );
 
     defineParcelTypeNameAndDebug
     (
         KinematicCloud<basicReactingMultiphaseParcel>,
         0
     );
-//    defineTemplateTypeNameAndDebug
-//    (
-//        KinematicCloud<basicReactingMultiphaseParcel>,
-//        0
-//    );
-
     defineParcelTypeNameAndDebug
     (
         ThermoCloud<basicReactingMultiphaseParcel>,
         0
     );
-//    defineTemplateTypeNameAndDebug
-//    (
-//        ThermoCloud<basicReactingMultiphaseParcel>,
-//        0
-//    );
-
     defineParcelTypeNameAndDebug
     (
         ReactingCloud<basicReactingMultiphaseParcel>,
         0
     );
-//    defineTemplateTypeNameAndDebug
-//    (
-//        ReactingCloud<basicReactingMultiphaseParcel>,
-//        0
-//    );
-
     defineParcelTypeNameAndDebug
     (
         ReactingMultiphaseCloud<basicReactingMultiphaseParcel>,
         0
     );
-//    defineTemplateTypeNameAndDebug
-//    (
-//        ReactingMultiphaseCloud<basicReactingMultiphaseParcel>,
-//        0
-//    );
 
 };
 
diff --git a/src/lagrangian/intermediate/parcels/derived/basicReactingParcel/makeBasicReactingParcelCompositionModels.C b/src/lagrangian/intermediate/parcels/derived/basicReactingParcel/makeBasicReactingParcelCompositionModels.C
index b2f9ae571425318b5cf1136707c3f2344d395087..786fa74ddc06c675eb66a01293b1a829036aba27 100644
--- a/src/lagrangian/intermediate/parcels/derived/basicReactingParcel/makeBasicReactingParcelCompositionModels.C
+++ b/src/lagrangian/intermediate/parcels/derived/basicReactingParcel/makeBasicReactingParcelCompositionModels.C
@@ -27,7 +27,7 @@ License
 #include "basicReactingParcel.H"
 #include "ReactingCloud.H"
 
-#include "SingleMixtureFraction.H"
+#include "SinglePhaseMixture.H"
 
 namespace Foam
 {
@@ -36,7 +36,7 @@ namespace Foam
     // Add instances of composition model to the table
     makeCompositionModelType
     (
-        SingleMixtureFraction,
+        SinglePhaseMixture,
         ReactingCloud,
         basicReactingParcel
     );
diff --git a/src/lagrangian/intermediate/phaseProperties/phaseProperties/phaseProperties.C b/src/lagrangian/intermediate/phaseProperties/phaseProperties/phaseProperties.C
new file mode 100644
index 0000000000000000000000000000000000000000..afec9962107e6b17c32a1d34c161da5f850170fb
--- /dev/null
+++ b/src/lagrangian/intermediate/phaseProperties/phaseProperties/phaseProperties.C
@@ -0,0 +1,305 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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 "phaseProperties.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+template<>
+const char* Foam::NamedEnum<Foam::phaseProperties::phaseType, 4>::names[] =
+{
+    "gas",
+    "liquid",
+    "solid",
+    "unknown"
+};
+
+
+const Foam::NamedEnum<Foam::phaseProperties::phaseType, 4>
+    Foam::phaseProperties::phaseTypeNames_;
+
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+void Foam::phaseProperties::setGlobalGasIds
+(
+    const PtrList<volScalarField>& YGas
+)
+{
+    forAll(names_, i)
+    {
+        forAll (YGas, j)
+        {
+            word specieName = YGas[j].name();
+
+            if (specieName == names_[i])
+            {
+                globalIds_[i] = j;
+                break;
+            }
+        }
+        if (globalIds_[i] == -1)
+        {
+            wordList globalGasNames(YGas.size());
+
+            forAll (YGas, k)
+            {
+                globalGasNames[k] = YGas[k].name();
+            }
+
+            FatalErrorIn
+            (
+                "void phaseProperties::setGlobalGasIds\n"
+                "(\n"
+                "    const PtrList<volScalarField>&\n"
+                ")"
+            )   << "Could not find gas species " << names_[i]
+                << " in species list" <<  nl
+                << "Available species are: " << nl << globalGasNames << nl
+                << exit(FatalError);
+        }
+    }
+}
+
+
+void Foam::phaseProperties::setGlobalIds(const wordList& globalNames)
+{
+    forAll(names_, i)
+    {
+        forAll(globalNames, j)
+        {
+            if (globalNames[j] == names_[i])
+            {
+                globalIds_[i] = j;
+                break;
+            }
+        }
+        if (globalIds_[i] == -1)
+        {
+            FatalErrorIn
+            (
+                "void Foam::phaseProperties::setGlobalIds(const wordList&)"
+            )   << "Could not find specie " << names_[i]
+                << " in species list" <<  nl
+                << "Available species are: " << nl << globalNames << nl
+                << exit(FatalError);
+        }
+    }
+}
+
+
+void Foam::phaseProperties::checkTotalMassFraction() const
+{
+    scalar total = 0.0;
+    forAll(Y_, cmptI)
+    {
+        total += Y_[cmptI];
+    }
+
+    if (Y_.size() != 0 && mag(total - 1.0) > SMALL)
+    {
+        FatalErrorIn
+        (
+            "void Foam::phaseProperties::checkTotalMassFraction() const"
+        )   << "Component fractions must total to unity for phase "
+            << phaseTypeNames_[phase_] << nl
+            << "Components: " << nl << names_ << nl << exit(FatalError);
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::phaseProperties::phaseProperties()
+:
+    phase_(UNKNOWN),
+    names_(0),
+    Y_(0),
+    globalIds_(0)
+{}
+
+
+Foam::phaseProperties::phaseProperties(const phaseProperties& pp)
+:
+    phase_(pp.phase_),
+    names_(pp.names_),
+    Y_(pp.Y_),
+    globalIds_(pp.globalIds_)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::phaseProperties::~phaseProperties()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void Foam::phaseProperties::initialiseGlobalIds
+(
+    const PtrList<volScalarField>& YGas,
+    const wordList& liquidNames,
+    const wordList& solidNames
+)
+{
+    // determine the addressing to map between components listed in the phase
+    // with those given in the (main) thermo properties
+    switch (phase_)
+    {
+        case GAS:
+        {
+            setGlobalGasIds(YGas);
+            break;
+        }
+        case LIQUID:
+        {
+            setGlobalIds(liquidNames);
+            break;
+        }
+        case SOLID:
+        {
+            setGlobalIds(solidNames);
+            break;
+        }
+        default:
+        {
+            FatalErrorIn
+            (
+                "Foam::phaseProperties::setGlobalIds\n"
+                "(\n"
+                "    const PtrList<volScalarField>&,\n"
+                "    const wordList&,\n"
+                "    const wordList&\n"
+                ")"
+            )   << "Invalid phase: " << phaseTypeNames_[phase_] << nl
+                << "    phase must be gas, liquid or solid" << nl
+                << exit(FatalError);
+        }
+    }
+}
+
+
+Foam::phaseProperties::phaseType Foam::phaseProperties::phase() const
+{
+    return phase_;
+}
+
+
+Foam::word Foam::phaseProperties::phaseTypeName() const
+{
+    return phaseTypeNames_[phase_];
+}
+
+
+const Foam::List<Foam::word>& Foam::phaseProperties::names() const
+{
+    return names_;
+}
+
+
+const Foam::word& Foam::phaseProperties::name(const label cmptI) const
+{
+    if (cmptI >= names_.size())
+    {
+        FatalErrorIn
+        (
+            "const Foam::word& Foam::phaseProperties::name"
+            "("
+                "const label cmptI"
+            ") const"
+        )   << "Requested component " << cmptI << "out of range" << nl
+            << "Available phase components:" << nl << names_ << nl
+            << exit(FatalError);
+    }
+
+    return names_[cmptI];
+}
+
+
+const Foam::scalarField& Foam::phaseProperties::Y() const
+{
+    return Y_;
+}
+
+
+Foam::scalar& Foam::phaseProperties::Y(const label cmptI)
+{
+    if (cmptI >= Y_.size())
+    {
+        FatalErrorIn
+        (
+            "const Foam::scalar& Foam::phaseProperties::Y"
+            "("
+                "const label cmptI"
+            ") const"
+        )   << "Requested component " << cmptI << "out of range" << nl
+            << "Available phase components:" << nl << names_ << nl
+            << exit(FatalError);
+    }
+
+    return Y_[cmptI];
+}
+
+
+Foam::label Foam::phaseProperties::globalId(const word& cmptName) const
+{
+    label id = this->id(cmptName);
+
+    if (id < 0)
+    {
+        return id;
+    }
+    else
+    {
+        return globalIds_[id];
+    }
+
+}
+
+
+const Foam::labelList& Foam::phaseProperties::globalIds() const
+{
+    return globalIds_;
+}
+
+
+Foam::label Foam::phaseProperties::id(const word& cmptName) const
+{
+    forAll(names_, cmptI)
+    {
+        if (names_[cmptI] == cmptName)
+        {
+            return cmptI;
+        }
+    }
+
+    return -1;
+}
+
+
+// ************************************************************************* //
+
diff --git a/src/lagrangian/intermediate/phaseProperties/phaseProperties/phaseProperties.C.bakNew b/src/lagrangian/intermediate/phaseProperties/phaseProperties/phaseProperties.C.bakNew
new file mode 100644
index 0000000000000000000000000000000000000000..fe690e0ab6b3dbd08ec70397762d1e53cb0eec46
--- /dev/null
+++ b/src/lagrangian/intermediate/phaseProperties/phaseProperties/phaseProperties.C.bakNew
@@ -0,0 +1,357 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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 "phaseProperties.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+template<>
+const char* Foam::NamedEnum<Foam::phaseProperties::phaseType, 4>::names[] =
+{
+    "gas",
+    "liquid",
+    "solid",
+    "unknown"
+};
+
+
+const Foam::NamedEnum<Foam::phaseProperties::phaseType, 4>
+    Foam::phaseProperties::phaseTypeNames_;
+
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+void Foam::phaseProperties::setGlobalGasIds
+(
+    const PtrList<volScalarField>& YGas
+)
+{
+    forAll(components_, i)
+    {
+        forAll (YGas, j)
+        {
+            word specieName = YGas[j].name();
+
+            if (specieName == components_[i].first())
+            {
+                globalIds_[i] = j;
+                break;
+            }
+        }
+        if (globalIds_[i] == -1)
+        {
+            wordList globalGasNames(YGas.size());
+
+            forAll (YGas, k)
+            {
+                globalGasNames[k] = YGas[k].name();
+            }
+
+            FatalErrorIn
+            (
+                "void phaseProperties::setGlobalGasIds"
+                "("
+                "    const hCombustionThermo&"
+                ")"
+            )   << "Could not find gas species " << components_[i].first()
+                << " in species list" <<  nl
+                << "Available species are: " << nl << globalGasNames << nl
+                << exit(FatalError);
+        }
+    }
+}
+
+
+void Foam::phaseProperties::setGlobalIds(const wordList& globalNames)
+{
+    forAll(components_, i)
+    {
+        forAll(globalNames, j)
+        {
+            if (globalNames[j] == components_[i].first())
+            {
+                globalIds_[i] = j;
+                break;
+            }
+        }
+        if (globalIds_[i] == -1)
+        {
+            FatalErrorIn
+            (
+                "void Foam::phaseProperties::setGlobalGasIds\n"
+                "(\n"
+                "    const PtrList<volScalarField>& YGas\n"
+                ")"
+            )   << "Could not find specie " << components_[i].first()
+                << " in species list" <<  nl
+                << "Available species are: " << nl << globalNames << nl
+                << exit(FatalError);
+        }
+    }
+}
+
+
+void Foam::phaseProperties::checkTotalMassFraction() const
+{
+    scalar total = 0.0;
+    forAll(fractions_, cmptI)
+    {
+        total += fractions_[cmptI];
+    }
+
+    if (mag(total - 1.0) > SMALL)
+    {
+        FatalErrorIn
+        (
+            "void Foam::phaseProperties::checkTotalMassFraction() const"
+        )   << "Component fractions must total to unity" << nl
+            << "Components: " << nl << components_ << nl << exit(FatalError);
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::phaseProperties::phaseProperties()
+:
+    phase_(UNKNOWN),
+    names_(0),
+    fractions_(0),
+    globalIds_(0)
+{}
+
+
+Foam::phaseProperties::phaseProperties(Istream& is)
+:
+    phase_(UNKNOWN),
+    names_(0),
+    fractions_(0),
+    globalIds_(0)
+{
+    is.check("Foam::phaseProperties::phaseProperties(Istream& is)");
+
+    Tuple2<word, List<Tuple2<word, scalar> > > components(is);
+
+    phase_ = phaseTypeNames_.read(components.first());
+
+    label nComponents = components.second().size();
+    names_.setSize(nComponents);
+    fractions_.setSize(nComponents);
+
+    forAll(components.second(), cmptI)
+    {
+        names_[cmptI] = components.second()[cmptI].first();
+        fractions_[cmptI] = components.second()[cmptI].second();
+    }
+
+    // initialise global ids to -1
+    globalIds_.setSize(nComponents, -1);
+
+    checkTotalMassFraction();
+}
+
+
+Foam::phaseProperties::phaseProperties(const phaseProperties& pp)
+:
+    phase_(pp.phase_),
+    names_(pp.names_),
+    fractions_(pp.fractions_),
+    globalIds_(pp.globalIds_)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::phaseProperties::~phaseProperties()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void Foam::phaseProperties::initialiseGlobalIds
+(
+    const PtrList<volScalarField>& YGas,
+    const wordList& liquidNames,
+    const wordList& solidNames
+)
+{
+    // determine the addressing to map between components listed in the phase
+    // with those given in the (main) thermo properties
+    switch (phase_)
+    {
+        case GAS:
+        {
+            setGlobalGasIds(YGas);
+            break;
+        }
+        case LIQUID:
+        {
+            setGlobalIds(liquidNames);
+            break;
+        }
+        case SOLID:
+        {
+            setGlobalIds(solidNames);
+            break;
+        }
+        default:
+        {
+            FatalErrorIn
+            (
+                "Foam::phaseProperties::setGlobalIds\n"
+                "(\n"
+                "    const PtrList<specieReactingProperties>& gases,\n"
+                "    const wordList& liquidNames,\n"
+                "    const wordList& solidNames\n"
+                ")"
+            )   << "Invalid phase: " << phaseTypeNames_[phase_] << nl
+                << "    phase must be gas, liquid or solid" << nl
+                << exit(FatalError);
+        }
+}
+
+
+Foam::phaseProperties::phaseType Foam::phaseProperties::phase() const
+{
+    return phase_;
+}
+
+
+Foam::word Foam::phaseProperties::phaseTypeName() const
+{
+    return phaseTypeNames_[phase_];
+}
+
+
+const Foam::List<Foam::Tuple2<Foam::word, Foam::scalar> >&
+Foam::phaseProperties::components() const
+{
+    return components_;
+}
+
+
+const Foam::word& Foam::phaseProperties::name(const label cmptI) const
+{
+    if (cmptI >= components_.size())
+    {
+        FatalErrorIn
+        (
+            "const Foam::word& Foam::phaseProperties::name"
+            "("
+            "    const label cmptI"
+            ") const"
+        )   << "Requested component " << cmptI << "out of range" << nl
+            << "Available phase components:" << nl << components_ << nl
+            << exit(FatalError);
+    }
+
+    return components_[cmptI].first();
+}
+
+
+const Foam::wordList Foam::phaseProperties::names() const
+{
+    wordList cmptNames(components_.size());
+
+    forAll(components_, cmptI)
+    {
+        cmptNames[cmptI] = components_[cmptI].first();
+    }
+
+    return cmptNames;
+}
+
+
+Foam::label Foam::phaseProperties::id(const word& cmptName) const
+{
+    forAll(components_, cmptI)
+    {
+        if (components_[cmptI].first() == cmptName)
+        {
+            return cmptI;
+        }
+    }
+
+    return -1;
+}
+
+
+Foam::label Foam::phaseProperties::globalId(const word& cmptName) const
+{
+    label id = this->id(cmptName);
+
+    if (id < 0)
+    {
+        return id;
+    }
+    else
+    {
+        return globalIds_[id];
+    }
+
+}
+
+
+const Foam::labelList& Foam::phaseProperties::globalIds() const
+{
+    return globalIds_;
+}
+
+
+Foam::scalar& Foam::phaseProperties::Y(const label cmptI)
+{
+    if (cmptI >= components_.size())
+    {
+        FatalErrorIn
+        (
+            "const Foam::scalar& Foam::phaseProperties::Y"
+            "("
+            "    const label cmptI"
+            ") const"
+        )   << "Requested component " << cmptI << "out of range" << nl
+            << "Available phase components:" << nl << components_ << nl
+            << exit(FatalError);
+    }
+
+    return components_[cmptI].second();
+}
+
+
+const Foam::scalarList Foam::phaseProperties::Y() const
+{
+    scalarList cmptYs(components_.size(), 0.0);
+
+    forAll(cmptYs, i)
+    {
+        cmptYs[i] = components_[i].second();
+    }
+
+    return cmptYs;
+}
+
+
+// ************************************************************************* //
+
diff --git a/src/lagrangian/intermediate/phaseProperties/phaseProperties/phaseProperties.H b/src/lagrangian/intermediate/phaseProperties/phaseProperties/phaseProperties.H
new file mode 100644
index 0000000000000000000000000000000000000000..258d0069aed0e2e58694c4be7b17acf861726ce1
--- /dev/null
+++ b/src/lagrangian/intermediate/phaseProperties/phaseProperties/phaseProperties.H
@@ -0,0 +1,177 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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::phaseProperties
+
+Description
+    Helper class to manage multi-component phase properties
+
+SourceFiles
+    phaseProperties.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef phaseProperties_H
+#define phaseProperties_H
+
+#include "NamedEnum.H"
+#include "Tuple2.H"
+#include "PtrList.H"
+#include "volFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                      Class phaseProperties Declaration
+\*---------------------------------------------------------------------------*/
+
+class phaseProperties
+{
+public:
+
+    // Public data
+
+        //- Phase type enumeration
+        enum phaseType
+        {
+            GAS,
+            LIQUID,
+            SOLID,
+            UNKNOWN
+        };
+
+        //- Corresponding word representations for phase type enumerations
+        static const NamedEnum<phaseType, 4> phaseTypeNames_;
+
+
+private:
+
+   // Private data
+
+        //- Phase type
+        phaseType phase_;
+
+        //- List of component names
+        List<word> names_;
+
+        //- List of component mass fractions
+        scalarField Y_;
+
+        //- Global ids
+        labelList globalIds_;
+
+
+    // Private member functions
+
+        //- Set global ids - specialisation for carrier gas phases
+        void setGlobalGasIds(const PtrList<volScalarField>& YGas);
+
+        //- Set global ids - liquid and solid phases
+        void setGlobalIds(const wordList& globalNames);
+
+        //- Check the total mass fraction
+        void checkTotalMassFraction() const;
+
+
+public:
+
+    // Constructors
+
+        //- Null constructor
+        phaseProperties();
+
+        //- Construct from Istream
+        phaseProperties(Istream&);
+
+        //- Construct as copy
+        phaseProperties(const phaseProperties&);
+
+
+    //- Destructor
+    ~phaseProperties();
+
+
+    // Public member functions
+
+        //- Initialise the global ids
+        void initialiseGlobalIds
+        (
+            const PtrList<volScalarField>& YGas,
+            const wordList& liquidNames,
+            const wordList& solidNames
+        );
+
+
+        // Access
+
+            //- Return const access to the phase type
+            phaseType phase() const;
+
+            //- Return word representation of the phase type
+            word phaseTypeName() const;
+
+            //- Return the list of component names
+            const List<word>& names() const;
+
+            //- Return const access to a component name
+            const word& name(const label cmptI) const;
+
+            //- Return const access to all component mass fractions
+            const scalarField& Y() const;
+
+            //- Return non-const access to a component mass fraction
+            scalar& Y(const label cmptI);
+
+            //- Return const acccess to the global ids
+            const labelList& globalIds() const;
+
+            //- Return the global id of a component in the local list by name
+            //  Returns -1 if not found
+            label globalId(const word& cmptName) const;
+
+            //- Return the id of a component in the local list by name
+            //  Returns -1 if not found
+            label id(const word& cmptName) const;
+
+
+    // IOstream Operators
+
+        friend Istream& operator>>(Istream&, phaseProperties&);
+        friend Ostream& operator<<(Ostream&, const phaseProperties&);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/lagrangian/intermediate/phaseProperties/phaseProperties/phaseProperties.H.bakNew b/src/lagrangian/intermediate/phaseProperties/phaseProperties/phaseProperties.H.bakNew
new file mode 100644
index 0000000000000000000000000000000000000000..b7ca4287157b870ef4c70da937865ba006c046c4
--- /dev/null
+++ b/src/lagrangian/intermediate/phaseProperties/phaseProperties/phaseProperties.H.bakNew
@@ -0,0 +1,177 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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::phaseProperties
+
+Description
+    Helper class to manage multi-component phase properties
+
+SourceFiles
+    phaseProperties.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef phaseProperties_H
+#define phaseProperties_H
+
+#include "NamedEnum.H"
+#include "Tuple2.H"
+#include "PtrList.H"
+#include "volFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                      Class phaseProperties Declaration
+\*---------------------------------------------------------------------------*/
+
+class phaseProperties
+{
+public:
+
+    // Public data
+
+        //- Phase type enumeration
+        enum phaseType
+        {
+            GAS,
+            LIQUID,
+            SOLID,
+            UNKNOWN
+        };
+
+        //- Corresponding word representations for phase type enumerations
+        static const NamedEnum<phaseType, 4> phaseTypeNames_;
+
+
+private:
+
+   // Private data
+
+        //- Phase type
+        phaseType phase_;
+
+        //- List of component names
+        List<word> names_;
+
+        //- List of component mass fractions
+        List<scalar> fractions_;
+
+        //- Global ids
+        labelList globalIds_;
+
+
+    // Private member functions
+
+        //- Set global ids - specialisation for carrier gas phases
+        void setGlobalGasIds(const PtrList<volScalarField>& YGas);
+
+        //- Set global ids - liquid and solid phases
+        void setGlobalIds(const wordList& globalNames);
+
+        //- Check the total mass fraction
+        void checkTotalMassFraction() const;
+
+
+public:
+
+    // Constructors
+
+        //- Null constructor
+        phaseProperties();
+
+        //- Construct from Istream
+        phaseProperties(Istream&);
+
+        //- Construct as copy
+        phaseProperties(const phaseProperties&);
+
+
+    //- Destructor
+    ~phaseProperties();
+
+
+    // Public member functions
+
+        //- Initialise the global ids
+        void initialiseGlobalIds
+        (
+            const PtrList<volScalarField>& YGas,
+            const wordList& liquidNames,
+            const wordList& solidNames
+        );
+
+        //- Return const access to the phase type
+        phaseType phase() const;
+
+        //- Return word representation of the phase type
+        word phaseTypeName() const;
+
+        //- Return const access to the component name vs mass fraction list
+        const List<Tuple2<word, scalar> >& components() const;
+
+        //- Return const access to a component name
+        const word& name(const label cmptI) const;
+
+        //- Return a list of component names
+        const wordList names() const;
+
+        //- Return the id of a component in the local list by name
+        //  Returns -1 if not found
+        label id(const word& cmptName) const;
+
+        //- Return the global id of a component in the local list by name
+        //  Returns -1 if not found
+        label globalId(const word& cmptName) const;
+
+        //- Return const acccess to the global ids
+        const labelList& globalIds() const;
+
+        //- Return non-const access to a component mass fraction
+        scalar& Y(const label cmptI);
+
+        //- Return const access to all component mass fractions
+        const scalarList Y() const;
+
+
+    // IOstream Operators
+
+        friend Istream& operator>>(Istream&, phaseProperties&);
+        friend Ostream& operator<<(Ostream&, const phaseProperties&);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/lagrangian/intermediate/phaseProperties/phaseProperties/phasePropertiesIO.C b/src/lagrangian/intermediate/phaseProperties/phaseProperties/phasePropertiesIO.C
new file mode 100644
index 0000000000000000000000000000000000000000..34641fe4d4bca52f4b807b23d7943443d39c7e30
--- /dev/null
+++ b/src/lagrangian/intermediate/phaseProperties/phaseProperties/phasePropertiesIO.C
@@ -0,0 +1,145 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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 "phaseProperties.H"
+#include "dictionaryEntry.H"
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+
+Foam::phaseProperties::phaseProperties(Istream& is)
+:
+    phase_(UNKNOWN),
+    names_(0),
+    Y_(0),
+    globalIds_(0)
+{
+    is.check("Foam::phaseProperties::phaseProperties(Istream& is)");
+
+    dictionaryEntry phaseInfo(dictionary::null, is);
+
+    if (!phaseInfo.isDict())
+    {
+        FatalErrorIn("Foam::phaseProperties::phaseProperties(Istream& is)")
+            << "Phase properties should be given in dictionary entries"
+            << nl << exit(FatalError);
+    }
+
+    label nComponents = phaseInfo.size();
+    names_.setSize(nComponents);
+    Y_.setSize(nComponents);
+
+    phase_ = phaseTypeNames_[phaseInfo.keyword()];
+
+    label cmptI = 0;
+    forAllConstIter(IDLList<entry>, phaseInfo, iter)
+    {
+        names_[cmptI] = iter().keyword();
+        Y_[cmptI] = readScalar(phaseInfo.lookup(names_[cmptI]));
+        cmptI++;
+    }
+
+    // initialise global ids to -1
+    globalIds_.setSize(nComponents, -1);
+
+    checkTotalMassFraction();
+}
+
+
+// * * * * * * * * * * * * * * * IOstream Operators  * * * * * * * * * * * * //
+
+Foam::Istream& Foam::operator>>(Istream& is, phaseProperties& pp)
+{
+    is.check
+    (
+        "Foam::Istream& Foam::operator>>"
+        "(Foam::Istream&, Foam::phaseProperties&)"
+    );
+
+    dictionaryEntry phaseInfo(dictionary::null, is);
+
+    if (!phaseInfo.isDict())
+    {
+        FatalErrorIn
+        (
+            "Foam::Istream& Foam::operator>>(Istream& is, phaseProperties& pp)"
+        )   << "Phase properties should be given in dictionary entries"
+            << nl << exit(FatalError);
+    }
+
+    label nComponents = phaseInfo.size();
+    pp.names_.setSize(nComponents);
+    pp.Y_.setSize(nComponents);
+
+    pp.phase_ = pp.phaseTypeNames_[phaseInfo.keyword()];
+
+    label cmptI = 0;
+    forAllConstIter(IDLList<entry>, phaseInfo, iter)
+    {
+        pp.names_[cmptI] = iter().keyword();
+        pp.Y_[cmptI] = readScalar(phaseInfo.lookup(pp.names_[cmptI]));
+        cmptI++;
+    }
+
+    // initialise global ids to -1
+    pp.globalIds_.setSize(nComponents, -1);
+
+    pp.checkTotalMassFraction();
+
+    return is;
+}
+
+
+Foam::Ostream& Foam::operator<<(Ostream& os, const phaseProperties& pp)
+{
+    os.check
+    (
+        "Foam::Ostream& Foam::operator<<"
+        "(Foam::Ostream&, const Foam::phaseProperties&)"
+    );
+
+    os  << pp.phaseTypeNames_[pp.phase_] << nl << token::BEGIN_BLOCK << nl
+        << incrIndent;
+
+    forAll(pp.names_, cmptI)
+    {
+        os.writeKeyword(pp.names_[cmptI]) << pp.Y_[cmptI]
+            << token::END_STATEMENT << nl;
+    }
+
+    os  << decrIndent << token::END_BLOCK << nl;
+
+    os.check
+    (
+        "Foam::Ostream& Foam::operator<<"
+        "(Foam::Ostream&, const Foam::phaseProperties&)"
+    );
+
+    return os;
+}
+
+
+// ************************************************************************* //
diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloudThermoTypes.H b/src/lagrangian/intermediate/phaseProperties/phasePropertiesList/phasePropertiesList.C
similarity index 53%
rename from src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloudThermoTypes.H
rename to src/lagrangian/intermediate/phaseProperties/phasePropertiesList/phasePropertiesList.C
index 2341e65aa027a792bc4c51e1a4063b0b39417398..9e5aeb69c3b76f89e059fe51662034ebd04b547b 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloudThermoTypes.H
+++ b/src/lagrangian/intermediate/phaseProperties/phasePropertiesList/phasePropertiesList.C
@@ -22,44 +22,68 @@ License
     along with OpenFOAM; if not, write to the Free Software Foundation,
     Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 
-Typedefs
-    Foam::cloudThermoTypes
+\*---------------------------------------------------------------------------*/
 
-Description
+#include "phasePropertiesList.H"
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::phasePropertiesList::phasePropertiesList
+(
+    Istream& is,
+    const PtrList<volScalarField>& YGas,
+    const wordList& liquidNames,
+    const wordList& solidNames
+)
+:
+    props_(is),
+    phaseTypeNames_()
+{
+    forAll(props_, i)
+    {
+        props_[i].initialiseGlobalIds(YGas, liquidNames, solidNames);
+    }
+
+    phaseTypeNames_.setSize(props_.size());
+    forAll(phaseTypeNames_, i)
+    {
+        phaseTypeNames_[i] = props_[i].phaseTypeName();
+    }
+}
 
-\*---------------------------------------------------------------------------*/
 
-#ifndef ReactingCloudThermoTypes_H
-#define ReactingCloudThermoTypes_H
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
-#include "sutherlandTransport.H"
-#include "multiComponentMixture.H"
-#include "specie.H"
-#include "constTransport.H"
-#include "specieThermo.H"
-#include "hConstThermo.H"
-#include "janafThermo.H"
-#include "perfectGas.H"
+Foam::phasePropertiesList::~phasePropertiesList()
+{}
 
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-namespace Foam
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+const Foam::List<Foam::phaseProperties>&
+Foam::phasePropertiesList::props() const
 {
-//    typedef multiComponentMixture<constTransport<specieThermo<hConstThermo<perfectGas> > > > specieProperties;
-//    typedef hConstThermo<perfectGas> specieProperties;
+    return props_;
+}
 
-//    typedef sutherlandTransport<specieThermo<janafThermo<perfectGas> > >
-//        specieProperties;
 
-    typedef sutherlandTransport<specieThermo<janafThermo<perfectGas> > >
-        specieReactingProperties;
+const Foam::wordList& Foam::phasePropertiesList::phaseTypes() const
+{
+    return phaseTypeNames_;
+}
 
-    typedef constTransport<specieThermo<hConstThermo<perfectGas> > >
-        specieConstProperties;
+
+Foam::label Foam::phasePropertiesList::size() const
+{
+    return props_.size();
 }
 
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-#endif
+const Foam::phaseProperties&
+Foam::phasePropertiesList::operator[](const label phaseI) const
+{
+    return props_[phaseI];
+}
+
 
 // ************************************************************************* //
diff --git a/src/lagrangian/intermediate/phaseProperties/phasePropertiesList/phasePropertiesList.H b/src/lagrangian/intermediate/phaseProperties/phasePropertiesList/phasePropertiesList.H
new file mode 100644
index 0000000000000000000000000000000000000000..80e8f5c859dd7dbbdcdfaf2d7a0da54ce07bef35
--- /dev/null
+++ b/src/lagrangian/intermediate/phaseProperties/phasePropertiesList/phasePropertiesList.H
@@ -0,0 +1,104 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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::phasePropertiesList
+
+Description
+    Simple container for a list of phase properties
+
+SourceFiles
+    phasePropertiesList.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef phasePropertiesList_H
+#define phasePropertiesList_H
+
+#include "Istream.H"
+#include "volFields.H"
+#include "wordList.H"
+#include "phaseProperties.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                    Class phasePropertiesList Declaration
+\*---------------------------------------------------------------------------*/
+
+class phasePropertiesList
+{
+    // Private data
+
+        //- List of phase properties
+        List<phaseProperties> props_;
+
+        //- List of word representation of phase types
+        wordList phaseTypeNames_;
+
+
+public:
+
+    //- Constructor
+    phasePropertiesList
+    (
+        Istream& is,
+        const PtrList<volScalarField>& YGas,
+        const wordList& liquidNames,
+        const wordList& solidNames
+    );
+
+    //- Destructor
+    ~phasePropertiesList();
+
+
+    // Public member functions
+
+        //- Return the list of phase properties
+        const List<phaseProperties>& props() const;
+
+        //- Return the list of word representation of phase types
+        const wordList& phaseTypes() const;
+
+        //- Return the size (number of phases)
+        label size() const;
+
+
+    // Member operators
+
+        const phaseProperties& operator[](const label) const;
+};
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.C b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.C
index 651b04153839ef57ad3f5fe66d1ce4ad4e47c13d..5d1de160e8db82a3644f8f72f0a8ce371b94e4a9 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.C
+++ b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.C
@@ -46,7 +46,7 @@ Foam::CompositionModel<CloudType>::CompositionModel
         (
             owner.mesh().objectRegistry::lookupObject<dictionary>
             (
-                "thermophysicalProperties"
+                carrierThermo_.name()
             )
         )
     ),
@@ -56,9 +56,16 @@ Foam::CompositionModel<CloudType>::CompositionModel
         (
             owner.mesh().objectRegistry::lookupObject<dictionary>
             (
-                "thermophysicalProperties"
+                carrierThermo_.name()
             )
         )
+    ),
+    phaseProps_
+    (
+        coeffDict_.lookup("phases"),
+        carrierThermo_.composition().Y(),
+        liquids_().components(),
+        solids_().components()
     )
 {}
 
@@ -123,6 +130,240 @@ const Foam::solidMixture& Foam::CompositionModel<CloudType>::solids() const
 }
 
 
+template<class CloudType>
+const Foam::phasePropertiesList&
+Foam::CompositionModel<CloudType>::phaseProps() const
+{
+    return phaseProps_;
+}
+
+
+template<class CloudType>
+Foam::label Foam::CompositionModel<CloudType>::nPhase() const
+{
+    return phaseProps_.size();
+}
+
+
+template<class CloudType>
+const Foam::wordList&
+Foam::CompositionModel<CloudType>::phaseTypes() const
+{
+    // if only 1 phase, return the constituent component names
+    if (phaseProps_.size() == 1)
+    {
+        return phaseProps_[0].names();
+    }
+    else
+    {
+        return phaseProps_.phaseTypes();
+    }
+}
+
+
+template<class CloudType>
+const Foam::wordList&
+Foam::CompositionModel<CloudType>::componentNames(const label phaseI) const
+{
+    return phaseProps_[phaseI].names();
+}
+
+
+template<class CloudType>
+Foam::label Foam::CompositionModel<CloudType>::globalId
+(
+    const label phaseI,
+    const word& cmptName
+) const
+{
+    label id = phaseProps_[phaseI].globalId(cmptName);
+
+    if (id < 0)
+    {
+        FatalErrorIn
+        (
+            "Foam::label Foam::CompositionModel<CloudType>::globalId\n"
+            "(\n"
+            "    const label phaseI,\n"
+            "    const word& cmptName\n"
+            ") const"
+        )   << "Unable to determine global id for requested component "
+            << cmptName << nl << abort(FatalError);
+    }
+
+    return id;
+}
+
+
+template<class CloudType>
+const Foam::labelList& Foam::CompositionModel<CloudType>::globalIds
+(
+    const label phaseI
+) const
+{
+    return phaseProps_[phaseI].globalIds();
+}
+
+
+template<class CloudType>
+Foam::label Foam::CompositionModel<CloudType>::localId
+(
+    const label phaseI,
+    const word& cmptName
+) const
+{
+    label id = phaseProps_[phaseI].id(cmptName);
+
+    if (id < 0)
+    {
+        FatalErrorIn
+        (
+            "Foam::label Foam::CompositionModel<CloudType>::localId\n"
+            "(\n"
+            "    const label phaseI,\n"
+            "    const word& cmptName\n"
+            ") const"
+        )   << "Unable to determine local id for component " << cmptName
+            << nl << abort(FatalError);
+    }
+
+    return id;
+}
+
+
+template<class CloudType>
+const Foam::scalarField& Foam::CompositionModel<CloudType>::Y0
+(
+    const label phaseI
+) const
+{
+    return phaseProps_[phaseI].Y();
+}
+
+
+template<class CloudType>
+Foam::scalar Foam::CompositionModel<CloudType>::H
+(
+    const label phaseI,
+    const scalarField& Y,
+    const scalar p,
+    const scalar T
+) const
+{
+    const phaseProperties& props = phaseProps_[phaseI];
+    scalar HMixture = 0.0;
+    switch (props.phase())
+    {
+        case phaseProperties::GAS:
+        {
+            forAll(Y, i)
+            {
+                label gid = props.globalIds()[i];
+                HMixture += Y[i]*this->gases()[gid].H(T);
+            }
+            break;
+        }
+        case phaseProperties::LIQUID:
+        {
+            forAll(Y, i)
+            {
+                label gid = props.globalIds()[i];
+                HMixture += Y[i]*this->liquids().properties()[gid].h(p, T);
+            }
+            break;
+        }
+        case phaseProperties::SOLID:
+        {
+            forAll(Y, i)
+            {
+                label gid = props.globalIds()[i];
+                HMixture +=
+                     Y[i]
+                    *(
+                        this->solids().properties()[gid].Hf()
+                      + this->solids().properties()[gid].cp()*T
+                     );
+            }
+            break;
+        }
+        default:
+        {
+            FatalErrorIn
+            (
+                "Foam::scalar Foam::CompositionModel<CloudType>::H\n"
+                "(\n"
+                "    const label phaseI,\n"
+                "    const scalarField& Y,"
+                "    const scalar p,\n"
+                "    const scalar T\n"
+                ") const"
+            )   << "Unknown phase enumeration" << nl << abort(FatalError);
+        }
+    }
+
+    return HMixture;
+}
+
+
+template<class CloudType>
+Foam::scalar Foam::CompositionModel<CloudType>::cp
+(
+    const label phaseI,
+    const scalarField& Y,
+    const scalar p,
+    const scalar T
+) const
+{
+    const phaseProperties& props = phaseProps_[phaseI];
+    scalar cpMixture = 0.0;
+    switch (props.phase())
+    {
+        case phaseProperties::GAS:
+        {
+            forAll(Y, i)
+            {
+                label gid = props.globalIds()[i];
+                cpMixture += Y[i]*this->gases()[gid].Cp(T);
+            }
+            break;
+        }
+        case phaseProperties::LIQUID:
+        {
+            forAll(Y, i)
+            {
+                label gid = props.globalIds()[i];
+                cpMixture += Y[i]*this->liquids().properties()[gid].cp(p, T);
+            }
+            break;
+        }
+        case phaseProperties::SOLID:
+        {
+            forAll(Y, i)
+            {
+                label gid = props.globalIds()[i];
+                cpMixture += Y[i]*this->solids().properties()[gid].cp();
+            }
+            break;
+        }
+        default:
+        {
+            FatalErrorIn
+            (
+                "Foam::scalar Foam::CompositionModel<CloudType>::cp\n"
+                "(\n"
+                "    const label phaseI,\n"
+                "    const scalarField& Y,"
+                "    const scalar p,\n"
+                "    const scalar T\n"
+                ") const"
+            )   << "Unknown phase enumeration" << nl << abort(FatalError);
+        }
+    }
+
+    return cpMixture;
+}
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 #include "NewCompositionModel.C"
diff --git a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.H b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.H
index e5b5021fdf2a72fe10b5237a68963eee86a7832e..9dd21529c899f3985df171f45f11d9dce5820670 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.H
+++ b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.H
@@ -25,7 +25,6 @@ License
 Class
     Foam::CompositionModel
 
-
 Description
     Templated reacting parcel composition model class
     Consists of gases (via thermo package), liquids and solids
@@ -49,6 +48,8 @@ SourceFiles
 #include "liquidMixture.H"
 #include "solidMixture.H"
 
+#include "phasePropertiesList.H"
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 namespace Foam
@@ -84,6 +85,9 @@ class CompositionModel
         //- Global solid properties data
         autoPtr<solidMixture> solids_;
 
+        //- List of phase properties
+        phasePropertiesList phaseProps_;
+
 
 public:
 
@@ -143,103 +147,85 @@ public:
             //- Return the carrier phase thermo package
             const hCombustionThermo& carrierThermo() const;
 
-            //- Return the gases
-            const PtrList<specieReactingProperties>& gases() const;
 
-            //- Return the global liquids
-            const liquidMixture& liquids() const;
+            // Composition lists
 
-            //- Return the global solids
-            const solidMixture& solids() const;
+                //- Return the gases
+                const PtrList<specieReactingProperties>& gases() const;
 
-            //- Return the list of composition names
-            virtual const wordList compositionNames() const = 0;
+                //- Return the global liquids
+                const liquidMixture& liquids() const;
 
-            //- Return the list of gas names
-            virtual const wordList& gasNames() const = 0;
+                //- Return the global solids
+                const solidMixture& solids() const;
 
-            //- Return local id of gas based on gasName
-            virtual label gasLocalId(const word& gasName) const = 0;
+                //- Return the list of phase properties
+                const phasePropertiesList& phaseProps() const;
 
-            //- Return global id of gas based on gasName
-            virtual label gasGlobalId(const word& gasName) const = 0;
+                //- Return the number of phases
+                label nPhase() const;
 
-            //- Return the list indices of gases in global thermo list
-            virtual const labelList& gasGlobalIds() const = 0;
 
-            //- Return the list of gas mass fractions
-            virtual const scalarField& YGas0() const = 0;
+            // Phase properties
 
-            //- Return the list of liquid names
-            virtual const wordList& liquidNames() const = 0;
+                //- Return the list of phase type names
+                //  If only 1 phase, return the component names of that phase
+                const wordList& phaseTypes() const;
 
-            //- Return local id of liquid based on liquidName
-            virtual label liquidLocalId(const word& liquidName) const = 0;
+                //- Return the list of component names for phaseI
+                const wordList& componentNames(const label phaseI) const;
 
-            //- Return global id of liquid based on liquidName
-            virtual label liquidGlobalId(const word& liquidName) const = 0;
+                //- Return global id of component cmptName in phase phaseI
+                label globalId(const label phaseI, const word& cmptName) const;
 
-            //- Return the list indices of liquid in global thermo list
-            virtual const labelList& liquidGlobalIds() const = 0;
+                //- Return global ids of for phase phaseI
+                const labelList& globalIds(const label phaseI) const;
 
-            //- Return the list of liquid mass fractions
-            virtual const scalarField& YLiquid0() const = 0;
+                //- Return local id of component cmptName in phase phaseI
+                label localId(const label phaseI, const word& cmptName) const;
 
-            //- Return the list of solid names
-            virtual const wordList& solidNames() const = 0;
+                //- Return the list of phase phaseI mass fractions
+                const scalarField& Y0(const label phaseI) const;
 
-            //- Return local id of solid based on solidName
-            virtual label solidLocalId(const word& solidName) const = 0;
 
-            //- Return global id of solid based on solidName
-            virtual label solidGlobalId(const word& solidName) const = 0;
+            // Mixture properties
 
-            //- Return the list indices of solids in global thermo list
-            virtual const labelList& solidGlobalIds() const = 0;
+                //- Return the list of mixture mass fractions
+                //  If only 1 phase, return component fractions of that phase
+                virtual const scalarField& YMixture0() const = 0;
 
-            //- Return the list of solid mass fractions
-            virtual const scalarField& YSolid0() const = 0;
+                // Indices of gas, liquid and solid phases in phase properties
+                // list - returns -1 if not applicable
 
-            //- Return the list of mixture mass fractions
-            virtual const scalarField& YMixture0() const = 0;
+                    //- Gas id
+                    virtual label idGas() const = 0;
 
-            //- Return the gas constant for the gas mixture
-            virtual scalar RGas(const scalarField& YGas) const = 0;
+                    //- Liquid id
+                    virtual label idLiquid() const = 0;
 
-            //- Return enthalpy for the gas mixture [energy per unit mass]
-            virtual scalar HGas
-            (
-                 const scalarField& YGas,
-                 const scalar T
-            ) const = 0;
+                    //- Solid id
+                    virtual label idSolid() const = 0;
 
-            //- Return enthalpy for the solid mixture [energy per unit mass]
-            virtual scalar HSolid
-            (
-                const scalarField& YSolid,
-                const scalar T
-            ) const = 0;
 
-            //- Return specific heat caparcity for the gas mixture
-            virtual scalar cpGas
-            (
-                 const scalarField& YGas,
-                 const scalar T
-            ) const = 0;
+        // Evaluation
 
-            //- Return specific heat caparcity for the liquid mixture
-            virtual scalar cpLiquid
+            //- Return enthalpy for the phase phaseI
+            virtual scalar H
             (
-                const scalarField& YLiquid,
+                const label phaseI,
+                const scalarField& Y,
                 const scalar p,
                 const scalar T
-            ) const = 0;
+            ) const;
 
-            //- Return specific heat caparcity for the solid mixture
-            virtual scalar cpSolid
+            //- Return cp for the phase phaseI
+            virtual scalar cp
             (
-                const scalarField& YSolid
-            ) const = 0;
+                const label phaseI,
+                const scalarField& Y,
+                const scalar p,
+                const scalar T
+            ) const;
 };
 
 
diff --git a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/NewCompositionModel.C b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/NewCompositionModel.C
index 7fd051cd73a8f697f75071ba816828198a2316e8..707c158cc6a6d74bc0a503e5221f8c9fca0a97fb 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/NewCompositionModel.C
+++ b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/NewCompositionModel.C
@@ -36,34 +36,32 @@ Foam::CompositionModel<CloudType>::New
     CloudType& owner
 )
 {
-    word ReactingCompositionModelType
-    (
-        dict.lookup("CompositionModel")
-    );
+    word CompositionModelType(dict.lookup("CompositionModel"));
 
-    Info<< "Selecting CompositionModel "
-        << ReactingCompositionModelType << endl;
+    Info<< "Selecting CompositionModel " << CompositionModelType << endl;
 
     typename dictionaryConstructorTable::iterator cstrIter =
-        dictionaryConstructorTablePtr_->find(ReactingCompositionModelType);
+        dictionaryConstructorTablePtr_->find(CompositionModelType);
 
     if (cstrIter == dictionaryConstructorTablePtr_->end())
     {
         FatalErrorIn
         (
-            "CompositionModel<CloudType>::New"
-            "(const dictionary&, CloudType&)"
+            "CompositionModel<CloudType>::New\n"
+            "(\n"
+            "    const dictionary&,\n"
+            "    CloudType&\n"
+            ")"
         )
-            << "Unknown ReactingCompositionModelType type "
-            << ReactingCompositionModelType
+            << "Unknown CompositionModelType type "
+            << CompositionModelType
             << ", constructor not in hash table" << nl << nl
             << "    Valid CompositionModel types are :" << nl
-            << dictionaryConstructorTablePtr_->toc()
+            << dictionaryConstructorTablePtr_->toc() << nl
             << exit(FatalError);
     }
 
-    return autoPtr<CompositionModel<CloudType> >
-        (cstrIter()(dict, owner));
+    return autoPtr<CompositionModel<CloudType> >(cstrIter()(dict, owner));
 }
 
 
diff --git a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SingleMixtureFraction/SingleMixtureFraction.C b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SingleMixtureFraction/SingleMixtureFraction.C
index afbaef739575eb837c5bba9912c5d37ec6e2df8d..9f5eed2c7c99c800df4402a17046e91ff9fab78f 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SingleMixtureFraction/SingleMixtureFraction.C
+++ b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SingleMixtureFraction/SingleMixtureFraction.C
@@ -26,356 +26,130 @@ License
 
 #include "SingleMixtureFraction.H"
 
-// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
 template<class CloudType>
-Foam::SingleMixtureFraction<CloudType>::SingleMixtureFraction
-(
-    const dictionary& dict,
-    CloudType& owner
-)
-:
-    CompositionModel<CloudType>(dict, owner, typeName),
-
-    gasNames_(this->coeffDict().lookup("gasNames")),
-    gasGlobalIds_(gasNames_.size(), -1),
-    YGas0_(this->coeffDict().lookup("YGas0")),
-    YGasTot0_(readScalar(this->coeffDict().lookup("YGasTot0"))),
-
-    liquidNames_(this->coeffDict().lookup("liquidNames")),
-    liquidGlobalIds_(liquidNames_.size(), -1),
-    YLiquid0_(this->coeffDict().lookup("YLiquid0")),
-    YLiquidTot0_(readScalar(this->coeffDict().lookup("YLiquidTot0"))),
-
-    solidNames_(this->coeffDict().lookup("solidNames")),
-    solidGlobalIds_(solidNames_.size(), -1),
-    YSolid0_(this->coeffDict().lookup("YSolid0")),
-    YSolidTot0_(readScalar(this->coeffDict().lookup("YSolidTot0"))),
-
-    YMixture0_(3)
+void Foam::SingleMixtureFraction<CloudType>::constructIds()
 {
-    // Construct gasGlobalIds_ list
-    forAll(gasNames_, i)
+    forAll(this->phaseProps(), phaseI)
     {
-        forAll (this->carrierThermo().composition().Y(), j)
+        switch (this->phaseProps()[phaseI].phase())
         {
-            word specieName(this->carrierThermo().composition().Y()[j].name());
-
-            if (specieName == gasNames_[i])
+            case phaseProperties::GAS:
             {
-                gasGlobalIds_[i] = j;
+                idGas_ = phaseI;
                 break;
             }
-        }
-        if (gasGlobalIds_[i] == -1)
-        {
-            Info<< "\nThermo package species composition comprises:" << endl;
-            forAll (this->carrierThermo().composition().Y(), k)
-            {
-                Info<< this->carrierThermo().composition().Y()[k].name()
-                    << endl;
-            }
-
-            FatalErrorIn
-            (
-                "Foam::SingleMixtureFraction<CloudType>::SingleMixtureFraction"
-                "(const dictionary&, CloudType&)"
-            )   << "Could not find gas species " << gasNames_[i]
-                << " in species list" <<  exit(FatalError);
-        }
-    }
-
-    // Construct liquidGlobalIds_ list
-    forAll(liquidNames_, i)
-    {
-        forAll (this->liquids().components(), j)
-        {
-            word specieName(this->liquids().components()[j]);
-
-            if (specieName == liquidNames_[i])
+            case phaseProperties::LIQUID:
             {
-                liquidGlobalIds_[i] = j;
+                idLiquid_ = phaseI;
                 break;
             }
-        }
-        if (liquidGlobalIds_[i] == -1)
-        {
-            Info<< "\nLiquid mixture species composition comprises:" << endl;
-            forAll (this->liquids().components(), k)
-            {
-                Info<< this->liquids().components()[k] << endl;
-            }
-
-            FatalErrorIn
-            (
-                "Foam::SingleMixtureFraction<CloudType>::SingleMixtureFraction"
-                "(const dictionary&, CloudType&)"
-            )   << "Could not find liquid species " << liquidNames_[i]
-                << " in species list" <<  exit(FatalError);
-        }
-    }
-
-    // Construct solidGlobalIds_ list
-    forAll(solidNames_, i)
-    {
-        forAll (this->solids().components(), j)
-        {
-            word specieName(this->solids().components()[j]);
-
-            if (specieName == solidNames_[i])
+            case phaseProperties::SOLID:
             {
-                solidGlobalIds_[i] = j;
+                idSolid_ = phaseI;
                 break;
             }
-        }
-        if (solidGlobalIds_[i] == -1)
-        {
-            Info<< "\nSolid mixture species composition comprises:" << endl;
-            forAll (this->solids().components(), k)
+            default:
             {
-                Info<< this->solids().components()[k] << endl;
+                FatalErrorIn
+                (
+                    "void Foam::SingleMixtureFraction<CloudType>::"
+                    "constructIds()"
+                )   << "Unknown phase enumeration" << nl << abort(FatalError);
             }
-
-            FatalErrorIn
-            (
-                "Foam::SingleMixtureFraction<CloudType>::SingleMixtureFraction"
-                "(const dictionary&, CloudType&)"
-            )   << "Could not find solid species " << solidNames_[i]
-                << " in species list" <<  exit(FatalError);
         }
     }
 
-    // Set mixture fractions
-    YMixture0_[0] = YGasTot0_;
-    YMixture0_[1] = YLiquidTot0_;
-    YMixture0_[2] = YSolidTot0_;
-
-    // Check that total mass fractions = 1
-
-    if (YGas0_.size())
+    if (idGas_ < 0)
     {
-        if (mag(sum(YGas0_) - 1) > SMALL)
-        {
-            FatalErrorIn
-            (
-                "Foam::SingleMixtureFraction<CloudType>::SingleMixtureFraction"
-                "(const dictionary&, CloudType&)"
-            )<< "Mass fractions of YGas0 must sum to unity"
-             <<  exit(FatalError);
-        }
+        FatalErrorIn("Foam::SingleMixtureFraction<CloudType>::constructIds()")
+            << "No gas phase found in phase list:" << nl
+            << this->phaseTypes() << nl << endl;
     }
-    else
+    if (idLiquid_ < 0)
     {
-        YMixture0_[0] = 0.0;
+        FatalErrorIn("Foam::SingleMixtureFraction<CloudType>::constructIds()")
+            << "No liquid phase found in phase list:" << nl
+            << this->phaseTypes() << nl << endl;
     }
-
-    if (YLiquid0_.size())
+    if (idSolid_ < 0)
     {
-        if (mag(sum(YLiquid0_) - 1) > SMALL)
-        {
-            FatalErrorIn
-            (
-                "Foam::SingleMixtureFraction<CloudType>::SingleMixtureFraction"
-                "(const dictionary&, CloudType&)"
-            )<< "Mass fractions of YLiquid0 must sum to unity"
-             <<  exit(FatalError);
-        }
-    }
-    else
-    {
-        YMixture0_[1] = 0.0;
-    }
-
-    if (YSolid0_.size())
-    {
-        if (mag(sum(YSolid0_) - 1) > SMALL)
-        {
-            FatalErrorIn
-            (
-                "Foam::SingleMixtureFraction<CloudType>::SingleMixtureFraction"
-                "(const dictionary&, CloudType&)"
-            )<< "Mass fractions of YSolid0 must sum to unity"
-             <<  exit(FatalError);
-        }
-    }
-    else
-    {
-        YMixture0_[2] = 0.0;
-    }
-
-    // Check total mixture fraction sums to 1
-    if (mag(sum(YMixture0_) - 1) > SMALL)
-    {
-        FatalErrorIn
-        (
-            "Foam::SingleMixtureFraction<CloudType>::SingleMixtureFraction"
-            "(const dictionary&, CloudType&)"
-        )   << "Mass fractions YGasTot0 + YSolidTot0 + YSolidTot0 must sum "
-            << "to unity" <<  exit(FatalError);
+        FatalErrorIn("Foam::SingleMixtureFraction<CloudType>::constructIds()")
+            << "No solid phase found in phase list:" << nl
+            << this->phaseTypes() << nl << endl;
     }
 }
 
 
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
 template<class CloudType>
-Foam::SingleMixtureFraction<CloudType>::~SingleMixtureFraction()
-{}
-
-
-// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+Foam::SingleMixtureFraction<CloudType>::SingleMixtureFraction
+(
+    const dictionary& dict,
+    CloudType& owner
+)
+:
+    CompositionModel<CloudType>(dict, owner, typeName),
 
-template<class CloudType>
-const Foam::wordList
-Foam::SingleMixtureFraction<CloudType>::compositionNames() const
-{
-    wordList names(3);
-    names[0] = "Gas";
-    names[1] = "Liquid";
-    names[2] = "Solid";
-    return names;
-}
+    idGas_(-1),
+    idLiquid_(-1),
+    idSolid_(-1),
 
-template<class CloudType>
-const Foam::wordList&
-Foam::SingleMixtureFraction<CloudType>::gasNames() const
+    YMixture0_(3)
 {
-     return gasNames_;
-}
+    constructIds();
 
-
-template<class CloudType>
-Foam::label
-Foam::SingleMixtureFraction<CloudType>::gasLocalId(const word& gasName) const
-{
-    forAll(gasNames_, i)
+    if (this->phaseProps().size() != 3)
     {
-        if (gasName == gasNames_[i])
-        {
-            return i;
-        }
+        FatalErrorIn
+        (
+            "Foam::SingleMixtureFraction<CloudType>::"
+            "SingleMixtureFraction\n"
+            "(\n"
+            "    const dictionary&,\n"
+            "    CloudType&\n"
+            ")\n"
+        )   << "Incorrect numebr of phases: " << nl
+            << "    Please specify 1 gas, 1 liquid and 1 solid" << nl
+            << exit(FatalError);
     }
 
-    WarningIn
-    (
-        "Foam::label SingleMixtureFraction<CloudType>::"
-        "gasLocalId(const word& gasName) const"
-    )<< "Gas name " << gasName << " not found in gasNames_"
-     << endl;
+    this->coeffDict().lookup("YGasTot0") >> YMixture0_[idGas_];
+    this->coeffDict().lookup("YLiquidTot0") >> YMixture0_[idLiquid_];
+    this->coeffDict().lookup("YSolidTot0") >> YMixture0_[idSolid_];
 
-    return -1;
-}
-
-
-template<class CloudType>
-Foam::label
-Foam::SingleMixtureFraction<CloudType>::gasGlobalId(const word& gasName) const
-{
-    forAll(gasNames_, i)
+    if (mag(sum(YMixture0_) - 1.0) > SMALL)
     {
-        if (gasName == gasNames_[i])
-        {
-            return gasGlobalIds_[i];
-        }
+        FatalErrorIn
+        (
+            "Foam::SingleMixtureFraction<CloudType>::"
+            "SingleMixtureFraction\n"
+            "(\n"
+            "    const dictionary&,\n"
+            "    CloudType&\n"
+            ")\n"
+        )   << "Sum of phases should be 1. Phase fractions:" << nl
+            << YMixture0_ << nl << exit(FatalError);
     }
-
-    WarningIn
-    (
-        "Foam::label SingleMixtureFraction<CloudType>::"
-        "gasGlobalId(const word& gasName) const"
-    )<< "Gas name " << gasName << " not found in gasNames_"
-     << endl;
-
-    return -1;
-}
-
-
-template<class CloudType>
-const Foam::labelList&
-Foam::SingleMixtureFraction<CloudType>::gasGlobalIds() const
-{
-    return gasGlobalIds_;
-}
-
-
-template<class CloudType>
-const Foam::scalarField&
-Foam::SingleMixtureFraction<CloudType>::YGas0() const
-{
-    return YGas0_;
-}
-
-
-template<class CloudType>
-Foam::scalar Foam::SingleMixtureFraction<CloudType>::YGasTot0() const
-{
-    return YGasTot0_;
 }
 
 
-template<class CloudType>
-const Foam::wordList&
-Foam::SingleMixtureFraction<CloudType>::liquidNames() const
-{
-     return liquidNames_;
-}
-
-
-template<class CloudType>
-Foam::label Foam::SingleMixtureFraction<CloudType>::liquidLocalId
-(
-    const word& liquidName
-) const
-{
-    forAll(liquidNames_, i)
-    {
-        if (liquidName == liquidNames_[i])
-        {
-            return i;
-        }
-    }
-
-    WarningIn
-    (
-        "Foam::label SingleMixtureFraction<CloudType>::"
-        "liquidLocalId(const word& liquidName) const"
-    )<< "Liquid name " << liquidName << " not found in liquidNames_"
-     << endl;
-
-    return -1;
-}
-
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class CloudType>
-Foam::label Foam::SingleMixtureFraction<CloudType>::liquidGlobalId
-(
-    const word& liquidName
-) const
-{
-    forAll(liquidNames_, i)
-    {
-        if (liquidName == liquidNames_[i])
-        {
-            return liquidGlobalIds_[i];
-        }
-    }
+Foam::SingleMixtureFraction<CloudType>::~SingleMixtureFraction()
+{}
 
-    WarningIn
-    (
-        "Foam::label SingleMixtureFraction<CloudType>::"
-        "liquidGlobalId(const word& liquidName) const"
-    )<< "Liquid name " << liquidName << " not found in liquidNames_"
-     << endl;
-
-    return -1;
-}
 
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class CloudType>
-const Foam::labelList&
-Foam::SingleMixtureFraction<CloudType>::liquidGlobalIds() const
+const Foam::scalarField&
+Foam::SingleMixtureFraction<CloudType>::YGas0() const
 {
-    return liquidGlobalIds_;
+    return this->phaseProps()[idGas_].Y();
 }
 
 
@@ -383,81 +157,7 @@ template<class CloudType>
 const Foam::scalarField&
 Foam::SingleMixtureFraction<CloudType>::YLiquid0() const
 {
-    return YLiquid0_;
-}
-
-
-template<class CloudType>
-Foam::scalar Foam::SingleMixtureFraction<CloudType>::YLiquidTot0() const
-{
-    return YLiquidTot0_;
-}
-
-
-template<class CloudType>
-const Foam::wordList&
-Foam::SingleMixtureFraction<CloudType>::solidNames() const
-{
-    return solidNames_;
-}
-
-
-template<class CloudType>
-Foam::label Foam::SingleMixtureFraction<CloudType>::solidLocalId
-(
-    const word& solidName
-) const
-{
-    forAll(solidNames_, i)
-    {
-        if (solidName == solidNames_[i])
-        {
-            return i;
-        }
-    }
-
-    WarningIn
-    (
-        "Foam::label SingleMixtureFraction<CloudType>::"
-        "SolididLocalId(const word& solidName) const"
-    )<< "Solid name " << solidName << " not found in solidNames_"
-     << endl;
-
-    return -1;
-}
-
-
-template<class CloudType>
-Foam::label
-Foam::SingleMixtureFraction<CloudType>::solidGlobalId
-(
-    const word& solidName
-) const
-{
-    forAll(solidNames_, i)
-    {
-        if (solidName == solidNames_[i])
-        {
-            return solidGlobalIds_[i];
-        }
-    }
-
-    WarningIn
-    (
-        "Foam::label SingleMixtureFraction<CloudType>::"
-        "solidGlobalId(const word& solidName) const"
-    )<< "Solid name " << solidName << " not found in solidNames_"
-     << endl;
-
-    return -1;
-}
-
-
-template<class CloudType>
-const Foam::labelList&
-Foam::SingleMixtureFraction<CloudType>::solidGlobalIds() const
-{
-    return solidGlobalIds_;
+    return this->phaseProps()[idLiquid_].Y();
 }
 
 
@@ -465,15 +165,7 @@ template<class CloudType>
 const Foam::scalarField&
 Foam::SingleMixtureFraction<CloudType>::YSolid0() const
 {
-    return YSolid0_;
-}
-
-
-template<class CloudType>
-Foam::scalar
-Foam::SingleMixtureFraction<CloudType>::YSolidTot0() const
-{
-    return YSolidTot0_;
+    return this->phaseProps()[idSolid_].Y();
 }
 
 
@@ -486,115 +178,23 @@ Foam::SingleMixtureFraction<CloudType>::YMixture0() const
 
 
 template<class CloudType>
-Foam::scalar Foam::SingleMixtureFraction<CloudType>::RGas
-(
-    const scalarField& YGas
-) const
+Foam::label Foam::SingleMixtureFraction<CloudType>::idGas() const
 {
-    scalar RGasMixture = 0.0;
-    forAll(YGas, i)
-    {
-        label id = gasGlobalIds_[i];
-        RGasMixture += YGas[i]*this->gases()[id].R();
-    }
-    return RGasMixture;
+    return idGas_;
 }
 
 
 template<class CloudType>
-Foam::scalar Foam::SingleMixtureFraction<CloudType>::HGas
-(
-    const scalarField& YGas,
-    const scalar T
-)
-const
+Foam::label Foam::SingleMixtureFraction<CloudType>::idLiquid() const
 {
-    scalar HMixture = 0.0;
-    forAll(YGas, i)
-    {
-        label id = gasGlobalIds_[i];
-        HMixture += YGas[i]*this->gases()[id].H(T);
-    }
-    return HMixture;
+    return idLiquid_;
 }
 
 
 template<class CloudType>
-Foam::scalar Foam::SingleMixtureFraction<CloudType>::HSolid
-(
-    const scalarField& YSolid,
-    const scalar T
-)
-const
+Foam::label Foam::SingleMixtureFraction<CloudType>::idSolid() const
 {
-    scalar HMixture = 0.0;
-    forAll(YSolid, i)
-    {
-        label id = solidGlobalIds_[i];
-        HMixture +=
-            YSolid[i]
-           *(
-                this->solids().properties()[id].Hf()
-              + this->solids().properties()[id].cp()*T
-            );
-    }
-    return HMixture;
-}
-
-
-template<class CloudType>
-Foam::scalar Foam::SingleMixtureFraction<CloudType>::cpGas
-(
-    const scalarField& YGas,
-    const scalar T
-)
-const
-{
-    scalar cpMixture = 0.0;
-    forAll(YGas, i)
-    {
-        label id = gasGlobalIds_[i];
-        cpMixture += YGas[i]*this->gases()[id].Cp(T);
-    }
-    return cpMixture;
-}
-
-
-template<class CloudType>
-Foam::scalar Foam::SingleMixtureFraction<CloudType>::cpLiquid
-(
-    const scalarField& YLiquid,
-    const scalar p,
-    const scalar T
-)
-const
-{
-    scalar cpMixture = 0.0;
-    forAll(YLiquid, i)
-    {
-        label id = liquidGlobalIds_[i];
-        cpMixture += YLiquid[i]*this->liquids().properties()[id].cp(p, T);
-    }
-
-    return cpMixture;
-}
-
-
-template<class CloudType>
-Foam::scalar Foam::SingleMixtureFraction<CloudType>::cpSolid
-(
-    const scalarField& YSolid
-)
-const
-{
-    scalar cpMixture = 0.0;
-    forAll(YSolid, i)
-    {
-        label id = solidGlobalIds_[i];
-        cpMixture += YSolid[i]*this->solids().properties()[id].cp();
-    }
-
-    return cpMixture;
+    return idSolid_;
 }
 
 
diff --git a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SingleMixtureFraction/SingleMixtureFraction.H b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SingleMixtureFraction/SingleMixtureFraction.H
index 57d35358814ffaea1ab04eade4bef4fdf4b0f26e..c2b7198a2581da1483d2e7a3c3ea408866b1c0fb 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SingleMixtureFraction/SingleMixtureFraction.H
+++ b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SingleMixtureFraction/SingleMixtureFraction.H
@@ -25,10 +25,8 @@ License
 Class
     Foam::SingleMixtureFraction
 
-
 Description
-    Templated parcel single mixture fraction class
-    - Each phase sums to a mass fraction of 1
+    Templated parcel multi-phase, multi-component class
 
 SourceFiles
     SingleMixtureFraction.C
@@ -56,65 +54,29 @@ class SingleMixtureFraction
 {
     // Private data
 
-        //- Parcel properties
-
-            //- List of gas names
-            const wordList gasNames_;
-
-            //- Return local id of gas based on gasName
-            label gasLocalId(const word& gasName) const;
-
-            //- Return global id of gas based on gasName
-            label gasGlobalId(const word& gasName) const;
-
-            //- List of IDs of gases in global list
-            labelList gasGlobalIds_;
-
-            //- Initial mass fractions of gases
-            const scalarField YGas0_;
-
-            //- Initial total mass fractions of gases
-            const scalar YGasTot0_;
-
-            //- List of liquid names
-            const wordList liquidNames_;
+        // Indices of the phases
 
-            //- Return local id of liquid based on liquidName
-            label liquidLocalId(const word& liquidName) const;
+            //- Gas
+            label idGas_;
 
-            //- Return global id of liquid based on liquidName
-            label liquidGlobalId(const word& liquidName) const;
+            //- Liquid
+            label idLiquid_;
 
-            //- List of IDs of liquids in global list
-            labelList liquidGlobalIds_;
+            //- Solid
+            label idSolid_;
 
-            //- Initial mass fractions of liquids
-            const scalarField YLiquid0_;
 
-            //- Initial total mass fractions of liquids
-            const scalar YLiquidTot0_;
+       // Mixture properties
 
-            //- List of solids species
-            const wordList solidNames_;
-
-            //- Return local id of solid based on solidName
-            label solidLocalId(const word& solidName) const;
-
-            //- Return global id of solid based on solidName
-            label solidGlobalId(const word& solidName) const;
+            //- Phase component total fractions
+            scalarField YMixture0_;
 
-            //- List of IDs of solids in global list
-            labelList solidGlobalIds_;
 
-            //- Initial mass fractions of solids
-            const scalarField YSolid0_;
+    // Private member functions
 
-            //- Initial total mass fractions of solids
-            const scalar YSolidTot0_;
-
-            //- Initial total mass fractions of the mixture
-            //  Index 0 = gas, 1 = liquid, 2 = solid
-            scalarField YMixture0_;
+        //- Construct the indices and check correct specification of
+        //  1 gas, 1 liquid and 1 solid
+        void constructIds();
 
 
 public:
@@ -126,11 +88,7 @@ public:
     // Constructors
 
         //- Construct from dictionary
-        SingleMixtureFraction
-        (
-            const dictionary& dict,
-            CloudType& owner
-        );
+        SingleMixtureFraction(const dictionary& dict, CloudType& owner);
 
 
     //- Destructor
@@ -141,70 +99,49 @@ public:
 
         // Access
 
-            //- Return the list of composition names
-            const wordList compositionNames() const;
-
-            //- Return the list of gas names
-            const wordList& gasNames() const;
-
-            //- Return the list indices of gases in global thermo list
-            const labelList& gasGlobalIds() const;
+            // Gas properties
 
-            //- Return the list of gas mass fractions
-            const scalarField& YGas0() const;
+                //- Return the list of gas mass fractions
+                const scalarField& YGas0() const;
 
-            //- Return the total gas mass fraction
-            scalar YGasTot0() const;
+                //- Return the total gas mass fraction
+                scalar YGasTot0() const;
 
-            //- Return the list of liquid names
-            const wordList& liquidNames() const;
 
-            //- Return the list indices of liquid in global thermo list
-            const labelList& liquidGlobalIds() const;
+            // Liquid properties
 
-            //- Return the list of liquid mass fractions
-            const scalarField& YLiquid0() const;
+                //- Return the list of liquid mass fractions
+                const scalarField& YLiquid0() const;
 
-            //- Return the total liquid mass fraction
-            scalar YLiquidTot0() const;
+                //- Return the total liquid mass fraction
+                scalar YLiquidTot0() const;
 
-             //- Return the list of solid names
-            const wordList& solidNames() const;
 
-            //- Return the list indices of solids in global thermo list
-            const labelList& solidGlobalIds() const;
+            // Solid properties
 
-            //- Return the list of solid mass fractions
-            const scalarField& YSolid0() const;
+                //- Return the list of solid mass fractions
+                const scalarField& YSolid0() const;
 
-            //- Return the total solid mass fraction
-            scalar YSolidTot0() const;
+                //- Return the total solid mass fraction
+                scalar YSolidTot0() const;
 
-            //- Return the list of mixture mass fractions
-            const scalarField& YMixture0() const;
 
-            //- Return the gas constant for the gas mixture
-            scalar RGas(const scalarField& YGas) const;
+            // Mixture properties
 
-            //- Return enthalpy for the gas mixture [energy per unit mass]
-            scalar HGas(const scalarField& YGas, const scalar T) const;
+                //- Return the list of mixture mass fractions
+                virtual const scalarField& YMixture0() const;
 
-            //- Return enthalpy for the solid mixture [energy per unit mass]
-            scalar HSolid(const scalarField& YSolid, const scalar T) const;
+                // Indices of gas, liquid and solid phases in phase properties
+                // list
 
-            //- Return specific heat caparcity for the gas mixture
-            scalar cpGas(const scalarField& YGas, const scalar T) const;
+                    //- Gas id
+                    virtual label idGas() const;
 
-            //- Return specific heat caparcity for the liquid mixture
-            scalar cpLiquid
-            (
-                const scalarField& YLiquid,
-                const scalar p,
-                const scalar T
-            ) const;
+                    //- Liquid id
+                    virtual label idLiquid() const;
 
-            //- Return specific heat caparcity for the solid mixture
-            scalar cpSolid(const scalarField& YSolid) const;
+                    //- Solid id
+                    virtual label idSolid() const;
 };
 
 
diff --git a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SinglePhaseMixture/SinglePhaseMixture.C b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SinglePhaseMixture/SinglePhaseMixture.C
new file mode 100644
index 0000000000000000000000000000000000000000..bed2f1f94b3553044cf7ad6a92f9be4c9deae0df
--- /dev/null
+++ b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SinglePhaseMixture/SinglePhaseMixture.C
@@ -0,0 +1,166 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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 "SinglePhaseMixture.H"
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+template<class CloudType>
+void Foam::SinglePhaseMixture<CloudType>::constructIds()
+{
+    if (this->phaseProps().size() != 1)
+    {
+        FatalErrorIn
+        (
+            "void Foam::SinglePhaseMixture<CloudType>::constructIds()"
+        )   << "Only one phase permitted" << nl << exit(FatalError);
+    }
+
+    switch (this->phaseProps()[0].phase())
+    {
+        case phaseProperties::GAS:
+        {
+            idGas_ = 0;
+            break;
+        }
+        case phaseProperties::LIQUID:
+        {
+            idLiquid_ = 0;
+            break;
+        }
+        case phaseProperties::SOLID:
+        {
+            idSolid_ = 0;
+            break;
+        }
+        default:
+        {
+            FatalErrorIn
+            (
+                "void Foam::SinglePhaseMixture<CloudType>::constructIds()"
+            )   << "Unknown phase enumeration" << nl << abort(FatalError);
+        }
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+template<class CloudType>
+Foam::SinglePhaseMixture<CloudType>::SinglePhaseMixture
+(
+    const dictionary& dict,
+    CloudType& owner
+)
+:
+    CompositionModel<CloudType>(dict, owner, typeName),
+    idGas_(-1),
+    idLiquid_(-1),
+    idSolid_(-1)
+{
+    constructIds();
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+template<class CloudType>
+Foam::SinglePhaseMixture<CloudType>::~SinglePhaseMixture()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class CloudType>
+const Foam::scalarField&
+Foam::SinglePhaseMixture<CloudType>::YGas0() const
+{
+    notImplemented
+    (
+        "const Foam::scalarField& "
+        "Foam::SinglePhaseMixture<CloudType>::YGas0() const"
+    );
+    return this->phaseProps()[0].Y();
+}
+
+
+template<class CloudType>
+const Foam::scalarField&
+Foam::SinglePhaseMixture<CloudType>::YLiquid0() const
+{
+    notImplemented
+    (
+        "const Foam::scalarField& "
+        "Foam::SinglePhaseMixture<CloudType>::YLiquid0() const"
+    );
+    return this->phaseProps()[0].Y();
+}
+
+
+template<class CloudType>
+const Foam::scalarField&
+Foam::SinglePhaseMixture<CloudType>::YSolid0() const
+{
+    notImplemented
+    (
+        "const Foam::scalarField& "
+        "Foam::SinglePhaseMixture<CloudType>::YSolid0() const"
+    );
+    return this->phaseProps()[0].Y();
+}
+
+
+template<class CloudType>
+const Foam::scalarField&
+Foam::SinglePhaseMixture<CloudType>::YMixture0() const
+{
+    return this->phaseProps()[0].Y();
+}
+
+
+template<class CloudType>
+Foam::label Foam::SinglePhaseMixture<CloudType>::idGas() const
+{
+    return idGas_;
+}
+
+
+template<class CloudType>
+Foam::label Foam::SinglePhaseMixture<CloudType>::idLiquid() const
+{
+    return idLiquid_;
+}
+
+
+template<class CloudType>
+Foam::label Foam::SinglePhaseMixture<CloudType>::idSolid() const
+{
+    return idSolid_;
+}
+
+
+// ************************************************************************* //
+
diff --git a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SinglePhaseMixture/SinglePhaseMixture.H b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SinglePhaseMixture/SinglePhaseMixture.H
new file mode 100644
index 0000000000000000000000000000000000000000..91a727587dc7fe57fa1f4de3ff8852ea42a70f62
--- /dev/null
+++ b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/SinglePhaseMixture/SinglePhaseMixture.H
@@ -0,0 +1,156 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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::SinglePhaseMixture
+
+Description
+    Templated parcel single phase, multi-component class
+
+SourceFiles
+    SinglePhaseMixture.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef SinglePhaseMixture_H
+#define SinglePhaseMixture_H
+
+#include "CompositionModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                      Class SinglePhaseMixture Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class CloudType>
+class SinglePhaseMixture
+:
+    public CompositionModel<CloudType>
+{
+    // Private data
+
+        // Indices of the phases - only 1 will be set
+
+            //- Gas
+            label idGas_;
+
+            //- Liquid
+            label idLiquid_;
+
+            //- Solid
+            label idSolid_;
+
+
+    // Private member functions
+
+        //- Construct the indices and check correct specification of
+        //  1 gas or 1 liquid or 1 solid
+        void constructIds();
+
+
+public:
+
+    //- Runtime type information
+    TypeName("SinglePhaseMixture");
+
+
+    // Constructors
+
+        //- Construct from dictionary
+        SinglePhaseMixture(const dictionary& dict, CloudType& owner);
+
+
+    //- Destructor
+    virtual ~SinglePhaseMixture();
+
+
+    // Member Functions
+
+        // Access
+
+            // Gas properties
+
+                //- Return the list of gas mass fractions
+                const scalarField& YGas0() const;
+
+                //- Return the total gas mass fraction
+                scalar YGasTot0() const;
+
+
+            // Liquid properties
+
+                //- Return the list of liquid mass fractions
+                const scalarField& YLiquid0() const;
+
+                //- Return the total liquid mass fraction
+                scalar YLiquidTot0() const;
+
+
+            // Solid properties
+
+                //- Return the list of solid mass fractions
+                const scalarField& YSolid0() const;
+
+                //- Return the total solid mass fraction
+                scalar YSolidTot0() const;
+
+
+            // Mixture properties
+
+                //- Return the list of mixture mass fractions
+                virtual const scalarField& YMixture0() const;
+
+                // Indices of gas, liquid and solid phases in phase properties
+                // list
+
+                    //- Gas id
+                    virtual label idGas() const;
+
+                    //- Liquid id
+                    virtual label idLiquid() const;
+
+                    //- Solid id
+                    virtual label idSolid() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#   include "SinglePhaseMixture.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.C b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.C
index 33b328f212d45ff5f71041a441fe100d90be29c0..791512789c47c11e742f889bf2dc5a5d69f30cdf 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.C
+++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.C
@@ -59,7 +59,13 @@ template<class CloudType>
 Foam::scalar Foam::NoPhaseChange<CloudType>::calculate
 (
     const scalar,
+    const scalar,
+    const scalarField&,
     const scalarField&,
+    const vector,
+    const scalar,
+    const scalar,
+    const scalar,
     const scalar
 ) const
 {
diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.H b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.H
index 7f4359925f05c85195740e337ff0900b70136fc9..07341719db59b5734e01c5bf215ba87e9c8d6ceb 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.H
+++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.H
@@ -26,7 +26,7 @@ Class
     Foam::NoPhaseChange
 
 Description
-    Dummy devolatilisation model for 'no phase change'
+    Dummy phase change model for 'no phase change'
 
 \*---------------------------------------------------------------------------*/
 
@@ -76,9 +76,15 @@ public:
         //- Update model
         scalar calculate
         (
-            const scalar,
-            const scalarField&,
-            const scalar
+            const scalar T,
+            const scalar d,
+            const scalarField& Xc,
+            const scalarField& dMassMT,
+            const vector Ur,
+            const scalar Tc,
+            const scalar pc,
+            const scalar nuc,
+            const scalar dt
         ) const;
 };
 
diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.H b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.H
index 22ed27e080c1eb9abcf0b569814c83be076e0f5c..b06506d8281b5424fa5efba0bfd74643b44ba3c7 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.H
+++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.H
@@ -67,6 +67,12 @@ protected:
         const dictionary coeffDict_;
 
 
+    // Protected member functions
+
+        //- Sherwood number
+        scalar Sh() const;
+
+
 public:
 
     //- Runtime type information
@@ -129,9 +135,15 @@ public:
         //- Update model
         virtual scalar calculate
         (
-            const scalar dt,
-            const scalarField& YMixture,
-            const scalar T
+            const scalar T,
+            const scalar d,
+            const scalarField& Xc,
+            const scalarField& dMassMT,
+            const vector Ur,
+            const scalar Tc,
+            const scalar pc,
+            const scalar nuc,
+            const scalar dt
         ) const = 0;
 };
 
diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/liquidEvaporation/liquidEvaporation.C b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/liquidEvaporation/liquidEvaporation.C
new file mode 100644
index 0000000000000000000000000000000000000000..792ae89c64078aed4d1d559810bef2a157552960
--- /dev/null
+++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/liquidEvaporation/liquidEvaporation.C
@@ -0,0 +1,201 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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 "liquidEvaporation.H"
+#include "specie.H"
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+template <class CloudType>
+Foam::scalar Foam::liquidEvaporation<CloudType>::Sh
+(
+    const scalar Re,
+    const scalar Sc
+) const
+{
+    return 2.0 + 0.6*Foam::sqrt(Re)*pow(Sc, 0.333);
+}
+
+
+template <class CloudType>
+Foam::scalar Foam::liquidEvaporation<CloudType>::pSat
+(
+    const label i,
+    const scalar T
+) const
+{
+    const List<Tuple2<scalar, scalar> >& pSat = pSat_[i];
+
+    label id = 0;
+    label nT = pSat.size();
+    while ((id < nT) && (pSat[id].first() < T))
+    {
+        id++;
+    }
+
+    if (id == 0 || id == nT - 1)
+    {
+        return pSat[id].second();
+    }
+    else
+    {
+        return
+            (pSat[id].first() - T)
+           /(pSat[id].first() - pSat[id-1].first())
+           *(pSat[id].second() - pSat[id-1].second())
+          + pSat[id-1].second();
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+template <class CloudType>
+Foam::liquidEvaporation<CloudType>::liquidEvaporation
+(
+    const dictionary& dict,
+    CloudType& owner
+)
+:
+    PhaseChangeModel<CloudType>(dict, owner, typeName),
+    gases_(owner.gases()),
+    liquids_
+    (
+        liquidMixture::New
+        (
+            owner.mesh().objectRegistry::lookupObject<dictionary>
+            (
+                owner.carrierThermo().name().name()
+            )
+        )
+    ),
+    Tvap_(readScalar(coeffDict().lookup("Tvap"))),
+    Dm_(coeffDict().lookup("DiffusionCoeffs")),
+    pSat_(coeffDict().lookup("pSat"))
+{
+    if (liquids_.size() != Dm_.size())
+    {
+        FatalErrorIn
+        (
+            "Foam::liquidEvaporation<CloudType>::liquidEvaporation\n"
+            "(\n"
+            "    const dictionary& dict,\n"
+            "    CloudType& cloud\n"
+            ")\n"
+        )   << "Size of diffusionCoeffs list not equal to the number of liquid "
+            << "species" << nl << exit(FatalError);
+    }
+
+    if (liquids_.size() != pSat_.size())
+    {
+        FatalErrorIn
+        (
+            "Foam::liquidEvaporation<CloudType>::liquidEvaporation\n"
+            "(\n"
+            "    const dictionary& dict,\n"
+            "    CloudType& cloud\n"
+            ")\n"
+        )   << "Size of saturation pressure lists not equal to the number of "
+            << "liquid species" << nl << exit(FatalError);
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+template <class CloudType>
+Foam::liquidEvaporation<CloudType>::~liquidEvaporation()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class CloudType>
+bool Foam::liquidEvaporation<CloudType>::active() const
+{
+    return true;
+}
+
+
+template<class CloudType>
+Foam::scalar Foam::liquidEvaporation<CloudType>::calculate
+(
+    const scalar T,
+    const scalar d,
+    const scalarField& Xc,
+    const scalarField& dMassMT,
+    const vector Ur
+    const scalar Tc,
+    const scalar pc,
+    const scalar nuc
+    const scalar dt,
+) const
+{
+    if (T < Tvap_)
+    {
+        // not reached temperature threshold
+        return 0.0;
+    }
+    else
+    {
+        // droplet area
+        scalar A = mathematicalConstant::pi*sqr(d);
+
+        // universal gas constant
+        const scalar R = specie::RR.value();
+
+        // Reynolds number
+        scalar Re = mag(Ur)*d/(nuc + ROOTVSMALL);
+
+        // calculate mass transfer of each specie
+        forAll(dMassMT, i)
+        {
+            // Schmidt number
+            scalar Sc = nuc/(Dm_[i] + ROOTVSMALL);
+
+            // Sherwood number
+            scalar Sh = this->Sh(Re, Sc);
+
+            // mass transfer coefficient [m/s]
+            scalar kc = Sh*Dm_[i]/(d + ROOTVSMALL);
+
+            // vapour concentration at droplet surface [kgmol/m3]
+            scalar Cs = pSat(i, T)/(R*T);
+
+            // vapour concentration in bulk gas [kgmol/m3]
+            scalar Cinf = Xc[i]*pc/(R*Tc);
+
+            // molar flux of vapour [kgmol/m2/s]
+            scalar Ni = max(kc*(Cs - Cinf), 0.0);
+
+            // mass transfer
+            dMassMT[i] -= Ni*A*liquids_.properies()[i].W()*dt;
+        }
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/liquidEvaporation/liquidEvaporation.H b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/liquidEvaporation/liquidEvaporation.H
new file mode 100644
index 0000000000000000000000000000000000000000..efc97fecabfe7e782b921a052ccf4a133ad1af06
--- /dev/null
+++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/liquidEvaporation/liquidEvaporation.H
@@ -0,0 +1,138 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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::liquidEvaporation
+
+Description
+    Liquid evaporation model
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef liquidEvaporation_H
+#define liquidEvaporation_H
+
+#include "PhaseChangeModel.H"
+#include "liquidMixture.H"
+#include "Tuple2.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+/*---------------------------------------------------------------------------*\
+                       Class liquidEvaporation Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class CloudType>
+class liquidEvaporation
+:
+    public PhaseChangeModel<CloudType>
+{
+protected:
+
+    // Protected data
+
+        //- Global liquid properties data
+        autoPtr<liquidMixture> liquids_;
+
+        //- Vaporisation temperature [K]
+        //  Local droplet temperature must exceed Tvap before evaporation is
+        //  allowed
+        scalar Tvap_;
+
+        //- Component diffusion coefficients - one per specie
+        //  Note: need to be in same order as defined by liquids in thermo
+        //        props
+        scalarList Dm_;
+
+        //- Component saturation pressure vs temperature
+        List<List<Tuple2<scalar, scalar> > > pSat_;
+
+
+    // Protected member functions
+
+        //- Sherwood number as a function of Reynolds and Schmidt numbers
+        scalar Sh(const scalar Re, const scalar Sc) const;
+
+        //- Return the saturation pressure for species i at temperature, T
+        scalar pSat(const label i, const scalar T) const;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("liquidEvaporation");
+
+
+    // Constructors
+
+        //- Construct from dictionary
+        liquidEvaporation
+        (
+            const dictionary& dict,
+            CloudType& cloud
+        );
+
+
+    //- Destructor
+    virtual ~liquidEvaporation();
+
+
+    // Member Functions
+
+        //- Flag to indicate whether model activates phase change model
+        bool active() const;
+
+        //- Update model
+        scalar calculate
+        (
+            const scalar T,
+            const scalar d,
+            const scalarField& Xc,
+            const scalarField& dMassMT,
+            const vector Ur,
+            const scalar Tc,
+            const scalar pc,
+            const scalar nuc,
+            const scalar dt
+        ) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#   include "liquidEvaporation.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 64d33f815f0c64d21cb3d369a5011b98c50e3549..c94fe00d4a2b4305eab4a7890bd429a556e24f18 100644
--- a/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/HeatTransferModel/HeatTransferModel.C
+++ b/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/HeatTransferModel/HeatTransferModel.C
@@ -83,7 +83,7 @@ Foam::scalar Foam::HeatTransferModel<CloudType>::h
     const scalar muc
 ) const
 {
-    const scalar Re = rhoc*mag(Ur)*dp/(muc + SMALL);
+    const scalar Re = rhoc*mag(Ur)*dp/(muc + ROOTVSMALL);
 
 //    const scalar Pr = muc/alphac;
     const scalar Pr = this->Pr();