diff --git a/src/OpenFOAM/fields/cloud/cloud.C b/src/OpenFOAM/fields/cloud/cloud.C
index 69cba912e0e2385cc6b7f06988a201f14311bfbc..172d6aac743c9ff6580d358fcea921bca0d897f7 100644
--- a/src/OpenFOAM/fields/cloud/cloud.C
+++ b/src/OpenFOAM/fields/cloud/cloud.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -36,7 +36,6 @@ namespace Foam
     word cloud::defaultName("defaultCloud");
 }
 
-
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
 Foam::cloud::cloud(const objectRegistry& obr, const word& cloudName)
@@ -70,4 +69,10 @@ void Foam::cloud::autoMap(const mapPolyMesh&)
 }
 
 
+void Foam::cloud::writeObjects(objectRegistry& obr) const
+{
+    NotImplemented;
+}
+
+
 // ************************************************************************* //
diff --git a/src/OpenFOAM/fields/cloud/cloud.H b/src/OpenFOAM/fields/cloud/cloud.H
index 9b7aa4329177c47019461d01317a9295491a4d47..844cb9db4e5d71ac886e5ddcc90139e2eb2c2785 100644
--- a/src/OpenFOAM/fields/cloud/cloud.H
+++ b/src/OpenFOAM/fields/cloud/cloud.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -36,6 +36,7 @@ SourceFiles
 #define cloud_H
 
 #include "objectRegistry.H"
+#include "IOField.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -92,6 +93,24 @@ public:
             //- Remap the cells of particles corresponding to the
             //  mesh topology change
             virtual void autoMap(const mapPolyMesh&);
+
+
+        // I-O
+
+            //- Read particle fields from objects in the obr registry
+            //virtual void readObjects(objectRegistry& obr);
+
+            //- Write particle fields as objects into the obr registry
+            virtual void writeObjects(objectRegistry& obr) const;
+
+            //- Helper to construct IOField on a supplied object registry
+            template<class Type>
+            static IOField<Type>& createIOField
+            (
+                const word& fieldName,
+                const label nParticle,
+                objectRegistry& obr
+            );
 };
 
 
@@ -101,6 +120,12 @@ public:
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
+#ifdef NoRepository
+    #include "cloudTemplates.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
 #endif
 
 // ************************************************************************* //
diff --git a/src/OpenFOAM/fields/cloud/cloudTemplates.C b/src/OpenFOAM/fields/cloud/cloudTemplates.C
new file mode 100644
index 0000000000000000000000000000000000000000..1b5b2ee8b2530672f460a32d79076003a404473e
--- /dev/null
+++ b/src/OpenFOAM/fields/cloud/cloudTemplates.C
@@ -0,0 +1,60 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 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 "Time.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+template<class Type>
+Foam::IOField<Type>& Foam::cloud::createIOField
+(
+    const word& fieldName,
+    const label nParticle,
+    objectRegistry& obr
+)
+{
+    IOField<Type>* fieldPtr
+    (
+        new IOField<Type>
+        (
+            IOobject
+            (
+                fieldName,
+                obr.time().timeName(),
+                obr,
+                IOobject::NO_READ,
+                IOobject::AUTO_WRITE
+            ),
+            nParticle
+        )
+    );
+
+    fieldPtr->store();
+
+    return *fieldPtr;
+}
+
+
+// ************************************************************************* //
diff --git a/src/lagrangian/basic/particle/particle.H b/src/lagrangian/basic/particle/particle.H
index 9f0856e4fa81e86eadc85af8fdb784d5be7e6edf..d94db0dd5614db6e9c7472669bf431d69d4317d5 100644
--- a/src/lagrangian/basic/particle/particle.H
+++ b/src/lagrangian/basic/particle/particle.H
@@ -574,6 +574,10 @@ public:
         template<class CloudType>
         static void writeFields(const CloudType& c);
 
+        //- Write particle fields as objects into the obr registry
+        template<class CloudType>
+        static void writeObjects(const CloudType& c, objectRegistry& obr);
+
         //- Write the particle position and cell
         void writePosition(Ostream&) const;
 
