diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg
index 934e60962ee6f9dac7fc2952a0814d3fc8159210..44da4134b646aea7c1b7ef278b835ffd7f27737f 100644
--- a/extras/conf/udb/Includes/SRB222_linedefs.cfg
+++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg
@@ -1757,31 +1757,29 @@ udmf
 			}
 			arg1
 			{
-				title = "Visibility";
+				title = "Alpha";
+				default = 255;
+			}
+			arg2
+			{
+				title = "Appearance";
 				type = 12;
 				enum
 				{
 					1 = "Don't render planes";
 					2 = "Don't render sides";
 					4 = "Render insides";
+					8 = "Render only insides";
+					16 = "No shadow";
+					32 = "Cut cyan flat pixels";
 				}
 			}
-			arg2
+			arg3
 			{
 				title = "Tangibility";
 				type = 12;
 				enum = "tangibility";
 			}
-			arg3
-			{
-				title = "Appearance";
-				type = 12;
-				enum
-				{
-					1 = "Translucent";
-					2 = "No shadow";
-				}
-			}
 		}
 
 		120
@@ -1931,31 +1929,29 @@ udmf
 			}
 			arg1
 			{
-				title = "Visibility";
+				title = "Alpha";
+				default = 255;
+			}
+			arg2
+			{
+				title = "Appearance";
 				type = 12;
 				enum
 				{
 					1 = "Don't render planes";
 					2 = "Don't render sides";
 					4 = "Render insides";
+					8 = "Render only insides";
+					16 = "No shadow";
+					32 = "Cut cyan flat pixels";
 				}
 			}
-			arg2
+			arg3
 			{
 				title = "Tangibility";
 				type = 12;
 				enum = "tangibility";
 			}
-			arg3
-			{
-				title = "Appearance";
-				type = 12;
-				enum
-				{
-					1 = "Translucent";
-					2 = "No shadow";
-				}
-			}
 			arg4
 			{
 				title = "Speed";
@@ -2011,14 +2007,8 @@ udmf
 			}
 			arg1
 			{
-				title = "Visibility";
-				type = 12;
-				enum
-				{
-					1 = "Don't render planes";
-					2 = "Don't render sides";
-					4 = "Don't render insides";
-				}
+				title = "Alpha";
+				default = 255;
 			}
 			arg2
 			{
@@ -2026,8 +2016,12 @@ udmf
 				type = 12;
 				enum
 				{
-					1 = "Translucent";
-					2 = "No shadow";
+					1 = "Don't render planes";
+					2 = "Don't render sides";
+					4 = "Don't render insides";
+					8 = "Render only insides";
+					16 = "No shadow";
+					32 = "Cut cyan flat pixels";
 				}
 			}
 		}
diff --git a/src/p_setup.c b/src/p_setup.c
index 2eec9820ac12f1798b752f909290c9e47e518ce1..c2df65397c0164d77541e3ffaf3a6409e2c210c8 100644
--- a/src/p_setup.c
+++ b/src/p_setup.c
@@ -3016,35 +3016,36 @@ static void P_ConvertBinaryMap(void)
 		case 105: //FOF: solid, invisible
 			lines[i].args[0] = lines[i].tag;
 
-			//Visibility
-			if (lines[i].special == 105)
-				lines[i].args[1] = TMFV_NOPLANES|TMFV_NOSIDES;
-			else if (lines[i].special == 104)
-				lines[i].args[1] = TMFV_NOSIDES;
-			else if (lines[i].special == 103)
-				lines[i].args[1] = TMFV_NOPLANES;
-
-			//Tangibility
-			if (lines[i].flags & ML_EFFECT1)
-				lines[i].args[2] |= TMFT_DONTBLOCKOTHERS;
-			if (lines[i].flags & ML_EFFECT2)
-				lines[i].args[2] |= TMFT_DONTBLOCKPLAYER;
-
-			//Translucency
+			//Alpha
 			if (lines[i].special == 102)
 			{
-				lines[i].args[3] |= TMFA_TRANSLUCENT;
 				if (lines[i].flags & ML_NOCLIMB)
-					lines[i].args[1] |= TMFV_TOGGLEINSIDES;
+					lines[i].args[2] |= TMFA_INSIDES;
 				if (sides[lines[i].sidenum[0]].toptexture > 0)
-					lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255;
+					lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture;
 				else
-					lines[i].alpha = FRACUNIT/2;
+					lines[i].args[1] = 128;
 			}
