diff --git a/src/lua_maplib.c b/src/lua_maplib.c
index 8ad66d04f4b26a67cd94302da4357899e0326587..8ce6551f7319b9c9179805fda2c181f945c0dab0 100644
--- a/src/lua_maplib.c
+++ b/src/lua_maplib.c
@@ -134,6 +134,7 @@ enum side_e {
 	side_toptexture,
 	side_bottomtexture,
 	side_midtexture,
+	side_line,
 	side_sector,
 	side_special,
 	side_repeatcnt,
@@ -869,6 +870,9 @@ static int side_get(lua_State *L)
 	case side_midtexture:
 		lua_pushinteger(L, side->midtexture);
 		return 1;
+	case side_line:
+		LUA_PushUserdata(L, side->line, META_LINE);
+		return 1;
 	case side_sector:
 		LUA_PushUserdata(L, side->sector, META_SECTOR);
 		return 1;
@@ -902,6 +906,7 @@ static int side_set(lua_State *L)
 	switch(field)
 	{
 	case side_valid: // valid
+	case side_line:
 	case side_sector:
 	case side_special:
 	case side_text:
diff --git a/src/p_setup.c b/src/p_setup.c
index 8d92c3e87594be936dad52593eeb7f912baea983..52c79e1ceee56e1fb36f7c037f11fbd7e1515d22 100644
--- a/src/p_setup.c
+++ b/src/p_setup.c
@@ -1008,10 +1008,18 @@ static void P_InitializeLinedef(line_t *ld)
 		CONS_Debug(DBG_SETUP, "P_InitializeLinedef: Linedef %s has two-sided flag set, but no second sidedef\n", sizeu1((size_t)(ld - lines)));
 	}
 
-	if (ld->sidenum[0] != 0xffff && ld->special)
+	if (ld->sidenum[0] != 0xffff)
+	{
 		sides[ld->sidenum[0]].special = ld->special;
-	if (ld->sidenum[1] != 0xffff && ld->special)
+		sides[ld->sidenum[0]].line = ld;
+
+	}
+	if (ld->sidenum[1] != 0xffff)
+	{
 		sides[ld->sidenum[1]].special = ld->special;
+		sides[ld->sidenum[1]].line = ld;
+
+	}
 }
 
 static void P_LoadLinedefs(UINT8 *data)
@@ -1044,6 +1052,7 @@ static void P_LoadSidedefs(UINT8 *data)
 	for (i = 0; i < numsides; i++, sd++, msd++)
 	{
 		UINT16 sector_num;
+		boolean isfrontside = !sd->line || sd->line->sidenum[0] == i;
 
 		sd->textureoffset = SHORT(msd->textureoffset)<<FRACBITS;
 		sd->rowoffset = SHORT(msd->rowoffset)<<FRACBITS;
@@ -1092,9 +1101,8 @@ static void P_LoadSidedefs(UINT8 *data)
 					sd->midtexture = get_number(process);
 				}
 
-				// always process if back sidedef, because we need that - symbol
  				sd->text = Z_Malloc(7, PU_LEVEL, NULL);
-				if (i == 1 || msd->toptexture[0] != '-' || msd->toptexture[1] != '\0')
+				if (isfrontside && !(msd->toptexture[0] == '-' && msd->toptexture[1] == '\0'))
 				{
 					M_Memcpy(process,msd->toptexture,8);
 					process[8] = '\0';
diff --git a/src/r_defs.h b/src/r_defs.h
index 353dc572b6e6422337869b1871aa7ca674f05273..4cb02f4f5c5b05d6ba3ce0f97d3e0eda3535cdc4 100644
--- a/src/r_defs.h
+++ b/src/r_defs.h
@@ -436,14 +436,10 @@ typedef struct line_s
 	polyobj_t *polyobj; // Belongs to a polyobject?
 #endif
 
-	char *text; // a concatination of all front and back texture names, for linedef specials that require a string.
+	char *text; // a concatenation of all front and back texture names, for linedef specials that require a string.
 	INT16 callcount; // no. of calls left before triggering, for the "X calls" linedef specials, defaults to 0
 } line_t;
 
-//
-// The SideDef.
-//
-
 typedef struct
 {
 	// add this to the calculated texture column
@@ -456,13 +452,16 @@ typedef struct
 	// We do not maintain names here.
 	INT32 toptexture, bottomtexture, midtexture;
 
-	// Sector the SideDef is facing.
+	// Linedef the sidedef belongs to
+	line_t *line;
+
+	// Sector the sidedef is facing.
 	sector_t *sector;
 
 	INT16 special; // the special of the linedef this side belongs to
 	INT16 repeatcnt; // # of times to repeat midtexture
 
-	char *text; // a concatination of all top, bottom, and mid texture names, for linedef specials that require a string.
+	char *text; // a concatenation of all top, bottom, and mid texture names, for linedef specials that require a string.
 
 	extracolormap_t *colormap_data; // storage for colormaps; not applied to sectors.
 } side_t;