diff --git a/examples/Makefile.am b/examples/Makefile.am
index 9708f27ed737f34bc9bb425d4b6bb0529b8feb8a..caafe527c1d15e0caba4b131923870b143b49b16 100644
--- a/examples/Makefile.am
+++ b/examples/Makefile.am
@@ -23,7 +23,7 @@ AUTOMAKE_OPTIONS=gnu
 AM_CFLAGS = -g -O3 -Wall -Werror -I../src -ffast-math -fstrict-aliasing \
     -ftree-vectorize -funroll-loops $(SIMD_FLAGS) $(OPENMP_CFLAGS) \
     -DCPU_TPS=2.67e9 -DTIMERS \
-    # -fsanitize=address -fno-omit-frame-pointer
+    #-fsanitize=address -fno-omit-frame-pointer
 
 AM_LDFLAGS = -lm # -fsanitize=address
 
diff --git a/examples/test_bh_sorted.c b/examples/test_bh_sorted.c
index 414902e436d7dcb1ab1be5b429dc6b7485b2e14c..5aa8ea25d495ab3c59f09fe56cf2483aba7bbc66 100644
--- a/examples/test_bh_sorted.c
+++ b/examples/test_bh_sorted.c
@@ -38,7 +38,7 @@
 /* Some local constants. */
 #define cell_pool_grow 1000
 #define cell_maxparts 16
-#define task_limit 5000000
+#define task_limit 5000
 #define const_G 6.6738e-8
 #define dist_min 0.5  /* Used fpr legacy walk only */
 #define iact_pair_direct iact_pair_direct_unsorted
