diff --git a/src/lagrangian/dieselSpray/parcel/boundaryTreatment.H b/src/lagrangian/dieselSpray/parcel/boundaryTreatment.H
index a2e03dc676fbfe750739a489046148913f0befe2..e4031d29c246d12fce6c1d8dc5eb02e7848fc03e 100644
--- a/src/lagrangian/dieselSpray/parcel/boundaryTreatment.H
+++ b/src/lagrangian/dieselSpray/parcel/boundaryTreatment.H
@@ -1,6 +1,6 @@
 if (isA<wallPolyPatch>(pbMesh[patch(face())]))
 {
-    keepParcel = sDB.wall().wallTreatment(*this, face());
+    td.keepParticle = sDB.wall().wallTreatment(*this, face());
 
     if (sDB.twoD())
     {
@@ -50,5 +50,5 @@ else if (isA<symmetryPolyPatch>(pbMesh[patch(face())]))
 else if (isType<polyPatch>(pbMesh[patch(face())]))
 {
     // Parcel has hit an inlet or outlet or some such so throw it away
-    keepParcel = false;
+    td.keepParticle = false;
 }
diff --git a/src/lagrangian/dieselSpray/parcel/parcel.C b/src/lagrangian/dieselSpray/parcel/parcel.C
index 2f2516813939e6be4402fc56756765110c929385..839cdbc1493b4c94b6f9610dbc17d34aadce90a1 100644
--- a/src/lagrangian/dieselSpray/parcel/parcel.C
+++ b/src/lagrangian/dieselSpray/parcel/parcel.C
@@ -39,15 +39,15 @@ License
 
 namespace Foam
 {
-    defineParticleTypeNameAndDebug(parcel, 0);
-    defineTemplateTypeNameAndDebug(Cloud<parcel>, 0);
+//    defineParticleTypeNameAndDebug(parcel, 0);
+//    defineTemplateTypeNameAndDebug(Cloud<parcel>, 0);
 }
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
 Foam::parcel::parcel
 (
-    const Cloud<parcel>& cloud,
+    const polyMesh& mesh,
     const vector& position,
     const label cellI,
     const label tetFaceI,
@@ -69,11 +69,8 @@ Foam::parcel::parcel
     const List<word>& liquidNames
 )
 :
-    Particle<parcel>(cloud, position, cellI, tetFaceI, tetPtI),
-    liquidComponents_
-    (
-        liquidNames
-    ),
+    particle(mesh, position, cellI, tetFaceI, tetPtI),
+    liquidComponents_(liquidNames),
     d_(d),
     T_(T),
     m_(m),
@@ -94,11 +91,14 @@ Foam::parcel::parcel
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-bool Foam::parcel::move(spray& sDB, const scalar trackTime)
+bool Foam::parcel::move(trackingData& td, const scalar trackTime)
 {
-    const polyMesh& mesh = cloud().pMesh();
-    const polyBoundaryMesh& pbMesh = mesh.boundaryMesh();
+    td.switchProcessor = false;
+    td.keepParticle = true;
+
+    const polyBoundaryMesh& pbMesh = mesh_.boundaryMesh();
 
+    spray& sDB = td.cloud();
     const liquidMixtureProperties& fuels = sDB.fuels();
 
     label Nf = fuels.components().size();
@@ -139,8 +139,6 @@ bool Foam::parcel::move(spray& sDB, const scalar trackTime)
     scalarField tauEvaporation(Nf, GREAT);
     scalarField tauBoiling(Nf, GREAT);
 
-    bool keepParcel = true;
-
     setRelaxationTimes
     (
         cell(),
@@ -185,7 +183,6 @@ bool Foam::parcel::move(spray& sDB, const scalar trackTime)
     // (10 000 seems high enough)
     dtMax = max(dtMax, 1.0e-4*tEnd);
 
-    bool switchProcessor = false;
     vector planeNormal = vector::zero;
     if (sDB.twoD())
     {
@@ -194,7 +191,7 @@ bool Foam::parcel::move(spray& sDB, const scalar trackTime)
     }
 
     // move the parcel until there is no 'timeLeft'
-    while (keepParcel && tEnd > SMALL && !switchProcessor)
+    while (td.keepParticle && !td.switchProcessor && tEnd > SMALL)
     {
         // set the lagrangian time-step
         scalar dt = min(dtMax, tEnd);
@@ -205,10 +202,10 @@ bool Foam::parcel::move(spray& sDB, const scalar trackTime)
         scalar p = sDB.p()[cellI];
 
         // track parcel to face, or end of trajectory
-        if (keepParcel)
+        if (td.keepParticle)
         {
             // Track and adjust the time step if the trajectory is not completed
-            dt *= trackToFace(position() + dt*U_, sDB);
+            dt *= trackToFace(position() + dt*U_, td);
 
             // Decrement the end-time acording to how much time the track took
             tEnd -= dt;
@@ -218,11 +215,11 @@ bool Foam::parcel::move(spray& sDB, const scalar trackTime)
 
             if (onBoundary()) // hit face
             {
-#               include "boundaryTreatment.H"
+                #include "boundaryTreatment.H"
             }
         }
 
-        if (keepParcel && sDB.twoD())
+        if (td.keepParticle && sDB.twoD())
         {
             scalar z = position() & sDB.axisOfSymmetry();
             vector r = position() - z*sDB.axisOfSymmetry();
@@ -297,7 +294,7 @@ bool Foam::parcel::move(spray& sDB, const scalar trackTime)
         // remove parcel if it is 'small'
         if (m() < 1.0e-12)
         {
-            keepParcel = false;
+            td.keepParticle = false;
 
             // ... and add the removed 'stuff' to the gas
             forAll(nMass, i)
@@ -309,19 +306,19 @@ bool Foam::parcel::move(spray& sDB, const scalar trackTime)
             sDB.shs()[cellI] += m()*(nH + nPE);
         }
 
-        if (onBoundary() && keepParcel)
+        if (onBoundary() && td.keepParticle)
         {
             if (face() > -1)
             {
                 if (isA<processorPolyPatch>(pbMesh[patch(face())]))
                 {
-                    switchProcessor = true;
+                    td.switchProcessor = true;
                 }
             }
         }
     }
 
-    return keepParcel;
+    return td.keepParticle;
 }
 
 
diff --git a/src/lagrangian/dieselSpray/parcel/parcel.H b/src/lagrangian/dieselSpray/parcel/parcel.H
index 6e10c71cf2f08a8fbbdea625b76cadd1be7c9229..295f4ccac78b9a1e72de07867ef3a88e615ce4bf 100644
--- a/src/lagrangian/dieselSpray/parcel/parcel.H
+++ b/src/lagrangian/dieselSpray/parcel/parcel.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2004-2010 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2004-2011 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -32,7 +32,7 @@ Description
 #ifndef parcel_H
 #define parcel_H
 
-#include "Particle.H"
+#include "particle.H"
 #include "contiguous.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -48,7 +48,7 @@ class spray;
 
 class parcel
 :
-    public Particle<parcel>
+    public particle
 {
     // Private member data
 
@@ -142,13 +142,25 @@ public:
 
     friend class Cloud<parcel>;
 
+    //- Class used to pass tracking data to the trackToFace function
+    class trackingData
+    :
+        public particle::TrackingData<spray>
+    {
+    public:
+
+        trackingData(spray& cloud)
+        :
+            particle::TrackingData<spray>(cloud)
+        {}
+    };
 
     // Constructors
 
         //- Construct from components
         parcel
         (
-            const Cloud<parcel>& cloud,
+            const polyMesh& mesh,
             const vector& position,
             const label cellI,
             const label tetFaceI,
@@ -173,11 +185,30 @@ public:
         //- Construct from Istream reading field values if required
         parcel
         (
-            const Cloud<parcel>& cloud,
+            const polyMesh& mesh,
             Istream& is,
             bool readFields = true
         );
 
+        //- Factory class to read-construct particles used for
+        //  parallel transfer
+        class iNew
+        {
+            const polyMesh& mesh_;
+
+        public:
+
+            iNew(const polyMesh& mesh)
+            :
+                mesh_(mesh)
+            {}
+
+            autoPtr<parcel> operator()(Istream& is) const
+            {
+                return autoPtr<parcel>(new parcel(mesh_, is, true));
+            }
+        };
+
 
     // Member Functions
 
@@ -349,7 +380,7 @@ public:
 
         // Parcel operations
 
-            bool move(spray& sprayData, const scalar trackTime);
+            bool move(trackingData& td, const scalar trackTime);
 
             //- Transform the position and physical properties of the particle
             //  according to the given transformation tensor
diff --git a/src/lagrangian/dieselSpray/parcel/parcelI.H b/src/lagrangian/dieselSpray/parcel/parcelI.H
index 2b3b1786a5c7f0142c915d2834bd53eb6e5f65a1..e104a53bb2c69c3a858650b9c1f1b89fb9e822b4 100644
--- a/src/lagrangian/dieselSpray/parcel/parcelI.H
+++ b/src/lagrangian/dieselSpray/parcel/parcelI.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2004-2010 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2004-2011 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -23,182 +23,205 @@ License
 
 \*---------------------------------------------------------------------------*/
 
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-namespace Foam
-{
-
-// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
-
-inline const List<word>& parcel::liquidNames() const
+inline const Foam::List<Foam::word>& Foam::parcel::liquidNames() const
 {
     return liquidComponents_;
 }
 
-inline const List<word>& parcel::fuelNames() const
+
+inline const Foam::List<Foam::word>& Foam::parcel::fuelNames() const
 {
     return liquidComponents_;
 }
 
-inline scalar parcel::d() const
+
+inline Foam::scalar Foam::parcel::d() const
 {
     return d_;
 }
 
-inline scalar& parcel::d()
+
+inline Foam::scalar& Foam::parcel::d()
 {
     return d_;
 }
 
-inline scalar parcel::T() const
+
+inline Foam::scalar Foam::parcel::T() const
 {
     return T_;
 }
 
-inline scalar& parcel::T()
+
+inline Foam::scalar& Foam::parcel::T()
 {
     return T_;
 }
 
-inline scalar parcel::m() const
+
+inline Foam::scalar Foam::parcel::m() const
 {
     return m_;
 }
 
-inline scalar& parcel::m()
+
+inline Foam::scalar& Foam::parcel::m()
 {
     return m_;
 }
 
-inline scalar parcel::dev() const
+
+inline Foam::scalar Foam::parcel::dev() const
 {
     return y_;
 }
 
-inline scalar& parcel::dev()
+
+inline Foam::scalar& Foam::parcel::dev()
 {
     return y_;
 }
 
-inline scalar parcel::ddev() const
+
+inline Foam::scalar Foam::parcel::ddev() const
 {
     return yDot_;
 }
 
-inline scalar& parcel::ddev()
+
+inline Foam::scalar& Foam::parcel::ddev()
 {
     return yDot_;
 }
 
-inline scalar parcel::ct() const
+
+inline Foam::scalar Foam::parcel::ct() const
 {
     return ct_;
 }
 
-inline scalar& parcel::ct()
+
+inline Foam::scalar& Foam::parcel::ct()
 {
     return ct_;
 }
 
-inline scalar& parcel::ms()
+
+inline Foam::scalar& Foam::parcel::ms()
 {
     return ms_;
 }
 
-inline scalar parcel::ms() const
+
+inline Foam::scalar Foam::parcel::ms() const
 {
     return ms_;
 }
 
-inline scalar& parcel::tTurb()
+
+inline Foam::scalar& Foam::parcel::tTurb()
 {
     return tTurb_;
 }
 
-inline scalar parcel::tTurb() const
+
+inline Foam::scalar Foam::parcel::tTurb() const
 {
     return tTurb_;
 }
 
-inline scalar& parcel::liquidCore()
+
+inline Foam::scalar& Foam::parcel::liquidCore()
 {
     return liquidCore_;
 }
 
-inline scalar parcel::liquidCore() const
+
+inline Foam::scalar Foam::parcel::liquidCore() const
 {
     return liquidCore_;
 }
 
-inline scalar& parcel::injector()
+
+inline Foam::scalar& Foam::parcel::injector()
 {
     return injector_;
 }
 
-inline scalar parcel::injector() const
+
+inline Foam::scalar Foam::parcel::injector() const
 {
     return injector_;
 }
 
-inline const vector& parcel::U() const
+
+inline const Foam::vector& Foam::parcel::U() const
 {
     return U_;
 }
 
-inline vector& parcel::U()
+
+inline Foam::vector& Foam::parcel::U()
 {
     return U_;
 }
 
-inline const vector& parcel::Uturb() const
+
+inline const Foam::vector& Foam::parcel::Uturb() const
 {
     return Uturb_;
 }
 
-inline vector& parcel::Uturb()
+
+inline Foam::vector& Foam::parcel::Uturb()
 {
     return Uturb_;
 }
 
-inline const vector& parcel::n() const
+
+inline const Foam::vector& Foam::parcel::n() const
 {
     return n_;
 }
 
-inline vector& parcel::n()
+
+inline Foam::vector& Foam::parcel::n()
 {
     return n_;
 }
 
-inline const scalarField& parcel::X() const
+
+inline const Foam::scalarField& Foam::parcel::X() const
 {
     return X_;
 }
 
-inline scalarField& parcel::X()
+
+inline Foam::scalarField& Foam::parcel::X()
 {
     return X_;
 }
 
-inline scalar& parcel::tMom()
+
+inline Foam::scalar& Foam::parcel::tMom()
 {
     return tMom_;
 }
 
-inline scalar parcel::tMom() const
+
+inline Foam::scalar Foam::parcel::tMom() const
 {
     return tMom_;
 }
 
-inline vector parcel::Urel(const vector& U) const
+
+inline Foam::vector Foam::parcel::Urel(const vector& U) const
 {
     return U_ - U;
 }
 
-inline void parcel::correctNormal
-(
-    const vector& sym
-)
+
+inline void Foam::parcel::correctNormal(const vector& sym)
 {
     scalar d = position() & sym;
     n_ = position() - d*sym;
@@ -206,8 +229,4 @@ inline void parcel::correctNormal
 }
 
 
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-} // End namespace Foam
-
 // ************************************************************************* //
diff --git a/src/lagrangian/dieselSpray/parcel/parcelIO.C b/src/lagrangian/dieselSpray/parcel/parcelIO.C
index 8c474c24ba862e2137273e56d8719d6519fd33c8..8ce302574d4cec59658f64092ccf5b1d4a8b5724 100644
--- a/src/lagrangian/dieselSpray/parcel/parcelIO.C
+++ b/src/lagrangian/dieselSpray/parcel/parcelIO.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2004-2010 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2004-2011 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -30,17 +30,18 @@ License
 
 Foam::parcel::parcel
 (
-    const Cloud<parcel>& cloud,
+    const polyMesh& mesh,
     Istream& is,
     bool readFields
 )
 :
-    Particle<parcel>(cloud, is, readFields),
+    particle(mesh, is, readFields),
 
     liquidComponents_
     (
-        (cloud.pMesh().lookupObject<dictionary>("thermophysicalProperties"))
-       .lookup("liquidComponents")
+        (
+            mesh.lookupObject<dictionary>("thermophysicalProperties")
+        ).lookup("liquidComponents")
     ),
     X_(liquidComponents_.size(), 0.0),
 
@@ -102,7 +103,7 @@ void Foam::parcel::readFields(Cloud<parcel>& c)
         return;
     }
 
-    Particle<parcel>::readFields(c);
+    particle::readFields(c);
 
     IOField<scalar> d(c.fieldIOobject("d", IOobject::MUST_READ));
     c.checkFieldIOobject(c, d);
@@ -195,7 +196,7 @@ void Foam::parcel::readFields(Cloud<parcel>& c)
 
 void Foam::parcel::writeFields(const Cloud<parcel>& c)
 {
-    Particle<parcel>::writeFields(c);
+    particle::writeFields(c);
 
     label np = c.size();
 
@@ -289,10 +290,9 @@ void Foam::parcel::writeFields(const Cloud<parcel>& c)
 
 Foam::Ostream& Foam::operator<<(Ostream& os, const parcel& p)
 {
-
     if (os.format() == IOstream::ASCII)
     {
-        os  << static_cast<const Particle<parcel>&>(p)
+        os  << static_cast<const particle&>(p)
             << token::SPACE << p.d_
             << token::SPACE << p.T_
             << token::SPACE << p.m_
@@ -310,7 +310,7 @@ Foam::Ostream& Foam::operator<<(Ostream& os, const parcel& p)
     }
     else
     {
-        os  << static_cast<const Particle<parcel>&>(p);
+        os  << static_cast<const particle>(p);
         os.write
         (
             reinterpret_cast<const char*>(&p.d_),
diff --git a/src/lagrangian/dieselSpray/spray/findInjectorCell.H b/src/lagrangian/dieselSpray/spray/findInjectorCell.H
index e9e8a7bfa809bffad01ef79bbfe47d93eda40184..c50d276b567ef9d9a477bf1dd0bfe3e7267668ff 100644
--- a/src/lagrangian/dieselSpray/spray/findInjectorCell.H
+++ b/src/lagrangian/dieselSpray/spray/findInjectorCell.H
@@ -23,7 +23,7 @@ if (!foundCell)
 {
     injectionPosition = it->position(n);
 
-    findCellFacePt
+    mesh_.findCellFacePt
     (
         injectionPosition,
         injectorCell,
diff --git a/src/lagrangian/dieselSpray/spray/spray.C b/src/lagrangian/dieselSpray/spray/spray.C
index dbacb3bfa9910a4bf6bcebb31c3fdb08bfb4ce76..2d611823d6aa7f636ba5c9ab6c6429c5864b74d9 100644
--- a/src/lagrangian/dieselSpray/spray/spray.C
+++ b/src/lagrangian/dieselSpray/spray/spray.C
@@ -46,6 +46,7 @@ License
 
 namespace Foam
 {
+    defineTemplateTypeNameAndDebug(Cloud<parcel>, 0);
     defineTemplateTypeNameAndDebug(IOPtrList<injector>, 0);
 }
 
diff --git a/src/lagrangian/dieselSpray/spray/sprayInject.C b/src/lagrangian/dieselSpray/spray/sprayInject.C
index 4b6d56d01624c53637b64812c8b646339fcfcd6e..bea8272e39afeb9c3cedb24005ed0035309a2939 100644
--- a/src/lagrangian/dieselSpray/spray/sprayInject.C
+++ b/src/lagrangian/dieselSpray/spray/sprayInject.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2004-2010 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2004-2011 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -36,6 +36,8 @@ void Foam::spray::inject()
     scalar time = runTime_.value();
     scalar time0 = time0_;
 
+    parcel::trackingData td(*this);
+
     // Inject the parcels for each injector sequentially
     forAll(injectors_, i)
     {
@@ -111,7 +113,7 @@ void Foam::spray::inject()
                     label injectorTetFaceI = -1;
                     label injectorTetPtI = -1;
 
-                    findCellFacePt
+                    mesh_.findCellFacePt
                     (
                         injectionPosition,
                         injectorCell,
@@ -119,7 +121,7 @@ void Foam::spray::inject()
                         injectorTetPtI
                     );
 
-#                   include "findInjectorCell.H"
+                    #include "findInjectorCell.H"
 
                     if (injectorCell >= 0)
                     {
@@ -129,7 +131,7 @@ void Foam::spray::inject()
 
                         parcel* pPtr = new parcel
                         (
-                            *this,
+                            mesh_,
                             injectionPosition,
                             injectorCell,
                             injectorTetFaceI,
@@ -160,7 +162,7 @@ void Foam::spray::inject()
                            /runTime_.deltaTValue();
 
                         bool keepParcel =
-                            pPtr->move(*this, runTime_.deltaTValue());
+                            pPtr->move(td, runTime_.deltaTValue());
 
                         if (keepParcel)
                         {
diff --git a/src/lagrangian/dieselSpray/spray/sprayOps.C b/src/lagrangian/dieselSpray/spray/sprayOps.C
index a105ef33045bffb2235cfa2e149f2d4ee617d510..49915ed2db4466aca3aa17df64e7707b8357ce24 100644
--- a/src/lagrangian/dieselSpray/spray/sprayOps.C
+++ b/src/lagrangian/dieselSpray/spray/sprayOps.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2004-2010 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2004-2011 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -76,7 +76,8 @@ void Foam::spray::move()
         srhos_[i] = 0.0;
     }
 
-    Cloud<parcel>::move(*this, runTime_.deltaTValue());
+    parcel::trackingData td(*this);
+    Cloud<parcel>::move(td, runTime_.deltaTValue());
 }
 
 
diff --git a/src/lagrangian/dieselSpray/spraySubModels/breakupModel/SHF/SHF.C b/src/lagrangian/dieselSpray/spraySubModels/breakupModel/SHF/SHF.C
index 7e4ba37eebef18453d5246d1c4ef1c6544ead253..a4ff12b6bbbe5771d2255ab2344df8c60e928419 100644
--- a/src/lagrangian/dieselSpray/spraySubModels/breakupModel/SHF/SHF.C
+++ b/src/lagrangian/dieselSpray/spraySubModels/breakupModel/SHF/SHF.C
@@ -233,7 +233,7 @@ void Foam::SHF::breakupParcel
             (
                 new parcel
                 (
-                    spray_,
+                    p.mesh(),
                     p.position(),
                     p.cell(),
                     p.tetFace(),
diff --git a/src/lagrangian/dieselSpray/spraySubModels/breakupModel/reitzKHRT/reitzKHRT.C b/src/lagrangian/dieselSpray/spraySubModels/breakupModel/reitzKHRT/reitzKHRT.C
index 51b714f831ae5aa35e92e151499c007cef19672d..357409bce95f91264605776b6f7664665c19743e 100644
--- a/src/lagrangian/dieselSpray/spraySubModels/breakupModel/reitzKHRT/reitzKHRT.C
+++ b/src/lagrangian/dieselSpray/spraySubModels/breakupModel/reitzKHRT/reitzKHRT.C
@@ -195,7 +195,7 @@ void Foam::reitzKHRT::breakupParcel
                 (
                     new parcel
                     (
-                        spray_,
+                        p.mesh(),
                         p.position(),
                         p.cell(),
                         p.tetFace(),