diff --git a/src/cell.c b/src/cell.c
index 9780f30943cb4bd42ac779e43592bfb66e679a17..d8d6ba67f209c63d0a2cbad0b6e635e3491eafcb 100644
--- a/src/cell.c
+++ b/src/cell.c
@@ -1338,17 +1338,21 @@ void cell_activate_subcell_tasks(struct cell *ci, struct cell *cj,
     if (!cell_is_active(ci, e)) return;
 
     /* Recurse? */
-    if (ci->split) {
-      for (int j = 0; j < 8; j++)
+    if (cell_can_recurse_in_self_task(ci)) {
+
+      /* Loop over all progenies and pairs of progenies */
+      for (int j = 0; j < 8; j++) {
         if (ci->progeny[j] != NULL) {
           cell_activate_subcell_tasks(ci->progeny[j], NULL, s);
           for (int k = j + 1; k < 8; k++)
             if (ci->progeny[k] != NULL)
               cell_activate_subcell_tasks(ci->progeny[j], ci->progeny[k], s);
         }
+      }
+    } else {
 
-      /* Activate drift task, if it is present. */
-      if (ci->drift_part != NULL) scheduler_activate(s, ci->drift_part);
+      /* We have reached the bottom of the tree: activate drift */
+      scheduler_activate(s, ci->drift_part);
     }
   }
 
@@ -1558,7 +1562,7 @@ void cell_activate_subcell_tasks(struct cell *ci, struct cell *cj,
 
   }
 
-  /* Otherwise, activate the sorts. */
+  /* Otherwise, activate the sorts and drifts. */
   else if (cell_is_active(ci, e) || cell_is_active(cj, e)) {
 
     /* Get the type of pair if not specified explicitly. */
@@ -1575,7 +1579,10 @@ void cell_activate_subcell_tasks(struct cell *ci, struct cell *cj,
     if (ci->nodeID == engine_rank) scheduler_activate(s, ci->drift_part);
     if (cj->nodeID == engine_rank) scheduler_activate(s, cj->drift_part);
 
+    /* Do we need to sort ci ? */
     if (ci->dx_max_sort > space_maxreldx * ci->dmin) {
+
+      /* Climb up the tree to active the sorts in that direction */
       for (struct cell *finger = ci; finger != NULL; finger = finger->parent) {
         if (finger->requires_sorts == ti_current) {
           atomic_or(&finger->sorts->flags, finger->sorted);
@@ -1588,7 +1595,11 @@ void cell_activate_subcell_tasks(struct cell *ci, struct cell *cj,
       atomic_or(&ci->sorts->flags, (1 << sid));
       scheduler_activate(s, ci->sorts);
     }
+
+    /* Do we need to sort cj ? */
     if (cj->dx_max_sort > space_maxreldx * cj->dmin) {
+
+      /* Climb up the tree to active the sorts in that direction */
       for (struct cell *finger = cj; finger != NULL; finger = finger->parent) {
         if (finger->requires_sorts == ti_current) {
           atomic_or(&finger->sorts->flags, finger->sorted);