diff --git a/src/feedback/EAGLE/feedback.c b/src/feedback/EAGLE/feedback.c
index 01c96b83fb4cd78592569d6b38000cac21038ec7..b25e71432c8ae9f825fbacf0b80131007fa35eb5 100644
--- a/src/feedback/EAGLE/feedback.c
+++ b/src/feedback/EAGLE/feedback.c
@@ -240,7 +240,7 @@ double eagle_feedback_energy_fraction(const struct spart* sp,
   const double Z = chemistry_get_total_metal_mass_fraction_for_feedback(sp);
 
   /* Physical density of the gas at the star's birth time */
-  const double rho_birth = sp->birth_density;
+  const double rho_birth = sp->sf_data.birth_density;
   const double n_birth = rho_birth * props->rho_to_n_cgs;
 
   /* Calculate f_E */
diff --git a/src/feedback/GEAR/stellar_evolution.c b/src/feedback/GEAR/stellar_evolution.c
index 15853d0ff9c74d03642f493d987ba57724f152a4..2336c441b477cfad510d4f15bb10c8be95785667 100644
--- a/src/feedback/GEAR/stellar_evolution.c
+++ b/src/feedback/GEAR/stellar_evolution.c
@@ -122,7 +122,7 @@ void stellar_evolution_compute_continuous_feedback_properties(
 
   if (sp->mass <= sp->feedback_data.mass_ejected) {
     error("Stars cannot have negative mass. (%g <= %g). Initial mass = %g",
-          sp->mass, sp->feedback_data.mass_ejected, sp->birth.mass);
+          sp->mass, sp->feedback_data.mass_ejected, sp->sf_data.birth_mass);
   }
 
   /* Update the mass */
@@ -154,7 +154,7 @@ void stellar_evolution_compute_continuous_feedback_properties(
         chemistry_get_metal_mass_fraction_for_feedback(sp)[i] * non_processed;
 
     /* Convert it to total mass */
-    sp->feedback_data.metal_mass_ejected[i] *= sp->birth.mass;
+    sp->feedback_data.metal_mass_ejected[i] *= sp->sf_data.birth_mass;
   }
 }
 
@@ -209,7 +209,7 @@ void stellar_evolution_compute_discrete_feedback_properties(
 
   if (sp->mass <= sp->feedback_data.mass_ejected) {
     error("Stars cannot have negative mass. (%g <= %g). Initial mass = %g",
-          sp->mass, sp->feedback_data.mass_ejected, sp->birth.mass);
+          sp->mass, sp->feedback_data.mass_ejected, sp->sf_data.birth_mass);
   }
 
   /* Update the mass */
@@ -240,7 +240,7 @@ void stellar_evolution_compute_discrete_feedback_properties(
         chemistry_get_metal_mass_fraction_for_feedback(sp)[i] * non_processed;
 
     /* Convert it to total mass */
-    sp->feedback_data.metal_mass_ejected[i] *= sp->birth.mass;
+    sp->feedback_data.metal_mass_ejected[i] *= sp->sf_data.birth_mass;
   }
 }
 
