diff --git a/src/distributed_io.c b/src/distributed_io.c
index 355fdb05ac33b40ffdb0c2b9630b37a2e4b136c5..95554338540a6434c5f20b2776958a13a3fad89d 100644
--- a/src/distributed_io.c
+++ b/src/distributed_io.c
@@ -246,7 +246,8 @@ void write_output_distributed(struct engine* e,
   const struct gpart* gparts = e->s->gparts;
   const struct spart* sparts = e->s->sparts;
   const struct bpart* bparts = e->s->bparts;
-  struct swift_params* params = e->parameter_file;
+  struct output_options* output_options = e->output_options;
+  struct output_list* output_list = e->output_list_snapshots;
   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;
@@ -704,13 +705,20 @@ void write_output_distributed(struct engine* e,
     }
 
     /* Write everything that is not cancelled */
+
+    char current_selection_name[OUTPUT_LIST_SELECT_OUTPUT_MAX_LENGTH] =
+        "Default";
+    if (output_list->output_list_on) {
+      /* Users could have specified a different Select Output scheme for each
+       * snapshot. */
+      output_list_get_current_select_output(output_list,
+                                            &current_selection_name[0]);
+    }
     for (int i = 0; i < num_fields; ++i) {
 
       /* Did the user cancel this field? */
-      char field[PARSER_MAX_LINE_SIZE];
-      sprintf(field, "SelectOutput:%.*s_%s", FIELD_BUFFER_SIZE, list[i].name,
-              part_type_names[ptype]);
-      int should_write = parser_get_opt_param_int(params, field, 1);
+      const int should_write = output_options_should_write_field(
+          output_options, current_selection_name, list[i].name, ptype);
 
       if (should_write)
         write_distributed_array(e, h_grp, fileName, partTypeGroupName, list[i],
diff --git a/src/parallel_io.c b/src/parallel_io.c
index be820e2ecd3434f7d41635f8b0397ff5a1ef368c..7056d7b3d5f84cc23fe7903b5eeaa3a1011c8d96 100644
--- a/src/parallel_io.c
+++ b/src/parallel_io.c
@@ -51,6 +51,7 @@
 #include "hydro_properties.h"
 #include "io_properties.h"
 #include "memuse.h"
+#include "output_options.h"
 #include "part.h"
 #include "part_type.h"
 #include "star_formation_io.h"
@@ -1055,7 +1056,8 @@ void prepare_file(struct engine* e, const char* fileName,
   const struct gpart* gparts = e->s->gparts;
   const struct spart* sparts = e->s->sparts;
   const struct bpart* bparts = e->s->bparts;
-  struct swift_params* params = e->parameter_file;
+  struct output_options* output_options = e->output_options;
+  struct output_list* output_list = e->output_list_snapshots;
   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;
@@ -1257,13 +1259,20 @@ void prepare_file(struct engine* e, const char* fileName,
     }
 
     /* Prepare everything that is not cancelled */
+
+    char current_selection_name[OUTPUT_LIST_SELECT_OUTPUT_MAX_LENGTH] =
+        "Default";
+    if (output_list->output_list_on) {
+      /* Users could have specified a different Select Output scheme for each
+       * snapshot. */
+      output_list_get_current_select_output(output_list,
+                                            &current_selection_name[0]);
+    }
     for (int i = 0; i < num_fields; ++i) {
 
       /* Did the user cancel this field? */
-      char field[PARSER_MAX_LINE_SIZE];
-      sprintf(field, "SelectOutput:%.*s_%s", FIELD_BUFFER_SIZE, list[i].name,
-              part_type_names[ptype]);
-      int should_write = parser_get_opt_param_int(params, field, 1);
+      const int should_write = output_options_should_write_field(
+          output_options, current_selection_name, list[i].name, ptype);
 
       if (should_write)
         prepare_array_parallel(e, h_grp, fileName, xmfFile, partTypeGroupName,
@@ -1315,7 +1324,8 @@ void write_output_parallel(struct engine* e,
   const struct gpart* gparts = e->s->gparts;
   const struct spart* sparts = e->s->sparts;
   const struct bpart* bparts = e->s->bparts;
-  struct swift_params* params = e->parameter_file;
+  struct output_options* output_options = e->output_options;
+  struct output_list* output_list = e->output_list_snapshots;
   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;
@@ -1767,13 +1777,19 @@ void write_output_parallel(struct engine* e,
     }
 
     /* Write everything that is not cancelled */
+    char current_selection_name[OUTPUT_LIST_SELECT_OUTPUT_MAX_LENGTH] =
+        "Default";
+    if (output_list->output_list_on) {
+      /* Users could have specified a different Select Output scheme for each
+       * snapshot. */
+      output_list_get_current_select_output(output_list,
+                                            &current_selection_name[0]);
+    }
     for (int i = 0; i < num_fields; ++i) {
 
       /* Did the user cancel this field? */
-      char field[PARSER_MAX_LINE_SIZE];
-      sprintf(field, "SelectOutput:%.*s_%s", FIELD_BUFFER_SIZE, list[i].name,
-              part_type_names[ptype]);
-      int should_write = parser_get_opt_param_int(params, field, 1);
+      const int should_write = output_options_should_write_field(
+          output_options, current_selection_name, list[i].name, ptype);
 
       if (should_write)
         write_array_parallel(e, h_grp, fileName, partTypeGroupName, list[i],
diff --git a/src/serial_io.c b/src/serial_io.c
index 478058299a7b777b1351adcf64ddbf96b7bfb2bc..bf557b6b7ea034d0d413d056ef31af19fd8a4c6b 100644
--- a/src/serial_io.c
+++ b/src/serial_io.c
@@ -51,6 +51,7 @@
 #include "hydro_properties.h"
 #include "io_properties.h"
 #include "memuse.h"
+#include "output_options.h"
 #include "part.h"
 #include "part_type.h"
 #include "star_formation_io.h"
@@ -868,7 +869,8 @@ void write_output_serial(struct engine* e,
   const struct gpart* gparts = e->s->gparts;
   const struct spart* sparts = e->s->sparts;
   const struct bpart* bparts = e->s->bparts;
-  struct swift_params* params = e->parameter_file;
+  struct output_options* output_options = e->output_options;
+  struct output_list* output_list = e->output_list_snapshots;
   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;
@@ -1386,13 +1388,20 @@ void write_output_serial(struct engine* e,
         }
 
         /* Write everything that is not cancelled */
+
+        char current_selection_name[OUTPUT_LIST_SELECT_OUTPUT_MAX_LENGTH] =
+            "Default";
+        if (output_list->output_list_on) {
+          /* Users could have specified a different Select Output scheme for
+           * each snapshot. */
+          output_list_get_current_select_output(output_list,
+                                                &current_selection_name[0]);
+        }
         for (int i = 0; i < num_fields; ++i) {
 
           /* Did the user cancel this field? */
-          char field[PARSER_MAX_LINE_SIZE];
-          sprintf(field, "SelectOutput:%.*s_%s", FIELD_BUFFER_SIZE,
-                  list[i].name, part_type_names[ptype]);
-          int should_write = parser_get_opt_param_int(params, field, 1);
+          const int should_write = output_options_should_write_field(
+              output_options, current_selection_name, list[i].name, ptype);
 
           if (should_write)
             write_array_serial(e, h_grp, fileName, xmfFile, partTypeGroupName,