diff --git a/src/r_bsp.c b/src/r_bsp.c
index 58d69ddf45e09cc2cc7e27ef70dce00cda45bbee..1e3c94a03d81a1bcec52b16b5051b595009eeb22 100644
--- a/src/r_bsp.c
+++ b/src/r_bsp.c
@@ -31,6 +31,7 @@ sector_t *backsector;
 // very ugly realloc() of drawsegs at run-time, I upped it to 512
 // instead of 256.. and someone managed to send me a level with
 // 896 drawsegs! So too bad here's a limit removal a-la-Boom
+drawseg_t *curdrawsegs = NULL;
 drawseg_t *drawsegs = NULL;
 drawseg_t *ds_p = NULL;
 
@@ -1377,13 +1378,5 @@ void R_RenderBSPNode(INT32 bspnum)
 		bspnum = bsp->children[side^1];
 	}
 
-	// PORTAL CULLING
-	if (portalcullsector) {
-		sector_t *sect = subsectors[bspnum & ~NF_SUBSECTOR].sector;
-		if (sect != portalcullsector)
-			return;
-		portalcullsector = NULL;
-	}
-
 	R_Subsector(bspnum == -1 ? 0 : bspnum & ~NF_SUBSECTOR);
 }
diff --git a/src/r_bsp.h b/src/r_bsp.h
index 50fea6681ab86ae51b6d295ad1b19fabba87146a..825be6064b078ba0f5c0966b1d726c72e2546c07 100644
--- a/src/r_bsp.h
+++ b/src/r_bsp.h
@@ -29,6 +29,7 @@ extern boolean portalline; // is curline a portal seg?
 
 extern INT32 checkcoord[12][4];
 
+extern drawseg_t *curdrawsegs;
 extern drawseg_t *drawsegs;
 extern drawseg_t *ds_p;
 extern INT32 doorclosed;
diff --git a/src/r_main.c b/src/r_main.c
index b1a14fe0b82be075648edda88e0f1763f8e145cb..244b96caec4420528b4710e48c0d398061d2f9bf 100644
--- a/src/r_main.c
+++ b/src/r_main.c
@@ -1056,7 +1056,11 @@ void R_RenderPlayerView(player_t *player)
 
 	masks[nummasks - 1].drawsegs[0]		= 0;
 	masks[nummasks - 1].vissprites[0]	= 0;
+	masks[nummasks - 1].viewx = viewx;
+	masks[nummasks - 1].viewy = viewy;
 	masks[nummasks - 1].viewz = viewz;
+	masks[nummasks - 1].viewsector = viewsector;
+	curdrawsegs = ds_p;
 	R_RenderBSPNode((INT32)numnodes - 1);
 	masks[nummasks - 1].drawsegs[1]		= ds_p - drawsegs;
 	masks[nummasks - 1].vissprites[1]	= visspritecount;
@@ -1103,7 +1107,12 @@ void R_RenderPlayerView(player_t *player)
 
 			masks[nummasks - 1].drawsegs[0]		= ds_p - drawsegs;
 			masks[nummasks - 1].vissprites[0]	= visspritecount;
+			masks[nummasks - 1].viewx = viewx;
+			masks[nummasks - 1].viewy = viewy;
 			masks[nummasks - 1].viewz = viewz;
+			masks[nummasks - 1].viewsector = viewsector;
+			curdrawsegs = ds_p;
+
 			R_RenderBSPNode((INT32)numnodes - 1);
 			masks[nummasks - 1].drawsegs[1]		= ds_p - drawsegs;
 			masks[nummasks - 1].vissprites[1]	= visspritecount;
diff --git a/src/r_segs.c b/src/r_segs.c
index 36ed029ee2e5c697fc26106f9a160644e4b2c6e0..f5f314e6f9af22a97219236ba232f8c9c5f285bd 100644
--- a/src/r_segs.c
+++ b/src/r_segs.c
@@ -1738,6 +1738,7 @@ void R_StoreWallRange(INT32 start, INT32 stop)
 
 	if (ds_p == drawsegs+maxdrawsegs)
 	{
+		size_t curpos = curdrawsegs - drawsegs;
 		size_t pos = ds_p - drawsegs;
 		size_t newmax = maxdrawsegs ? maxdrawsegs*2 : 128;
 		if (firstseg)
@@ -1745,6 +1746,7 @@ void R_StoreWallRange(INT32 start, INT32 stop)
 		drawsegs = Z_Realloc(drawsegs, newmax*sizeof (*drawsegs), PU_STATIC, NULL);
 		ds_p = drawsegs + pos;
 		maxdrawsegs = newmax;
+		curdrawsegs = drawsegs + curpos;
 		if (firstseg)
 			firstseg = drawsegs + (size_t)firstseg;
 	}
@@ -1794,7 +1796,7 @@ void R_StoreWallRange(INT32 start, INT32 stop)
 			// borrowed fix from *cough* zdoom *cough*
 			// [RH] We also need to adjust the openings pointers that
 			//    were already stored in drawsegs.
-			for (ds = drawsegs; ds < ds_p; ds++)
+			for (ds = curdrawsegs; ds < ds_p; ds++)
 			{
 #define ADJUST(p) if (ds->p + ds->x1 >= oldopenings && ds->p + ds->x1 <= oldlast) ds->p = ds->p - oldopenings + openings;
 				ADJUST(maskedtexturecol);
diff --git a/src/r_things.c b/src/r_things.c
index e0cf34dba577221bbc2d84b827d2be385028319b..27b4f15c1c458a22cf880aaf5578b811c67108aa 100644
--- a/src/r_things.c
+++ b/src/r_things.c
@@ -2454,7 +2454,12 @@ void R_DrawMasked(maskcount_t* masks, UINT8 nummasks)
 	for (i = 0; i < nummasks; i++)
 	{
 		heads[i].next = heads[i].prev = &heads[i];
+
+		viewx = masks[i].viewx;
+		viewy = masks[i].viewy;
 		viewz = masks[i].viewz;
+		viewsector = masks[i].viewsector;
+
 		R_CreateDrawNodes(&masks[i], &heads[i], false);
 	}
 
@@ -2463,7 +2468,10 @@ void R_DrawMasked(maskcount_t* masks, UINT8 nummasks)
 
 	for (; nummasks > 0; nummasks--)
 	{
+		viewx = masks[nummasks - 1].viewx;
+		viewy = masks[nummasks - 1].viewy;
 		viewz = masks[nummasks - 1].viewz;
+		viewsector = masks[nummasks - 1].viewsector;
 
 		R_DrawMaskedList(&heads[nummasks - 1]);
 		R_ClearDrawNodes(&heads[nummasks - 1]);
diff --git a/src/r_things.h b/src/r_things.h
index 27c45def456ee953212a098f6de58377f5c37abc..d287df8328293374265873a9d5e1602a3181f60f 100644
--- a/src/r_things.h
+++ b/src/r_things.h
@@ -65,7 +65,8 @@ typedef struct
 {
 	size_t drawsegs[2];
 	size_t vissprites[2];
-	fixed_t viewz;			/**< View z stored at the time of the BSP traversal for the view/portal. Masked sorting/drawing needs it. */
+	fixed_t viewx, viewy, viewz;			/**< View z stored at the time of the BSP traversal for the view/portal. Masked sorting/drawing needs it. */
+	sector_t* viewsector;
 } maskcount_t;
 
 void R_DrawMasked(maskcount_t* masks, UINT8 nummasks);