diff --git a/src/m_menu.c b/src/m_menu.c
index 7a82fd8fb1a81009590b8495e90d6a8f41102fa7..fc51b1f693b8a5beba86b3969cd3e4908fb69c3f 100644
--- a/src/m_menu.c
+++ b/src/m_menu.c
@@ -3260,9 +3260,12 @@ boolean M_Responder(event_t *ev)
 				case KEY_HAT1 + 3:
 					ch = KEY_RIGHTARROW;
 					break;
+				default: // Not a virtual key? Remap it.
+					ch = ev->realkey;
+					break;
 			}
 		}
-		else if (ev->type == ev_joystick  && ev->key == 0 && joywait < I_GetTime())
+		else if (ev->type == ev_joystick  && ev->realkey == 0 && joywait < I_GetTime())
 		{
 			const INT32 jdeadzone = (JOYAXISRANGE * cv_digitaldeadzone.value) / FRACUNIT;
 			if (ev->y != INT32_MAX)
@@ -3339,7 +3342,7 @@ boolean M_Responder(event_t *ev)
 			keydown = 0;
 	}
 	else if (ev->type == ev_keydown) // Preserve event for other responders
-		ch = ev->key;
+		ch = ev->realkey; // use layouted key here
 
 	if (ch == -1)
 		return false;
@@ -3464,7 +3467,7 @@ boolean M_Responder(event_t *ev)
 	{
 		if ((currentMenu->menuitems[itemOn].status & IT_CVARTYPE) == IT_CV_STRING)
 		{
-			if (M_ChangeStringCvar(ch))
+			if (M_ChangeStringCvar(ev->realkey))
 				return true;
 			else
 				routine = NULL;