diff --git a/src/pairs/sim/cell_lists.py b/src/pairs/sim/cell_lists.py
index 697ab87644d913580bc70800e7c937ce34f47f0e..ca12ff24db7e8f5b226a4a274c096c7fea6779d5 100644
--- a/src/pairs/sim/cell_lists.py
+++ b/src/pairs/sim/cell_lists.py
@@ -46,7 +46,6 @@ class BuildCellListsStencil(Lowerable):
     def lower(self):
         sim = self.sim
         cl = self.cell_lists
-        grid = sim.grid
         index = None
         ntotal_cells = 1
 
@@ -54,7 +53,9 @@ class BuildCellListsStencil(Lowerable):
         sim.check_resize(cl.ncells_capacity, cl.ncells)
 
         for d in range(sim.ndims()):
-            Assign(sim, cl.dim_ncells[d], Ceil(sim, (grid.max(d) - grid.min(d)) / cl.spacing[d]) + 2)
+            dmin = sim.grid.min(d) - cl.spacing[d]
+            dmax = sim.grid.max(d) + cl.spacing[d]
+            Assign(sim, cl.dim_ncells[d], Ceil(sim, (dmax - dmin) / cl.spacing[d]) + 1)
             ntotal_cells *= cl.dim_ncells[d]
 
         Assign(sim, cl.ncells, ntotal_cells + 1)
@@ -66,7 +67,7 @@ class BuildCellListsStencil(Lowerable):
                 nneigh = cl.nneighbor_cells[d]
 
                 for d_idx in For(sim, -nneigh, nneigh + 1):
-                    index = (d_idx if index is None else index * cl.dim_ncells[d - 1] + d_idx)
+                    index = (d_idx if index is None else index + cl.dim_ncells[d - 1] * d_idx)
                     if d == sim.ndims() - 1:
                         Assign(sim, cl.stencil[cl.nstencil], index)
                         Assign(sim, cl.nstencil, cl.nstencil + 1)
@@ -81,7 +82,6 @@ class BuildCellLists(Lowerable):
     def lower(self):
         sim = self.sim
         cl = self.cell_lists
-        grid = sim.grid
         particle_flags = sim.particle_flags
         positions = sim.position()
         sim.module_name("build_cell_lists")
@@ -94,11 +94,13 @@ class BuildCellLists(Lowerable):
             flat_index = sim.add_temp_var(0)
 
             for _ in Filter(sim, ASTTerm.not_op(particle_flags[i] & Flags.Infinite)):
-                cell_index = [Cast.int(sim, (positions[i][d] - grid.min(d)) / cl.spacing[d]) for d in range(sim.ndims())]
+                cell_index = [
+                    Cast.int(sim, (positions[i][d] - (sim.grid.min(d) - cl.spacing[d])) / cl.spacing[d]) \
+                    for d in range(sim.ndims())]
                 index_1d = None
 
                 for d in range(sim.ndims()):
-                    index_1d = (cell_index[d] if index_1d is None else index_1d * cl.dim_ncells[d] + cell_index[d])
+                    index_1d = (cell_index[d] if index_1d is None else index_1d + cl.dim_ncells[d - 1] * cell_index[d])
 
                 Assign(sim, flat_index, index_1d + 1)
 
diff --git a/src/pairs/sim/simulation.py b/src/pairs/sim/simulation.py
index 302868cf6d3e3c29de2a23c2c36d51b3fafa94d0..0f130671a2fd7494a8deac6f802f70d112b6cf21 100644
--- a/src/pairs/sim/simulation.py
+++ b/src/pairs/sim/simulation.py
@@ -303,10 +303,11 @@ class Simulation:
             (comm.exchange(), self.reneighbor_frequency),
             (comm.borders(), comm.synchronize(), self.reneighbor_frequency),
             (BuildCellLists(self, self.cell_lists), self.reneighbor_frequency),
-            (PartitionCellLists(self, self.cell_lists), self.reneighbor_frequency),
-            (BuildNeighborLists(self, self.neighbor_lists), self.reneighbor_frequency),
+            (PartitionCellLists(self, self.cell_lists), self.reneighbor_frequency)
         ]
 
+        if self.neighbor_lists is not None:
+            timestep_procedures.append((BuildNeighborLists(self, self.neighbor_lists), self.reneighbor_frequency))
         if self._use_contact_history:
             timestep_procedures.append((BuildContactHistory(self, self._contact_history, self.cell_lists), self.reneighbor_frequency))
             timestep_procedures.append(ResetContactHistoryUsageStatus(self, self._contact_history))