diff --git a/game/client/build.gradle.kts b/game/client/build.gradle.kts
index 1c6b481df..faee365fa 100644
--- a/game/client/build.gradle.kts
+++ b/game/client/build.gradle.kts
@@ -61,7 +61,6 @@ dependencies {
     implementation(platform(libs.lwjgl.bom))
 
     implementation("com.github.JnCrMx:discord-game-sdk4j:v0.5.5")?.let { include(it) }
-    implementation("com.github.electronstudio:sdl2gdx:1.0.5")?.let { include(it) }
 
     implementation("objects:client:43db9b498cb67058d2e12d394e6507722e71bb45") // Minecraft client jar
 }
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenControllerSetup.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenControllerSetup.java
index 17a684050..649630868 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenControllerSetup.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenControllerSetup.java
@@ -140,17 +140,20 @@ public class ScreenControllerSetup extends Screen {
             if (mc.controllerInput == null) {
                 index = -1;
             } else {
-                index = InputHandler.controllers.indexOf(mc.controllerInput);
-            }
-            index++;
-            if (index >= InputHandler.controllers.size()) {
-                index = -1;
+                index = Arrays.asList(InputHandler.controllers).indexOf(mc.controllerInput);
             }
+            do {
+                index++;
+                if (index >= InputHandler.controllers.length) {
+                    index = -1;
+                    break;
+                }
+            } while (InputHandler.controllers[index] == null);
             if (index == -1) {
                 mc.controllerInput = null;
                 mc.setInputType(InputType.KEYBOARD);
             } else {
-                mc.controllerInput = InputHandler.controllers.get(index);
+                mc.controllerInput = InputHandler.controllers[index];
                 mc.setInputType(InputType.CONTROLLER);
             }
             updateDisplay();
diff --git a/game/client/src/main/java/net/minecraft/client/input/InputHandler.java b/game/client/src/main/java/net/minecraft/client/input/InputHandler.java
index fe1e9d415..bc3ce90e0 100644
--- a/game/client/src/main/java/net/minecraft/client/input/InputHandler.java
+++ b/game/client/src/main/java/net/minecraft/client/input/InputHandler.java
@@ -3,10 +3,6 @@ package net.minecraft.client.input;
 import com.mojang.logging.LogUtils;
 import net.minecraft.client.input.glfw.GlfwGamepad;
 import net.minecraft.client.input.glfw.GlfwJoystick;
-import net.minecraft.client.input.sdl.SDLGamepad;
-import org.libsdl.SDL;
-import org.libsdl.SDL_GameController;
-import org.libsdl.SDL_Joystick;
 import org.lwjgl.glfw.GLFW;
 
 import net.minecraft.client.Minecraft;
@@ -14,25 +10,19 @@ import net.minecraft.client.input.controller.ControllerInput;
 import org.slf4j.Logger;
 
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 
 public abstract class InputHandler {
 	private static final Logger LOGGER = LogUtils.getLogger();
 	private static Minecraft minecraft;
-	public static List<ControllerInput> controllers = new ArrayList<>();
+	public static ControllerInput[] controllers = new ControllerInput[GLFW.GLFW_JOYSTICK_LAST + 1];
 
-	private static boolean sdl2Initialized = false;
-	
 	public static void init(Minecraft minecraft) throws Exception{
 		InputHandler.minecraft = minecraft;
 
 		try {
-			initSDL2(minecraft);
+			initGLFW(minecraft);
 		} catch (Throwable e) {
-			LOGGER.error("Could not initialize SDL2.");
+			LOGGER.error("Could not initialize GLFW controllers.");
 			e.printStackTrace();
 		}
 	}
@@ -42,51 +32,28 @@ public abstract class InputHandler {
 			return;
 		}
 
-		if (sdl2Initialized) {
-			SDL.SDL_GameControllerUpdate();
-			try {
-				// Check for any joysticks that are no longer attached
-				for (int i = 0; i < controllers.size(); i++) {
-					ControllerInput input = controllers.get(i);
-					if (!input.getController().isPresent()) {
-						disconnected(controllers.remove(i));
-						i--;
+		for (int i = GLFW.GLFW_JOYSTICK_1; i < GLFW.GLFW_JOYSTICK_LAST; i++) {
+			if (controllers[i] != null) {
+				if (!controllers[i].getController().isPresent()) {
+					disconnected(controllers[i]);
+					controllers[i] = null;
+				} else {
+					controllers[i].getController().poll();
+					if (controllers[i].hasAnyInput()) {
+						minecraft.controllerInput = controllers[i];
+						minecraft.setInputType(InputType.CONTROLLER);
 					}
 				}
-
-				// Check for any new joysticks
-				final int joysticks = SDL.SDL_NumJoysticks();
-				for (int i = 0; i < joysticks; i++) {
-					// Check if not gamepad, and if so, skip
-					if (!SDL.SDL_IsGameController(i)) {
-						continue;
-					}
-					final int instanceId = SDL.SDL_JoystickGetDeviceInstanceID(i);
-					// If controllers does not contain instance ID, add it
-					boolean containsId = false;
-					for (ControllerInput input : controllers) {
-						if (input.getController().getInstanceId() == instanceId) {
-							containsId = true;
-							break;
-						}
-					}
-					if (!containsId) {
-						ControllerInput ci = new ControllerInput(minecraft, new SDLGamepad(i));
-						controllers.add(ci);
-						connected(ci);
+			} else {
+				if (GLFW.glfwJoystickPresent(i)) {
+					GlfwGamepad gamepad = new GlfwJoystick(i).intoGamepad();
+					if (gamepad != null) {
+						ControllerInput input = new ControllerInput(minecraft, gamepad);
+						controllers[i] = input;
+						connected(input);
 					}
 				}
-
-				for (ControllerInput ci : controllers) {
-					if (ci.hasAnyInput()) {
-						minecraft.controllerInput = ci;
-						minecraft.setInputType(InputType.CONTROLLER);
-					}
-				}
-			} catch (Exception ignored) {
-				ignored.printStackTrace();
 			}
-
 		}
 	}
 
@@ -103,16 +70,25 @@ public abstract class InputHandler {
 		}
 	}
 
-	public static void initSDL2(Minecraft minecraft) throws Throwable {
-		SDL.SDL_SetHint("SDL_JOYSTICK_RAWINPUT", "0");
-		final int result = SDL.SDL_Init(SDL.SDL_INIT_JOYSTICK | SDL.SDL_INIT_GAMECONTROLLER);
-		if (result < 0) {
-			throw new IOException("Could not initialize SDL2!");
+	public static void initGLFW(Minecraft minecraft) throws Throwable {
+		int found = 0;
+		for (int i = GLFW.GLFW_JOYSTICK_1; i < GLFW.GLFW_JOYSTICK_LAST; i++) {
+			if (GLFW.glfwJoystickPresent(i)) {
+				GlfwGamepad gamepad = new GlfwJoystick(i).intoGamepad();
+				if (gamepad != null) {
+					ControllerInput input = new ControllerInput(minecraft, gamepad);
+					controllers[i] = input;
+					found++;
+				}
+			}
 		}
-
-		sdl2Initialized = true;
-
-		poll();
+//		int[] vids = { 0x0079, 0x0079, 0x054c, 0x0079, 0x03F0, 0x057e, 0x28de, 0x28de };
+//		int[] pids = { 0x181a, 0x181b, 0x0ce6, 0x18d4, 0x0495, 0x2008, 0x1101, 0x11ff };
+//		String[] names = { "Fake PS3", "Fake PS4", "Fake PS5", "Fake X360", "Fake XONE", "Fake Switch", "Fake Steam", "Fake Steam Deck" };
+//		for (int i = 0; i < vids.length; i++) {
+//			controllers[GLFW.GLFW_JOYSTICK_1 + i] = new ControllerInput(minecraft, new FakeGamepad(GLFW.GLFW_JOYSTICK_1 + i, names[i], vids[i], pids[i]));
+//		}
+		LOGGER.info("{} controllers found!", found);
 	}
 
 	public static ControllerInput getController(String guid) {
diff --git a/game/client/src/main/java/net/minecraft/client/input/controller/ControllerInput.java b/game/client/src/main/java/net/minecraft/client/input/controller/ControllerInput.java
index 49af4af60..87ca7b7f4 100644
--- a/game/client/src/main/java/net/minecraft/client/input/controller/ControllerInput.java
+++ b/game/client/src/main/java/net/minecraft/client/input/controller/ControllerInput.java
@@ -4,17 +4,15 @@ import com.b100.utils.ReflectUtils;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.container.ScreenContainerAbstract;
 import net.minecraft.client.input.glfw.GlfwGamepad;
-import net.minecraft.client.input.sdl.SDLGamepad;
 import net.minecraft.core.player.inventory.slot.Slot;
 import net.minecraft.core.util.helper.Time;
-import org.libsdl.SDL;
 import org.lwjgl.glfw.GLFW;
 
 public class ControllerInput {
 
     public final Minecraft minecraft;
 
-    private final SDLGamepad controller;
+    private final GlfwGamepad controller;
 
     public Joystick joyLeft;
     public Joystick joyRight;
@@ -47,7 +45,7 @@ public class ControllerInput {
 
     private boolean disconnected = false;
 
-    public ControllerInput(Minecraft minecraft, SDLGamepad controller) {
+    public ControllerInput(Minecraft minecraft, GlfwGamepad controller) {
         this.minecraft = minecraft;
         this.controller = controller;
 
@@ -57,7 +55,7 @@ public class ControllerInput {
     }
 
     public String getGUID() {
-        return controller.getName();
+        return controller.getGuid();
     }
 
     public ControllerType getType() {
@@ -68,47 +66,47 @@ public class ControllerInput {
         IButtonListener defaultButtonListener = controller::isButtonPressed;
         IJoystickListener defaultJoystickListener = controller::getAxisValue;
 
-        joyLeft = new Joystick(translateAxis(type, SDL.SDL_CONTROLLER_AXIS_LEFTX), SDL.SDL_CONTROLLER_AXIS_LEFTX, SDL.SDL_CONTROLLER_AXIS_LEFTY, defaultJoystickListener, new Button(translateBtn(type, SDL.SDL_CONTROLLER_BUTTON_LEFTSTICK), SDL.SDL_CONTROLLER_BUTTON_LEFTSTICK, defaultButtonListener), minecraft.gameSettings.controllerDeadzoneLeft);
-        joyRight = new Joystick(translateAxis(type, SDL.SDL_CONTROLLER_AXIS_RIGHTX), SDL.SDL_CONTROLLER_AXIS_RIGHTX, SDL.SDL_CONTROLLER_AXIS_RIGHTY, defaultJoystickListener, new Button(translateBtn(type, SDL.SDL_CONTROLLER_BUTTON_RIGHTSTICK), SDL.SDL_CONTROLLER_BUTTON_RIGHTSTICK, defaultButtonListener), minecraft.gameSettings.controllerDeadzoneRight);
+        joyLeft = new Joystick(translateAxis(type, GLFW.GLFW_GAMEPAD_AXIS_LEFT_X), GLFW.GLFW_GAMEPAD_AXIS_LEFT_X, GLFW.GLFW_GAMEPAD_AXIS_LEFT_Y, defaultJoystickListener, new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_LEFT_THUMB), GLFW.GLFW_GAMEPAD_BUTTON_LEFT_THUMB, defaultButtonListener), minecraft.gameSettings.controllerDeadzoneLeft);
+        joyRight = new Joystick(translateAxis(type, GLFW.GLFW_GAMEPAD_AXIS_RIGHT_X), GLFW.GLFW_GAMEPAD_AXIS_RIGHT_X, GLFW.GLFW_GAMEPAD_AXIS_RIGHT_Y, defaultJoystickListener, new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_THUMB), GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_THUMB, defaultButtonListener), minecraft.gameSettings.controllerDeadzoneRight);
 
-        buttonBack = new Button(translateBtn(type, SDL.SDL_CONTROLLER_BUTTON_BACK), SDL.SDL_CONTROLLER_BUTTON_BACK, defaultButtonListener);
-        buttonStart = new Button(translateBtn(type, SDL.SDL_CONTROLLER_BUTTON_START), SDL.SDL_CONTROLLER_BUTTON_START, defaultButtonListener);
+        buttonBack = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_BACK), GLFW.GLFW_GAMEPAD_BUTTON_BACK, defaultButtonListener);
+        buttonStart = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_START), GLFW.GLFW_GAMEPAD_BUTTON_START, defaultButtonListener);
 
         if (minecraft.gameSettings.controllerSwapAB.value) {
-            buttonA = new Button(translateBtn(type, SDL.SDL_CONTROLLER_BUTTON_A), SDL.SDL_CONTROLLER_BUTTON_B, defaultButtonListener);
-            buttonB = new Button(translateBtn(type, SDL.SDL_CONTROLLER_BUTTON_B), SDL.SDL_CONTROLLER_BUTTON_A, defaultButtonListener);
+            buttonA = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_A), GLFW.GLFW_GAMEPAD_BUTTON_B, defaultButtonListener);
+            buttonB = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_B), GLFW.GLFW_GAMEPAD_BUTTON_A, defaultButtonListener);
         } else {
-            buttonA = new Button(translateBtn(type, SDL.SDL_CONTROLLER_BUTTON_A), SDL.SDL_CONTROLLER_BUTTON_A, defaultButtonListener);
-            buttonB = new Button(translateBtn(type, SDL.SDL_CONTROLLER_BUTTON_B), SDL.SDL_CONTROLLER_BUTTON_B, defaultButtonListener);
+            buttonA = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_A), GLFW.GLFW_GAMEPAD_BUTTON_A, defaultButtonListener);
+            buttonB = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_B), GLFW.GLFW_GAMEPAD_BUTTON_B, defaultButtonListener);
         }
 
         if (minecraft.gameSettings.controllerSwapXY.value) {
-            buttonX = new Button(translateBtn(type, SDL.SDL_CONTROLLER_BUTTON_X), SDL.SDL_CONTROLLER_BUTTON_Y, defaultButtonListener);
-            buttonY = new Button(translateBtn(type, SDL.SDL_CONTROLLER_BUTTON_Y), SDL.SDL_CONTROLLER_BUTTON_X, defaultButtonListener);
+            buttonX = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_X), GLFW.GLFW_GAMEPAD_BUTTON_Y, defaultButtonListener);
+            buttonY = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_Y), GLFW.GLFW_GAMEPAD_BUTTON_X, defaultButtonListener);
         } else {
-            buttonX = new Button(translateBtn(type, SDL.SDL_CONTROLLER_BUTTON_X), SDL.SDL_CONTROLLER_BUTTON_X, defaultButtonListener);
-            buttonY = new Button(translateBtn(type, SDL.SDL_CONTROLLER_BUTTON_Y), SDL.SDL_CONTROLLER_BUTTON_Y, defaultButtonListener);
+            buttonX = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_X), GLFW.GLFW_GAMEPAD_BUTTON_X, defaultButtonListener);
+            buttonY = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_Y), GLFW.GLFW_GAMEPAD_BUTTON_Y, defaultButtonListener);
         }
 
         if (minecraft.gameSettings.controllerSwapShoulderButtons.value) {
-            buttonLeftShoulder = new Button(translateBtn(type, SDL.SDL_CONTROLLER_BUTTON_LEFTSHOULDER), SDL.SDL_CONTROLLER_BUTTON_RIGHTSHOULDER, defaultButtonListener);
-            buttonRightShoulder = new Button(translateBtn(type, SDL.SDL_CONTROLLER_BUTTON_RIGHTSHOULDER), SDL.SDL_CONTROLLER_BUTTON_LEFTSHOULDER, defaultButtonListener);
+            buttonLeftShoulder = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_LEFT_BUMPER), GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER, defaultButtonListener);
+            buttonRightShoulder = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER), GLFW.GLFW_GAMEPAD_BUTTON_LEFT_BUMPER, defaultButtonListener);
 
