diff --git a/src/cell.c b/src/cell.c
index 5a8094d2763b6cbdbd619a949a72047e1a896cb2..bf40b490ab011a28c8b367f16296c8538aeef7b5 100644
--- a/src/cell.c
+++ b/src/cell.c
@@ -1321,6 +1321,8 @@ int cell_unskip_tasks(struct cell *c, struct scheduler *s) {
   if (c->kick2 != NULL) scheduler_activate(s, c->kick2);
   if (c->timestep != NULL) scheduler_activate(s, c->timestep);
   if (c->grav_down != NULL) scheduler_activate(s, c->grav_down);
+  if (c->grav_long_range != NULL) scheduler_activate(s, c->grav_long_range);
+  if (c->grav_top_level != NULL) scheduler_activate(s, c->grav_top_level);
   if (c->cooling != NULL) scheduler_activate(s, c->cooling);
   if (c->sourceterms != NULL) scheduler_activate(s, c->sourceterms);
 
diff --git a/src/cell.h b/src/cell.h
index 2e3ce0e0e52479f6fc4496609cb7ed5da035e501..1cff0834f3fe2b8e8966c1465c4a32a1096422e3 100644
--- a/src/cell.h
+++ b/src/cell.h
@@ -170,7 +170,10 @@ struct cell {
   struct task *timestep;
 
   /*! Task constructing the multipole from the particles */
-  struct task *grav_up;
+  struct task *grav_top_level;
+
+  /*! Task constructing the multipole from the particles */
+  struct task *grav_long_range;
 
   /*! Task propagating the multipole to the particles */
   struct task *grav_down;
diff --git a/src/engine.c b/src/engine.c
index ee2181dd01c6bd267b10d8f814e58355564b7033..242832c67d4fdb810d3e9218a3fbc68f23d3862a 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -132,6 +132,7 @@ void engine_make_hierarchical_tasks(struct engine *e, struct cell *c) {
 
   struct scheduler *s = &e->sched;
   const int is_hydro = (e->policy & engine_policy_hydro);
+  const int is_self_gravity = (e->policy & engine_policy_self_gravity);
   const int is_with_cooling = (e->policy & engine_policy_cooling);
   const int is_with_sourceterms = (e->policy & engine_policy_sourceterms);
 
@@ -165,6 +166,19 @@ void engine_make_hierarchical_tasks(struct engine *e, struct cell *c) {
 
       scheduler_addunlock(s, c->drift, c->init);
 
+      if (is_self_gravity) {
+        /* Gravity non-neighbouring pm calculations */
+        c->grav_long_range = scheduler_addtask(
+            s, task_type_grav_long_range, task_subtype_none, 0, 0, c, NULL, 0);
+
+        /* Gravity top-level periodic calculation */
+        c->grav_top_level = scheduler_addtask(
+            s, task_type_grav_top_level, task_subtype_none, 0, 0, c, NULL, 0);
+
+        scheduler_addunlock(s, c->init, c->grav_long_range);
+        scheduler_addunlock(s, c->init, c->grav_top_level);
+      }
+
       /* Generate the ghost task. */
       if (is_hydro)
         c->ghost = scheduler_addtask(s, task_type_ghost, task_subtype_none, 0,
@@ -871,7 +885,7 @@ void engine_addtasks_grav(struct engine *e, struct cell *c, struct task *up,
                           struct task *down) {
 
   /* Link the tasks to this cell. */
-  c->grav_up = up;
+  // c->grav_up = up;
   c->grav_down = down;
 
   /* Recurse? */
@@ -1572,11 +1586,6 @@ void engine_make_self_gravity_tasks(struct engine *e) {
     scheduler_addtask(sched, task_type_self, task_subtype_grav, 0, 0, ci, NULL,
                       0);
 
-    /* Let's also build a task for all the non-neighbouring pm calculations */
-    /* scheduler_addtask(sched, task_type_grav_long_range, task_subtype_none, 0,
-     * 0, */
-    /*                   ci, NULL, 0); */
-
     for (int cjd = cid + 1; cjd < nr_cells; ++cjd) {
 
       struct cell *cj = &cells[cjd];
@@ -2447,7 +2456,9 @@ void engine_marktasks_mapper(void *map_data, int num_elements,
     }
 
     /* Gravity ? */
-    else if (t->type == task_type_grav_down) {
+    else if (t->type == task_type_grav_down ||
+             t->type == task_type_grav_long_range ||
+             t->type == task_type_grav_top_level) {
       if (cell_is_active(t->ci, e)) scheduler_activate(s, t);
     }
 
diff --git a/src/runner.c b/src/runner.c
index 3ea4d9d03e3c5d1f3e723478c74af5766c9cd1ed..3f8cc7a2a306d2e9495627e7a644b04d871ab7eb 100644
--- a/src/runner.c
+++ b/src/runner.c
@@ -1795,11 +1795,12 @@ void *runner_main(void *data) {
         case task_type_grav_down:
           // runner_do_grav_down(r, t->ci);
           break;
-        /*   case task_type_grav_gather_m: */
-        /*     break; */
-        /*   case task_type_grav_fft: */
-        /*     runner_do_grav_fft(r); */
-        /*     break; */
+        case task_type_grav_top_level:
+          // runner_do_grav_top_level(r);
+          break;
+        case task_type_grav_long_range:
+          // runner_do_grav_fft(r);
+          break;
         case task_type_cooling:
           if (e->policy & engine_policy_cooling) runner_do_end_force(r, ci, 1);
           runner_do_cooling(r, t->ci, 1);
diff --git a/src/space.c b/src/space.c
index 78a915839ce5225782958a32f996a55b64ba6ae4..897f3f58a2e4a3c7809b7bba2c51c40ca2f5ad7a 100644
--- a/src/space.c
+++ b/src/space.c
@@ -247,6 +247,9 @@ void space_rebuild_recycle_mapper(void *map_data, int num_elements,
     c->drift = NULL;
     c->cooling = NULL;
     c->sourceterms = NULL;
+    c->grav_top_level = NULL;
+    c->grav_long_range = NULL;
+    c->grav_down = NULL;
     c->super = c;
     if (c->sort != NULL) {
       free(c->sort);