diff --git a/src/lagrangian/basic/particle/particleTemplates.C b/src/lagrangian/basic/particle/particleTemplates.C
index aa84ad9084cc952a06aef9542d6a90d16530fc9c..95f018665c965b74f259351c7b1731e7f05c5693 100644
--- a/src/lagrangian/basic/particle/particleTemplates.C
+++ b/src/lagrangian/basic/particle/particleTemplates.C
@@ -162,7 +162,7 @@ void Foam::particle::writeFields(const CloudType& c)
     IOPosition<CloudType> ioP(c);
     ioP.write();
 
-    label np =  c.size();
+    label np = c.size();
 
     IOField<label> origProc
     (
@@ -184,6 +184,29 @@ void Foam::particle::writeFields(const CloudType& c)
 }
 
 
+template<class CloudType>
+void Foam::particle::writeObjects(const CloudType& c, objectRegistry& obr)
+{
+    label np = c.size();
+
+    IOField<vector>& position
+    (
+        cloud::createIOField<vector>("position", np, obr)
+    );
+    IOField<label>& origProc(cloud::createIOField<label>("origProc", np, obr));
+    IOField<label>& origId(cloud::createIOField<label>("origId", np, obr));
+
+    label i = 0;
+    forAllConstIter(typename CloudType, c, iter)
+    {
+        position[i] = iter().position_;
+        origProc[i] = iter().origProc_;
+        origId[i] = iter().origId_;
+        i++;
+    }
+}
+
+
 template<class TrackData>
 Foam::label Foam::particle::track(const vector& endPosition, TrackData& td)
 {
diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
index de5e0d57da67afbc3338607aa9cf09ee594065c4..d82b1bba67474ab32be83a8baf532697111fcd9b 100644
--- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
+++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
@@ -895,4 +895,11 @@ void Foam::KinematicCloud<CloudType>::info()
 }
 
 
+template<class CloudType>
+void Foam::KinematicCloud<CloudType>::writeObjects(objectRegistry& obr) const
+{
+    parcelType::writeObjects(*this, obr);
+}
+
+
 // ************************************************************************* //
diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H
index f61af75bbd5d7c23823371a9fea3c526b38e78da..d0c8b57603a7958dedbe54cafbb3650ee0c91002 100644
--- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H
+++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -612,6 +612,9 @@ public:
 
             //- Print cloud information
             void info();
+
+            //- Write particle fields as objects into the obr registry
+            virtual void writeObjects(objectRegistry& obr) const;
 };
 
 
diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C
index d168d158e6ed1235858bbb8912ba564e48c58fb1..64476622555970dd166375d9fbb867bb89f51ff2 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C
+++ b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C
@@ -362,4 +362,11 @@ void Foam::ReactingCloud<CloudType>::writeFields() const
 }
 
 
+template<class CloudType>
+void Foam::ReactingCloud<CloudType>::writeObjects(objectRegistry& obr) const
+{
+    CloudType::particleType::writeObjects(*this, this->composition(), obr);
+}
+
+
 // ************************************************************************* //
diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.H b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.H
index 0caccbcf7976af4aff16e617e371c7ffec04e7af..bfb0952677bb37eeb70d2ec701dfcd9ca5e5d456 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.H
+++ b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -313,6 +313,9 @@ public:
 
             //- Write the field data for the cloud
             virtual void writeFields() const;
+
+            //- Write particle fields as objects into the obr registry
+            virtual void writeObjects(objectRegistry& obr) const;
 };
 
 
diff --git a/src/lagrangian/intermediate/clouds/baseClasses/kinematicCloud/kinematicCloud.H b/src/lagrangian/intermediate/clouds/baseClasses/kinematicCloud/kinematicCloud.H
index b3caba28d26520d800bc3fc4e968a257b719c5ee..675f09e6bdc03bd84f51b0adfada4dfc7de9a771 100644
--- a/src/lagrangian/intermediate/clouds/baseClasses/kinematicCloud/kinematicCloud.H
+++ b/src/lagrangian/intermediate/clouds/baseClasses/kinematicCloud/kinematicCloud.H
@@ -63,11 +63,15 @@ public:
     //- Runtime type information
     TypeName("kinematicCloud");
 
+
     // Constructors
 
         //- Null constructor
         kinematicCloud();
 
+    //- Destructor
+    virtual ~kinematicCloud();
+
 
     // Member functions
 
