diff --git a/modules/services/window-managers/i3-sway/i3.nix b/modules/services/window-managers/i3-sway/i3.nix
index 6e779b4f1..5cba45bd0 100644
--- a/modules/services/window-managers/i3-sway/i3.nix
+++ b/modules/services/window-managers/i3-sway/i3.nix
@@ -179,7 +179,7 @@ let
       ${keybindingsStr { keybindings = keybindingDefaultWorkspace; }}
       ${keybindingsStr { keybindings = keybindingsRest; }}
       ${keycodebindingsStr keycodebindings}
-      ${concatStringsSep "\n" (mapAttrsToList modeStr modes)}
+      ${concatStringsSep "\n" (mapAttrsToList (modeStr false) modes)}
       ${concatStringsSep "\n" (mapAttrsToList assignStr assigns)}
       ${concatStringsSep "\n" (map barStr bars)}
       ${optionalString (gaps != null) gapsStr}
diff --git a/modules/services/window-managers/i3-sway/lib/functions.nix b/modules/services/window-managers/i3-sway/lib/functions.nix
index 1317f5dbb..3cb7eca59 100644
--- a/modules/services/window-managers/i3-sway/lib/functions.nix
+++ b/modules/services/window-managers/i3-sway/lib/functions.nix
@@ -37,9 +37,12 @@ rec {
     ];
   barColorSetStr = c: concatStringsSep " " [ c.border c.background c.text ];
 
-  modeStr = name: keybindings: ''
+  modeStr = bindkeysToCode: name: keybindings: ''
     mode "${name}" {
-    ${keybindingsStr { inherit keybindings; }}
+    ${keybindingsStr {
+      inherit keybindings;
+      bindsymArgs = lib.optionalString bindkeysToCode "--to-code";
+    }}
     }
   '';
 
diff --git a/modules/services/window-managers/i3-sway/sway.nix b/modules/services/window-managers/i3-sway/sway.nix
index 1dcd8662f..61b430b89 100644
--- a/modules/services/window-managers/i3-sway/sway.nix
+++ b/modules/services/window-managers/i3-sway/sway.nix
@@ -300,7 +300,7 @@ let
         mapAttrsToList inputStr input # inputs
         ++ mapAttrsToList outputStr output # outputs
         ++ mapAttrsToList seatStr seat # seats
-        ++ mapAttrsToList modeStr modes # modes
+        ++ mapAttrsToList (modeStr cfg.config.bindkeysToCode) modes # modes
         ++ mapAttrsToList assignStr assigns # assigns
         ++ map barStr bars # bars
         ++ optional (gaps != null) gapsStr # gaps
diff --git a/tests/modules/services/window-managers/sway/default.nix b/tests/modules/services/window-managers/sway/default.nix
index 16f7751cb..9ee479878 100644
--- a/tests/modules/services/window-managers/sway/default.nix
+++ b/tests/modules/services/window-managers/sway/default.nix
@@ -1,12 +1,13 @@
 {
   sway-bar-focused-colors = ./sway-bar-focused-colors.nix;
+  sway-bindkeys-to-code = ./sway-bindkeys-to-code.nix;
   sway-default = ./sway-default.nix;
-  sway-post-2003 = ./sway-post-2003.nix;
   sway-followmouse = ./sway-followmouse.nix;
   sway-followmouse-legacy = ./sway-followmouse-legacy.nix;
+  sway-modules = ./sway-modules.nix;
   sway-null-config = ./sway-null-config.nix;
   sway-null-package = ./sway-null-package.nix;
-  sway-modules = ./sway-modules.nix;
+  sway-post-2003 = ./sway-post-2003.nix;
   sway-workspace-default = ./sway-workspace-default.nix;
   sway-workspace-output = ./sway-workspace-output.nix;
 }
