diff --git a/logger/Makefile.am b/logger/Makefile.am
index 92dceac74993dacc84f14afe36ca5b475b7adfa1..f74c1645daeaa49af6defa0382fdf280cffbed15 100644
--- a/logger/Makefile.am
+++ b/logger/Makefile.am
@@ -47,7 +47,7 @@ include_HEADERS = logger_header.h logger_io.h logger_particle.h logger_time.h lo
 
 # Common source files
 AM_SOURCES = logger_header.c logger_io.c logger_particle.c logger_time.c logger_tools.c logger_reader.c \
-	logger_logfile.c
+	logger_index.c logger_logfile.c
 if HAVEPYTHON
 AM_SOURCES += logger_python_wrapper.c
 endif
diff --git a/logger/logger_header.c b/logger/logger_header.c
index baabf03b81339da9ec346b9baa290d02ca43e3d7..33f3fddd3439c991107b45642208eda11e840a39 100644
--- a/logger/logger_header.c
+++ b/logger/logger_header.c
@@ -116,15 +116,13 @@ void header_read(struct header *h, struct logger_logfile *log) {
     error("Wrong file format");
 
   /* Read major version number */
-  int major;
-  offset = io_read_data(map, sizeof(int), &major, offset);
+  offset = io_read_data(map, sizeof(int), &h->major_version, offset);
 
   /* Read minor version number */
-  int minor;
-  offset = io_read_data(map, sizeof(int), &minor, offset);
+  offset = io_read_data(map, sizeof(int), &h->minor_version, offset);
 
   if (h->log->reader->verbose > 0)
-    message("File version %i.%i", major, minor);
+    message("File version %i.%i", h->major_version, h->minor_version);
 
   /* read the offset directions */
   offset = io_read_data(map, LOGGER_NUMBER_SIZE, &h->offset_direction, offset);
diff --git a/logger/logger_header.h b/logger/logger_header.h
index f5742bdc4825376f7455a70248079d026cc13da9..38e871d93fc7563cd1b91df97bb93700ae46d81e 100644
--- a/logger/logger_header.h
+++ b/logger/logger_header.h
@@ -60,6 +60,12 @@ struct header {
   /* Logger version. */
   char version[STRING_SIZE];
 
+  /* Dump major version */
+  int major_version;
+
+  /* Dump minor version */
+  int minor_version;
+
   /* Offset of the first record. */
   size_t offset_first_record;
 
diff --git a/logger/logger_index.c b/logger/logger_index.c
index f80fcfaaf89b62bd86689aa94e1b6ab3e919145e..946b257e3a44a964eabc698af3786e555a208e33 100644
--- a/logger/logger_index.c
+++ b/logger/logger_index.c
@@ -39,12 +39,14 @@ void logger_index_init(struct logger_index *index, struct logger_reader *reader,
 		       char *basename) {
 
   /* Set pointers to 0. */
-  index->offsets = NULL;
-  index->ids = NULL;
+  index->data = NULL;
 
   /* Set variables default value. */
-  index->current_file = -1;
-  index->number_of_particles = 0;
+  index->total_number_particles = 0;
+
+  for(int i = 0; i < swift_type_count; i++) {
+    index->number_particles[i] = 0;
+  }
 }
 
 /**
@@ -57,12 +59,11 @@ void logger_index_read_file(struct logger_index *index, int i) {
   /* Cleanup the memory of previous file. */
   logger_index_free_current_file(index);
 
-  /* Save current index. */
-  index->current_file = i;
-
   /* Open file. */
   FILE *f = NULL;
-  f = fopen(index->filenames[i], "wb");
+  char name[200];
+  sprintf(name, "%s_%04i.index", index->basename, i);
+  f = fopen(name, "rb");
 
   /* Read the double time. */
   double time;
@@ -73,32 +74,23 @@ void logger_index_read_file(struct logger_index *index, int i) {
   fread(&int_time, sizeof(integertime_t), 1, f);
 
   /* Read the number of particles. */
-  long long N_total[swift_type_count];
-  fread(N_total, sizeof(long long), swift_type_count, f);
+  fread(index->number_particles, sizeof(long long), swift_type_count, f);
 
   /* Count total number of particles. */
   long long N = 0;
-  for(int i = 0; i < swift_type_count; i++) {
-    N += N_total[i];
+  for(int j = 0; j < swift_type_count; j++) {
+    N += index->number_particles[j];
   }
 
-  index->number_of_particles = N;
+  index->total_number_particles = N;
 
 
   /* Read the particles ids. */
-  if (posix_memalign((void**)&index->ids, IO_BUFFER_ALIGNMENT,
-                     N * sizeof(long long)) != 0)
-    error("Unable to allocate the offset buffer");
-
-  fread(index->ids, sizeof(size_t), N, f);
-
-  /* Read the particles offsets. */
-  if (posix_memalign((void**)&index->offsets, IO_BUFFER_ALIGNMENT,
-                     N * sizeof(size_t)) != 0)
-    error("Unable to allocate the offset buffer");
-
-  fread(index->offset, sizeof(size_t), N, f);
+  if (posix_memalign((void**)&index->data, IO_BUFFER_ALIGNMENT,
+                     N * sizeof(struct logger_index_data)) != 0)
+    error("Unable to allocate index data buffer");
 
+  fread(index->data, sizeof(struct logger_index_data), N, f);
 
   /* Close the file. */
   fclose(f);
@@ -110,19 +102,17 @@ void logger_index_read_file(struct logger_index *index, int i) {
  * @param index The #logger_index.
  */
 void logger_index_free_current_file(struct logger_index *index) {
-  /* Free the particles offsets. */
-  if (index->offsets)
-    free(index->offsets);
-  index->offsets = NULL;
-
-  /* Free the particles ids. */
-  if (index->ids)
-    free(index->ids);
-  index->ids = NULL;
+  /* Free the index data */
+  if (index->data)
+    free(index->data);
+  index->data = NULL;
 
   /* Set variables to default value. */
-  index->current_file = -1;
-  index->number_of_particles = 0;
+  index->total_number_particles = 0;
+
+  for(int i = 0; i < swift_type_count; i++) {
+    index->number_particles[i] = 0;
+  }
 }
 
 /**
@@ -132,21 +122,6 @@ void logger_index_free_current_file(struct logger_index *index) {
  */
 void logger_index_free(struct logger_index *index) {
 
-  /* Set variables to default value. */
-  index->current_file = -1;
-  index->number_of_particles = 0;
-
   /* Free the memory allocated for current file. */
-  logger_index_free_file_data(index);
-
-  /* Free the filenames. */
-  for(int i = 0; i < index->number_files; i++) {
-    if (index->filenames[i])
-      free(index->filenames[i]);
-    index->filenames[i] = NULL;
-  }
-
-  /* Free the array of filenames. */
-  free(index->filenames);
-  index->filenames = NULL;
+  logger_index_free_current_file(index);
 }
diff --git a/logger/logger_index.h b/logger/logger_index.h
index 17a5bffede6b672ab4cdd85304cb88a824fac5e1..93b0af9c045f324dc70bf8bc22c1c0434b0747cd 100644
--- a/logger/logger_index.h
+++ b/logger/logger_index.h
@@ -17,6 +17,8 @@
  *
  ******************************************************************************/
 
+#include "logger_tools.h"
+
 /**
  * @file logger_index.h
  * @brief This file deals with the index files.
@@ -26,6 +28,15 @@
 
 struct logger_reader;
 
+
+struct logger_index_data {
+  /* The particle's id */
+  long long id;
+
+  /* The particle's offset */
+  size_t offset;
+};
+
 /**
  * @brief This structure will contain the data related to
  *   the index file.
@@ -47,19 +58,16 @@ struct logger_index {
   int number_files;
 
   /* List of all the index filenames */
-  char **filenames;
-
-  /* Index of current file */
-  int current_file;
+  char *basename;
 
-  /* Offsets of the particles in current file */
-  size_t *offsets;
-
-  /* ids of the particles in current file */
-  long long *ids;
+  /* Particles' ids and offsets */
+  struct logger_index_data *data;
 
   /* Number of particles */
-  size_t number_of_particles;
+  size_t total_number_particles;
+
+  /* Number of particles per type */
+  long long number_particles[swift_type_count];
 };
 
 void logger_index_init(struct logger_index *index, struct logger_reader *reader,
diff --git a/logger/logger_tools.h b/logger/logger_tools.h
index 4c1bafd2fd3b6b7a719cd46787a1f100dcb425d3..fef37523eb7b35cf7b01780af5fef92fd151d15d 100644
--- a/logger/logger_tools.h
+++ b/logger/logger_tools.h
@@ -28,6 +28,7 @@
 #include "../src/dimension.h"
 #include "../src/inline.h"
 #include "../src/logger.h"
+#include "../src/part_type.h"
 
 #ifdef HAVE_PYTHON
 #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION