diff --git a/src/d_clisrv.c b/src/d_clisrv.c
index 8d6de7654..742c0114a 100644
--- a/src/d_clisrv.c
+++ b/src/d_clisrv.c
@@ -791,7 +791,7 @@ static void resynch_read_player(resynch_pak *rsp)
 	players[i].mo->scalespeed = LONG(rsp->scalespeed);
 
 	// And finally, SET THE MOBJ SKIN damn it.
-	if ((players[i].powers[pw_carry] == CR_NIGHTSMODE) && (skins[players[i].skin].sprites[SPR2_NGT0].numframes == 0))
+	if ((players[i].powers[pw_carry] == CR_NIGHTSMODE) && (skins[players[i].skin].sprites[SPR2_NFLY].numframes == 0))
 	{
 		players[i].mo->skin = &skins[DEFAULTNIGHTSSKIN];
 		players[i].mo->color = skins[DEFAULTNIGHTSSKIN].prefcolor; // this will be corrected by thinker to super flash
diff --git a/src/dehacked.c b/src/dehacked.c
index 7d6c42ac0..c62ceda01 100644
--- a/src/dehacked.c
+++ b/src/dehacked.c
@@ -4633,40 +4633,14 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
 	"S_PLAY_NIGHTS_TRANS4",
 	"S_PLAY_NIGHTS_TRANS5",
 	"S_PLAY_NIGHTS_TRANS6",
-
 	"S_PLAY_NIGHTS_STAND",
 	"S_PLAY_NIGHTS_FLOAT",
+	"S_PLAY_NIGHTS_FLY",
+	"S_PLAY_NIGHTS_DRILL",
 	"S_PLAY_NIGHTS_STUN",
 	"S_PLAY_NIGHTS_PULL",
 	"S_PLAY_NIGHTS_ATTACK",
 
-	"S_PLAY_NIGHTS_FLY0",
-	"S_PLAY_NIGHTS_DRILL0",
-	"S_PLAY_NIGHTS_FLY1",
-	"S_PLAY_NIGHTS_DRILL1",
-	"S_PLAY_NIGHTS_FLY2",
-	"S_PLAY_NIGHTS_DRILL2",
-	"S_PLAY_NIGHTS_FLY3",
-	"S_PLAY_NIGHTS_DRILL3",
-	"S_PLAY_NIGHTS_FLY4",
-	"S_PLAY_NIGHTS_DRILL4",
-	"S_PLAY_NIGHTS_FLY5",
-	"S_PLAY_NIGHTS_DRILL5",
-	"S_PLAY_NIGHTS_FLY6",
-	"S_PLAY_NIGHTS_DRILL6",
-	"S_PLAY_NIGHTS_FLY7",
-	"S_PLAY_NIGHTS_DRILL7",
-	"S_PLAY_NIGHTS_FLY8",
-	"S_PLAY_NIGHTS_DRILL8",
-	"S_PLAY_NIGHTS_FLY9",
-	"S_PLAY_NIGHTS_DRILL9",
-	"S_PLAY_NIGHTS_FLYA",
-	"S_PLAY_NIGHTS_DRILLA",
-	"S_PLAY_NIGHTS_FLYB",
-	"S_PLAY_NIGHTS_DRILLB",
-	"S_PLAY_NIGHTS_FLYC",
-	"S_PLAY_NIGHTS_DRILLC",
-
 	// c:
 	"S_TAILSOVERLAY_STAND",
 	"S_TAILSOVERLAY_0DEGREES",
diff --git a/src/info.c b/src/info.c
index cf6380aab..a616045ea 100644
--- a/src/info.c
+++ b/src/info.c
@@ -553,38 +553,12 @@ char spr2names[NUMPLAYERSPRITES][5] =
 
 	"NSTD",
 	"NFLT",
+	"NFLY",
+	"NDRL",
 	"NSTN",
 	"NPUL",
 	"NATK",
 
-	"NGT0",
-	"NGT1",
-	"NGT2",
-	"NGT3",
-	"NGT4",
-	"NGT5",
-	"NGT6",
-	"NGT7",
-	"NGT8",
-	"NGT9",
-	"NGTA",
-	"NGTB",
-	"NGTC",
-
-	"DRL0",
-	"DRL1",
-	"DRL2",
-	"DRL3",
-	"DRL4",
-	"DRL5",
-	"DRL6",
-	"DRL7",
-	"DRL8",
-	"DRL9",
-	"DRLA",
-	"DRLB",
-	"DRLC",
-
 	"TAL0",
 	"TAL1",
 	"TAL2",
@@ -656,38 +630,12 @@ playersprite_t spr2defaults[NUMPLAYERSPRITES] = {
 
 	FF_SPR2SUPER|SPR2_STND, // SPR2_NSTD,
 	FF_SPR2SUPER|SPR2_FLT , // SPR2_NFLT,
+	0, // SPR2_NFLY, (will never be referenced unless skin 0 lacks this)
+	SPR2_NFLY, // SPR2_NDRL,
 	FF_SPR2SUPER|SPR2_STUN, // SPR2_NSTN,
 	SPR2_NSTN, // SPR2_NPUL,
 	FF_SPR2SUPER|SPR2_ROLL, // SPR2_NATK,
 
-	0, // SPR2_NGT0, (will never be referenced unless skin 0 lacks this)
-	SPR2_NGT0, // SPR2_NGT1,
-	SPR2_NGT1, // SPR2_NGT2,
-	SPR2_NGT2, // SPR2_NGT3,
-	SPR2_NGT3, // SPR2_NGT4,
-	SPR2_NGT4, // SPR2_NGT5,
-	SPR2_NGT5, // SPR2_NGT6,
-	SPR2_NGT0, // SPR2_NGT7,
-	SPR2_NGT7, // SPR2_NGT8,
-	SPR2_NGT8, // SPR2_NGT9,
-	SPR2_NGT9, // SPR2_NGTA,
-	SPR2_NGTA, // SPR2_NGTB,
-	SPR2_NGTB, // SPR2_NGTC,
-
-	SPR2_NGT0, // SPR2_DRL0,
-	SPR2_NGT1, // SPR2_DRL1,
-	SPR2_NGT2, // SPR2_DRL2,
-	SPR2_NGT3, // SPR2_DRL3,
-	SPR2_NGT4, // SPR2_DRL4,
-	SPR2_NGT5, // SPR2_DRL5,
-	SPR2_NGT6, // SPR2_DRL6,
-	SPR2_NGT7, // SPR2_DRL7,
-	SPR2_NGT8, // SPR2_DRL8,
-	SPR2_NGT9, // SPR2_DRL9,
-	SPR2_NGTA, // SPR2_DRLA,
-	SPR2_NGTB, // SPR2_DRLB,
-	SPR2_NGTC, // SPR2_DRLC,
-
 	0, // SPR2_TAL0, (this will look mighty stupid but oh well)
 	SPR2_TAL0, // SPR2_TAL1,
 	SPR2_TAL1, // SPR2_TAL2,
@@ -818,41 +766,15 @@ state_t states[NUMSTATES] =
 	{SPR_PLAY, SPR2_TRNS|FF_FULLBRIGHT,  2, {NULL},          0, 0, S_PLAY_NIGHTS_TRANS6}, // S_PLAY_NIGHTS_TRANS5
 	{SPR_PLAY, SPR2_TRNS|FF_FULLBRIGHT, 21, {A_FadeOverlay}, 2, 0, S_PLAY_NIGHTS_FLOAT},  // S_PLAY_NIGHTS_TRANS5
 
-	// NiGHTS Player, stand, float, pain, pull and attack
+	// NiGHTS Player
 	{SPR_PLAY, SPR2_NSTD, 7, {NULL}, 0, 0, S_PLAY_NIGHTS_STAND},  // S_PLAY_NIGHTS_STAND
 	{SPR_PLAY, SPR2_NFLT, 7, {NULL}, 0, 0, S_PLAY_NIGHTS_FLOAT},  // S_PLAY_NIGHTS_FLOAT
+	{SPR_PLAY, SPR2_NFLY, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY},    // S_PLAY_NIGHTS_FLY
+	{SPR_PLAY, SPR2_NDRL, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL},  // S_PLAY_NIGHTS_DRILL
 	{SPR_PLAY, SPR2_NSTN, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_STUN},   // S_PLAY_NIGHTS_STUN
 	{SPR_PLAY, SPR2_NPUL, 1, {NULL}, 0, 0, S_PLAY_NIGHTS_PULL},   // S_PLAY_NIGHTS_PULL
 	{SPR_PLAY, SPR2_NATK, 1, {NULL}, 0, 0, S_PLAY_NIGHTS_ATTACK}, // S_PLAY_NIGHTS_ATTACK
 
-	// NiGHTS Player, flying and drilling
-	{SPR_PLAY, SPR2_NGT0, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY0},   // S_PLAY_NIGHTS_FLY0
-	{SPR_PLAY, SPR2_DRL0, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL0}, // S_PLAY_NIGHTS_DRILL0
-	{SPR_PLAY, SPR2_NGT1, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY1},   // S_PLAY_NIGHTS_FLY1
-	{SPR_PLAY, SPR2_DRL1, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL1}, // S_PLAY_NIGHTS_DRILL1
-	{SPR_PLAY, SPR2_NGT2, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY2},   // S_PLAY_NIGHTS_FLY2
-	{SPR_PLAY, SPR2_DRL2, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL2}, // S_PLAY_NIGHTS_DRILL2
-	{SPR_PLAY, SPR2_NGT3, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY3},   // S_PLAY_NIGHTS_FLY3
-	{SPR_PLAY, SPR2_DRL3, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL3}, // S_PLAY_NIGHTS_DRILL3
-	{SPR_PLAY, SPR2_NGT4, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY4},   // S_PLAY_NIGHTS_FLY4
-	{SPR_PLAY, SPR2_DRL4, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL4}, // S_PLAY_NIGHTS_DRILL4
-	{SPR_PLAY, SPR2_NGT5, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY5},   // S_PLAY_NIGHTS_FLY5
-	{SPR_PLAY, SPR2_DRL5, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL5}, // S_PLAY_NIGHTS_DRILL5
-	{SPR_PLAY, SPR2_NGT6, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY6},   // S_PLAY_NIGHTS_FLY6
-	{SPR_PLAY, SPR2_DRL6, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL6}, // S_PLAY_NIGHTS_DRILL6
-	{SPR_PLAY, SPR2_NGT7, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY7},   // S_PLAY_NIGHTS_FLY7
-	{SPR_PLAY, SPR2_DRL7, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL7}, // S_PLAY_NIGHTS_DRILL7
-	{SPR_PLAY, SPR2_NGT8, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY8},   // S_PLAY_NIGHTS_FLY8
-	{SPR_PLAY, SPR2_DRL8, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL8}, // S_PLAY_NIGHTS_DRILL8
-	{SPR_PLAY, SPR2_NGT9, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLY9},   // S_PLAY_NIGHTS_FLY9
-	{SPR_PLAY, SPR2_DRL9, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILL9}, // S_PLAY_NIGHTS_DRILL9
-	{SPR_PLAY, SPR2_NGTA, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLYA},   // S_PLAY_NIGHTS_FLYA
-	{SPR_PLAY, SPR2_DRLA, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILLA}, // S_PLAY_NIGHTS_DRILLA
-	{SPR_PLAY, SPR2_NGTB, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLYB},   // S_PLAY_NIGHTS_FLYB
-	{SPR_PLAY, SPR2_DRLB, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILLB}, // S_PLAY_NIGHTS_DRILLB
-	{SPR_PLAY, SPR2_NGTC, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_FLYC},   // S_PLAY_NIGHTS_FLYC
-	{SPR_PLAY, SPR2_DRLC, 2, {NULL}, 0, 0, S_PLAY_NIGHTS_DRILLC}, // S_PLAY_NIGHTS_DRILLC
-
 	// c:
 	{SPR_PLAY, SPR2_TAL0|FF_SPR2MIDSTART,  5, {NULL}, 0, 0, S_TAILSOVERLAY_STAND}, // S_TAILSOVERLAY_STAND
 	{SPR_PLAY, SPR2_TAL1|FF_SPR2MIDSTART, 35, {NULL}, 0, 0, S_TAILSOVERLAY_0DEGREES}, // S_TAILSOVERLAY_0DEGREES
diff --git a/src/info.h b/src/info.h
index 98b4d914f..d60caa77b 100644
--- a/src/info.h
+++ b/src/info.h
@@ -822,40 +822,12 @@ typedef enum playersprite
 
 	SPR2_NSTD, // NiGHTS stand
 	SPR2_NFLT, // NiGHTS float
+	SPR2_NFLY, // NiGHTS fly
+	SPR2_NDRL, // NiGHTS drill
 	SPR2_NSTN, // NiGHTS stun
 	SPR2_NPUL, // NiGHTS pull
 	SPR2_NATK, // NiGHTS attack
 
-	// NiGHTS flight
-	SPR2_NGT0,
-	SPR2_NGT1,
-	SPR2_NGT2,
-	SPR2_NGT3,
-	SPR2_NGT4,
-	SPR2_NGT5,
-	SPR2_NGT6,
-	SPR2_NGT7,
-	SPR2_NGT8,
-	SPR2_NGT9,
-	SPR2_NGTA,
-	SPR2_NGTB,
-	SPR2_NGTC,
-
-	// NiGHTS drill
-	SPR2_DRL0,
-	SPR2_DRL1,
-	SPR2_DRL2,
-	SPR2_DRL3,
-	SPR2_DRL4,
-	SPR2_DRL5,
-	SPR2_DRL6,
-	SPR2_DRL7,
-	SPR2_DRL8,
-	SPR2_DRL9,
-	SPR2_DRLA,
-	SPR2_DRLB,
-	SPR2_DRLC,
-
 	// c:
 	SPR2_TAL0,
 	SPR2_TAL1,
@@ -989,40 +961,14 @@ typedef enum state
 	S_PLAY_NIGHTS_TRANS4,
 	S_PLAY_NIGHTS_TRANS5,
 	S_PLAY_NIGHTS_TRANS6,
-
 	S_PLAY_NIGHTS_STAND,
 	S_PLAY_NIGHTS_FLOAT,
+	S_PLAY_NIGHTS_FLY,
+	S_PLAY_NIGHTS_DRILL,
 	S_PLAY_NIGHTS_STUN,
 	S_PLAY_NIGHTS_PULL,
 	S_PLAY_NIGHTS_ATTACK,
 
-	S_PLAY_NIGHTS_FLY0,
-	S_PLAY_NIGHTS_DRILL0,
-	S_PLAY_NIGHTS_FLY1,
-	S_PLAY_NIGHTS_DRILL1,
-	S_PLAY_NIGHTS_FLY2,
-	S_PLAY_NIGHTS_DRILL2,
-	S_PLAY_NIGHTS_FLY3,
-	S_PLAY_NIGHTS_DRILL3,
-	S_PLAY_NIGHTS_FLY4,
-	S_PLAY_NIGHTS_DRILL4,
-	S_PLAY_NIGHTS_FLY5,
-	S_PLAY_NIGHTS_DRILL5,
-	S_PLAY_NIGHTS_FLY6,
-	S_PLAY_NIGHTS_DRILL6,
-	S_PLAY_NIGHTS_FLY7,
-	S_PLAY_NIGHTS_DRILL7,
-	S_PLAY_NIGHTS_FLY8,
-	S_PLAY_NIGHTS_DRILL8,
-	S_PLAY_NIGHTS_FLY9,
-	S_PLAY_NIGHTS_DRILL9,
-	S_PLAY_NIGHTS_FLYA,
-	S_PLAY_NIGHTS_DRILLA,
-	S_PLAY_NIGHTS_FLYB,
-	S_PLAY_NIGHTS_DRILLB,
-	S_PLAY_NIGHTS_FLYC,
-	S_PLAY_NIGHTS_DRILLC,
-
 	// c:
 	S_TAILSOVERLAY_STAND,
 	S_TAILSOVERLAY_0DEGREES,
diff --git a/src/p_user.c b/src/p_user.c
index 8db28c988..5cb417d3a 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -744,7 +744,7 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime)
 		player->mo->height = P_GetPlayerHeight(player); // Just to make sure jumping into the drone doesn't result in a squashed hitbox.
 		player->oldscale = player->mo->scale;
 
-		if (skins[player->skin].sprites[SPR2_NGT0].numframes == 0) // If you don't have a sprite for flying horizontally, use the default NiGHTS skin.
+		if (skins[player->skin].sprites[SPR2_NFLY].numframes == 0) // If you don't have a sprite for flying horizontally, use the default NiGHTS skin.
 		{
 			player->mo->skin = &skins[DEFAULTNIGHTSSKIN];
 			if (!(cv_debug || devparm) && !(netgame || multiplayer || demoplayback))
@@ -7217,17 +7217,25 @@ static void P_NiGHTSMovement(player_t *player)
 	{
 		player->mo->momx = player->mo->momy = 0;
 
-		if (gametype != GT_RACE && gametype != GT_COMPETITION)
+		if (gametype != GT_RACE && gametype != GT_COMPETITION && P_MobjFlip(player->mo)*player->mo->momz >= 0)
 			P_SetObjectMomZ(player->mo, FRACUNIT/2, true);
+		else
+			player->mo->momz = 0;
 
 #ifdef ROTSPRITE
-		if (player->mo->state != &states[S_PLAY_NIGHTS_DRILL0])
-			P_SetPlayerMobjState(player->mo, S_PLAY_NIGHTS_DRILL0);
-		player->mo->rollangle = ANGLE_90;
-#else
-		if (player->mo->state != &states[S_PLAY_NIGHTS_DRILL6])
-			P_SetPlayerMobjState(player->mo, S_PLAY_NIGHTS_DRILL6);
+		if ((player->charflags & SF_NONIGHTSROTATION) && player->mo->momz)
+		{
+			if (player->mo->state != &states[S_PLAY_NIGHTS_DRILL])
+				P_SetPlayerMobjState(player->mo, S_PLAY_NIGHTS_DRILL);
+			player->mo->rollangle = ANGLE_90;
+		}
+		else
 #endif
+		{
+			if (player->mo->state != &states[S_PLAY_NIGHTS_FLOAT])
+				P_SetPlayerMobjState(player->mo, S_PLAY_NIGHTS_FLOAT);
+			player->drawangle += ANGLE_22h;
+		}
 
 		player->mo->flags |= MF_NOCLIPHEIGHT;
 		return;
@@ -7504,8 +7512,10 @@ static void P_NiGHTSMovement(player_t *player)
 		flystate = (P_IsObjectOnGround(player->mo)) ? S_PLAY_NIGHTS_STAND : S_PLAY_NIGHTS_FLOAT;
 	else
 	{
+		flystate = (player->pflags & PF_DRILLING) ? S_PLAY_NIGHTS_DRILL : S_PLAY_NIGHTS_FLY;
 		if (player->charflags & SF_NONIGHTSROTATION)
 		{
+#if 0
 			visangle = ((player->anotherflyangle + 7) % 360)/15;
 			if (visangle > 18) // Over 270 degrees.
 				visangle = 30 - visangle;
@@ -7522,10 +7532,8 @@ static void P_NiGHTSMovement(player_t *player)
 					visangle += 6; // shift to S_PLAY_NIGHTS_FLY7-C
 			}
 
-			flystate = S_PLAY_NIGHTS_FLY0 + (visangle*2); // S_PLAY_NIGHTS_FLY0-C - the *2 is to skip over drill states
-
-			if (player->pflags & PF_DRILLING)
-				flystate++; // shift to S_PLAY_NIGHTS_DRILL0-C
+			flystate += (visangle*2); // S_PLAY_NIGHTS_FLY0-C - the *2 is to skip over drill states
+#endif
 		}
 #ifdef ROTSPRITE
 		else
@@ -7533,10 +7541,6 @@ static void P_NiGHTSMovement(player_t *player)
 			angle_t a = R_PointToAngle(player->mo->x, player->mo->y) - player->mo->angle;
 			visangle = (player->flyangle % 360);
 
-			flystate = S_PLAY_NIGHTS_FLY0;
-			if (player->pflags & PF_DRILLING)
-				flystate++; // shift to S_PLAY_NIGHTS_DRILL0-C
-
 			if (player->flyangle >= 90 && player->flyangle <= 270)
 			{
 				if (player->flyangle == 270 && (a < ANGLE_180))
diff --git a/src/r_things.c b/src/r_things.c
index e0dd804a7..4373b3cfe 100644
--- a/src/r_things.c
+++ b/src/r_things.c
@@ -2892,7 +2892,7 @@ void SetPlayerSkinByNum(INT32 playernum, INT32 skinnum)
 		if (player->mo)
 		{
 			fixed_t radius = FixedMul(skin->radius, player->mo->scale);
-			if ((player->powers[pw_carry] == CR_NIGHTSMODE) && (skin->sprites[SPR2_NGT0].numframes == 0)) // If you don't have a sprite for flying horizontally, use the default NiGHTS skin.
+			if ((player->powers[pw_carry] == CR_NIGHTSMODE) && (skin->sprites[SPR2_NFLY].numframes == 0)) // If you don't have a sprite for flying horizontally, use the default NiGHTS skin.
 			{
 				skin = &skins[DEFAULTNIGHTSSKIN];
 				player->followitem = skin->followitem;