+			else
+				lines[i].args[1] = 255;
 
-			//Shadow?
+			//Appearance
+			if (lines[i].special == 105)
+				lines[i].args[2] = TMFA_NOPLANES|TMFA_NOSIDES;
+			else if (lines[i].special == 104)
+				lines[i].args[2] = TMFA_NOSIDES;
+			else if (lines[i].special == 103)
+				lines[i].args[2] = TMFA_NOPLANES;
 			if (lines[i].special != 100 && (lines[i].special != 104 || !(lines[i].flags & ML_NOCLIMB)))
-				lines[i].args[3] |= TMFA_NOSHADE;
+				lines[i].args[2] |= TMFA_NOSHADE;
+			if (lines[i].flags & ML_EFFECT6)
+				lines[i].args[2] |= TMFA_SPLAT;
+
+			//Tangibility
+			if (lines[i].flags & ML_EFFECT1)
+				lines[i].args[3] |= TMFT_DONTBLOCKOTHERS;
+			if (lines[i].flags & ML_EFFECT2)
+				lines[i].args[3] |= TMFT_DONTBLOCKPLAYER;
 
 			lines[i].special = 100;
 			break;
@@ -3098,40 +3099,41 @@ static void P_ConvertBinaryMap(void)
 		case 146: //FOF: only tangible from sides
 			lines[i].args[0] = lines[i].tag;
 
-			//Visibility
+			//Alpha
+			if (lines[i].special == 141 || lines[i].special == 142 || lines[i].special == 144 || lines[i].special == 145)
+			{
+				if (lines[i].flags & ML_NOCLIMB)
+					lines[i].args[2] |= TMFA_INSIDES;
+				if (sides[lines[i].sidenum[0]].toptexture > 0)
+					lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture;
+				else
+					lines[i].args[1] = 128;
+			}
+			else
+				lines[i].args[1] = 255;
+
+			//Appearance
 			if (lines[i].special == 142 || lines[i].special == 145)
-				lines[i].args[1] = TMFV_NOSIDES;
+				lines[i].args[2] = TMFA_NOSIDES;
 			else if (lines[i].special == 146)
-				lines[i].args[1] = TMFV_NOPLANES;
+				lines[i].args[2] = TMFA_NOPLANES;
+			if (lines[i].special != 146 && (lines[i].flags & ML_NOCLIMB))
+				lines[i].args[2] |= TMFA_NOSHADE;
+			if (lines[i].flags & ML_EFFECT6)
+				lines[i].args[2] |= TMFA_SPLAT;
 
 			//Tangibility
 			if (lines[i].special <= 142)
-				lines[i].args[2] |= TMFT_INTANGIBLEBOTTOM;
+				lines[i].args[3] |= TMFT_INTANGIBLEBOTTOM;
 			else if (lines[i].special <= 145)
-				lines[i].args[2] |= TMFT_INTANGIBLETOP;
+				lines[i].args[3] |= TMFT_INTANGIBLETOP;
 			else
-				lines[i].args[2] |= TMFT_INTANGIBLEBOTTOM|TMFT_INTANGIBLETOP;
+				lines[i].args[3] |= TMFT_INTANGIBLEBOTTOM|TMFT_INTANGIBLETOP;
 
 			if (lines[i].flags & ML_EFFECT1)
-				lines[i].args[2] |= TMFT_DONTBLOCKOTHERS;
+				lines[i].args[3] |= TMFT_DONTBLOCKOTHERS;
 			if (lines[i].flags & ML_EFFECT2)
