diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C
index a812eb918979e90930138f617cb493600d5f5781..9eb74d585f8ed24e156453528ae850e06d3a49b3 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.C
@@ -186,12 +186,14 @@ void Foam::ConeInjection<CloudType>::setPositionAndCell
 
 
 template<class CloudType>
-Foam::vector Foam::ConeInjection<CloudType>::velocity
+void Foam::ConeInjection<CloudType>::setProperties
 (
-    const label,
-    const scalar time
+    const label parcelI,
+    const scalar time,
+    typename CloudType::parcelType* pPtr
 )
 {
+    // set particle velocity
     const scalar deg2Rad = mathematicalConstant::pi/180.0;
 
     scalar t = time - this->SOI_;
@@ -210,23 +212,15 @@ Foam::vector Foam::ConeInjection<CloudType>::velocity
     dirVec += normal;
     dirVec /= mag(dirVec);
 
-    return Umag_().value(t)*dirVec;
-}
-
+    pPtr->U() = Umag_().value(t)*dirVec;
 
-template<class CloudType>
-Foam::scalar Foam::ConeInjection<CloudType>::d0
-(
-    const label,
-    const scalar
-) const
-{
-    return parcelPDF_().sample();
+    // set particle diameter
+    pPtr->d() = parcelPDF_().sample();
 }
 
 
 template<class CloudType>
-bool Foam::ConeInjection<CloudType>::validInjection(const label parcelI)
+bool Foam::ConeInjection<CloudType>::validInjection(const label)
 {
     return true;
 }
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H
index b65a6b58988d38e251605b63e1cfbf6cb9abd96c..b60c1377aeefc96214b9bb55a3ae25214205de61 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ConeInjection/ConeInjection.H
@@ -108,14 +108,14 @@ protected:
 
     // Protected member functions
 
-        //- Number of parcels to introduce over the time step
+        //- Number of parcels to introduce over the time step relative to SOI
         label parcelsToInject
         (
             const scalar time0,
             const scalar time1
         ) const;
 
-        //- Number of parcels to introduce over the time step
+        //- Number of parcels to introduce over the time step relative to SOI
         scalar volumeToInject
         (
             const scalar time0,
@@ -155,7 +155,7 @@ public:
         // Injection geometry
 
             //- Set the injection position and owner cell
-            void setPositionAndCell
+            virtual void setPositionAndCell
             (
                 const label parcelI,
                 const scalar time,
@@ -163,23 +163,21 @@ public:
                 label& cellOwner
             );
 
-            //- Return the velocity of the parcel to introduce at a time
-            vector velocity
+            virtual void setProperties
             (
                 const label parcelI,
-                const scalar time
+                const scalar time,
+                typename CloudType::parcelType* pPtr
             );
 
-            //- Return the diameter of the parcel to introduce at a time
-            scalar d0
-            (
-                const label parcelI,
-                const scalar time
-            ) const;
+            virtual bool fullyDescribed() const
+            {
+                return false;
+            }
 
             //- Return flag to identify whether or not injection in cellI is
             //  permitted
-            bool validInjection(const label parcelI);
+            virtual bool validInjection(const label parcelI);
 };
 
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.C
index 3110de5c3e3f3139dcdb21c8596529a70d435001..b33403514384aeff6eba3e894007598a77e68e60 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.C
@@ -181,24 +181,18 @@ void Foam::FieldActivatedInjection<CloudType>::setPositionAndCell
 
 
 template<class CloudType>
-Foam::vector Foam::FieldActivatedInjection<CloudType>::velocity
+void Foam::FieldActivatedInjection<CloudType>::setProperties
 (
-    const label,
-    const scalar
+    const label parcelI,
+    const scalar,
+    typename CloudType::parcelType* pPtr
 )
 {
-    return U0_;
-}
+    // set particle velocity
+    pPtr->U() = U0_;
 
-
-template<class CloudType>
-Foam::scalar Foam::FieldActivatedInjection<CloudType>::d0
-(
-    const label parcelI,
-    const scalar
-) const
-{
-    return diameters_[parcelI];
+    // set particle diameter
+    pPtr->d() = diameters_[parcelI];
 }
 
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.H
index 0fec8998159df037d1735de3e99a91aed7471dd2..88d9c8302f6fc6e5a3ffe39654e4d10dbde58f36 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/FieldActivatedInjection/FieldActivatedInjection.H
@@ -113,14 +113,14 @@ protected:
 
     // Protected member functions
 
-        //- Number of parcels to introduce over the time step
+        //- Number of parcels to introduce over the time step relative to SOI
         label parcelsToInject
         (
             const scalar time0,
             const scalar time1
         ) const;
 
