diff --git a/sway/config/output.c b/sway/config/output.c
index a30d7954..25956fac 100644
--- a/sway/config/output.c
+++ b/sway/config/output.c
@@ -229,8 +229,8 @@ static bool set_mode(struct wlr_output *output, int width, int height,
 	}
 	if (!best) {
 		sway_log(SWAY_ERROR, "Configured mode for %s not available", output->name);
-		sway_log(SWAY_INFO, "Picking default mode instead");
-		best = wl_container_of(output->modes.prev, mode, link);
+		sway_log(SWAY_INFO, "Picking preferred mode instead");
+		best = wlr_output_preferred_mode(output);
 	} else {
 		sway_log(SWAY_DEBUG, "Assigning configured mode to %s", output->name);
 	}
@@ -272,8 +272,7 @@ bool apply_output_config(struct output_config *oc, struct sway_output *output) {
 		modeset_success = set_mode(wlr_output, oc->width, oc->height,
 			oc->refresh_rate, oc->custom_mode == 1);
 	} else if (!wl_list_empty(&wlr_output->modes)) {
-		struct wlr_output_mode *mode =
-			wl_container_of(wlr_output->modes.prev, mode, link);
+		struct wlr_output_mode *mode = wlr_output_preferred_mode(wlr_output);
 		modeset_success = wlr_output_set_mode(wlr_output, mode);
 	} else {
 		// Output doesn't support modes
@@ -332,9 +331,8 @@ bool apply_output_config(struct output_config *oc, struct sway_output *output) {
 static void default_output_config(struct output_config *oc,
 		struct wlr_output *wlr_output) {
 	oc->enabled = 1;
-	if (!wl_list_empty(&wlr_output->modes)) {
-		struct wlr_output_mode *mode =
-			wl_container_of(wlr_output->modes.prev, mode, link);
+	struct wlr_output_mode *mode = wlr_output_preferred_mode(wlr_output);
+	if (mode != NULL) {
 		oc->width = mode->width;
 		oc->height = mode->height;
 		oc->refresh_rate = mode->refresh / 1000.f;