-				lines[i].args[2] |= TMFT_DONTBLOCKPLAYER;
-
-			//Translucency
-			if (lines[i].special == 141 || lines[i].special == 142 || lines[i].special == 144 || lines[i].special == 145)
-			{
-				lines[i].args[3] |= TMFA_TRANSLUCENT;
-				if (lines[i].flags & ML_NOCLIMB)
-					lines[i].args[1] |= TMFV_TOGGLEINSIDES;
-				if (sides[lines[i].sidenum[0]].toptexture > 0)
-					lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255;
-				else
-					lines[i].alpha = FRACUNIT/2;
-			}
-
-			//Shadow?
-			if (lines[i].special != 146 && (lines[i].flags & ML_NOCLIMB))
-				lines[i].args[3] |= TMFA_NOSHADE;
+				lines[i].args[3] |= TMFT_DONTBLOCKPLAYER;
 
 			lines[i].special = 100;
 			break;
@@ -3227,33 +3229,34 @@ static void P_ConvertBinaryMap(void)
 		case 195: // FOF: Rising, intangible from bottom, translucent
 			lines[i].args[0] = lines[i].tag;
 
-			//Visibility
-			if (lines[i].special == 193)
-				lines[i].args[1] = TMFV_NOPLANES|TMFV_NOSIDES;
-			if (lines[i].special >= 194)
-				lines[i].args[1] = TMFV_TOGGLEINSIDES;
-
-			//Tangibility
-			if (lines[i].flags & ML_EFFECT1)
-				lines[i].args[2] |= TMFT_DONTBLOCKOTHERS;
-			if (lines[i].flags & ML_EFFECT2)
-				lines[i].args[2] |= TMFT_DONTBLOCKPLAYER;
-			if (lines[i].special >= 194)
-				lines[i].args[2] |= TMFT_INTANGIBLEBOTTOM;
-
 			//Translucency
 			if (lines[i].special == 192 || lines[i].special == 195)
 			{
-				lines[i].args[3] |= TMFA_TRANSLUCENT;
 				if (sides[lines[i].sidenum[0]].toptexture > 0)
-					lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255;
+					lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture;
 				else
-					lines[i].alpha = FRACUNIT/2;
+					lines[i].args[1] = 128;
 			}
+			else
+				lines[i].args[1] = 255;
 
-			//Shadow?
+			//Appearance
+			if (lines[i].special == 193)
+				lines[i].args[2] = TMFA_NOPLANES|TMFA_NOSIDES;
+			if (lines[i].special >= 194)
+				lines[i].args[2] = TMFA_INSIDES;
 			if (lines[i].special != 190 && (lines[i].special <= 193 || lines[i].flags & ML_NOCLIMB))
-				lines[i].args[3] |= TMFA_NOSHADE;
+				lines[i].args[2] |= TMFA_NOSHADE;
+			if (lines[i].flags & ML_EFFECT6)
+				lines[i].args[2] |= TMFA_SPLAT;
+
+			//Tangibility
+			if (lines[i].flags & ML_EFFECT1)
+				lines[i].args[3] |= TMFT_DONTBLOCKOTHERS;
+			if (lines[i].flags & ML_EFFECT2)
+				lines[i].args[3] |= TMFT_DONTBLOCKPLAYER;
+			if (lines[i].special >= 194)
+				lines[i].args[3] |= TMFT_INTANGIBLEBOTTOM;
 
 			//Speed
 			lines[i].args[4] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS;
@@ -3282,23 +3285,26 @@ static void P_ConvertBinaryMap(void)
 		case 222: //FOF: Intangible, sides only
 			lines[i].args[0] = lines[i].tag;
 
-			//Visibility
-			if (lines[i].special == 222)
-				lines[i].args[1] |= TMFV_NOPLANES;
-			if (lines[i].special == 221)
-				lines[i].args[1] |= TMFV_TOGGLEINSIDES;
-
-			//Appearance
+			//Alpha
 			if (lines[i].special == 221)
 			{
-				lines[i].args[2] |= TMFA_TRANSLUCENT;
 				if (sides[lines[i].sidenum[0]].toptexture > 0)
-					lines[i].alpha = (sides[lines[i].sidenum[0]].toptexture << FRACBITS)/255;
+					lines[i].args[1] = sides[lines[i].sidenum[0]].toptexture;
 				else
-					lines[i].alpha = FRACUNIT/2;
+					lines[i].args[1] = 128;
 			}