@@ -92,26 +96,22 @@ public:
             virtual scalar Dmax() const = 0;
 
 
-            // Fields
+        // Fields
 
-                //- Volume swept rate of parcels per cell
-                virtual const tmp<volScalarField> vDotSweep() const = 0;
+            //- Volume swept rate of parcels per cell
+            virtual const tmp<volScalarField> vDotSweep() const = 0;
 
-                //- Return the particle volume fraction field
-                //  Note: for particles belonging to this cloud only
-                virtual const tmp<volScalarField> theta() const = 0;
+            //- Return the particle volume fraction field
+            //  Note: for particles belonging to this cloud only
+            virtual const tmp<volScalarField> theta() const = 0;
 
-                //- Return the particle mass fraction field
-                //  Note: for particles belonging to this cloud only
-                virtual const tmp<volScalarField> alpha() const = 0;
+            //- Return the particle mass fraction field
+            //  Note: for particles belonging to this cloud only
+            virtual const tmp<volScalarField> alpha() const = 0;
 
-                //- Return the particle effective density field
-                //  Note: for particles belonging to this cloud only
-                virtual const tmp<volScalarField> rhoEff() const = 0;
-
-
-    //- Destructor
-    virtual ~kinematicCloud();
+            //- Return the particle effective density field
+            //  Note: for particles belonging to this cloud only
+            virtual const tmp<volScalarField> rhoEff() const = 0;
 };
 
 
diff --git a/src/lagrangian/intermediate/parcels/Templates/CollidingParcel/CollidingParcel.H b/src/lagrangian/intermediate/parcels/Templates/CollidingParcel/CollidingParcel.H
index 28d92d99a2f08985b3dcd1bdef4d34ff01ac41ba..a2d5b155095f84438b0a7abdcddf04cc9bb83405 100644
--- a/src/lagrangian/intermediate/parcels/Templates/CollidingParcel/CollidingParcel.H
+++ b/src/lagrangian/intermediate/parcels/Templates/CollidingParcel/CollidingParcel.H
@@ -307,6 +307,10 @@ public:
             template<class CloudType>
             static void writeFields(const CloudType& c);
 
+            //- Write particle fields as objects into the obr registry
+            template<class CloudType>
+            static void writeObjects(const CloudType& c, objectRegistry& obr);
+
 
     // Ostream Operator
 
diff --git a/src/lagrangian/intermediate/parcels/Templates/CollidingParcel/CollidingParcelIO.C b/src/lagrangian/intermediate/parcels/Templates/CollidingParcel/CollidingParcelIO.C
index 8f0c8b6b468eb27991a40cb9c1144bf8ed14cd1d..a5d5074f52776c8d1897abae16d8d66bf8372d4b 100644
--- a/src/lagrangian/intermediate/parcels/Templates/CollidingParcel/CollidingParcelIO.C
+++ b/src/lagrangian/intermediate/parcels/Templates/CollidingParcel/CollidingParcelIO.C
@@ -274,6 +274,39 @@ void Foam::CollidingParcel<ParcelType>::writeFields(const CloudType& c)
 }
 
 
+template<class ParcelType>
+template<class CloudType>
+void Foam::CollidingParcel<ParcelType>::writeObjects
+(
+    const CloudType& c,
+    objectRegistry& obr
+)
+{
+    ParcelType::writeObjects(c, obr);
+
+    label np = c.size();
+
+    IOField<vector>& f(cloud::createIOField<vector>("f", np, obr));
+    IOField<vector>& angularMomentum
+    (
+        cloud::createIOField<vector>("angularMomentum", np, obr)
+    );
+    IOField<vector>& torque(cloud::createIOField<vector>("torque", np, obr));
+
+    label i = 0;
+    forAllConstIter(typename CloudType, c, iter)
+    {
+        const CollidingParcel<ParcelType>& p = iter();
+
+        f[i] = p.f();
+        angularMomentum[i] = p.angularMomentum();
+        torque[i] = p.torque();
+
+        i++;
+    }
+}
+
+
 // * * * * * * * * * * * * * * * IOstream Operators  * * * * * * * * * * * * //
 
 template<class ParcelType>
diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H
index 40273fef645b8510ea87175d68e91bd19f5f61ab..dd45972ca2707d46219882222e686ac2e485e837 100644
--- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H
+++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H
@@ -660,6 +660,10 @@ public:
             template<class CloudType>
             static void writeFields(const CloudType& c);
 
+            //- Write particle fields as objects into the obr registry
+            template<class CloudType>
+            static void writeObjects(const CloudType& c, objectRegistry& obr);
+
 
     // Ostream Operator
 
diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelIO.C b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelIO.C
index 22da248dd60be8e30b70ce59d531091d89851ec0..51b263c0c7edeca54fca20b67c57677add76ede1 100644
--- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelIO.C
+++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelIO.C
@@ -171,7 +171,7 @@ void Foam::KinematicParcel<ParcelType>::writeFields(const CloudType& c)
 {
     ParcelType::writeFields(c);
 
-    label np =  c.size();
+    label np = c.size();
 
     IOField<label> active(c.fieldIOobject("active", IOobject::NO_READ), np);
     IOField<label> typeId(c.fieldIOobject("typeId", IOobject::NO_READ), np);
@@ -221,6 +221,55 @@ void Foam::KinematicParcel<ParcelType>::writeFields(const CloudType& c)
 }
 
 
+template<class ParcelType>
+template<class CloudType>
+void Foam::KinematicParcel<ParcelType>::writeObjects
+(
+    const CloudType& c,
+    objectRegistry& obr
+)
+{
+DebugInFunction << endl;
+    ParcelType::writeObjects(c, obr);
+
+    label np = c.size();
+
+    IOField<label>& active(cloud::createIOField<label>("active", np, obr));
+    IOField<label>& typeId(cloud::createIOField<label>("typeId", np, obr));
+    IOField<scalar>& nParticle
+    (
+        cloud::createIOField<scalar>("nParticle", np, obr)
+    );
+    IOField<scalar>& d(cloud::createIOField<scalar>("d", np, obr));
+    IOField<scalar>& dTarget(cloud::createIOField<scalar>("dTarget", np, obr));
+    IOField<vector>& U(cloud::createIOField<vector>("U", np, obr));
+    IOField<scalar>& rho(cloud::createIOField<scalar>("rho", np, obr));
+    IOField<scalar>& age(cloud::createIOField<scalar>("age", np, obr));
+    IOField<scalar>& tTurb(cloud::createIOField<scalar>("tTurb", np, obr));
+    IOField<vector>& UTurb(cloud::createIOField<vector>("UTurb", np, obr));
+
+    label i = 0;
+
+    forAllConstIter(typename CloudType, c, iter)
+    {
+        const KinematicParcel<ParcelType>& p = iter();
+
+        active[i] = p.active();
+        typeId[i] = p.typeId();
+        nParticle[i] = p.nParticle();
+        d[i] = p.d();
+        dTarget[i] = p.dTarget();
+        U[i] = p.U();
+        rho[i] = p.rho();
+        age[i] = p.age();
+        tTurb[i] = p.tTurb();
+        UTurb[i] = p.UTurb();
+
+        i++;
+    }
+}
+
+
 // * * * * * * * * * * * * * * * IOstream Operators  * * * * * * * * * * * * //
 
 template<class ParcelType>
diff --git a/src/lagrangian/intermediate/parcels/Templates/MPPICParcel/MPPICParcel.H b/src/lagrangian/intermediate/parcels/Templates/MPPICParcel/MPPICParcel.H
index 26083c6a2b391e6b298e07b826eac049946b8f98..c932590a9ca29e7bb6c671dc098718f3dd7af3ff 100644
--- a/src/lagrangian/intermediate/parcels/Templates/MPPICParcel/MPPICParcel.H
+++ b/src/lagrangian/intermediate/parcels/Templates/MPPICParcel/MPPICParcel.H
@@ -297,6 +297,10 @@ public:
             template<class CloudType>
             static void writeFields(const CloudType& c);
 
+            //- Write particle fields as objects into the obr registry
+            template<class CloudType>
+            static void writeObjects(const CloudType& c, objectRegistry& obr);
+
 
         // Ostream operator
 