-        //- Volume of parcels to introduce over the time step
+        //- Volume of parcels to introduce over the time step relative to SOI
         scalar volumeToInject
         (
             const scalar time0,
@@ -160,7 +160,7 @@ public:
         // Injection geometry
 
             //- Set the injection position and owner cell
-            void setPositionAndCell
+            virtual void setPositionAndCell
             (
                 const label parcelI,
                 const scalar time,
@@ -168,23 +168,21 @@ public:
                 label& cellOwner
             );
 
-            //- Return the velocity of the parcel to introduce at a time
-            vector velocity
+            virtual void setProperties
             (
                 const label parcelI,
-                const scalar time
+                const scalar time,
+                typename CloudType::parcelType* pPtr
             );
 
-            //- Return the diameter of the parcel to introduce at a time
-            scalar d0
-            (
-                const label parcelI,
-                const scalar time
-            ) const;
+            virtual bool fullyDescribed() const
+            {
+                return false;
+            }
 
             //- Return flag to identify whether or not injection in cellI is
             //  permitted
-            bool validInjection(const label parcelI);
+            virtual bool validInjection(const label parcelI);
 };
 
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C
index 6a0ba9544bc4a61eb47055786de2c448fe5b3417..d73859de1505f7c2175e8e8835e3d413e5a79554 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C
@@ -88,8 +88,7 @@ void Foam::InjectionModel<CloudType>::writeProps()
 template<class CloudType>
 void Foam::InjectionModel<CloudType>::prepareForNextTimeStep
 (
-    const scalar time0,
-    const scalar time1,
+    const scalar time,
     label& newParcels,
     scalar& newVolume
 )
@@ -99,15 +98,15 @@ void Foam::InjectionModel<CloudType>::prepareForNextTimeStep
     newVolume = 0.0;
 
     // Return if not started injection event
-    if (time1 < SOI_)
+    if (time < SOI_)
     {
-        timeStep0_ = time1;
+        timeStep0_ = time;
         return;
     }
 
     // Make times relative to SOI
     scalar t0 = timeStep0_ - SOI_;
-    scalar t1 = time1 - SOI_;
+    scalar t1 = time - SOI_;
 
     // Number of parcels to inject
     newParcels = parcelsToInject(t0, t1);
@@ -123,7 +122,7 @@ void Foam::InjectionModel<CloudType>::prepareForNextTimeStep
     else
     {
         // advance value of timeStep0_
-        timeStep0_ = time1;
+        timeStep0_ = time;
     }
 }
 
@@ -348,13 +347,22 @@ void Foam::InjectionModel<CloudType>::inject(TrackData& td)
     }
 
     const scalar time = owner_.db().time().value();
-    const scalar continuousDt = owner_.db().time().deltaT().value();
+/*
+    // Return if not started injection event
+    if (time < SOI_)
+    {
+        timeStep0_ = time;
+        postInjectCheck(0);
+        return;
+    }
+*/
+    const scalar carrierDt = owner_.db().time().deltaT().value();
     const polyMesh& mesh = owner_.mesh();
 
     // Prepare for next time step
     label newParcels = 0;
     scalar newVolume = 0.0;
-    prepareForNextTimeStep(time0_, time, newParcels, newVolume);
+    prepareForNextTimeStep(time, newParcels, newVolume);
 
     // Return if no parcels are required
     if (newParcels == 0)
@@ -363,18 +371,11 @@ void Foam::InjectionModel<CloudType>::inject(TrackData& td)
         return;
     }
 
-    // Particle density given by constant properties
-    const scalar rho = td.constProps().rho0();
-
     // Volume fraction to introduce during this timestep
     const scalar volFraction = volumeFraction(newVolume);
 
     // Duration of injection period during this timestep
-    const scalar deltaT = min
-    (
-        continuousDt,
-        min(time - SOI_, timeEnd() - time0_)
-    );
+    const scalar deltaT = min(carrierDt, min(time - SOI_, timeEnd() - time0_));
 
     // Pad injection time if injection starts during this timestep
     const scalar padTime = max(0.0, SOI_ - time0_);