@@ -301,7 +301,7 @@ void stellar_evolution_evolve_spart(
   if (!can_produce_snia && !can_produce_snii) return;
 
   /* Compute the initial mass */
-  const float m_init = sp->birth.mass / phys_const->const_solar_mass;
+  const float m_init = sp->sf_data.birth_mass / phys_const->const_solar_mass;
 
   /* Compute number of SNIa */
   int number_snia = 0;
diff --git a/src/parallel_io.c b/src/parallel_io.c
index 9d3b1416437aa2d0f7d1277cd733ae9613e46559..e5567f3521f03e38d2c6854b419e8a2f795f111b 100644
--- a/src/parallel_io.c
+++ b/src/parallel_io.c
@@ -1318,6 +1318,8 @@ void prepare_file(struct engine* e, const char* baseName, long long N_total[6],
         num_fields += chemistry_write_sparticles(sparts, list + num_fields);
         num_fields +=
             tracers_write_sparticles(sparts, list + num_fields, with_cosmology);
+        num_fields +=
+            star_formation_write_sparticles(sparts, list + num_fields);
         if (with_fof) {
           num_fields += fof_write_sparts(sparts, list + num_fields);
         }
@@ -1799,6 +1801,8 @@ void write_output_parallel(struct engine* e, const char* baseName,
           num_fields += chemistry_write_sparticles(sparts, list + num_fields);
           num_fields += tracers_write_sparticles(sparts, list + num_fields,
                                                  with_cosmology);
+          num_fields +=
+              star_formation_write_sparticles(sparts, list + num_fields);
           if (with_fof) {
             num_fields += fof_write_sparts(sparts, list + num_fields);
           }
@@ -1827,6 +1831,8 @@ void write_output_parallel(struct engine* e, const char* baseName,
               chemistry_write_sparticles(sparts_written, list + num_fields);
           num_fields += tracers_write_sparticles(
               sparts_written, list + num_fields, with_cosmology);
+          num_fields +=
+              star_formation_write_sparticles(sparts, list + num_fields);
           if (with_fof) {
             num_fields += fof_write_sparts(sparts_written, list + num_fields);
           }
diff --git a/src/serial_io.c b/src/serial_io.c
index a6b396118f14ea1049b193d39c48a4f912dcd457..0e66d22e5506131c3f9c0454e87d0a11dbf16caa 100644
--- a/src/serial_io.c
+++ b/src/serial_io.c
@@ -1407,6 +1407,8 @@ void write_output_serial(struct engine* e, const char* baseName,
                   chemistry_write_sparticles(sparts, list + num_fields);
               num_fields += tracers_write_sparticles(sparts, list + num_fields,
                                                      with_cosmology);
+              num_fields +=
+                  star_formation_write_sparticles(sparts, list + num_fields);
               if (with_fof) {
                 num_fields += fof_write_sparts(sparts, list + num_fields);
               }
@@ -1436,6 +1438,8 @@ void write_output_serial(struct engine* e, const char* baseName,
                   chemistry_write_sparticles(sparts_written, list + num_fields);
               num_fields += tracers_write_sparticles(
                   sparts_written, list + num_fields, with_cosmology);
+              num_fields +=
+                  star_formation_write_sparticles(sparts, list + num_fields);
               if (with_fof) {
                 num_fields +=
                     fof_write_sparts(sparts_written, list + num_fields);
diff --git a/src/single_io.c b/src/single_io.c
index 52e13a0c1d047aacd4dbd8f23b1d0295f2b6706e..ce123fd8ae34f0ec346b95a07aeb771817d0343c 100644
--- a/src/single_io.c
+++ b/src/single_io.c
@@ -1196,6 +1196,8 @@ void write_output_single(struct engine* e, const char* baseName,
           num_fields += chemistry_write_sparticles(sparts, list + num_fields);
           num_fields += tracers_write_sparticles(sparts, list + num_fields,
                                                  with_cosmology);
+          num_fields +=
+              star_formation_write_sparticles(sparts, list + num_fields);
           if (with_fof) {
             num_fields += fof_write_sparts(sparts, list + num_fields);
           }
@@ -1224,6 +1226,8 @@ void write_output_single(struct engine* e, const char* baseName,
               chemistry_write_sparticles(sparts_written, list + num_fields);
           num_fields += tracers_write_sparticles(
               sparts_written, list + num_fields, with_cosmology);
+          num_fields +=
+              star_formation_write_sparticles(sparts, list + num_fields);
           if (with_fof) {
             num_fields += fof_write_sparts(sparts_written, list + num_fields);
           }
diff --git a/src/star_formation/EAGLE/star_formation.h b/src/star_formation/EAGLE/star_formation.h
index 15be7ea6b7ea401d78fde234ec5cf02ac4aaf839..f8c42436f3f5b40941718f33e0e22a2b9eef9556 100644
--- a/src/star_formation/EAGLE/star_formation.h
+++ b/src/star_formation/EAGLE/star_formation.h
@@ -456,11 +456,11 @@ INLINE static void star_formation_copy_properties(
   sp->tracers_data = xp->tracers_data;
 
   /* Store the birth density in the star particle */
-  sp->birth_density = hydro_get_physical_density(p, cosmo);
+  sp->sf_data.birth_density = hydro_get_physical_density(p, cosmo);
 
   /* Store the birth temperature in the star particle */
-  sp->birth_temperature = cooling_get_temperature(phys_const, hydro_props, us,
-                                                  cosmo, cooling, p, xp);
+  sp->sf_data.birth_temperature = cooling_get_temperature(
+      phys_const, hydro_props, us, cosmo, cooling, p, xp);
 
   /* Flag that this particle has not done feedback yet */
   sp->f_E = -1.f;
diff --git a/src/star_formation/EAGLE/star_formation_io.h b/src/star_formation/EAGLE/star_formation_io.h
index f8bf57145955d41f7ae0ecd4141651a24f1c2727..fd4b870a7d5b75dd5f6c38c09255ff9786dede1c 100644
--- a/src/star_formation/EAGLE/star_formation_io.h
+++ b/src/star_formation/EAGLE/star_formation_io.h
@@ -47,4 +47,32 @@ __attribute__((always_inline)) INLINE static int star_formation_write_particles(
   return 1;
 }
 
+/**
+ * @brief Specifies which sparticle fields to write to a dataset
+ *
+ * @param sparts The star particle array.
+ * @param list The list of i/o properties to write.
+ *
+ * @return Returns the number of fields to write.
+ */
+__attribute__((always_inline)) INLINE static int
+star_formation_write_sparticles(const struct spart* sparts,
+                                struct io_props* list) {
+
+  list[0] = io_make_output_field(
+      "BirthDensities", FLOAT, 1, UNIT_CONV_DENSITY, 0.f, sparts,
+      sf_data.birth_density,
+      "Physical densities at the time of birth of the gas particles that "
+      "turned into stars (note that "
+      "we store the physical density at the birth redshift, no conversion is "
+      "needed)");
+
+  list[1] =
+      io_make_output_field("BirthTemperatures", FLOAT, 1, UNIT_CONV_TEMPERATURE,
+                           0.f, sparts, sf_data.birth_temperature,
+                           "Temperatures at the time of birth of the gas "
+                           "particles that turned into stars");
+
+  return 2;
+}
 #endif /* SWIFT_STAR_FORMATION_EAGLE_IO_H */
diff --git a/src/star_formation/EAGLE/star_formation_struct.h b/src/star_formation/EAGLE/star_formation_struct.h
index f5f0f76e8d59f73148f51f462cc619ec70e82192..f715ba345392dc6efd5a11590cdea46c6930d002 100644
--- a/src/star_formation/EAGLE/star_formation_struct.h
+++ b/src/star_formation/EAGLE/star_formation_struct.h
@@ -30,4 +30,17 @@ struct star_formation_xpart_data {
   float SFR;
 };
 
+/**
+ * @brief Star-formation-related properties stored in the star particle
+ * data.
+ */
+struct star_formation_spart_data {
+
+  /*! The physical birth density */
+  float birth_density;
+
+  /*! The birth temperature */
+  float birth_temperature;
+};
+
 #endif /* SWIFT_EAGLE_STAR_FORMATION_STRUCT_H */
diff --git a/src/star_formation/GEAR/star_formation.h b/src/star_formation/GEAR/star_formation.h
index e5f550036aa362efde2cfc3e1bfa6afd6ac24b68..97a64f19c6436623341fded0662b34648fe6ecb5 100644
--- a/src/star_formation/GEAR/star_formation.h
+++ b/src/star_formation/GEAR/star_formation.h
@@ -248,7 +248,7 @@ INLINE static void star_formation_copy_properties(
   } else {
     sp->mass = mass_gas;
   }
-  sp->birth.mass = sp->mass;
+  sp->sf_data.birth_mass = sp->mass;
 
   /* Store either the birth_scale_factor or birth_time depending  */
   if (with_cosmology) {
@@ -261,17 +261,17 @@ INLINE static void star_formation_copy_properties(
   sp->tracers_data = xp->tracers_data;
 
   /* Store the birth density in the star particle */
-  sp->birth.density = hydro_get_physical_density(p, cosmo);
+  sp->sf_data.birth_density = hydro_get_physical_density(p, cosmo);
 
   /* Store the birth temperature*/
-  sp->birth.temperature = cooling_get_temperature(phys_const, hydro_props, us,
-                                                  cosmo, cooling, p, xp);
+  sp->sf_data.birth_temperature = cooling_get_temperature(
+      phys_const, hydro_props, us, cosmo, cooling, p, xp);
 
   /* Copy the chemistry properties */
   chemistry_copy_star_formation_properties(p, xp, sp);
 
   /* Copy the progenitor id */
-  sp->prog_id = p->id;
+  sp->sf_data.progenitor_id = p->id;
 }
 
 /**
diff --git a/src/star_formation/GEAR/star_formation_io.h b/src/star_formation/GEAR/star_formation_io.h
index f99458a931a3d7582f37ce6c88b0a0035d930c54..1c5e106ba4e706787967ac33ce348b24e362c997 100644
--- a/src/star_formation/GEAR/star_formation_io.h
+++ b/src/star_formation/GEAR/star_formation_io.h
@@ -42,6 +42,43 @@ __attribute__((always_inline)) INLINE static int star_formation_write_particles(
   return 0;
 }
 
+/**
+ * @brief Specifies which sparticle fields to write to a dataset
+ *
+ * @param sparts The star particle array.
+ * @param list The list of i/o properties to write.
+ *
+ * @return Returns the number of fields to write.
+ */
+__attribute__((always_inline)) INLINE static int
+star_formation_write_sparticles(const struct spart* sparts,
+                                struct io_props* list) {
+
+  list[0] = io_make_output_field(
+      "BirthDensities", FLOAT, 1, UNIT_CONV_DENSITY, 0.f, sparts,
+      sf_data.birth_density,
+      "Physical densities at the time of birth of the gas particles that "
+      "turned into stars (note that "
+      "we store the physical density at the birth redshift, no conversion is "
+      "needed)");
+
+  list[1] =
+      io_make_output_field("BirthTemperatures", FLOAT, 1, UNIT_CONV_TEMPERATURE,
+                           0.f, sparts, sf_data.birth_temperature,
+                           "Temperatures at the time of birth of the gas "
+                           "particles that turned into stars");
+
+  list[2] = io_make_output_field("BirthMasses", FLOAT, 1, UNIT_CONV_MASS, 0.f,
+                                 sparts, sf_data.birth_mass,
+                                 "Masses of the star particles at birth time");
+
+  list[3] = io_make_output_field(
+      "ProgenitorIDs", LONGLONG, 1, UNIT_CONV_NO_UNITS, 0.f, sparts,
+      sf_data.progenitor_id, "Unique IDs of the progenitor particle");
+
+  return 4;
+}
+
 /**
  * @brief initialization of the star formation law
  *
diff --git a/src/star_formation/GEAR/star_formation_struct.h b/src/star_formation/GEAR/star_formation_struct.h
index c03a8ae0a4178a4a4fd372e6e62775893ae9862d..bce8170301279f2d049890aea96e0434b2fa4944 100644
--- a/src/star_formation/GEAR/star_formation_struct.h
+++ b/src/star_formation/GEAR/star_formation_struct.h
@@ -28,6 +28,25 @@ struct star_formation_xpart_data {
   float div_v;
 };
 
+/**
+ * @brief Star-formation-related properties stored in the star particle
+ * data.
+ */
+struct star_formation_spart_data {
+
+  /*! The birth density */
+  float birth_density;
+
+  /*! The birth temperature */
+  float birth_temperature;
+
+  /*! The birth mass */
+  float birth_mass;
+
+  /*! The progenitor ID */
+  long long progenitor_id;
+};
+
 /**
  * @brief Global star formation properties
  */
diff --git a/src/star_formation/QLA/star_formation_io.h b/src/star_formation/QLA/star_formation_io.h
index a5706b77e0cf87065d09153bafdf40d499fd6f95..bbdde40761a0e9fb364d4b191f41669c3495b86a 100644
--- a/src/star_formation/QLA/star_formation_io.h
+++ b/src/star_formation/QLA/star_formation_io.h
@@ -43,4 +43,21 @@ __attribute__((always_inline)) INLINE static int star_formation_write_particles(
   return 0;
 }
 
+/**
+ * @brief Specifies which sparticle fields to write to a dataset
+ *
+ * @param sparts The star particle array.
+ * @param list The list of i/o properties to write.
+ *
+ * @return Returns the number of fields to write.
+ */
+__attribute__((always_inline)) INLINE static int
+star_formation_write_sparticles(const struct spart* sparts,
+                                struct io_props* list) {
+
+  /* No SF-related fields in the Quick Lyman-alpha model */
+
+  return 0;
+}
+
 #endif /* SWIFT_STAR_FORMATION_QLA_IO_H */
diff --git a/src/star_formation/QLA/star_formation_struct.h b/src/star_formation/QLA/star_formation_struct.h
index 872577e0f5f161c58acc460e53884d2ab642206a..18d39c4471698fa54caf5bdc041402ff63fb8e37 100644
--- a/src/star_formation/QLA/star_formation_struct.h
+++ b/src/star_formation/QLA/star_formation_struct.h
@@ -28,4 +28,10 @@ struct star_formation_xpart_data {
   char convert_to_star;
 };
 
+/**
+ * @brief Star-formation-related properties stored in the star particle
+ * data.
+ */
+struct star_formation_spart_data {};
+
 #endif /* SWIFT_QLA_STAR_FORMATION_STRUCT_H */
diff --git a/src/star_formation/none/star_formation_io.h b/src/star_formation/none/star_formation_io.h
index b271926f915279b681aac8348a0e375083901deb..8240c42e54e26443012838896ddf5349d1fdbcf2 100644
--- a/src/star_formation/none/star_formation_io.h
+++ b/src/star_formation/none/star_formation_io.h
@@ -41,4 +41,19 @@ __attribute__((always_inline)) INLINE static int star_formation_write_particles(
   return 0;
 }
 
+/**
+ * @brief Specifies which sparticle fields to write to a dataset
+ *
+ * @param sparts The star particle array.
+ * @param list The list of i/o properties to write.
+ *
+ * @return Returns the number of fields to write.
+ */
+__attribute__((always_inline)) INLINE static int
+star_formation_write_sparticles(const struct spart* sparts,
+                                struct io_props* list) {
+
+  return 0;
+}
+
 #endif /* SWIFT_STAR_FORMATION_NONE_IO_H */
diff --git a/src/star_formation/none/star_formation_struct.h b/src/star_formation/none/star_formation_struct.h
index 27a2adaf83d0a02a0d08e7eef8b45bea630689e4..4b537d2a3d34fa8ce719cf194047bd7c94d5d1da 100644
--- a/src/star_formation/none/star_formation_struct.h
+++ b/src/star_formation/none/star_formation_struct.h
@@ -25,4 +25,10 @@
  */
 struct star_formation_xpart_data {};
 
+/**
+ * @brief Star-formation-related properties stored in the star particle
+ * data.
+ */
+struct star_formation_spart_data {};
+
 #endif /* SWIFT_NONE_STAR_FORMATION_STRUCT_H */
diff --git a/src/stars/Default/stars_part.h b/src/stars/Default/stars_part.h
index 6a0e1c5179e6976fb13f82d4547a8f1484a4c8dc..049795a5753113e839c98164d9a7c2fea5f97ee4 100644
--- a/src/stars/Default/stars_part.h
+++ b/src/stars/Default/stars_part.h
@@ -25,6 +25,7 @@
 /* Read additional subgrid models */
 #include "chemistry_struct.h"
 #include "feedback_struct.h"
+#include "star_formation_struct.h"
 #include "tracers_struct.h"
 
 /**
@@ -78,6 +79,9 @@ struct spart {
   /*! Particle time bin */
   timebin_t time_bin;
 
+  /*! Star formation struct */
+  struct star_formation_spart_data sf_data;
+
   /*! Feedback structure */
   struct feedback_spart_data feedback_data;
 
diff --git a/src/stars/EAGLE/stars.h b/src/stars/EAGLE/stars.h
index 9567af1bceebb3c5f622695afbdbe0c0e3416b1f..1a897d1493acdf6ac83bb1f1513d1e72b4598f19 100644
--- a/src/stars/EAGLE/stars.h
+++ b/src/stars/EAGLE/stars.h
@@ -68,7 +68,7 @@ __attribute__((always_inline)) INLINE static void stars_first_init_spart(
     const int with_cosmology, const double scale_factor, const double time) {
 
   sp->time_bin = 0;
-  sp->birth_density = 0.f;
+  sp->sf_data.birth_density = 0.f;
   sp->f_E = -1.f;
   sp->count_since_last_enrichment = -1;
 
diff --git a/src/stars/EAGLE/stars_io.h b/src/stars/EAGLE/stars_io.h
index 1669a8b45b366a6682b8d73fc0056d1f0ddc53ec..811c7c18f4c6ddbea16c3e7a1cd859a1a17d5175 100644
--- a/src/stars/EAGLE/stars_io.h
+++ b/src/stars/EAGLE/stars_io.h
@@ -115,7 +115,7 @@ INLINE static void stars_write_particles(const struct spart *sparts,
                                          const int with_cosmology) {
 
   /* Say how much we want to write */
-  *num_fields = 10;
+  *num_fields = 8;
 
   /* List what we want to write */
   list[0] = io_make_output_field_convert_spart(
@@ -140,37 +140,24 @@ INLINE static void stars_write_particles(const struct spart *sparts,
       "SmoothingLengths", FLOAT, 1, UNIT_CONV_LENGTH, 1.f, sparts, h,
       "Co-moving smoothing lengths (FWHM of the kernel) of the particles");
 
-  list[5] = io_make_output_field(
-      "BirthDensities", FLOAT, 1, UNIT_CONV_DENSITY, 0.f, sparts, birth_density,
-      "Physical densities at the time of birth of the gas particles that "
-      "turned into stars (note that "
-      "we store the physical density at the birth redshift, no conversion is "
-      "needed)");
-
-  list[6] = io_make_output_field("InitialMasses", FLOAT, 1, UNIT_CONV_MASS, 0.f,
+  list[5] = io_make_output_field("InitialMasses", FLOAT, 1, UNIT_CONV_MASS, 0.f,
                                  sparts, mass_init,
                                  "Masses of the star particles at birth time");
 
   if (with_cosmology) {
-    list[7] = io_make_output_field(
+    list[6] = io_make_output_field(
         "BirthScaleFactors", FLOAT, 1, UNIT_CONV_NO_UNITS, 0.f, sparts,
         birth_scale_factor, "Scale-factors at which the stars were born");
   } else {
-    list[7] = io_make_output_field("BirthTimes", FLOAT, 1, UNIT_CONV_TIME, 0.f,
+    list[6] = io_make_output_field("BirthTimes", FLOAT, 1, UNIT_CONV_TIME, 0.f,
                                    sparts, birth_time,
                                    "Times at which the stars were born");
   }
 
-  list[8] = io_make_output_field(
+  list[7] = io_make_output_field(
       "FeedbackEnergyFractions", FLOAT, 1, UNIT_CONV_NO_UNITS, 0.f, sparts, f_E,
       "Fractions of the canonical feedback energy that was used for the stars' "
       "SNII feedback events");
-
-  list[9] =
-      io_make_output_field("BirthTemperatures", FLOAT, 1, UNIT_CONV_TEMPERATURE,
-                           0.f, sparts, birth_temperature,
-                           "Temperatures at the time of birth of the gas "
-                           "particles that turned into stars");
 }
 
 /**
diff --git a/src/stars/EAGLE/stars_part.h b/src/stars/EAGLE/stars_part.h
index 15613d077a3ac27d7484fbc47fe0dc3a5901c395..3ef7786bde0adfea5c835e90df7792242a42bf55 100644
--- a/src/stars/EAGLE/stars_part.h
+++ b/src/stars/EAGLE/stars_part.h
@@ -26,6 +26,7 @@
 /* Read additional aubgrid models */
 #include "chemistry_struct.h"
 #include "feedback_struct.h"
+#include "star_formation_struct.h"
 #include "tracers_struct.h"
 
 /**
@@ -85,15 +86,12 @@ struct spart {
   /*! Initial star mass */
   float mass_init;
 
-  /*! Birth density */
-  float birth_density;
-
-  /*! Birth temperature */
-  float birth_temperature;
-
   /*! Feedback energy fraction */
   float f_E;
 
+  /*! Star formation struct */
+  struct star_formation_spart_data sf_data;
+
   /*! Feedback structure */
   struct feedback_spart_data feedback_data;
 
diff --git a/src/stars/GEAR/stars.h b/src/stars/GEAR/stars.h
index 1c5bdf591661b46a0ce0849d4f5c37c401d2b62f..8c2ac2f87242d9393e7e2577f7d43cae0cd8cdee 100644
--- a/src/stars/GEAR/stars.h
+++ b/src/stars/GEAR/stars.h
@@ -65,7 +65,7 @@ __attribute__((always_inline)) INLINE static void stars_first_init_spart(
     const int with_cosmology, const double scale_factor, const double time) {
 
   sp->time_bin = 0;
-  sp->birth.density = 0.f;
+  sp->sf_data.birth_density = 0.f;
   // sp->birth_time = 0.;
 
   stars_init_spart(sp);
diff --git a/src/stars/GEAR/stars_io.h b/src/stars/GEAR/stars_io.h
index 83d3f8e418cde1722abfd0887fecf35b521fcbb3..d5ad49f953b2f49b92a54c63168689328b06d224 100644
--- a/src/stars/GEAR/stars_io.h
+++ b/src/stars/GEAR/stars_io.h
@@ -49,7 +49,7 @@ INLINE static void stars_read_particles(struct spart *sparts,
                                 UNIT_CONV_LENGTH, sparts, h);
   // TODO take it from initial mass
   list[5] = io_make_input_field("BirthMass", FLOAT, 1, COMPULSORY,
-                                UNIT_CONV_MASS, sparts, birth.mass);
+                                UNIT_CONV_MASS, sparts, sf_data.birth_mass);
 
   // TODO make it optional
   list[6] = io_make_input_field("BirthTime", FLOAT, 1, OPTIONAL, UNIT_CONV_MASS,
@@ -119,7 +119,7 @@ INLINE static void stars_write_particles(const struct spart *sparts,
                                          const int with_cosmology) {
 
   /* Say how much we want to write */
-  *num_fields = 10;
+  *num_fields = 7;
 
   /* List what we want to write */
   list[0] = io_make_output_field_convert_spart(
@@ -152,27 +152,6 @@ INLINE static void stars_write_particles(const struct spart *sparts,
                                    "Times at which the stars were born");
   }
 
-  list[6] = io_make_output_field(
-      "BirthDensities", FLOAT, 1, UNIT_CONV_DENSITY, 0.f, sparts, birth.density,
-      "Physical densities at the time of birth of the gas particles that "
-      "turned into stars (note that "
-      "we store the physical density at the birth redshift, no conversion is "
-      "needed)");
-
-  list[7] =
-      io_make_output_field("BirthTemperatures", FLOAT, 1, UNIT_CONV_TEMPERATURE,
-                           0.f, sparts, birth.temperature,
-                           "Temperatures at the time of birth of the gas "
-                           "particles that turned into stars");
-
-  list[8] = io_make_output_field("BirthMasses", FLOAT, 1, UNIT_CONV_MASS, 0.f,
-                                 sparts, birth.mass,
-                                 "Masses of the star particles at birth time");
-
-  list[9] = io_make_output_field("ProgenitorIDs", LONGLONG, 1,
-                                 UNIT_CONV_NO_UNITS, 0.f, sparts, prog_id,
-                                 "Unique IDs of the progenitor particle");
-
 #ifdef DEBUG_INTERACTIONS_STARS
 
   list += *num_fields;
diff --git a/src/stars/GEAR/stars_part.h b/src/stars/GEAR/stars_part.h
index 0e1e8a983bea318ecd5c45436d7ff38dd78266cd..8cc8025c7d5096a2e9362771cbad6990724e9e9a 100644
--- a/src/stars/GEAR/stars_part.h
+++ b/src/stars/GEAR/stars_part.h
@@ -25,6 +25,7 @@
 /* Read additional subgrid models */
 #include "chemistry_struct.h"
 #include "feedback_struct.h"
+#include "star_formation_struct.h"
 #include "tracers_struct.h"
 
 /**
@@ -37,9 +38,6 @@ struct spart {
   /*! Particle ID. */
   long long id;
 
-  /*! Progenitor ID */
-  long long prog_id;
-
   /*! Pointer to corresponding gravity part. */
   struct gpart* gpart;
 
@@ -71,17 +69,6 @@ struct spart {
 
   } density;
 
-  struct {
-    /*! birth density*/
-    float density;
-
-    /*! birth temperature*/
-    float temperature;
-
-    /*! birth mass */
-    float mass;
-  } birth;
-
   /*! Union for the birth time and birth scale factor */
   union {
 
@@ -92,6 +79,9 @@ struct spart {
     float birth_scale_factor;
   };
 
+  /*! Star formation struct */
+  struct star_formation_spart_data sf_data;
+
   /*! Feedback structure */
   struct feedback_spart_data feedback_data;