@@ -1116,6 +1116,8 @@ void create_tasks(struct qsched *s, struct cell *ci, struct cell *cj) {
 
   int k;
   qsched_task_t tid;
+  double center_i[3], center_j[3], dx[3];
+  double min_dist, cih, cjh;
   struct cell *data[2], *cp, *cps;
 
   /* If either cell is empty, stop. */
@@ -1161,20 +1163,23 @@ void create_tasks(struct qsched *s, struct cell *ci, struct cell *cj) {
     /* Otherwise, it's a pair. */
   } else {
 
-    double dx, r2 = 0.0, r2_i = 0.0, r2_j = 0.0;
+    cih = ci->h;
+    cjh = cj->h;
 
-    /* Distance between the cells */
-    for (k = 0; k < 3; k++) {
-      dx = fabs(ci->loc[k] - cj->loc[k]);
+    /* Cell centers */
+    for (k = 0; k < 3; k++) center_i[k] = ci->loc[k] + 0.5 * cih;
+    for (k = 0; k < 3; k++) center_j[k] = cj->loc[k] + 0.5 * cjh;
 
-      r2 += dx * dx;
-      r2_i += (dx - 0.5 * ci->h) * (dx - 0.5 * ci->h);
-      r2_j += (dx - 0.5 * cj->h) * (dx - 0.5 * cj->h);
+    /* Distance between the cell centers */
+    for (k = 0; k < 3; k++) {
+      dx[k] = fabs(center_i[k] - center_j[k]);
     }
+ 
+    min_dist = cih + cjh;
+
+    /* Are the cells NOT neighbours ? */
+    if( ( dx[0] > min_dist ) || ( dx[1] > min_dist ) || ( dx[2] > min_dist ) ) {
 
-    /* Check whether we can use the multipoles. */
-    if ((dist_min * dist_min * r2_j > ci->h * ci->h) &&
-        (dist_min * dist_min * r2_i > cj->h * cj->h)) {
       data[0] = ci;
       data[1] = cj;
       tid = qsched_addtask(s, task_type_pair_pc, task_flag_none, data,
@@ -1189,73 +1194,94 @@ void create_tasks(struct qsched *s, struct cell *ci, struct cell *cj) {
       qsched_addlock(s, tid, cj->res);
       qsched_addunlock(s, ci->com_tid, tid);
 
-      /* Otherwise, if neither cells are split, generate a part-part task. */
-    } else if (!ci->split && !cj->split) {
-
-      /* Set the data. */
-      data[0] = ci;
-      data[1] = cj;
-
-      /* Create the task. */
-      tid = qsched_addtask(s, task_type_pair_direct, task_flag_none, data,
-                           sizeof(struct cell *) * 2, ci->count * cj->count);
-
-      /* Add the resources. */
-      qsched_addlock(s, tid, ci->res);
-      qsched_addlock(s, tid, cj->res);
-
-      /* Otherwise, compute the interaction recursively over the progeny. */
-    } else if (ci->count > task_limit && cj->count > task_limit) {
-
-      /* We can split one of the two cells. Let's try the biggest one */
-      if (ci->h > cj->h) {
-
-        if (ci->split) {
-          for (cp = ci->firstchild; cp != ci->sibling; cp = cp->sibling)
-            create_tasks(s, cp, cj);
-        } else if (cj->split) {
-          for (cp = cj->firstchild; cp != cj->sibling; cp = cp->sibling)
-            create_tasks(s, ci, cp);
-        }
-
-      } else {
-
-        if (cj->split) {
-          for (cp = cj->firstchild; cp != cj->sibling; cp = cp->sibling)
-            create_tasks(s, ci, cp);
-        } else if (ci->split) {
-          for (cp = ci->firstchild; cp != ci->sibling; cp = cp->sibling)
-            create_tasks(s, cp, cj);
-        }
+    }
+    else {     /* Cells are direct neighbours */
+
+      /* Are both cells split ? */
+      if ( ci->split && cj->split ) {
+
+      	if ( ci->count > task_limit && cj->count > task_limit )
+      	  {
+
+      	    /* We can split one of the two cells. Let's try the biggest one.*/
+      	    if (cih > cjh) {
+      	      for (cp = ci->firstchild; cp != ci->sibling; cp = cp->sibling)
+      		create_tasks(s, cp, cj);
+      	    } else {
+      	      for (cp = cj->firstchild; cp != cj->sibling; cp = cp->sibling)
+      		create_tasks(s, ci, cp);
+      	    }
+      	  }
+      	else
+      	  {
+
+      	    if (cih > cjh) {
+      	      for (cp = ci->firstchild; cp != ci->sibling; cp = cp->sibling) {
+
+      		/* Set the data. */
+      		data[0] = cp;
+      		data[1] = cj;
+		
+      		/* Create the task. */
+      		tid = qsched_addtask(s, task_type_pair, task_flag_none, data,
+      				     sizeof(struct cell *) * 2, cp->count * cj->count);
+
+      		/* Add the resources. */
+      		qsched_addlock(s, tid, cp->res);
+      		qsched_addlock(s, tid, cj->res);
+
+      		/* Depend on the COMs in case this task recurses. */
+      		if (cp->split || cj->split) {
+      		  qsched_addunlock(s, cp->com_tid, tid);
+      		  qsched_addunlock(s, cj->com_tid, tid);
+      		}
+      	      }
+      	    } else {
+      	      for (cp = cj->firstchild; cp != cj->sibling; cp = cp->sibling) {
+
+      		/* Set the data. */
+      		data[0] = ci;
+      		data[1] = cp;
+		
+      		/* Create the task. */
+      		tid = qsched_addtask(s, task_type_pair, task_flag_none, data,
+      				     sizeof(struct cell *) * 2, ci->count * cp->count);
+
+      		/* Add the resources. */
+      		qsched_addlock(s, tid, ci->res);
+      		qsched_addlock(s, tid, cp->res);
+
+      		/* Depend on the COMs in case this task recurses. */
+      		if (ci->split || cp->split) {
+      		  qsched_addunlock(s, ci->com_tid, tid);
+      		  qsched_addunlock(s, cp->com_tid, tid);
+      		}
+      	      }
+      	    }
+      	  }
       }
+      else { /* Ok one of the cells is not split */
 
-      /* Create a task if too few particles */
-    } else {
-      /* Set the data. */
-      data[0] = ci;
-      data[1] = cj;
 
-      /* Create the task. */
-      tid = qsched_addtask(s, task_type_pair, task_flag_none, data,
-                           sizeof(struct cell *) * 2, ci->count * cj->count);
+	/* Set the data. */
+	data[0] = ci;
+	data[1] = cj;
 
-      /* Add the resources. */
-      qsched_addlock(s, tid, ci->res);
-      qsched_addlock(s, tid, cj->res);
+	/* Create the task. */
+	tid = qsched_addtask(s, task_type_pair_direct, task_flag_none, data,
+			     sizeof(struct cell *) * 2, ci->count * cj->count);
+	
+	/* Add the resources. */
+	qsched_addlock(s, tid, ci->res);
+	qsched_addlock(s, tid, cj->res);
 
-      /* Depend on the COMs in case this task recurses. */
-      if (ci->split || cj->split) {
-        qsched_addunlock(s, ci->com_tid, tid);
-        qsched_addunlock(s, cj->com_tid, tid);
       }
-    }
-
-  } /* otherwise, it's a pair. */
+    }   /* Cells are direct neighbours */
+  } /* Otherwise it's a pair */
 }
 
 
 
-
 /* -------------------------------------------------------------------------- */
 /* Legacy tree walk */
 /* -------------------------------------------------------------------------- */