diff --git a/src/hydro/Default/hydro_io.h b/src/hydro/Default/hydro_io.h
index 8c12f015bd69dc917a80c564422676a85ffcfb3b..c057886ea6dd4900949a87de35055351326a00fe 100644
--- a/src/hydro/Default/hydro_io.h
+++ b/src/hydro/Default/hydro_io.h
@@ -32,8 +32,6 @@
 void hydro_read_particles(struct part* parts, struct io_props* list,
                           int* num_fields) {
 
-  *num_fields = 8;
-
   /* List what we want to read */
   list[0] = io_make_input_field("Coordinates", DOUBLE, 3, COMPULSORY,
                                 UNIT_CONV_LENGTH, parts, x);
@@ -51,6 +49,13 @@ void hydro_read_particles(struct part* parts, struct io_props* list,
                                 UNIT_CONV_ACCELERATION, parts, a_hydro);
   list[7] = io_make_input_field("Density", FLOAT, 1, OPTIONAL,
                                 UNIT_CONV_DENSITY, parts, rho);
+  *num_fields = 8;
+  list += *num_fields;
+
+  /* Read in chemistry information */
+  const int num_chem_fields = chemistry_read_particles(parts, list);
+  *num_fields += num_chem_fields;
+  list += num_chem_fields;
 }
 
 void convert_part_pos(const struct engine* e, const struct part* p,
@@ -77,8 +82,6 @@ void convert_part_pos(const struct engine* e, const struct part* p,
 void hydro_write_particles(struct part* parts, struct io_props* list,
                            int* num_fields) {
 
-  *num_fields = 8;
-
   /* List what we want to write */
   list[0] = io_make_output_field_convert_part(
       "Coordinates", DOUBLE, 3, UNIT_CONV_LENGTH, parts, convert_part_pos);
@@ -96,6 +99,14 @@ void hydro_write_particles(struct part* parts, struct io_props* list,
                                  UNIT_CONV_ACCELERATION, parts, a_hydro);
   list[7] =
       io_make_output_field("Density", FLOAT, 1, UNIT_CONV_DENSITY, parts, rho);
+
+  *num_fields = 8;
+  list += *num_fields;
+
+  /* Write some chemistry information */
+  const int num_chem_fields = chemistry_write_particles(parts, list);
+  *num_fields += num_chem_fields;
+  list += num_chem_fields;
 }
 
 /**
diff --git a/src/hydro/Default/hydro_part.h b/src/hydro/Default/hydro_part.h
index 5d2f76ab298cdd6199d95abe1e4435321302689e..042fa2aee4e972c245a8390759f9765a71b20279 100644
--- a/src/hydro/Default/hydro_part.h
+++ b/src/hydro/Default/hydro_part.h
@@ -46,6 +46,12 @@ struct xpart {
 /* Data of a single particle. */
 struct part {
 
+  /* Particle ID. */
+  long long id;
+
+  /* Pointer to corresponding gravity part. */
+  struct gpart* gpart;
+
   /* Particle position. */
   double x[3];
 
@@ -116,11 +122,8 @@ struct part {
   /* Particle mass. */
   float mass;
 
-  /* Particle ID. */
-  long long id;
-
-  /* Pointer to corresponding gravity part. */
-  struct gpart* gpart;
+  /* Chemistry information */
+  struct chemistry_part_data chemistry_data;
 
   /* Particle time-bin */
   timebin_t time_bin;
diff --git a/src/hydro/Gizmo/hydro_io.h b/src/hydro/Gizmo/hydro_io.h
index 9d6acf4155f02dc8caaa92be5366389ebb5ecaef..4c4b9e45d307c88097001bff18cd8034d4246c86 100644
--- a/src/hydro/Gizmo/hydro_io.h
+++ b/src/hydro/Gizmo/hydro_io.h
@@ -41,8 +41,6 @@
 void hydro_read_particles(struct part* parts, struct io_props* list,
                           int* num_fields) {
 
-  *num_fields = 8;
-
   /* List what we want to read */
   list[0] = io_make_input_field("Coordinates", DOUBLE, 3, COMPULSORY,
                                 UNIT_CONV_LENGTH, parts, x);
@@ -61,6 +59,14 @@ void hydro_read_particles(struct part* parts, struct io_props* list,
                                 UNIT_CONV_ACCELERATION, parts, a_hydro);
   list[7] = io_make_input_field("Density", FLOAT, 1, OPTIONAL,
                                 UNIT_CONV_DENSITY, parts, primitives.rho);
+
+  *num_fields = 8;
+  list += *num_fields;
+
+  /* Read in chemistry information */
+  const int num_chem_fields = chemistry_read_particles(parts, list);
+  *num_fields += num_chem_fields;
+  list += num_chem_fields;
 }
 
 /**
@@ -131,8 +137,6 @@ void convert_part_pos(const struct engine* e, const struct part* p,
 void hydro_write_particles(struct part* parts, struct io_props* list,
                            int* num_fields) {
 
-  *num_fields = 10;
-
   /* List what we want to write */
   list[0] = io_make_output_field_convert_part(
       "Coordinates", DOUBLE, 3, UNIT_CONV_LENGTH, parts, convert_part_pos);
@@ -155,6 +159,14 @@ void hydro_write_particles(struct part* parts, struct io_props* list,
                                  parts, primitives.P);
   list[9] = io_make_output_field_convert_part(
       "TotEnergy", FLOAT, 1, UNIT_CONV_ENERGY, parts, convert_Etot);
+
+  *num_fields = 10;
+  list += *num_fields;
+
+  /* Write some chemistry information */
+  const int num_chem_fields = chemistry_write_particles(parts, list);
+  *num_fields += num_chem_fields;
+  list += num_chem_fields;
 }
 
 /**
diff --git a/src/hydro/Gizmo/hydro_part.h b/src/hydro/Gizmo/hydro_part.h
index f13da395bb8dfe0ccc04e7fb823c47c1f2db4b02..76527f47b2a549d0cdac2f589adfff26cbb589c2 100644
--- a/src/hydro/Gizmo/hydro_part.h
+++ b/src/hydro/Gizmo/hydro_part.h
@@ -188,6 +188,9 @@ struct part {
 
   } gravity;
 
+  /* Chemistry information */
+  struct chemistry_part_data chemistry_data;
+
   /* Time-step length */
   timebin_t time_bin;
 
diff --git a/src/hydro/Minimal/hydro_io.h b/src/hydro/Minimal/hydro_io.h
index 771e4ac2d066ea098edb8b2f11d7afd550783347..3d7333b8c3dda686087a05827138abd8a30fe614 100644
--- a/src/hydro/Minimal/hydro_io.h
+++ b/src/hydro/Minimal/hydro_io.h
@@ -48,8 +48,6 @@
 void hydro_read_particles(struct part* parts, struct io_props* list,
                           int* num_fields) {
 
-  *num_fields = 8;
-
   /* List what we want to read */
   list[0] = io_make_input_field("Coordinates", DOUBLE, 3, COMPULSORY,
                                 UNIT_CONV_LENGTH, parts, x);
@@ -67,6 +65,13 @@ void hydro_read_particles(struct part* parts, struct io_props* list,
                                 UNIT_CONV_ACCELERATION, parts, a_hydro);
   list[7] = io_make_input_field("Density", FLOAT, 1, OPTIONAL,
                                 UNIT_CONV_DENSITY, parts, rho);
+  *num_fields = 8;
+  list += *num_fields;
+
+  /* Read in chemistry information */
+  const int num_chem_fields = chemistry_read_particles(parts, list);
+  *num_fields += num_chem_fields;
+  list += num_chem_fields;
 }
 
 void convert_S(const struct engine* e, const struct part* p, float* ret) {
@@ -103,8 +108,6 @@ void convert_part_pos(const struct engine* e, const struct part* p,
 void hydro_write_particles(struct part* parts, struct io_props* list,
                            int* num_fields) {
 
-  *num_fields = 10;
-
   /* List what we want to write */
   list[0] = io_make_output_field_convert_part(
       "Coordinates", DOUBLE, 3, UNIT_CONV_LENGTH, parts, convert_part_pos);
@@ -126,6 +129,14 @@ void hydro_write_particles(struct part* parts, struct io_props* list,
       "Entropy", FLOAT, 1, UNIT_CONV_ENTROPY_PER_UNIT_MASS, parts, convert_S);
   list[9] = io_make_output_field_convert_part(
       "Pressure", FLOAT, 1, UNIT_CONV_PRESSURE, parts, convert_P);
+
+  *num_fields = 10;
+  list += *num_fields;
+
+  /* Write some chemistry information */
+  const int num_chem_fields = chemistry_write_particles(parts, list);
+  *num_fields += num_chem_fields;
+  list += num_chem_fields;
 }
 
 /**
diff --git a/src/hydro/Minimal/hydro_part.h b/src/hydro/Minimal/hydro_part.h
index e9289c099a8a4ee698b016036e4e3d4dad481768..3ecf97e9246c60a223743ce54d4dc45b33e4250c 100644
--- a/src/hydro/Minimal/hydro_part.h
+++ b/src/hydro/Minimal/hydro_part.h
@@ -149,6 +149,9 @@ struct part {
     } force;
   };
 
+  /* Chemistry information */
+  struct chemistry_part_data chemistry_data;
+
   /*! Time-step length */
   timebin_t time_bin;
 
diff --git a/src/hydro/PressureEntropy/hydro_io.h b/src/hydro/PressureEntropy/hydro_io.h
index d3780261ba587cfac92ec44a65b13f0a4344b3c3..3d414c6a2603fd981ed48ea10824872c7622f00f 100644
--- a/src/hydro/PressureEntropy/hydro_io.h
+++ b/src/hydro/PressureEntropy/hydro_io.h
@@ -45,8 +45,6 @@
 void hydro_read_particles(struct part* parts, struct io_props* list,
                           int* num_fields) {
 
-  *num_fields = 8;
-
   /* List what we want to read */
   list[0] = io_make_input_field("Coordinates", DOUBLE, 3, COMPULSORY,
                                 UNIT_CONV_LENGTH, parts, x);
@@ -65,6 +63,14 @@ void hydro_read_particles(struct part* parts, struct io_props* list,
                                 UNIT_CONV_ACCELERATION, parts, a_hydro);
   list[7] = io_make_input_field("Density", FLOAT, 1, OPTIONAL,
                                 UNIT_CONV_DENSITY, parts, rho);
+
+  *num_fields = 8;
+  list += *num_fields;
+
+  /* Read in chemistry information */
+  const int num_chem_fields = chemistry_read_particles(parts, list);
+  *num_fields += num_chem_fields;
+  list += num_chem_fields;
 }
 
 void convert_u(const struct engine* e, const struct part* p, float* ret) {
@@ -101,8 +107,6 @@ void convert_part_pos(const struct engine* e, const struct part* p,
 void hydro_write_particles(struct part* parts, struct io_props* list,
                            int* num_fields) {
 
-  *num_fields = 11;
-
   /* List what we want to write */
   list[0] = io_make_output_field_convert_part(
       "Coordinates", DOUBLE, 3, UNIT_CONV_LENGTH, parts, convert_part_pos);
@@ -127,6 +131,14 @@ void hydro_write_particles(struct part* parts, struct io_props* list,
       "Pressure", FLOAT, 1, UNIT_CONV_PRESSURE, parts, convert_P);
   list[10] = io_make_output_field("WeightedDensity", FLOAT, 1,
                                   UNIT_CONV_DENSITY, parts, rho_bar);
+
+  *num_fields = 11;
+  list += *num_fields;
+
+  /* Write some chemistry information */
+  const int num_chem_fields = chemistry_write_particles(parts, list);
+  *num_fields += num_chem_fields;
+  list += num_chem_fields;
 }
 
 /**
diff --git a/src/hydro/PressureEntropy/hydro_part.h b/src/hydro/PressureEntropy/hydro_part.h
index 6cb6fe87393e376dc189150286079faa9f41cb68..4f7f85e28fc94cb31ab4b3089f1f93a513aff97f 100644
--- a/src/hydro/PressureEntropy/hydro_part.h
+++ b/src/hydro/PressureEntropy/hydro_part.h
@@ -138,6 +138,9 @@ struct part {
     } force;
   };
 
+  /* Chemistry information */
+  struct chemistry_part_data chemistry_data;
+
   /* Time-step length */
   timebin_t time_bin;
 
diff --git a/src/hydro/Shadowswift/hydro_io.h b/src/hydro/Shadowswift/hydro_io.h
index f6f6fcc6c070b0add8e2b97678e5ef1ada636bfd..2c19dded539cffc22eeb90bc70c15760e0d57b5c 100644
--- a/src/hydro/Shadowswift/hydro_io.h
+++ b/src/hydro/Shadowswift/hydro_io.h
@@ -35,8 +35,6 @@
 void hydro_read_particles(struct part* parts, struct io_props* list,
                           int* num_fields) {
 
-  *num_fields = 8;
-
   /* List what we want to read */
   list[0] = io_make_input_field("Coordinates", DOUBLE, 3, COMPULSORY,
                                 UNIT_CONV_LENGTH, parts, x);
@@ -55,6 +53,13 @@ void hydro_read_particles(struct part* parts, struct io_props* list,
                                 UNIT_CONV_ACCELERATION, parts, a_hydro);
   list[7] = io_make_input_field("Density", FLOAT, 1, OPTIONAL,
                                 UNIT_CONV_DENSITY, parts, primitives.rho);
+  *num_fields = 8;
+  list += *num_fields;
+
+  /* Read in chemistry information */
+  const int num_chem_fields = chemistry_read_particles(parts, list);
+  *num_fields += num_chem_fields;
+  list += num_chem_fields;
 }
 
 /**
@@ -128,8 +133,6 @@ void convert_part_pos(const struct engine* e, const struct part* p,
 void hydro_write_particles(struct part* parts, struct io_props* list,
                            int* num_fields) {
 
-  *num_fields = 13;
-
   /* List what we want to write */
   list[0] = io_make_output_field_convert_part(
       "Coordinates", DOUBLE, 3, UNIT_CONV_LENGTH, parts, convert_part_pos);
@@ -158,6 +161,14 @@ void hydro_write_particles(struct part* parts, struct io_props* list,
                                   parts, primitives.P);
   list[12] = io_make_output_field_convert_part(
       "TotEnergy", FLOAT, 1, UNIT_CONV_ENERGY, parts, convert_Etot);
+
+  *num_fields = 13;
+  list += *num_fields;
+
+  /* Write some chemistry information */
+  const int num_chem_fields = chemistry_write_particles(parts, list);
+  *num_fields += num_chem_fields;
+  list += num_chem_fields;
 }
 
 /**
diff --git a/src/hydro/Shadowswift/hydro_part.h b/src/hydro/Shadowswift/hydro_part.h
index e25400e905b893d13ffb552da42d3fbf96d71fde..ae30ecca74cebe7df3057f7508d6d6aa04ddbfa6 100644
--- a/src/hydro/Shadowswift/hydro_part.h
+++ b/src/hydro/Shadowswift/hydro_part.h
@@ -169,6 +169,9 @@ struct part {
 
   } force;
 
+  /* Chemistry information */
+  struct chemistry_part_data chemistry_data;
+
   /* Time-step length */
   timebin_t time_bin;