diff --git a/src/engine.c b/src/engine.c
index 5819e820dcc6a592134b7e248a2468fa2c5da29c..589b5f9ecb9da50de2cf3945fee96af6afcbbf2f 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -49,11 +49,6 @@
 #include "error.h"
 #include "timers.h"
 
-#ifdef LEGACY_GADGET2_SPH
-#include "runner_iact_legacy.h"
-#else
-#include "runner_iact.h"
-#endif
 
 /* Convert cell location to ID. */
 #define cell_getid(cdim, i, j, k) \
@@ -1728,6 +1723,11 @@ void engine_launch(struct engine *e, int nr_runners, unsigned int mask) {
   if (pthread_cond_broadcast(&e->barrier_cond) != 0)
     error("Failed to broadcast barrier open condition.");
 
+  /* Print out what we do */
+  printf("\n");
+  task_print_mask(mask);
+  printf("\n");
+  
   /* Load the tasks. */
   pthread_mutex_unlock(&e->barrier_mutex);
   scheduler_start(&e->sched, mask);
@@ -1745,14 +1745,14 @@ void engine_launch(struct engine *e, int nr_runners, unsigned int mask) {
       error("Error while waiting for barrier.");
 }
 
-void hassorted(struct cell *c) {
+/* void hassorted(struct cell *c) { */
 
-  if (c->sorted) error("Suprious sorted flags.");
+/*   if (c->sorted) error("Suprious sorted flags."); */
 
-  if (c->split)
-    for (int k = 0; k < 8; k++)
-      if (c->progeny[k] != NULL) hassorted(c->progeny[k]);
-}
+/*   if (c->split) */
+/*     for (int k = 0; k < 8; k++) */
+/*       if (c->progeny[k] != NULL) hassorted(c->progeny[k]); */
+/* } */
 
 /**
  * @brief Initialises the particles and set them in a state ready to move forward in time.
@@ -1782,10 +1782,9 @@ void engine_init_particles(struct engine *e) {
   
   /* Make sure all particles are ready to go */
   void initParts(struct part *p, struct xpart *xp, struct cell *c) {
-    p->t_end = 0.;
     p->t_begin = 0.;
+    p->t_end = 0.;
     p->rho = -1.;
-    p->h = 1.12349f / 20;
     xp->v_full[0] = p->v[0];
     xp->v_full[1] = p->v[1];
     xp->v_full[2] = p->v[2];
@@ -1799,7 +1798,7 @@ void engine_init_particles(struct engine *e) {
   /* Now everybody should have sensible smoothing length */
   void printParts(struct part *p, struct xpart *xp, struct cell *c) {
     if( p->id == 1000)
-      message("id=%lld h=%f rho=%f", p->id, p->h, p->rho);
+      message("id=%lld h=%f rho=%f t_begin=%f t_end=%f", p->id, p->h, p->rho, p->t_begin, p->t_end);
   }
   //space_map_parts_xparts(s, printParts);
 
@@ -1807,7 +1806,7 @@ void engine_init_particles(struct engine *e) {
     if(c->super != NULL && 0)
       message("c->t_end_min=%f c->t_end_max=%f c->super=%p sort=%p ghost=%p kick=%p", c->t_end_min, c->t_end_max, c->super, c->sorts, c->ghost, c->kick);
   }
-  space_map_parts_xparts(s, printCells);
+  //space_map_parts_xparts(s, printCells);
 
   
   /* Now do a density calculation */
@@ -1821,9 +1820,12 @@ void engine_init_particles(struct engine *e) {
 
   TIMER_TOC(timer_runners);
 
-  space_map_parts_xparts(s, printParts);
+  //space_map_parts_xparts(s, printParts);
 
-  
+  printf("\n\n");
+
+  /* Ready to go */
+  e->step = -1;
 }
  
 /**
@@ -1844,28 +1846,7 @@ void engine_step(struct engine *e) {
 
   TIMER_TIC2;
 
-  message("Begin step: %d", e->step);
-
-  /* Re-distribute the particles amongst the nodes? */
-  if (e->forcerepart) engine_repartition(e);
-
-  /* Prepare the space. */
-  engine_prepare(e);
-
-  engine_print(e);
-
-  /* Send off the runners. */
-  TIMER_TIC;
-  engine_launch(e, e->nr_threads,
-                (1 << task_type_sort) | (1 << task_type_self) |
-                    (1 << task_type_pair) | (1 << task_type_sub) |
-                    (1 << task_type_init) | (1 << task_type_ghost) |
-                    (1 << task_type_kick) | (1 << task_type_send) |
-                    (1 << task_type_recv) | (1 << task_type_link));
-
-  TIMER_TOC(timer_runners);
-
-  /* Collect the cell data from the kick. */
+  /* Collect the cell data. */
   for (k = 0; k < s->nr_cells; k++)
     if (s->cells[k].nodeID == e->nodeID) {
       c = &s->cells[k];
@@ -1905,24 +1886,49 @@ void engine_step(struct engine *e) {
   count = in[0];
   ekin = in[1];
   epot = in[2];
-/* int nr_parts;
-if ( MPI_Allreduce( &s->nr_parts , &nr_parts , 1 , MPI_INT , MPI_SUM ,
-MPI_COMM_WORLD ) != MPI_SUCCESS )
-    error( "Failed to aggregate particle count." );
-if ( e->nodeID == 0 )
-    message( "nr_parts=%i." , nr_parts ); */
 #endif
 
+  
+  message("t_end_min=%f t_end_max=%f", t_end_min, t_end_max);
+
+
   /* Move forward in time */
   e->timeOld = e->time;
   e->time = t_end_min;
   e->step += 1;
+  message("Step: %d e->time=%f", e->step, e->time);
+
+  
+  /* Drift everybody */
+  engine_launch(e, e->nr_threads, 1<<task_type_drift);
+
+  
+  /* Re-distribute the particles amongst the nodes? */
+  if (e->forcerepart) engine_repartition(e);
+
+  /* Prepare the space. */
+  engine_prepare(e);
+
+  engine_maketasks(e);
+  
+  engine_marktasks(e);
+  
+  engine_print(e);
+  message("Go !");
+  fflush(stdout);
+  
+  /* Send off the runners. */
+  TIMER_TIC;
+  engine_launch(e, e->nr_threads,
+  		    (1 << task_type_sort) | (1 << task_type_self) |
+                    (1 << task_type_pair) | (1 << task_type_sub) |
+                    (1 << task_type_init) | (1 << task_type_ghost) |
+                    (1 << task_type_kick) | (1 << task_type_send) |
+                    (1 << task_type_recv) | (1 << task_type_link));
+
+  TIMER_TOC(timer_runners);
 
-  message("e->time=%f", e->time);
-  message("Ready to drift");
 
-  /* Drift all particles */
-  engine_launch(e, e->nr_threads, (1 << task_type_drift));
 
   TIMER_TOC2(timer_step);
 }
diff --git a/src/runner.c b/src/runner.c
index a7214cad5d9002a6cbe7e6860746ccc817f020f5..c4837b63b64669e7a558cf75cdb80ae6684f935a 100644
--- a/src/runner.c
+++ b/src/runner.c
@@ -51,6 +51,14 @@
 #endif
 #include "runner_iact_grav.h"
 
+
+#define PRINT_PART if(p->id==1000) { \
+	  message("t->t_end p->id=%lld p->h=%f p->N_ngb=%f p->rho=%f p->t_beg=%f p->t_end=%f",\
+		  p->id, p->h, p->density.wcount, p->rho, p->t_begin, p->t_end);	\
+}
+
+
+
 /* Convert cell location to ID. */
 #define cell_getid(cdim, i, j, k) \
   ((int)(k) + (cdim)[2] * ((int)(j) + (cdim)[1] * (int)(i)))
@@ -189,6 +197,8 @@ void runner_dosort(struct runner *r, struct cell *c, int flags, int clock) {
 
   TIMER_TIC
 
+    message("sort!");
+    
   /* Clean-up the flags, i.e. filter out what's already been sorted. */
   flags &= ~c->sorted;
   if (flags == 0) return;
@@ -512,8 +522,6 @@ void runner_doinit(struct runner *r, struct cell *c) {
     return;
   }
 
-  //  message("in here count=%d", count);
-  
   /* Loop over the parts in this cell. */
   for (i = 0; i < count; i++) {
 
@@ -531,10 +539,7 @@ void runner_doinit(struct runner *r, struct cell *c) {
       for (k = 0; k < 3; k++) p->density.curl_v[k] = 0.0;
     }
 
-    if(p->id==1000) {
-      
-      message("p->id=%lld p->h=%f p->rho=%f", p->id, p->h, p->rho);
-    }
+    PRINT_PART;
 
   }
 }
@@ -560,10 +565,10 @@ void runner_doghost(struct runner *r, struct cell *c) {
 #endif
   float t_end = r->e->time;
 
-  TIMER_TIC
+  TIMER_TIC;
+
+  //message("start");
 
-    //message("start");
-    
   /* Recurse? */
   if (c->split) {
     for (k = 0; k < 8; k++)
@@ -571,8 +576,6 @@ void runner_doghost(struct runner *r, struct cell *c) {
     return;
   }
 
-  //message("done recursing");
-  
   /* Init the IDs that have to be updated. */
   if ((pid = (int *)alloca(sizeof(int) * count)) == NULL)
     error("Call to alloca failed.");
@@ -581,11 +584,11 @@ void runner_doghost(struct runner *r, struct cell *c) {
   /* While there are particles that need to be updated... */
   while (count > 0) {
 
-    //message("count=%d redo=%d", count, redo);
-    
+    // message("count=%d redo=%d", count, redo);
+
     /* Reset the redo-count. */
     redo = 0;
-    
+
     /* Loop over the parts in this cell. */
     for (i = 0; i < count; i++) {
 
@@ -610,11 +613,7 @@ void runner_doghost(struct runner *r, struct cell *c) {
         wcount_dh =
             p->density.wcount_dh * ih * (4.0f / 3.0 * M_PI * kernel_gamma3);
 
-	if(p->id==1000) {
-	
-	  message("p->id=%lld p->h=%f p->N_ngb=%f p->rho=%f", p->id, p->h, wcount, p->rho);
-	  //error("");
-	}
+	PRINT_PART
 	
         /* If no derivative, double the smoothing length. */
         if (wcount_dh == 0.0f) h_corr = p->h;
@@ -631,9 +630,11 @@ void runner_doghost(struct runner *r, struct cell *c) {
         /* Did we get the right number density? */
         if (wcount > kernel_nwneigh + const_delta_nwneigh ||
             wcount < kernel_nwneigh - const_delta_nwneigh) {
-          h = p->h += h_corr;
-          //p->h += (p->density.wcount + kernel_root - kernel_nwneigh) /
-          //        p->density.wcount_dh;
+
+          /* Ok, correct then */
+          p->h += h_corr;
+
+          /* And flag for another round of fun */
           pid[redo] = pid[i];
           redo += 1;
           p->density.wcount = 0.0;
@@ -692,11 +693,9 @@ void runner_doghost(struct runner *r, struct cell *c) {
         p->force.u_dt = 0.0f;
         p->force.h_dt = 0.0f;
         p->force.v_sig = 0.0f;
-
       }
     }
 
-    
     /* We now need to treat the particles whose smoothing length had not
      * converged again */
 
@@ -704,8 +703,8 @@ void runner_doghost(struct runner *r, struct cell *c) {
     count = redo;
     if (count > 0) {
 
-      //message("count=%d", count);
-    
+      // message("count=%d", count);
+
       /* Climb up the cell hierarchy. */
       for (finger = c; finger != NULL; finger = finger->parent) {
 
@@ -784,6 +783,8 @@ void runner_dodrift(struct runner *r, struct cell *c, int timer) {
       h = p->h;
       ih = 1.0f / h;
 
+      PRINT_PART;
+      
       /* Drift... */
       p->x[0] += xp->v_full[0] * dt;
       p->x[1] += xp->v_full[1] * dt;
@@ -884,10 +885,6 @@ void runner_dokick(struct runner *r, struct cell *c, int timer) {
       m = p->mass;
       x[0] = p->x[0], x[1] = p->x[1], x[2] = p->x[2];
 
-      /* if (p->id == 0) */
-      /*   message("Kick ! t_beg=%f t_end=%f t_cur=%f", p->t_begin, p->t_end, */
-      /*           t_current); */
-
       /* If particle needs to be kicked */
       if (p->t_end <= t_current) {
 
@@ -926,6 +923,8 @@ void runner_dokick(struct runner *r, struct cell *c, int timer) {
         p->t_begin = p->t_end;
         p->t_end = p->t_begin + dt;
 
+	PRINT_PART
+	
         /* Kick particles in momentum space */
         xp->v_full[0] += p->a[0] * dt;
         xp->v_full[1] += p->a[1] * dt;