diff --git a/src/engine.c b/src/engine.c
index 63cdde149da8ed556a658a8f29b28c6b99024b21..5080d88a84d9430f1ddab4636152abd4109238c3 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -2918,11 +2918,15 @@ int engine_estimate_nr_tasks(struct engine *e) {
     if (e->policy & engine_policy_hydro) {
       n1 += 36;
       n2 += 2;
-#ifdef EXTRA_HYDRO_LOOP
-      n1 += 1; /* Apparently a lot more to see... */
+#ifdef WITH_MPI
+      n1 += 6;
 #endif
+
+#ifdef EXTRA_HYDRO_LOOP
+      n1 += 15;
 #ifdef WITH_MPI
-      n1 += 6; /* XXX check this */
+      n1 += 2;
+#endif
 #endif
     }
     if (e->policy & engine_policy_self_gravity) {
@@ -2949,7 +2953,14 @@ int engine_estimate_nr_tasks(struct engine *e) {
     }
     message("n1 = %d, n2 = %d (%d/%d)", n1, n2, e->s->tot_cells, e->s->nr_cells);
     double ntasks = n1 * e->s->nr_cells + n2 * (e->s->tot_cells - e->s->nr_cells);
+
+    /* In principle we need fewer tasks per rank when using MPI, but we could
+     * have imbalances, so we don't allow for it. */
+    //if (e->nr_nodes > 1)
+    //  ntasks /= (e->nr_nodes  - 1);
+
     tasks_per_cell = ceil(ntasks / e->s->tot_cells);
+    if (tasks_per_cell < 1.0) tasks_per_cell = 1.0;
     if (e->verbose)
       message("tasks per cell estimated as: %d, maximum tasks: %d",
               tasks_per_cell, e->s->tot_cells * tasks_per_cell);