diff --git a/src/d_netcmd.c b/src/d_netcmd.c
index 07dba17774277d2af379f74bf9e684335d91c3df..ed7f808bc85817a2c2264203f5463f14e9c41623 100644
--- a/src/d_netcmd.c
+++ b/src/d_netcmd.c
@@ -875,6 +875,8 @@ void D_RegisterClientCommands(void)
 	CV_RegisterVar(&cv_directionchar[1]);
 	CV_RegisterVar(&cv_autobrake);
 	CV_RegisterVar(&cv_autobrake2);
+	CV_RegisterVar(&cv_anglestand[0]);
+	CV_RegisterVar(&cv_anglestand[1]);
 
 	// hi here's some new controls
 	CV_RegisterVar(&cv_cam_shiftfacing[0]);
@@ -1601,13 +1603,15 @@ void SendWeaponPref(void)
 
 	buf[0] = 0;
 	if (cv_flipcam.value)
-		buf[0] |= 1;
+		buf[0] |= WEAPONPREF_FLIPCAM;
 	if (cv_analog[0].value && cv_directionchar[0].value != 2)
-		buf[0] |= 2;
+		buf[0] |= WEAPONPREF_ANALOGMODE;
 	if (cv_directionchar[0].value == 1)
-		buf[0] |= 4;
+		buf[0] |= WEAPONPREF_DIRECTIONCHAR;
 	if (cv_autobrake.value)
-		buf[0] |= 8;
+		buf[0] |= WEAPONPREF_AUTOBRAKE;
+	if (cv_anglestand[0].value)
+		buf[0] |= WEAPONPREF_ANGLESTAND;
 	SendNetXCmd(XD_WEAPONPREF, buf, 1);
 }
 
@@ -1617,13 +1621,15 @@ void SendWeaponPref2(void)
 
 	buf[0] = 0;
 	if (cv_flipcam2.value)
-		buf[0] |= 1;
+		buf[0] |= WEAPONPREF_FLIPCAM;
 	if (cv_analog[1].value && cv_directionchar[1].value != 2)
-		buf[0] |= 2;
+		buf[0] |= WEAPONPREF_ANALOGMODE;
 	if (cv_directionchar[1].value == 1)
-		buf[0] |= 4;
+		buf[0] |= WEAPONPREF_DIRECTIONCHAR;
 	if (cv_autobrake2.value)
-		buf[0] |= 8;
+		buf[0] |= WEAPONPREF_AUTOBRAKE;
+	if (cv_anglestand[1].value)
+		buf[0] |= WEAPONPREF_ANGLESTAND;
 	SendNetXCmd2(XD_WEAPONPREF, buf, 1);
 }
 
@@ -1632,14 +1638,15 @@ static void Got_WeaponPref(UINT8 **cp,INT32 playernum)
 	UINT8 prefs = READUINT8(*cp);
 
 	players[playernum].pflags &= ~(PF_FLIPCAM|PF_ANALOGMODE|PF_DIRECTIONCHAR|PF_AUTOBRAKE);
-	if (prefs & 1)
+	if (prefs & WEAPONPREF_FLIPCAM)
 		players[playernum].pflags |= PF_FLIPCAM;
-	if (prefs & 2)
+	if (prefs & WEAPONPREF_ANALOGMODE)
 		players[playernum].pflags |= PF_ANALOGMODE;
-	if (prefs & 4)
+	if (prefs & WEAPONPREF_DIRECTIONCHAR)
 		players[playernum].pflags |= PF_DIRECTIONCHAR;
-	if (prefs & 8)
+	if (prefs & WEAPONPREF_AUTOBRAKE)
 		players[playernum].pflags |= PF_AUTOBRAKE;
+	players[playernum].anglestand = !!(prefs & WEAPONPREF_ANGLESTAND);
 }
 
 void D_SendPlayerConfig(void)
