diff --git a/src/pairs/mapping/keywords.py b/src/pairs/mapping/keywords.py
index 9cc16f1c12f11b58cddc0c404d81a53b84cc75ad..64d8f2ca25af4381b2f5e4dc936fdac91e4ef856 100644
--- a/src/pairs/mapping/keywords.py
+++ b/src/pairs/mapping/keywords.py
@@ -79,6 +79,7 @@ class Keywords:
         length = self.keyword_length([vector])
         inv_length = Lit(self.sim, 1.0) / length
         return Select(self.sim, length > Lit(self.sim, 0.0), vector * inv_length, ZeroVector(self.sim))
+        #return vector * inv_length
 
     def keyword_squared_length(self, args):
         assert len(args) == 1, "length() keyword requires one parameter!"
diff --git a/src/pairs/sim/cell_lists.py b/src/pairs/sim/cell_lists.py
index 9bb616b0ab38a450c24b40b4d3a266ab6fc83ff4..955f6227aab46ccc9b31247b71432ae21bfaeadb 100644
--- a/src/pairs/sim/cell_lists.py
+++ b/src/pairs/sim/cell_lists.py
@@ -122,18 +122,20 @@ class PartitionCellLists(Lowerable):
             end = self.sim.add_temp_var(0)
 
             for shape in For(self.sim, 0, self.sim.max_shapes()):
+                shape_start = self.sim.add_temp_var(start)
                 Assign(self.sim, end, self.cell_lists.cell_sizes[cell] - 1)
 
-                for _ in While(self.sim, start < end):
+                for _ in While(self.sim, start <= end):
                     particle = cell_particles[cell][start]
 
                     for unmatch in Branch(self.sim, ScalarOp.neq(self.sim.particle_shape[particle], shape)):
                         if unmatch:
-                            Assign(self.sim, cell_particles[cell][start], cell_particles[cell][end])
-                            Assign(self.sim, cell_particles[cell][end], particle)
+                            for _ in Filter(self.sim, ScalarOp.neq(start, end)):
+                                Assign(self.sim, cell_particles[cell][start], cell_particles[cell][end])
+                                Assign(self.sim, cell_particles[cell][end], particle)
+
                             Assign(self.sim, end, end - 1)
 
                         else:
                             Assign(self.sim, start, start + 1)
-
-                    Assign(self.sim, self.cell_lists.nshapes[cell][shape], start)
+                            Assign(self.sim, self.cell_lists.nshapes[cell][shape], start - shape_start)
diff --git a/src/pairs/sim/pbc.py b/src/pairs/sim/pbc.py
index af5fec1516b8aa485adbbcd8f578cd93bbb6ccea..1cdfd436e71b1ae4e289326e67f60f2ff0634c3a 100644
--- a/src/pairs/sim/pbc.py
+++ b/src/pairs/sim/pbc.py
@@ -20,12 +20,16 @@ class EnforcePBC(Lowerable):
         positions = sim.position()
         sim.module_name("enforce_pbc")
 
+        # Particles with one of the following flags are ignored
+        flags_to_exclude = (Flags.Infinite | Flags.Fixed | Flags.Global)
+
         for i in ParticleFor(sim):
-            # TODO: VecFilter?
-            for d in range(0, ndims):
-                if sim._pbc[d] is True:
-                    for _ in Filter(sim, positions[i][d] < grid.min(d)):
-                        Assign(sim, positions[i][d], positions[i][d] + grid.length(d)) 
+            for _ in Filter(self.sim, ScalarOp.cmp(self.sim.particle_flags[i] & flags_to_exclude, 0)):
+                # TODO: VecFilter?
+                for d in range(0, ndims):
+                    if sim._pbc[d] is True:
+                        for _ in Filter(sim, positions[i][d] < grid.min(d)):
+                            Assign(sim, positions[i][d], positions[i][d] + grid.length(d))
 
-                    for _ in Filter(sim, positions[i][d] > grid.max(d)):
-                        Assign(sim, positions[i][d], positions[i][d] - grid.length(d)) 
+                        for _ in Filter(sim, positions[i][d] > grid.max(d)):
+                            Assign(sim, positions[i][d], positions[i][d] - grid.length(d))