diff --git a/src/cell.c b/src/cell.c
index 6ad7e4d97e754e98a4ab0eeb76a188ed6bea7c73..cc77f9c94bcf37db3e99ec9ab19a58c938279949 100644
--- a/src/cell.c
+++ b/src/cell.c
@@ -1625,8 +1625,7 @@ void cell_activate_sorts(struct cell *c, int sid, struct scheduler *s) {
 
 /**
  * @brief Traverse a sub-cell task and activate the hydro drift tasks that are
- * required
- * by a hydro task
+ * required by a hydro task
  *
  * @param ci The first #cell we recurse in.
  * @param cj The second #cell we recurse in.
@@ -1979,6 +1978,13 @@ void cell_activate_subcell_hydro_tasks(struct cell *ci, struct cell *cj,
   } /* Otherwise, pair interation */
 }
 
+/**
+ * @brief Drift the multipoles that will be used in a M-M task.
+ *
+ * @param ci The first #cell we update.
+ * @param cj The second #cell we update.
+ * @param s The task #scheduler.
+ */
 void cell_activate_grav_mm_task(struct cell *ci, struct cell *cj,
                                 struct scheduler *s) {
   /* Some constants */
@@ -2076,8 +2082,8 @@ void cell_activate_subcell_grav_tasks(struct cell *ci, struct cell *cj,
     else {
 
       /* Recover the multipole information */
-      struct gravity_tensors *const multi_i = ci->multipole;
-      struct gravity_tensors *const multi_j = cj->multipole;
+      const struct gravity_tensors *const multi_i = ci->multipole;
+      const struct gravity_tensors *const multi_j = cj->multipole;
       const double ri_max = multi_i->r_max;
       const double rj_max = multi_j->r_max;
 
@@ -2369,6 +2375,7 @@ int cell_unskip_gravity_tasks(struct cell *c, struct scheduler *s) {
     /* Only activate tasks that involve a local active cell. */
     if ((ci_active && ci_nodeID == nodeID) ||
         (cj_active && cj_nodeID == nodeID)) {
+
       scheduler_activate(s, t);
 
       /* Set the drifting flags */
@@ -2462,12 +2469,14 @@ int cell_unskip_gravity_tasks(struct cell *c, struct scheduler *s) {
         (cj_active && cj_nodeID == nodeID)) {
 
       scheduler_activate(s, t);
+
+      /* Drift the multipoles */
       cell_activate_grav_mm_task(ci, cj, s);
     }
   }
 
   /* Unskip all the other task types. */
-  if (c->nodeID == nodeID && cell_is_active_gravity_mm(c, e)) {
+  if (c->nodeID == nodeID && cell_is_active_gravity(c, e)) {
 
     if (c->init_grav != NULL) scheduler_activate(s, c->init_grav);
     if (c->init_grav_out != NULL) scheduler_activate(s, c->init_grav_out);
diff --git a/src/engine.c b/src/engine.c
index d0acea245941462f1e747bf28de2f2fd7ae95322..6c001e8279ec0eefa88f6ff1294a91357e51c87a 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -3383,12 +3383,17 @@ void engine_marktasks_mapper(void *map_data, int num_elements,
   size_t *rebuild_space = &((size_t *)extra_data)[1];
   struct scheduler *s = (struct scheduler *)(((size_t *)extra_data)[2]);
   struct engine *e = (struct engine *)((size_t *)extra_data)[0];
+  const int nodeID = e->nodeID;
 
   for (int ind = 0; ind < num_elements; ind++) {
+
+    /* Get basic task information */
     struct task *t = &tasks[ind];
+    const enum task_types t_type = t->type;
+    const enum task_subtypes t_subtype = t->subtype;
 
     /* Single-cell task? */
-    if (t->type == task_type_self || t->type == task_type_sub_self) {
+    if (t_type == task_type_self || t_type == task_type_sub_self) {
 
       /* Local pointer. */
       struct cell *ci = t->ci;
@@ -3396,7 +3401,7 @@ void engine_marktasks_mapper(void *map_data, int num_elements,
       if (ci->nodeID != engine_rank) error("Non-local self task found");
 
       /* Activate the hydro drift */
-      if (t->type == task_type_self && t->subtype == task_subtype_density) {
+      if (t_type == task_type_self && t_subtype == task_subtype_density) {
         if (cell_is_active_hydro(ci, e)) {
           scheduler_activate(s, t);
           cell_activate_drift_part(ci, s);
@@ -3404,37 +3409,36 @@ void engine_marktasks_mapper(void *map_data, int num_elements,
       }
 
       /* Store current values of dx_max and h_max. */
-      else if (t->type == task_type_sub_self &&
-               t->subtype == task_subtype_density) {
+      else if (t_type == task_type_sub_self &&
+               t_subtype == task_subtype_density) {
         if (cell_is_active_hydro(ci, e)) {
           scheduler_activate(s, t);
           cell_activate_subcell_hydro_tasks(ci, NULL, s);
         }
       }
 
-      else if (t->type == task_type_self && t->subtype == task_subtype_force) {
+      else if (t_type == task_type_self && t_subtype == task_subtype_force) {
         if (cell_is_active_hydro(ci, e)) scheduler_activate(s, t);
       }
 
-      else if (t->type == task_type_sub_self &&
-               t->subtype == task_subtype_force) {
+      else if (t_type == task_type_sub_self &&
+               t_subtype == task_subtype_force) {
         if (cell_is_active_hydro(ci, e)) scheduler_activate(s, t);
       }
 
 #ifdef EXTRA_HYDRO_LOOP
-      else if (t->type == task_type_self &&
-               t->subtype == task_subtype_gradient) {
+      else if (t_type == task_type_self && t_subtype == task_subtype_gradient) {
         if (cell_is_active_hydro(ci, e)) scheduler_activate(s, t);
       }
 
-      else if (t->type == task_type_sub_self &&
-               t->subtype == task_subtype_gradient) {
+      else if (t_type == task_type_sub_self &&
+               t_subtype == task_subtype_gradient) {
         if (cell_is_active_hydro(ci, e)) scheduler_activate(s, t);
       }
 #endif
 
       /* Activate the gravity drift */
-      else if (t->type == task_type_self && t->subtype == task_subtype_grav) {
+      else if (t_type == task_type_self && t_subtype == task_subtype_grav) {
         if (cell_is_active_gravity(ci, e)) {
           scheduler_activate(s, t);
           cell_activate_subcell_grav_tasks(t->ci, NULL, s);
@@ -3442,8 +3446,8 @@ void engine_marktasks_mapper(void *map_data, int num_elements,
       }
 
       /* Activate the gravity drift */
-      else if (t->type == task_type_self &&
-               t->subtype == task_subtype_external_grav) {
+      else if (t_type == task_type_self &&
+               t_subtype == task_subtype_external_grav) {
         if (cell_is_active_gravity(ci, e)) {
           scheduler_activate(s, t);
           cell_activate_drift_gpart(t->ci, s);
@@ -3458,27 +3462,34 @@ void engine_marktasks_mapper(void *map_data, int num_elements,
     }
 
     /* Pair? */
-    else if (t->type == task_type_pair || t->type == task_type_sub_pair) {
+    else if (t_type == task_type_pair || t_type == task_type_sub_pair) {
 
       /* Local pointers. */
       struct cell *ci = t->ci;
       struct cell *cj = t->cj;
+#ifdef WITH_MPI
+      const int ci_nodeID = ci->nodeID;
+      const int cj_nodeID = cj->nodeID;
+#else
+      const int ci_nodeID = nodeID;
+      const int cj_nodeID = nodeID;
+#endif
       const int ci_active_hydro = cell_is_active_hydro(ci, e);
       const int cj_active_hydro = cell_is_active_hydro(cj, e);
       const int ci_active_gravity = cell_is_active_gravity(ci, e);
       const int cj_active_gravity = cell_is_active_gravity(cj, e);
 
       /* Only activate tasks that involve a local active cell. */
-      if ((t->subtype == task_subtype_density ||
-           t->subtype == task_subtype_gradient ||
-           t->subtype == task_subtype_force) &&
-          ((ci_active_hydro && ci->nodeID == engine_rank) ||
-           (cj_active_hydro && cj->nodeID == engine_rank))) {
+      if ((t_subtype == task_subtype_density ||
+           t_subtype == task_subtype_gradient ||
+           t_subtype == task_subtype_force) &&
+          ((ci_active_hydro && ci_nodeID == nodeID) ||
+           (cj_active_hydro && cj_nodeID == nodeID))) {
 
         scheduler_activate(s, t);
 
         /* Set the correct sorting flags */
-        if (t->type == task_type_pair && t->subtype == task_subtype_density) {
+        if (t_type == task_type_pair && t_subtype == task_subtype_density) {
 
           /* Store some values. */
           atomic_or(&ci->requires_sorts, 1 << t->flags);
@@ -3487,8 +3498,8 @@ void engine_marktasks_mapper(void *map_data, int num_elements,
           cj->dx_max_sort_old = cj->dx_max_sort;
 
           /* Activate the hydro drift tasks. */
-          if (ci->nodeID == engine_rank) cell_activate_drift_part(ci, s);
-          if (cj->nodeID == engine_rank) cell_activate_drift_part(cj, s);
+          if (ci_nodeID == nodeID) cell_activate_drift_part(ci, s);
+          if (cj_nodeID == nodeID) cell_activate_drift_part(cj, s);
 
           /* Check the sorts and activate them if needed. */
           cell_activate_sorts(ci, t->flags, s);
@@ -3497,40 +3508,40 @@ void engine_marktasks_mapper(void *map_data, int num_elements,
         }
 
         /* Store current values of dx_max and h_max. */
-        else if (t->type == task_type_sub_pair &&
-                 t->subtype == task_subtype_density) {
+        else if (t_type == task_type_sub_pair &&
+                 t_subtype == task_subtype_density) {
           cell_activate_subcell_hydro_tasks(t->ci, t->cj, s);
         }
       }
 
-      if ((t->subtype == task_subtype_grav) &&
-          ((ci_active_gravity && ci->nodeID == engine_rank) ||
-           (cj_active_gravity && cj->nodeID == engine_rank))) {
+      if ((t_subtype == task_subtype_grav) &&
+          ((ci_active_gravity && ci_nodeID == nodeID) ||
+           (cj_active_gravity && cj_nodeID == nodeID))) {
 
         scheduler_activate(s, t);
 
-        if (t->type == task_type_pair && t->subtype == task_subtype_grav) {
+        if (t_type == task_type_pair && t_subtype == task_subtype_grav) {
           /* Activate the gravity drift */
           cell_activate_subcell_grav_tasks(t->ci, t->cj, s);
         }
 
 #ifdef SWIFT_DEBUG_CHECKS
-        else if (t->type == task_type_sub_pair &&
-                 t->subtype == task_subtype_grav) {
+        else if (t_type == task_type_sub_pair &&
+                 t_subtype == task_subtype_grav) {
           error("Invalid task sub-type encountered");
         }
 #endif
       }
 
       /* Only interested in density tasks as of here. */
-      if (t->subtype == task_subtype_density) {
+      if (t_subtype == task_subtype_density) {
 
         /* Too much particle movement? */
         if (cell_need_rebuild_for_pair(ci, cj)) *rebuild_space = 1;
 
 #ifdef WITH_MPI
         /* Activate the send/recv tasks. */
-        if (ci->nodeID != engine_rank) {
+        if (ci_nodeID != nodeID) {
 
           /* If the local cell is active, receive data from the foreign cell. */
           if (cj_active_hydro) {
@@ -3549,8 +3560,7 @@ void engine_marktasks_mapper(void *map_data, int num_elements,
           /* Is the foreign cell active and will need stuff from us? */
           if (ci_active_hydro) {
 
-            struct link *l =
-                scheduler_activate_send(s, cj->send_xv, ci->nodeID);
+            struct link *l = scheduler_activate_send(s, cj->send_xv, ci_nodeID);
 
             /* Drift the cell which will be sent at the level at which it is
                sent, i.e. drift the cell specified in the send task (l->t)
@@ -3559,19 +3569,19 @@ void engine_marktasks_mapper(void *map_data, int num_elements,
 
             /* If the local cell is also active, more stuff will be needed. */
             if (cj_active_hydro) {
-              scheduler_activate_send(s, cj->send_rho, ci->nodeID);
+              scheduler_activate_send(s, cj->send_rho, ci_nodeID);
 
 #ifdef EXTRA_HYDRO_LOOP
-              scheduler_activate_send(s, cj->send_gradient, ci->nodeID);
+              scheduler_activate_send(s, cj->send_gradient, ci_nodeID);
 #endif
             }
           }
 
           /* If the local cell is active, send its ti_end values. */
           if (cj_active_hydro)
-            scheduler_activate_send(s, cj->send_ti, ci->nodeID);
+            scheduler_activate_send(s, cj->send_ti, ci_nodeID);
 
-        } else if (cj->nodeID != engine_rank) {
+        } else if (cj_nodeID != nodeID) {
 
           /* If the local cell is active, receive data from the foreign cell. */
           if (ci_active_hydro) {
@@ -3590,8 +3600,7 @@ void engine_marktasks_mapper(void *map_data, int num_elements,
           /* Is the foreign cell active and will need stuff from us? */
           if (cj_active_hydro) {
 
-            struct link *l =
-                scheduler_activate_send(s, ci->send_xv, cj->nodeID);
+            struct link *l = scheduler_activate_send(s, ci->send_xv, cj_nodeID);
 
             /* Drift the cell which will be sent at the level at which it is
                sent, i.e. drift the cell specified in the send task (l->t)
@@ -3601,27 +3610,27 @@ void engine_marktasks_mapper(void *map_data, int num_elements,
             /* If the local cell is also active, more stuff will be needed. */
             if (ci_active_hydro) {
 
-              scheduler_activate_send(s, ci->send_rho, cj->nodeID);
+              scheduler_activate_send(s, ci->send_rho, cj_nodeID);
 
 #ifdef EXTRA_HYDRO_LOOP
-              scheduler_activate_send(s, ci->send_gradient, cj->nodeID);
+              scheduler_activate_send(s, ci->send_gradient, cj_nodeID);
 #endif
             }
           }
 
           /* If the local cell is active, send its ti_end values. */
           if (ci_active_hydro)
-            scheduler_activate_send(s, ci->send_ti, cj->nodeID);
+            scheduler_activate_send(s, ci->send_ti, cj_nodeID);
         }
 #endif
       }
 
       /* Only interested in gravity tasks as of here. */
-      if (t->subtype == task_subtype_grav) {
+      if (t_subtype == task_subtype_grav) {
 
 #ifdef WITH_MPI
         /* Activate the send/recv tasks. */
-        if (ci->nodeID != engine_rank) {
+        if (ci_nodeID != nodeID) {
 
           /* If the local cell is active, receive data from the foreign cell. */
           if (cj_active_gravity) scheduler_activate(s, ci->recv_grav);
@@ -3633,7 +3642,7 @@ void engine_marktasks_mapper(void *map_data, int num_elements,
           if (ci_active_gravity) {
 
             struct link *l =
-                scheduler_activate_send(s, cj->send_grav, ci->nodeID);
+                scheduler_activate_send(s, cj->send_grav, ci_nodeID);
 
             /* Drift the cell which will be sent at the level at which it is
                sent, i.e. drift the cell specified in the send task (l->t)
@@ -3643,9 +3652,9 @@ void engine_marktasks_mapper(void *map_data, int num_elements,
 
           /* If the local cell is active, send its ti_end values. */
           if (cj_active_gravity)
-            scheduler_activate_send(s, cj->send_ti, ci->nodeID);
+            scheduler_activate_send(s, cj->send_ti, ci_nodeID);
 
-        } else if (cj->nodeID != engine_rank) {
+        } else if (cj_nodeID != nodeID) {
 
           /* If the local cell is active, receive data from the foreign cell. */
           if (ci_active_gravity) scheduler_activate(s, cj->recv_grav);
@@ -3657,7 +3666,7 @@ void engine_marktasks_mapper(void *map_data, int num_elements,
           if (cj_active_gravity) {
 
             struct link *l =
-                scheduler_activate_send(s, ci->send_grav, cj->nodeID);
+                scheduler_activate_send(s, ci->send_grav, cj_nodeID);
 
             /* Drift the cell which will be sent at the level at which it is
                sent, i.e. drift the cell specified in the send task (l->t)
@@ -3667,58 +3676,64 @@ void engine_marktasks_mapper(void *map_data, int num_elements,
 
           /* If the local cell is active, send its ti_end values. */
           if (ci_active_gravity)
-            scheduler_activate_send(s, ci->send_ti, cj->nodeID);
+            scheduler_activate_send(s, ci->send_ti, cj_nodeID);
         }
 #endif
       }
     }
 
     /* End force ? */
-    else if (t->type == task_type_end_force) {
+    else if (t_type == task_type_end_force) {
 
       if (cell_is_active_hydro(t->ci, e) || cell_is_active_gravity(t->ci, e))
         scheduler_activate(s, t);
     }
 
     /* Kick ? */
-    else if (t->type == task_type_kick1 || t->type == task_type_kick2) {
+    else if (t_type == task_type_kick1 || t_type == task_type_kick2) {
 
       if (cell_is_active_hydro(t->ci, e) || cell_is_active_gravity(t->ci, e))
         scheduler_activate(s, t);
     }
 
     /* Hydro ghost tasks ? */
-    else if (t->type == task_type_ghost || t->type == task_type_extra_ghost ||
-             t->type == task_type_ghost_in || t->type == task_type_ghost_out) {
+    else if (t_type == task_type_ghost || t_type == task_type_extra_ghost ||
+             t_type == task_type_ghost_in || t_type == task_type_ghost_out) {
       if (cell_is_active_hydro(t->ci, e)) scheduler_activate(s, t);
     }
 
     /* Gravity stuff ? */
-    else if (t->type == task_type_grav_down || t->type == task_type_grav_mesh ||
-             t->type == task_type_grav_long_range ||
-             t->type == task_type_init_grav ||
-             t->type == task_type_init_grav_out ||
-             t->type == task_type_grav_down_in) {
+    else if (t_type == task_type_grav_down || t_type == task_type_grav_mesh ||
+             t_type == task_type_grav_long_range ||
+             t_type == task_type_init_grav ||
+             t_type == task_type_init_grav_out ||
+             t_type == task_type_grav_down_in) {
       if (cell_is_active_gravity(t->ci, e)) scheduler_activate(s, t);
     }
 
-    else if (t->type == task_type_grav_mm) {
+    /* Multipole - Multipole interaction task */
+    else if (t_type == task_type_grav_mm) {
 
       /* Local pointers. */
       const struct cell *ci = t->ci;
       const struct cell *cj = t->cj;
+#ifdef WITH_MPI
       const int ci_nodeID = ci->nodeID;
-      const int cj_nodeID = cj->nodeID;
+      const int cj_nodeID = (cj != NULL) ? cj->nodeID : -1;
+#else
+      const int ci_nodeID = nodeID;
+      const int cj_nodeID = nodeID;
+#endif
       const int ci_active_gravity = cell_is_active_gravity_mm(ci, e);
       const int cj_active_gravity = cell_is_active_gravity_mm(cj, e);
 
-      if ((ci_active_gravity && ci_nodeID == engine_rank) ||
-          (cj_active_gravity && cj_nodeID == engine_rank))
+      if ((ci_active_gravity && ci_nodeID == nodeID) ||
+          (cj_active_gravity && cj_nodeID == nodeID))
         scheduler_activate(s, t);
     }
 
     /* Time-step? */
-    else if (t->type == task_type_timestep) {
+    else if (t_type == task_type_timestep) {
       t->ci->updated = 0;
       t->ci->g_updated = 0;
       t->ci->s_updated = 0;
@@ -3727,7 +3742,7 @@ void engine_marktasks_mapper(void *map_data, int num_elements,
     }
 
     /* Subgrid tasks */
-    else if (t->type == task_type_cooling || t->type == task_type_sourceterms) {
+    else if (t_type == task_type_cooling || t_type == task_type_sourceterms) {
       if (cell_is_active_hydro(t->ci, e)) scheduler_activate(s, t);
     }
   }