diff --git a/logger/logger_header.c b/logger/logger_header.c
index aaebc0fa4547a26d3c49b5444802dd444020c20e..f16673ffcbdaa665c6873a19ada31eed1f5b3d1f 100644
--- a/logger/logger_header.c
+++ b/logger/logger_header.c
@@ -89,7 +89,7 @@ int header_get_field_index(const struct header *h, const char *field) {
  */
 void header_change_offset_direction(struct header *h, enum logger_offset_direction new_value) {
   h->offset_direction = new_value;
-  /* Skip file format and version numbers */
+  /* Skip file format and version numbers. */
   size_t offset = LOGGER_VERSION_SIZE + 2 * sizeof(int);
 
   logger_loader_io_write_data(h->log->log.map + offset, sizeof(unsigned int), &new_value);
@@ -104,19 +104,19 @@ void header_change_offset_direction(struct header *h, enum logger_offset_directi
 void header_read(struct header *h, struct logger_logfile *log) {
   void *map = log->log.map;
 
-  /* Set pointer to log */
+  /* Set pointer to log. */
   h->log = log;
 
-  /* read file format */
+  /* read the file format. */
   char file_format[STRING_SIZE];
   map = logger_loader_io_read_data(map, LOGGER_VERSION_SIZE, &file_format);
   if (strcmp(file_format, "SWIFT_LOGGER"))
     error("Wrong file format (%s)", file_format);
 
-  /* Read major version number */
+  /* Read the major version number. */
   map = logger_loader_io_read_data(map, sizeof(int), &h->major_version);
 
-  /* Read minor version number */
+  /* Read the minor version number. */
   map = logger_loader_io_read_data(map, sizeof(int), &h->minor_version);
 
   struct logger_reader *reader = log->reader;
@@ -126,43 +126,43 @@ void header_read(struct header *h, struct logger_logfile *log) {
   if (reader->verbose > 0)
     message("File version %i.%i", h->major_version, h->minor_version);
 
-  /* read the offset directions */
+  /* Read the offset directions. */
   map = logger_loader_io_read_data(map, sizeof(int), &h->offset_direction);
 
   if (!header_is_forward(h) && !header_is_backward(h) &&
       !header_is_corrupted(h))
     error("Wrong offset value in the header (%i)", h->offset_direction);
 
-  /* read offset to first record */
+  /* Read offset to first record. */
   map = logger_loader_io_read_data(map, LOGGER_OFFSET_SIZE, &h->offset_first_record);
 
-  /* read the size of the strings */
+  /* Read the size of the strings. */
   map = logger_loader_io_read_data(map, sizeof(unsigned int), &h->string_length);
 
-  /* check if value defined in this file is large enough. */
+  /* Check if value defined in this file is large enough. */
   if (STRING_SIZE < h->string_length) {
     error("Name too large in log file %i", h->string_length);
   }
 
-  /* read the number of masks. */
+  /* Read the number of masks. */
   map = logger_loader_io_read_data(map, sizeof(unsigned int), &h->number_mask);
 
-  /* allocate the masks memory. */
+  /* Allocate the masks memory. */
   h->masks = malloc(sizeof(struct mask_data) * h->number_mask);
 
-  /* loop over all masks. */
+  /* Loop over all masks. */
   for (size_t i = 0; i < h->number_mask; i++) {
-    /* read the mask name. */
+    /* Read the mask name. */
     map = logger_loader_io_read_data(map, h->string_length, h->masks[i].name);
 
-    /* set the mask value. */
+    /* Set the mask value. */
     h->masks[i].mask = 1 << i;
 
-    /* read the mask data size. */
+    /* Read the mask data size. */
     map = logger_loader_io_read_data(map, sizeof(unsigned int), &h->masks[i].size);
   }
 
-  /* Check the logfile header's size */
+  /* Check the logfile header's size. */
   if (map != log->log.map + h->offset_first_record) {
     header_print(h);
     size_t offset = map - log->log.map;
@@ -181,7 +181,7 @@ void header_read(struct header *h, struct logger_logfile *log) {
  */
 size_t header_get_record_size_from_mask(const struct header *h, const size_t mask) {
   size_t count = 0;
-  /* Loop over each masks */
+  /* Loop over each masks. */
   for (size_t i = 0; i < h->number_mask; i++) {
     if (mask & h->masks[i].mask) {
       count += h->masks[i].size;
diff --git a/logger/logger_header.h b/logger/logger_header.h
index 606e8d74e21c559ac562be225978a004e49721e5..c8cee8634e2e2071d4b8352305efedf90e774474 100644
--- a/logger/logger_header.h
+++ b/logger/logger_header.h
@@ -32,7 +32,7 @@ enum logger_offset_direction {
   logger_offset_backward = 0,
   logger_offset_forward,
   logger_offset_corrupted,
-  /* Number of offset type */
+  /* Number of offset type. */
   logger_offset_count,
 };
 
@@ -56,10 +56,10 @@ struct logger_logfile;
  * The only function that modify the file is #header_change_offset_direction.
  */
 struct header {
-  /* Dump's major version */
+  /* Dump's major version. */
   int major_version;
 
-  /* Dump's minor version */
+  /* Dump's minor version. */
   int minor_version;
 
   /* Offset of the first record. */
@@ -77,7 +77,7 @@ struct header {
   /* Direction of the offset in the records. */
   enum logger_offset_direction offset_direction;
 
-  /* The corresponding log */
+  /* The corresponding log. */
   struct logger_logfile *log;
 };
 
diff --git a/logger/logger_index.c b/logger/logger_index.c
index 25e81403e46e40ced3f060c446f4f5b5f984c3a1..4d8ccfd8b0883c0da650c632ca67d434073eda2f 100644
--- a/logger/logger_index.c
+++ b/logger/logger_index.c
@@ -70,7 +70,7 @@ void logger_index_init(struct logger_index *index, struct logger_reader *reader,
  */
 void logger_index_free(struct logger_index *index) {
 
-  /* unmap file */
+  /* unmap file. */
   logger_loader_io_munmap_file(index->data, index->file_size);
 
   /* Set variables to default value. */
diff --git a/logger/logger_index.h b/logger/logger_index.h
index f19c852a79f27f794062626ecb5b4cadf6fe70aa..57cf7207858c108225a60dc0a13abf547ca27970 100644
--- a/logger/logger_index.h
+++ b/logger/logger_index.h
@@ -30,10 +30,10 @@ struct logger_reader;
 
 
 struct logger_index_data {
-  /* The particle's id */
+  /* The particle's id. */
   uint64_t id;
 
-  /* The particle's offset */
+  /* The particle's offset. */
   uint64_t offset;
 };
 
@@ -45,25 +45,25 @@ struct logger_index_data {
  * #logger_index_free.
  */
 struct logger_index {
-  /* The reader */
+  /* The reader. */
   struct logger_reader *reader;
 
-  /* memory map of the index file */
+  /* memory map of the index file. */
   void *data;
 
-  /* Index file size */
+  /* Index file size. */
   size_t file_size;
 
-  /* Number of particles */
+  /* Number of particles. */
   size_t total_number_particles;
 
-  /* Number of particles per type */
+  /* Number of particles per type. */
   long long number_particles[swift_type_count];
 
-  /* Time of the index file */
+  /* Time of the index file. */
   double time;
 
-  /* Integer time of the index file */
+  /* Integer time of the index file. */
   integertime_t int_time;
   
 };
diff --git a/logger/logger_loader_io.c b/logger/logger_loader_io.c
index bcbe41c0fb5377b4325bd71b2bf78efe46258eb2..6d6593008719a42013c5083babf5e4666ed5906c 100644
--- a/logger/logger_loader_io.c
+++ b/logger/logger_loader_io.c
@@ -88,7 +88,7 @@ void *logger_loader_io_mmap_file(char *filename, size_t *file_size, int read_onl
  *
  */
 void logger_loader_io_munmap_file(void *map, size_t file_size) {
-  /* unmap */
+  /* unmap the file. */
   if (munmap(map, file_size) != 0) {
     error("Unable to unmap the file (%s)", strerror(errno));
   }
diff --git a/logger/logger_logfile.c b/logger/logger_logfile.c
index 89d66084ed0e7a8f13058bbab04d1ef0131ef396..ea791bc955ca2ab87bc59ba7f61133b09b9abfea 100644
--- a/logger/logger_logfile.c
+++ b/logger/logger_logfile.c
@@ -38,7 +38,7 @@ void logger_logfile_init_from_file(
   if (&reader->log != log)
     error("Wrong link to the reader.");
 
-  /* Set pointers to zero */
+  /* Set pointers to zero. */
   time_array_init(&log->times);
 
   /* Open file, map it and get its size. */
@@ -58,26 +58,26 @@ void logger_logfile_init_from_file(
   }
 
   /* No need to continue if only the
-     header is required */
+     header is required. */
   if (only_header)
     return;
 
-  /* Check if the offset are corrupted */
+  /* Check if the offset are corrupted. */
   if (header_is_corrupted(&log->header)) {
     error("The offsets have been corrupted");
   }
 
-  /* Reverse the offsets direction */
+  /* Reverse the offsets direction. */
   if (header_is_backward(&log->header)) {
     logger_logfile_reverse_offset(log, filename);
   }
 
-  /* Initialize the time array */
+  /* Initialize the time array. */
   if (reader->verbose > 1)
     message("Reading the time stamps.");
   time_array_populate(&log->times, log);
 
-  /* Print the time array */
+  /* Print the time array. */
   if (reader->verbose > 0) {
     time_array_print(&log->times);
   }
@@ -104,7 +104,7 @@ void logger_logfile_free(struct logger_logfile *log) {
  */
 void logger_logfile_reverse_offset(struct logger_logfile *log, char *filename) {
 
-  /* Close and reopen the file in write mode */
+  /* Close and reopen the file in write mode. */
   logger_loader_io_munmap_file(log->log.map, log->log.file_size);
   log->log.map = logger_loader_io_mmap_file(
       filename, &log->log.file_size, /* read_only */ 0);
@@ -115,7 +115,7 @@ void logger_logfile_reverse_offset(struct logger_logfile *log, char *filename) {
   if (&reader->log != log)
     error("Wrong link to the reader.");
 
-  /* Check if the offsets need to be reversed */
+  /* Check if the offsets need to be reversed. */
   if (!header_is_backward(header)) {
     error("The offsets are already reversed.");
   }
@@ -175,7 +175,7 @@ void logger_logfile_reverse_offset(struct logger_logfile *log, char *filename) {
   }
 #endif
 
-  /* Close and reopen the file in read mode */
+  /* Close and reopen the file in read mode. */
   logger_loader_io_munmap_file(log->log.map, log->log.file_size);
   log->log.map = logger_loader_io_mmap_file(
       filename, &log->log.file_size, /* read_only */ 1);
diff --git a/logger/logger_logfile.h b/logger/logger_logfile.h
index 4f7d1124932750636675dbead2cd87aa0f4a4a6d..7dc964431f1a2b274c149bee085bb3c285883ab9 100644
--- a/logger/logger_logfile.h
+++ b/logger/logger_logfile.h
@@ -46,15 +46,15 @@ struct logger_logfile {
   /* The reader that is using this log file. */
   struct logger_reader *reader;
 
-  /* Information about the time records */
+  /* Information about the time records. */
   struct time_array times;
 
   /* The log's variables. */
   struct {
-    /* Mapped data */
+    /* Mapped data. */
     void *map;
 
-    /* File size */
+    /* File size. */
     size_t file_size;
 
   } log;
diff --git a/logger/logger_particle.c b/logger/logger_particle.c
index 30777834b16c370a2c06b0c41cf30a8bfffcbd3a..daaa0027572e8d26835f9654c8b288ee74feb538 100644
--- a/logger/logger_particle.c
+++ b/logger/logger_particle.c
@@ -77,7 +77,7 @@ void* logger_particle_read_field(struct logger_particle *part, void *map,
 				  const char *field, const size_t size) {
   void *p = NULL;
 
-  /* Get the correct pointer */
+  /* Get the correct pointer. */
   if (strcmp("positions", field) == 0) {
     p = &part->pos;
   } else if (strcmp("velocities", field) == 0) {
@@ -96,10 +96,10 @@ void* logger_particle_read_field(struct logger_particle *part, void *map,
     error("Type %s not defined", field);
   }
 
-  /* read the data */
+  /* read the data. */
   map = logger_loader_io_read_data(map, size, p);
 
-  /* Split the required fields */
+  /* Split the required fields. */
   if (strcmp("consts", field) == 0) {
     part->mass = 0;
     part->id = 0;
@@ -128,7 +128,7 @@ size_t logger_particle_read(struct logger_particle *part, const struct logger_re
 			    size_t offset, const double time,
 			    const enum logger_reader_type reader_type) {
 
-  /* Get a few pointers */
+  /* Get a few pointers. */
   const struct header *h = &reader->log.header;
   void *map = reader->log.log.map;
 
@@ -139,13 +139,13 @@ size_t logger_particle_read(struct logger_particle *part, const struct logger_re
 
   logger_particle_init(part);
 
-  /* Read the record mask */
+  /* Read the record's mask. */
   map = logger_loader_io_read_mask(h, map + offset, &mask, &h_offset);
 
-  /* Check if it is not a time record */
-  if (mask != 127) error("Unexpected mask: %lu", mask);
+  /* Check if it is not a time record. */
+  if (mask == 128) error("Unexpected mask: %lu", mask);
 
-  /* Read all the fields */
+  /* Read all the fields. */
   for (size_t i = 0; i < h->number_mask; i++) {
     if (mask & h->masks[i].mask) {
       map = logger_particle_read_field(part, map, h->masks[i].name,
@@ -160,7 +160,7 @@ size_t logger_particle_read(struct logger_particle *part, const struct logger_re
   else
     part->time = -1;
 
-  /* update the offset */
+  /* update the offset. */
   offset = (size_t) (map - reader->log.log.map);
 
   /* Check if an interpolation is required. */
@@ -183,7 +183,7 @@ size_t logger_particle_read(struct logger_particle *part, const struct logger_re
   h_offset += offset - header_get_record_size_from_mask(h, mask) - LOGGER_MASK_SIZE -
               LOGGER_OFFSET_SIZE;
 
-  /* Get time of next record */
+  /* Get time of next record. */
   part_next.time = time_array_get_time(times, h_offset);
 
   /* Read next record. */
@@ -232,7 +232,7 @@ void logger_particle_interpolate(
   double tmp;
   float ftmp;
 
-  /* interpolate vectors */
+  /* interpolate vectors. */
   for (size_t i = 0; i < DIM; i++) {
     tmp = (part_next->pos[i] - part_curr->pos[i]);
     part_curr->pos[i] += tmp * scaling;
@@ -244,10 +244,10 @@ void logger_particle_interpolate(
     part_curr->acc[i] += ftmp * scaling;
   }
 
-  /* interpolate scalars */
+  /* interpolate scalars. */
   ftmp = (part_next->entropy - part_curr->entropy);
   part_curr->entropy += ftmp * scaling;
 
-  /* set time */
+  /* set time. */
   part_curr->time = time;
 }
diff --git a/logger/logger_particle.h b/logger/logger_particle.h
index 66683266c4f1513e3a6a8f29a555b2270b583424..7b612948c0fd1c3bca916f1f4db4b8412374763e 100644
--- a/logger/logger_particle.h
+++ b/logger/logger_particle.h
@@ -52,31 +52,31 @@ struct logger_reader;
  * interpolation is required.
  */
 struct logger_particle {
-  /* position */
+  /* position. */
   double pos[DIM];
 
-  /* velocity */
+  /* velocity. */
   float vel[DIM];
 
-  /* acceleration */
+  /* acceleration. */
   float acc[DIM];
 
-  /* entropy */
+  /* entropy. */
   float entropy;
 
-  /* smoothing length */
+  /* smoothing length. */
   float h;
 
-  /* density */
+  /* density. */
   float density;
 
-  /* mass */
+  /* mass. */
   float mass;
 
-  /* id */
+  /* unique id. */
   size_t id;
 
-  /* time */
+  /* time of the record. */
   double time;
 };
 
@@ -84,8 +84,8 @@ struct logger_particle {
  * @brief Defines the type of interpolation
  */
 enum logger_reader_type {
-  logger_reader_const, /* Constant interpolation */
-  logger_reader_lin, /* Linear interpolation */
+  logger_reader_const, /* Constant interpolation. */
+  logger_reader_lin, /* Linear interpolation. */
 };
 
 void logger_particle_print(const struct logger_particle *p);
diff --git a/logger/logger_python_wrapper.c b/logger/logger_python_wrapper.c
index a447d3813e2b1353056c5ae7f2ab25afcc40831a..e50b59ff7b88f4f6db37bc2786de2496887e509c 100644
--- a/logger/logger_python_wrapper.c
+++ b/logger/logger_python_wrapper.c
@@ -44,11 +44,11 @@
 static PyObject *loadFromIndex(__attribute__((unused)) PyObject *self,
                                PyObject *args) {
 
-  /* input */
+  /* input variables. */
   PyArrayObject *offset = NULL;
   char *filename = NULL;
 
-  /* output */
+  /* output variables. */
   PyArrayObject *pos = NULL;
   PyArrayObject *vel = NULL;
   PyArrayObject *acc = NULL;
@@ -61,8 +61,7 @@ static PyObject *loadFromIndex(__attribute__((unused)) PyObject *self,
   size_t time_offset;
   int verbose = 2;
 
-  /* parse arguments */
-
+  /* parse arguments. */
   if (!PyArg_ParseTuple(args, "OsL|i", &offset, &filename, &time_offset,
                         &verbose))
     return NULL;
@@ -77,12 +76,12 @@ static PyObject *loadFromIndex(__attribute__((unused)) PyObject *self,
     error("Offset does not contain unsigned int");
   }
 
-  /* initialize the reader */
+  /* initialize the reader. */
   struct logger_reader reader;
   logger_reader_init(&reader, filename, verbose);
   struct header *h = &reader.log.header;
 
-  /* init array */
+  /* init array. */
   npy_intp dim[2];
   dim[0] = PyArray_DIMS(offset)[0];
   dim[1] = DIM;
@@ -90,7 +89,7 @@ static PyObject *loadFromIndex(__attribute__((unused)) PyObject *self,
   /* Get required time. */
   double time = time_array_get_time(&reader.log.times, time_offset);
 
-  /* init output */
+  /* init output. */
   if (header_get_field_index(h, "positions") != -1) {
     pos = (PyArrayObject *)PyArray_SimpleNew(2, dim, NPY_DOUBLE);
   }
@@ -127,19 +126,21 @@ static PyObject *loadFromIndex(__attribute__((unused)) PyObject *self,
   if (verbose > 1)
     message("Reading particles.");
 
-  /* loop over all particles */
+  /* loop over all particles. */
   for (npy_intp i = 0; i < PyArray_DIMS(offset)[0]; i++) {
     struct logger_particle part;
 
+    /* Get the offset. */
     size_t offset_particle = *(size_t *)PyArray_GETPTR1(offset, i);
 
+    /* Read the particle. */
     logger_particle_read(&part, &reader, offset_particle, time, logger_reader_lin);
 
     double *dtmp;
     float *ftmp;
     size_t *stmp;
 
-    /* copy data */
+    /* copy the data. */
     for (size_t k = 0; k < DIM; k++) {
       if (pos) {
         dtmp = PyArray_GETPTR2(pos, i, k);
@@ -183,10 +184,10 @@ static PyObject *loadFromIndex(__attribute__((unused)) PyObject *self,
     }
   }
 
-  /* Free the memory */
+  /* Free the memory. */
   logger_reader_free(&reader);
 
-  /* construct return value */
+  /* construct return value. */
   PyObject *dict = PyDict_New();
   PyObject *key = PyUnicode_FromString("positions");
   PyDict_SetItem(dict, key, PyArray_Return(pos));
@@ -237,26 +238,25 @@ static PyObject *loadFromIndex(__attribute__((unused)) PyObject *self,
  */
 static PyObject *pyReverseOffset(__attribute__((unused)) PyObject *self,
                                  PyObject *args) {
-  /* input */
+  /* input variables. */
   char *filename = NULL;
 
   int verbose = 0;
 
-  /* parse arguments */
-
+  /* parse the arguments. */
   if (!PyArg_ParseTuple(args, "s|i", &filename, &verbose)) return NULL;
 
-  /* initialize the reader (and reverse the offset if necessary) */
+  /* initialize the reader which reverse the offset if necessary. */
   struct logger_reader reader;
   logger_reader_init(&reader, filename, verbose);
 
-  /* Free the reader */
+  /* Free the reader. */
   logger_reader_free(&reader);
 
   return Py_BuildValue("");
 }
 
-/* definition of the method table */
+/* definition of the method table. */
 
 static PyMethodDef libloggerMethods[] = {
     {"loadFromIndex", loadFromIndex, METH_VARARGS,
diff --git a/logger/logger_reader.c b/logger/logger_reader.c
index 7020b5de196bc5b6fb624d4c52ecc4ae7152469c..d1e5eaab42bb3bbd752e816cf90c163c5a3f3bc7 100644
--- a/logger/logger_reader.c
+++ b/logger/logger_reader.c
@@ -30,10 +30,10 @@ void logger_reader_init(struct logger_reader *reader, char *filename, int verbos
   if (verbose > 1)
     message("Initializing the reader");
 
-  /* Initialize the reader variables */
+  /* Initialize the reader variables. */
   reader->verbose = verbose;
 
-  /* Initialize the log file */
+  /* Initialize the log file. */
   logger_logfile_init_from_file(&reader->log, filename, reader,
 				/* only_header */ 0);
 
@@ -47,6 +47,44 @@ void logger_reader_init(struct logger_reader *reader, char *filename, int verbos
  * @param reader The #logger_reader.
  */
 void logger_reader_free(struct logger_reader *reader) {
-  /* Free the log */
+  /* Free the log. */
   logger_logfile_free(&reader->log);
 }
+
+/**
+ * @brief Read a record (timestamp or particle)
+ *
+ * @param reader The #reader.
+ * @param lp (out) The #logger_particle (if the record is a particle).
+ * @param time (out) The time read (if the record is a timestamp).
+ * @param is_particle Is the record a particle (or a timestamp)?
+ * @param offset The offset in the file.
+ *
+ * @return The offset after this record.
+ */
+size_t reader_read_record(struct logger_reader *reader, struct logger_particle *lp,
+		   double *time, int *is_particle, size_t offset) {
+
+  struct logger_logfile *log = &reader->log;
+
+  /* Read mask to find out if timestamp or particle. */
+  size_t mask = 0;
+  logger_loader_io_read_mask(&log->header, log->log.map + offset, &mask, NULL);
+
+  /* Check if timestamp or not. */
+  int ind = header_get_field_index(&log->header, "timestamp");
+  if (ind == -1) {
+    error("File header does not contain a mask for time");
+  }
+  if (log->header.masks[ind].mask == mask) {
+    *is_particle = 0;
+    integertime_t int_time = 0;
+    offset = time_read(&int_time, time, reader, offset);
+  }
+  else {
+    *is_particle = 1;
+    offset = logger_particle_read(lp, reader, offset, *time, logger_reader_const);
+  }
+
+  return offset;
+}
diff --git a/logger/logger_reader.h b/logger/logger_reader.h
index ab20f5008af2192c89341efc1a878d67bf301ff0..863327bc6d6b4c5ebe4ba31de31596680825935e 100644
--- a/logger/logger_reader.h
+++ b/logger/logger_reader.h
@@ -41,8 +41,10 @@
 #ifndef __LOGGER_LOGGER_READER_H__
 #define __LOGGER_LOGGER_READER_H__
 
+#include "logger_loader_io.h"
 #include "logger_logfile.h"
 #include "logger_index.h"
+#include "logger_particle.h"
 
 /**
  * @brief Main structure of the logger.
@@ -55,20 +57,21 @@
  */
 struct logger_reader {
 
-  /* Time of each index file #TODO */
+  /* Time of each index file. #TODO */
   double *times;
 
-  /* Information contained in the index file */
+  /* Information contained in the index file. */
   struct logger_index index;
   
-  /* Informations contained in the file header */
+  /* Informations contained in the file header. */
   struct logger_logfile log;
 
-  /* Level of verbosity */
+  /* Level of verbosity. */
   int verbose;
 };
 
 void logger_reader_init(struct logger_reader *reader, char *filename, int verbose);
 void logger_reader_free(struct logger_reader *reader);
-
+size_t reader_read_record(struct logger_reader *reader, struct logger_particle *lp,
+			  double *time, int *is_particle, size_t offset);
 #endif  // __LOGGER_LOGGER_READER_H__
diff --git a/logger/logger_time.c b/logger/logger_time.c
index 96bdc6267e60d9948a7f76e0074045b956cc8264..0717c2459c8adae992ef7f2c8a259563ff48fa43 100644
--- a/logger/logger_time.c
+++ b/logger/logger_time.c
@@ -42,7 +42,7 @@ size_t time_read(integertime_t *int_time, double *time, const struct logger_read
   *int_time = 0;
   *time = 0;
 
-  /* read record header */
+  /* read record header. */
   map = logger_loader_io_read_mask(h, map + offset, &mask, &prev_offset);
 
 #ifdef SWIFT_DEBUG_CHECKS
@@ -55,7 +55,7 @@ size_t time_read(integertime_t *int_time, double *time, const struct logger_read
   if (h->masks[ind].mask != mask) error("Not a time record");
 #endif
 
-  /* read the record */
+  /* read the record. */
   map = logger_loader_io_read_data(map, sizeof(unsigned long long int), int_time);
   map = logger_loader_io_read_data(map, sizeof(double), time);
 
@@ -72,7 +72,7 @@ size_t time_read(integertime_t *int_time, double *time, const struct logger_read
  */
 size_t time_offset_first_record(const struct header *h) {
 
-  /* Initialize a few variables */
+  /* Initialize a few variables. */
   size_t offset = h->offset_first_record;
   void *map = h->log->log.map;
 
@@ -114,10 +114,10 @@ void time_array_populate(struct time_array *t, struct logger_logfile *log) {
   integertime_t int_time = 0;
   double time = 0;
 
-  /* get file size */
+  /* get file size. */
   size_t file_size = log->log.file_size;
 
-  /* get first time stamp */
+  /* get first time stamp. */
   size_t offset = time_offset_first_record(&log->header);
   while (offset < file_size) {
     /* read current time record and store it. */
@@ -127,7 +127,7 @@ void time_array_populate(struct time_array *t, struct logger_logfile *log) {
     t->int_time = int_time;
     t->time = time;
 
-    /* get next record */
+    /* get next record. */
     int test = tools_get_next_record(&log->header, log->log.map, &offset,
 				    log->log.file_size);
     if (test == -1) break;
@@ -140,7 +140,7 @@ void time_array_populate(struct time_array *t, struct logger_logfile *log) {
     t = tmp;
   }
 
-  /* free unused time_array */
+  /* free unused time_array. */
   struct time_array *tmp = t->prev;
   tmp->next = NULL;
   free(t);
@@ -188,7 +188,7 @@ struct time_array *time_array_get_time_array(const struct time_array *t,
   if (!t) error("NULL pointer");
 #endif
   const struct time_array *tmp;
-  /* Find the time_array with the correct offset */
+  /* Find the time_array with the correct offset. */
   for(tmp = t; tmp->next && tmp->offset <= offset; tmp = tmp->next)
     {}
 
diff --git a/logger/logger_time.h b/logger/logger_time.h
index 351d4936856de573d3276a7beb1365ff6efcaa4c..4e35ad025782de3ca617a191e0677e8b3af454ee 100644
--- a/logger/logger_time.h
+++ b/logger/logger_time.h
@@ -45,19 +45,19 @@ struct logger_reader;
  * #time_array_count.
  */
 struct time_array {
-  /* Pointer to next element */
+  /* Pointer to next element. */
   void *next;
 
-  /* Pointer to prev element */
+  /* Pointer to prev element. */
   void *prev;
 
-  /* Integertime of this time record */
+  /* Integertime of this time record. */
   integertime_t int_time;
 
-  /* Double time of this time record */
+  /* Double time of this time record. */
   double time;
 
-  /* Offset in the file of this time record */
+  /* Offset in the file of this time record. */
   size_t offset;
 };
 
diff --git a/logger/logger_tools.c b/logger/logger_tools.c
index 34c1e9ad724829779609bcaa0909b131b6ec3523..81e2b36a5f5ba60dc2fe3df15a20bed58dd06006 100644
--- a/logger/logger_tools.c
+++ b/logger/logger_tools.c
@@ -58,12 +58,12 @@ int _tools_get_next_record_forward(const struct header *h, void *map,
                                   size_t *offset) {
   size_t diff_offset = 0;
 
-  /* read offset */
+  /* Read the offset. */
   map = logger_loader_io_read_mask(h, map + *offset, NULL, &diff_offset);
 
   if (diff_offset == 0) return -1;
 
-  /* set absolute offset */
+  /* Set the absolute offset. */
   *offset += diff_offset;
   return 0;
 }
@@ -120,19 +120,19 @@ size_t tools_reverse_offset(const struct header *h, void *file_map, size_t offse
   const size_t cur_offset = offset;
   void *map = file_map;
 
-  /* read mask + offset */
+  /* read mask + offset. */
   map = logger_loader_io_read_mask(h, map + offset, &mask, &prev_offset);
 
-  /* write offset of zero (in case it is the last record) */
+  /* write offset of zero (in case it is the last record). */
   const size_t zero = 0;
   map -= LOGGER_OFFSET_SIZE;
   map = logger_loader_io_write_data(map, LOGGER_OFFSET_SIZE, &zero);
 
-  /* set offset after current record */
+  /* set offset after current record. */
   map += header_get_record_size_from_mask(h, mask);
   size_t after_current_record = (size_t) (map - file_map);
 
-  /* first records do not have a previous partner */
+  /* first records do not have a previous partner. */
   if (prev_offset == cur_offset)
     return after_current_record;
 
@@ -140,7 +140,7 @@ size_t tools_reverse_offset(const struct header *h, void *file_map, size_t offse
     error("Unexpected offset, header %lu, current %lu", prev_offset,
           cur_offset);
 
-  /* modify previous offset */
+  /* modify previous offset. */
   map = file_map + cur_offset - prev_offset + LOGGER_MASK_SIZE;
   map = logger_loader_io_write_data(map, LOGGER_OFFSET_SIZE, &prev_offset);
 
@@ -149,7 +149,9 @@ size_t tools_reverse_offset(const struct header *h, void *file_map, size_t offse
   map -= LOGGER_MASK_SIZE + LOGGER_OFFSET_SIZE;
   logger_loader_io_read_mask(h, map, &prev_mask, NULL);
 
-  if (prev_mask != mask)
+  /* Check if we are not mixing time stamp and particles */
+  if ((prev_mask != 128 && mask == 128) ||
+      (prev_mask == 128 && mask != 128))
     error("Unexpected mask: %lu, got %lu", mask, prev_mask);
 
 #endif  // SWIFT_DEBUG_CHECKS
@@ -180,10 +182,10 @@ size_t tools_check_record_consistency(const struct logger_reader *reader, size_t
   size_t mask;
   size_t pointed_offset;
 
-  /* read mask + offset */
+  /* read mask + offset. */
   map = logger_loader_io_read_mask(h, map, &mask, &pointed_offset);
 
-  /* get absolute offset */
+  /* get absolute offset. */
   if (header_is_forward(h))
     pointed_offset += offset;
   else if (header_is_backward(h)) {
@@ -196,18 +198,19 @@ size_t tools_check_record_consistency(const struct logger_reader *reader, size_t
     error("Offset are corrupted");
   }
 
-  /* set offset after current record */
+  /* set offset after current record. */
   map += header_get_record_size_from_mask(h, mask);
 
   if (pointed_offset == offset || pointed_offset == 0)
     return (size_t) (map - file_init);
 
-  /* read mask of the pointed record */
+  /* read mask of the pointed record. */
   size_t pointed_mask = 0;
   logger_loader_io_read_mask(h, file_init + pointed_offset, &pointed_mask, NULL);
 
-  /* check masks */
-  if (pointed_mask != mask)
+  /* check if not mixing time stamp and particles. */
+  if ((pointed_mask != 128 && mask == 128) ||
+      (pointed_mask == 128 && mask != 128))
     error("Error in the offset (mask %lu at %lu != %lu at %lu)", mask, offset,
           pointed_mask, pointed_offset);
 
diff --git a/logger/tests/testLogfileHeader.c b/logger/tests/testLogfileHeader.c
index 069a83122bd133ffa6c63ff389429c3c4b5e1304..a97eee0ade578b4c60a81626f931c3d6d9662217 100644
--- a/logger/tests/testLogfileHeader.c
+++ b/logger/tests/testLogfileHeader.c
@@ -30,7 +30,7 @@ int main(int argc, char *argv[]) {
 
   message("Generating the dump.");
   /* Create required structures. */
-  struct logger log;
+  struct logger_writer log;
   struct swift_params params;
   char filename[200] = "testLogfileHeader.yml";
 
@@ -40,7 +40,7 @@ int main(int argc, char *argv[]) {
   /* Initialize the logger. */
   logger_init(&log, &params);
 
-  /* get dump filename */
+  /* get dump filename. */
   char dump_filename[PARSER_MAX_LINE_SIZE];
   strcpy(dump_filename, log.base_name);
   strcat(dump_filename, ".dump");
@@ -48,7 +48,7 @@ int main(int argc, char *argv[]) {
   /* Write file header. */
   logger_write_file_header(&log);
 
-  /* clean memory */
+  /* clean memory. */
   logger_free(&log);
   /*
     Then read the file.
@@ -60,14 +60,14 @@ int main(int argc, char *argv[]) {
   struct logger_logfile *logfile = &reader.log;
   logfile->reader = &reader;
 
-  /* Set verbose level */
+  /* Set verbose level. */
   reader.verbose = 1;
   
   /* Read the header */
   logger_logfile_init_from_file(logfile, dump_filename, &reader,
 		      /* only_header */ 1);
   /*
-    Finally check everything
+    Finally check everything.
   */
 
   struct header *h = &logfile->header;
diff --git a/logger/tests/testLogfileReader.c b/logger/tests/testLogfileReader.c
index f6ad0e44d37c65113f2ef724b023b68afe8260cb..3f9686e8c45a6a1dea329263b6ea91a3af099e3d 100644
--- a/logger/tests/testLogfileReader.c
+++ b/logger/tests/testLogfileReader.c
@@ -24,6 +24,11 @@
 #include "logger_reader.h"
 
 #define number_parts 100
+/* Not all the fields are written at every step.
+ * Here we define how often a few fields are written.
+ */
+#define period_rho 2
+#define period_h 4
 
 /**
  * @brief Initialize the particles.
@@ -52,6 +57,9 @@ void init_particles(struct part *p, struct xpart *xp) {
     p[i].id = i;
     hydro_set_mass(&p[i], 1.5);
     xp[i].logger_data.last_offset = 0;
+
+    /* Add time bin in order to skip particles. */
+    p[i].time_bin = (i % 10) + 1;
   }
 }
 
@@ -66,33 +74,19 @@ double get_double_time(int step) {
   return step * time_base;
 }
 
+
 /**
  * @brief Write a few particles during multiple time steps.
  *
  * As only the logger is tested, there is no need to really
  * evolve the particles.
  */
-void write_particles(struct logger *log) {
+void write_particles(struct logger_writer *log, struct part *parts, struct xpart *xparts) {
 
 
   const int number_steps = 100;
 
-  /* Create particles and initialize them. */
-  struct part *parts;
-  if ((parts = (struct part *)malloc(sizeof(struct part) * number_parts)) == NULL)
-    error("Failed to allocate particles array.");
-
-  struct xpart *xparts;
-  if ((xparts = (struct xpart *)malloc(sizeof(struct xpart) * number_parts)) == NULL)
-    error("Failed to allocate xparticles array.");
-
-  init_particles(parts, xparts);
-
-  /*
-    Init logger
-  */
-    
-  /* Do step */
+  /* Loop over all the steps. */
   for(int i = 0; i < number_steps; i++) {
     integertime_t ti_int = get_integer_time(i);
     double ti_double = get_double_time(i);
@@ -104,23 +98,35 @@ void write_particles(struct logger *log) {
      * to store the particles in current time step. */
     logger_ensure_size(log, number_parts, /* number gpart */0, 0);
 
-    /* Run step */
+    /* Loop over all the particles. */
     for(int j = 0; j < number_parts; j++) {
 
-      /* Write particle */
-      /* TODO Currently writing everything, should adapt it through time */
-      logger_log_part(log, &parts[j],
-		      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,
+      /* Skip some particles. */
+      if (i % parts[j].time_bin != 0)
+	continue;
+
+      /* Write a time information to check that the correct particle is read. */
+      parts[j].x[0] = i;
+
+      /* Write this particle. */
+      unsigned int mask = 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_consts].mask;
+
+      int number_particle_step = i / parts[j].time_bin;
+
+      if (number_particle_step % period_h == 0)
+	mask |= logger_mask_data[logger_h].mask;
+      if (number_particle_step % period_rho == 0)
+	mask |= logger_mask_data[logger_rho].mask;
+	
+      logger_log_part(log, &parts[j], mask,
 		      &xparts[j].logger_data.last_offset);      
     }
 
-    // TODO write index files
+    // TODO write index files.
   }
 
   /* Mark the current time step in the particle logger file. */
@@ -130,107 +136,112 @@ void write_particles(struct logger *log) {
 		       &log->timestamp_offset);
 
 
-  /* Cleanup */
-  free(parts);
-  free(xparts);
 }
 
-/**
- * @brief Read a record (timestamp or particle)
- *
- * @param reader The #reader.
- * @param lp (out) The #logger_particle (if the record is a particle).
- * @param time (out) The time read (if the record is a timestamp).
- * @param is_particle Is the record a particle (or a timestamp)?
- * @param offset The offset in the file.
- *
- * @return The offset after this record.
- */
-size_t read_record(struct logger_reader *reader, struct logger_particle *lp,
-		   double *time, int *is_particle, size_t offset) {
-
-  struct logger_logfile *log = &reader->log;
-
-  /* Read mask to find out if timestamp or particle */
-  size_t mask = 0;
-  logger_loader_io_read_mask(&log->header, log->log.map + offset, &mask, NULL);
-
-  /* Check if timestamp or not */
-  int ind = header_get_field_index(&log->header, "timestamp");
-  if (ind == -1) {
-    error("File header does not contain a mask for time");
-  }
-  if (log->header.masks[ind].mask == mask) {
-    *is_particle = 0;
-    integertime_t int_time = 0;
-    offset = time_read(&int_time, time, reader, offset);
-  }
-  else {
-    *is_particle = 1;
-    offset = logger_particle_read(lp, reader, offset, *time, logger_reader_const);
+/** Count the number of active particles. */
+int get_number_active_particles(int step, struct part *p) {
+  int count = 0;
+  for(int i = 0; i < number_parts; i++) {
+      if (step % p[i].time_bin == 0)
+	count += 1;
   }
-
-  return offset;
+  return count;
 }
-
 /**
  * @brief Check that the reader contains the correct data
  *
  * @param reader The #logger_reader.
  */
-void check_data(struct logger_reader *reader) {
+void check_data(struct logger_reader *reader, struct part *parts, struct xpart *xparts) {
 
   /* No need to check the header, this is already done in testHeader.c */
 
-  /* Get required structures */
+  /* Get required structures. */
   struct logger_logfile *logfile = &reader->log;
   
   struct logger_particle lp;
   logger_particle_init(&lp);
 
-  /* Generate the particles again */
-  struct part *parts;
-  if ((parts = (struct part *)malloc(sizeof(struct part) * number_parts)) == NULL)
-    error("Failed to allocate particles array.");
-
-  struct xpart *xparts;
-  if ((xparts = (struct xpart *)malloc(sizeof(struct xpart) * number_parts)) == NULL)
-    error("Failed to allocate xparticles array.");
-
-  init_particles(parts, xparts);
-
+  /* Define a few variables */
   double time = get_double_time(0);
   int is_particle = 0;
-  int step = 0;
+  int step = -1;
+
+  /* Number of particle found during this time step. */
+  int count = 0;
+  /* Set it to an impossible value in order to flag it. */
+  const size_t id_flag = 5 * number_parts;
+  size_t previous_id = id_flag;
 
-  /* Loop over each record */
-  for(size_t offset = read_record(reader, &lp, &time, &is_particle, logfile->header.offset_first_record);
+  /* Loop over each record. */
+  for(size_t offset = reader_read_record(reader, &lp, &time, &is_particle, logfile->header.offset_first_record);
       offset < logfile->log.file_size;
-      offset = read_record(reader, &lp, &time, &is_particle, offset)) {
+      offset = reader_read_record(reader, &lp, &time, &is_particle, offset)) {
 
+    /* Do the particle case */
     if (is_particle) {
-      /* Check data if it is a particle */
+      count += 1;
+
+      /*
+	Check that we are really increasing the id in the logfile.
+	See the writing part to see that we are always increasing the id.
+      */
+      if (previous_id != id_flag && previous_id >= lp.id) {
+	error("Wrong particle found");
+	previous_id = lp.id;
+      }
+
+      /* Get the corresponding particle */
       if (lp.id >= number_parts)
 	error("Wrong id %zi", lp.id);
 
       struct part *p = &parts[lp.id];
 
+      /* Check the record's data. */
       for(int i = 0; i < 3; i++) {
-	assert(p->x[i] == lp.pos[i]);
+        /* in the first index, we are storing the step information. */
+	if (i == 0)
+	  assert(step == lp.pos[i]);
+	else
+	  assert(p->x[i] == lp.pos[i]);
 	assert(p->v[i] == lp.vel[i]);
 	assert(p->a_hydro[i] == lp.acc[i]);
       }
 
       assert(p->entropy == lp.entropy);
-      assert(p->h == lp.h);
-      assert(p->rho == lp.density);
       assert(p->mass == lp.mass);
+
+      /* Check optional fields. */
+      int number_steps = step / p->time_bin;
+      if (number_steps % period_h == 0) {
+	assert(p->h == lp.h);
+      }
+      else {
+	assert(-1 == lp.h);
+      }
+      if (number_steps % period_rho == 0) {
+	assert(p->rho == lp.density);
+      }
+      else {
+	assert(-1 == lp.density);
+      }
     }
+    /* Time stamp case. */
     else {
-      /* Check data if it is a timestamp */
-      assert(time == get_double_time(step));
+
+      /* Check if we have the current amount of particles in previous step. */
+      if (step != -1 && count != get_number_active_particles(step, parts))
+	error("The reader did not find the correct number of particles during step %i", step);
 
       step += 1;
+
+      /* Reset some variables. */
+      previous_id = id_flag;
+      count = 0;
+
+      /* Check the record's data. */
+      assert(time == get_double_time(step));
+
     }
   }
   
@@ -246,17 +257,28 @@ int main(int argc, char *argv[]) {
   message("Generating the dump.");
 
   /* Create required structures. */
-  struct logger log;
+  struct logger_writer log;
   struct swift_params params;
   char filename[200] = "testLogfileReader.yml";
 
   /* Read parameters. */
   parser_read_file(filename, &params);
 
+  /* Initialize the particles. */
+  struct part *parts;
+  if ((parts = (struct part *)malloc(sizeof(struct part) * number_parts)) == NULL)
+    error("Failed to allocate particles array.");
+
+  struct xpart *xparts;
+  if ((xparts = (struct xpart *)malloc(sizeof(struct xpart) * number_parts)) == NULL)
+    error("Failed to allocate xparticles array.");
+
+  init_particles(parts, xparts);
+
   /* Initialize the logger. */
   logger_init(&log, &params);
 
-  /* get dump filename */
+  /* get dump filename. */
   char dump_filename[PARSER_MAX_LINE_SIZE];
   message("%s", log.base_name);
   strcpy(dump_filename, log.base_name);
@@ -266,7 +288,7 @@ int main(int argc, char *argv[]) {
   logger_write_file_header(&log);
 
   /* Write particles. */
-  write_particles(&log);
+  write_particles(&log, parts, xparts);
 
   /* clean memory */
   logger_free(&log);
@@ -279,17 +301,21 @@ int main(int argc, char *argv[]) {
   /* Generate required structure for reading. */
   struct logger_reader reader;
 
-  /* Set verbose level */
+  /* Set verbose level. */
   reader.verbose = 1;
   
-  /* Read the header */
+  /* Read the header. */
   logger_reader_init(&reader, dump_filename, /* verbose */ 1);
 
   /*
-    Finally check everything
+    Finally check everything.
   */
 
-  check_data(&reader);
+  check_data(&reader, parts, xparts);
+
+  /* Do some cleanup. */
+  free(parts);
+  free(xparts);
 
   return 0;
 }
diff --git a/src/engine.c b/src/engine.c
index 00cd294c4ad764341b010e0fa4e2041e7a285d37..2b9cbd3895c21246c3f89fe1b69436e4a84185cb 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -5009,7 +5009,7 @@ void engine_init(struct engine *e, struct space *s, struct swift_params *params,
   e->total_nr_tasks = 0;
 
 #if defined(WITH_LOGGER)
-  e->logger = (struct logger *)malloc(sizeof(struct logger));
+  e->logger = (struct logger_writer *)malloc(sizeof(struct logger_writer));
   logger_init(e->logger, params);
 #endif
 
diff --git a/src/engine.h b/src/engine.h
index 3c74f89dfcade93bb67d21eb6607cdd4cb80155d..3484336039c64baa43469b1152f1856f70ee2823 100644
--- a/src/engine.h
+++ b/src/engine.h
@@ -379,7 +379,7 @@ struct engine {
   struct repartition *reparttype;
 
 #ifdef WITH_LOGGER
-  struct logger *logger;
+  struct logger_writer *logger;
 #endif
 
   /* How many steps have we done with the same set of tasks? */
diff --git a/src/logger.c b/src/logger.c
index 078f0a6e38b830c919ec6f28861f71120cef6e08..f46cdcf9e89b3d80f096f5429fbd9fad4a280193 100644
--- a/src/logger.c
+++ b/src/logger.c
@@ -44,41 +44,41 @@
 /*
  * Thoses are definitions from the format and therefore should not be changed!
  */
-/* number of bytes for a mask */
+/* Number of bytes for a mask. */
 // TODO change this to number of bits
 #define logger_mask_size 1
 
-/* number of bits for chunk header */
+/* Number of bits for chunk header. */
 #define logger_header_bytes 8
 
-/* number bytes for an offset */
+/* Number bytes for an offset. */
 #define logger_offset_size logger_header_bytes - logger_mask_size
 
-/* number of bytes for the file format information */
+/* Number of bytes for the file format information. */
 #define logger_format_size 20
 
-/* number of bytes for the labels in the header */
+/* Number of bytes for the labels in the header. */
 #define logger_label_size 20
 
 char logger_file_format[logger_format_size] = "SWIFT_LOGGER";
 
 const struct mask_data logger_mask_data[logger_count_mask] = {
-    /* Particle's position */
+    /* Particle's position. */
     {3 * sizeof(double), 1 << logger_x, "positions"},
-    /* Particle's velocity */
+    /* Particle's velocity. */
     {3 * sizeof(float), 1 << logger_v, "velocities"},
-    /* Particle's acceleration */
+    /* Particle's acceleration. */
     {3 * sizeof(float), 1 << logger_a, "accelerations"},
-    /* Particle's entropy */
+    /* Particle's entropy. */
     {sizeof(float), 1 << logger_u, "entropy"},
-    /* Particle's smoothing length */
+    /* Particle's smoothing length. */
     {sizeof(float), 1 << logger_h, "smoothing length"},
-    /* Particle's density */
+    /* Particle's density. */
     {sizeof(float), 1 << logger_rho, "density"},
-    /* Particle's constants: mass (float) and ID (long long) */
+    /* Particle's constants: mass (float) and ID (long long). */
     {sizeof(float) + sizeof(long long), 1 << logger_consts, "consts"},
     /* Simulation time stamp: integertime and double time (e.g. scale
-       factor or time) */
+       factor or time). */
     {sizeof(integertime_t) + sizeof(double), 1 << logger_timestamp,
      "timestamp"}};
 
@@ -96,11 +96,11 @@ const struct mask_data logger_mask_data[logger_count_mask] = {
  */
 char *logger_write_chunk_header(char *buff, const unsigned int *mask,
                                 const size_t *offset, const size_t offset_new) {
-  /* write mask */
+  /* write mask. */
   memcpy(buff, mask, logger_mask_size);
   buff += logger_mask_size;
 
-  /* write offset */
+  /* write offset. */
   size_t diff_offset = offset_new - *offset;
   memcpy(buff, &diff_offset, logger_offset_size);
   buff += logger_offset_size;
@@ -109,7 +109,7 @@ char *logger_write_chunk_header(char *buff, const unsigned int *mask,
 }
 
 /**
- * @brief Write to the dump
+ * @brief Write to the dump.
  *
  * @param d #dump file
  * @param offset (return) offset of the data
@@ -118,13 +118,13 @@ char *logger_write_chunk_header(char *buff, const unsigned int *mask,
  */
 void logger_write_data(struct dump *d, size_t *offset, size_t size,
                        const void *p) {
-  /* get buffer */
+  /* get buffer. */
   char *buff = dump_get(d, size, offset);
 
-  /* write data to the buffer */
+  /* write data to the buffer. */
   memcpy(buff, p, size);
 
-  /* Update offset to end of chunk */
+  /* Update offset to end of chunk. */
   *offset += size;
 }
 
@@ -168,15 +168,15 @@ int logger_compute_chunk_size(unsigned int mask) {
  * @param log The #logger
  * @param e The #engine
  */
-void logger_log_all(struct logger *log, const struct engine *e) {
+void logger_log_all(struct logger_writer *log, const struct engine *e) {
 
-  /* Ensure that enough space is available */
+  /* Ensure that enough space is available. */
   logger_ensure_size(log, e->total_nr_parts, e->total_nr_gparts, 0);
 #ifdef SWIFT_DEBUG_CHECKS
   message("Need to implement stars");
 #endif
 
-  /* some constants */
+  /* some constants. */
   const struct space *s = e->s;
   const unsigned int mask =
       logger_mask_data[logger_x].mask | logger_mask_data[logger_v].mask |
@@ -184,17 +184,17 @@ void logger_log_all(struct logger *log, const struct engine *e) {
       logger_mask_data[logger_h].mask | logger_mask_data[logger_rho].mask |
       logger_mask_data[logger_consts].mask;
 
-  /* loop over all parts */
+  /* loop over all parts. */
   for (long long i = 0; i < e->total_nr_parts; i++) {
     logger_log_part(log, &s->parts[i], mask,
                     &s->xparts[i].logger_data.last_offset);
     s->xparts[i].logger_data.steps_since_last_output = 0;
   }
 
-  /* loop over all gparts */
+  /* loop over all gparts. */
   if (e->total_nr_gparts > 0) error("Not implemented");
 
-  /* loop over all sparts */
+  /* loop over all sparts. */
   // TODO
 }
 
@@ -207,7 +207,7 @@ void logger_log_all(struct logger *log, const struct engine *e) {
  * @param offset Pointer to the offset of the previous log of this particle;
  * (return) offset of this log.
  */
-void logger_log_part(struct logger *log, const struct part *p,
+void logger_log_part(struct logger_writer *log, const struct part *p,
                      unsigned int mask, size_t *offset) {
 
   /* Make sure we're not writing a timestamp. */
@@ -286,7 +286,7 @@ void logger_log_part(struct logger *log, const struct part *p,
  * @param offset Pointer to the offset of the previous log of this particle;
  * (return) offset of this log.
  */
-void logger_log_gpart(struct logger *log, const struct gpart *p,
+void logger_log_gpart(struct logger_writer *log, const struct gpart *p,
                       unsigned int mask, size_t *offset) {
 
   /* Make sure we're not writing a timestamp. */
@@ -328,7 +328,7 @@ void logger_log_gpart(struct logger *log, const struct gpart *p,
 
   /* Particle constants, which is a bit more complicated. */
   if (mask & logger_mask_data[logger_consts].mask) {
-    // TODO make it dependent of logger_mask_data
+    // TODO make it dependent of logger_mask_data.
     memcpy(buff, &p->mass, sizeof(float));
     buff += sizeof(float);
     memcpy(buff, &p->id_or_neg_offset, sizeof(long long));
@@ -348,7 +348,7 @@ void logger_log_gpart(struct logger *log, const struct gpart *p,
  * @param offset Pointer to the offset of the previous log of this particle;
  * (return) offset of this log.
  */
-void logger_log_timestamp(struct logger *log, integertime_t timestamp,
+void logger_log_timestamp(struct logger_writer *log, integertime_t timestamp,
                           double time, size_t *offset) {
   struct dump *dump = &log->dump;
 
@@ -365,11 +365,11 @@ void logger_log_timestamp(struct logger *log, integertime_t timestamp,
   buff = logger_write_chunk_header(buff, &mask, offset, offset_new);
 
   /* Store the timestamp. */
-  // TODO make it dependent of logger_mask_data
+  // TODO make it dependent of logger_mask_data.
   memcpy(buff, &timestamp, sizeof(integertime_t));
   buff += sizeof(integertime_t);
 
-  /* Store the time */
+  /* Store the time. */
   memcpy(buff, &time, sizeof(double));
 
   /* Update the log message offset. */
@@ -387,21 +387,21 @@ void logger_log_timestamp(struct logger *log, integertime_t timestamp,
  * @param total_nr_gparts total number of gpart
  * @param total_nr_sparts total number of spart
  */
-void logger_ensure_size(struct logger *log, size_t total_nr_parts,
+void logger_ensure_size(struct logger_writer *log, size_t total_nr_parts,
                         size_t total_nr_gparts, size_t total_nr_sparts) {
 
-  /* count part memory */
+  /* count part memory. */
   size_t limit = log->max_chunk_size;
 
   limit *= total_nr_parts;
 
-  /* count gpart memory */
+  /* count gpart memory. */
   if (total_nr_gparts > 0) error("Not implemented");
 
-  /* count spart memory */
+  /* count spart memory. */
   if (total_nr_sparts > 0) error("Not implemented");
 
-  /* ensure enough space in dump */
+  /* ensure enough space in dump. */
   dump_ensure(&log->dump, limit, log->buffer_scale * limit);
 }
 
@@ -411,8 +411,8 @@ void logger_ensure_size(struct logger *log, size_t total_nr_parts,
  * @param log The #logger
  * @param params The #swift_params
  */
-void logger_init(struct logger *log, struct swift_params *params) {
-  /* read parameters */
+void logger_init(struct logger_writer *log, struct swift_params *params) {
+  /* read parameters. */
   log->delta_step = parser_get_param_int(params, "Logger:delta_step");
   size_t buffer_size =
       parser_get_opt_param_float(params, "Logger:initial_buffer_size", 0.5) *
@@ -421,24 +421,24 @@ void logger_init(struct logger *log, struct swift_params *params) {
       parser_get_opt_param_float(params, "Logger:buffer_scale", 10);
   parser_get_param_string(params, "Logger:basename", log->base_name);
 
-  /* set initial value of parameters */
+  /* set initial value of parameters. */
   log->timestamp_offset = 0;
 
-  /* generate dump filename */
+  /* generate dump filename. */
   char logger_name_file[PARSER_MAX_LINE_SIZE];
   strcpy(logger_name_file, log->base_name);
   strcat(logger_name_file, ".dump");
 
-  /* Compute max size for a particle chunk */
+  /* Compute max size for a particle chunk. */
   int max_size = logger_offset_size + logger_mask_size;
 
-  /* Loop over all fields except timestamp */
+  /* Loop over all fields except timestamp. */
   for (int i = 0; i < logger_count_mask - 1; i++) {
     max_size += logger_mask_data[i].size;
   }
   log->max_chunk_size = max_size;
 
-  /* init dump */
+  /* init dump. */
   dump_init(&log->dump, logger_name_file, buffer_size);
 }
 
@@ -447,7 +447,7 @@ void logger_init(struct logger *log, struct swift_params *params) {
  *
  * @param log The #logger
  */
-void logger_free(struct logger *log) { dump_close(&log->dump); }
+void logger_free(struct logger_writer *log) { dump_close(&log->dump); }
 
 /**
  * @brief Write a file header to a logger file
@@ -455,9 +455,9 @@ void logger_free(struct logger *log) { dump_close(&log->dump); }
  * @param log The #logger
  *
  */
-void logger_write_file_header(struct logger *log) {
+void logger_write_file_header(struct logger_writer *log) {
 
-  /* get required variables */
+  /* get required variables. */
   struct dump *dump = &log->dump;
 
   size_t file_offset = dump->file_offset;
@@ -467,45 +467,45 @@ void logger_write_file_header(struct logger *log) {
         "The logger is not empty."
         "This function should be called before writing anything in the logger");
 
-  /* Write format information */
+  /* Write format information. */
   logger_write_data(dump, &file_offset, logger_format_size, &logger_file_format);
 
-  /* Write the major version number */
+  /* Write the major version number. */
   int major = logger_major_version;
   logger_write_data(dump, &file_offset, sizeof(int), &major);
 
-  /* Write the minor version number */
+  /* Write the minor version number. */
   int minor = logger_minor_version;
   logger_write_data(dump, &file_offset, sizeof(int), &minor);
 
-  /* write offset direction */
+  /* write offset direction. */
   const int reversed = 0;
   logger_write_data(dump, &file_offset, sizeof(int), &reversed);
 
-  /* placeholder to write the offset of the first log here */
+  /* placeholder to write the offset of the first log here. */
   char *skip_header = dump_get(dump, logger_offset_size, &file_offset);
 
-  /* write number of bytes used for names */
+  /* write number of bytes used for names. */
   const unsigned int label_size = logger_label_size;
   logger_write_data(dump, &file_offset, sizeof(unsigned int), &label_size);
 
-  /* write number of masks */
+  /* write number of masks. */
   const unsigned int count_mask = logger_count_mask;
   logger_write_data(dump, &file_offset, sizeof(unsigned int), &count_mask);
 
-  /* write masks */
-  // loop over all mask type
+  /* write masks. */
+  // loop over all mask type.
   for (int i = 0; i < logger_count_mask; i++) {
-    // mask name
+    // mask name.
     logger_write_data(dump, &file_offset, logger_label_size,
                       &logger_mask_data[i].name);
 
-    // mask size
+    // mask size.
     logger_write_data(dump, &file_offset, sizeof(unsigned int),
                       &logger_mask_data[i].size);
   }
 
-  /* last step: write first offset */
+  /* last step: write first offset. */
   memcpy(skip_header, &file_offset, logger_offset_size);
 }
 
@@ -595,7 +595,7 @@ int logger_read_part(struct part *p, size_t *offset, const char *buff) {
 
   /* Particle constants, which is a bit more complicated. */
   if (mask & logger_mask_data[logger_rho].mask) {
-    // TODO make it dependent of logger_mask_data
+    // TODO make it dependent of logger_mask_data.
     memcpy(&p->mass, buff, sizeof(float));
     buff += sizeof(float);
     memcpy(&p->id, buff, sizeof(long long));
@@ -698,7 +698,7 @@ int logger_read_timestamp(unsigned long long int *t, double *time,
     error("Timestamp message contains extra fields.");
 
   /* Copy the timestamp value from the buffer. */
-  // TODO make it dependent of logger_mask_data
+  // TODO make it dependent of logger_mask_data.
   memcpy(t, buff, sizeof(unsigned long long int));
   buff += sizeof(unsigned long long int);
 
diff --git a/src/logger.h b/src/logger.h
index 1df13296bb339b9648caf3a5877d6cebd6095808..0ba3408e99a31c0cb34cb7553f90f113696a8de2 100644
--- a/src/logger.h
+++ b/src/logger.h
@@ -28,11 +28,10 @@
 #include "timeline.h"
 #include "units.h"
 
-/* Forward declaration */
+/* Forward declaration. */
 struct dump;
 struct gpart;
 struct part;
-/* TODO remove dependency */
 struct engine;
 
 #define logger_major_version 0
@@ -85,18 +84,18 @@ enum logger_masks_number {
   logger_h = 4,
   logger_rho = 5,
   logger_consts = 6,
-  logger_timestamp = 7,  /* expect it to be before count */
-  logger_count_mask = 8, /* Need to be the last */
+  logger_timestamp = 7,  /* expect it to be before count. */
+  logger_count_mask = 8, /* Need to be the last. */
 } __attribute__((packed));
 
 struct mask_data {
-  /* Number of bytes for a mask */
+  /* Number of bytes for a mask. */
   int size;
 
-  /* Mask value */
+  /* Mask value. */
   unsigned int mask;
 
-  /* name of the mask */
+  /* Name of the mask. */
   char name[100];
 };
 
@@ -105,51 +104,51 @@ extern const struct mask_data logger_mask_data[logger_count_mask];
 /* Size of the strings. */
 #define logger_string_length 200
 
-/* structure containing global data */
-struct logger {
-  /* Number of particle steps between dumping a chunk of data */
+/* structure containing global data. */
+struct logger_writer {
+  /* Number of particle steps between dumping a chunk of data. */
   short int delta_step;
 
-  /* Logger basename */
+  /* Logger basename. */
   char base_name[logger_string_length];
 
-  /* Dump file */
+  /*  Dump file (In the reader, the dump is cleaned, therefore it is renamed logfile). */
   struct dump dump;
 
-  /* timestamp offset for logger*/
+  /* timestamp offset for logger. */
   size_t timestamp_offset;
 
-  /* scaling factor when buffer is too small */
+  /* scaling factor when buffer is too small. */
   float buffer_scale;
 
-  /* Size of a chunk if every mask are activated */
+  /* Size of a chunk if every mask are activated. */
   int max_chunk_size;
 
 } SWIFT_STRUCT_ALIGN;
 
-/* required structure for each particle type */
+/* required structure for each particle type. */
 struct logger_part_data {
-  /* Number of particle updates since last output */
+  /* Number of particle updates since last output. */
   int steps_since_last_output;
 
-  /* offset of last particle log entry */
+  /* offset of last particle log entry. */
   size_t last_offset;
 };
 
 /* Function prototypes. */
 int logger_compute_chunk_size(unsigned int mask);
-void logger_log_all(struct logger *log, const struct engine *e);
-void logger_log_part(struct logger *log, const struct part *p,
+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);
-void logger_log_gpart(struct logger *log, const struct gpart *p,
+void logger_log_gpart(struct logger_writer *log, const struct gpart *p,
                       unsigned int mask, size_t *offset);
-void logger_init(struct logger *log, struct swift_params *params);
-void logger_free(struct logger *log);
-void logger_log_timestamp(struct logger *log, integertime_t t, double time,
+void logger_init(struct logger_writer *log, struct swift_params *params);
+void logger_free(struct logger_writer *log);
+void logger_log_timestamp(struct logger_writer *log, integertime_t t, double time,
                           size_t *offset);
-void logger_ensure_size(struct logger *log, size_t total_nr_parts,
+void logger_ensure_size(struct logger_writer *log, size_t total_nr_parts,
                         size_t total_nr_gparts, size_t total_nr_sparts);
-void logger_write_file_header(struct logger *log);
+void logger_write_file_header(struct logger_writer *log);
 
 int logger_read_part(struct part *p, size_t *offset, const char *buff);
 int logger_read_gpart(struct gpart *p, size_t *offset, const char *buff);
@@ -169,12 +168,13 @@ INLINE static void logger_part_data_init(struct logger_part_data *logger) {
 /**
  * @brief Should this particle write its data now ?
  *
- * @param xp The #xpart.
- * @param e The #engine containing information about the current time.
- * @return 1 if the #part should write, 0 otherwise.
+ * @param logger_data The #logger_part_data of a particle.
+ * @param log The #logger.
+ *
+ * @return 1 if the particule should be writen, 0 otherwise.
  */
 __attribute__((always_inline)) INLINE static int logger_should_write(
-    const struct logger_part_data *logger_data, const struct logger *log) {
+    const struct logger_part_data *logger_data, const struct logger_writer *log) {
 
   return (logger_data->steps_since_last_output > log->delta_step);
 }
diff --git a/src/logger_io.c b/src/logger_io.c
index 3cef3497b2912411cea6763f5418bc76a7f5ece0..9a4f10ea2e256e738f29d92057c824e7d948d735 100644
--- a/src/logger_io.c
+++ b/src/logger_io.c
@@ -87,7 +87,7 @@ void write_index_single(struct engine* e, const char* baseName,
   // struct spart* sparts = e->s->sparts;
   static int outputCount = 0;
 
-  struct logger* log = e->logger;
+  struct logger_writer* log = e->logger;
 
   /* Number of unassociated gparts */
   const size_t Ndm = Ntot > 0 ? Ntot - (Ngas + Nstars) : 0;