diff --git a/Ryujinx.HLE/Input/HidHotkeyButtons.cs b/Ryujinx.HLE/Input/HidHotkeyButtons.cs
new file mode 100644
index 0000000000..7fa6ed6d0b
--- /dev/null
+++ b/Ryujinx.HLE/Input/HidHotkeyButtons.cs
@@ -0,0 +1,10 @@
+using System;
+
+namespace Ryujinx.HLE.Input
+{
+    [Flags]
+    public enum HidHotkeyButtons
+    {
+        ToggleVSync = 1 << 0,
+    }
+}
diff --git a/Ryujinx/Config.jsonc b/Ryujinx/Config.jsonc
index 151756f43c..376cf502af 100644
--- a/Ryujinx/Config.jsonc
+++ b/Ryujinx/Config.jsonc
@@ -84,6 +84,10 @@
             "button_plus": "Plus",
             "button_r": "U",
             "button_zr": "O"
+        },
+
+        "hotkeys": {
+            "toggle_vsync": "Tab"
         }
     },
 
diff --git a/Ryujinx/Ui/GLScreen.cs b/Ryujinx/Ui/GLScreen.cs
index c7aaea2391..d966123796 100644
--- a/Ryujinx/Ui/GLScreen.cs
+++ b/Ryujinx/Ui/GLScreen.cs
@@ -22,6 +22,8 @@ namespace Ryujinx
 
         private IGalRenderer _renderer;
 
+        private HidHotkeyButtons _prevHotkeyButtons = 0;
+
         private KeyboardState? _keyboard = null;
 
         private MouseState? _mouse = null;
@@ -128,6 +130,7 @@ namespace Ryujinx
 
         private new void UpdateFrame()
         {
+            HidHotkeyButtons     currentHotkeyButtons = 0;
             HidControllerButtons currentButton = 0;
             HidJoystickPosition  leftJoystick;
             HidJoystickPosition  rightJoystick;
@@ -142,10 +145,10 @@ namespace Ryujinx
             {
                 KeyboardState keyboard = _keyboard.Value;
 
-                currentButton = Configuration.Instance.KeyboardControls.GetButtons(keyboard);
-
-                (leftJoystickDx, leftJoystickDy) = Configuration.Instance.KeyboardControls.GetLeftStick(keyboard);
+                currentHotkeyButtons = Configuration.Instance.KeyboardControls.GetHotkeyButtons(keyboard);
+                currentButton        = Configuration.Instance.KeyboardControls.GetButtons(keyboard);
 
+                (leftJoystickDx, leftJoystickDy)   = Configuration.Instance.KeyboardControls.GetLeftStick(keyboard);
                 (rightJoystickDx, rightJoystickDy) = Configuration.Instance.KeyboardControls.GetRightStick(keyboard);
             }
             
@@ -238,6 +241,15 @@ namespace Ryujinx
             HidControllerBase controller = _device.Hid.PrimaryController;
 
             controller.SendInput(currentButton, leftJoystick, rightJoystick);
+
+            // Toggle vsync
+            if (currentHotkeyButtons.HasFlag(HidHotkeyButtons.ToggleVSync) &&
+                !_prevHotkeyButtons.HasFlag(HidHotkeyButtons.ToggleVSync))
+            {
+                _device.EnableDeviceVsync = !_device.EnableDeviceVsync;
+            }
+
+            _prevHotkeyButtons = currentHotkeyButtons;
         }
 
         private new void RenderFrame()
diff --git a/Ryujinx/Ui/NpadKeyboard.cs b/Ryujinx/Ui/NpadKeyboard.cs
index 1604da5bda..8d003c2c6d 100644
--- a/Ryujinx/Ui/NpadKeyboard.cs
+++ b/Ryujinx/Ui/NpadKeyboard.cs
@@ -35,6 +35,11 @@ namespace Ryujinx.UI.Input
         public Key ButtonZr;
     }
 
+    public struct KeyboardHotkeys
+    {
+        public Key ToggleVsync;
+    }
+
     public class NpadKeyboard
     {
         /// <summary>
@@ -47,6 +52,11 @@ namespace Ryujinx.UI.Input
         /// </summary>
         public NpadKeyboardRight RightJoycon { get; private set; }
 
+        /// <summary>
+        /// Hotkey Keyboard Bindings
+        /// </summary>
+        public KeyboardHotkeys Hotkeys { get; private set; }
+
         public HidControllerButtons GetButtons(KeyboardState keyboard)
         {
             HidControllerButtons buttons = 0;
@@ -97,5 +107,14 @@ namespace Ryujinx.UI.Input
 
             return (dx, dy);
         }
+
+        public HidHotkeyButtons GetHotkeyButtons(KeyboardState keyboard)
+        {
+            HidHotkeyButtons buttons = 0;
+
+            if (keyboard[(Key)Hotkeys.ToggleVsync]) buttons |= HidHotkeyButtons.ToggleVSync;
+
+            return buttons;
+        }
     }
 }
diff --git a/Ryujinx/_schema.json b/Ryujinx/_schema.json
index 11eff12b08..d06c8e91b1 100644
--- a/Ryujinx/_schema.json
+++ b/Ryujinx/_schema.json
@@ -636,9 +636,24 @@
               "default": "O"
             }
           }
+        },
+        "hotkeys": {
+          "$id": "#/properties/keyboard_controls/properties/hotkeys",
+          "type": "object",
+          "title": "Hotkey Controls",
+          "required": [
+            "toggle_vsync"
+          ],
+          "properties": {
+            "toggle_vsync": {
+              "$id": "#/properties/keyboard_controls/properties/hotkeys/properties/toggle_vsync",
+              "$ref": "#/definitions/key",
+              "title": "Toggle VSync",
+              "default": "Tab"
+            }
+          }
         }
-      }
-    },
+      },
     "gamepad_controls": {
       "$id": "#/properties/gamepad_controls",
       "type": "object",
@@ -843,4 +858,4 @@
       }
     }
   }
-}
\ No newline at end of file
+}