diff --git a/examples/main.c b/examples/main.c
index 0d533bcd4ecd63b8f2ec061aebe64dca54896520..69b066370e222043af12c2f05b5474d453f55167 100644
--- a/examples/main.c
+++ b/examples/main.c
@@ -335,7 +335,7 @@ int main(int argc, char *argv[]) {
 
 #if !defined(WITH_LOGGER)
   if (with_logger) {
-    printf("Error: the logger is not available, please compile with --enable-logger.");
+    printf("Error: the particle logger is not available, please compile with --enable-logger.");
     return 1;
   }
 #endif
diff --git a/src/engine.c b/src/engine.c
index d7a09c8a6be893fea2463bbd6a6b3d6098e8bef6..1207c9612258a842f7eed045274e6653f845d88c 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -462,9 +462,9 @@ void engine_exchange_strays(struct engine *e, const size_t offset_parts,
 
       /* Log the particle when leaving a rank. */
       logger_log_part(e->logger, &s->parts[offset_parts + k],
+                      &s->xparts[offset_parts + k],
                       logger_masks_all_part |
                       logger_mask_data[logger_special_flags].mask,
-                      &s->xparts[offset_parts + k].logger_data.last_offset,
                       logger_flag);
     }
 #endif
@@ -513,7 +513,6 @@ void engine_exchange_strays(struct engine *e, const size_t offset_parts,
       logger_log_spart(e->logger, &s->sparts[offset_sparts + k],
                        logger_masks_all_spart |
                        logger_mask_data[logger_special_flags].mask,
-                       &s->sparts[offset_parts + k].logger_data.last_offset,
                        logger_flag);
     }
 #endif
@@ -600,7 +599,6 @@ void engine_exchange_strays(struct engine *e, const size_t offset_parts,
       logger_log_gpart(e->logger, &s->gparts[offset_gparts + k],
                        logger_masks_all_gpart |
                        logger_mask_data[logger_special_flags].mask,
-                       &s->sparts[offset_parts + k].logger_data.last_offset,
                        logger_flag);
     }
 #endif
diff --git a/src/logger.c b/src/logger.c
index 57475769de33698fbd63b6cfe53ecdc1137be7b7..5fdaeeea4724ed00abb24b7043b7f000e68253e7 100644
--- a/src/logger.c
+++ b/src/logger.c
@@ -181,10 +181,9 @@ void logger_log_all(struct logger_writer *log, const struct engine *e) {
 
   /* loop over all parts. */
   for (size_t i = 0; i < s->nr_parts; i++) {
-    logger_log_part(log, &s->parts[i], logger_masks_all_part,
-                    &s->xparts[i].logger_data.last_offset,
+    logger_log_part(log, &s->parts[i], &s->xparts[i],
+                    logger_masks_all_part,
                     /* Special flags */ 0);
-    s->xparts[i].logger_data.steps_since_last_output = 0;
   }
 
   /* loop over all gparts */
@@ -193,17 +192,13 @@ void logger_log_all(struct logger_writer *log, const struct engine *e) {
     if (s->gparts[i].type != swift_type_dark_matter) continue;
 
     logger_log_gpart(log, &s->gparts[i], logger_masks_all_gpart,
-                     &s->gparts[i].logger_data.last_offset,
                      /* Special flags */ 0);
-    s->gparts[i].logger_data.steps_since_last_output = 0;
   }
 
   /* loop over all sparts */
   for (size_t i = 0; i < s->nr_sparts; i++) {
     logger_log_spart(log, &s->sparts[i], logger_masks_all_spart,
-                     &s->sparts[i].logger_data.last_offset,
                      /* Special flags */ 0);
-    s->sparts[i].logger_data.steps_since_last_output = 0;
   }
 
   if (e->total_nr_bparts > 0) error("Not implemented");
@@ -294,28 +289,16 @@ void logger_copy_part_fields(
  *
  * @param log The #logger_writer
  * @param p The #part to dump.
+ * @param xp The #xpart to dump.
  * @param mask The mask of the data to dump.
- * @param offset Pointer to the offset of the previous log of this particle;
- * (return) offset of this log.
  * @param special_flags The value of the special flag.
  */
 void logger_log_part(struct logger_writer *log, const struct part *p,
-                     unsigned int mask, size_t *offset,
+                     struct xpart *xp, unsigned int mask,
                      const uint32_t special_flags) {
 
-  /* Start by computing the size of the message. */
-  const int size = logger_compute_chunk_size(mask);
-
-  /* Allocate a chunk of memory in the dump of the right size. */
-  size_t offset_new;
-  char *buff = (char *)dump_get(&log->dump, size, &offset_new);
-
-  /* Copy everything into the buffer */
-  logger_copy_part_fields(p, mask, offset, offset_new, buff,
-                          special_flags);
-
-  /* Update the log message offset. */
-  *offset = offset_new;
+  logger_log_parts(log, p, xp, /* count */ 1, mask,
+                   special_flags);
 }
 
 /**
@@ -413,28 +396,13 @@ void logger_copy_spart_fields(
  * @param log The #logger_writer
  * @param sp The #spart to dump.
  * @param mask The mask of the data to dump.
- * @param offset Pointer to the offset of the previous log of this particle;
  * @param special_flags The value of the special flag.
- * (return) offset of this log.
  */
-void logger_log_spart(struct logger_writer *log, const struct spart *sp,
-                      unsigned int mask, size_t *offset,
-                      const uint32_t special_flags) {
-
+void logger_log_spart(struct logger_writer *log, struct spart *sp,
+                      unsigned int mask, const uint32_t special_flags) {
 
-  /* Start by computing the size of the message. */
-  const int size = logger_compute_chunk_size(mask);
-
-  /* Allocate a chunk of memory in the dump of the right size. */
-  size_t offset_new;
-  char *buff = (char *)dump_get(&log->dump, size, &offset_new);
-
-  /* Copy the fields into the buffer. */
-  logger_copy_spart_fields(sp, mask, offset, offset_new, buff,
-                           special_flags);
-
-  /* Update the log message offset. */
-  *offset = offset_new;
+  logger_log_sparts(log, sp, /* count */ 1, mask,
+                    special_flags);
 }
 
 /**
@@ -544,27 +512,11 @@ void logger_copy_gpart_fields(
  * @param log The #logger_writer
  * @param p The #gpart to dump.
  * @param mask The mask of the data to dump.
- * @param offset Pointer to the offset of the previous log of this particle;
- * (return) offset of this log.
  * @param special_flags The value of the special flags.
  */
-void logger_log_gpart(struct logger_writer *log, const struct gpart *p,
-                      unsigned int mask, size_t *offset,
-                      const uint32_t special_flags) {
-
-  /* Start by computing the size of the message. */
-  const int size = logger_compute_chunk_size(mask);
-
-  /* Allocate a chunk of memory in the dump of the right size. */
-  size_t offset_new;
-  char *buff = (char *)dump_get(&log->dump, size, &offset_new);
-
-  /* Copy everything into the buffer */
-  logger_copy_gpart_fields(p, mask, offset, offset_new, buff,
-                           special_flags);
-
-  /* Update the log message offset. */
-  *offset = offset_new;
+void logger_log_gpart(struct logger_writer *log, struct gpart *p,
+                      unsigned int mask, const uint32_t special_flags) {
+  logger_log_gparts(log, p, /* count */ 1, mask, special_flags);
 }
 
 /**
diff --git a/src/logger.h b/src/logger.h
index 016eaffcfda525ba42ce795ceb10e178fba9541d..e67ef4c902d5bb1acf58f0fe0b687fb57464f8e5 100644
--- a/src/logger.h
+++ b/src/logger.h
@@ -173,20 +173,18 @@ struct logger_part_data {
 int logger_compute_chunk_size(unsigned int mask);
 void logger_log_all(struct logger_writer *log, const struct engine *e);
 void logger_log_part(struct logger_writer *log, const struct part *p,
-                     unsigned int mask, size_t *offset,
+                     struct xpart *xp, unsigned int mask,
                      const uint32_t special_flags);
 void logger_log_parts(struct logger_writer *log, const struct part *p,
                       struct xpart *xp, int count,
                       unsigned int mask, const uint32_t special_flags);
-void logger_log_spart(struct logger_writer *log, const struct spart *p,
-                      unsigned int mask, size_t *offset,
-                      const uint32_t special_flags);
+void logger_log_spart(struct logger_writer *log, struct spart *p,
+                      unsigned int mask, const uint32_t special_flags);
 void logger_log_sparts(struct logger_writer *log, struct spart *sp,
                        int count, unsigned int mask,
                        const uint32_t special_flags);
-void logger_log_gpart(struct logger_writer *log, const struct gpart *p,
-                      unsigned int mask, size_t *offset,
-                      const uint32_t special_flags);
+void logger_log_gpart(struct logger_writer *log, struct gpart *p,
+                      unsigned int mask, const uint32_t special_flags);
 void logger_log_gparts(struct logger_writer *log, struct gpart *gp,
                        int count, unsigned int mask,
                        const uint32_t special_flags);
diff --git a/src/runner_others.c b/src/runner_others.c
index c1a15be19e357768d70589ec76783cc01b1b58c9..68e91c17d68a29c8f79ec974cf04aadc90d57917 100644
--- a/src/runner_others.c
+++ b/src/runner_others.c
@@ -315,7 +315,7 @@ void runner_do_star_formation(struct runner *r, struct cell *c, int timer) {
             /* Write the particle */
             /* Logs all the fields request by the user */
             // TODO select only the requested fields
-            logger_log_part(e->logger, p,
+            logger_log_part(e->logger, p, xp,
                             logger_mask_data[logger_x].mask |
                                 logger_mask_data[logger_v].mask |
                                 logger_mask_data[logger_a].mask |
@@ -324,7 +324,6 @@ void runner_do_star_formation(struct runner *r, struct cell *c, int timer) {
                                 logger_mask_data[logger_rho].mask |
                                 logger_mask_data[logger_consts].mask |
                                 logger_mask_data[logger_special_flags].mask,
-                            &xp->logger_data.last_offset,
                             logger_pack_flags_and_data(logger_flag_change_type, swift_type_stars));
 #endif
 
@@ -352,13 +351,9 @@ void runner_do_star_formation(struct runner *r, struct cell *c, int timer) {
               /* Write the s-particle */
               logger_log_spart(e->logger, sp,
                                logger_mask_data[logger_x].mask |
-                                   logger_mask_data[logger_v].mask |
-                                   logger_mask_data[logger_consts].mask,
-                               &sp->logger_data.last_offset,
+                               logger_mask_data[logger_v].mask |
+                               logger_mask_data[logger_consts].mask,
                                /* special flags */ 0);
-
-              /* Set counter back to zero */
-              sp->logger_data.steps_since_last_output = 0;
 #endif
             }
           }
@@ -610,6 +605,10 @@ void runner_do_logger(struct runner *r, struct cell *c, int timer) {
   const int gcount = c->grav.count;
   const int scount = c->stars.count;
 
+  if (c->black_holes.count != 0) {
+    error("Black holes are not implemented in the logger.");
+  }
+
   /* Anything to do here? */
   if (!cell_is_active_hydro(c, e) && !cell_is_active_gravity(c, e) &&
       !cell_is_active_stars(c, e))
@@ -634,19 +633,15 @@ void runner_do_logger(struct runner *r, struct cell *c, int timer) {
         if (logger_should_write(&xp->logger_data, e->logger)) {
           /* Write particle */
           /* Currently writing everything, should adapt it through time */
-          logger_log_part(e->logger, p,
+          logger_log_part(e->logger, p, xp,
                           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,
-                          &xp->logger_data.last_offset,
+                          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,
                           /* special flags */ 0);
-
-          /* Set counter back to zero */
-          xp->logger_data.steps_since_last_output = 0;
         } else
           /* Update counter */
           xp->logger_data.steps_since_last_output += 1;
@@ -673,11 +668,8 @@ void runner_do_logger(struct runner *r, struct cell *c, int timer) {
                                logger_mask_data[logger_v].mask |
                                logger_mask_data[logger_a].mask |
                                logger_mask_data[logger_consts].mask,
-                           &gp->logger_data.last_offset,
                            /* Special flags */ 0);
 
-          /* Set counter back to zero */
-          gp->logger_data.steps_since_last_output = 0;
         } else
           /* Update counter */
           gp->logger_data.steps_since_last_output += 1;
@@ -700,11 +692,7 @@ void runner_do_logger(struct runner *r, struct cell *c, int timer) {
                            logger_mask_data[logger_x].mask |
                                logger_mask_data[logger_v].mask |
                                logger_mask_data[logger_consts].mask,
-                           &sp->logger_data.last_offset,
                            /* Special flags */ 0);
-
-          /* Set counter back to zero */
-          sp->logger_data.steps_since_last_output = 0;
         } else
           /* Update counter */
           sp->logger_data.steps_since_last_output += 1;