diff --git a/src/p_setup.c b/src/p_setup.c
index 05356ac02a19e19e29937fda5ed2a9667c4eada1..c3b50b95d8460423559a65513f81a35c3f2df6e5 100644
--- a/src/p_setup.c
+++ b/src/p_setup.c
@@ -2678,6 +2678,48 @@ static void P_ConvertBinaryMap(void)
 			lines[i].special = 700;
 			break;
 		}
+		case 704: //Slope front sector floor by 3 tagged vertices
+		case 705: //Slope front sector ceiling by 3 tagged vertices
+		case 714: //Slope back sector floor by 3 tagged vertices
+		case 715: //Slope back sector ceiling  by 3 tagged vertices
+		{
+			if (lines[i].special == 704)
+				lines[i].args[0] = 0;
+			else if (lines[i].special == 705)
+				lines[i].args[0] = 1;
+			else if (lines[i].special == 714)
+				lines[i].args[0] = 2;
+			else if (lines[i].special == 715)
+				lines[i].args[0] = 3;
+
+			lines[i].args[1] = lines[i].tag;
+
+			if (lines[i].flags & ML_EFFECT6)
+			{
+				UINT8 side = lines[i].special >= 714;
+
+				if (side == 1 && lines[i].sidenum[1] == 0xffff)
+					CONS_Debug(DBG_GAMELOGIC, "P_ConvertBinaryMap: Line special %d (line #%s) missing 2nd side!\n", lines[i].special, sizeu1(i));
+				else
+				{
+					lines[i].args[2] = sides[lines[i].sidenum[side]].textureoffset >> FRACBITS;
+					lines[i].args[3] = sides[lines[i].sidenum[side]].rowoffset >> FRACBITS;
+				}
+			}
+			else
+			{
+				lines[i].args[2] = lines[i].args[1];
+				lines[i].args[3] = lines[i].args[1];
+			}
+
+			if (lines[i].flags & ML_NETONLY)
+				lines[i].args[4] |= SL_NOPHYSICS;
+			if (lines[i].flags & ML_NONET)
+				lines[i].args[4] |= SL_DYNAMIC;
+
+			lines[i].special = 704;
+			break;
+		}
 		default:
 			break;
 		}
diff --git a/src/p_slopes.c b/src/p_slopes.c
index 6c87d4aefc9c455333f2306e03bb97131ecf92bc..28ff96c50d49f04701a2dc0bbedd7134e5420c4e 100644
--- a/src/p_slopes.c
+++ b/src/p_slopes.c
@@ -458,44 +458,32 @@ static void line_SpawnViaVertexes(const int linenum, const boolean spawnthinker)
 	line_t *line = lines + linenum;
 	side_t *side;
 	pslope_t **slopetoset;
-	UINT16 tag1, tag2, tag3;
+	UINT16 tag1 = line->args[1];
+	UINT16 tag2 = line->args[2];
+	UINT16 tag3 = line->args[3];
+	UINT8 flags = line->args[4];
 
-	UINT8 flags = 0;
-	if (line->flags & ML_NETONLY)
-		flags |= SL_NOPHYSICS;
-	if (line->flags & ML_NONET)
-		flags |= SL_DYNAMIC;
-
-	switch(line->special)
+	switch(line->args[0])
 	{
-	case 704:
+	case 0:
 		slopetoset = &line->frontsector->f_slope;
 		side = &sides[line->sidenum[0]];
 		break;
-	case 705:
+	case 1:
 		slopetoset = &line->frontsector->c_slope;
 		side = &sides[line->sidenum[0]];
 		break;
-	case 714:
+	case 2:
 		slopetoset = &line->backsector->f_slope;
 		side = &sides[line->sidenum[1]];
 		break;
-	case 715:
+	case 3:
 		slopetoset = &line->backsector->c_slope;
 		side = &sides[line->sidenum[1]];
 	default:
 		return;
 	}
 
-	if (line->flags & ML_EFFECT6)
-	{
-		tag1 = line->tag;
-		tag2 = side->textureoffset >> FRACBITS;
-		tag3 = side->rowoffset >> FRACBITS;
-	}
-	else
-		tag1 = tag2 = tag3 = line->tag;
-
 	*slopetoset = MakeViaMapthings(tag1, tag2, tag3, flags, spawnthinker);
 
 	side->sector->hasslope = true;
@@ -561,9 +549,6 @@ void P_ResetDynamicSlopes(const boolean fromsave) {
 				break;
 
 			case 704:
-			case 705:
-			case 714:
-			case 715:
 				line_SpawnViaVertexes(i, !fromsave);
 				break;