diff --git a/src/lagrangian/intermediate/parcels/Templates/MPPICParcel/MPPICParcelIO.C b/src/lagrangian/intermediate/parcels/Templates/MPPICParcel/MPPICParcelIO.C
index 28af8d627e1f79eaa75f013ad1cd69e29bbc1c4a..452b5b0eab6559f8d45e81be0c72331099693ba7 100644
--- a/src/lagrangian/intermediate/parcels/Templates/MPPICParcel/MPPICParcelIO.C
+++ b/src/lagrangian/intermediate/parcels/Templates/MPPICParcel/MPPICParcelIO.C
@@ -110,7 +110,7 @@ void Foam::MPPICParcel<ParcelType>::writeFields(const CloudType& c)
 {
     ParcelType::writeFields(c);
 
-    label np =  c.size();
+    label np = c.size();
 
     IOField<vector>
         UCorrect(c.fieldIOobject("UCorrect", IOobject::NO_READ), np);
@@ -130,6 +130,34 @@ void Foam::MPPICParcel<ParcelType>::writeFields(const CloudType& c)
 }
 
 
+template<class ParcelType>
+template<class CloudType>
+void Foam::MPPICParcel<ParcelType>::writeObjects
+(
+    const CloudType& c,
+    objectRegistry& obr
+)
+{
+    ParcelType::writeObjects(c, obr);
+
+    label np = c.size();
+
+    IOField<vector>&
+        UCorrect(cloud::createIOField<vector>("UCorrect", np, obr));
+
+    label i = 0;
+
+    forAllConstIter(typename CloudType, c, iter)
+    {
+        const MPPICParcel<ParcelType>& p = iter();
+
+        UCorrect[i] = p.UCorrect();
+
+        i++;
+    }
+}
+
+
 // * * * * * * * * * * * * * * * IOstream Operators  * * * * * * * * * * * * //
 
 template<class ParcelType>
diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.H b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.H
index 5b2a38eafceda1651b0efd156079a4212a294c27..c9525627d41bd0196b0973f62c28ea60157a990e 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.H
+++ b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.H
@@ -433,7 +433,7 @@ public:
 
         // I-O
 
-            //- Read
+            //- Read - composition supplied
             template<class CloudType, class CompositionType>
             static void readFields
             (
@@ -445,7 +445,7 @@ public:
             template<class CloudType>
             static void readFields(CloudType& c);
 
-            //- Write
+            //- Write - composition supplied
             template<class CloudType, class CompositionType>
             static void writeFields
             (
@@ -453,10 +453,28 @@ public:
                 const CompositionType& compModel
             );
 
-            //- Read - composition supplied
+            //- Read - no composition
             template<class CloudType>
             static void writeFields(const CloudType& c);
 
+            //- Write particle fields as objects into the obr registry
+            //  - no composition
+            template<class CloudType>
+            static void writeObjects
+            (
+                const CloudType& c,
+                objectRegistry& obr
+            );
+
+            //- Write particle fields as objects into the obr registry
+            template<class CloudType, class CompositionType>
+            static void writeObjects
+            (
+                const CloudType& c,
+                const CompositionType& compModel,
+                objectRegistry& obr
+            );
+
 
     // Ostream Operator
 
diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcelIO.C b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcelIO.C
index 2a776383ae1db1ecf824a0c78360e4fdba744919..cf15a6d49782964089ed5b83e7a7c183c807aae0 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcelIO.C
+++ b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcelIO.C
@@ -327,6 +327,108 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::writeFields
 }
 
 
