diff --git a/src/parallel_io.c b/src/parallel_io.c
index 952720c346199d0cf6a823e814a845dcce59f26f..f19c1448ac4ce557069e3231d79331f0765a1e11 100644
--- a/src/parallel_io.c
+++ b/src/parallel_io.c
@@ -1215,7 +1215,9 @@ void prepare_file(struct engine* e, const char* baseName, long long N_total[6],
                                               with_cosmology);
         num_fields +=
             star_formation_write_particles(parts, xparts, list + num_fields);
-        num_fields += fof_write_parts(parts, xparts, list + num_fields);
+        if (with_fof) {
+          num_fields += fof_write_parts(parts, xparts, list + num_fields);
+        }
         if (with_stf) {
           num_fields +=
               velociraptor_write_parts(parts, xparts, list + num_fields);
@@ -1224,7 +1226,9 @@ void prepare_file(struct engine* e, const char* baseName, long long N_total[6],
 
       case swift_type_dark_matter:
         darkmatter_write_particles(gparts, list, &num_fields);
-        num_fields += fof_write_gparts(gparts, list + num_fields);
+        if (with_fof) {
+          num_fields += fof_write_gparts(gparts, list + num_fields);
+        }
         if (with_stf) {
           num_fields += velociraptor_write_gparts(e->s->gpart_group_data,
                                                   list + num_fields);
@@ -1236,7 +1240,9 @@ 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 += fof_write_sparts(sparts, list + num_fields);
+        if (with_fof) {
+          num_fields += fof_write_sparts(sparts, list + num_fields);
+        }
         if (with_stf) {
           num_fields += velociraptor_write_sparts(sparts, list + num_fields);
         }
@@ -1245,7 +1251,9 @@ void prepare_file(struct engine* e, const char* baseName, long long N_total[6],
       case swift_type_black_hole:
         black_holes_write_particles(bparts, list, &num_fields, with_cosmology);
         num_fields += chemistry_write_bparticles(bparts, list + num_fields);
-        num_fields += fof_write_bparts(bparts, list + num_fields);
+        if (with_fof) {
+          num_fields += fof_write_bparts(bparts, list + num_fields);
+        }
         if (with_stf) {
           num_fields += velociraptor_write_bparts(bparts, list + num_fields);
         }
@@ -1548,7 +1556,9 @@ void write_output_parallel(struct engine* e, const char* baseName,
             num_fields += cooling_write_particles(
                 parts, xparts, list + num_fields, e->cooling_func);
           }
-          num_fields += fof_write_parts(parts, xparts, list + num_fields);
+          if (with_fof) {
+            num_fields += fof_write_parts(parts, xparts, list + num_fields);
+          }
           if (with_stf) {
             num_fields +=
                 velociraptor_write_parts(parts, xparts, list + num_fields);
@@ -1587,8 +1597,10 @@ void write_output_parallel(struct engine* e, const char* baseName,
                 cooling_write_particles(parts_written, xparts_written,
                                         list + num_fields, e->cooling_func);
           }
-          num_fields +=
-              fof_write_parts(parts_written, xparts_written, list + num_fields);
+          if (with_fof) {
+            num_fields += fof_write_parts(parts_written, xparts_written,
+                                          list + num_fields);
+          }
           if (with_stf) {
             num_fields += velociraptor_write_parts(
                 parts_written, xparts_written, list + num_fields);
@@ -1606,7 +1618,9 @@ void write_output_parallel(struct engine* e, const char* baseName,
           /* This is a DM-only run without inhibited particles */
           Nparticles = Ntot;
           darkmatter_write_particles(gparts, list, &num_fields);
-          num_fields += fof_write_gparts(gparts, list + num_fields);
+          if (with_fof) {
+            num_fields += fof_write_gparts(gparts, list + num_fields);
+          }
           if (with_stf) {
             num_fields += velociraptor_write_gparts(e->s->gpart_group_data,
                                                     list + num_fields);
@@ -1639,7 +1653,9 @@ void write_output_parallel(struct engine* e, const char* baseName,
 
           /* Select the fields to write */
           darkmatter_write_particles(gparts_written, list, &num_fields);
-          num_fields += fof_write_gparts(gparts_written, list + num_fields);
+          if (with_fof) {
+            num_fields += fof_write_gparts(gparts_written, list + num_fields);
+          }
           if (with_stf) {
             num_fields += velociraptor_write_gparts(gpart_group_data_written,
                                                     list + num_fields);
@@ -1656,7 +1672,9 @@ 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 += fof_write_sparts(sparts, list + num_fields);
+          if (with_fof) {
+            num_fields += fof_write_sparts(sparts, list + num_fields);
+          }
           if (with_stf) {
             num_fields += velociraptor_write_sparts(sparts, list + num_fields);
           }
@@ -1681,7 +1699,9 @@ 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 += fof_write_sparts(sparts_written, list + num_fields);
+          if (with_fof) {
+            num_fields += fof_write_sparts(sparts_written, list + num_fields);
+          }
           if (with_stf) {
             num_fields +=
                 velociraptor_write_sparts(sparts_written, list + num_fields);
@@ -1697,7 +1717,9 @@ void write_output_parallel(struct engine* e, const char* baseName,
           black_holes_write_particles(bparts, list, &num_fields,
                                       with_cosmology);
           num_fields += chemistry_write_bparticles(bparts, list + num_fields);
-          num_fields += fof_write_bparts(bparts, list + num_fields);
+          if (with_fof) {
+            num_fields += fof_write_bparts(bparts, list + num_fields);
+          }
           if (with_stf) {
             num_fields += velociraptor_write_bparts(bparts, list + num_fields);
           }
@@ -1720,7 +1742,9 @@ void write_output_parallel(struct engine* e, const char* baseName,
           black_holes_write_particles(bparts_written, list, &num_fields,
                                       with_cosmology);
           num_fields += chemistry_write_bparticles(bparts, list + num_fields);
-          num_fields += fof_write_bparts(bparts_written, list + num_fields);
+          if (with_fof) {
+            num_fields += fof_write_bparts(bparts_written, list + num_fields);
+          }
           if (with_stf) {
             num_fields +=
                 velociraptor_write_bparts(bparts_written, list + num_fields);
diff --git a/src/serial_io.c b/src/serial_io.c
index 5cc906cfce9638aca89f6d8fc7439b8caa34291b..bdc16c1af0ce6425b394a2cb40134af56b648f0c 100644
--- a/src/serial_io.c
+++ b/src/serial_io.c
@@ -846,6 +846,7 @@ void write_output_serial(struct engine* e, const char* baseName,
   const int with_cosmology = e->policy & engine_policy_cosmology;
   const int with_cooling = e->policy & engine_policy_cooling;
   const int with_temperature = e->policy & engine_policy_temperature;
+  const int with_fof = e->policy & engine_policy_fof;
 #ifdef HAVE_VELOCIRAPTOR
   const int with_stf = (e->policy & engine_policy_structure_finding) &&
                        (e->s->gpart_group_data != NULL);
@@ -1181,7 +1182,9 @@ void write_output_serial(struct engine* e, const char* baseName,
                 num_fields += cooling_write_particles(
                     parts, xparts, list + num_fields, e->cooling_func);
               }
-              num_fields += fof_write_parts(parts, xparts, list + num_fields);
+              if (with_fof) {
+                num_fields += fof_write_parts(parts, xparts, list + num_fields);
+              }
               if (with_stf) {
                 num_fields +=
                     velociraptor_write_parts(parts, xparts, list + num_fields);
@@ -1220,8 +1223,10 @@ void write_output_serial(struct engine* e, const char* baseName,
                     cooling_write_particles(parts_written, xparts_written,
                                             list + num_fields, e->cooling_func);
               }
-              num_fields += fof_write_parts(parts_written, xparts_written,
-                                            list + num_fields);
+              if (with_fof) {
+                num_fields += fof_write_parts(parts_written, xparts_written,
+                                              list + num_fields);
+              }
               if (with_stf) {
                 num_fields += velociraptor_write_parts(
                     parts_written, xparts_written, list + num_fields);
@@ -1240,7 +1245,10 @@ void write_output_serial(struct engine* e, const char* baseName,
               /* This is a DM-only run without inhibited particles */
               Nparticles = Ntot;
               darkmatter_write_particles(gparts, list, &num_fields);
-              num_fields += fof_write_gparts(gparts_written, list + num_fields);
+              if (with_fof) {
+                num_fields +=
+                    fof_write_gparts(gparts_written, list + num_fields);
+              }
               if (with_stf) {
                 num_fields += velociraptor_write_gparts(e->s->gpart_group_data,
                                                         list + num_fields);
@@ -1274,7 +1282,10 @@ void write_output_serial(struct engine* e, const char* baseName,
 
               /* Select the fields to write */
               darkmatter_write_particles(gparts_written, list, &num_fields);
-              num_fields += fof_write_gparts(gparts_written, list + num_fields);
+              if (with_fof) {
+                num_fields +=
+                    fof_write_gparts(gparts_written, list + num_fields);
+              }
               if (with_stf) {
                 num_fields += velociraptor_write_gparts(
                     gpart_group_data_written, list + num_fields);
@@ -1292,7 +1303,9 @@ 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 += fof_write_sparts(sparts, list + num_fields);
+              if (with_fof) {
+                num_fields += fof_write_sparts(sparts, list + num_fields);
+              }
               if (with_stf) {
                 num_fields +=
                     velociraptor_write_sparts(sparts, list + num_fields);
@@ -1319,7 +1332,10 @@ 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 += fof_write_sparts(sparts_written, list + num_fields);
+              if (with_fof) {
+                num_fields +=
+                    fof_write_sparts(sparts_written, list + num_fields);
+              }
               if (with_stf) {
                 num_fields += velociraptor_write_sparts(sparts_written,
                                                         list + num_fields);
@@ -1336,7 +1352,9 @@ void write_output_serial(struct engine* e, const char* baseName,
                                           with_cosmology);
               num_fields +=
                   chemistry_write_bparticles(bparts, list + num_fields);
-              num_fields += fof_write_bparts(bparts, list + num_fields);
+              if (with_fof) {
+                num_fields += fof_write_bparts(bparts, list + num_fields);
+              }
               if (with_stf) {
                 num_fields +=
                     velociraptor_write_bparts(bparts, list + num_fields);
@@ -1361,7 +1379,10 @@ void write_output_serial(struct engine* e, const char* baseName,
                                           with_cosmology);
               num_fields +=
                   chemistry_write_bparticles(bparts, list + num_fields);
-              num_fields += fof_write_bparts(bparts_written, list + num_fields);
+              if (with_fof) {
+                num_fields +=
+                    fof_write_bparts(bparts_written, list + num_fields);
+              }
               if (with_stf) {
                 num_fields += velociraptor_write_bparts(bparts_written,
                                                         list + num_fields);
diff --git a/src/single_io.c b/src/single_io.c
index 85d40ff7b55719f767db1e4c54374031d2cc8612..947bf258f8f7c696e0bf5a9d339b1c98ab52a172 100644
--- a/src/single_io.c
+++ b/src/single_io.c
@@ -708,6 +708,7 @@ void write_output_single(struct engine* e, const char* baseName,
   const int with_cosmology = e->policy & engine_policy_cosmology;
   const int with_cooling = e->policy & engine_policy_cooling;
   const int with_temperature = e->policy & engine_policy_temperature;
+  const int with_fof = e->policy & engine_policy_fof;
 #ifdef HAVE_VELOCIRAPTOR
   const int with_stf = (e->policy & engine_policy_structure_finding) &&
                        (e->s->gpart_group_data != NULL);
@@ -980,7 +981,9 @@ void write_output_single(struct engine* e, const char* baseName,
             num_fields += cooling_write_particles(
                 parts, xparts, list + num_fields, e->cooling_func);
           }
-          num_fields += fof_write_parts(parts, xparts, list + num_fields);
+          if (with_fof) {
+            num_fields += fof_write_parts(parts, xparts, list + num_fields);
+          }
           if (with_stf) {
             num_fields +=
                 velociraptor_write_parts(parts, xparts, list + num_fields);
@@ -1019,8 +1022,10 @@ void write_output_single(struct engine* e, const char* baseName,
                 cooling_write_particles(parts_written, xparts_written,
                                         list + num_fields, e->cooling_func);
           }
-          num_fields +=
-              fof_write_parts(parts_written, xparts_written, list + num_fields);
+          if (with_fof) {
+            num_fields += fof_write_parts(parts_written, xparts_written,
+                                          list + num_fields);
+          }
           if (with_stf) {
             num_fields += velociraptor_write_parts(
                 parts_written, xparts_written, list + num_fields);
@@ -1038,7 +1043,9 @@ void write_output_single(struct engine* e, const char* baseName,
           /* This is a DM-only run without inhibited particles */
           N = Ntot;
           darkmatter_write_particles(gparts, list, &num_fields);
-          num_fields += fof_write_gparts(gparts, list + num_fields);
+          if (with_fof) {
+            num_fields += fof_write_gparts(gparts, list + num_fields);
+          }
           if (with_stf) {
             num_fields += velociraptor_write_gparts(e->s->gpart_group_data,
                                                     list + num_fields);
@@ -1071,7 +1078,9 @@ void write_output_single(struct engine* e, const char* baseName,
 
           /* Select the fields to write */
           darkmatter_write_particles(gparts_written, list, &num_fields);
-          num_fields += fof_write_gparts(gparts_written, list + num_fields);
+          if (with_fof) {
+            num_fields += fof_write_gparts(gparts_written, list + num_fields);
+          }
           if (with_stf) {
             num_fields += velociraptor_write_gparts(gpart_group_data_written,
                                                     list + num_fields);
@@ -1088,7 +1097,9 @@ 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 += fof_write_sparts(sparts, list + num_fields);
+          if (with_fof) {
+            num_fields += fof_write_sparts(sparts, list + num_fields);
+          }
           if (with_stf) {
             num_fields += velociraptor_write_sparts(sparts, list + num_fields);
           }
@@ -1114,7 +1125,9 @@ 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 += fof_write_sparts(sparts_written, list + num_fields);
+          if (with_fof) {
+            num_fields += fof_write_sparts(sparts_written, list + num_fields);
+          }
           if (with_stf) {
             num_fields +=
                 velociraptor_write_sparts(sparts_written, list + num_fields);
@@ -1130,7 +1143,9 @@ void write_output_single(struct engine* e, const char* baseName,
           black_holes_write_particles(bparts, list, &num_fields,
                                       with_cosmology);
           num_fields += chemistry_write_bparticles(bparts, list + num_fields);
-          num_fields += fof_write_bparts(bparts, list + num_fields);
+          if (with_fof) {
+            num_fields += fof_write_bparts(bparts, list + num_fields);
+          }
           if (with_stf) {
             num_fields += velociraptor_write_bparts(bparts, list + num_fields);
           }
@@ -1154,7 +1169,9 @@ void write_output_single(struct engine* e, const char* baseName,
                                       with_cosmology);
           num_fields +=
               chemistry_write_bparticles(bparts_written, list + num_fields);
-          num_fields += fof_write_bparts(bparts_written, list + num_fields);
+          if (with_fof) {
+            num_fields += fof_write_bparts(bparts_written, list + num_fields);
+          }
           if (with_stf) {
             num_fields +=
                 velociraptor_write_bparts(bparts_written, list + num_fields);