diff --git a/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/steadyParticleTracks.C b/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/steadyParticleTracks.C
index 5a6fad75a696b5a8554012ace76107dd2f337ec5..4d2ab943acab92eacfedb38d57d1bb1c0e472c28 100644
--- a/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/steadyParticleTracks.C
+++ b/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/steadyParticleTracks.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2013 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -184,6 +184,7 @@ int main(int argc, char *argv[])
             }
         }
 
+
         if (nTracks == 0)
         {
             Info<< "\n    No track data" << endl;
@@ -202,11 +203,13 @@ int main(int argc, char *argv[])
 
             // particle "age" property used to sort the tracks
             List<SortableList<scalar> > agePerTrack(nTracks);
+            List<List<label> > particleMap(nTracks);
 
             forAll(trackLengths, i)
             {
                 const label length = trackLengths[i];
                 agePerTrack[i].setSize(length);
+                particleMap[i].setSize(length);
             }
 
             // store the particle age per track
@@ -228,6 +231,7 @@ int main(int argc, char *argv[])
                     const label trackI = particleToTrack[i];
                     const label sampleI = trackSamples[trackI];
                     agePerTrack[trackI][sampleI] = age[i];
+                    particleMap[trackI][sampleI] = i;
                     trackSamples[trackI]++;
                 }
                 tage.clear();
@@ -251,21 +255,30 @@ int main(int argc, char *argv[])
                 Info<< "\n    Writing points" << endl;
 
                 {
-                    label offset = 0;
                     forAll(agePerTrack, i)
                     {
                         agePerTrack[i].sort();
+
                         const labelList& ids = agePerTrack[i].indices();
+                        labelList& particleIds = particleMap[i];
+
+                        {
+                            // update addressing
+                            List<label> sortedIds(ids);
+                            forAll(sortedIds, j)
+                            {
+                                sortedIds[j] = particleIds[ids[j]];
+                            }
+                            particleIds = sortedIds;
+                        }
 
                         forAll(ids, j)
                         {
-                            const label localId = offset + ids[j];
+                            const label localId = particleIds[j];
                             const vector& pos = particles[localId].position();
                             os  << pos.x() << ' ' << pos.y() << ' ' << pos.z()
                                 << nl;
                         }
-
-                        offset += trackLengths[i];
                     }
                 }
 
@@ -278,13 +291,14 @@ int main(int argc, char *argv[])
                 // Write ids of track points to file
                 {
                     label globalPtI = 0;
-                    forAll(agePerTrack, i)
+                    forAll(particleMap, i)
                     {
-                        os  << agePerTrack[i].size() << nl;
+                        os  << particleMap[i].size() << nl;
 
-                        forAll(agePerTrack[i], j)
+                        forAll(particleMap[i], j)
                         {
                             os  << ' ' << globalPtI++;
+
                             if (((j + 1) % 10 == 0) && (j != 0))
                             {
                                 os  << nl;
@@ -303,14 +317,14 @@ int main(int argc, char *argv[])
 
                 Info<< "\n    Processing fields" << nl << endl;
 
-                processFields<label>(os, agePerTrack, userFields, cloudObjs);
-                processFields<scalar>(os, agePerTrack, userFields, cloudObjs);
-                processFields<vector>(os, agePerTrack, userFields, cloudObjs);
+                processFields<label>(os, particleMap, userFields, cloudObjs);
+                processFields<scalar>(os, particleMap, userFields, cloudObjs);
+                processFields<vector>(os, particleMap, userFields, cloudObjs);
                 processFields<sphericalTensor>
-                    (os, agePerTrack, userFields, cloudObjs);
+                    (os, particleMap, userFields, cloudObjs);
                 processFields<symmTensor>
-                    (os, agePerTrack, userFields, cloudObjs);
-                processFields<tensor>(os, agePerTrack, userFields, cloudObjs);
+                    (os, particleMap, userFields, cloudObjs);
+                processFields<tensor>(os, particleMap, userFields, cloudObjs);
 
             }
         }
diff --git a/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/steadyParticleTracksTemplates.C b/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/steadyParticleTracksTemplates.C
index 89e499b17da2a2a4d1d476ca8ee1a1b03fffaa05..3dcc365c1de45bd78df8e5048d76662ff481a938 100644
--- a/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/steadyParticleTracksTemplates.C
+++ b/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/steadyParticleTracksTemplates.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2013 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -57,39 +57,57 @@ tmp<Field<Type> > readParticleField
         return tmp<Field<Type> >(new Field<Type>(newField.xfer()));
     }
 
-    Info<< "error: cloud field name " << name << " not found" << endl;
+    FatalErrorIn
+    (
+        "template<class Type>"
+        "void readParticleField"
+        "("
+            "const word&, "
+            "const IOobjectList"
+        ")"
+    )
+        << "error: cloud field name " << name << " not found"
+        << abort(FatalError);
 
     return Field<Type>::null();
 }
 
 
 template<class Type>
