diff --git a/src/r_bsp.c b/src/r_bsp.c
index 2fcaf9e43ab3eff74670d4381b598ee1b38749b2..51d9bd3fddad73389f6756305a9fe469c76beb69 100644
--- a/src/r_bsp.c
+++ b/src/r_bsp.c
@@ -1378,5 +1378,13 @@ 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_main.c b/src/r_main.c
index dd1243868cc9fdc78e63bf1b1bf56df2fce6e04b..c21d339aac415848e40492e06ecfec0e82ee2b60 100644
--- a/src/r_main.c
+++ b/src/r_main.c
@@ -1008,11 +1008,13 @@ static void R_PortalFrame(portal_t *portal)
 	if (portal->clipline != -1)
 	{
 		portalclipline = &lines[portal->clipline];
+		portalcullsector = portalclipline->frontsector;
 		viewsector = portalclipline->frontsector;
 	}
 	else
 	{
 		portalclipline = NULL;
+		portalcullsector = NULL;
 		viewsector = R_PointInSubsector(viewx, viewy)->sector;
 	}
 }
diff --git a/src/r_portal.c b/src/r_portal.c
index 8995eaac4af75601b0784d133d7e84912424d454..576b606ec06d7e44a2c5506c111b495880e35ca5 100644
--- a/src/r_portal.c
+++ b/src/r_portal.c
@@ -26,6 +26,7 @@ UINT8 portalrender;			/**< When rendering a portal, it establishes the depth of
 portal_t *portal_base, *portal_cap;
 
 line_t *portalclipline;
+sector_t *portalcullsector;
 INT32 portalclipstart, portalclipend;
 
 boolean portalline; // is curline a portal seg?
diff --git a/src/r_portal.h b/src/r_portal.h
index 5990d195946135e85a9608b2ec9c70a1785de388..c46ddfdab77b5a7e89d36fe8a5b46f8784e1866a 100644
--- a/src/r_portal.h
+++ b/src/r_portal.h
@@ -45,6 +45,7 @@ extern portal_t* portal_cap;
 extern UINT8 portalrender;
 
 extern line_t *portalclipline;
+extern sector_t *portalcullsector;
 extern INT32 portalclipstart, portalclipend;
 
 void Portal_InitList	(void);