-            buttonLeftTrigger = new Button(translateAxis(type, SDL.SDL_CONTROLLER_AXIS_TRIGGERLEFT), SDL.SDL_CONTROLLER_AXIS_TRIGGERRIGHT, (axis) -> this.controller.getAxisValue(axis) > 0.5f);
-            buttonRightTrigger = new Button(translateAxis(type, SDL.SDL_CONTROLLER_AXIS_TRIGGERRIGHT), SDL.SDL_CONTROLLER_AXIS_TRIGGERLEFT, (axis) -> this.controller.getAxisValue(axis) > 0.5f);
+            buttonLeftTrigger = new Button(translateAxis(type, GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER), GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER, (axis) -> this.controller.getAxisValue(axis) > 0.5f);
+            buttonRightTrigger = new Button(translateAxis(type, GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER), GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER, (axis) -> this.controller.getAxisValue(axis) > 0.5f);
         } else {
-            buttonLeftShoulder = new Button(translateBtn(type, SDL.SDL_CONTROLLER_BUTTON_LEFTSHOULDER), SDL.SDL_CONTROLLER_BUTTON_LEFTSHOULDER, defaultButtonListener);
-            buttonRightShoulder = new Button(translateBtn(type, SDL.SDL_CONTROLLER_BUTTON_RIGHTSHOULDER), SDL.SDL_CONTROLLER_BUTTON_RIGHTSHOULDER, defaultButtonListener);
+            buttonLeftShoulder = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_LEFT_BUMPER), GLFW.GLFW_GAMEPAD_BUTTON_LEFT_BUMPER, defaultButtonListener);
+            buttonRightShoulder = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER), GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER, defaultButtonListener);
 
