diff --git a/src/runner.c b/src/runner.c
index 16d988f2bf5cbf6f75b41ce6d9e84a2fcd2900b4..9eaa942f5d1fa6c916d33070ebcd1e6b60b2e02a 100644
--- a/src/runner.c
+++ b/src/runner.c
@@ -736,7 +736,12 @@ void runner_do_drift(struct runner *r, struct cell *c, int timer) {
   struct gpart *const gparts = c->gparts;
   float dx_max = 0.f, dx2_max = 0.f, h_max = 0.f;
 
+  double e_kin = 0.0, e_int = 0.0, e_pot = 0.0, mass = 0.0;
+  double mom[3] = {0.0, 0.0, 0.0};
+  double ang_mom[3] = {0.0, 0.0, 0.0};
+
   TIMER_TIC
+
 #ifdef TASK_VERBOSE
   OUT;
 #endif
@@ -819,6 +824,34 @@ void runner_do_drift(struct runner *r, struct cell *c, int timer) {
 
       /* Maximal smoothing length */
       h_max = fmaxf(p->h, h_max);
+
+      /* Now collect quantities for statistics */
+
+      const float half_dt =
+          (ti_current - (p->ti_begin + p->ti_end) / 2) * timeBase;
+      const double x[3] = {p->x[0], p->x[1], p->x[2]};
+      const float v[3] = {xp->v_full[0] + p->a_hydro[0] * half_dt,
+                          xp->v_full[1] + p->a_hydro[1] * half_dt,
+                          xp->v_full[2] + p->a_hydro[2] * half_dt};
+      const float m = p->mass;
+
+      /* Collect mass */
+      mass += m;
+
+      /* Collect momentum */
+      mom[0] += m * v[0];
+      mom[1] += m * v[1];
+      mom[2] += m * v[2];
+
+      /* Collect angular momentum */
+      ang_mom[0] += m * (x[1] * v[2] - x[2] * v[1]);
+      ang_mom[1] += m * (x[2] * v[0] - x[0] * v[2]);
+      ang_mom[2] += m * (x[0] * v[1] - x[1] * v[0]);
+
+      /* Collect energies. */
+      e_kin += 0.5 * m * (v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
+      e_pot += 0.;
+      e_int += 0.;
     }
 
     /* Now, get the maximal particle motion from its square */
@@ -831,9 +864,12 @@ void runner_do_drift(struct runner *r, struct cell *c, int timer) {
     /* Loop over the progeny. */
     for (int k = 0; k < 8; k++)
       if (c->progeny[k] != NULL) {
+
+        /* Recurse */
         struct cell *cp = c->progeny[k];
         runner_do_drift(r, cp, 0);
 
+        /* Collect */
         dx_max = fmaxf(dx_max, cp->dx_max);
         h_max = fmaxf(h_max, cp->h_max);
       }
@@ -866,9 +902,6 @@ void runner_do_kick_fixdt(struct runner *r, struct cell *c, int timer) {
 
   int updated = 0, g_updated = 0;
   int ti_end_min = max_nr_timesteps, ti_end_max = 0;
-  double e_kin = 0.0, e_int = 0.0, e_pot = 0.0, mass = 0.0;
-  float mom[3] = {0.0f, 0.0f, 0.0f};
-  float ang[3] = {0.0f, 0.0f, 0.0f};
 
   TIMER_TIC
 
@@ -932,31 +965,6 @@ void runner_do_kick_fixdt(struct runner *r, struct cell *c, int timer) {
       /* Minimal time for next end of time-step */
       ti_end_min = min(p->ti_end, ti_end_min);
       ti_end_max = max(p->ti_end, ti_end_max);
-
-      /* Now collect quantities for statistics */
-
-      const double x[3] = {p->x[0], p->x[1], p->x[2]};
-      const float v_full[3] = {xp->v_full[0], xp->v_full[1], xp->v_full[2]};
-      const float m = p->mass;
-
-      /* Collect mass */
-      mass += m;
-
-      /* Collect momentum */
-      mom[0] += m * v_full[0];
-      mom[1] += m * v_full[1];
-      mom[2] += m * v_full[2];
-
-      /* Collect angular momentum */
-      ang[0] += m * (x[1] * v_full[2] - x[2] * v_full[1]);
-      ang[1] += m * (x[2] * v_full[0] - x[0] * v_full[2]);
-      ang[2] += m * (x[0] * v_full[1] - x[1] * v_full[0]);
-
-      /* Collect total energy. */
-      e_kin += 0.5 * m * (v_full[0] * v_full[0] + v_full[1] * v_full[1] +
-                          v_full[2] * v_full[2]);
-      e_pot += 0.f; /* No gravitational potential thus far */
-      e_int += hydro_get_internal_energy(p);
     }
   }
 
@@ -974,16 +982,6 @@ void runner_do_kick_fixdt(struct runner *r, struct cell *c, int timer) {
         /* And aggregate */
         updated += cp->updated;
         g_updated += cp->g_updated;
-        e_kin += cp->e_kin;
-        e_int += cp->e_int;
-        e_pot += cp->e_pot;
-        mass += cp->mass;
-        mom[0] += cp->mom[0];
-        mom[1] += cp->mom[1];
-        mom[2] += cp->mom[2];
-        ang[0] += cp->ang[0];
-        ang[1] += cp->ang[1];
-        ang[2] += cp->ang[2];
         ti_end_min = min(cp->ti_end_min, ti_end_min);
         ti_end_max = max(cp->ti_end_max, ti_end_max);
       }
@@ -992,16 +990,6 @@ void runner_do_kick_fixdt(struct runner *r, struct cell *c, int timer) {
   /* Store the values. */
   c->updated = updated;
   c->g_updated = g_updated;
-  c->e_kin = e_kin;
-  c->e_int = e_int;
-  c->e_pot = e_pot;
-  c->mass = mass;
-  c->mom[0] = mom[0];
-  c->mom[1] = mom[1];
-  c->mom[2] = mom[2];
-  c->ang[0] = ang[0];
-  c->ang[1] = ang[1];
-  c->ang[2] = ang[2];
   c->ti_end_min = ti_end_min;
   c->ti_end_max = ti_end_max;
 
@@ -1029,9 +1017,6 @@ void runner_do_kick(struct runner *r, struct cell *c, int timer) {
 
   int updated = 0, g_updated = 0;
   int ti_end_min = max_nr_timesteps, ti_end_max = 0;
-  double e_kin = 0.0, e_int = 0.0, e_pot = 0.0, mass = 0.0;
-  float mom[3] = {0.0f, 0.0f, 0.0f};
-  float ang[3] = {0.0f, 0.0f, 0.0f};
 
   TIMER_TIC
 
@@ -1105,31 +1090,6 @@ void runner_do_kick(struct runner *r, struct cell *c, int timer) {
       /* Minimal time for next end of time-step */
       ti_end_min = min(p->ti_end, ti_end_min);
       ti_end_max = max(p->ti_end, ti_end_max);
-
-      /* Now collect quantities for statistics */
-
-      const double x[3] = {p->x[0], p->x[1], p->x[2]};
-      const float v_full[3] = {xp->v_full[0], xp->v_full[1], xp->v_full[2]};
-      const float m = p->mass;
-
-      /* Collect mass */
-      mass += m;
-
-      /* Collect momentum */
-      mom[0] += m * v_full[0];
-      mom[1] += m * v_full[1];
-      mom[2] += m * v_full[2];
-
-      /* Collect angular momentum */
-      ang[0] += m * (x[1] * v_full[2] - x[2] * v_full[1]);
-      ang[1] += m * (x[2] * v_full[0] - x[0] * v_full[2]);
-      ang[2] += m * (x[0] * v_full[1] - x[1] * v_full[0]);
-
-      /* Collect total energy. */
-      e_kin += 0.5 * m * (v_full[0] * v_full[0] + v_full[1] * v_full[1] +
-                          v_full[2] * v_full[2]);
-      e_pot += 0.f; /* No gravitational potential thus far */
-      e_int += hydro_get_internal_energy(p);
     }
   }
 
@@ -1147,16 +1107,6 @@ void runner_do_kick(struct runner *r, struct cell *c, int timer) {
         /* And aggregate */
         updated += cp->updated;
         g_updated += cp->g_updated;
-        e_kin += cp->e_kin;
-        e_int += cp->e_int;
-        e_pot += cp->e_pot;
-        mass += cp->mass;
-        mom[0] += cp->mom[0];
-        mom[1] += cp->mom[1];
-        mom[2] += cp->mom[2];
-        ang[0] += cp->ang[0];
-        ang[1] += cp->ang[1];
-        ang[2] += cp->ang[2];
         ti_end_min = min(cp->ti_end_min, ti_end_min);
         ti_end_max = max(cp->ti_end_max, ti_end_max);
       }
@@ -1165,16 +1115,6 @@ void runner_do_kick(struct runner *r, struct cell *c, int timer) {
   /* Store the values. */
   c->updated = updated;
   c->g_updated = g_updated;
-  c->e_kin = e_kin;
-  c->e_int = e_int;
-  c->e_pot = e_pot;
-  c->mass = mass;
-  c->mom[0] = mom[0];
-  c->mom[1] = mom[1];
-  c->mom[2] = mom[2];
-  c->ang[0] = ang[0];
-  c->ang[1] = ang[1];
-  c->ang[2] = ang[2];
   c->ti_end_min = ti_end_min;
   c->ti_end_max = ti_end_max;