diff --git a/src/engine.c b/src/engine.c
index 1e500b9debf9464b2bb65b2e7e796170a74257e6..f6f10841e3752f1328565f81b5e27d658cd3c565 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -407,7 +407,6 @@ void engine_exchange_strays(struct engine *e, const size_t offset_parts,
                             size_t *Nbpart) {
 
 #ifdef WITH_MPI
-
   struct space *s = e->s;
   ticks tic = getticks();
 
@@ -455,8 +454,11 @@ void engine_exchange_strays(struct engine *e, const size_t offset_parts,
                      &s->xparts[offset_parts + k], 1);
 
 #ifdef WITH_LOGGER
+    const int logger_flag = logger_generate_flag(
+      logger_flag_mpi | logger_flag_delete, node_id);
+
     /* Log the particle when leaving a rank. */
-    logger_log_part(e->log, s->parts[offset_parts + k],
+    logger_log_part(e->logger, &s->parts[offset_parts + k],
                     logger_mask_data[logger_x].mask |
                     logger_mask_data[logger_v].mask |
                     logger_mask_data[logger_a].mask |
@@ -465,8 +467,8 @@ void engine_exchange_strays(struct engine *e, const size_t offset_parts,
                     logger_mask_data[logger_rho].mask |
                     logger_mask_data[logger_consts].mask |
                     logger_mask_data[logger_special_flags].mask,
-                    s->xparts[offset_parts + k].logger_data.last_offset,
-                    logger_generate_flag(logger_flag_mpi, node_id));
+                    &s->xparts[offset_parts + k].logger_data.last_offset,
+                    logger_flag);
 #endif
   }
 
@@ -505,14 +507,17 @@ void engine_exchange_strays(struct engine *e, const size_t offset_parts,
     proxy_sparts_load(&e->proxies[pid], &s->sparts[offset_sparts + k], 1);
 
 #ifdef WITH_LOGGER
-    /* Log the particle when leaving a rank. */
-    logger_log_spart(e->log, s->sparts[offset_sparts + k],
+    const int logger_flag = logger_generate_flag(
+      logger_flag_mpi | logger_flag_delete, node_id);
+
+      /* Log the particle when leaving a rank. */
+    logger_log_spart(e->logger, &s->sparts[offset_sparts + k],
                      logger_mask_data[logger_x].mask |
                      logger_mask_data[logger_v].mask |
                      logger_mask_data[logger_consts].mask |
                      logger_mask_data[logger_special_flags].mask,
-                     s->sparts[offset_parts + k].logger_data.last_offset,
-                     logger_generate_flag(logger_flag_mpi, node_id));
+                     &s->sparts[offset_parts + k].logger_data.last_offset,
+                     logger_flag);
 #endif
   }
 
@@ -585,17 +590,20 @@ void engine_exchange_strays(struct engine *e, const size_t offset_parts,
 
 #ifdef WITH_LOGGER
     /* Write only the dark matter particles */
-    if (gp->type == swift_type_dark_matter) {
+    if (s->gparts[offset_gparts + k].type == swift_type_dark_matter) {
+
+      const int logger_flag = logger_generate_flag(
+         logger_flag_mpi | logger_flag_delete, node_id);
 
       /* Log the particle when leaving a rank. */
-      logger_log_gpart(e->log, s->gparts[offset_gparts + k],
+      logger_log_gpart(e->logger, &s->gparts[offset_gparts + k],
                        logger_mask_data[logger_x].mask |
                        logger_mask_data[logger_v].mask |
                        logger_mask_data[logger_a].mask |
                        logger_mask_data[logger_consts].mask |
                        logger_mask_data[logger_special_flags].mask,
-                       s->sparts[offset_parts + k].logger_data.last_offset,
-                       logger_generate_flag(logger_flag_mpi, node_id));
+                       &s->sparts[offset_parts + k].logger_data.last_offset,
+                       logger_flag);
     }
 #endif
   }
@@ -819,7 +827,8 @@ void engine_exchange_strays(struct engine *e, const size_t offset_parts,
              sizeof(struct bpart) * prox->nr_bparts_in);
 
 #ifdef WITH_LOGGER
-      logger_log_recv_strays(e->log, &s->parts[offset_parts + count_parts], prox->nr_parts_in,
+      logger_log_recv_strays(e->logger, &s->parts[offset_parts + count_parts],
+                             &s->xparts[offset_parts + count_parts], prox->nr_parts_in,
                              &s->gparts[offset_gparts + count_gparts], prox->nr_gparts_in,
                              &s->sparts[offset_sparts + count_sparts], prox->nr_sparts_in,
                              &s->bparts[offset_bparts + count_bparts], prox->nr_bparts_in,
diff --git a/src/engine_redistribute.c b/src/engine_redistribute.c
index e7d4bee5eba92ae10e183bf6d9e7b97f2fec7566..05ea63dfff4b910f1dac72dd50ca6ddc6c9fbe4a 100644
--- a/src/engine_redistribute.c
+++ b/src/engine_redistribute.c
@@ -1039,9 +1039,9 @@ void engine_redistribute(struct engine *e) {
 #ifdef WITH_LOGGER
   /* Log the received particles */
   logger_log_after_communcations(s->parts, s->nr_parts, counts,
-                                 s->gparts, s->nr_gparts, gcounts,
-                                 s->sparts, s->nr_sparts, scounts,
-                                 s->bparts, s->nr_bparts, bcounts);
+                                 s->gparts, s->nr_gparts, g_counts,
+                                 s->sparts, s->nr_sparts, s_counts,
+                                 s->bparts, s->nr_bparts, b_counts);
 #endif
 
   /* Restore the part<->gpart and spart<->gpart links.
diff --git a/src/logger.c b/src/logger.c
index 75005095ab9e8d7dd894c1107ee24b946a0bf620..9eb52a9da492968596f7481297371857a63a1613 100644
--- a/src/logger.c
+++ b/src/logger.c
@@ -915,11 +915,62 @@ void logger_log_after_communcations(
  */
 void logger_log_recv_strays(
     struct logger_writer *log,
-    struct part *parts, size_t nr_parts, int *counts,
-    struct gpart *gparts, size_t nr_gparts, int *g_counts,
-    struct spart *sparts, size_t nr_sparts, int *s_counts,
-    struct bpart *bparts, size_t nr_bparts, int *b_counts) {
-  error("TODO");
+    struct part *parts, struct xpart *xparts, size_t nr_parts,
+    struct gpart *gparts, size_t nr_gparts,
+    struct spart *sparts, size_t nr_sparts,
+    struct bpart *bparts, size_t nr_bparts,
+    int node_id) {
+
+  const int flag = logger_generate_flag(logger_flag_mpi | logger_flag_create,
+                                        node_id);
+
+  /* Log the gas particles */
+  const unsigned int mask_hydro =
+    logger_mask_data[logger_x].mask | logger_mask_data[logger_v].mask |
+    logger_mask_data[logger_a].mask | logger_mask_data[logger_u].mask |
+    logger_mask_data[logger_h].mask | logger_mask_data[logger_rho].mask |
+    logger_mask_data[logger_consts].mask |
+    logger_mask_data[logger_special_flags].mask;
+
+  for(size_t i = 0; i < nr_parts; i++) {
+    logger_log_part(log, &parts[i], mask_hydro,
+                    &xparts[i].logger_data.last_offset,
+                    flag);
+    xparts[i].logger_data.steps_since_last_output = 0;
+  }
+
+  /* Log the stellar particles */
+  const unsigned int mask_stars = logger_mask_data[logger_x].mask |
+    logger_mask_data[logger_v].mask |
+    logger_mask_data[logger_consts].mask |
+    logger_mask_data[logger_special_flags].mask;
+  for(size_t i = 0; i < nr_sparts; i++) {
+    logger_log_spart(log, &sparts[i], mask_stars,
+                     &sparts[i].logger_data.last_offset,
+                     /* Special flags */ 0);
+    sparts[i].logger_data.steps_since_last_output = 0;
+  }
+
+
+  /* Log the gparts */
+  const unsigned int mask_grav =
+    logger_mask_data[logger_x].mask | logger_mask_data[logger_v].mask |
+    logger_mask_data[logger_a].mask | logger_mask_data[logger_consts].mask |
+    logger_mask_data[logger_special_flags].mask;
+  for(size_t i = 0; i < nr_gparts; i++) {
+    /* Log only the dark matter */
+    if (gparts[i].type != swift_type_dark_matter) continue;
+
+    logger_log_gpart(log, &gparts[i], mask_grav,
+                     &gparts[i].logger_data.last_offset,
+                     /* Special flags */ 0);
+    gparts[i].logger_data.steps_since_last_output = 0;
+  }
+
+  /* Log the bparts */
+  if (nr_bparts > 0) {
+    error("TODO");
+  }
 }
 
 #endif
@@ -935,6 +986,9 @@ void logger_struct_dump(const struct logger_writer *log, FILE *stream) {
                        "logger", "logger");
 }
 
+
+// TODO remove that
+void dump_restart(struct dump *dump, char *log_name, int size) {}
 /**
  * @brief Restore a logger struct from the given FILE as a stream of
  * bytes.
diff --git a/src/logger.h b/src/logger.h
index 12fc5db62bfc44a4fde72c6598f03ab5b42b5b5b..c7a76cf8bd27a3404803e258ed13c98e07c4e229 100644
--- a/src/logger.h
+++ b/src/logger.h
@@ -38,7 +38,7 @@ struct part;
 struct engine;
 
 #define logger_major_version 0
-#define logger_minor_version 2
+#define logger_minor_version 3
 
 /**
  * Logger entries contain messages representing the particle data at a given
@@ -95,8 +95,10 @@ enum logger_masks_number {
 } __attribute__((packed));
 
 enum logger_special_flags {
-  logger_flag_change_type = 0,
-  logger_flag_mpi = 1,
+  logger_flag_change_type = 1 << 0, /* Flag for a change of particle type */
+  logger_flag_mpi = 1 << 1, /* Flag for a change of MPI rank */
+  logger_flag_delete = 1 << 2, /* Flag for a deleted particle */
+  logger_flag_create = 1 << 3 /* Flag for a created particle */
 } __attribute__((packed));
 
 struct mask_data {
@@ -185,7 +187,7 @@ void logger_struct_dump(const struct logger_writer *log, FILE *stream);
 void logger_struct_restore(struct logger_writer *log, FILE *stream);
 
 
-int logger_generate_flag(enum logger_special_flags flag, int data) {
+INLINE static int logger_generate_flag(enum logger_special_flags flag, int data) {
 #ifdef SWIFT_DEBUG_CHECKS
   if (flag & 0xFFFFFF00) {
     error("The special flag in the logger cannot be larger than 1 byte.");
@@ -206,6 +208,15 @@ void logger_log_after_communcations(
   struct gpart *gparts, size_t nr_gparts, int *g_counts,
   struct spart *sparts, size_t nr_sparts, int *s_counts,
   struct bpart *bparts, size_t nr_bparts, int *b_counts);
+
+void logger_log_recv_strays(
+  struct logger_writer *log,
+  struct part *parts, struct xpart *xparts, size_t nr_parts,
+  struct gpart *gparts, size_t nr_gparts,
+  struct spart *sparts, size_t nr_sparts,
+  struct bpart *bparts, size_t nr_bparts,
+  int node_id);
+
 #endif
 
 /**