+template<class ParcelType>
+template<class CloudType>
+void Foam::ReactingMultiphaseParcel<ParcelType>::writeObjects
+(
+    const CloudType& c,
+    objectRegistry& obr
+)
+{
+    ParcelType::writeObjects(c, obr);
+}
+
+
+template<class ParcelType>
+template<class CloudType, class CompositionType>
+void Foam::ReactingMultiphaseParcel<ParcelType>::writeObjects
+(
+    const CloudType& c,
+    const CompositionType& compModel,
+    objectRegistry& obr
+)
+{
+    ParcelType::writeObjects(c, obr);
+
+    label np = c.size();
+
+    // Write the composition fractions
+    if (np > 0)
+    {
+        const wordList& stateLabels = compModel.stateLabels();
+
+        const label idGas = compModel.idGas();
+        const wordList& gasNames = compModel.componentNames(idGas);
+        forAll(gasNames, j)
+        {
+            const word fieldName = "Y" + gasNames[j] + stateLabels[idGas];
+            IOField<scalar>& YGas
+            (
+                cloud::createIOField<scalar>(fieldName, np, obr)
+            );
+
+            label i = 0;
+            forAllConstIter
+            (
+                typename Cloud<ReactingMultiphaseParcel<ParcelType>>,
+                c,
+                iter
+            )
+            {
+                const ReactingMultiphaseParcel<ParcelType>& p0 = iter();
+                YGas[i++] = p0.YGas()[j]*p0.Y()[GAS];
+            }
+        }
+
+        const label idLiquid = compModel.idLiquid();
+        const wordList& liquidNames = compModel.componentNames(idLiquid);
+        forAll(liquidNames, j)
+        {
+            const word fieldName = "Y" + liquidNames[j] + stateLabels[idLiquid];
+            IOField<scalar>& YLiquid
+            (
+                cloud::createIOField<scalar>(fieldName, np, obr)
+            );
+
+            label i = 0;
+            forAllConstIter
+            (
+                typename Cloud<ReactingMultiphaseParcel<ParcelType>>,
+                c,
+                iter
+            )
+            {
+                const ReactingMultiphaseParcel<ParcelType>& p0 = iter();
+                YLiquid[i++] = p0.YLiquid()[j]*p0.Y()[LIQ];
+            }
+        }
+
+        const label idSolid = compModel.idSolid();
+        const wordList& solidNames = compModel.componentNames(idSolid);
+        forAll(solidNames, j)
+        {
+            const word fieldName = "Y" + solidNames[j] + stateLabels[idSolid];
+            IOField<scalar>& YSolid
+            (
+                cloud::createIOField<scalar>(fieldName, np, obr)
+            );
+
+            label i = 0;
+            forAllConstIter
+            (
+                typename Cloud<ReactingMultiphaseParcel<ParcelType>>,
+                c,
+                iter
+            )
+            {
+                const ReactingMultiphaseParcel<ParcelType>& p0 = iter();
+                YSolid[i++] = p0.YSolid()[j]*p0.Y()[SLD];
+            }
+        }
+    }
+}
+
+
 // * * * * * * * * * * * * * * * IOstream Operators  * * * * * * * * * * * * //
 
 template<class ParcelType>
diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H
index 40beface593685dfbda4f3a2a37f5a757d732b2f..c5463d92968fce8aebe8c323151a31db5763bb8b 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H
+++ b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H
@@ -391,7 +391,7 @@ public:
 
         // I-O
 
-            //- Read
+            //- Read - composition supplied
             template<class CloudType, class CompositionType>
             static void readFields
             (
@@ -403,7 +403,7 @@ public:
             template<class CloudType>
             static void readFields(CloudType& c);
 
-            //- Write
+            //- Write - composition supplied
             template<class CloudType, class CompositionType>
             static void writeFields
             (
@@ -411,11 +411,29 @@ public:
                 const CompositionType& compModel
             );
 
-            //- Write - composition supplied
+            //- Write - no composition
             template<class CloudType>
             static void writeFields(const CloudType& c);
 
 
+            //- Write particle fields as objects into the obr registry
+            //  - no composition
+            template<class CloudType>
+            static void writeObjects
+            (
+                const CloudType& c,
+                objectRegistry& obr
+            );
+
+            //- Write particle fields as objects into the obr registry
+            template<class CloudType, class CompositionType>
+            static void writeObjects
+            (
+                const CloudType& c,
+                const CompositionType& compModel,
+                objectRegistry& obr
+            );
+
     // Ostream Operator
 
         friend Ostream& operator<< <ParcelType>
diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcelIO.C b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcelIO.C
index 3eb02e4e2a6b37eb2a04c49836c06d1e2be045e9..e87a72342cc68f6a85ee356221c4f4ce446ecc70 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcelIO.C
+++ b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcelIO.C
@@ -234,6 +234,76 @@ void Foam::ReactingParcel<ParcelType>::writeFields
 }
 
 
