diff --git a/src/engine.c b/src/engine.c
index 62d9da4e05c16fb04c1693920bd3175572e9f8f5..4ad4d31d87b31907928e0c35a0c2a34f2cc29584 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -2374,7 +2374,19 @@ void engine_make_self_gravity_tasks_mapper(void *map_data, int num_elements,
   /* Compute how many cells away we need to walk */
   const double distance = 2.5 * cells[0].width[0] / theta_crit;
   int delta = (int)(distance / cells[0].width[0]) + 1;
-  if (delta >= cdim[0] / 2) delta = cdim[0] / 2;
+  int delta_m = delta;
+  int delta_p = delta;
+
+  /* Special case where every cell is in range of every other one */
+  if(delta >= cdim[0] / 2) {
+    if(cdim[0] % 2 == 0) {
+      delta_m = cdim[0] / 2;
+      delta_p = cdim[0] / 2 - 1;
+    } else {
+      delta_m = cdim[0] / 2;
+      delta_p = cdim[0] / 2;
+    }
+  }
 
   /* Loop through the elements, which are just byte offsets from NULL. */
   for (int ind = 0; ind < num_elements; ind++) {
@@ -2415,19 +2427,19 @@ void engine_make_self_gravity_tasks_mapper(void *map_data, int num_elements,
 #endif
 
     /* Loop over every other cell within (Manhattan) range delta */
-    for (int x = -delta; x <= delta; x++) {
+    for (int x = -delta_m; x <= delta_p; x++) {
       int ii = i + x;
       if (ii >= cdim[0])
         ii -= cdim[0];
       else if (ii < 0)
         ii += cdim[0];
-      for (int y = -delta; y <= delta; y++) {
+      for (int y = -delta_m; y <= delta_p; y++) {
         int jj = j + y;
         if (jj >= cdim[1])
           jj -= cdim[1];
         else if (jj < 0)
           jj += cdim[1];
-        for (int z = -delta; z <= delta; z++) {
+        for (int z = -delta_m; z <= delta_p; z++) {
           int kk = k + z;
           if (kk >= cdim[2])
             kk -= cdim[2];