-            buttonLeftTrigger = new Button(translateAxis(type, SDL.SDL_CONTROLLER_AXIS_TRIGGERLEFT), SDL.SDL_CONTROLLER_AXIS_TRIGGERLEFT, (axis) -> this.controller.getAxisValue(axis) > 0.5f);
-            buttonRightTrigger = new Button(translateAxis(type, SDL.SDL_CONTROLLER_AXIS_TRIGGERRIGHT), SDL.SDL_CONTROLLER_AXIS_TRIGGERRIGHT, (axis) -> this.controller.getAxisValue(axis) > 0.5f);
+            buttonLeftTrigger = new Button(translateAxis(type, GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER), GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER, (axis) -> this.controller.getAxisValue(axis) > 0.5f);
+            buttonRightTrigger = new Button(translateAxis(type, GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER), GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER, (axis) -> this.controller.getAxisValue(axis) > 0.5f);
         }
 
         digitalPad = new DigitalPad(
-            new Button("Digital Up", SDL.SDL_CONTROLLER_BUTTON_DPAD_UP, defaultButtonListener),
-            new Button("Digital Left", SDL.SDL_CONTROLLER_BUTTON_DPAD_LEFT, defaultButtonListener),
-            new Button("Digital Down", SDL.SDL_CONTROLLER_BUTTON_DPAD_DOWN, defaultButtonListener),
-            new Button("Digital Right", SDL.SDL_CONTROLLER_BUTTON_DPAD_RIGHT, defaultButtonListener)
+            new Button("Digital Up", GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP, defaultButtonListener),
+            new Button("Digital Left", GLFW.GLFW_GAMEPAD_BUTTON_DPAD_LEFT, defaultButtonListener),
+            new Button("Digital Down", GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN, defaultButtonListener),
+            new Button("Digital Right", GLFW.GLFW_GAMEPAD_BUTTON_DPAD_RIGHT, defaultButtonListener)
         );
 
         buttons = ReflectUtils.getAllObjects(ControllerInput.class, Button.class, this);