+			else
+				lines[i].args[1] = 255;
+
+			//Appearance
+			if (lines[i].special == 222)
+				lines[i].args[2] |= TMFA_NOPLANES;
+			if (lines[i].special != 221)
+				lines[i].args[2] |= TMFA_INSIDES;
 			if (lines[i].special != 220 && !(lines[i].flags & ML_NOCLIMB))
 				lines[i].args[2] |= TMFA_NOSHADE;
+			if (lines[i].flags & ML_EFFECT6)
+				lines[i].args[2] |= TMFA_SPLAT;
 
 			lines[i].special = 220;
             break;
diff --git a/src/p_spec.c b/src/p_spec.c
index 6373478b8f2baa23049fac2953b9294a9efbeebc..1c0a4ce9d8d9777d2c0d42a9ebce6b55a1378c21 100644
--- a/src/p_spec.c
+++ b/src/p_spec.c
@@ -6602,46 +6602,51 @@ void P_SpawnSpecials(boolean fromnetsave)
 			case 100: // FOF (solid)
 				ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL;
 
-				//Visibility settings
-				if (lines[i].args[1] & TMFV_NOPLANES)
+				//Appearance settings
+				if (lines[i].args[2] & TMFA_NOPLANES)
 					ffloorflags &= ~FF_RENDERPLANES;
-				if (lines[i].args[1] & TMFV_NOSIDES)
+				if (lines[i].args[2] & TMFA_NOSIDES)
 					ffloorflags &= ~FF_RENDERSIDES;
-				if (lines[i].args[1] & TMFV_TOGGLEINSIDES)
+				if (lines[i].args[2] & TMFA_INSIDES)
 				{
 					if (ffloorflags & FF_RENDERPLANES)
 						ffloorflags |= FF_BOTHPLANES;
 					if (ffloorflags & FF_RENDERSIDES)
 						ffloorflags |= FF_ALLSIDES;
 				}
+				if (lines[i].args[2] & TMFA_ONLYINSIDES)
+				{
+					if (ffloorflags & FF_RENDERPLANES)
+						ffloorflags |= FF_INVERTPLANES;
+					if (ffloorflags & FF_RENDERSIDES)
+						ffloorflags |= FF_INVERTSIDES;
+				}
+				if (lines[i].args[2] & TMFA_NOSHADE)
+					ffloorflags |= FF_NOSHADE;
+				if (lines[i].args[2] & TMFA_SPLAT)
+					ffloorflags |= FF_SPLAT;
 
 				//Tangibility settings
-				if (lines[i].args[2] & TMFT_INTANGIBLETOP)
+				if (lines[i].args[3] & TMFT_INTANGIBLETOP)
 					ffloorflags |= FF_REVERSEPLATFORM;
-				if (lines[i].args[2] & TMFT_INTANGIBLEBOTTOM)
+				if (lines[i].args[3] & TMFT_INTANGIBLEBOTTOM)
 					ffloorflags |= FF_PLATFORM;
-				if (lines[i].args[2] & TMFT_DONTBLOCKPLAYER)
+				if (lines[i].args[3] & TMFT_DONTBLOCKPLAYER)
 					ffloorflags &= ~FF_BLOCKPLAYER;
-				if (lines[i].args[2] & TMFT_DONTBLOCKOTHERS)
+				if (lines[i].args[3] & TMFT_DONTBLOCKOTHERS)
 					ffloorflags &= ~FF_BLOCKOTHERS;
 
-				//Appearance settings
-				if ((lines[i].args[3] & TMFA_TRANSLUCENT) && (ffloorflags & FF_RENDERALL)) //Translucent
-					ffloorflags |= FF_TRANSLUCENT;
-				if (lines[i].args[3] & TMFA_NOSHADE)
-					ffloorflags |= FF_NOSHADE;
-
 				//Cutting options
 				if (ffloorflags & FF_RENDERALL)
 				{
 					//If translucent or player can enter it, cut inner walls
-					if ((ffloorflags & FF_TRANSLUCENT) || (lines[i].args[2] & TMFT_VISIBLEFROMINSIDE))
+					if ((lines[i].args[1] < 255) || (lines[i].args[3] & TMFT_VISIBLEFROMINSIDE))
 						ffloorflags |= FF_CUTEXTRA|FF_EXTRA;
 					else
 						ffloorflags |= FF_CUTLEVEL;
 				}
 
