diff --git a/src/d_clisrv.c b/src/d_clisrv.c
index be6390341c84db646c455ad4d5e89d4091cca329..75956d65f9b4d35b2b4d120e2a40652fe505f8f3 100644
--- a/src/d_clisrv.c
+++ b/src/d_clisrv.c
@@ -2076,7 +2076,8 @@ static boolean CL_ServerConnectionTicker(boolean viams, const char *tmpsave, tic
 
 		I_OsPolling();
 		key = I_GetKey();
-		if (key == KEY_ESCAPE || key == KEY_JOY1+1)
+		// For some reason, gamekeydown[gamecontrol[gc_brake][0]] is always true here, so we're just going to check the second to fourth buttons.
+		if (key == KEY_ESCAPE || key == KEY_JOY1+1 || key == KEY_JOY1+2 || key == KEY_JOY1+3) 
 		{
 			CONS_Printf(M_GetText("Network game synchronization aborted.\n"));
 //				M_StartMessage(M_GetText("Network game synchronization aborted.\n\nPress ESC\n"), NULL, MM_NOTHING);
diff --git a/src/g_game.c b/src/g_game.c
index 23f41564c8b29bc4d53ce14960bce83af27a9220..32e252fbd581e85cd7da4360bbcf5dd6f3e34cc8 100644
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -1177,6 +1177,26 @@ boolean InputDown(INT32 gc, UINT8 p)
 	}
 }
 
+// Returns true if the hat is pressed for the specified player
+// 0 is up, 1 is down, 2 is left, 3 is right
+// Basically a hack needed to allow the d-pad on the vote screen.
+boolean HatDown(UINT8 dir, UINT8 p)
+{
+	if (p == 1 && gamekeydown[KEY_HAT1 + dir])
+		return true;
+
+	if (p == 2 && gamekeydown[KEY_2HAT1 + dir])
+		return true;
+
+	if (p == 3 && gamekeydown[KEY_3HAT1 + dir])
+		return true;
+
+	if (p == 4 && gamekeydown[KEY_4HAT1 + dir])
+		return true;
+
+	return false;
+}
+
 INT32 JoyAxis(axis_input_e axissel, UINT8 p)
 {
 	switch (p)
diff --git a/src/g_game.h b/src/g_game.h
index 720d561fb3f8b6911ed9ac8be8ed38e339f09409..52f7f60dbb4b6e384e628496cfe001dc9b1ba450 100644
--- a/src/g_game.h
+++ b/src/g_game.h
@@ -99,6 +99,7 @@ INT16 G_ClipAimingPitch(INT32 *aiming);
 INT16 G_SoftwareClipAimingPitch(INT32 *aiming);
 
 boolean InputDown(INT32 gc, UINT8 p);
+boolean HatDown(UINT8 dir, UINT8 p);
 INT32 JoyAxis(axis_input_e axissel, UINT8 p);
 
 extern angle_t localangle, localangle2, localangle3, localangle4;
diff --git a/src/y_inter.c b/src/y_inter.c
index 379d5cd392f55405239e6e205aa557c8b0567cf8..6073f93ecfd6e99df2886dd2983cf6d03e97917b 100644
--- a/src/y_inter.c
+++ b/src/y_inter.c
@@ -1318,13 +1318,13 @@ void Y_VoteTicker(void)
 				&& !voteclient.playerinfo[i].delay
 				&& pickedvote == -1 && votes[p] == -1)
 			{
-				if (InputDown(gc_aimforward, i+1) || JoyAxis(AXISAIM, i+1) < 0)
+				if (InputDown(gc_aimforward, i+1) || JoyAxis(AXISAIM, i+1) < 0 || HatDown(0, i+1))
 				{
 					voteclient.playerinfo[i].selection--;
 					pressed = true;
 				}
 
-				if ((InputDown(gc_aimbackward, i+1) || JoyAxis(AXISAIM, i+1) > 0) && !pressed)
+				if ((InputDown(gc_aimbackward, i+1) || JoyAxis(AXISAIM, i+1) > 0 || HatDown(1, i+1)) && !pressed)
 				{
 					voteclient.playerinfo[i].selection++;
 					pressed = true;