+template<class ParcelType>
+template<class CloudType>
+void Foam::ReactingParcel<ParcelType>::writeObjects
+(
+    const CloudType& c,
+    objectRegistry& obr
+)
+{
+    ParcelType::writeObjects(c, obr);
+}
+
+
+template<class ParcelType>
+template<class CloudType, class CompositionType>
+void Foam::ReactingParcel<ParcelType>::writeObjects
+(
+    const CloudType& c,
+    const CompositionType& compModel,
+    objectRegistry& obr
+)
+{
+DebugInFunction << endl;
+
+    ParcelType::writeObjects(c, obr);
+
+    label np = c.size();
+
+    if (np > 0)
+    {
+        IOField<scalar>& mass0(cloud::createIOField<scalar>("mass0", np, obr));
+
+        label i = 0;
+        forAllConstIter(typename Cloud<ReactingParcel<ParcelType>>, c, iter)
+        {
+            const ReactingParcel<ParcelType>& p = iter();
+            mass0[i++] = p.mass0_;
+        }
+
+        // Write the composition fractions
+        const wordList& phaseTypes = compModel.phaseTypes();
+        wordList stateLabels(phaseTypes.size(), "");
+        if (compModel.nPhase() == 1)
+        {
+            stateLabels = compModel.stateLabels()[0];
+        }
+
+        forAll(phaseTypes, j)
+        {
+            const word fieldName = "Y" + phaseTypes[j] + stateLabels[j];
+            IOField<scalar>& Y
+            (
+                cloud::createIOField<scalar>(fieldName, np, obr)
+            );
+
+            label i = 0;
+            forAllConstIter
+            (
+                typename Cloud<ReactingParcel<ParcelType>>,
+                c,
+                iter
+            )
+            {
+                const ReactingParcel<ParcelType>& p = iter();
+                Y[i++] = p.Y()[j];
+            }
+        }
+    }
+}
+
+
 // * * * * * * * * * * * * * * * IOstream Operators  * * * * * * * * * * * * //
 
 template<class ParcelType>
diff --git a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H
index e90ae5507798a69acdb1c5955667285e81bed045..c0a6777e06cfdfcc97b6197597970a75cc938578 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H
+++ b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H
@@ -450,6 +450,10 @@ public:
             template<class CloudType>
             static void writeFields(const CloudType& c);
 
+            //- Write particle fields as objects into the obr registry
+            template<class CloudType>
+            static void writeObjects(const CloudType& c, objectRegistry& obr);
+
 
     // Ostream Operator
 
diff --git a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcelIO.C b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcelIO.C
index da0b6bd5ae1b46cb09b6e1629dd092cc0748e9b3..084e28ca1b261f3ffb137a97399ff216097e2c86 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcelIO.C
+++ b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcelIO.C
@@ -137,6 +137,34 @@ void Foam::ThermoParcel<ParcelType>::writeFields(const CloudType& c)
 }
 
 
+template<class ParcelType>
+template<class CloudType>
+void Foam::ThermoParcel<ParcelType>::writeObjects
+(
+    const CloudType& c,
+    objectRegistry& obr
+)
+{
+DebugInFunction << endl;
+    ParcelType::writeObjects(c, obr);
+
+    label np = c.size();
+
+    IOField<scalar>& T(cloud::createIOField<scalar>("T", np, obr));
+    IOField<scalar>& Cp(cloud::createIOField<scalar>("Cp", np, obr));
+
+    label i = 0;
+    forAllConstIter(typename Cloud<ThermoParcel<ParcelType>>, c, iter)
+    {
+        const ThermoParcel<ParcelType>& p = iter();
+
+        T[i] = p.T_;
+        Cp[i] = p.Cp_;
+        i++;
+    }
+}
+
+
 // * * * * * * * * * * * * * * * IOstream Operators  * * * * * * * * * * * * //
 
 template<class ParcelType>
diff --git a/src/lagrangian/spray/parcels/Templates/SprayParcel/SprayParcel.H b/src/lagrangian/spray/parcels/Templates/SprayParcel/SprayParcel.H
index 24df39ca9be96a09c62471f6b47b9ebc885070f3..98bf7fcc22709242a1d82cf6dc52e19b707c428b 100644
--- a/src/lagrangian/spray/parcels/Templates/SprayParcel/SprayParcel.H
+++ b/src/lagrangian/spray/parcels/Templates/SprayParcel/SprayParcel.H
@@ -506,6 +506,24 @@ public:
             template<class CloudType>
             static void writeFields(const CloudType& c);
 