@@ -132,7 +130,7 @@ public class ControllerInput {
         return controller.hasAnyInput();
     }
 
-    public SDLGamepad getController() {
+    public GlfwGamepad getController() {
         return controller;
     }
 
@@ -193,13 +191,13 @@ public class ControllerInput {
 
     private String translateAxis(ControllerType controllerType, int axis) {
         switch (axis) {
-            case SDL.SDL_CONTROLLER_AXIS_LEFTX:
-            case SDL.SDL_CONTROLLER_AXIS_LEFTY:
+            case GLFW.GLFW_GAMEPAD_AXIS_LEFT_X:
+            case GLFW.GLFW_GAMEPAD_AXIS_LEFT_Y:
                 return "Analog Left";
-            case SDL.SDL_CONTROLLER_AXIS_RIGHTX:
-            case SDL.SDL_CONTROLLER_AXIS_RIGHTY:
+            case GLFW.GLFW_GAMEPAD_AXIS_RIGHT_X:
+            case GLFW.GLFW_GAMEPAD_AXIS_RIGHT_Y:
                 return "Analog Right";
-            case SDL.SDL_CONTROLLER_AXIS_TRIGGERLEFT:
+            case GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER:
                 switch (controllerType) {
                     case PS3:
                     case PS4:
@@ -210,7 +208,7 @@ public class ControllerInput {
                     default:
                         return "LT";
                 }
-            case SDL.SDL_CONTROLLER_AXIS_TRIGGERRIGHT:
+            case GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER:
                 switch (controllerType) {
                     case PS3:
                     case PS4:
@@ -228,7 +226,7 @@ public class ControllerInput {
 
     private String translateBtn(ControllerType controllerType, int button) {
         switch (button) {
-            case SDL.SDL_CONTROLLER_BUTTON_A:
+            case GLFW.GLFW_GAMEPAD_BUTTON_A:
                 switch (controllerType) {
                     case PS3:
                     case PS4:
@@ -239,7 +237,7 @@ public class ControllerInput {
                     default:
                         return "A";
                 }
-            case SDL.SDL_CONTROLLER_BUTTON_B:
+            case GLFW.GLFW_GAMEPAD_BUTTON_B:
                 switch (controllerType) {
                     case PS3:
                     case PS4:
@@ -250,7 +248,7 @@ public class ControllerInput {
                     default:
                         return "B";
                 }
-            case SDL.SDL_CONTROLLER_BUTTON_X:
+            case GLFW.GLFW_GAMEPAD_BUTTON_X:
                 switch (controllerType) {
                     case PS3:
                     case PS4:
@@ -261,7 +259,7 @@ public class ControllerInput {
                     default:
                         return "X";
                 }
-            case SDL.SDL_CONTROLLER_BUTTON_Y:
+            case GLFW.GLFW_GAMEPAD_BUTTON_Y:
                 switch (controllerType) {
                     case PS3:
                     case PS4:
@@ -272,7 +270,7 @@ public class ControllerInput {
                     default:
                         return "Y";
                 }
-            case SDL.SDL_CONTROLLER_BUTTON_BACK:
+            case GLFW.GLFW_GAMEPAD_BUTTON_BACK:
                 switch (controllerType) {
                     case XBOX_ONE:
                         return "View";
@@ -286,7 +284,7 @@ public class ControllerInput {
                     default:
                         return "Back";
                 }
-            case SDL.SDL_CONTROLLER_BUTTON_START:
+            case GLFW.GLFW_GAMEPAD_BUTTON_START:
                 switch (controllerType) {
                     case XBOX_ONE:
                         return "Menu";
@@ -298,7 +296,7 @@ public class ControllerInput {
                     default:
                         return "Start";
                 }
-            case SDL.SDL_CONTROLLER_BUTTON_LEFTSHOULDER:
+            case GLFW.GLFW_GAMEPAD_BUTTON_LEFT_BUMPER:
                 switch (controllerType) {
                     case PS3:
                     case PS4:
@@ -309,7 +307,7 @@ public class ControllerInput {
                     default:
                         return "LB";
                 }
-            case SDL.SDL_CONTROLLER_BUTTON_RIGHTSHOULDER:
+            case GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER:
                 switch (controllerType) {
                     case PS3:
                     case PS4:
@@ -320,17 +318,17 @@ public class ControllerInput {
                     default:
                         return "RB";
                 }
-            case SDL.SDL_CONTROLLER_BUTTON_LEFTSTICK:
+            case GLFW.GLFW_GAMEPAD_BUTTON_LEFT_THUMB:
                 return "Left Stick";
-            case SDL.SDL_CONTROLLER_BUTTON_RIGHTSTICK:
+            case GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_THUMB:
                 return "Right Stick";
-            case SDL.SDL_CONTROLLER_BUTTON_DPAD_UP:
+            case GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP:
                 return "Digital Up";
-            case SDL.SDL_CONTROLLER_BUTTON_DPAD_DOWN:
+            case GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN:
                 return "Digital Down";
-            case SDL.SDL_CONTROLLER_BUTTON_DPAD_LEFT:
+            case GLFW.GLFW_GAMEPAD_BUTTON_DPAD_LEFT:
                 return "Digital Left";
-            case SDL.SDL_CONTROLLER_BUTTON_DPAD_RIGHT:
+            case GLFW.GLFW_GAMEPAD_BUTTON_DPAD_RIGHT:
                 return "Digital Right";
             default:
                 return "Button " + button;
diff --git a/game/client/src/main/java/net/minecraft/client/input/controller/ControllerType.java b/game/client/src/main/java/net/minecraft/client/input/controller/ControllerType.java
index d4082a0c5..c48de8b83 100644
--- a/game/client/src/main/java/net/minecraft/client/input/controller/ControllerType.java
+++ b/game/client/src/main/java/net/minecraft/client/input/controller/ControllerType.java
@@ -1,11 +1,12 @@
 package net.minecraft.client.input.controller;
 
-import net.minecraft.client.input.sdl.SDLGamepad;
+import net.minecraft.client.input.glfw.GlfwGamepad;
 
 public enum ControllerType {
     UNKNOWN(Layout.XBOX, "xbox_360", "UNKNOWN"),
     XBOX_360(Layout.XBOX, "xbox_360", "XBOX 360"),
     XBOX_ONE(Layout.XBOX, "xbox_one", "XBOX ONE"),
+    XINPUT(Layout.XBOX, "xbox_one", "XINPUT"),
     PS3(Layout.PLAYSTATION, "ps3", "PLAYSTATION 3"),
     PS4(Layout.PLAYSTATION, "ps4", "PLAYSTATION 4"),
     PS5(Layout.PLAYSTATION, "ps5", "PLAYSTATION 5"),
@@ -23,7 +24,7 @@ public enum ControllerType {
         this.printableName = printableName;
     }
 
-    public static ControllerType fromController(SDLGamepad controller) {
+    public static ControllerType fromController(GlfwGamepad controller) {
         int vid = controller.getVendorId();
         int pid = controller.getDeviceId();
         return ControllerTypeDatabase.getControllerType(vid, pid);
diff --git a/game/client/src/main/java/net/minecraft/client/input/controller/ControllerTypeDatabase.java b/game/client/src/main/java/net/minecraft/client/input/controller/ControllerTypeDatabase.java
index d9702e1c1..bb94d9005 100644
--- a/game/client/src/main/java/net/minecraft/client/input/controller/ControllerTypeDatabase.java
+++ b/game/client/src/main/java/net/minecraft/client/input/controller/ControllerTypeDatabase.java
@@ -65,6 +65,8 @@ public abstract class ControllerTypeDatabase {
                 return ControllerType.XBOX_360;
             case "XBoxOneController":
                 return ControllerType.XBOX_ONE;
+            case "XInputController":
+                return ControllerType.XINPUT;
             case "SwitchController":
                 return ControllerType.SWITCH;
             case "SteamController":
diff --git a/game/client/src/main/java/net/minecraft/client/input/glfw/GlfwGamepad.java b/game/client/src/main/java/net/minecraft/client/input/glfw/GlfwGamepad.java
index 8bc096f35..5cc120b09 100644
--- a/game/client/src/main/java/net/minecraft/client/input/glfw/GlfwGamepad.java
+++ b/game/client/src/main/java/net/minecraft/client/input/glfw/GlfwGamepad.java
@@ -19,8 +19,27 @@ public class GlfwGamepad extends GlfwJoystick {
         GLFW.glfwGetGamepadState(this.getId(), this.state);
     }
 
+    @Override
+    public boolean hasAnyInput() {
+        for (int i = 0; i <= GLFW.GLFW_GAMEPAD_BUTTON_LAST; i++) {
+            if (isButtonPressed(i)) {
+                return true;
+            }
+        }
+        for (int i = 0; i <= GLFW.GLFW_GAMEPAD_AXIS_RIGHT_Y; i++) {
+            if (Math.abs(getAxisValue(i)) > 0.5f) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
     @Override
     public String getName() {
+        if (this.getVendorId() == 0x7475) {
+            return GLFW.glfwGetJoystickName(this.getId()) + " " + this.getId();
+        }
         return GLFW.glfwGetGamepadName(this.getId());
     }
 
diff --git a/game/client/src/main/java/net/minecraft/client/input/glfw/GlfwJoystick.java b/game/client/src/main/java/net/minecraft/client/input/glfw/GlfwJoystick.java
index fd414f93e..c8353c1ee 100644
--- a/game/client/src/main/java/net/minecraft/client/input/glfw/GlfwJoystick.java
+++ b/game/client/src/main/java/net/minecraft/client/input/glfw/GlfwJoystick.java
@@ -69,6 +69,21 @@ public class GlfwJoystick {
         this.hats = GLFW.glfwGetJoystickHats(this.id);
     }
 
+    public boolean hasAnyInput() {
+        for (int i = 0; i <= buttons.capacity(); i++) {
+            if (buttons.get(i) == GLFW.GLFW_PRESS) {
+                return true;
+            }
+        }
+        for (int i = 0; i < axes.capacity(); i++) {
+            if (Math.abs(axes.get(i)) > 0.5f) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
     public boolean isPresent() {
         return GLFW.glfwJoystickPresent(this.id);
     }
diff --git a/game/client/src/main/java/net/minecraft/client/input/sdl/SDLGamepad.java b/game/client/src/main/java/net/minecraft/client/input/sdl/SDLGamepad.java
deleted file mode 100644
index 05a68b310..000000000
--- a/game/client/src/main/java/net/minecraft/client/input/sdl/SDLGamepad.java
+++ /dev/null
@@ -1,129 +0,0 @@
-package net.minecraft.client.input.sdl;
-
-import net.minecraft.client.input.controller.Button;
-import net.minecraft.client.input.controller.Joystick;
-import org.jetbrains.annotations.NotNull;
-import org.libsdl.*;
-
-import java.io.IOException;
-
-public class SDLGamepad {
-    private static final float AXIS_MIN = SDL.SDL_JOYSTICK_AXIS_MIN();
-    private static final float AXIS_MAX = SDL.SDL_JOYSTICK_AXIS_MAX();
-
-    private final int instanceId;
-    private final long joystickPtr;
-    private final long gameControllerPtr;
-    private final int vid;
-    private final int did;
-
-    public SDLGamepad(final int index) throws Exception {
-        this.joystickPtr = SDL.SDL_JoystickOpen(index);
-        if (this.joystickPtr == 0) {
-            throw new IOException(SDL.SDL_GetError());
-        }
-        this.gameControllerPtr = SDL.SDL_GameControllerOpen(index);
-        if (this.gameControllerPtr == 0) {
-            throw new IOException(SDL.SDL_GetError());
-        }
-
-        this.instanceId = SDL.SDL_JoystickInstanceID(this.joystickPtr);
-
-        // Determine VID and DID
-        String guid = this.getGuid();
-
-        int vid;
-        try {
-            String lower = guid.substring(8, 10);
-            String upper = guid.substring(10, 12);
-            vid = Integer.parseInt(upper + lower, 16);
-        } catch (Exception e) {
-            System.out.println("Controller " + index + " has weird GUID!");
-            this.vid = 0;
-            this.did = 0;
-            return;
-        }
-
-        int did;
-        try {
-            String lower = guid.substring(16, 18);
-            String upper = guid.substring(18, 20);
-            did = Integer.parseInt(upper + lower, 16);
-        } catch (Exception e) {
-            System.out.println("Controller " + index + " has weird GUID!");
-            this.vid = 0;
-            this.did = 0;
-            return;
-        }
-
-        this.vid = vid;
-        this.did = did;
-    }
-
-    @Override
-    protected void finalize() throws Throwable {
-        super.finalize();
-        SDL.SDL_GameControllerClose(this.gameControllerPtr);
-        SDL.SDL_JoystickClose(this.joystickPtr);
-    }
-
-    public int getInstanceId() {
-        return this.instanceId;
-    }
-
-    public @NotNull String getGuid() {
-        return SDL.SDL_JoystickGUIDString(this.joystickPtr);
-    }
-
-    public int getVendorId() {
-        return this.vid;
-    }
-
-    public int getDeviceId() {
-        return this.did;
-    }
-
-    public boolean isPresent() {
-        return SDL.SDL_GameControllerGetAttached(this.gameControllerPtr);
-    }
-
-    public @NotNull String getName() {
-        return SDL.SDL_GameControllerName(gameControllerPtr);
-    }
-
-    public boolean hasAnyInput() {
-        for (int i = 0; i < SDL.SDL_CONTROLLER_BUTTON_MAX; i++) {
-            if (isButtonPressed(i)) {
-                return true;
-            }
-        }
-        for (int i = 0; i < SDL.SDL_CONTROLLER_AXIS_MAX; i++) {
-            if (Math.abs(getAxisValue(i)) > 0.5f) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    public float getAxisValue(final int axis) {
-        if (isPresent()) {
-            final int result = SDL.SDL_GameControllerGetAxis(this.gameControllerPtr, axis);
-            if (result < 0) {
-                return (float) result / -AXIS_MIN;
-            } else {
-                return (float) result / AXIS_MAX;
-            }
-        }
-
-        return 0.0f;
-    }
-
-    public boolean isButtonPressed(final int button) {
-        if (isPresent()) {
-            return SDL.SDL_GameControllerGetButton(this.gameControllerPtr, button) == 1;
-        }
-
-        return false;
-    }
-}
diff --git a/game/client/src/main/resources/controllers.csv b/game/client/src/main/resources/controllers.csv
index 98364fd61..b97fe3d6b 100644
--- a/game/client/src/main/resources/controllers.csv
+++ b/game/client/src/main/resources/controllers.csv
@@ -530,3 +530,4 @@
 0x28de,0x1201,SteamController,
 0x28de,0x1202,SteamController,
 0x28de,0x1205,SteamDeckController,
+0x7475,0x0000,XInputController,
