diff --git a/src/p_saveg.c b/src/p_saveg.c
index 80b1119469882e4158bc74f04d3161dcbc1b948b..bf685650657b6c2351b6893a158d8632c9f1aa2c 100644
--- a/src/p_saveg.c
+++ b/src/p_saveg.c
@@ -4766,6 +4766,8 @@ static void P_NetArchiveSectorPortals(void)
 		UINT8 type = secportals[i].type;
 
 		WRITEUINT8(save_p, type);
+		WRITEFIXED(save_p, secportals[i].origin.x);
+		WRITEFIXED(save_p, secportals[i].origin.y);
 
 		switch (type)
 		{
@@ -4808,6 +4810,8 @@ static void P_NetUnArchiveSectorPortals(void)
 		sectorportal_t *secportal = &secportals[id];
 
 		secportal->type = READUINT8(save_p);
+		secportal->origin.x = READFIXED(save_p);
+		secportal->origin.y = READFIXED(save_p);
 
 		switch (secportal->type)
 		{
diff --git a/src/p_spec.c b/src/p_spec.c
index e1dd6bcec72efa5613a352c47c5a49329d2cf6eb..ed745f1fb8443c9c7db1981e45890d49feaa9bda 100644
--- a/src/p_spec.c
+++ b/src/p_spec.c
@@ -6325,30 +6325,35 @@ static void P_DoPortalCopyFromLine(sector_t *dest_sector, int plane_type, int ta
 	}
 }
 
-static sectorportal_t *P_SectorGetFloorPortalOrCreate(sector_t *sector, UINT32 *result)
+static sectorportal_t *P_SectorGetPortalOrCreate(sector_t *sector, UINT32 *num, UINT32 *result)
 {
-	*result = sector->portal_floor;
+	sectorportal_t *secportal = NULL;
 
-	if (*result >= secportalcount)
+	if (*num >= secportalcount)
+	{
+		*num = P_NewSectorPortal();
+		secportal = &secportals[*num];
+		secportal->origin.x = sector->soundorg.x;
+		secportal->origin.y = sector->soundorg.y;
+		*result = *num;
+	}
+	else
 	{
-		*result = P_NewSectorPortal();
-		sector->portal_floor = *result;
+		*result = *num;
+		secportal = &secportals[*num];
 	}
 
-	return &secportals[sector->portal_floor];
+	return secportal;
 }
 
-static sectorportal_t *P_SectorGetCeilingPortalOrCreate(sector_t *sector, UINT32 *result)
+static sectorportal_t *P_SectorGetFloorPortalOrCreate(sector_t *sector, UINT32 *result)
 {
-	*result = sector->portal_floor;
-
-	if (*result >= secportalcount)
-	{
-		*result = P_NewSectorPortal();
-		sector->portal_ceiling = *result;
-	}
+	return P_SectorGetPortalOrCreate(sector, &sector->portal_floor, result);
+}
 
-	return &secportals[sector->portal_ceiling];
+static sectorportal_t *P_SectorGetCeilingPortalOrCreate(sector_t *sector, UINT32 *result)
+{
+	return P_SectorGetPortalOrCreate(sector, &sector->portal_ceiling, result);
 }
 
 static void P_CopySectorPortalToLines(UINT32 portal_num, int sector_tag)
diff --git a/src/r_bsp.c b/src/r_bsp.c
index 4bb0e290cc627fd11403cdbe17cf2cd7f67a73a8..b845e0d145ab1afce6b44b945340e4f101794877 100644
--- a/src/r_bsp.c
+++ b/src/r_bsp.c
@@ -489,7 +489,7 @@ static void R_AddLine(seg_t *line)
 	{
 		if (portalrender < cv_maxportals.value)
 		{
-			Portal_AddTransferred(line->linedef-lines, line->linedef->secportal, x1, x2);
+			Portal_AddTransferred(line->linedef->secportal, x1, x2);
 			goto clipsolid;
 		}
 	}
diff --git a/src/r_defs.h b/src/r_defs.h
index 865776146f5d140b4c458b6b9d6795195fd254ae..d9bc72d1d84a2e44cbb2297ade4060874bac0047 100644
--- a/src/r_defs.h
+++ b/src/r_defs.h
@@ -231,6 +231,9 @@ typedef struct sectorportal_s
 		struct sector_s *sector;
 		struct mobj_s *mobj;
 	};