diff --git a/src/d_netcmd.h b/src/d_netcmd.h
index 47f68a17e9d8f3f73a7196062ba533791689a3cd..f0f38a5403dd135c147ac38a0a549570660153f2 100644
--- a/src/d_netcmd.h
+++ b/src/d_netcmd.h
@@ -146,6 +146,17 @@ typedef enum
 	MAXNETXCMD
 } netxcmd_t;
 
+typedef enum
+{
+	WEAPONPREF_FLIPCAM       = 0x01,
+	WEAPONPREF_ANALOGMODE    = 0x02,
+	WEAPONPREF_DIRECTIONCHAR = 0x04,
+	WEAPONPREF_AUTOBRAKE     = 0x08,
+	WEAPONPREF_USEGAMEPAD    = 0x10,
+	WEAPONPREF_ANGLESTAND    = 0x20,
+	// free up to and including 0x80 with current UINT8 buffers
+} weaponpref_t;
+
 extern const char *netxcmdnames[MAXNETXCMD - 1];
 
 #if defined(_MSC_VER)
diff --git a/src/d_player.h b/src/d_player.h
index 42e9c3a82f2b656bbe9d304159f1ab5c0c7f8a69..bbe6ff25c42b30070c550d4c91f10190f3d45237 100644
--- a/src/d_player.h
+++ b/src/d_player.h
@@ -385,6 +385,7 @@ typedef struct player_s
 	angle_t drawangle;
 	angle_t old_drawangle;
 	angle_t old_drawangle2;
+	boolean anglestand;
 
 	// player's ring count
 	INT16 rings;
diff --git a/src/g_demo.c b/src/g_demo.c
index 9099adc712635170d14f0ea61bc77aa9808a635c..a0cd0ad4592edc144714db8f59a85aeab4b14292 100644
--- a/src/g_demo.c
+++ b/src/g_demo.c
@@ -1509,27 +1509,32 @@ void G_BeginRecording(void)
 		pflags_t pflags = 0;
 		if (cv_flipcam.value)
 		{
-			buf |= 0x01;
+			buf |= WEAPONPREF_FLIPCAM;
 			pflags |= PF_FLIPCAM;
 		}
 		if (cv_analog[0].value)
 		{
-			buf |= 0x02;
+			buf |= WEAPONPREF_ANALOGMODE;
 			pflags |= PF_ANALOGMODE;
 		}
 		if (cv_directionchar[0].value)
 		{
-			buf |= 0x04;
+			buf |= WEAPONPREF_DIRECTIONCHAR;
 			pflags |= PF_DIRECTIONCHAR;
 		}
 		if (cv_autobrake.value)
 		{
-			buf |= 0x08;
+			buf |= WEAPONPREF_AUTOBRAKE;
 			pflags |= PF_AUTOBRAKE;
 		}
 		if (cv_usegamepad[0].value)
-			buf |= 0x10;
+			buf |= WEAPONPREF_USEGAMEPAD;
 		CV_SetValue(&cv_showinputjoy, !!(cv_usegamepad[0].value));
+		if (cv_anglestand[0].value)
+		{
+			buf |= WEAPONPREF_ANGLESTAND;
+			player->anglestand = true;
+		}
 
 		WRITEUINT8(demo_p,buf);
 		player->pflags = pflags;
@@ -1766,6 +1771,7 @@ void G_DoPlayDemo(char *defdemoname)
 	char skin[17],color[MAXCOLORNAME+1],*n,*pdemoname;
 	UINT8 version,subversion,charability,charability2,thrustfactor,accelstart,acceleration,cnamelen;
 	pflags_t pflags;
+	boolean anglestand;
 	UINT32 randseed, followitem;
 	fixed_t camerascale,shieldscale,actionspd,mindash,maxdash,normalspeed,runspeed,jumpfactor,height,spinheight;
 	char msg[1024];
