diff --git a/src/p_spec.c b/src/p_spec.c
index af1a04434033f9c68603d10ccac2a4d719f34a91..734bada6823cf705d61818ccc31cb9925ced45b4 100644
--- a/src/p_spec.c
+++ b/src/p_spec.c
@@ -6203,6 +6203,11 @@ static boolean P_IsSectorPortalValid(sectorportal_t *secportal)
 	}
 }
 
+boolean P_SectorHasPortal(sector_t *sector)
+{
+	return P_SectorHasFloorPortal(sector) || P_SectorHasCeilingPortal(sector);
+}
+
 boolean P_SectorHasFloorPortal(sector_t *sector)
 {
 	return P_IsSectorPortalValid(&sector->portal_floor);
@@ -6215,7 +6220,11 @@ boolean P_SectorHasCeilingPortal(sector_t *sector)
 
 boolean P_CompareSectorPortals(sectorportal_t *a, sectorportal_t *b)
 {
-	if (a->type != b->type)
+	if (a == NULL && b == NULL)
+		return true;
+	else if (!a || !b)
+		return false;
+	else if (a->type != b->type)
 		return false;
 
 	switch (a->type)
diff --git a/src/p_spec.h b/src/p_spec.h
index 63ae8b504c1ea207431b20b00d8a04a5742d7a5d..0c4ce4f3296620bd4ed6baf30a25754bb1af73e1 100644
--- a/src/p_spec.h
+++ b/src/p_spec.h
@@ -521,6 +521,7 @@ INT32 P_FindMinSurroundingLight(sector_t *sector, INT32 max);
 void P_SetupSignExit(player_t *player);
 boolean P_IsFlagAtBase(mobjtype_t flag);
 
+boolean P_SectorHasPortal(sector_t *sector);
 boolean P_SectorHasFloorPortal(sector_t *sector);
 boolean P_SectorHasCeilingPortal(sector_t *sector);
 boolean P_CompareSectorPortals(sectorportal_t *a, sectorportal_t *b);
diff --git a/src/r_bsp.c b/src/r_bsp.c
index f902f2a83020db53e6b326c4a23f4fa08d5bf01e..6f115a923e0a96bcb6a82d6d7f5cbc20f133f59d 100644
--- a/src/r_bsp.c
+++ b/src/r_bsp.c
@@ -357,6 +357,11 @@ sector_t *R_FakeFlat(sector_t *sec, sector_t *tempsec, INT32 *floorlightlevel,
 
 boolean R_IsEmptyLine(seg_t *line, sector_t *front, sector_t *back)
 {
+	if (P_SectorHasPortal(front) && !P_SectorHasPortal(back))
+		return false;
+	else if (!P_SectorHasPortal(front) && P_SectorHasPortal(back))
+		return false;
+
 	return (
 		!line->polyseg &&
 		back->ceilingpic == front->ceilingpic
@@ -578,7 +583,6 @@ static void R_AddLine(seg_t *line)
 	// Reject empty lines used for triggers and special events.
 	// Identical floor and ceiling on both sides, identical light levels on both sides,
 	// and no middle texture.
-
 	if (R_IsEmptyLine(line, frontsector, backsector))
 		return;
 
@@ -915,6 +919,7 @@ static void R_Subsector(size_t num)
 
 	if (P_GetSectorFloorZAt(frontsector, viewx, viewy) < viewz
 		|| frontsector->floorpic == skyflatnum
+		|| P_SectorHasFloorPortal(frontsector)
 		|| (frontsector->heightsec != -1 && sectors[frontsector->heightsec].ceilingpic == skyflatnum))
 	{
 		floorplane = R_FindPlane(frontsector, frontsector->floorheight, frontsector->floorpic, floorlightlevel,
@@ -925,6 +930,7 @@ static void R_Subsector(size_t num)
 
 	if (P_GetSectorCeilingZAt(frontsector, viewx, viewy) > viewz
 		|| frontsector->ceilingpic == skyflatnum
+		|| P_SectorHasCeilingPortal(frontsector)
 		|| (frontsector->heightsec != -1 && sectors[frontsector->heightsec].floorpic == skyflatnum))
 	{
 		ceilingplane = R_FindPlane(frontsector, frontsector->ceilingheight, frontsector->ceilingpic,
diff --git a/src/r_plane.c b/src/r_plane.c
index d9051ae05e06bf1d1284713ea77607f27c58a91b..4695034bdb4bd99f4595a5b6127c404d6c9c3139 100644
--- a/src/r_plane.c
+++ b/src/r_plane.c
@@ -451,7 +451,7 @@ visplane_t *R_FindPlane(sector_t *sector, fixed_t height, INT32 picnum, INT32 li
 				&& check->plangle == plangle
 				&& check->slope == slope
 				&& check->polyobj == polyobj
-				&& check->portalsector == portalsector)
+				&& P_CompareSectorPortals(check->portalsector, portalsector))
 			{
 				return check;
 			}