diff --git a/src/cell.c b/src/cell.c
index ae76162fcfc36439a634788687c29a78fddc540f..bfdc2c4f800ebdf827c5734e691d6d38a77ee96d 100644
--- a/src/cell.c
+++ b/src/cell.c
@@ -1675,38 +1675,53 @@ void cell_activate_subcell_tasks(struct cell *ci, struct cell *cj,
  */
 int cell_unskip_tasks(struct cell *c, struct scheduler *s) {
 
-#ifdef WITH_MPI
   struct engine *e = s->space->e;
-#endif
-
   int rebuild = 0;
 
+  if(c->count == 14623)
+    message("Favourite cell");
+
   /* Un-skip the density tasks involved with this cell. */
   for (struct link *l = c->density; l != NULL; l = l->next) {
     struct task *t = l->t;
     struct cell *ci = t->ci;
     struct cell *cj = t->cj;
-    scheduler_activate(s, t);
-
-    /* Set the correct sorting flags */
-    if (t->type == task_type_pair) {
-      /* Store some values. */
-      atomic_or(&ci->requires_sorts, 1 << t->flags);
-      atomic_or(&cj->requires_sorts, 1 << t->flags);
-      ci->dx_max_sort_old = ci->dx_max_sort;
-      cj->dx_max_sort_old = cj->dx_max_sort;
-
-      /* Activate the drift tasks. */
-      if (ci->nodeID == engine_rank) cell_activate_drift_part(ci, s);
-      if (cj->nodeID == engine_rank) cell_activate_drift_part(cj, s);
-
-      /* Check the sorts and activate them if needed. */
-      cell_activate_sorts(ci, t->flags, s);
-      cell_activate_sorts(cj, t->flags, s);
+
+    if(ci->count==5239 && cj && cj->count==14623) { // ci->loc[0]==1.411875e+00 cj->loc[0]==1.411875e+00
+      message("found task!");
     }
-    /* Store current values of dx_max and h_max. */
-    else if (t->type == task_type_sub_pair || t->type == task_type_sub_self) {
-      cell_activate_subcell_tasks(t->ci, t->cj, s);
+    
+    if((cell_is_active(ci, e) && ci->nodeID == engine_rank) ||
+       (cj != NULL && cell_is_active(cj, e) && cj->nodeID == engine_rank)) {
+      scheduler_activate(s, t);
+
+      if(ci->count==5239 && cj && cj->count==14623) { // ci->loc[0]==1.411875e+00 cj->loc[0]==1.411875e+00
+	message("activated task!");
+    }
+
+      
+
+
+      /* Set the correct sorting flags */
+      if (t->type == task_type_pair) {
+	/* Store some values. */
+	atomic_or(&ci->requires_sorts, 1 << t->flags);
+	atomic_or(&cj->requires_sorts, 1 << t->flags);
+	ci->dx_max_sort_old = ci->dx_max_sort;
+	cj->dx_max_sort_old = cj->dx_max_sort;
+	
+	/* Activate the drift tasks. */
+	if (ci->nodeID == engine_rank) cell_activate_drift_part(ci, s);
+	if (cj->nodeID == engine_rank) cell_activate_drift_part(cj, s);
+	
+	/* Check the sorts and activate them if needed. */
+	cell_activate_sorts(ci, t->flags, s);
+	cell_activate_sorts(cj, t->flags, s);
+      }
+      /* Store current values of dx_max and h_max. */
+      else if (t->type == task_type_sub_pair || t->type == task_type_sub_self) {
+	cell_activate_subcell_tasks(t->ci, t->cj, s);
+      }
     }
 
     /* Only interested in pair interactions as of here. */
@@ -1719,37 +1734,42 @@ int cell_unskip_tasks(struct cell *c, struct scheduler *s) {
 #ifdef WITH_MPI
       /* Activate the send/recv tasks. */
       if (ci->nodeID != engine_rank) {
-
-        /* Activate the tasks to recv foreign cell ci's data. */
-        scheduler_activate(s, ci->recv_xv);
-        if (cell_is_active(ci, e)) {
-          scheduler_activate(s, ci->recv_rho);
+	
+	if(cell_is_active(cj, e)) {
+	  
+	  /* Activate the tasks to recv foreign cell ci's data. */
+	  scheduler_activate(s, ci->recv_xv);
+	  if (cell_is_active(ci, e)) {
+	    scheduler_activate(s, ci->recv_rho);
 #ifdef EXTRA_HYDRO_LOOP
-          scheduler_activate(s, ci->recv_gradient);
+	      scheduler_activate(s, ci->recv_gradient);
 #endif
-          scheduler_activate(s, ci->recv_ti);
-        }
+	  }
+	}
+	if(cell_is_active(ci, e))
+	  scheduler_activate(s, ci->recv_ti);
 
         /* Look for the local cell cj's send tasks. */
-        struct link *l = NULL;
-        for (l = cj->send_xv; l != NULL && l->t->cj->nodeID != ci->nodeID;
-             l = l->next)
-          ;
-        if (l == NULL) error("Missing link to send_xv task.");
-        scheduler_activate(s, l->t);
-
-        /* Drift the cell which will be sent at the level at which it is sent,
-           i.e. drift the cell specified in the send task (l->t) itself. */
-        cell_activate_drift_part(l->t->ci, s);
-
-        if (cell_is_active(cj, e)) {
-
-          for (l = cj->send_rho; l != NULL && l->t->cj->nodeID != ci->nodeID;
-               l = l->next)
-            ;
-          if (l == NULL) error("Missing link to send_rho task.");
-          scheduler_activate(s, l->t);
-
+	if(cell_is_active(ci, e)) {
+	  struct link *l = NULL;
+	  for (l = cj->send_xv; l != NULL && l->t->cj->nodeID != ci->nodeID;
+	       l = l->next)
+	    ;
+	  if (l == NULL) error("Missing link to send_xv task.");
+	  scheduler_activate(s, l->t);
+	
+	  /* Drift the cell which will be sent at the level at which it is sent,
+	     i.e. drift the cell specified in the send task (l->t) itself. */
+	  cell_activate_drift_part(l->t->ci, s);
+
+	  if (cell_is_active(cj, e)) {
+	    struct link *l = NULL;
+	    for (l = cj->send_rho; l != NULL && l->t->cj->nodeID != ci->nodeID;
+		 l = l->next)
+	      ;
+	    if (l == NULL) error("Missing link to send_rho task.");
+	    scheduler_activate(s, l->t);
+	    
 #ifdef EXTRA_HYDRO_LOOP
           for (l = cj->send_gradient;
                l != NULL && l->t->cj->nodeID != ci->nodeID; l = l->next)
@@ -1757,46 +1777,55 @@ int cell_unskip_tasks(struct cell *c, struct scheduler *s) {
           if (l == NULL) error("Missing link to send_gradient task.");
           scheduler_activate(s, l->t);
 #endif
+	  }
+        }
 
+	/* We always need to send the new end time irrespective of active status */
+	if(cell_is_active(cj, e)){
+	  struct link *l = NULL;
           for (l = cj->send_ti; l != NULL && l->t->cj->nodeID != ci->nodeID;
                l = l->next)
             ;
           if (l == NULL) error("Missing link to send_ti task.");
           scheduler_activate(s, l->t);
-        }
-
+	}
       } else if (cj->nodeID != engine_rank) {
 
         /* Activate the tasks to recv foreign cell cj's data. */
-        scheduler_activate(s, cj->recv_xv);
-        if (cell_is_active(cj, e)) {
-          scheduler_activate(s, cj->recv_rho);
+	if(cell_is_active(ci, e)) {
+	    scheduler_activate(s, cj->recv_xv);
+	    if (cell_is_active(cj, e)) {
+	      scheduler_activate(s, cj->recv_rho);
 #ifdef EXTRA_HYDRO_LOOP
-          scheduler_activate(s, cj->recv_gradient);
+	      scheduler_activate(s, cj->recv_gradient);
 #endif
-          scheduler_activate(s, cj->recv_ti);
-        }
+	    }
+	}
+	if(cell_is_active(cj, e))
+	  scheduler_activate(s, cj->recv_ti);
 
         /* Look for the local cell ci's send tasks. */
-        struct link *l = NULL;
-        for (l = ci->send_xv; l != NULL && l->t->cj->nodeID != cj->nodeID;
-             l = l->next)
-          ;
-        if (l == NULL) error("Missing link to send_xv task.");
-        scheduler_activate(s, l->t);
-
-        /* Drift the cell which will be sent at the level at which it is sent,
-           i.e. drift the cell specified in the send task (l->t) itself. */
-        cell_activate_drift_part(l->t->ci, s);
-
-        if (cell_is_active(ci, e)) {
-
-          for (l = ci->send_rho; l != NULL && l->t->cj->nodeID != cj->nodeID;
+	if(cell_is_active(cj, e)) {
+	  struct link *l = NULL;
+	  for (l = ci->send_xv; l != NULL && l->t->cj->nodeID != cj->nodeID;
+	       l = l->next)
+	    ;
+	  if (l == NULL) error("Missing link to send_xv task.");
+	  scheduler_activate(s, l->t);
+	  
+	  /* Drift the cell which will be sent at the level at which it is sent,
+	     i.e. drift the cell specified in the send task (l->t) itself. */
+	  cell_activate_drift_part(l->t->ci, s);
+	  
+	  if (cell_is_active(ci, e)) {
+
+	    struct link *l = NULL;
+	    for (l = ci->send_rho; l != NULL && l->t->cj->nodeID != cj->nodeID;
                l = l->next)
             ;
-          if (l == NULL) error("Missing link to send_rho task.");
-          scheduler_activate(s, l->t);
-
+	    if (l == NULL) error("Missing link to send_rho task.");
+	    scheduler_activate(s, l->t);
+	    
 #ifdef EXTRA_HYDRO_LOOP
           for (l = ci->send_gradient;
                l != NULL && l->t->cj->nodeID != cj->nodeID; l = l->next)
@@ -1804,40 +1833,50 @@ int cell_unskip_tasks(struct cell *c, struct scheduler *s) {
           if (l == NULL) error("Missing link to send_gradient task.");
           scheduler_activate(s, l->t);
 #endif
+	  }
+	}
+	/* We always need to send the new end time irrespective of active status */
+	if(cell_is_active(ci,e)) {
+	  struct link *l = NULL;
+	  for (l = ci->send_ti; l != NULL && l->t->cj->nodeID != cj->nodeID;
+	       l = l->next)
+	    ;
+	  if (l == NULL) error("Missing link to send_ti task.");
+	  scheduler_activate(s, l->t);
+	}
 
-          for (l = ci->send_ti; l != NULL && l->t->cj->nodeID != cj->nodeID;
-               l = l->next)
-            ;
-          if (l == NULL) error("Missing link to send_ti task.");
-          scheduler_activate(s, l->t);
-        }
       }
 #endif
     }
   }
 
   /* Unskip all the other task types. */
-  for (struct link *l = c->gradient; l != NULL; l = l->next)
-    scheduler_activate(s, l->t);
-  for (struct link *l = c->force; l != NULL; l = l->next)
-    scheduler_activate(s, l->t);
-  for (struct link *l = c->grav; l != NULL; l = l->next)
-    scheduler_activate(s, l->t);
-  if (c->extra_ghost != NULL) scheduler_activate(s, c->extra_ghost);
-  if (c->ghost_in != NULL) scheduler_activate(s, c->ghost_in);
-  if (c->ghost_out != NULL) scheduler_activate(s, c->ghost_out);
-  if (c->ghost != NULL) scheduler_activate(s, c->ghost);
-  if (c->init_grav != NULL) scheduler_activate(s, c->init_grav);
-  if (c->drift_gpart != NULL) scheduler_activate(s, c->drift_gpart);
-  if (c->kick1 != NULL) scheduler_activate(s, c->kick1);
-  if (c->kick2 != NULL) scheduler_activate(s, c->kick2);
-  if (c->timestep != NULL) scheduler_activate(s, c->timestep);
-  if (c->grav_ghost[0] != NULL) scheduler_activate(s, c->grav_ghost[0]);
-  if (c->grav_ghost[1] != NULL) scheduler_activate(s, c->grav_ghost[1]);
-  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->cooling != NULL) scheduler_activate(s, c->cooling);
-  if (c->sourceterms != NULL) scheduler_activate(s, c->sourceterms);
+  if( c->nodeID == engine_rank && cell_is_active(c,e) ) {
+
+    for (struct link *l = c->gradient; l != NULL; l = l->next)
+      scheduler_activate(s, l->t);
+    for (struct link *l = c->force; l != NULL; l = l->next)
+      scheduler_activate(s, l->t);
+    for (struct link *l = c->grav; l != NULL; l = l->next)
+      scheduler_activate(s, l->t);
+
+    if (c->extra_ghost != NULL) scheduler_activate(s, c->extra_ghost);
+    if (c->ghost_in != NULL) scheduler_activate(s, c->ghost_in);
+    if (c->ghost_out != NULL) scheduler_activate(s, c->ghost_out);
+    if (c->ghost != NULL) scheduler_activate(s, c->ghost);
+    if (c->init_grav != NULL) scheduler_activate(s, c->init_grav);
+    if (c->drift_gpart != NULL) scheduler_activate(s, c->drift_gpart);
+    if (c->kick1 != NULL) scheduler_activate(s, c->kick1);
+    if (c->kick2 != NULL) scheduler_activate(s, c->kick2);
+    if (c->timestep != NULL) scheduler_activate(s, c->timestep);
+    if (c->grav_ghost[0] != NULL) scheduler_activate(s, c->grav_ghost[0]);
+    if (c->grav_ghost[1] != NULL) scheduler_activate(s, c->grav_ghost[1]);
+    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->cooling != NULL) scheduler_activate(s, c->cooling);
+    if (c->sourceterms != NULL) scheduler_activate(s, c->sourceterms);
+
+  }
 
   return rebuild;
 }
diff --git a/src/scheduler.c b/src/scheduler.c
index e14fc017d3fef8b85e71b398634ce06e31830151..d537a5417aebcaf6db5cc345db785960bee37432 100644
--- a/src/scheduler.c
+++ b/src/scheduler.c
@@ -1180,7 +1180,7 @@ void scheduler_start(struct scheduler *s) {
   }
 
 /* Check we have not missed an active task */
-#ifdef SWIFT_DEBUG_CHECKS
+#if 0 //SWIFT_DEBUG_CHECKS
 
   const integertime_t ti_current = s->space->e->ti_current;