diff --git a/src/lagrangian/intermediate/Make/files b/src/lagrangian/intermediate/Make/files
index a9577d66cf..7cbe15fe5c 100644
--- a/src/lagrangian/intermediate/Make/files
+++ b/src/lagrangian/intermediate/Make/files
@@ -19,6 +19,10 @@ KINEMATICPARCEL=$(DERIVEDPARCELS)/basicKinematicParcel
$(KINEMATICPARCEL)/defineBasicKinematicParcel.C
$(KINEMATICPARCEL)/makeBasicKinematicParcelSubmodels.C
+KINEMATICCOLLIDINGPARCEL=$(DERIVEDPARCELS)/basicKinematicCollidingParcel
+$(KINEMATICCOLLIDINGPARCEL)/defineBasicKinematicCollidingParcel.C
+$(KINEMATICCOLLIDINGPARCEL)/makeBasicKinematicCollidingParcelSubmodels.C
+
/* thermo parcel sub-models */
THERMOPARCEL=$(DERIVEDPARCELS)/basicThermoParcel
diff --git a/src/lagrangian/intermediate/clouds/Templates/CollidingCloud/CollidingCloud.C b/src/lagrangian/intermediate/clouds/Templates/CollidingCloud/CollidingCloud.C
new file mode 100644
index 0000000000..d6b6c9b0ca
--- /dev/null
+++ b/src/lagrangian/intermediate/clouds/Templates/CollidingCloud/CollidingCloud.C
@@ -0,0 +1,209 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2011-2011 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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "CollidingCloud.H"
+#include "CollisionModel.H"
+
+// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * //
+
+template
+void Foam::CollidingCloud::setModels()
+{
+ collisionModel_.reset
+ (
+ CollisionModel >::New
+ (
+ this->subModelProperties(),
+ *this
+ ).ptr()
+ );
+}
+
+
+template
+template
+void Foam::CollidingCloud::moveCollide(TrackData& td)
+{
+ td.part() = TrackData::tpVelocityHalfStep;
+ CloudType::move(td, this->solution().deltaT());
+
+ td.part() = TrackData::tpLinearTrack;
+ CloudType::move(td, this->solution().deltaT());
+
+ // td.part() = TrackData::tpRotationalTrack;
+ // CloudType::move(td);
+
+ this->updateCellOccupancy();
+
+ this->collision().collide();
+
+ td.part() = TrackData::tpVelocityHalfStep;
+ CloudType::move(td, this->solution().deltaT());
+}
+
+
+
+template
+void Foam::CollidingCloud::cloudReset(CollidingCloud& c)
+{
+ CloudType::cloudReset(c);
+
+ collisionModel_.reset(c.collisionModel_.ptr());
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+template
+Foam::CollidingCloud::CollidingCloud
+(
+ const word& cloudName,
+ const volScalarField& rho,
+ const volVectorField& U,
+ const volScalarField& mu,
+ const dimensionedVector& g,
+ bool readFields
+)
+:
+ CloudType(cloudName, rho, U, mu, g, false),
+ collisionModel_(NULL)
+{
+ if (this->solution().active())
+ {
+ setModels();
+ }
+
+ if (readFields)
+ {
+ parcelType::readFields(*this);
+ }
+}
+
+
+template
+Foam::CollidingCloud::CollidingCloud
+(
+ CollidingCloud& c,
+ const word& name
+)
+:
+ CloudType(c, name),
+ collisionModel_(c.collisionModel_->clone())
+{}
+
+
+template
+Foam::CollidingCloud::CollidingCloud
+(
+ const fvMesh& mesh,
+ const word& name,
+ const CollidingCloud& c
+)
+:
+ CloudType(mesh, name, c),
+ collisionModel_(NULL)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+template
+Foam::CollidingCloud::~CollidingCloud()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+template
+void Foam::CollidingCloud::storeState()
+{
+ cloudCopyPtr_.reset
+ (
+ static_cast*>
+ (
+ clone(this->name() + "Copy").ptr()
+ )
+ );
+}
+
+
+template
+void Foam::CollidingCloud::restoreState()
+{
+ cloudReset(cloudCopyPtr_());
+ cloudCopyPtr_.clear();
+}
+
+
+template
+void Foam::CollidingCloud::evolve()
+{
+ if (this->solution().canEvolve())
+ {
+ typename parcelType::template
+ TrackingData > td(*this);
+
+ this->solve(td);
+ }
+}
+
+
+template
+template
+void Foam::CollidingCloud::motion(TrackData& td)
+{
+ // Sympletic leapfrog integration of particle forces:
+ // + apply half deltaV with stored force
+ // + move positions with new velocity
+ // + calculate forces in new position
+ // + apply half deltaV with new force
+
+ label nSubCycles = collision().nSubCycles();
+
+ if (nSubCycles > 1)
+ {
+ Info<< " " << nSubCycles << " move-collide subCycles" << endl;
+
+ subCycleTime moveCollideSubCycle
+ (
+ const_cast