+	struct {
+		fixed_t x, y;
+	} origin;
 } sectorportal_t;
 
 typedef struct ffloor_s
diff --git a/src/r_portal.c b/src/r_portal.c
index f66424ab6e7e6dab87244b32da6ee8ada3b58b8f..bb40b2c8013cff8e08fa1b22ae977b04cb455bc2 100644
--- a/src/r_portal.c
+++ b/src/r_portal.c
@@ -323,7 +323,7 @@ void Portal_AddSkybox (const visplane_t* plane)
 	Portal_GetViewpointForSkybox(portal);
 }
 
-static void Portal_GetViewpointForSecPortal(portal_t *portal, sectorportal_t *secportal, fixed_t origin_x, fixed_t origin_y)
+static void Portal_GetViewpointForSecPortal(portal_t *portal, sectorportal_t *secportal)
 {
 	fixed_t x, y, z, angle;
 
@@ -368,8 +368,8 @@ static void Portal_GetViewpointForSecPortal(portal_t *portal, sectorportal_t *se
 		return;
 	}
 
-	fixed_t refx = origin_x - viewx;
-	fixed_t refy = origin_y - viewy;
+	fixed_t refx = secportal->origin.x - viewx;
+	fixed_t refy = secportal->origin.y - viewy;
 
 	// Rotate the X/Y to match the target angle
 	if (angle != 0)
@@ -411,12 +411,12 @@ void Portal_AddSectorPortal (const visplane_t* plane)
 	portal->is_horizon = false;
 	portal->horizon_sector = NULL;
 
-	Portal_GetViewpointForSecPortal(portal, secportal, plane->sector->soundorg.x, plane->sector->soundorg.y);
+	Portal_GetViewpointForSecPortal(portal, secportal);
 }
 
 /** Creates a transferred sector portal.
  */
-void Portal_AddTransferred (const INT32 linenum, UINT32 secportalnum, const INT32 x1, const INT32 x2)
+void Portal_AddTransferred (UINT32 secportalnum, const INT32 x1, const INT32 x2)
 {
 	if (secportalnum >= secportalcount)
 		return;
@@ -433,12 +433,7 @@ void Portal_AddTransferred (const INT32 linenum, UINT32 secportalnum, const INT3
 	if (secportal->type == SECPORTAL_SKYBOX)
 		Portal_GetViewpointForSkybox(portal);
 	else
-	{
-		line_t *line = &lines[linenum];
-		fixed_t refx = (line->v1->x + line->v2->x) / 2;
-		fixed_t refy = (line->v1->y + line->v2->y) / 2;
-		Portal_GetViewpointForSecPortal(portal, secportal, refx, refy);
-	}
+		Portal_GetViewpointForSecPortal(portal, secportal);
 
 	if (secportal->type == SECPORTAL_LINE)
 		portal->clipline = secportal->line.dest - lines;
diff --git a/src/r_portal.h b/src/r_portal.h
index 7e0f63fe10765424164f7a31a68fd12a12ac3c1a..69ecb8d7fcd46d70a2c5807561abe3d8b2cbae30 100644
--- a/src/r_portal.h
+++ b/src/r_portal.h
@@ -58,7 +58,7 @@ void Portal_Remove			(portal_t* portal);
 void Portal_Add2Lines		(const INT32 line1, const INT32 line2, const INT32 x1, const INT32 x2);
 void Portal_AddSkybox		(const visplane_t* plane);
 void Portal_AddSectorPortal	(const visplane_t* plane);
-void Portal_AddTransferred	(const INT32 linenum, UINT32 secportalnum, const INT32 x1, const INT32 x2);
+void Portal_AddTransferred	(UINT32 secportalnum, const INT32 x1, const INT32 x2);
 
 void Portal_ClipRange (portal_t* portal);
 void Portal_ClipApply (const portal_t* portal);