@@ -383,44 +384,56 @@ void Foam::InjectionModel<CloudType>::inject(TrackData& td)
     label parcelsAdded = 0;
     for (label parcelI=0; parcelI<newParcels; parcelI++)
     {
-        // Calculate the pseudo time of injection for parcel 'parcelI'
-        scalar timeInj = time0_ + padTime + deltaT*parcelI/newParcels;
-
-        // Determine the injection position and owner cell
-        label cellI = -1;
-        vector pos = vector::zero;
-        setPositionAndCell(parcelI, timeInj, pos, cellI);
-
-        if (cellI > -1)
+        if (validInjection(parcelI))
         {
-            if (validInjection(parcelI))
-            {
-                // Diameter of parcels
-                scalar d = d0(parcelI, timeInj);
+            // Calculate the pseudo time of injection for parcel 'parcelI'
+            scalar timeInj = time0_ + padTime + deltaT*parcelI/newParcels;
 
-                // Number of particles per parcel
-                scalar nP = setNumberOfParticles
-                (
-                    newParcels,
-                    newVolume,
-                    volFraction,
-                    d,
-                    rho
-                );
-
-                // Velocity of parcels
-                vector U = velocity(parcelI, timeInj);
+            // Determine the injection position and owner cell
+            label cellI = -1;
+            vector pos = vector::zero;
+            setPositionAndCell(parcelI, timeInj, pos, cellI);
 
+            if (cellI > -1)
+            {
                 // Lagrangian timestep
                 scalar dt = time - timeInj;
 
-                // Apply corrections for 2-D cases
+                // Apply corrections to position for 2-D cases
                 meshTools::constrainToMeshCentre(mesh, pos);
-                meshTools::constrainDirection(mesh, mesh.solutionD(), U);
+
+                // Create a new parcel
+                parcelType* pPtr = new parcelType(td.cloud(), pos, cellI);
+
+                // Assign new parcel properties in injection model
+                setProperties(parcelI, timeInj, pPtr);
+
+                // Check new parcel properties
+                td.cloud().checkParcelProperties(pPtr, dt, fullyDescribed());
+
+                // Apply correction to velocity for 2-D cases
+                meshTools::constrainDirection
+                (
+                    mesh,
+                    mesh.solutionD(),
+                    pPtr->U()
+                );
+
+                // Number of particles per parcel
+                pPtr->nParticle() =
+                    setNumberOfParticles
+                    (
+                        newParcels,
+                        newVolume,
+                        volFraction,
+                        pPtr->d(),
+                        pPtr->rho()
+                    );
 
                 // Add the new parcel
-                td.cloud().addNewParcel(pos, cellI, d, U, nP, dt);
-                massInjected_ += nP*rho*mathematicalConstant::pi*pow3(d)/6.0;
+                td.cloud().addParticle(pPtr);
+
+                massInjected_ += pPtr->nParticle()*pPtr->mass();
                 parcelsAdded++;
             }
         }
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H
index b18f1b0dceb5dea2e70797933c1890761dd32ed8..6e612194e3ad4d6edad281c6b6d5d5110e8ccbf5 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H
@@ -93,6 +93,9 @@ protected:
 
     // Protected data
 
+        //- Convenience typedef for parcel type
+        typedef typename CloudType::parcelType parcelType;
+
         // Global injection properties
 
             //- Start of injection [s]
@@ -132,14 +135,14 @@ protected:
 
     // Protected member functions
 
-        //- Number of parcels to introduce over the time step
+        //- Number of parcels to introduce over the time step relative to SOI
         virtual label parcelsToInject
         (
             const scalar time0,
             const scalar time1
         ) const = 0;
 
-        //- Volume of parcels to introduce over the time step
+        //- Volume of parcels to introduce over the time step relative to SOI
         virtual scalar volumeToInject
         (
             const scalar time0,
@@ -153,8 +156,7 @@ protected:
         //- Determine properties for next time step/injection interval
         virtual void prepareForNextTimeStep
         (
-            const scalar time0,
-            const scalar time1,
+            const scalar time,
             label& newParcels,
             scalar& newVolume
         );
@@ -291,6 +293,15 @@ public:
                 label& cellOwner
             ) = 0;
 
+            virtual void setProperties
+            (
+                const label parcelI,
+                const scalar time,
+                typename CloudType::parcelType* pPtr
+            ) = 0;
+
+            virtual bool fullyDescribed() const = 0;
+/*
             //- Return the velocity of the parcel to introduce at a time
             virtual vector velocity
             (
@@ -304,6 +315,7 @@ public:
                 const label parcelI,
                 const scalar time
             ) const = 0;
+*/
 };
 
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C
index 6d71828c237ca36ed0bc29e3b22e1db97a47adb7..f7da4915a2491f2d98c4a0106201bcbeb10762c8 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.C
@@ -130,7 +130,7 @@ template<class CloudType>
 Foam::scalar Foam::ManualInjection<CloudType>::timeEnd() const
 {
     // Not used
-    return 0.0;
+    return this->SOI_;
 }
 
 
@@ -149,24 +149,18 @@ void Foam::ManualInjection<CloudType>::setPositionAndCell
 
 
 template<class CloudType>
-Foam::vector Foam::ManualInjection<CloudType>::velocity
+void Foam::ManualInjection<CloudType>::setProperties
 (
-    const label,
-    const scalar
+    const label parcelI,
+    const scalar,
+    typename CloudType::parcelType* pPtr
 )
 {
-    return U0_;
-}
+    // set particle velocity
+    pPtr->U() = U0_;
 
-
-template<class CloudType>
-Foam::scalar Foam::ManualInjection<CloudType>::d0
-(
-    const label parcelI,
-    const scalar
-) const
-{
-    return diameters_[parcelI];
+    // set particle diameter
+    pPtr->d() = diameters_[parcelI];
 }
 
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H
index 6b3988abcaa8298f91bba55bbe9d4607b3e3f1aa..327ec83ce2380c93b8c9100426ec9590dcfb43ea 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/ManualInjection/ManualInjection.H
@@ -85,14 +85,14 @@ protected:
 
     // Protected member functions
 
-        //- Number of parcels to introduce over the time step
+        //- Number of parcels to introduce over the time step relative to SOI
         label parcelsToInject
         (
             const scalar time0,
             const scalar time1
         ) const;
 
-        //- Volume of parcels to introduce over the time step
+        //- Volume of parcels to introduce over the time step relative to SOI
         scalar volumeToInject
         (
             const scalar time0,
@@ -132,7 +132,7 @@ public:
         // Injection geometry
 
             //- Set the injection position and owner cell
-            void setPositionAndCell
+            virtual void setPositionAndCell
             (
                 const label parcelI,
                 const scalar time,
@@ -140,23 +140,21 @@ public:
                 label& cellOwner
             );
 
-            //- Return the velocity of the parcel to introduce at a time
-            vector velocity
+            virtual void setProperties
             (
                 const label parcelI,
-                const scalar time
+                const scalar time,
+                typename CloudType::parcelType* pPtr
             );
 
-            //- Return the diameter of the parcel to introduce at a time
-            scalar d0
-            (
-                const label parcelI,
-                const scalar time
-            ) const;
+            virtual bool fullyDescribed() const
+            {
+                return false;
+            }
 
             //- Return flag to identify whether or not injection in cellI is
             //  permitted
-            bool validInjection(const label parcelI);
+            virtual bool validInjection(const label parcelI);
 };
 
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C
index 5e51bc26a9ee1c3a8c392dc9248df4287d90fb06..d2936b3cbec49d0f5d0a2199bc240c29dc9255e5 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.C
@@ -99,24 +99,18 @@ void Foam::NoInjection<CloudType>::setPositionAndCell
 
 
 template<class CloudType>
-Foam::vector Foam::NoInjection<CloudType>::velocity
+void Foam::NoInjection<CloudType>::setProperties
 (
-    const label,
-    const scalar
+    const label parcelI,
+    const scalar,
+    typename CloudType::parcelType* pPtr
 )
 {
-    return vector::zero;
-}
-
+    // set particle velocity
+    pPtr->U() = vector::zero;
 
-template<class CloudType>
-Foam::scalar Foam::NoInjection<CloudType>::d0
-(
-    const label,
-    const scalar
-) const
-{
-    return 0.0;
+    // set particle diameter
+    pPtr->d() = 0.0;
 }
 
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H
index e05790a64e928e90e3d00e8d7c3326cf97e5f3e9..fef47e00b336ce9fbf38895636f1a923d53fcd71 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/NoInjection/NoInjection.H
@@ -56,14 +56,14 @@ protected:
 
     // Protected member functions
 
-        //- Number of parcels to introduce over the time step
+        //- Number of parcels to introduce over the time step relative to SOI
         label parcelsToInject
         (
             const scalar,
             const scalar
         ) const;
 
-        //- Volume of parcels to introduce over the time step
+        //- Volume of parcels to introduce over the time step relative to SOI
         scalar volumeToInject
         (
             const scalar,
@@ -103,7 +103,7 @@ public:
         // Injection geometry
 
             //- Set the injection position and owner cell
-            void setPositionAndCell
+            virtual void setPositionAndCell
             (
                 const label parcelI,
                 const scalar time,
@@ -111,19 +111,17 @@ public:
                 label& cellOwner
             );
 
-            //- Return the velocity of the parcel to introduce at a time
-            vector velocity
+            virtual void setProperties
             (
                 const label parcelI,
-                const scalar time
+                const scalar time,
+                typename CloudType::parcelType* pPtr
             );
 
-            //- Return the diameter of the parcel to introduce at a time
-            scalar d0
-            (
-                const label parcelI,
-                const scalar time
-            ) const;
+            virtual bool fullyDescribed() const
+            {
+                return false;
+            }
 
             //- Return flag to identify whether or not injection in cellI is
             //  permitted