+            //- Write particle fields as objects into the obr registry
+            //  - no composition
+            template<class CloudType>
+            static void writeObjects
+            (
+                const CloudType& c,
+                objectRegistry& obr
+            );
+
+            //- Write particle fields as objects into the obr registry
+            template<class CloudType, class CompositionType>
+            static void writeObjects
+            (
+                const CloudType& c,
+                const CompositionType& compModel,
+                objectRegistry& obr
+            );
+
 
     // Ostream Operator
 
diff --git a/src/lagrangian/spray/parcels/Templates/SprayParcel/SprayParcelIO.C b/src/lagrangian/spray/parcels/Templates/SprayParcel/SprayParcelIO.C
index 482bb4e42bd17d52da030b96756b305d68d3df0d..1afeb4d32b5985134797da919a392b6da9b6ac19 100644
--- a/src/lagrangian/spray/parcels/Templates/SprayParcel/SprayParcelIO.C
+++ b/src/lagrangian/spray/parcels/Templates/SprayParcel/SprayParcelIO.C
@@ -283,6 +283,76 @@ void Foam::SprayParcel<ParcelType>::writeFields
 }
 
 
+template<class ParcelType>
+template<class CloudType>
+void Foam::SprayParcel<ParcelType>::writeObjects
+(
+    const CloudType& c,
+    objectRegistry& obr
+)
+{
+    ParcelType::writeObjects(c, obr);
+}
+
+
+template<class ParcelType>
+template<class CloudType, class CompositionType>
+void Foam::SprayParcel<ParcelType>::writeObjects
+(
+    const CloudType& c,
+    const CompositionType& compModel,
+    objectRegistry& obr
+)
+{
+    ParcelType::writeObjects(c, compModel, obr);
+
+    label np = c.size();
+
+    IOField<scalar>& d0(cloud::createIOField<scalar>("d0", np, obr));
+    IOField<vector>& position0
+    (
+        cloud::createIOField<vector>("position0", np, obr)
+    );
+    IOField<scalar>& sigma(cloud::createIOField<scalar>("sigma", np, obr));
+    IOField<scalar>& mu(cloud::createIOField<scalar>("mu", np, obr));
+    IOField<scalar>& liquidCore
+    (
+        cloud::createIOField<scalar>("liquidCore", np, obr)
+    );
+    IOField<scalar>& KHindex(cloud::createIOField<scalar>("KHindex", np, obr));
+    IOField<scalar>& y(cloud::createIOField<scalar>("y", np, obr));
+    IOField<scalar>& yDot(cloud::createIOField<scalar>("yDot", np, obr));
+    IOField<scalar>& tc(cloud::createIOField<scalar>("tc", np, obr));
+    IOField<scalar>& ms(cloud::createIOField<scalar>("ms", np, obr));
+    IOField<scalar>& injector
+    (
+        cloud::createIOField<scalar>("injector", np, obr)
+    );
+    IOField<scalar>& tMom(cloud::createIOField<scalar>("tMom", np, obr));
+    IOField<scalar>& user(cloud::createIOField<scalar>("user", np, obr));
+
+    label i = 0;
+    forAllConstIter(typename Cloud<SprayParcel<ParcelType>>, c, iter)
+    {
+        const SprayParcel<ParcelType>& p = iter();
+        d0[i] = p.d0_;
+        position0[i] = p.position0_;
+        sigma[i] = p.sigma_;
+        mu[i] = p.mu_;
+        liquidCore[i] = p.liquidCore_;
+        KHindex[i] = p.KHindex_;
+        y[i] = p.y_;
+        yDot[i] = p.yDot_;
+        tc[i] = p.tc_;
+        ms[i] = p.ms_;
+        injector[i] = p.injector_;
+        tMom[i] = p.tMom_;
+        user[i] = p.user_;
+        i++;
+    }
+}
+
+
 // * * * * * * * * * * * * * * * IOstream Operators  * * * * * * * * * * * * //
 
 template<class ParcelType>