diff --git a/applications/utilities/parallelProcessing/decomposePar/lagrangianFieldDecomposer.C b/applications/utilities/parallelProcessing/decomposePar/lagrangianFieldDecomposer.C
index 4392395af0394be1cb1cb6768a2905ccdc50d602..c9ab1ffbbe3f6091966be5e50543846d38b0abf6 100644
--- a/applications/utilities/parallelProcessing/decomposePar/lagrangianFieldDecomposer.C
+++ b/applications/utilities/parallelProcessing/decomposePar/lagrangianFieldDecomposer.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
@@ -100,7 +100,7 @@ Foam::lagrangianFieldDecomposer::lagrangianFieldDecomposer
                 (
                     new passiveParticle
                     (
-                        positions_,
+                        procMesh,
                         ppi.position(),
                         procCelli,
                         false
@@ -112,7 +112,7 @@ Foam::lagrangianFieldDecomposer::lagrangianFieldDecomposer
 
     particleIndices_.setSize(pi);
 
-    IOPosition<passiveParticle>(positions_).write();
+    IOPosition<Cloud<passiveParticle> >(positions_).write();
 }
 
 
diff --git a/applications/utilities/preProcessing/mapFields/mapLagrangian.C b/applications/utilities/preProcessing/mapFields/mapLagrangian.C
index 36dd9817194a65bb2edc72a52fe04cfa25fd0083..97a999b62cbdfccb7328eaa3dc7e91d70f2fb44c 100644
--- a/applications/utilities/preProcessing/mapFields/mapLagrangian.C
+++ b/applications/utilities/preProcessing/mapFields/mapLagrangian.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
@@ -24,8 +24,7 @@ License
 \*---------------------------------------------------------------------------*/
 
 #include "MapLagrangianFields.H"
-#include "Cloud.H"
-#include "passiveParticle.H"
+#include "passiveParticleCloud.H"
 #include "meshSearch.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -44,7 +43,9 @@ static label findCell(const Cloud<passiveParticle>& cloud, const point& pt)
     label tetFaceI = -1;
     label tetPtI = -1;
 
-    cloud.findCellFacePt(pt, cellI, tetFaceI, tetPtI);
+    const polyMesh& mesh = cloud.pMesh();
+
+    mesh.findCellFacePt(pt, cellI, tetFaceI, tetPtI);
 
     if (cellI >= 0)
     {
@@ -55,8 +56,6 @@ static label findCell(const Cloud<passiveParticle>& cloud, const point& pt)
         // See if particle on face by finding nearest face and shifting
         // particle.
 
-        const polyMesh& mesh = cloud.pMesh();
-
         meshSearch meshSearcher(mesh, false);
 
         label faceI = meshSearcher.findNearestBoundaryFace(pt);
@@ -67,7 +66,7 @@ static label findCell(const Cloud<passiveParticle>& cloud, const point& pt)
 
             const point perturbPt = (1-perturbFactor)*pt+perturbFactor*cc;
 
-            cloud.findCellFacePt(perturbPt, cellI, tetFaceI, tetPtI);
+            mesh.findCellFacePt(perturbPt, cellI, tetFaceI, tetPtI);
 
             return cellI;
         }
@@ -124,7 +123,7 @@ void mapLagrangian(const meshToMesh& meshToMeshInterp)
             Info<< nl << "    processing cloud " << cloudDirs[cloudI] << endl;
 
             // Read positions & cell
-            Cloud<passiveParticle> sourceParcels
+            passiveParticleCloud sourceParcels
             (
                 meshSource,
                 cloudDirs[cloudI],
@@ -134,13 +133,15 @@ void mapLagrangian(const meshToMesh& meshToMeshInterp)
                 << " parcels from source mesh." << endl;
 
             // Construct empty target cloud
-            Cloud<passiveParticle> targetParcels
+            passiveParticleCloud targetParcels
             (
                 meshTarget,
                 cloudDirs[cloudI],
                 IDLList<passiveParticle>()
             );
 
+            particle::TrackingData<passiveParticleCloud> td(targetParcels);
+
             label sourceParticleI = 0;
 
             // Indices of source particles that get added to targetParcels
@@ -176,15 +177,14 @@ void mapLagrangian(const meshToMesh& meshToMeshInterp)
                         (
                             new passiveParticle
                             (
-                                targetParcels,
+                                meshTarget,
                                 targetCc[targetCells[i]],
                                 targetCells[i]
                             )
                         );
                         passiveParticle& newP = newPtr();
 
-                        scalar fraction = 0;
-                        label faceI = newP.track(iter().position(), fraction);
+                        label faceI = newP.track(iter().position(), td);
 
                         if (faceI < 0 && newP.cell() >= 0)
                         {
@@ -246,7 +246,7 @@ void mapLagrangian(const meshToMesh& meshToMeshInterp)
 
             if (addParticles.size())
             {
-                IOPosition<passiveParticle>(targetParcels).write();
+                IOPosition<passiveParticleCloud>(targetParcels).write();
 
                 // addParticles now contains the indices of the sourceMesh
                 // particles that were appended to the target mesh.
diff --git a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementRefine.C b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementRefine.C
index be26fe0988c4b40fd119357767778aaff7040564..c2e7a6ffd0b71e23b50de5be248825f6a30ea19d 100644
--- a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementRefine.C
+++ b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementRefine.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
@@ -283,7 +283,7 @@ Foam::label Foam::meshRefinement::markFeatureRefinement
     label tetFaceI = -1;
     label tetPtI = -1;
 
-    cloud.findCellFacePt(keepPoint, cellI, tetFaceI, tetPtI);
+    mesh_.findCellFacePt(keepPoint, cellI, tetFaceI, tetPtI);
 
     if (cellI != -1)
     {
@@ -309,7 +309,7 @@ Foam::label Foam::meshRefinement::markFeatureRefinement
                     (
                         new trackedParticle
                         (
-                            cloud,
+                            mesh_,
                             keepPoint,
                             cellI,
                             tetFaceI,
@@ -330,7 +330,7 @@ Foam::label Foam::meshRefinement::markFeatureRefinement
     labelList maxFeatureLevel(mesh_.nCells(), -1);
 
     // Database to pass into trackedParticle::move
-    trackedParticle::trackData td(cloud, maxFeatureLevel);
+    trackedParticle::trackingData td(cloud, maxFeatureLevel);
 
     // Track all particles to their end position (= starting feature point)
     cloud.move(td, GREAT);
diff --git a/src/mesh/autoMesh/autoHexMesh/trackedParticle/trackedParticle.C b/src/mesh/autoMesh/autoHexMesh/trackedParticle/trackedParticle.C
index 214e7d64401bbca14cef2c6e349f97644e56b832..607a65ebaa71417123669516152e4bef176c8dd7 100644
--- a/src/mesh/autoMesh/autoHexMesh/trackedParticle/trackedParticle.C
+++ b/src/mesh/autoMesh/autoHexMesh/trackedParticle/trackedParticle.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
@@ -29,7 +29,7 @@ License
 
 Foam::trackedParticle::trackedParticle
 (
-    const Cloud<trackedParticle>& c,
+    const polyMesh& mesh,
     const vector& position,
     const label cellI,
     const label tetFaceI,
@@ -40,7 +40,7 @@ Foam::trackedParticle::trackedParticle
     const label j
 )
 :
-    Particle<trackedParticle>(c, position, cellI, tetFaceI, tetPtI),
+    particle(mesh, position, cellI, tetFaceI, tetPtI),
     end_(end),
     level_(level),
     i_(i),
@@ -50,12 +50,12 @@ Foam::trackedParticle::trackedParticle
 
 Foam::trackedParticle::trackedParticle
 (
-    const Cloud<trackedParticle>& c,
+    const polyMesh& mesh,
     Istream& is,
     bool readFields
 )
 :
-    Particle<trackedParticle>(c, is, readFields)
+    particle(mesh, is, readFields)
 {
     if (readFields)
     {
@@ -89,7 +89,7 @@ Foam::trackedParticle::trackedParticle
 
 bool Foam::trackedParticle::move
 (
-    trackedParticle::trackData& td,
+    trackingData& td,
     const scalar trackedParticle
 )
 {
@@ -120,7 +120,7 @@ bool Foam::trackedParticle::move
 bool Foam::trackedParticle::hitPatch
 (
     const polyPatch&,
-    trackedParticle::trackData& td,
+    trackingData& td,
     const label patchI,
     const scalar trackFraction,
     const tetIndices& tetIs
@@ -130,23 +130,10 @@ bool Foam::trackedParticle::hitPatch
 }
 
 
-bool Foam::trackedParticle::hitPatch
-(
-    const polyPatch&,
-    int&,
-    const label,
-    const scalar trackFraction,
-    const tetIndices& tetIs
-)
-{
-    return false;
-}
-
-
 void Foam::trackedParticle::hitWedgePatch
 (
     const wedgePolyPatch&,
-    trackedParticle::trackData& td
+    trackingData& td
 )
 {
     // Remove particle
@@ -154,18 +141,10 @@ void Foam::trackedParticle::hitWedgePatch
 }
 
 
-void Foam::trackedParticle::hitWedgePatch
-(
-    const wedgePolyPatch&,
-    int&
-)
-{}
-
-
 void Foam::trackedParticle::hitSymmetryPatch
 (
     const symmetryPolyPatch&,
-    trackedParticle::trackData& td
+    trackingData& td
 )
 {
     // Remove particle
@@ -173,18 +152,10 @@ void Foam::trackedParticle::hitSymmetryPatch
 }
 
 
-void Foam::trackedParticle::hitSymmetryPatch
-(
-    const symmetryPolyPatch&,
-    int&
-)
-{}
-
-
 void Foam::trackedParticle::hitCyclicPatch
 (
     const cyclicPolyPatch&,
-    trackedParticle::trackData& td
+    trackingData& td
 )
 {
     // Remove particle
@@ -192,18 +163,10 @@ void Foam::trackedParticle::hitCyclicPatch
 }
 
 
-void Foam::trackedParticle::hitCyclicPatch
-(
-    const cyclicPolyPatch&,
-    int&
-)
-{}
-
-
 void Foam::trackedParticle::hitProcessorPatch
 (
     const processorPolyPatch&,
-    trackedParticle::trackData& td
+    trackingData& td
 )
 {
     // Remove particle
@@ -211,18 +174,10 @@ void Foam::trackedParticle::hitProcessorPatch
 }
 
 
-void Foam::trackedParticle::hitProcessorPatch
-(
-    const processorPolyPatch&,
-    int&
-)
-{}
-
-
 void Foam::trackedParticle::hitWallPatch
 (
     const wallPolyPatch& wpp,
-    trackedParticle::trackData& td,
+    trackingData& td,
     const tetIndices&
 )
 {
@@ -231,19 +186,10 @@ void Foam::trackedParticle::hitWallPatch
 }
 
 
-void Foam::trackedParticle::hitWallPatch
-(
-    const wallPolyPatch& wpp,
-    int&,
-    const tetIndices&
-)
-{}
-
-
 void Foam::trackedParticle::hitPatch
 (
     const polyPatch& wpp,
-    trackedParticle::trackData& td
+    trackingData& td
 )
 {
     // Remove particle
@@ -251,21 +197,13 @@ void Foam::trackedParticle::hitPatch
 }
 
 
-void Foam::trackedParticle::hitPatch
-(
-    const polyPatch& wpp,
-    int&
-)
-{}
-
-
 // * * * * * * * * * * * * * * * IOstream Operators  * * * * * * * * * * * * //
 
 Foam::Ostream& Foam::operator<<(Ostream& os, const trackedParticle& p)
 {
     if (os.format() == IOstream::ASCII)
     {
-        os  << static_cast<const Particle<trackedParticle>&>(p)
+        os  << static_cast<const particle&>(p)
             << token::SPACE << p.end_
             << token::SPACE << p.level_
             << token::SPACE << p.i_
@@ -273,7 +211,7 @@ Foam::Ostream& Foam::operator<<(Ostream& os, const trackedParticle& p)
     }
     else
     {
-        os  << static_cast<const Particle<trackedParticle>&>(p);
+        os  << static_cast<const particle&>(p);
         os.write
         (
             reinterpret_cast<const char*>(&p.end_),
diff --git a/src/mesh/autoMesh/autoHexMesh/trackedParticle/trackedParticle.H b/src/mesh/autoMesh/autoHexMesh/trackedParticle/trackedParticle.H
index bfe0d9b385e8ad719d20df81aad5309c6b9c2af0..256b056f0b63a4cd048a3e11c4872790a94b85d5 100644
--- a/src/mesh/autoMesh/autoHexMesh/trackedParticle/trackedParticle.H
+++ b/src/mesh/autoMesh/autoHexMesh/trackedParticle/trackedParticle.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
@@ -36,7 +36,7 @@ SourceFiles
 #ifndef trackedParticle_H
 #define trackedParticle_H
 
-#include "Particle.H"
+#include "particle.H"
 #include "autoPtr.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -52,7 +52,7 @@ class trackedParticleCloud;
 
 class trackedParticle
 :
-    public Particle<trackedParticle>
+    public particle
 {
     // Private data
 
@@ -74,35 +74,26 @@ public:
     friend class Cloud<trackedParticle>;
 
     //- Class used to pass tracking data to the trackToFace function
-    class trackData
+    class trackingData
+    :
+        public particle::TrackingData<Cloud<trackedParticle> >
     {
-        //- Reference to the cloud containing this particle
-        Cloud<trackedParticle>& cloud_;
-
         labelList& maxLevel_;
 
     public:
 
-        bool switchProcessor;
-        bool keepParticle;
-
 
         // Constructors
 
-            trackData(Cloud<trackedParticle>& cloud, labelList& maxLevel)
+            trackingData(Cloud<trackedParticle>& cloud, labelList& maxLevel)
             :
-                cloud_(cloud),
+                particle::TrackingData<Cloud<trackedParticle> >(cloud),
                 maxLevel_(maxLevel)
             {}
 
 
         // Member functions
 
-            Cloud<trackedParticle>& cloud()
-            {
-                return cloud_;
-            }
-
             labelList& maxLevel()
             {
                 return maxLevel_;
@@ -116,7 +107,7 @@ public:
         //- Construct from components
         trackedParticle
         (
-            const Cloud<trackedParticle>& c,
+            const polyMesh& mesh,
             const vector& position,
             const label cellI,
             const label tetFaceI,
@@ -130,20 +121,39 @@ public:
         //- Construct from Istream
         trackedParticle
         (
-            const Cloud<trackedParticle>& c,
+            const polyMesh& mesh,
             Istream& is,
             bool readFields = true
         );
 
         //- Construct and return a clone
-        autoPtr<Particle<trackedParticle> > clone() const
+        autoPtr<particle> clone() const
         {
-            return autoPtr<Particle<trackedParticle> >
-            (
-                new trackedParticle(*this)
-            );
+            return autoPtr<particle>(new trackedParticle(*this));
         }
 
+        //- Factory class to read-construct particles used for
+        //  parallel transfer
+        class iNew
+        {
+            const polyMesh& mesh_;
+
+        public:
+
+            iNew(const polyMesh& mesh)
+            :
+                mesh_(mesh)
+            {}
+
+            autoPtr<trackedParticle> operator()(Istream& is) const
+            {
+                return autoPtr<trackedParticle>
+                (
+                    new trackedParticle(mesh_, is, true)
+                );
+            }
+        };
+
 
     // Member Functions
 
@@ -170,7 +180,7 @@ public:
         // Tracking
 
             //- Track all particles to their end point
-            bool move(trackData&, const scalar);
+            bool move(trackingData&, const scalar);
 
 
             //- Overridable function to handle the particle hitting a patch
@@ -178,30 +188,17 @@ public:
             bool hitPatch
             (
                 const polyPatch&,
-                trackedParticle::trackData& td,
+                trackingData& td,
                 const label patchI,
                 const scalar trackFraction,
                 const tetIndices& tetIs
             );
-            bool hitPatch
-            (
-                const polyPatch&,
-                int&,
-                const label patchI,
-                const scalar trackFraction,
-                const tetIndices& tetIs
-           );
 
             //- Overridable function to handle the particle hitting a wedge
             void hitWedgePatch
             (
                 const wedgePolyPatch&,
-                trackedParticle::trackData& td
-            );
-            void hitWedgePatch
-            (
-                const wedgePolyPatch&,
-                int&
+                trackingData& td
             );
 
             //- Overridable function to handle the particle hitting a
@@ -209,24 +206,14 @@ public:
             void hitSymmetryPatch
             (
                 const symmetryPolyPatch&,
-                trackedParticle::trackData& td
-            );
-            void hitSymmetryPatch
-            (
-                const symmetryPolyPatch&,
-                int&
+                trackingData& td
             );
 
             //- Overridable function to handle the particle hitting a cyclic
             void hitCyclicPatch
             (
                 const cyclicPolyPatch&,
-                trackedParticle::trackData& td
-            );
-            void hitCyclicPatch
-            (
-                const cyclicPolyPatch&,
-                int&
+                trackingData& td
             );
 
             //- Overridable function to handle the particle hitting a
@@ -234,25 +221,14 @@ public:
             void hitProcessorPatch
             (
                 const processorPolyPatch&,
-                trackedParticle::trackData& td
-            );
-            void hitProcessorPatch
-            (
-                const processorPolyPatch&,
-                int&
+                trackingData& td
             );
 
             //- Overridable function to handle the particle hitting a wallPatch
             void hitWallPatch
             (
                 const wallPolyPatch&,
-                trackedParticle::trackData& td,
-                const tetIndices&
-            );
-            void hitWallPatch
-            (
-                const wallPolyPatch&,
-                int&,
+                trackingData& td,
                 const tetIndices&
             );
 
@@ -260,20 +236,13 @@ public:
             void hitPatch
             (
                 const polyPatch&,
-                trackedParticle::trackData& td
-            );
-            void hitPatch
-            (
-                const polyPatch&,
-                int&
+                trackingData& td
             );
 
 
     // Ostream Operator
 
         friend Ostream& operator<<(Ostream&, const trackedParticle&);
-
-
 };
 
 
diff --git a/src/mesh/autoMesh/autoHexMesh/trackedParticle/trackedParticleCloud.C b/src/mesh/autoMesh/autoHexMesh/trackedParticle/trackedParticleCloud.C
index 36f91db57decefac8d43a45866ac6677a6dacfc1..87f8f3b7a6ec300cd4368ee125ebd9d047eb9583 100644
--- a/src/mesh/autoMesh/autoHexMesh/trackedParticle/trackedParticleCloud.C
+++ b/src/mesh/autoMesh/autoHexMesh/trackedParticle/trackedParticleCloud.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
@@ -33,7 +33,7 @@ namespace Foam
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
-defineParticleTypeNameAndDebug(trackedParticle, 0);
+//defineParticleTypeNameAndDebug(trackedParticle, 0);
 defineTemplateTypeNameAndDebug(Cloud<trackedParticle>, 0);
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/parallel/reconstruct/reconstruct/reconstructLagrangianPositions.C b/src/parallel/reconstruct/reconstruct/reconstructLagrangianPositions.C
index 1e07fee6041008568eb036c099407c307d4a4cde..2de2f3b0c83e3bb3ba1ff2c156349d951581c6b3 100644
--- a/src/parallel/reconstruct/reconstruct/reconstructLagrangianPositions.C
+++ b/src/parallel/reconstruct/reconstruct/reconstructLagrangianPositions.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
@@ -25,8 +25,7 @@ License
 
 #include "reconstructLagrangian.H"
 #include "labelIOList.H"
-#include "Cloud.H"
-#include "passiveParticle.H"
+#include "passiveParticleCloud.H"
 
 // * * * * * * * * * * * * * * * Global Functions  * * * * * * * * * * * * * //
 
@@ -39,7 +38,7 @@ void Foam::reconstructLagrangianPositions
     const PtrList<labelIOList>& cellProcAddressing
 )
 {
-    Cloud<passiveParticle> lagrangianPositions
+    passiveParticleCloud lagrangianPositions
     (
         mesh,
         cloudName,
@@ -67,7 +66,7 @@ void Foam::reconstructLagrangianPositions
             (
                 new passiveParticle
                 (
-                    lagrangianPositions,
+                    mesh,
                     ppi.position(),
                     cellMap[ppi.cell()],
                     false
@@ -76,7 +75,7 @@ void Foam::reconstructLagrangianPositions
         }
     }
 
-    IOPosition<passiveParticle>(lagrangianPositions).write();
+    IOPosition<Cloud<passiveParticle> >(lagrangianPositions).write();
 }
 
 
diff --git a/src/postProcessing/functionObjects/field/streamLine/streamLine.C b/src/postProcessing/functionObjects/field/streamLine/streamLine.C
index 45c25fb61cb9517c65b5e1d5fb25dee176e0d6fa..52dd5288af6626de79a4bd427688497a4514517c 100644
--- a/src/postProcessing/functionObjects/field/streamLine/streamLine.C
+++ b/src/postProcessing/functionObjects/field/streamLine/streamLine.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
@@ -61,7 +61,7 @@ void Foam::streamLine::track()
         (
             new streamLineParticle
             (
-                particles,
+                mesh,
                 seedPoints[i],
                 seedPoints.cells()[i],
                 lifeTime_               // lifetime
@@ -215,7 +215,7 @@ void Foam::streamLine::track()
     }
 
     // additional particle info
-    streamLineParticle::trackData td
+    streamLineParticle::trackingData td
     (
         particles,
         vsInterp,
diff --git a/src/postProcessing/functionObjects/field/streamLine/streamLineParticle.C b/src/postProcessing/functionObjects/field/streamLine/streamLineParticle.C
index 8b2127e9950ac4f61ae80d99afd785f87f45f5d0..f441b12bb7b2a6fc0fcc57505dd9e30172963cfe 100644
--- a/src/postProcessing/functionObjects/field/streamLine/streamLineParticle.C
+++ b/src/postProcessing/functionObjects/field/streamLine/streamLineParticle.C
@@ -30,16 +30,15 @@ License
 
 namespace Foam
 {
-    defineParticleTypeNameAndDebug(streamLineParticle, 0);
+//    defineParticleTypeNameAndDebug(streamLineParticle, 0);
 }
 
 
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
-// Estimate dt to cross cell in a few steps
 Foam::scalar Foam::streamLineParticle::calcSubCycleDeltaT
 (
-    streamLineParticle::trackData& td,
+    trackingData& td,
     const scalar dt,
     const vector& U
 ) const
@@ -58,7 +57,7 @@ Foam::scalar Foam::streamLineParticle::calcSubCycleDeltaT
 
 Foam::vector Foam::streamLineParticle::interpolateFields
 (
-    const streamLineParticle::trackData& td,
+    const trackingData& td,
     const point& position,
     const label cellI
 )
@@ -103,29 +102,27 @@ Foam::vector Foam::streamLineParticle::interpolateFields
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
-//- Construct from components
 Foam::streamLineParticle::streamLineParticle
 (
-    const Cloud<streamLineParticle>& c,
+    const polyMesh& mesh,
     const vector& position,
     const label cellI,
     const label lifeTime
 )
 :
-    Particle<streamLineParticle>(c, position, cellI),
+    particle(mesh, position, cellI),
     lifeTime_(lifeTime)
 {}
 
 
-//- Construct from Istream
 Foam::streamLineParticle::streamLineParticle
 (
-    const Cloud<streamLineParticle>& c,
+    const polyMesh& mesh,
     Istream& is,
     bool readFields
 )
 :
-    Particle<streamLineParticle>(c, is, readFields)
+    particle(mesh, is, readFields)
 {
     if (readFields)
     {
@@ -157,16 +154,15 @@ Foam::streamLineParticle::streamLineParticle
 }
 
 
-// Construct copy
 Foam::streamLineParticle::streamLineParticle
 (
-    const streamLineParticle& c
+    const streamLineParticle& p
 )
 :
-    Particle<streamLineParticle>(c),
-    lifeTime_(c.lifeTime_),
-    sampledPositions_(c.sampledPositions_),
-    sampledScalars_(c.sampledScalars_)
+    particle(p),
+    lifeTime_(p.lifeTime_),
+    sampledPositions_(p.sampledPositions_),
+    sampledScalars_(p.sampledScalars_)
 {}
 
 
@@ -174,15 +170,17 @@ Foam::streamLineParticle::streamLineParticle
 
 bool Foam::streamLineParticle::move
 (
-    streamLineParticle::trackData& td,
+    trackingData& td,
     const scalar trackTime
 )
 {
+    streamLineParticle& p = static_cast<streamLineParticle&>(*this);
+
     td.switchProcessor = false;
     td.keepParticle = true;
 
     scalar tEnd = (1.0 - stepFraction())*trackTime;
-    scalar maxDt = cloud_.pMesh().bounds().mag();
+    scalar maxDt = mesh_.bounds().mag();
 
     while
     (
@@ -266,8 +264,7 @@ bool Foam::streamLineParticle::move
             if (debug)
             {
                 Pout<< "streamLineParticle : Removing stagnant particle:"
-                    << static_cast<Particle<streamLineParticle> >(*this)
-                    << " sampled positions:" << sampledPositions_.size()
+                    << p << " sampled positions:" << sampledPositions_.size()
                     << endl;
             }
             td.keepParticle = false;
@@ -281,13 +278,12 @@ bool Foam::streamLineParticle::move
             if (debug)
             {
                 Pout<< "streamLineParticle : Removing particle:"
-                    << static_cast<Particle<streamLineParticle> >(*this)
-                    << " sampled positions:" << sampledPositions_.size()
+                    << p << " sampled positions:" << sampledPositions_.size()
                     << endl;
             }
         }
 
-        // Transfer particle data into trackData.
+        // Transfer particle data into trackingData.
         //td.allPositions_.append(sampledPositions_);
         td.allPositions_.append(vectorList());
         vectorList& top = td.allPositions_.last();
@@ -316,7 +312,7 @@ bool Foam::streamLineParticle::move
 bool Foam::streamLineParticle::hitPatch
 (
     const polyPatch&,
-    streamLineParticle::trackData& td,
+    trackingData& td,
     const label patchI,
     const scalar trackFraction,
     const tetIndices& tetIs
@@ -327,24 +323,10 @@ bool Foam::streamLineParticle::hitPatch
 }
 
 
-bool Foam::streamLineParticle::hitPatch
-(
-    const polyPatch&,
-    int&,
-    const label,
-    const scalar,
-    const tetIndices&
-)
-{
-    // Disable generic patch interaction
-    return false;
-}
-
-
 void Foam::streamLineParticle::hitWedgePatch
 (
     const wedgePolyPatch& pp,
-    streamLineParticle::trackData& td
+    trackingData& td
 )
 {
     // Remove particle
@@ -352,18 +334,10 @@ void Foam::streamLineParticle::hitWedgePatch
 }
 
 
-void Foam::streamLineParticle::hitWedgePatch
-(
-    const wedgePolyPatch&,
-    int&
-)
-{}
-
-
 void Foam::streamLineParticle::hitSymmetryPatch
 (
     const symmetryPolyPatch& pp,
-    streamLineParticle::trackData& td
+    trackingData& td
 )
 {
     // Remove particle
@@ -371,18 +345,10 @@ void Foam::streamLineParticle::hitSymmetryPatch
 }
 
 
-void Foam::streamLineParticle::hitSymmetryPatch
-(
-    const symmetryPolyPatch&,
-    int&
-)
-{}
-
-
 void Foam::streamLineParticle::hitCyclicPatch
 (
     const cyclicPolyPatch& pp,
-    streamLineParticle::trackData& td
+    trackingData& td
 )
 {
     // Remove particle
@@ -390,18 +356,10 @@ void Foam::streamLineParticle::hitCyclicPatch
 }
 
 
-void Foam::streamLineParticle::hitCyclicPatch
-(
-    const cyclicPolyPatch&,
-    int&
-)
-{}
-
-
 void Foam::streamLineParticle::hitProcessorPatch
 (
     const processorPolyPatch&,
-    streamLineParticle::trackData& td
+    trackingData& td
 )
 {
     // Switch particle
@@ -409,18 +367,10 @@ void Foam::streamLineParticle::hitProcessorPatch
 }
 
 
-void Foam::streamLineParticle::hitProcessorPatch
-(
-    const processorPolyPatch&,
-    int&
-)
-{}
-
-
 void Foam::streamLineParticle::hitWallPatch
 (
     const wallPolyPatch& wpp,
-    streamLineParticle::trackData& td,
+    trackingData& td,
     const tetIndices&
 )
 {
@@ -429,19 +379,10 @@ void Foam::streamLineParticle::hitWallPatch
 }
 
 
-void Foam::streamLineParticle::hitWallPatch
-(
-    const wallPolyPatch& wpp,
-    int&,
-    const tetIndices&
-)
-{}
-
-
 void Foam::streamLineParticle::hitPatch
 (
     const polyPatch& wpp,
-    streamLineParticle::trackData& td
+    trackingData& td
 )
 {
     // Remove particle
@@ -449,14 +390,6 @@ void Foam::streamLineParticle::hitPatch
 }
 
 
-void Foam::streamLineParticle::hitPatch
-(
-    const polyPatch& wpp,
-    int&
-)
-{}
-
-
 void Foam::streamLineParticle::readFields(Cloud<streamLineParticle>& c)
 {
     if (!c.size())
@@ -464,6 +397,8 @@ void Foam::streamLineParticle::readFields(Cloud<streamLineParticle>& c)
         return;
     }
 
+    particle::readFields(c);
+
     IOField<label> lifeTime
     (
         c.fieldIOobject("lifeTime", IOobject::MUST_READ)
@@ -495,7 +430,7 @@ void Foam::streamLineParticle::readFields(Cloud<streamLineParticle>& c)
 
 void Foam::streamLineParticle::writeFields(const Cloud<streamLineParticle>& c)
 {
-    Particle<streamLineParticle>::writeFields(c);
+    particle::writeFields(c);
 
     label np =  c.size();
 
@@ -534,7 +469,7 @@ void Foam::streamLineParticle::writeFields(const Cloud<streamLineParticle>& c)
 
 Foam::Ostream& Foam::operator<<(Ostream& os, const streamLineParticle& p)
 {
-    os  << static_cast<const Particle<streamLineParticle>&>(p)
+    os  << static_cast<const particle&>(p)
         << token::SPACE << p.lifeTime_
         << token::SPACE << p.sampledPositions_
         << token::SPACE << p.sampledScalars_
diff --git a/src/postProcessing/functionObjects/field/streamLine/streamLineParticle.H b/src/postProcessing/functionObjects/field/streamLine/streamLineParticle.H
index 085b49739322263d037c8f7955884e5cd963abf7..6a4d944d1e6b970e0caa5ccb1c43693ff3665e16 100644
--- a/src/postProcessing/functionObjects/field/streamLine/streamLineParticle.H
+++ b/src/postProcessing/functionObjects/field/streamLine/streamLineParticle.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
@@ -36,7 +36,7 @@ SourceFiles
 #ifndef streamLineParticle_H
 #define streamLineParticle_H
 
-#include "Particle.H"
+#include "particle.H"
 #include "autoPtr.H"
 #include "interpolationCellPoint.H"
 #include "vectorList.H"
@@ -49,20 +49,20 @@ namespace Foam
 class streamLineParticleCloud;
 
 /*---------------------------------------------------------------------------*\
-                           Class streamLineParticle Declaration
+                     Class streamLineParticle Declaration
 \*---------------------------------------------------------------------------*/
 
 class streamLineParticle
 :
-    public Particle<streamLineParticle>
+    public particle
 {
 
 public:
 
     //- Class used to pass tracking data to the trackToFace function
-    class trackData
+    class trackingData
     :
-        public Particle<streamLineParticle>::trackData
+        public particle::TrackingData<Cloud<streamLineParticle> >
     {
 
     public:
@@ -81,7 +81,7 @@ public:
 
         // Constructors
 
-            trackData
+            trackingData
             (
                 Cloud<streamLineParticle>& cloud,
                 const PtrList<interpolationCellPoint<scalar> >& vsInterp,
@@ -94,7 +94,7 @@ public:
                 List<DynamicList<vectorList> >& allVectors
             )
             :
-                Particle<streamLineParticle>::trackData(cloud),
+                particle::TrackingData<Cloud<streamLineParticle> >(cloud),
                 vsInterp_(vsInterp),
                 vvInterp_(vvInterp),
                 UIndex_(UIndex),
@@ -130,7 +130,7 @@ private:
         //  steps.
         scalar calcSubCycleDeltaT
         (
-            streamLineParticle::trackData& td,
+            trackingData& td,
             const scalar dt,
             const vector& U
         ) const;
@@ -138,7 +138,7 @@ private:
         //- Interpolate all quantities; return interpolated velocity.
         vector interpolateFields
         (
-            const streamLineParticle::trackData&,
+            const trackingData&,
             const point&,
             const label cellI
         );
@@ -151,7 +151,7 @@ public:
         //- Construct from components
         streamLineParticle
         (
-            const Cloud<streamLineParticle>& c,
+            const polyMesh& c,
             const vector& position,
             const label cellI,
             const label lifeTime
@@ -160,32 +160,49 @@ public:
         //- Construct from Istream
         streamLineParticle
         (
-            const Cloud<streamLineParticle>& c,
+            const polyMesh& c,
             Istream& is,
             bool readFields = true
         );
 
         //- Construct copy
-        streamLineParticle(const streamLineParticle& c);
+        streamLineParticle(const streamLineParticle& p);
 
         //- Construct and return a clone
-        autoPtr<Particle<streamLineParticle> > clone() const
+        autoPtr<particle> clone() const
         {
-            return autoPtr<Particle<streamLineParticle> >
-            (
-                new streamLineParticle(*this)
-            );
+            return autoPtr<particle>(new streamLineParticle(*this));
         }
 
+        //- Factory class to read-construct particles used for
+        //  parallel transfer
+        class iNew
+        {
+            const polyMesh& mesh_;
 
-    // Member Functions
+        public:
 
+            iNew(const polyMesh& mesh)
+            :
+                mesh_(mesh)
+            {}
 
+            autoPtr<streamLineParticle> operator()(Istream& is) const
+            {
+                return autoPtr<streamLineParticle>
+                (
+                    new streamLineParticle(mesh_, is, true)
+                );
+            }
+        };
+
+
+    // Member Functions
 
         // Tracking
 
             //- Track all particles to their end point
-            bool move(trackData&, const scalar trackTime);
+            bool move(trackingData&, const scalar trackTime);
 
 
             //- Overridable function to handle the particle hitting a patch
@@ -193,31 +210,17 @@ public:
             bool hitPatch
             (
                 const polyPatch&,
-                streamLineParticle::trackData& td,
+                trackingData& td,
                 const label patchI,
                 const scalar trackFraction,
                 const tetIndices& tetIs
             );
 
-            bool hitPatch
-            (
-                const polyPatch&,
-                int&,
-                const label,
-                const scalar,
-                const tetIndices&
-           );
-
             //- Overridable function to handle the particle hitting a wedge
             void hitWedgePatch
             (
                 const wedgePolyPatch&,
-                streamLineParticle::trackData& td
-            );
-            void hitWedgePatch
-            (
-                const wedgePolyPatch&,
-                int&
+                trackingData& td
             );
 
             //- Overridable function to handle the particle hitting a
@@ -225,24 +228,14 @@ public:
             void hitSymmetryPatch
             (
                 const symmetryPolyPatch&,
-                streamLineParticle::trackData& td
-            );
-            void hitSymmetryPatch
-            (
-                const symmetryPolyPatch&,
-                int&
+                trackingData& td
             );
 
             //- Overridable function to handle the particle hitting a cyclic
             void hitCyclicPatch
             (
                 const cyclicPolyPatch&,
-                streamLineParticle::trackData& td
-            );
-            void hitCyclicPatch
-            (
-                const cyclicPolyPatch&,
-                int&
+                trackingData& td
             );
 
             //- Overridable function to handle the particle hitting a
@@ -250,25 +243,14 @@ public:
             void hitProcessorPatch
             (
                 const processorPolyPatch&,
-                streamLineParticle::trackData& td
-            );
-            void hitProcessorPatch
-            (
-                const processorPolyPatch&,
-                int&
+                trackingData& td
             );
 
             //- Overridable function to handle the particle hitting a wallPatch
             void hitWallPatch
             (
                 const wallPolyPatch&,
-                streamLineParticle::trackData& td,
-                const tetIndices&
-            );
-            void hitWallPatch
-            (
-                const wallPolyPatch&,
-                int&,
+                trackingData& td,
                 const tetIndices&
             );
 
@@ -276,12 +258,7 @@ public:
             void hitPatch
             (
                 const polyPatch&,
-                streamLineParticle::trackData& td
-            );
-            void hitPatch
-            (
-                const polyPatch&,
-                int&
+                trackingData& td
             );
 
 
@@ -297,8 +274,6 @@ public:
     // Ostream Operator
 
         friend Ostream& operator<<(Ostream&, const streamLineParticle&);
-
-
 };
 
 
diff --git a/src/sampling/sampledSet/face/faceOnlySet.C b/src/sampling/sampledSet/face/faceOnlySet.C
index a9b574589fa82a72106ef361418d7b3645c21797..20ee0b56eb73c56c67aefc5c7f53c462571e425d 100644
--- a/src/sampling/sampledSet/face/faceOnlySet.C
+++ b/src/sampling/sampledSet/face/faceOnlySet.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
@@ -28,10 +28,6 @@ License
 #include "DynamicList.H"
 #include "polyMesh.H"
 
-#include "Cloud.H"
-#include "passiveParticle.H"
-#include "IDLList.H"
-
 #include "addToRunTimeSelectionTable.H"
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@@ -45,11 +41,9 @@ namespace Foam
 
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
-
-// Sample singly connected segment. Returns false if end_ reached.
 bool Foam::faceOnlySet::trackToBoundary
 (
-    Particle<passiveParticle>& singleParticle,
+    passiveParticleCloud& particles,
     DynamicList<point>& samplingPts,
     DynamicList<label>& samplingCells,
     DynamicList<label>& samplingFaces,
@@ -61,6 +55,10 @@ bool Foam::faceOnlySet::trackToBoundary
     const vector smallVec = tol*offset;
     const scalar smallDist = mag(smallVec);
 
+    passiveParticle& singleParticle = *particles.first();
+
+    particle::TrackingData<passiveParticleCloud> trackData(particles);
+
     // Alias
     const point& trackPt = singleParticle.position();
 
@@ -68,7 +66,7 @@ bool Foam::faceOnlySet::trackToBoundary
     {
         point oldPoint = trackPt;
 
-        singleParticle.trackToFace(end_);
+        singleParticle.trackToFace(end_, trackData);
 
         if (singleParticle.face() != -1 && mag(oldPoint - trackPt) > smallDist)
         {
@@ -212,18 +210,20 @@ void Foam::faceOnlySet::calcSamples
         }
 
         // Initialize tracking starting from trackPt
-        Cloud<passiveParticle> particles(mesh(), IDLList<passiveParticle>());
+        passiveParticleCloud particles(mesh());
 
         passiveParticle singleParticle
         (
-            particles,
+            mesh(),
             trackPt,
             trackCellI
         );
 
+        particles.addParticle(&singleParticle);
+
         bool reachedBoundary = trackToBoundary
         (
-            singleParticle,
+            particles,
             samplingPts,
             samplingCells,
             samplingFaces,
diff --git a/src/sampling/sampledSet/face/faceOnlySet.H b/src/sampling/sampledSet/face/faceOnlySet.H
index e2d5ad65bee385b73c73feb36075a3b2416475bc..1bb86ba9c2cf42e93ba237b4bc1567ac47c8ea2c 100644
--- a/src/sampling/sampledSet/face/faceOnlySet.H
+++ b/src/sampling/sampledSet/face/faceOnlySet.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
@@ -36,16 +36,13 @@ SourceFiles
 
 #include "sampledSet.H"
 #include "DynamicList.H"
+#include "passiveParticleCloud.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 namespace Foam
 {
 
-// Forward declaration of classes
-class passiveParticle;
-template<class Type> class Particle;
-
 /*---------------------------------------------------------------------------*\
                          Class faceOnlySet Declaration
 \*---------------------------------------------------------------------------*/
@@ -71,7 +68,7 @@ class faceOnlySet
         //  reached
         bool trackToBoundary
         (
-            Particle<passiveParticle>& singleParticle,
+            passiveParticleCloud& particles,
             DynamicList<point>& samplingPts,
             DynamicList<label>& samplingCells,
             DynamicList<label>& samplingFaces,
diff --git a/src/sampling/sampledSet/midPoint/midPointSet.C b/src/sampling/sampledSet/midPoint/midPointSet.C
index b7dab5e7456eb4e0f857e704442e0fcd56929c7b..bc108b9108eb75a80b9d1087e9d8977cee73fe34 100644
--- a/src/sampling/sampledSet/midPoint/midPointSet.C
+++ b/src/sampling/sampledSet/midPoint/midPointSet.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
@@ -38,8 +38,6 @@ namespace Foam
 
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
-// Rework faceOnlySet samples.
-// Take two consecutive samples
 void Foam::midPointSet::genSamples()
 {
     // Generate midpoints.
@@ -112,6 +110,7 @@ void Foam::midPointSet::genSamples()
     );
 }
 
+
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
 Foam::midPointSet::midPointSet
diff --git a/src/sampling/sampledSet/midPoint/midPointSet.H b/src/sampling/sampledSet/midPoint/midPointSet.H
index 14922ff394719959184edaf0670aa439e4d7049e..cf16de5932fafb1d6c810fdc17444b750e11c490 100644
--- a/src/sampling/sampledSet/midPoint/midPointSet.H
+++ b/src/sampling/sampledSet/midPoint/midPointSet.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
@@ -42,8 +42,6 @@ namespace Foam
 {
 
 // Forward declaration of classes
-class passiveParticle;
-template<class Type> class particle;
 class meshSearch;
 
 /*---------------------------------------------------------------------------*\
diff --git a/src/sampling/sampledSet/midPointAndFace/midPointAndFaceSet.H b/src/sampling/sampledSet/midPointAndFace/midPointAndFaceSet.H
index a0c021c5c5cb4696c8c72995b61a896e950990b9..e0b405707072d7522db13a415e3a59a322f9cc39 100644
--- a/src/sampling/sampledSet/midPointAndFace/midPointAndFaceSet.H
+++ b/src/sampling/sampledSet/midPointAndFace/midPointAndFaceSet.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
@@ -42,8 +42,6 @@ namespace Foam
 {
 
 // Forward declaration of classes
-class passiveParticle;
-template<class Type> class particle;
 class meshSearch;
 
 /*---------------------------------------------------------------------------*\
diff --git a/src/sampling/sampledSet/polyLine/polyLineSet.C b/src/sampling/sampledSet/polyLine/polyLineSet.C
index 6f347e1d82fdf584672deac831c5b94ce2944a55..d36b2c1fed1a32bf459851bd239a14423d1c99d9 100644
--- a/src/sampling/sampledSet/polyLine/polyLineSet.C
+++ b/src/sampling/sampledSet/polyLine/polyLineSet.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
@@ -28,10 +28,6 @@ License
 #include "DynamicList.H"
 #include "polyMesh.H"
 
-#include "Cloud.H"
-#include "passiveParticle.H"
-#include "IDLList.H"
-
 #include "addToRunTimeSelectionTable.H"
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@@ -48,7 +44,7 @@ namespace Foam
 // Sample till hits boundary.
 bool Foam::polyLineSet::trackToBoundary
 (
-    Particle<passiveParticle>& singleParticle,
+    passiveParticleCloud& particles,
     label& sampleI,
     DynamicList<point>& samplingPts,
     DynamicList<label>& samplingCells,
@@ -56,6 +52,10 @@ bool Foam::polyLineSet::trackToBoundary
     DynamicList<scalar>& samplingCurveDist
 ) const
 {
+    passiveParticle& singleParticle = *particles.first();
+
+    particle::TrackingData<passiveParticleCloud> trackData(particles);
+
     // Alias
     const point& trackPt = singleParticle.position();
 
@@ -70,7 +70,7 @@ bool Foam::polyLineSet::trackToBoundary
         do
         {
             singleParticle.stepFraction() = 0;
-            singleParticle.track(sampleCoords_[sampleI+1]);
+            singleParticle.track(sampleCoords_[sampleI+1], trackData);
         }
         while
         (
@@ -260,18 +260,18 @@ void Foam::polyLineSet::calcSamples
         //
 
         // Initialize tracking starting from sampleI
-        Cloud<passiveParticle> particles(mesh(), IDLList<passiveParticle>());
+        passiveParticleCloud particles(mesh());
 
         passiveParticle singleParticle
         (
-            particles,
+            mesh(),
             trackPt,
             trackCellI
         );
 
         bool bReached = trackToBoundary
         (
-            singleParticle,
+            particles,
             sampleI,
             samplingPts,
             samplingCells,
diff --git a/src/sampling/sampledSet/polyLine/polyLineSet.H b/src/sampling/sampledSet/polyLine/polyLineSet.H
index 931904d70363458c3f25b5887a5ea8838c842ad8..fda8cbdb3629c9b06e0f75efa5e34e9ec3152b1c 100644
--- a/src/sampling/sampledSet/polyLine/polyLineSet.H
+++ b/src/sampling/sampledSet/polyLine/polyLineSet.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
@@ -37,16 +37,13 @@ SourceFiles
 
 #include "sampledSet.H"
 #include "DynamicList.H"
+#include "passiveParticleCloud.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 namespace Foam
 {
 
-// Forward declaration of classes
-class passiveParticle;
-template<class Type> class Particle;
-
 /*---------------------------------------------------------------------------*\
                         Class polyLineSet Declaration
 \*---------------------------------------------------------------------------*/
@@ -68,7 +65,7 @@ class polyLineSet
         //  Returns false if end of samples reached.
         bool trackToBoundary
         (
-            Particle<passiveParticle>& singleParticle,
+            passiveParticleCloud& particles,
             label& sampleI,
             DynamicList<point>& samplingPts,
             DynamicList<label>& samplingCells,
diff --git a/src/sampling/sampledSet/uniform/uniformSet.C b/src/sampling/sampledSet/uniform/uniformSet.C
index 2964172e9fdfaebf5794562f103d34f078c8e602..8b99652c419f4a79538918ab25a29bcf1d94b3b8 100644
--- a/src/sampling/sampledSet/uniform/uniformSet.C
+++ b/src/sampling/sampledSet/uniform/uniformSet.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
@@ -28,10 +28,6 @@ License
 #include "DynamicList.H"
 #include "polyMesh.H"
 
-#include "Cloud.H"
-#include "passiveParticle.H"
-#include "IDLList.H"
-
 #include "addToRunTimeSelectionTable.H"
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@@ -45,9 +41,6 @@ namespace Foam
 
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
-// Finds along line (samplePt + t * offset) next sample beyond or equal to
-// currentPt.
-// Updates samplePt, sampleI
 bool Foam::uniformSet::nextSample
 (
     const point& currentPt,
@@ -82,10 +75,9 @@ bool Foam::uniformSet::nextSample
 }
 
 
-// Sample singly connected segment. Returns false if end_ reached.
 bool Foam::uniformSet::trackToBoundary
 (
-    Particle<passiveParticle>& singleParticle,
+    passiveParticleCloud& particles,
     point& samplePt,
     label& sampleI,
     DynamicList<point>& samplingPts,
@@ -99,9 +91,13 @@ bool Foam::uniformSet::trackToBoundary
     const vector smallVec = tol*offset;
     const scalar smallDist = mag(smallVec);
 
+    passiveParticle& singleParticle = *particles.first();
+
     // Alias
     const point& trackPt = singleParticle.position();
 
+    particle::TrackingData<passiveParticleCloud> trackData(particles);
+
     while(true)
     {
         // Find next samplePt on/after trackPt. Update samplePt, sampleI
@@ -161,7 +157,7 @@ bool Foam::uniformSet::trackToBoundary
         do
         {
             singleParticle.stepFraction() = 0;
-            singleParticle.track(samplePt);
+            singleParticle.track(samplePt, trackData);
 
             if (debug)
             {
@@ -309,19 +305,16 @@ void Foam::uniformSet::calcSamples
 
     while(true)
     {
+        passiveParticleCloud particles(mesh());
+
         // Initialize tracking starting from trackPt
-        Cloud<passiveParticle> particles(mesh(), IDLList<passiveParticle>());
+        passiveParticle singleParticle(mesh(), trackPt, trackCellI);
 
-        passiveParticle singleParticle
-        (
-            particles,
-            trackPt,
-            trackCellI
-        );
+        particles.addParticle(&singleParticle);
 
         bool reachedBoundary = trackToBoundary
         (
-            singleParticle,
+            particles,
             samplePt,
             sampleI,
             samplingPts,
diff --git a/src/sampling/sampledSet/uniform/uniformSet.H b/src/sampling/sampledSet/uniform/uniformSet.H
index 65d919b24f4f6a2e8119dc011da0f6f37e1b3121..b03f2b3e149539055a784ff3d95bb8e3205d2185 100644
--- a/src/sampling/sampledSet/uniform/uniformSet.H
+++ b/src/sampling/sampledSet/uniform/uniformSet.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
@@ -34,6 +34,7 @@ SourceFiles
 #ifndef uniformSet_H
 #define uniformSet_H
 
+#include "passiveParticleCloud.H"
 #include "sampledSet.H"
 #include "DynamicList.H"
 
@@ -42,10 +43,6 @@ SourceFiles
 namespace Foam
 {
 
-// Forward declaration of classes
-class passiveParticle;
-template<class Type> class Particle;
-
 /*---------------------------------------------------------------------------*\
                            Class uniformSet Declaration
 \*---------------------------------------------------------------------------*/
@@ -85,7 +82,7 @@ class uniformSet
         //  reached
         bool trackToBoundary
         (
-            Particle<passiveParticle>& singleParticle,
+            passiveParticleCloud& particles,
             point& samplePt,
             label& sampleI,
             DynamicList<point>& samplingPts,
diff --git a/src/sampling/sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMesh.C b/src/sampling/sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMesh.C
index d14b0872ae290392e2a82b06a1743e5573377e65..66f7e31809eb51c18785e3d2452b1055813759e2 100644
--- a/src/sampling/sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMesh.C
+++ b/src/sampling/sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMesh.C
@@ -29,6 +29,7 @@ License
 #include "globalIndex.H"
 #include "treeDataCell.H"
 #include "treeDataFace.H"
+#include "meshTools.H"
 
 #include "addToRunTimeSelectionTable.H"