diff --git a/src/m_menu.c b/src/m_menu.c
index c491396dc545a8ce171342f2024edf7bacdf2eea..6a1d6b4a66b6aeea9652fb12f01847ccfabb212c 100644
--- a/src/m_menu.c
+++ b/src/m_menu.c
@@ -225,6 +225,7 @@ static void M_SelectableClearMenus(INT32 choice);
 static void M_Retry(INT32 choice);
 static void M_EndGame(INT32 choice);
 static void M_MapChange(INT32 choice);
+static void M_Pause(INT32 choice);
 static void M_ChangeLevel(INT32 choice);
 static void M_ConfirmSpectate(INT32 choice);
 static void M_ConfirmEnterGame(INT32 choice);
@@ -480,6 +481,8 @@ typedef enum
 // ---------------------
 static menuitem_t MPauseMenu[] =
 {
+	{IT_STRING  | IT_CALL,    NULL, "Pause",             M_Pause,                0},
+
 	{IT_STRING  | IT_SUBMENU, NULL, "Scramble Teams...", &MISC_ScrambleTeamDef, 16},
 	{IT_STRING  | IT_CALL,    NULL, "Switch Map..."    , M_MapChange,           24},
 
@@ -499,7 +502,8 @@ static menuitem_t MPauseMenu[] =
 
 typedef enum
 {
-	mpause_scramble = 0,
+	mpause_pause = 0,
+	mpause_scramble,
 	mpause_switchmap,
 
 	mpause_continue,
@@ -2098,6 +2102,11 @@ boolean M_Responder(event_t *ev)
 		{
 			ch = ev->data1;
 
+			// Pause by joystick means you bring up the menu
+			if (ch >= KEY_JOY1 && ch < KEY_JOY1 + JOYBUTTONS + JOYHATS*4 &&
+				(ch == gamecontrol[gc_pause][0] || ch == gamecontrol[gc_pause][1]))
+				ch = KEY_ESCAPE;
+
 			// added 5-2-98 remap virtual keys (mouse & joystick buttons)
 			switch (ch)
 			{
@@ -2212,6 +2221,11 @@ boolean M_Responder(event_t *ev)
 	// F-Keys
 	if (!menuactive)
 	{
+		// Pause by joystick means you bring up the menu
+		if (ch >= KEY_JOY1 && ch < KEY_JOY1 + JOYBUTTONS + JOYHATS*4 &&
+			(ch == gamecontrol[gc_pause][0] || ch == gamecontrol[gc_pause][1]))
+			ch = KEY_ESCAPE;
+
 		noFurtherInput = true;
 		switch (ch)
 		{
@@ -2599,6 +2613,7 @@ void M_StartControlPanel(void)
 	}
 	else // multiplayer
 	{
+		MPauseMenu[mpause_pause].status = IT_DISABLED;
 		MPauseMenu[mpause_switchmap].status = IT_DISABLED;
 		MPauseMenu[mpause_scramble].status = IT_DISABLED;
 		MPauseMenu[mpause_psetupsplit].status = IT_DISABLED;
@@ -2611,8 +2626,15 @@ void M_StartControlPanel(void)
 		if ((server || adminplayer == consoleplayer))
 		{
 			MPauseMenu[mpause_switchmap].status = IT_STRING | IT_CALL;
+			if (!splitscreen)
+				MPauseMenu[mpause_pause].status = IT_STRING | IT_CALL; // server admin only
 			if (G_GametypeHasTeams())
+			{
 				MPauseMenu[mpause_scramble].status = IT_STRING | IT_SUBMENU;
+				MPauseMenu[mpause_pause].alphaKey = MPauseMenu[mpause_scramble].alphaKey - 16; // adjust y
+			}
+			else
+				MPauseMenu[mpause_pause].alphaKey = MPauseMenu[mpause_switchmap].alphaKey - 16; // adjust y
 		}
 
 		if (splitscreen)
@@ -6272,6 +6294,13 @@ static void M_MapChange(INT32 choice)
 	M_SetupNextMenu(&MISC_ChangeLevelDef);
 }
 
+static void M_Pause(INT32 choice)
+{
+	(void)choice;
+
+	COM_ImmedExecute("pause");
+}
+
 static void M_StartSplitServerMenu(INT32 choice)
 {
 	(void)choice;