diff --git a/src/lagrangian/intermediate/parcels/include/makeParcelPostProcessingModels.H b/src/lagrangian/intermediate/parcels/include/makeParcelPostProcessingModels.H
index ab3055882ff2d8c2c000df77edbce8df100d64b5..76b81aea20b5b0a7cf37ca610519cb24cc4c9246 100644
--- a/src/lagrangian/intermediate/parcels/include/makeParcelPostProcessingModels.H
+++ b/src/lagrangian/intermediate/parcels/include/makeParcelPostProcessingModels.H
@@ -31,6 +31,7 @@ License
 #include "KinematicCloud.H"
 
 #include "NoPostProcessing.H"
+#include "ParticleTracks.H"
 #include "PatchPostProcessing.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -46,6 +47,12 @@ License
         ParcelType                                                            \
     );                                                                        \
     makePostProcessingModelType                                               \
+    (                                                                         \
+        ParticleTracks,                                                       \
+        KinematicCloud,                                                       \
+        ParcelType                                                            \
+    );                                                                        \
+    makePostProcessingModelType                                               \
     (                                                                         \
         PatchPostProcessing,                                                  \
         KinematicCloud,                                                       \
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/ParticleTracks/ParticleTracks.C b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/ParticleTracks/ParticleTracks.C
new file mode 100644
index 0000000000000000000000000000000000000000..c68801ad6e5f090453a4f52c60e8cb29dbb962fb
--- /dev/null
+++ b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/ParticleTracks/ParticleTracks.C
@@ -0,0 +1,139 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 3 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, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "ParticleTracks.H"
+#include "Pstream.H"
+#include "ListListOps.H"
+#include "IOPtrList.H"
+
+// * * * * * * * * * * * * * protected Member Functions  * * * * * * * * * * //
+
+template<class CloudType>
+void Foam::ParticleTracks<CloudType>::write()
+{
+    if (this->owner().solution().writeThisStep())
+    {
+        cloudPtr_->write();
+
+        if (resetOnWrite_)
+        {
+            cloudPtr_->clear();
+        }
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+template<class CloudType>
+Foam::ParticleTracks<CloudType>::ParticleTracks
+(
+    const dictionary& dict,
+    CloudType& owner
+)
+:
+    PostProcessingModel<CloudType>(dict, owner, typeName),
+    trackInterval_(readLabel(this->coeffDict().lookup("trackInterval"))),
+    maxSamples_(readLabel(this->coeffDict().lookup("maxSamples"))),
+    resetOnWrite_(this->coeffDict().lookup("resetOnWrite")),
+    faceHitCounter_(),
+    cloudPtr_(NULL)
+{}
+
+
+template<class CloudType>
+Foam::ParticleTracks<CloudType>::ParticleTracks
+(
+    const ParticleTracks<CloudType>& ppm
+)
+:
+    PostProcessingModel<CloudType>(ppm),
+    trackInterval_(ppm.trackInterval_),
+    maxSamples_(ppm.maxSamples_),
+    resetOnWrite_(ppm.resetOnWrite_),
+    faceHitCounter_(ppm.faceHitCounter_),
+    cloudPtr_(ppm.cloudPtr_)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+template<class CloudType>
+Foam::ParticleTracks<CloudType>::~ParticleTracks()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class CloudType>
+void Foam::ParticleTracks<CloudType>::postPatch(const parcelType&, const label)
+{}
+
+
+template<class CloudType>
+void Foam::ParticleTracks<CloudType>::postFace(const parcelType& p)
+{
+    if
+    (
+        this->owner().solution().writeThisStep()
+     || this->owner().solution().transient()
+    )
+    {
+        if (!cloudPtr_.valid())
+        {
+            cloudPtr_.reset
+            (
+                this->owner().cloneBare(this->owner().name() + "Tracks").ptr()
+            );
+        }
+
+        hitTableType::iterator iter =
+            faceHitCounter_.find(labelPair(p.origProc(), p.origId()));
+
+        label localI = -1;
+        if (iter != faceHitCounter_.end())
+        {
+            iter()++;
+            localI = iter();
+        }
+        else
+        {
+            localI = 1;
+            faceHitCounter_.insert(labelPair(p.origProc(), p.origId()), localI);
+        }
+
+        label nSamples = floor(localI/trackInterval_);
+        if ((localI % trackInterval_ == 0) && (nSamples < maxSamples_))
+        {
+            cloudPtr_->append
+            (
+                static_cast<parcelType*>(p.clone(cloudPtr_()).ptr())
+            );
+        }
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/ParticleTracks/ParticleTracks.H b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/ParticleTracks/ParticleTracks.H
new file mode 100644
index 0000000000000000000000000000000000000000..6bdb3d7478ea8d82d31763409e5032fdabb14975
--- /dev/null
+++ b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/ParticleTracks/ParticleTracks.H
@@ -0,0 +1,165 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 3 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, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::ParticleTracks
+
+Description
+    Records particle state (all variables) on each call to postFace
+
+SourceFiles
+    ParticleTracks.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef ParticleTracks_H
+#define ParticleTracks_H
+
+#include "PostProcessingModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                       Class ParticleTracks Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class CloudType>
+class ParticleTracks
+:
+    public PostProcessingModel<CloudType>
+{
+    // Private data
+
+        // Typedefs
+
+            //- Convenience typedef for parcel type
+            typedef typename CloudType::parcelType parcelType;
+
+            //- Convenience typedef for hash hit-table
+            typedef HashTable<label, labelPair, typename labelPair::Hash<> >
+                hitTableType;
+
+        //- Number of face-hit intervals between storing parcel data
+        label trackInterval_;
+
+        //- Maximum number of particles to store per track
+        label maxSamples_;
+
+        //- Flag to indicate whether data should be reset/cleared on writing
+        Switch resetOnWrite_;
+
+        //- Table of number of times a particle has hit a face
+        hitTableType faceHitCounter_;
+
+        //- Pointer to the cloud storage
+        autoPtr<Cloud<parcelType> > cloudPtr_;
+
+
+protected:
+
+    // Protected member functions
+
+        //- Write post-processing info
+        void write();
+
+
+public:
+
+    //- Runtime type information
+    TypeName("ParticleTracks");
+
+
+    // Constructors
+
+        //- Construct from dictionary
+        ParticleTracks(const dictionary& dict, CloudType& owner);
+
+        //- Construct copy
+        ParticleTracks(const ParticleTracks<CloudType>& ppm);
+
+        //- Construct and return a clone
+        virtual autoPtr<PostProcessingModel<CloudType> > clone() const
+        {
+            return autoPtr<PostProcessingModel<CloudType> >
+            (
+                new ParticleTracks<CloudType>(*this)
+            );
+        }
+
+
+    //- Destructor
+    virtual ~ParticleTracks();
+
+
+    // Member Functions
+
+        // Access
+
+            //- Return const access to the track interval
+            inline label trackInterval() const;
+
+            //- Return const access to the max samples
+            inline label maxSamples() const;
+
+            //- Return const access to the reset on write flag
+            inline const Switch& resetOnWrite() const;
+
+            //- Rerurn the table of number of times a particle has hit a face
+            inline const hitTableType& faceHitCounter() const;
+
+            //- Return const access to the cloud
+            inline const Cloud<parcelType>& cloud() const;
+
+
+        // Evaluation
+
+            //- Gather post-processing info on patch - not used
+            virtual void postPatch(const parcelType& p, const label patchI);
+
+            //- Gather particle data when hit face
+            virtual void postFace(const parcelType& p);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "ParticleTracksI.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#   include "ParticleTracks.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/ParticleTracks/ParticleTracksI.H b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/ParticleTracks/ParticleTracksI.H
new file mode 100644
index 0000000000000000000000000000000000000000..f36556c4f11d54e47a36833cf333085e64a56f8c
--- /dev/null
+++ b/src/lagrangian/intermediate/submodels/Kinematic/PostProcessingModel/ParticleTracks/ParticleTracksI.H
@@ -0,0 +1,67 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2010-2010 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 3 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, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "ParticleTracks.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+template<class CloudType>
+inline Foam::label Foam::ParticleTracks<CloudType>::trackInterval() const
+{
+    return trackInterval_;
+}
+
+
+template<class CloudType>
+inline Foam::label Foam::ParticleTracks<CloudType>::maxSamples() const
+{
+    return maxSamples_;
+}
+
+
+template<class CloudType>
+inline const Foam::Switch& Foam::ParticleTracks<CloudType>::resetOnWrite() const
+{
+    return resetOnWrite_;
+}
+
+
+template<class CloudType>
+inline const typename Foam::ParticleTracks<CloudType>::hitTableType&
+Foam::ParticleTracks<CloudType>::faceHitCounter() const
+{
+    return faceHitCounter_;
+}
+
+
+template<class CloudType>
+inline const Foam::Cloud<typename CloudType::parcelType>&
+Foam::ParticleTracks<CloudType>::cloud() const
+{
+    return cloudPtr_();
+}
+
+
+// ************************************************************************* //