diff --git a/src/r_bsp.c b/src/r_bsp.c
index c9f2698166aed732ac9c9d69834b1d305809466f..b8e1d69c547daf33688537c3832d9bfba05abdaa 100644
--- a/src/r_bsp.c
+++ b/src/r_bsp.c
@@ -836,6 +836,7 @@ static void R_Subsector(size_t num)
 	extracolormap_t *floorcolormap;
 	extracolormap_t *ceilingcolormap;
 	fixed_t floorcenterz, ceilingcenterz;
+	ffloor_t *rover;
 
 #ifdef RANGECHECK
 	if (num >= numsubsectors)
@@ -862,7 +863,23 @@ static void R_Subsector(size_t num)
 	// Check and prep all 3D floors. Set the sector floor/ceiling light levels and colormaps.
 	if (frontsector->ffloors)
 	{
-		if (frontsector->moved)
+		boolean anyMoved = frontsector->moved;
+
+		if (anyMoved == false)
+		{
+			for (rover = frontsector->ffloors; rover; rover = rover->next)
+			{
+				sector_t *controlSec = &sectors[rover->secnum];
+
+				if (controlSec->moved == true)
+				{
+					anyMoved = true;
+					break;
+				}
+			}
+		}
+
+		if (anyMoved == true)
 		{
 			frontsector->numlights = sub->sector->numlights = 0;
 			R_Prep3DFloors(frontsector);
@@ -910,7 +927,6 @@ static void R_Subsector(size_t num)
 	ffloor[numffloors].polyobj = NULL;
 	if (frontsector->ffloors)
 	{
-		ffloor_t *rover;
 		fixed_t heightcheck, planecenterz;
 
 		for (rover = frontsector->ffloors; rover && numffloors < MAXFFLOORS; rover = rover->next)
diff --git a/src/r_fps.c b/src/r_fps.c
index 732052eacbbe8836ce4140324ed091357d6ac32a..738df202068e1f411814e37fd520a4111b677f7b 100644
--- a/src/r_fps.c
+++ b/src/r_fps.c
@@ -455,20 +455,19 @@ void R_UpdateLevelInterpolators(void)
 	for (i = 0; i < levelinterpolators_len; i++)
 	{
 		levelinterpolator_t *interp = levelinterpolators[i];
-		
+
 		UpdateLevelInterpolatorState(interp);
 	}
 }
 
 void R_ClearLevelInterpolatorState(thinker_t *thinker)
 {
-	
 	size_t i;
 
 	for (i = 0; i < levelinterpolators_len; i++)
 	{
 		levelinterpolator_t *interp = levelinterpolators[i];
-		
+
 		if (interp->thinker == thinker)
 		{
 			// Do it twice to make the old state match the new
@@ -497,6 +496,7 @@ void R_ApplyLevelInterpolators(fixed_t frac)
 			{
 				interp->sectorplane.sector->floorheight = R_LerpFixed(interp->sectorplane.oldheight, interp->sectorplane.bakheight, frac);
 			}
+			interp->sectorplane.sector->moved = true;
 			break;
 		case LVLINTERP_SectorScroll:
 			if (interp->sectorscroll.ceiling)
@@ -551,6 +551,7 @@ void R_RestoreLevelInterpolators(void)
 			{
 				interp->sectorplane.sector->floorheight = interp->sectorplane.bakheight;
 			}
+			interp->sectorplane.sector->moved = true;
 			break;
 		case LVLINTERP_SectorScroll:
 			if (interp->sectorscroll.ceiling)