diff --git a/src/p_spec.c b/src/p_spec.c
index b26fab821..a23374c13 100644
--- a/src/p_spec.c
+++ b/src/p_spec.c
@@ -1374,6 +1374,48 @@ void P_ChangeSectorTag(UINT32 sector, INT16 newtag)
 	}
 }
 
+//
+// P_RunNightserizeExecutors
+//
+void P_RunNightserizeExecutors(mobj_t *actor)
+{
+	size_t i;
+
+	for (i = 0; i < numlines; i++)
+	{
+		if (lines[i].special == 323 || lines[i].special == 324)
+			P_RunTriggerLinedef(&lines[i], actor, NULL);
+	}
+}
+
+//
+// P_RunDeNightserizeExecutors
+//
+void P_RunDeNightserizeExecutors(mobj_t *actor)
+{
+	size_t i;
+
+	for (i = 0; i < numlines; i++)
+	{
+		if (lines[i].special == 325 || lines[i].special == 326)
+			P_RunTriggerLinedef(&lines[i], actor, NULL);
+	}
+}
+
+//
+// P_RunNightsLapExecutors
+//
+void P_RunNightsLapExecutors(mobj_t *actor)
+{
+	size_t i;
+
+	for (i = 0; i < numlines; i++)
+	{
+		if (lines[i].special == 327 || lines[i].special == 328)
+			P_RunTriggerLinedef(&lines[i], actor, NULL);
+	}
+}
+
 /** Hashes the sector tags across the sectors and linedefs.
   *
   * \sa P_FindSectorFromTag, P_ChangeSectorTag
@@ -1667,6 +1709,69 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
 					return false;
 			}
 			break;
+		case 323: // each time
+		case 324: // once
+			{ // nightserize
+				INT32 mareinput = sides[triggerline->sidenum[0]].textureoffset>>FRACBITS;
+				INT32 lapinput = sides[triggerline->sidenum[0]].rowoffset>>FRACBITS;
+				BOOL ltemare = triggerline->flags & ML_NOCLIMB;
+				BOOL gtemare = triggerline->flags & ML_BLOCKMONSTERS;
+				BOOL ltelap = triggerline->flags & ML_EFFECT1;
+				BOOL gtelap = triggerline->flags & ML_EFFECT2;
+				BOOL lapfrombonustime = triggerline->flags & ML_EFFECT3;
+				BOOL doglobal = triggerline->flags & ML_EFFECT4;
+				BOOL donomares = triggerline->flags & ML_EFFECT5; // unused for nights lap
+				BOOL fromnonights = triggerline->flags & ML_BOUNCY; // unused for nights lap
+
+				CONS_Printf("Trigger Nightserize %i\n", triggerline->special);
+				CONS_Printf("M-I %i | M-V %i | M-GTE %i | M-LTE %i | L-I %i | L-V %i/%i | L-GTE %i | L-LTE %i\n"
+					, mareinput, actor->player->mare, gtemare, ltemare
+					, lapinput, actor->player->marebonuslap, actor->player->marelap, gtelap, ltelap);
+				CONS_Printf("L-Bonus %i | Global %i | No Mares %i | From No NiGHTS %i\n", lapfrombonustime, doglobal, donomares, fromnonights);
+			}
+			break;
+		case 325: // each time
+		case 326: // once
+			{ // denightserize
+				INT32 mareinput = sides[triggerline->sidenum[0]].textureoffset>>FRACBITS;
+				INT32 lapinput = sides[triggerline->sidenum[0]].rowoffset>>FRACBITS;
+				BOOL ltemare = triggerline->flags & ML_NOCLIMB;
+				BOOL gtemare = triggerline->flags & ML_BLOCKMONSTERS;
+				BOOL ltelap = triggerline->flags & ML_EFFECT1;
+				BOOL gtelap = triggerline->flags & ML_EFFECT2;
+				BOOL lapfrombonustime = triggerline->flags & ML_EFFECT3;
+				BOOL doglobal = triggerline->flags & ML_EFFECT4;
+				BOOL donomares = triggerline->flags & ML_EFFECT5; // all no nights // unused for nights lap
+				BOOL fromnonights = triggerline->flags & ML_BOUNCY; // unused for nights lap
+
+				CONS_Printf("Trigger DeNightserize %i\n", triggerline->special);
+				CONS_Printf("M-I %i | M-V %i | M-GTE %i | M-LTE %i | L-I %i | L-V %i/%i | L-GTE %i | L-LTE %i\n"
+					, mareinput, actor->player->mare, gtemare, ltemare
+					, lapinput, actor->player->marebonuslap, actor->player->marelap, gtelap, ltelap);
+				CONS_Printf("L-Bonus %i | Global %i | No Mares %i | From No NiGHTS %i\n", lapfrombonustime, doglobal, donomares, fromnonights);
+			}
+			break;
+		case 327: // each time
+		case 328: // once
+			{ // nights lap
+				INT32 mareinput = sides[triggerline->sidenum[0]].textureoffset>>FRACBITS;
+				INT32 lapinput = sides[triggerline->sidenum[0]].rowoffset>>FRACBITS;
+				BOOL ltemare = triggerline->flags & ML_NOCLIMB;
+				BOOL gtemare = triggerline->flags & ML_BLOCKMONSTERS;
+				BOOL ltelap = triggerline->flags & ML_EFFECT1;
+				BOOL gtelap = triggerline->flags & ML_EFFECT2;
+				BOOL lapfrombonustime = triggerline->flags & ML_EFFECT3;
+				BOOL doglobal = triggerline->flags & ML_EFFECT4;
+				BOOL donomares = triggerline->flags & ML_EFFECT5; // unused for nights lap
+				BOOL fromnonights = triggerline->flags & ML_BOUNCY; // unused for nights lap
+
+				CONS_Printf("Trigger NiGHTS Lap %i\n", triggerline->special);
+				CONS_Printf("M-I %i | M-V %i | M-GTE %i | M-LTE %i | L-I %i | L-V %i/%i | L-GTE %i | L-LTE %i\n"
+					, mareinput, actor->player->mare, gtemare, ltemare
+					, lapinput, actor->player->marebonuslap, actor->player->marelap, gtelap, ltelap);
+				CONS_Printf("L-Bonus %i | Global %i | No Mares %i | From No NiGHTS %i\n", lapfrombonustime, doglobal, donomares, fromnonights);
+			}
+			break;
 		default:
 			break;
 	}
@@ -5487,48 +5592,6 @@ static void P_RunLevelLoadExecutors(void)
 	}
 }
 
-//
-// P_RunNightserizeExecutors
-//
-static void P_RunNightserizeExecutors(mobj_t *actor)
-{
-	size_t i;
-
-	for (i = 0; i < numlines; i++)
-	{
-		if (lines[i].special == 323 || lines[i].special == 324)
-			P_RunTriggerLinedef(&lines[i], actor, NULL);
-	}
-}
-
-//
-// P_RunDeNightserizeExecutors
-//
-static void P_RunDeNightserizeExecutors(mobj_t *actor)
-{
-	size_t i;
-
-	for (i = 0; i < numlines; i++)
-	{
-		if (lines[i].special == 325 || lines[i].special == 326)
-			P_RunTriggerLinedef(&lines[i], actor, NULL);
-	}
-}
-
-//
-// P_RunNightsLapExecutors
-//
-static void P_RunNightsLapExecutors(mobj_t *actor)
-{
-	size_t i;
-
-	for (i = 0; i < numlines; i++)
-	{
-		if (lines[i].special == 327 || lines[i].special == 328)
-			P_RunTriggerLinedef(&lines[i], actor, NULL);
-	}
-}
-
 /** Before things are loaded, initialises certain stuff in case they're needed
   * by P_ResetDynamicSlopes or P_LoadThings. This was split off from
   * P_SpawnSpecials, in case you couldn't tell.
diff --git a/src/p_spec.h b/src/p_spec.h
index c4e05e072..76ddc237c 100644
--- a/src/p_spec.h
+++ b/src/p_spec.h
@@ -66,6 +66,9 @@ void P_SwitchWeather(INT32 weathernum);
 boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller);
 void P_LinedefExecute(INT16 tag, mobj_t *actor, sector_t *caller);
 void P_ChangeSectorTag(UINT32 sector, INT16 newtag);
+void P_RunNightserizeExecutors(mobj_t *actor);
+void P_RunDeNightserizeExecutors(mobj_t *actor);
+void P_RunNightsLapExecutors(mobj_t *actor);
 
 ffloor_t *P_GetFFloorByID(sector_t *sec, UINT16 id);
 
diff --git a/src/p_user.c b/src/p_user.c
index 54411b25a..befd91f63 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -639,7 +639,7 @@ static void P_DeNightserizePlayer(player_t *player)
 	// Restore from drowning music
 	P_RestoreMusic(player);
 
-	P_RunDeNightserizeExecutors();
+	P_RunDeNightserizeExecutors(player->mo);
 }
 
 //
@@ -774,9 +774,10 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime)
 			player->texttimer = (UINT8)(110 - timeinmap);
 	}
 
-	player->powers[pw_carry] = CR_NIGHTSMODE;
-
+	// Do this before setting CR_NIGHTSMODE so we can tell if player was non-NiGHTS
 	P_RunNightserizeExecutors(player->mo);
+
+	player->powers[pw_carry] = CR_NIGHTSMODE;
 }
 
 pflags_t P_GetJumpFlags(player_t *player)