diff --git a/src/k_hud.cpp b/src/k_hud.cpp
index be30fef7548866215fc100a9cd534ef3167d95be..c1ff4ed65f59bd2ec2978f8dd3e36276abf126aa 100644
--- a/src/k_hud.cpp
+++ b/src/k_hud.cpp
@@ -3859,7 +3859,7 @@ static void K_DrawNameTagItemSpy(INT32 x, INT32 y, player_t *p, INT32 flags)
 		flip = P_MobjFlip(p->mo);
 		flipboxoffset = 8;
 	}
-	
+
 	Draw bar = Draw(x, y).flags(V_NOSCALESTART|flags);
 	Draw box = tiny ? bar.xy(-22 * vid.dupx, (-17+flipboxoffset) * vid.dupy) : bar.xy(-40 * vid.dupx, (-26+flipboxoffset) * vid.dupy);
 
@@ -4029,8 +4029,8 @@ playertagtype_t K_WhichPlayerTag(player_t *p)
 
 void K_DrawPlayerTag(fixed_t x, fixed_t y, player_t *p, playertagtype_t type, boolean foreground)
 {
-	INT32 flags = P_IsObjectFlipped(p->mo) ? V_VFLIP : 0; 
-	
+	INT32 flags = P_IsObjectFlipped(p->mo) ? V_VFLIP : 0;
+
 	switch (type)
 	{
 	case PLAYERTAG_LOCAL:
@@ -4261,13 +4261,13 @@ static void K_drawKartProgressionMinimapIcon(UINT32 distancetofinish, INT32 hudx
 position_t K_GetKartObjectPosToMinimapPos(fixed_t objx, fixed_t objy)
 {
 	fixed_t amnumxpos, amnumypos;
-	
+
 	amnumxpos = (FixedMul(objx, minimapinfo.zoom) - minimapinfo.offs_x);
 	amnumypos = -(FixedMul(objy, minimapinfo.zoom) - minimapinfo.offs_y);
 
 	if (encoremode)
 		amnumxpos = -amnumxpos;
-	
+
 	return (position_t){amnumxpos, amnumypos};
 }
 
@@ -4279,10 +4279,10 @@ static void K_drawKartMinimapIcon(fixed_t objx, fixed_t objy, INT32 hudx, INT32
 
 	// am xpos & ypos are the icon's starting position. Withouht
 	// it, they wouldn't 'spawn' on the top-right side of the HUD.
-	
+
 	position_t amnumpos;
 	INT32 amxpos, amypos;
-	
+
 	amnumpos = K_GetKartObjectPosToMinimapPos(objx, objy);
 
 	amxpos = amnumpos.x + ((hudx - (SHORT(icon->width))/2)<<FRACBITS);
@@ -4370,21 +4370,21 @@ INT32 K_GetMinimapTransFlags(const boolean usingProgressBar)
 	if (dofade)
 	{
 		minimaptrans = FixedMul(minimaptrans, (st_translucency * FRACUNIT) / 10);
-		
+
 		// If the minimap is fully transparent, just get your 0 back. Bail out with this.
 		if (!minimaptrans)
 			return minimaptrans;
 	}
 
 	minimaptrans = ((10-minimaptrans)<<V_ALPHASHIFT);
-	
+
 	return minimaptrans;
 }
 
 INT32 K_GetMinimapSplitFlags(const boolean usingProgressBar)
 {
 	INT32 splitflags = 0;
-	
+
 	if (usingProgressBar)
 		splitflags = (V_SLIDEIN|V_SNAPTOBOTTOM);
 	else
@@ -4397,12 +4397,12 @@ INT32 K_GetMinimapSplitFlags(const boolean usingProgressBar)
 		{
 			if (r_splitscreen == 1)
 				splitflags = V_SNAPTORIGHT; // 2P right aligned
-			
+
 			// 3P lives in the middle of the bottom right
 			// viewport and shouldn't fade in OR slide
 		}
 	}
-	
+
 	return splitflags;
 }
 
@@ -4450,10 +4450,10 @@ static void K_drawKartMinimap(void)
 		// distancetofinish for an arbitrary object. ~toast 070423
 		doprogressionbar = true;
 	}
-	
+
 	minimaptrans = K_GetMinimapTransFlags(doprogressionbar);
 	if (!minimaptrans) return; // Exit early if it wouldn't draw anyway.
-	
+
 	splitflags = K_GetMinimapSplitFlags(doprogressionbar);
 
 	if (doprogressionbar == false)
@@ -5234,7 +5234,7 @@ static void K_drawKartFirstPerson(void)
 	fixed_t scale;
 	UINT8 *colmap = NULL;
 
-	if (stplyr->spectator || !stplyr->mo || (stplyr->mo->renderflags & RF_DONTDRAW))
+	if (stplyr->spectator || !stplyr->mo || (stplyr->mo->renderflags & RF_DONTDRAW || stplyr->mo->state == &states[S_KART_DEAD]))
 		return;
 
 	{
diff --git a/src/p_user.c b/src/p_user.c
index c712bec7c2f7d1a54559a450f86b197b21cb3e4e..0e9c0233e56d4a1c529e8f762de6a378a2065fa8 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -4092,6 +4092,9 @@ Quaketilt (player_t *player)
 static void
 DoABarrelRoll (player_t *player)
 {
+	UINT8 viewnum = R_GetViewNumber();
+	camera_t *cam = &camera[viewnum];
+
 	angle_t slope;
 	angle_t delta;
 
@@ -4120,9 +4123,17 @@ DoABarrelRoll (player_t *player)
 		slope = 0;
 	}
 
-	if (AbsAngle(slope) > ANGLE_45)
+	if (cam->chase)
 	{
-		slope = slope & ANGLE_180 ? InvAngle(ANGLE_45) : ANGLE_45;
+		if (AbsAngle(slope) > ANGLE_45)
+		{
+			slope = slope & ANGLE_180 ? InvAngle(ANGLE_45) : ANGLE_45;
+		}
+	} else {
+		if (AbsAngle(slope) > ANGLE_90)
+		{
+			slope = slope & ANGLE_180 ? InvAngle(ANGLE_90) : ANGLE_90;
+		}
 	}
 
 	slope -= Quaketilt(player);
@@ -4130,7 +4141,7 @@ DoABarrelRoll (player_t *player)
 	delta = slope - player->tilt;
 	smoothing = FixedDiv(AbsAngle(slope), ANGLE_45);
 
-	delta = FixedDiv(delta, 33 *
+	delta = FixedDiv(delta, (cam->chase ? 33 : 11) *
 			FixedDiv(FRACUNIT, FRACUNIT + smoothing));
 
 	if (delta)
diff --git a/src/r_main.cpp b/src/r_main.cpp
index 98a7b43a89f7430a039b959350dc35872bd9bf49..a0399d487815cc875442bbf3a02b3e21d294f85e 100644
--- a/src/r_main.cpp
+++ b/src/r_main.cpp
@@ -307,8 +307,18 @@ angle_t R_PointToAnglePlayer(player_t *player, fixed_t x, fixed_t y)
 	{
 		refx = cam->x;
 		refy = cam->y;
-	}
 
+		// Bandaid for two very specific bugs that arise with chasecam off.
+		// 1: Camera tilt from slopes wouldn't apply correctly in first person.
+		// 2: Trick pies would appear strangely in first person.
+		if (player->mo)
+		{
+			if ((!cam->chase) && player->mo->x == x && player->mo->y == y)
+			{
+				return player->mo->angle;
+			}
+		}
+	}
 	return R_PointToAngle2(refx, refy, x, y);
 }