diff --git a/src/lagrangian/dsmc/Make/options b/src/lagrangian/dsmc/Make/options
index 15874b7b55afc2cfae55d9550fd48451604ee3d4..55865dfabcd9146aa4fe204e71d664b62e535b95 100644
--- a/src/lagrangian/dsmc/Make/options
+++ b/src/lagrangian/dsmc/Make/options
@@ -1,7 +1,9 @@
 EXE_INC = \
     -I$(LIB_SRC)/finiteVolume/lnInclude \
-    -I$(LIB_SRC)/lagrangian/basic/lnInclude
+    -I$(LIB_SRC)/lagrangian/basic/lnInclude \
+    -I$(LIB_SRC)/meshTools/lnInclude
 
 LIB_LIBS = \
     -llagrangian \
-    -lfiniteVolume
+    -lfiniteVolume \
+    -lmeshTools
diff --git a/src/lagrangian/dsmc/parcels/Templates/DsmcParcel/DsmcParcel.C b/src/lagrangian/dsmc/parcels/Templates/DsmcParcel/DsmcParcel.C
index ffd7c67d4284e2373ec371522485b858a5076596..3742f3f8ea8dde203cdd19de4c7b89ce2a84338e 100644
--- a/src/lagrangian/dsmc/parcels/Templates/DsmcParcel/DsmcParcel.C
+++ b/src/lagrangian/dsmc/parcels/Templates/DsmcParcel/DsmcParcel.C
@@ -25,6 +25,7 @@ License
 \*---------------------------------------------------------------------------*/
 
 #include "DsmcParcel.H"
+#include "meshTools.H"
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
@@ -47,8 +48,18 @@ bool Foam::DsmcParcel<ParcelType>::move
     scalar tEnd = (1.0 - p.stepFraction())*deltaT;
     const scalar dtMax = tEnd;
 
+    // Save the velocity to re-apply it after tracking
+    vector U_save = U_;
+
+    // Apply correction to velocity to constrain tracking for
+    // reduced-D cases
+    meshTools::constrainDirection(mesh, mesh.solutionD(), U_);
+
     while (td.keepParticle && !td.switchProcessor && tEnd > ROOTVSMALL)
     {
+        // Apply correction to position for reduced-D cases
+        meshTools::constrainToMeshCentre(mesh, p.position());
+
         // Set the Lagrangian time-step
         scalar dt = min(dtMax, tEnd);
 
@@ -67,6 +78,9 @@ bool Foam::DsmcParcel<ParcelType>::move
         }
     }
 
+    // Restore the correct value of velocity
+    U_ = U_save;
+
     return td.keepParticle;
 }