diff --git a/examples/main.c b/examples/main.c
index 63753bdfceea3bb96f8e0a8b5bf36b13750335a5..f1fe32041eb5d8c3a5123b21d113befd4ab4a9e8 100644
--- a/examples/main.c
+++ b/examples/main.c
@@ -384,9 +384,10 @@ int main(int argc, char *argv[]) {
   if (myrank == 0) clocks_gettime(&tic);
 #if defined(WITH_MPI)
 #if defined(HAVE_PARALLEL_HDF5)
-  read_ic_parallel(ICfileName, &us, dim, &parts, &gparts, &Ngas, &Ngpart,
-                   &periodic, &flag_entropy_ICs, myrank, nr_nodes,
-                   MPI_COMM_WORLD, MPI_INFO_NULL, dry_run);
+  read_ic_parallel(ICfileName, &us, dim, &parts, &gparts, &sparts, &Ngas, &Ngpart,
+                   &Nspart, &periodic, &flag_entropy_ICs, with_hydro,
+		   (with_external_gravity || with_self_gravity), with_stars, 
+		   myrank, nr_nodes, MPI_COMM_WORLD, MPI_INFO_NULL, dry_run);
 #else
   read_ic_serial(ICfileName, &us, dim, &parts, &gparts, &sparts, &Ngas, &Ngpart,
                  &Nspart, &periodic, &flag_entropy_ICs, with_hydro,
diff --git a/src/parallel_io.c b/src/parallel_io.c
index ce46d8b2dde76e28be468ac89ba0e0bf74edf786..1dbe196c151345a09ccc736958e11c6c73ea33eb 100644
--- a/src/parallel_io.c
+++ b/src/parallel_io.c
@@ -46,6 +46,7 @@
 #include "io_properties.h"
 #include "kernel_hydro.h"
 #include "part.h"
+#include "stars_io.h"
 #include "units.h"
 
 /**
@@ -373,9 +374,12 @@ void writeArray(struct engine* e, hid_t grp, char* fileName, FILE* xmfFile,
  */
 void read_ic_parallel(char* fileName, const struct UnitSystem* internal_units,
                       double dim[3], struct part** parts, struct gpart** gparts,
-                      size_t* Ngas, size_t* Ngparts, int* periodic,
-                      int* flag_entropy, int mpi_rank, int mpi_size,
-                      MPI_Comm comm, MPI_Info info, int dry_run) {
+                      struct spart** sparts, size_t* Ngas, size_t* Ngparts, 
+		      size_t* Nstars, int* periodic, int* flag_entropy, 
+		      int with_hydro, int with_gravity, int with_stars,
+		      int mpi_rank, int mpi_size,  MPI_Comm comm, MPI_Info info, 
+		      int dry_run) {
+
   hid_t h_file = 0, h_grp = 0;
   /* GADGET has only cubic boxes (in cosmological mode) */
   double boxSize[3] = {0.0, -1.0, -1.0};
@@ -385,6 +389,7 @@ void read_ic_parallel(char* fileName, const struct UnitSystem* internal_units,
   long long N_total[NUM_PARTICLE_TYPES] = {0};
   long long offset[NUM_PARTICLE_TYPES] = {0};
   int dimension = 3; /* Assume 3D if nothing is specified */
+  size_t Ndm;
 
   /* Open file */
   /* message("Opening file '%s' as IC.", fileName); */
@@ -492,29 +497,38 @@ void read_ic_parallel(char* fileName, const struct UnitSystem* internal_units,
         units_conversion_factor(ic_units, internal_units, UNIT_CONV_LENGTH);
 
   /* Allocate memory to store SPH particles */
-  *Ngas = N[0];
-  if (posix_memalign((void*)parts, part_align, (*Ngas) * sizeof(struct part)) !=
-      0)
-    error("Error while allocating memory for particles");
-  bzero(*parts, *Ngas * sizeof(struct part));
-
-  /* Allocate memory to store all particles */
-  const size_t Ndm = N[1];
-  *Ngparts = N[1] + N[0];
-  if (posix_memalign((void*)gparts, gpart_align,
-                     *Ngparts * sizeof(struct gpart)) != 0)
-    error(
-        "Error while allocating memory for gravity "
-        "particles");
-  bzero(*gparts, *Ngparts * sizeof(struct gpart));
-
-  /* message("Allocated %8.2f MB for particles.", *N *
-   * sizeof(struct part) /
+  if (with_hydro) {
+    *Ngas = N[0];
+    if (posix_memalign((void*)parts, part_align, (*Ngas) * sizeof(struct part)) !=
+	0)
+      error("Error while allocating memory for particles");
+    bzero(*parts, *Ngas * sizeof(struct part));
+  }
+
+  /* Allocate memory to store star particles */
+  if (with_stars) {
+    *Nstars = N[STAR];
+    if (posix_memalign((void*)sparts, spart_align,
+                       *Nstars * sizeof(struct spart)) != 0)
+      error("Error while allocating memory for star particles");
+    bzero(*sparts, *Nstars * sizeof(struct spart));
+  }
+
+  /* Allocate memory to store gravity particles */
+  if (with_gravity) {
+    Ndm = N[1];
+    *Ngparts = (with_hydro ? N[GAS] : 0) + N[DM] + (with_stars ? N[STAR] : 0);
+    if (posix_memalign((void*)gparts, gpart_align,
+		       *Ngparts * sizeof(struct gpart)) != 0)
+      error("Error while allocating memory for gravity particles");
+    bzero(*gparts, *Ngparts * sizeof(struct gpart));
+  }
+
+  /* message("Allocated %8.2f MB for particles.", *N * sizeof(struct part) /
    * (1024.*1024.)); */
 
   /* message("BoxSize = %lf", dim[0]); */
-  /* message("NumPart = [%zd, %zd] Total = %zd", *Ngas, Ndm,
-   * *Ngparts); */
+  /* message("NumPart = [%zd, %zd] Total = %zd", *Ngas, Ndm, *Ngparts); */
 
   /* Loop over all particle types */
   for (int ptype = 0; ptype < NUM_PARTICLE_TYPES; ptype++) {
@@ -539,15 +553,26 @@ void read_ic_parallel(char* fileName, const struct UnitSystem* internal_units,
     switch (ptype) {
 
       case GAS:
-        Nparticles = *Ngas;
-        hydro_read_particles(*parts, list, &num_fields);
+	if (with_hydro) {
+	  Nparticles = *Ngas;
+	  hydro_read_particles(*parts, list, &num_fields);
+	}
         break;
 
       case DM:
-        Nparticles = Ndm;
-        darkmatter_read_particles(*gparts, list, &num_fields);
+	if (with_gravity) {
+	  Nparticles = Ndm;
+	  darkmatter_read_particles(*gparts, list, &num_fields);
+	}
         break;
 
+      case STAR:
+        if (with_stars) {
+	  Nparticles = *Nstars;
+	  star_read_particles(*sparts, list, &num_fields);
+	}
+	break;
+
       default:
         message("Particle Type %d not yet supported. Particles ignored", ptype);
     }
@@ -563,10 +588,15 @@ void read_ic_parallel(char* fileName, const struct UnitSystem* internal_units,
   }
 
   /* Prepare the DM particles */
-  if (!dry_run) prepare_dm_gparts(*gparts, Ndm);
+  if (!dry_run && with_gravity) prepare_dm_gparts(*gparts, Ndm);
 
-  /* Now duplicate the hydro particle into gparts */
-  if (!dry_run) duplicate_hydro_gparts(*parts, *gparts, *Ngas, Ndm);
+  /* Duplicate the hydro particles into gparts */
+  if (!dry_run && with_gravity && with_hydro)
+    duplicate_hydro_gparts(*parts, *gparts, *Ngas, Ndm);
+
+  /* Duplicate the star particles into gparts */
+  if (!dry_run && with_gravity && with_stars)
+    duplicate_star_gparts(*sparts, *gparts, *Nstars, Ndm + *Ngas);
 
   /* message("Done Reading particles..."); */
 
@@ -609,17 +639,19 @@ void write_output_parallel(struct engine* e, const char* baseName,
 
   hid_t h_file = 0, h_grp = 0;
   const size_t Ngas = e->s->nr_parts;
+  const size_t Nstars = e->s->nr_sparts;
   const size_t Ntot = e->s->nr_gparts;
   int periodic = e->s->periodic;
   int numFiles = 1;
   struct part* parts = e->s->parts;
   struct gpart* gparts = e->s->gparts;
   struct gpart* dmparts = NULL;
+  struct spart* sparts = e->s->sparts;
   static int outputCount = 0;
   FILE* xmfFile = 0;
 
   /* Number of unassociated gparts */
-  const size_t Ndm = Ntot > 0 ? Ntot - Ngas : 0;
+  const size_t Ndm = Ntot > 0 ? Ntot - (Ngas + Nstars) : 0;
 
   /* File name */
   char fileName[FILENAME_BUFFER_SIZE];
@@ -642,7 +674,7 @@ void write_output_parallel(struct engine* e, const char* baseName,
 
   /* Compute offset in the file and total number of
    * particles */
-  size_t N[NUM_PARTICLE_TYPES] = {Ngas, Ndm, 0};
+  size_t N[NUM_PARTICLE_TYPES] = {Ngas, Ndm, 0, 0, Nstars, 0};
   long long N_total[NUM_PARTICLE_TYPES] = {0};
   long long offset[NUM_PARTICLE_TYPES] = {0};
   MPI_Exscan(&N, &offset, NUM_PARTICLE_TYPES, MPI_LONG_LONG_INT, MPI_SUM, comm);
@@ -816,11 +848,13 @@ void write_output_parallel(struct engine* e, const char* baseName,
         /* Write DM particles */
         Nparticles = Ndm;
         darkmatter_write_particles(dmparts, list, &num_fields);
-
-        /* Free temporary array */
-        free(dmparts);
         break;
 
+      case STAR:
+	Nparticles = Nstars;
+	star_write_particles(sparts, list, &num_fields);
+	break;
+
       default:
         error("Particle Type %d not yet supported. Aborting", ptype);
     }
@@ -830,9 +864,12 @@ void write_output_parallel(struct engine* e, const char* baseName,
       writeArray(e, h_grp, fileName, xmfFile, partTypeGroupName, list[i],
                  Nparticles, N_total[ptype], mpi_rank, offset[ptype],
                  internal_units, snapshot_units);
-
+    
     /* Free temporary array */
-    free(dmparts);
+    if (dmparts) {
+      free(dmparts);
+      dmparts = 0;
+    }
 
     /* Close particle group */
     H5Gclose(h_grp);
diff --git a/src/parallel_io.h b/src/parallel_io.h
index e5b12aa50c30b4d63ccc81835d2d8454e01b3889..3f7395b8c17aaee8654d3b3f61e78d35cd27cb61 100644
--- a/src/parallel_io.h
+++ b/src/parallel_io.h
@@ -36,9 +36,11 @@
 
 void read_ic_parallel(char* fileName, const struct UnitSystem* internal_units,
                       double dim[3], struct part** parts, struct gpart** gparts,
-                      size_t* Ngas, size_t* Ngparts, int* periodic,
-                      int* flag_entropy, int mpi_rank, int mpi_size,
-                      MPI_Comm comm, MPI_Info info, int dry_run);
+                      struct spart** sparts, size_t* Ngas, size_t* Ngparts, 
+		      size_t* Nsparts, int* periodic, int* flag_entropy, 
+		      int with_hydro, int with_gravity, int with_stars,
+		      int mpi_rank, int mpi_size,  MPI_Comm comm, MPI_Info info, 
+		      int dry_run);
 
 void write_output_parallel(struct engine* e, const char* baseName,
                            const struct UnitSystem* internal_units,