diff --git a/src/g_input.c b/src/g_input.c
index d7b7be91cbf015484a3527c15530286aa9d3583f..871c1e604ae068fc796b4f83f5239598bf49f574 100644
--- a/src/g_input.c
+++ b/src/g_input.c
@@ -120,7 +120,7 @@ void G_MapEventsToControls(event_t *ev)
 
 		case ev_joystick2: // buttons are virtual keys
 			i = ev->data1;
-			if (i >= JOYAXISSET || menuactive || CON_Ready() || chat_on)
+			if (i >= JOYAXISSET || menuactive)
 				break;
 			if (ev->data2 != INT32_MAX) joy2xmove[i] = ev->data2;
 			if (ev->data3 != INT32_MAX) joy2ymove[i] = ev->data3;
diff --git a/src/hu_stuff.c b/src/hu_stuff.c
index f66aa07beea934a537ab32f5a76cd5d9c93e9f75..f28f3c8a720897d5bf3f401f0faf5aea48246be2 100644
--- a/src/hu_stuff.c
+++ b/src/hu_stuff.c
@@ -1179,6 +1179,10 @@ boolean HU_Responder(event_t *ev)
 		 || ev->data1 == KEY_LALT || ev->data1 == KEY_RALT)
 			return true;
 
+		// Ignore joystick hats
+		if (ev->data1 >= KEY_HAT1 && ev->data1 <= KEY_HAT1 + 3)
+			return false;
+
 		c = (INT32)ev->data1;
 
 		// I know this looks very messy but this works. If it ain't broke, don't fix it!