diff --git a/src/d_player.h b/src/d_player.h
index 5f5bf53d63f04f356aee6850752ac51126e38d3e..2df3ed4bf7024f918b40e6caa60d6311bbe1aff3 100644
--- a/src/d_player.h
+++ b/src/d_player.h
@@ -53,6 +53,7 @@ typedef enum
 	SF_NOSUPERJUMPBOOST = 1<<17, // Disable the jump boost given while super (i.e. Knuckles)
 	SF_CANBUSTWALLS     = 1<<18, // Can naturally bust walls on contact? (i.e. Knuckles)
 	SF_NOSHIELDABILITY  = 1<<19, // Disable shield abilities
+	SF_FASTWAIT         = 1<<20, // Faster idle animation?
 
 	// free up to and including 1<<31
 } skinflags_t;
@@ -158,7 +159,7 @@ typedef enum
 	PF_FORCESTRAFE = 1<<28, // Turning inputs are translated into strafing inputs
 	PF_CANCARRY    = 1<<29, // Can carry another player?
 	PF_FINISHED    = 1<<30, // The player finished the level. NOT the same as exiting
-	
+
 	// True if shield button down last tic
 	// This may be the final flag, but 2.3 could free up the others
 	PF_SHIELDDOWN    = 1<<31,
diff --git a/src/deh_tables.c b/src/deh_tables.c
index 8fa32558baf8338d68a485ea6ef0b64edfb78db4..4a700ce9042f739cdfb1b55e814864fac425d11b 100644
--- a/src/deh_tables.c
+++ b/src/deh_tables.c
@@ -3371,7 +3371,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
 
 	"S_SPEEDWINGS",
 	"S_SPEEDWINGSD",
-	
+
 	"S_PARTICLEPICKUP1",
 	"S_PARTICLEPICKUP2",
 	"S_1000SCOREAWARD",
@@ -5434,6 +5434,7 @@ struct int_const_s const INT_CONST[] = {
 	{"SF_NOSUPERJUMPBOOST",SF_NOSUPERJUMPBOOST},
 	{"SF_CANBUSTWALLS",SF_CANBUSTWALLS},
 	{"SF_NOSHIELDABILITY",SF_NOSHIELDABILITY},
+	{"SF_FASTWAIT",SF_FASTWAIT},
 
 	// Dashmode constants
 	{"DASHMODE_THRESHOLD",DASHMODE_THRESHOLD},
diff --git a/src/p_user.c b/src/p_user.c
index bb5d8f44fb9d4b5ecb51ab84edc6691e9eedbafe..98fa7cfafda9a7dc1861aa1efeeae457d09486e6 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -978,7 +978,7 @@ boolean P_PlayerInPain(player_t *player)
 {
 	if (P_MobjWasRemoved(player->mo))
 		return false;
-		
+
 	// no silly, sliding isn't pain
 	if (!(player->pflags & PF_SLIDING) && player->mo->state == &states[player->mo->info->painstate] && player->powers[pw_flashing])
 		return true;
@@ -12218,12 +12218,16 @@ void P_PlayerThink(player_t *player)
 		// reset from waiting to standing when turning on the spot
 		if (player->panim == PA_IDLE)
 		{
+			statenum_t stat = player->mo->state-states;
 			diff = player->drawangle - oldang;
+
+			if (stat == S_PLAY_WAIT && (player->charflags & SF_FASTWAIT) && player->mo->anim_duration > 6)
+				player->mo->anim_duration = 6;
+
 			if (diff > ANGLE_180)
 				diff = InvAngle(diff);
 			if (diff > ANG10/2)
 			{
-				statenum_t stat = player->mo->state-states;
 				if (stat == S_PLAY_WAIT)
 					P_SetMobjState(player->mo, S_PLAY_STND);
 				else if (stat == S_PLAY_STND && player->mo->tics != -1)
diff --git a/src/r_skins.c b/src/r_skins.c
index f364273e8405189845a385fd918b0a95e79b6220..091a20567173f175beabf9443383cf4e91040709 100644
--- a/src/r_skins.c
+++ b/src/r_skins.c
@@ -737,6 +737,7 @@ static boolean R_ProcessPatchableFields(skin_t *skin, char *stoken, char *value)
 	GETFLAG(NOSUPERJUMPBOOST)
 	GETFLAG(CANBUSTWALLS)
 	GETFLAG(NOSHIELDABILITY)
+	GETFLAG(FASTWAIT)
 #undef GETFLAG
 
 	else if (!stricmp(stoken, "natkcolor"))