-PtrList<List<Type> > readFields
+void readFields
 (
     PtrList<List<Type> >& values,
-    const List<word>& fields,
+    const List<word>& fieldNames,
     const IOobjectList& cloudObjs
 )
 {
     IOobjectList objects(cloudObjs.lookupClass(IOField<Type>::typeName));
 
-    label fieldI = 0;
-    forAllConstIter(IOobjectList, objects, iter)
+    forAll(fieldNames, j)
     {
-        const IOobject& obj = *iter();
-        forAll(fields, j)
+        const IOobject* obj = objects.lookup(fieldNames[j]);
+        if (obj != NULL)
         {
-            if (obj.name() == fields[j])
-            {
-                Info<< "        reading field " << obj.name() << endl;
-                IOField<Type> newField(obj);
-                values.set(fieldI++, new List<Type>(newField.xfer()));
-                break;
-            }
+            Info<< "        reading field " << fieldNames[j] << endl;
+            IOField<Type> newField(*obj);
+            values.set(j, new List<Type>(newField.xfer()));
+        }
+        else
+        {
+            FatalErrorIn
+            (
+                "template<class Type>"
+                "void readFields"
+                "("
+                    "PtrList<List<Type> >&, "
+                    "const List<word>&, "
+                    "const IOobjectList&"
+                ")"
+            )
+                << "Unable to read field " << fieldNames[j]
+                << abort(FatalError);
         }
     }
-
-    return values;
 }
 
 
@@ -109,7 +127,7 @@ void writeVTKFields
 (
     OFstream& os,
     const PtrList<List<Type> >& values,
-    const List<SortableList<scalar> >& agePerTrack,
+    const List<List<label> >& addr,
     const List<word>& fieldNames
 )
 {
@@ -121,9 +139,9 @@ void writeVTKFields
         os  << nl << fieldNames[fieldI] << ' ' << pTraits<Type>::nComponents
             << ' ' << values[fieldI].size() << " float" << nl;
         label offset = 0;
-        forAll(agePerTrack, trackI)
+        forAll(addr, trackI)
         {
-            const List<label> ids = agePerTrack[trackI].indices() + offset;
+            const List<label> ids(addr[trackI]);
 
             List<Type> data(UIndirectList<Type>(values[fieldI], ids));
             label nData = data.size() - 1;
@@ -149,7 +167,7 @@ template<class Type>
 void processFields
 (
     OFstream& os,
-    const List<SortableList<scalar> >& agePerTrack,
+    const List<List<label> >& addr,
     const List<word>& userFieldNames,
     const IOobjectList& cloudObjs
 )
@@ -176,12 +194,14 @@ void processFields
         (
             os,
             values,
-            agePerTrack,
-            fieldNames.xfer()
+            addr,
+            fieldNames
         );
     }
 }
 
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
 } // End namespace Foam
 
 // ************************************************************************* //
diff --git a/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/steadyParticleTracksTemplates.H b/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/steadyParticleTracksTemplates.H
index 973e6da255077ccef389d54a1838ee25d00f1b3d..f3b5d48d2d2437c657534478cb5cf923bb0708fd 100644
--- a/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/steadyParticleTracksTemplates.H
+++ b/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/steadyParticleTracksTemplates.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2013 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -49,7 +49,7 @@ namespace Foam
     );
 
     template<class Type>
-    PtrList<List<Type> > readFields
+    void readFields
     (
         PtrList<List<Type> >& values,
         const List<word>& fields,