diff --git a/include/vkcv/Window.hpp b/include/vkcv/Window.hpp
index 7dc6c1b7dc8fef4d5de7de5b0a9976bf714e6ac2..d2b5854bce056bc50f8c08c55e6bcdd771bfc13b 100644
--- a/include/vkcv/Window.hpp
+++ b/include/vkcv/Window.hpp
@@ -74,6 +74,13 @@ namespace vkcv {
          */
 		static void onCharEvent(GLFWwindow *callbackWindow, unsigned int c);
 
+        /**
+         * @brief A callback function for handling gamepad re-connection.
+         * @param gamepadIndex The gamepad index.
+         * @param gamepadEvent The gamepad connection event.
+         */
+        static void onGamepadConnection(int gamepadIndex, int gamepadEvent);
+
         /**
          * @brief A callback function for gamepad input events.
          * @param gamepadIndex The gamepad index.
diff --git a/src/vkcv/Window.cpp b/src/vkcv/Window.cpp
index 03ac915aea5e89e2c5b0927cafe52e56454d49b5..fad9a2a658e97d9826b445108d14565f1135fbff 100644
--- a/src/vkcv/Window.cpp
+++ b/src/vkcv/Window.cpp
@@ -23,7 +23,7 @@ namespace vkcv {
 		glfwSetScrollCallback(m_window, Window::onMouseScrollEvent);
 		glfwSetCharCallback(m_window, Window::onCharEvent);
 	
-		glfwSetJoystickCallback(nullptr);
+		glfwSetJoystickCallback(Window::onGamepadConnection);
 		glfwSetJoystickUserPointer(GLFW_JOYSTICK_1, this);
     }
 
@@ -127,6 +127,16 @@ namespace vkcv {
 		}
     }
 
+    void Window::onGamepadConnection(int gamepadIndex, int gamepadEvent) {
+        if (gamepadEvent == GLFW_CONNECTED) {
+            auto window = static_cast<Window *>(glfwGetWindowUserPointer(s_Windows[0]));    // todo check for correct window
+
+            if (window != nullptr) {
+                glfwSetJoystickUserPointer(gamepadIndex, window);
+            }
+        }
+    }
+
     void Window::onGamepadEvent(int gamepadIndex) {
         auto window = static_cast<Window *>(glfwGetJoystickUserPointer(gamepadIndex));