diff --git a/src/r_main.c b/src/r_main.c
index a49b0519f42e6c7f28f94cebb11275f001775d1d..7def18b40deaee8e19da77272404acd903224270 100644
--- a/src/r_main.c
+++ b/src/r_main.c
@@ -561,17 +561,24 @@ static struct {
 	fixed_t zoomneeded;
 	INT32 *scrmap;
 	INT32 scrmapsize;
+
 	INT32 x1; // clip rendering horizontally for efficiency
+	INT16 ceilingclip[MAXVIDWIDTH], floorclip[MAXVIDWIDTH];
+
 	boolean use;
 } viewmorph = {
 	0,
 #ifdef WOUGHMP_WOUGHMP
 	0,
 #endif
+
 	FRACUNIT,
 	NULL,
 	0,
+
 	0,
+	{}, {},
+
 	false
 };
 
@@ -693,6 +700,47 @@ void R_CheckViewMorph(void)
 	viewmorph.x1 = (INT32)(halfwidth - (halfwidth * fabsf(rollcos) + halfheight * fabsf(rollsin)));
 	//CONS_Printf("saving %d cols\n", viewmorph.x1);
 
+	// Set ceilingclip and floorclip
+	for (vx = 0; vx < vid.width; vx++)
+	{
+		viewmorph.ceilingclip[vx] = vid.height;
+		viewmorph.floorclip[vx] = -1;
+	}
+	x2 = x1;
+	y2 = y1;
+	for (vx = 0; vx < vid.width; vx++)
+	{
+		INT16 xa, ya, xb, yb;
+		xa = x2+halfwidth;
+		ya = y2+halfheight;
+		xb = vid.width-1-xa;
+		yb = vid.height-1-ya;
+
+		viewmorph.ceilingclip[xa] = min(viewmorph.ceilingclip[xa], ya);
+		viewmorph.floorclip[xa] = max(viewmorph.floorclip[xa], ya);
+		viewmorph.ceilingclip[xb] = min(viewmorph.ceilingclip[xb], yb);
+		viewmorph.floorclip[xb] = max(viewmorph.floorclip[xb], yb);
+		x2 += rollcos;
+		y2 += rollsin;
+	}
+	x2 = x1;
+	y2 = y1;
+	for (vy = 0; vy < vid.height; vy++)
+	{
+		INT16 xa, ya, xb, yb;
+		xa = x2+halfwidth;
+		ya = y2+halfheight;
+		xb = vid.width-1-xa;
+		yb = vid.height-1-ya;
+
+		viewmorph.ceilingclip[xa] = min(viewmorph.ceilingclip[xa], ya);
+		viewmorph.floorclip[xa] = max(viewmorph.floorclip[xa], ya);
+		viewmorph.ceilingclip[xb] = min(viewmorph.ceilingclip[xb], yb);
+		viewmorph.floorclip[xb] = max(viewmorph.floorclip[xb], yb);
+		x2 -= rollsin;
+		y2 += rollcos;
+	}
+
 	//CONS_Printf("Top left corner is %f %f\n", x1, y1);
 
 #ifdef WOUGHMP_WOUGHMP
@@ -1327,11 +1375,14 @@ void R_RenderPlayerView(player_t *player)
 	validcount++;
 
 	// Clear buffers.
+	R_ClearPlanes();
 	if (viewmorph.use)
 	{
 		portalclipstart = viewmorph.x1;
 		portalclipend = viewwidth-viewmorph.x1-1;
 		R_PortalClearClipSegs(portalclipstart, portalclipend);
+		memcpy(ceilingclip, viewmorph.ceilingclip, sizeof(INT16)*vid.width);
+		memcpy(floorclip, viewmorph.floorclip, sizeof(INT16)*vid.width);
 	}
 	else
 	{
@@ -1340,7 +1391,6 @@ void R_RenderPlayerView(player_t *player)
 		R_ClearClipSegs();
 	}
 	R_ClearDrawSegs();
-	R_ClearPlanes();
 	R_ClearSprites();
 #ifdef FLOORSPLATS
 	R_ClearVisibleFloorSplats();