diff --git a/src/r_fps.c b/src/r_fps.c
index 519288bab..ce30fd48e 100644
--- a/src/r_fps.c
+++ b/src/r_fps.c
@@ -39,6 +39,16 @@ viewvars_t *newview = &p1view_new;
 
 enum viewcontext_e viewcontext = VIEWCONTEXT_PLAYER1;
 
+static fixed_t R_LerpFixed(fixed_t from, fixed_t to, fixed_t frac)
+{
+	return FixedMul(frac, to - from);
+}
+
+static angle_t R_LerpAngle(angle_t from, angle_t to, fixed_t frac)
+{
+	return FixedMul(frac, to - from);
+}
+
 // recalc necessary stuff for mouseaiming
 // slopes are already calculated for the full possible view (which is 4*viewheight).
 // 18/08/18: (No it's actually 16*viewheight, thanks Jimita for finding this out)
@@ -80,6 +90,8 @@ void R_InterpolateView(fixed_t frac)
 	boolean skybox = 0;
 	if (FIXED_TO_FLOAT(frac) < 0)
 		frac = 0;
+	if (frac > FRACUNIT)
+		frac = FRACUNIT;
 
 	viewx = oldview->x + R_LerpFixed(oldview->x, newview->x, frac);
 	viewy = oldview->y + R_LerpFixed(oldview->y, newview->y, frac);
@@ -93,16 +105,8 @@ void R_InterpolateView(fixed_t frac)
 
 	// this is gonna create some interesting visual errors for long distance teleports...
 	// might want to recalculate the view sector every frame instead...
-	if (frac >= FRACUNIT)
-	{
-		viewplayer = newview->player;
-		viewsector = newview->sector;
-	}
-	else
-	{
-		viewplayer = oldview->player;
-		viewsector = oldview->sector;
-	}
+	viewplayer = newview->player;
+	viewsector = R_PointInSubsector(viewx, viewy)->sector;
 
 	// well, this ain't pretty
 	if (newview == &sky1view_new || newview == &sky2view_new)
@@ -152,18 +156,3 @@ void R_SetViewContext(enum viewcontext_e _viewcontext)
 			break;
 	}
 }
-
-fixed_t R_LerpFixed(fixed_t from, fixed_t to, fixed_t frac)
-{
-	return FixedMul(frac, to - from);
-}
-
-INT32 R_LerpInt32(INT32 from, INT32 to, fixed_t frac)
-{
-	return FixedInt(FixedMul(frac, (to*FRACUNIT) - (from*FRACUNIT)));
-}
-
-angle_t R_LerpAngle(angle_t from, angle_t to, fixed_t frac)
-{
-	return FixedMul(frac, to - from);
-}
diff --git a/src/r_fps.h b/src/r_fps.h
index f9ee6f0de..6e3ff3adb 100644
--- a/src/r_fps.h
+++ b/src/r_fps.h
@@ -51,9 +51,4 @@ void R_UpdateViewInterpolation(void);
 // Set the current view context (the viewvars pointed to by newview)
 void R_SetViewContext(enum viewcontext_e _viewcontext);
 
-fixed_t R_LerpFixed(fixed_t from, fixed_t to, fixed_t frac);
-INT32 R_LerpInt32(INT32 from, INT32 to, fixed_t frac);
-UINT32 R_LerpUInt32(UINT32 from, UINT32 to, fixed_t frac);
-angle_t R_LerpAngle(angle_t from, angle_t to, fixed_t frac);
-
 #endif