@@ -1932,15 +1938,16 @@ void G_DoPlayDemo(char *defdemoname)
 	{
 		UINT8 buf = READUINT8(demo_p);
 		pflags = 0;
-		if (buf & 0x01)
+		if (buf & WEAPONPREF_FLIPCAM)
 			pflags |= PF_FLIPCAM;
-		if (buf & 0x02)
+		if (buf & WEAPONPREF_ANALOGMODE)
 			pflags |= PF_ANALOGMODE;
-		if (buf & 0x04)
+		if (buf & WEAPONPREF_DIRECTIONCHAR)
 			pflags |= PF_DIRECTIONCHAR;
-		if (buf & 0x08)
+		if (buf & WEAPONPREF_AUTOBRAKE)
 			pflags |= PF_AUTOBRAKE;
-		CV_SetValue(&cv_showinputjoy, !!(buf & 0x10));
+		CV_SetValue(&cv_showinputjoy, !!(buf & WEAPONPREF_USEGAMEPAD));
+		anglestand = !!(buf & WEAPONPREF_ANGLESTAND);
 	}
 
 	// net var data
@@ -2022,6 +2029,7 @@ void G_DoPlayDemo(char *defdemoname)
 	players[0].jumpfactor = jumpfactor;
 	players[0].followitem = followitem;
 	players[0].pflags = pflags;
+	players[0].anglestand = anglestand;
 
 	demo_start = true;
 }
diff --git a/src/g_game.c b/src/g_game.c
index b4a127a73149eb5e7f5cb09b087f291ae775f89e..ae301d6d5eb3f0d27e3264b6d0c69f185cfe1005 100644
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -267,6 +267,8 @@ static void Analog_OnChange(void);
 static void Analog2_OnChange(void);
 static void DirectionChar_OnChange(void);
 static void DirectionChar2_OnChange(void);
+static void AngleStand_OnChange(void);
+static void AngleStand2_OnChange(void);
 static void AutoBrake_OnChange(void);
 static void AutoBrake2_OnChange(void);
 void SendWeaponPref(void);
@@ -374,6 +376,10 @@ consvar_t cv_directionchar[2] = {
 };
 consvar_t cv_autobrake = CVAR_INIT ("autobrake", "On", CV_SAVE|CV_CALL, CV_OnOff, AutoBrake_OnChange);
 consvar_t cv_autobrake2 = CVAR_INIT ("autobrake2", "On", CV_SAVE|CV_CALL, CV_OnOff, AutoBrake2_OnChange);
+consvar_t cv_anglestand[2] = {
+	CVAR_INIT ("anglestand", "Off", CV_SAVE|CV_CALL, CV_OnOff, AngleStand_OnChange),
+	CVAR_INIT ("anglestand2", "Off", CV_SAVE|CV_CALL, CV_OnOff, AngleStand2_OnChange),
+};
 
 // hi here's some new controls
 static CV_PossibleValue_t zerotoone_cons_t[] = {{0, "MIN"}, {FRACUNIT, "MAX"}, {0, NULL}};
@@ -1913,6 +1919,16 @@ static void AutoBrake2_OnChange(void)
 	SendWeaponPref2();
 }
 
