diff --git a/examples/test_bh_mpi.c b/examples/test_bh_mpi.c
index c6115f32d430300635dec984e8b3091b612e7b50..9bf72a527e7bbbcc79807bdddde2b620e4f09228 100644
--- a/examples/test_bh_mpi.c
+++ b/examples/test_bh_mpi.c
@@ -497,6 +497,11 @@ static inline void iact_pair_pc(struct qsched *s, struct cell *ci, struct cell *
     int part_count;
     ci->parts = (struct part*) qsched_getresdata(s, ci->res_parts);
 
+    #ifdef SANITY_CHECKS
+        if(are_neighbours(ci, cj))
+            error("ci and cj are neighbours");
+    #endif
+
     /* Load particles. */
     part_count = ci->count;
      if ((parts = (struct part_local *) malloc(sizeof(struct part_local) * part_count)) == NULL)
@@ -535,104 +540,6 @@ static inline void iact_pair_pc(struct qsched *s, struct cell *ci, struct cell *
     free(parts);
 }
 
-#ifdef OLD_VERSION
-/**
- * @brief Interacts a cell ci with the monopole of cell cj, or recurses cj to the depth of ci if ci and cj are neighbours.
- *
- * @param ci The first cell (particles).
- * @param cj The second cell (monopole).
-*/
-static inline void iact_pair_pc(struct qsched *s, struct cell *ci, struct cell *cj) {
-
-    struct part_local *parts = NULL;
-    struct multipole_local mult_local[8];
-    struct cell *cps;
-    int part_count, mult_count;
-    ci->parts = (struct part* ) qsched_getresdata(s, ci->res_parts);
-
-    /* Check if ci and cj are neighbours. */
-    if(are_neighbours_different_size(ci, cj) && ci->h != cj->h && cj->split)
-    {
-        /* They are neighbours, so we need to recurse on cj.*/
-         for (cps = (struct cell*) qsched_getresdata(s, cj->firstchild); cps != (struct cell*) qsched_getresdata(s, cj->sibling); cps = 
-                (struct cell*) qsched_getresdata(s, cps->sibling) ) {
-                iact_pair_pc(s, ci, cps);
-        }
-    }else{ /* Else cj->h >= ci->h and they're not neighbours, so multipole interaction!*/
-        /* Load particles. */
-        part_count = ci->count;
-        if ((parts = (struct part_local *) malloc(sizeof(struct part_local) * part_count)) == NULL)
-        	error("Failed to allocate local parts.");
-        for (int k = 0; k < part_count; k++) {
-            for (int j = 0; j < 3; j++) {
-	            parts[k].x[j] = ci->parts[k].x[j] - ci->loc[j];
-            	parts[k].a[j] = 0.0f;
-            }
-            parts[k].mass = ci->parts[k].mass;
-        }
-        mult_count = 0;
-        if(cj->split && cj->h > ci->h)
-        {
-            /* Now loop over all the other cells */
-            for (cps = (struct cell*) qsched_getresdata(s, cj->firstchild); cps != (struct cell*) qsched_getresdata(s, cj->sibling); cps = 
-                (struct cell*) qsched_getresdata(s, cps->sibling) ) {
-
-                	mult_local[mult_count].com[0] = cps->new.com[0] - ci->loc[0];
-	                mult_local[mult_count].com[1] = cps->new.com[1] - ci->loc[1];
-                	mult_local[mult_count].com[2] = cps->new.com[2] - ci->loc[2];
-                	mult_local[mult_count].mass = cps->new.mass;
-
-                    #ifdef QUADRUPOLES
-
-                	/* Final operation to get the quadrupoles */
-	                double imass = 1. / cps->new.mass;
-                	mult_local[mult_count].I_xx = cps->new.I_xx*imass - cps->new.com[0] * cps->new.com[0];
-                	mult_local[mult_count].I_xy = cps->new.I_xy*imass - cps->new.com[0] * cps->new.com[1];
-                	mult_local[mult_count].I_xz = cps->new.I_xz*imass - cps->new.com[0] * cps->new.com[2];
-                	mult_local[mult_count].I_yy = cps->new.I_yy*imass - cps->new.com[1] * cps->new.com[1];
-                	mult_local[mult_count].I_yz = cps->new.I_yz*imass - cps->new.com[1] * cps->new.com[2];
-                	mult_local[mult_count].I_zz = cps->new.I_zz*imass - cps->new.com[2] * cps->new.com[2];
-                    #endif	
-
-                	mult_count++;
-                        
-            }
-        }else
-        {
-            mult_count = 1;
-            mult_local[mult_count].com[0] = cj->new.com[0] - ci->loc[0];
-        	mult_local[mult_count].com[1] = cj->new.com[1] - ci->loc[1];
-        	mult_local[mult_count].com[2] = cj->new.com[2] - ci->loc[2];
-        	mult_local[mult_count].mass = cj->new.mass;
-
-            #ifdef QUADRUPOLES
-    
-        	/* Final operation to get the quadrupoles */
-        	double imass = 1. / cj->new.mass;
-        	mult_local[mult_count].I_xx = cj->new.I_xx*imass - cj->new.com[0] * cj->new.com[0];
-        	mult_local[mult_count].I_xy = cj->new.I_xy*imass - cj->new.com[0] * cj->new.com[1];
-        	mult_local[mult_count].I_xz = cj->new.I_xz*imass - cj->new.com[0] * cj->new.com[2];
-        	mult_local[mult_count].I_yy = cj->new.I_yy*imass - cj->new.com[1] * cj->new.com[1];
-        	mult_local[mult_count].I_yz = cj->new.I_yz*imass - cj->new.com[1] * cj->new.com[2];
-    	    mult_local[mult_count].I_zz = cj->new.I_zz*imass - cj->new.com[2] * cj->new.com[2];
-            #endif	
-        }
-        /* Perform the interaction between the particles and the list of multipoles */
-        make_interact_pc(parts, part_count, mult_local, mult_count);
-    
-        /* Clean up local parts? */
-        for (int k = 0; k < part_count; k++) {
-          for (int j = 0; j < 3; j++) ci->parts[k].a[j] += parts[k].a[j];
-        }
-        free(parts);
-    }
-
-}
-#endif
-
-
-
-
 struct cell *cell_get(struct qsched *s) {
 
   struct cell *res;
@@ -904,6 +811,10 @@ void create_pcs(struct qsched *s, struct cell *ci, struct cell *cj, int depth, i
   qsched_task_t cp, cps;
   struct cell *cp1, *cp2;
 
+    #ifdef SANITY_CHECKS
+        if(cj!= NULL && ci->h != cj->h)
+            error("ci and cj have different h values.");
+    #endif
 
     /* If cj == NULL we're at the root.*/
     if(cj == NULL)
@@ -1388,6 +1299,7 @@ if(s.rank == 0)
       c = (struct cell*) qsched_getresdata( &s, c->firstchild );
     }
   }
+  message("There are %i leaves.", nr_leaves);
   message("Average number of parts per leaf is %f.", ((double)N) / nr_leaves);
 
 }
@@ -1431,7 +1343,9 @@ if(s.rank == 0)
         }
     }
     message("leaf_depth = %i", leaf_depth);
-    create_pcs(&s, root, NULL, 0, 2);    
+    message("tasks before = %i", s.count);
+    create_pcs(&s, root, NULL, 0, leaf_depth-1);    
+    message("tasks after = %i", s.count);
 }
 printf("s.count = %i\n", s.count);
 //Mark all the schedulers dirty so they actually synchronize.