diff --git a/tests/modules/services/window-managers/sway/sway-bindkeys-to-code.conf b/tests/modules/services/window-managers/sway/sway-bindkeys-to-code.conf
new file mode 100644
index 000000000..609b0b025
--- /dev/null
+++ b/tests/modules/services/window-managers/sway/sway-bindkeys-to-code.conf
@@ -0,0 +1,114 @@
+font pango:monospace 8.000000
+floating_modifier Mod1
+default_border pixel 2
+default_floating_border pixel 2
+hide_edge_borders none
+focus_wrapping no
+focus_follows_mouse yes
+focus_on_window_activation smart
+mouse_warping output
+workspace_layout default
+workspace_auto_back_and_forth no
+
+client.focused #4c7899 #285577 #ffffff #2e9ef4 #285577
+client.focused_inactive #333333 #5f676a #ffffff #484e50 #5f676a
+client.unfocused #333333 #222222 #888888 #292d2e #222222
+client.urgent #2f343a #900000 #ffffff #900000 #900000
+client.placeholder #000000 #0c0c0c #ffffff #000000 #0c0c0c
+client.background #ffffff
+
+
+bindsym --to-code Mod1+1 workspace number 1
+bindsym --to-code Mod1+2 workspace number 2
+bindsym --to-code Mod1+3 workspace number 3
+bindsym --to-code Mod1+4 workspace number 4
+bindsym --to-code Mod1+5 workspace number 5
+bindsym --to-code Mod1+6 workspace number 6
+bindsym --to-code Mod1+7 workspace number 7
+bindsym --to-code Mod1+8 workspace number 8
+bindsym --to-code Mod1+9 workspace number 9
+bindsym --to-code Mod1+Down focus down
+bindsym --to-code Mod1+Left focus left
+bindsym --to-code Mod1+Return exec @rxvt-unicode-unwrapped@/bin/urxvt
+bindsym --to-code Mod1+Right focus right
+bindsym --to-code Mod1+Shift+1 move container to workspace number 1
+bindsym --to-code Mod1+Shift+2 move container to workspace number 2
+bindsym --to-code Mod1+Shift+3 move container to workspace number 3
+bindsym --to-code Mod1+Shift+4 move container to workspace number 4
+bindsym --to-code Mod1+Shift+5 move container to workspace number 5
+bindsym --to-code Mod1+Shift+6 move container to workspace number 6
+bindsym --to-code Mod1+Shift+7 move container to workspace number 7
+bindsym --to-code Mod1+Shift+8 move container to workspace number 8
+bindsym --to-code Mod1+Shift+9 move container to workspace number 9
+bindsym --to-code Mod1+Shift+Down move down
+bindsym --to-code Mod1+Shift+Left move left
+bindsym --to-code Mod1+Shift+Right move right
+bindsym --to-code Mod1+Shift+Up move up
+bindsym --to-code Mod1+Shift+c reload
+bindsym --to-code Mod1+Shift+e exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -b 'Yes, exit sway' 'swaymsg exit'
+bindsym --to-code Mod1+Shift+h move left
+bindsym --to-code Mod1+Shift+j move down
+bindsym --to-code Mod1+Shift+k move up
+bindsym --to-code Mod1+Shift+l move right
+bindsym --to-code Mod1+Shift+minus move scratchpad
+bindsym --to-code Mod1+Shift+q kill
+bindsym --to-code Mod1+Shift+space floating toggle
+bindsym --to-code Mod1+Up focus up
+bindsym --to-code Mod1+a focus parent
+bindsym --to-code Mod1+b splith
+bindsym --to-code Mod1+d exec @dmenu@/bin/dmenu_run
+bindsym --to-code Mod1+e layout toggle split
+bindsym --to-code Mod1+f fullscreen toggle
+bindsym --to-code Mod1+h focus left
+bindsym --to-code Mod1+j focus down
+bindsym --to-code Mod1+k focus up
+bindsym --to-code Mod1+l focus right
+bindsym --to-code Mod1+minus scratchpad show
+bindsym --to-code Mod1+r mode resize
+bindsym --to-code Mod1+s layout stacking
+bindsym --to-code Mod1+space focus mode_toggle
+bindsym --to-code Mod1+v splitv
+bindsym --to-code Mod1+w layout tabbed
+
+mode "resize" {
+bindsym --to-code Down resize grow height 10 px
+bindsym --to-code Escape mode default
+bindsym --to-code Left resize shrink width 10 px
+bindsym --to-code Return mode default
+bindsym --to-code Right resize grow width 10 px
+bindsym --to-code Up resize shrink height 10 px
+bindsym --to-code h resize shrink width 10 px
+bindsym --to-code j resize grow height 10 px
+bindsym --to-code k resize shrink height 10 px
+bindsym --to-code l resize grow width 10 px
+}
+
+bar {
+  
+  font pango:monospace 8.000000
+  mode dock
+  hidden_state hide
+  position bottom
+  status_command @i3status@/bin/i3status
+  swaybar_command @sway/bin/swaybar
+  workspace_buttons yes
+  strip_workspace_numbers no
+  tray_output primary
+  colors {
+    background #000000
+    statusline #ffffff
+    separator #666666
+    
+    
+    
+    focused_workspace #4c7899 #285577 #ffffff
+    active_workspace #333333 #5f676a #ffffff
+    inactive_workspace #333333 #222222 #888888
+    urgent_workspace #2f343a #900000 #ffffff
+    binding_mode #2f343a #900000 #ffffff
+  }
+  
+}
+
+
+exec "systemctl --user import-environment; systemctl --user start sway-session.target"
diff --git a/tests/modules/services/window-managers/sway/sway-bindkeys-to-code.nix b/tests/modules/services/window-managers/sway/sway-bindkeys-to-code.nix
new file mode 100644
index 000000000..bdcc4dc1b
--- /dev/null
+++ b/tests/modules/services/window-managers/sway/sway-bindkeys-to-code.nix
@@ -0,0 +1,27 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+
+  dummy-package = pkgs.runCommandLocal "dummy-package" { } "mkdir $out";
+
+in {
+  config = {
+    wayland.windowManager.sway = {
+      enable = true;
+      package = dummy-package // { outPath = "@sway"; };
+      # overriding findutils causes issues
+      config.menu = "${pkgs.dmenu}/bin/dmenu_run";
+      config.bindkeysToCode = true;
+    };
+
+    nixpkgs.overlays = [ (import ./sway-overlay.nix) ];
+
+    nmt.script = ''
+      assertFileExists home-files/.config/sway/config
+      assertFileContent home-files/.config/sway/config \
+        ${./sway-bindkeys-to-code.conf}
+    '';
+  };
+}