+static void AngleStand_OnChange(void)
+{
+	SendWeaponPref();
+}
+
+static void AngleStand2_OnChange(void)
+{
+	SendWeaponPref2();
+}
+
 static void G_ResetInputs(void)
 {
 	memset(gamekeydown, 0, sizeof (gamekeydown));
diff --git a/src/g_game.h b/src/g_game.h
index e798176af06851822ec7956f88c5917751b7fb61..88408c463083c5386b0a4ecd9073c0bf02d77255 100644
--- a/src/g_game.h
+++ b/src/g_game.h
@@ -68,6 +68,7 @@ typedef enum {
 #define P_ControlStyle(player) ((((player)->pflags & PF_ANALOGMODE) ? CS_LMAOGALOG : 0) | (((player)->pflags & PF_DIRECTIONCHAR) ? CS_STANDARD : 0))
 
 extern consvar_t cv_autobrake, cv_autobrake2;
+extern consvar_t cv_anglestand[2];
 extern consvar_t cv_ghost_bestscore, cv_ghost_besttime, cv_ghost_bestrings, cv_ghost_last, cv_ghost_guest;
 
 extern consvar_t cv_sideaxis[2], cv_turnaxis[2], cv_moveaxis[2], cv_lookaxis[2],
diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c
index 58cfab76cc8958674bddbbf5caebb8a1f6ca1f1d..727538d613fd9400a1dbca238fb3d06101cbde8a 100644
--- a/src/lua_playerlib.c
+++ b/src/lua_playerlib.c
@@ -380,6 +380,8 @@ static int player_get(lua_State *L)
 		lua_pushinteger(L, plr->jointime);
 	else if (fastcmp(field,"quittime"))
 		lua_pushinteger(L, plr->quittime);
+	else if (fastcmp(field,"anglestand"))
+		lua_pushboolean(L, plr->anglestand);
 #ifdef HWRENDER
 	else if (fastcmp(field,"fovadd"))
 		lua_pushfixed(L, plr->fovadd);
@@ -740,6 +742,8 @@ static int player_set(lua_State *L)
 		plr->jointime = (tic_t)luaL_checkinteger(L, 3);
 	else if (fastcmp(field,"quittime"))
 		plr->quittime = (tic_t)luaL_checkinteger(L, 3);
+	else if (fastcmp(field,"anglestand"))
+		plr->anglestand = lua_toboolean(L, 3);
 #ifdef HWRENDER
 	else if (fastcmp(field,"fovadd"))
 		plr->fovadd = luaL_checkfixed(L, 3);
diff --git a/src/p_saveg.c b/src/p_saveg.c
index 42125dae7c332a0689827750e3bc527266644609..3b80f27ec26f87e8854e28917e66bb4331ba4950 100644
--- a/src/p_saveg.c
+++ b/src/p_saveg.c
@@ -52,14 +52,15 @@ UINT8 *save_p;
 // than an UINT16
 typedef enum
 {
-//	RFLAGPOINT = 0x01,
-//	BFLAGPOINT = 0x02,
-	CAPSULE    = 0x04,
-	AWAYVIEW   = 0x08,
-	FIRSTAXIS  = 0x10,
-	SECONDAXIS = 0x20,
-	FOLLOW     = 0x40,
-	DRONE      = 0x80,
+//	RFLAGPOINT = 0x0001,
+//	BFLAGPOINT = 0x0002,
+	CAPSULE    = 0x0004,
+	AWAYVIEW   = 0x0008,
+	FIRSTAXIS  = 0x0010,
+	SECONDAXIS = 0x0020,
+	FOLLOW     = 0x0040,
+	DRONE      = 0x0080,
+	ANGLESTAND = 0x0100,
 } player_saveflags;
 
 static inline void P_ArchivePlayer(void)
@@ -294,6 +295,9 @@ static void P_NetArchivePlayers(void)
 		if (players[i].drone)
 			flags |= DRONE;
 
+		if (players[i].anglestand)
+			flags |= ANGLESTAND;
+
 		WRITEINT16(save_p, players[i].lastsidehit);
 		WRITEINT16(save_p, players[i].lastlinehit);
 
@@ -536,6 +540,9 @@ static void P_NetUnArchivePlayers(void)
 		if (flags & DRONE)
 			players[i].drone = (mobj_t *)(size_t)READUINT32(save_p);
 
+		if (flags & ANGLESTAND)
+			players[i].anglestand = true;
+
 		players[i].camerascale = READFIXED(save_p);
 		players[i].shieldscale = READFIXED(save_p);
 
diff --git a/src/p_user.c b/src/p_user.c
index 4ca4e6c8ad7b5fdc18b036197da5e1bed5a48794..2bbe0896c08ca0dd258f3c9912f2d6d764bfcaee 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -11914,7 +11914,7 @@ void P_PlayerThink(player_t *player)
 				diff = ((player->mo->angle + ((player->pflags & PF_ANALOGMODE) ? 0 : R_PointToAngle2(0, 0, cmd->forwardmove<<FRACBITS, -cmd->sidemove<<FRACBITS))) - player->drawangle);
 				factor = 4;
 			}
-			else if (player->rmomx || player->rmomy)
+			else if (player->rmomx || player->rmomy || player->anglestand)
 				diff = factor = 0;
 			else
 			{