-				P_AddFakeFloorsByLine(i, (ffloorflags & FF_TRANSLUCENT) ? (lines[i].alpha * 0xff) >> FRACBITS : 0xff, ffloorflags, secthinkers);
+				P_AddFakeFloorsByLine(i, lines[i].args[1], ffloorflags, secthinkers);
 				break;
 
 			case 120: // FOF (water)
@@ -6765,40 +6770,45 @@ void P_SpawnSpecials(boolean fromnetsave)
 
 				ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL;
 
-				//Visibility settings
-				if (lines[i].args[1] & TMFV_NOPLANES)
+				//Appearance settings
+				if (lines[i].args[2] & TMFA_NOPLANES)
 					ffloorflags &= ~FF_RENDERPLANES;
-				if (lines[i].args[1] & TMFV_NOSIDES)
+				if (lines[i].args[2] & TMFA_NOSIDES)
 					ffloorflags &= ~FF_RENDERSIDES;
-				if (lines[i].args[1] & TMFV_TOGGLEINSIDES)
+				if (lines[i].args[2] & TMFA_INSIDES)
 				{
 					if (ffloorflags & FF_RENDERPLANES)
 						ffloorflags |= FF_BOTHPLANES;
 					if (ffloorflags & FF_RENDERSIDES)
 						ffloorflags |= FF_ALLSIDES;
 				}
+				if (lines[i].args[2] & TMFA_ONLYINSIDES)
+				{
+					if (ffloorflags & FF_RENDERPLANES)
+						ffloorflags |= FF_INVERTPLANES;
+					if (ffloorflags & FF_RENDERSIDES)
+						ffloorflags |= FF_INVERTSIDES;
+				}
+				if (lines[i].args[2] & TMFA_NOSHADE)
+					ffloorflags |= FF_NOSHADE;
+				if (lines[i].args[2] & TMFA_SPLAT)
+					ffloorflags |= FF_SPLAT;
 
 				//Tangibility settings
-				if (lines[i].args[2] & TMFT_INTANGIBLETOP)
+				if (lines[i].args[3] & TMFT_INTANGIBLETOP)
 					ffloorflags |= FF_REVERSEPLATFORM;
-				if (lines[i].args[2] & TMFT_INTANGIBLEBOTTOM)
+				if (lines[i].args[3] & TMFT_INTANGIBLEBOTTOM)
 					ffloorflags |= FF_PLATFORM;
-				if (lines[i].args[2] & TMFT_DONTBLOCKPLAYER)
+				if (lines[i].args[3] & TMFT_DONTBLOCKPLAYER)
 					ffloorflags &= ~FF_BLOCKPLAYER;
-				if (lines[i].args[2] & TMFT_DONTBLOCKOTHERS)
+				if (lines[i].args[3] & TMFT_DONTBLOCKOTHERS)
 					ffloorflags &= ~FF_BLOCKOTHERS;
 
