diff --git a/demo/main.cpp b/demo/main.cpp
index 70aa8b24a6f692214a6159fb315c15a19e98efc1..ab6c4d9bc9aa65201199d22544668192cab9cf3e 100644
--- a/demo/main.cpp
+++ b/demo/main.cpp
@@ -292,7 +292,7 @@ int main(int argc, char* argv[]) {
 		auto& gamepads = inputs->gamepads;
 		ImGui::Begin("GamePad", &gamepadWindow);
 		for ( int i=0; i<16; i++ ) {
-			std::string title = "GamePad " + std::to_string(i);
+			std::string title = gamepads.name(i);
 
 			bool present = gamepads.present(i);
 			if ( ImGui::TreeNode(title.c_str()) ) {
diff --git a/fggl/gfx/window.cpp b/fggl/gfx/window.cpp
index 898a3b14ee79a1cc0a72af34ec78e479d5a31a5a..f16bc0521e81840893430e53b3f6dd26f1dd6970 100644
--- a/fggl/gfx/window.cpp
+++ b/fggl/gfx/window.cpp
@@ -49,12 +49,13 @@ static void fggl_input_keyboard(GLFWwindow* window, int key, int scancode, int a
 }
 
 static void fggl_update_joystick(fggl::input::GamepadInput& input, int jid) {
-	//glfwGetJoystickName(jid);
 	bool isGamepad = glfwJoystickIsGamepad(jid);
 
 	if ( isGamepad ) {
 		if( !input.present(jid) ) {
+			std::string name = glfwGetJoystickName(jid);
 			input.setActive(jid, true);
+			input.name(jid, name);
 		}
 
 		GLFWgamepadstate state;
diff --git a/fggl/input/gamepad.hpp b/fggl/input/gamepad.hpp
index 069e249fe81ad7c92f57fd53bc4a3fa40d16df28..96a3ada372a638d23423778c43d9f0cf867e51ff 100644
--- a/fggl/input/gamepad.hpp
+++ b/fggl/input/gamepad.hpp
@@ -108,6 +108,19 @@ namespace fggl::input {
 				return m_active[id];
 			}
 
+			inline void name(size_t id, const std::string& name) {
+				assert( id < MaxControllers );
+				m_names[id] = name;
+			}
+
+			inline std::string name(size_t id) const {
+				std::string name = m_names[id].empty() ? "gamepad "+std::to_string(id) : m_names[id];
+				if ( !present(id) ) {
+					return name + " (disconnected)";
+				}
+				return name;
+			}
+
 			inline float axis(size_t id, GamepadAxis axis) const {
 				if ( !present(id) ) {
 					return 0.0f;
@@ -166,6 +179,7 @@ namespace fggl::input {
 
 		private:
 			std::bitset<MaxControllers> m_active;
+			std::array<std::string, MaxControllers> m_names;
 			std::array<GamepadState, MaxControllers> m_current;
 			std::array<GamepadState, MaxControllers> m_previous;
 	};