diff --git a/src/p_tick.c b/src/p_tick.c
index c2f2b0579f39e7e73a69514a8b61f8f81e80d238..e244de1c64d3d747ed5c1ce3a0e5b5b94b0edbae 100644
--- a/src/p_tick.c
+++ b/src/p_tick.c
@@ -255,6 +255,7 @@ void P_RemoveThinkerDelayed(thinker_t *thinker)
 	* thinker->prev->next = thinker->next */
 	(next->prev = currentthinker = thinker->prev)->next = next;
 
+	R_DestroyLevelInterpolators(thinker);
 	Z_Free(thinker);
 }
 
diff --git a/src/r_fps.c b/src/r_fps.c
index d2a31a6e645bd24d0601e8effea1ca65191574ca..559520c5df574643aaf1baccddcd602d85a5c642 100644
--- a/src/r_fps.c
+++ b/src/r_fps.c
@@ -474,3 +474,23 @@ void R_RestoreLevelInterpolators(void)
 		}
 	}
 }
+
+void R_DestroyLevelInterpolators(thinker_t *thinker)
+{
+	size_t i;
+
+	for (i = 0; i < levelinterpolators_len; i++)
+	{
+		levelinterpolator_t *interp = levelinterpolators[i];
+		
+		if (interp->thinker == thinker)
+		{
+			// Swap the tail of the level interpolators to this spot
+			levelinterpolators[i] = levelinterpolators[levelinterpolators_len - 1];
+			levelinterpolators_len -= 1;
+
+			Z_Free(interp);
+			i -= 1;
+		}
+	}
+}
diff --git a/src/r_fps.h b/src/r_fps.h
index af9baa96207657926415b7d170dc5f501010dd8a..0e10cf5e66e8ff628375bebb8b2a0c350e6a348b 100644
--- a/src/r_fps.h
+++ b/src/r_fps.h
@@ -119,5 +119,7 @@ void R_ClearLevelInterpolatorState(thinker_t *thinker);
 void R_ApplyLevelInterpolators(fixed_t frac);
 // Restore level interpolators to the real game state
 void R_RestoreLevelInterpolators(void);
+// Destroy interpolators associated with a thinker
+void R_DestroyLevelInterpolators(thinker_t *thinker);
 
 #endif