-				//Appearance settings
-				if ((lines[i].args[3] & TMFA_TRANSLUCENT) && (ffloorflags & FF_RENDERALL)) //Translucent
-					ffloorflags |= FF_TRANSLUCENT;
-				if (lines[i].args[3] & TMFA_NOSHADE)
-					ffloorflags |= FF_NOSHADE;
-
 				//Cutting options
 				if (ffloorflags & FF_RENDERALL)
 				{
 					//If translucent or player can enter it, cut inner walls
-					if ((ffloorflags & FF_TRANSLUCENT) || (lines[i].args[2] & TMFT_VISIBLEFROMINSIDE))
+					if ((lines[i].args[1] < 255) || (lines[i].args[3] & TMFT_VISIBLEFROMINSIDE))
 						ffloorflags |= FF_CUTEXTRA|FF_EXTRA;
 					else
 						ffloorflags |= FF_CUTLEVEL;
@@ -6827,24 +6837,29 @@ void P_SpawnSpecials(boolean fromnetsave)
 			case 220: //Intangible
 				ffloorflags = FF_EXISTS|FF_RENDERALL|FF_CUTEXTRA|FF_EXTRA|FF_CUTSPRITES;
 
-				//Visibility settings
-				if (lines[i].args[1] & TMFV_NOPLANES)
+				//Appearance settings
+				if (lines[i].args[2] & TMFA_NOPLANES)
 					ffloorflags &= ~FF_RENDERPLANES;
-				if (lines[i].args[1] & TMFV_NOSIDES)
+				if (lines[i].args[2] & TMFA_NOSIDES)
 					ffloorflags &= ~FF_RENDERSIDES;
-				if (!(lines[i].args[1] & TMFV_TOGGLEINSIDES))
+				if (!(lines[i].args[2] & TMFA_INSIDES))
 				{
 					if (ffloorflags & FF_RENDERPLANES)
 						ffloorflags |= FF_BOTHPLANES;
 					if (ffloorflags & FF_RENDERSIDES)
 						ffloorflags |= FF_ALLSIDES;
 				}
-
-				//Appearance settings
-				if ((lines[i].args[2] & TMFA_TRANSLUCENT) && (ffloorflags & FF_RENDERALL))
-					ffloorflags |= FF_TRANSLUCENT;
+				if (lines[i].args[2] & TMFA_ONLYINSIDES)
+				{
+					if (ffloorflags & FF_RENDERPLANES)
+						ffloorflags |= FF_INVERTPLANES;
+					if (ffloorflags & FF_RENDERSIDES)
+						ffloorflags |= FF_INVERTSIDES;
+				}
 				if (lines[i].args[2] & TMFA_NOSHADE)
 					ffloorflags |= FF_NOSHADE;
+				if (lines[i].args[2] & TMFA_SPLAT)
+					ffloorflags |= FF_SPLAT;
 
 				P_AddFakeFloorsByLine(i, (ffloorflags & FF_TRANSLUCENT) ? (lines[i].alpha * 0xff) >> FRACBITS : 0xff, ffloorflags, secthinkers);
 				break;
diff --git a/src/p_spec.h b/src/p_spec.h
index a5717e1d1e5a427d26fb8b5e71dfa25110535af7..52dcf6786b0c77e8b6b448ce64e8c5f8517476a0 100644
--- a/src/p_spec.h
+++ b/src/p_spec.h
@@ -24,10 +24,13 @@ extern mobj_t *skyboxcenterpnts[16]; // array of MT_SKYBOX centerpoint mobjs
 //FOF flags
 typedef enum
 {
-	TMFV_NOPLANES      = 1,
-	TMFV_NOSIDES       = 1<<1,
-	TMFV_TOGGLEINSIDES = 1<<2,
-} textmapfofvisibility_t;
+	TMFA_NOPLANES    = 1,
+	TMFA_NOSIDES     = 1<<1,
+	TMFA_INSIDES     = 1<<2,
+	TMFA_ONLYINSIDES = 1<<3,
+	TMFA_NOSHADE     = 1<<4,
+	TMFA_SPLAT       = 1<<5,
+} textmapfofappearance_t;
 
 typedef enum
 {
@@ -36,14 +39,9 @@ typedef enum
 	TMFT_DONTBLOCKPLAYER  = 1<<2,
 	TMFT_VISIBLEFROMINSIDE = (TMFT_INTANGIBLETOP|TMFT_INTANGIBLEBOTTOM|TMFT_DONTBLOCKPLAYER),
 	TMFT_DONTBLOCKOTHERS  = 1<<3,
+	TMFT_INTANGIBLE       = (TMFT_DONTBLOCKPLAYER|TMFT_DONTBLOCKOTHERS),
 } textmapfoftangibility_t;
 
-typedef enum
-{
-	TMFA_TRANSLUCENT = 1,
-	TMFA_NOSHADE     = 1<<1,
-} textmapfofappearance_t;
-
 typedef enum
 {
 	TMFW_NOSIDES      = 1,