diff --git a/src/g_game.c b/src/g_game.c
index b1a3720e667cddedbe1b5e59b33704e6a0dc82db..f313b4d5013bcda492dc2ba273a2b49321ca1b6c 100644
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -1677,7 +1677,8 @@ static INT32 camtoggledelay, camtoggledelay2 = 0;
 boolean G_Responder(event_t *ev)
 {
 	// allow spy mode changes even during the demo
-	if (gamestate == GS_LEVEL && ev->type == ev_keydown && ev->data1 == KEY_F12)
+	if (gamestate == GS_LEVEL && ev->type == ev_keydown
+		&& (ev->data1 == gamecontrol[gc_viewpoint][0] || ev->data1 == gamecontrol[gc_viewpoint][1]))
 	{
 		if (splitscreen || !netgame)
 			displayplayer = consoleplayer;
diff --git a/src/g_input.c b/src/g_input.c
index 1884f38b921b2284c420a3127b9b497f9aefc4ad..489806d847c7f3a52f35eac186abe68b9b5803de 100644
--- a/src/g_input.c
+++ b/src/g_input.c
@@ -1192,6 +1192,7 @@ void G_Controldefault(void)
 	gamecontrol[gc_pause      ][0] = 'p';
 	gamecontrol[gc_screenshot ][0] = KEY_F8;
 	gamecontrol[gc_recordgif  ][0] = KEY_F9;
+	gamecontrol[gc_viewpoint  ][0] = KEY_F12;
 	gamecontrol[gc_systemmenu ][0] = KEY_JOY1+7; // Start
 #ifdef WMINPUT
 	gamecontrol[gc_forward    ][0] = KEY_JOY1+02; //UP
diff --git a/src/g_input.h b/src/g_input.h
index d618b0da17a72751f06f1df84634032e81c8b4d8..557fb3bf38acf75c313d4c403c5418a5682472f0 100644
--- a/src/g_input.h
+++ b/src/g_input.h
@@ -121,6 +121,7 @@ typedef enum
 	gc_systemmenu,
 	gc_screenshot,
 	gc_recordgif,
+	gc_viewpoint,
 	gc_custom1, // Lua scriptable
 	gc_custom2, // Lua scriptable
 	gc_custom3, // Lua scriptable
diff --git a/src/m_menu.c b/src/m_menu.c
index 2b88f6c505ddd7fe64f91be53757fb031fba6922..381029a082bcb44538b6aa218ce77a0d2f88c1bc 100644
--- a/src/m_menu.c
+++ b/src/m_menu.c
@@ -1076,6 +1076,7 @@ static menuitem_t OP_MiscControlsMenu[] =
 	{IT_CALL | IT_STRING2, NULL, "Screenshot",            M_ChangeControl, gc_screenshot },
 	{IT_CALL | IT_STRING2, NULL, "Toggle GIF Recording",  M_ChangeControl, gc_recordgif  },
 	{IT_CALL | IT_STRING2, NULL, "Open/Close Menu (ESC)", M_ChangeControl, gc_systemmenu },
+	{IT_CALL | IT_STRING2, NULL, "Change Viewpoint",      M_ChangeControl, gc_viewpoint  },
 	{IT_CALL | IT_STRING2, NULL, "Console",          M_ChangeControl, gc_console      },
 };