diff --git a/src/winit.rs b/src/winit.rs
index bd197b2f5fea2b6c188374d4d76955099477e783..e21947998aad11df93b5c51dfdb66647f0c32ac3 100644
--- a/src/winit.rs
+++ b/src/winit.rs
@@ -3,17 +3,42 @@ use std::time::Duration;
 use smithay::{
     backend::{
         renderer::{
-            damage::OutputDamageTracker, element::surface::WaylandSurfaceRenderElement, gles::GlesRenderer,
+            damage::OutputDamageTracker, element::surface::WaylandSurfaceRenderElement,
+            gles::GlesRenderer,
         },
         winit::{self, WinitEvent},
     },
+    desktop::{Space, Window},
     output::{Mode, Output, PhysicalProperties, Subpixel},
-    reexports::calloop::EventLoop,
+    reexports::{calloop::EventLoop, wayland_protocols::xdg::shell::server::xdg_toplevel},
     utils::{Rectangle, Transform},
 };
 
 use crate::{CalloopData, Smallvil};
 
+fn fix_positions(space: &Space<Window>) {
+    let maximized_windows = space.elements().filter(|element| {
+        element
+            .toplevel()
+            .current_state()
+            .states
+            .contains(xdg_toplevel::State::Maximized)
+    });
+    maximized_windows.for_each(|w| {
+        let surface = w.toplevel();
+        let outputs = space.outputs_for_element(w);
+        let output = outputs
+            .first()
+            .or_else(|| space.outputs().next())
+            .expect("No outputs?");
+        let new_target_size = space.output_geometry(output).unwrap().size;
+        surface.with_pending_state(|state| {
+            state.size = Some(new_target_size);
+        });
+        surface.send_pending_configure();
+    });
+}
+
 pub fn init_winit(
     event_loop: &mut EventLoop<CalloopData>,
     data: &mut CalloopData,
@@ -53,15 +78,12 @@ pub fn init_winit(
 
         match event {
             WinitEvent::Resized { size, .. } => {
-                output.change_current_state(
-                    Some(Mode {
-                        size,
-                        refresh: 60_000,
-                    }),
-                    None,
-                    None,
-                    None,
-                );
+                let mode = Mode {
+                    size,
+                    refresh: 60_000,
+                };
+                output.change_current_state(Some(mode), None, None, None);
+                fix_positions(&state.space);
             }
             WinitEvent::Input(event) => state.process_input_event(event),
             WinitEvent::Redraw => {