diff --git a/extras/conf/udb/Includes/SRB222_common.cfg b/extras/conf/udb/Includes/SRB222_common.cfg
index b06b7bad7f43e43fe4cbb6549e289f4912561f9c..0b35ec17c54e2001af2bd8b1c62b9726087a8b2c 100644
--- a/extras/conf/udb/Includes/SRB222_common.cfg
+++ b/extras/conf/udb/Includes/SRB222_common.cfg
@@ -246,7 +246,7 @@ mapformat_udmf
 		include("SRB222_misc.cfg", "sectorbrightness");
 	}
 
-	damagetypes = "Generic Water Fire Electric Spike DeathPitTilt DeathPitNoTilt Instakill SpecialStage";
+	damagetypes = "Generic Water Fire Lava Electric Spike DeathPitTilt DeathPitNoTilt Instakill SpecialStage";
 
 	// LINEDEF FLAGS
 	linedefflags
diff --git a/src/deh_tables.c b/src/deh_tables.c
index bc3368e06706ed19fa7f512af6773b01cd1bdf5d..52718cc8b851c41d7d04748c44cc7a66cb46e37d 100644
--- a/src/deh_tables.c
+++ b/src/deh_tables.c
@@ -4515,6 +4515,7 @@ const char *const SD_LIST[] = {
 	"GENERIC",
 	"WATER",
 	"FIRE",
+	"LAVA",
 	"ELECTRIC",
 	"SPIKE",
 	"DEATHPITTILT",
diff --git a/src/p_map.c b/src/p_map.c
index c3271c10e02e2bc337b68a7f91e07059c913fc51..72775e5e6638d1ab4782fa256b64e09abcc11313 100644
--- a/src/p_map.c
+++ b/src/p_map.c
@@ -3594,10 +3594,7 @@ static void P_CheckLavaWall(mobj_t *mo, sector_t *sec)
 		if (!(rover->flags & FF_SWIMMABLE))
 			continue;
 
-		if (rover->master->frontsector->damagetype != SD_FIRE)
-			continue;
-
-		if (rover->master->flags & ML_BLOCKMONSTERS)
+		if (rover->master->frontsector->damagetype != SD_LAVA)
 			continue;
 
 		topheight = P_GetFFloorTopZAt(rover, mo->x, mo->y);
diff --git a/src/p_mobj.c b/src/p_mobj.c
index 57ff8d4f1414ddc204cce9e52dd68be1a80c0302..753d298a4573c6a48ee7467c1f219826ffba031d 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -2334,11 +2334,7 @@ boolean P_CheckDeathPitCollide(mobj_t *mo)
 
 boolean P_CheckSolidLava(ffloor_t *rover)
 {
-	if (rover->flags & FF_SWIMMABLE && rover->master->frontsector->damagetype == SD_FIRE
-		&& !(rover->master->flags & ML_BLOCKMONSTERS))
-			return true;
-
-	return false;
+	return (rover->flags & FF_SWIMMABLE) && (rover->master->frontsector->damagetype == SD_LAVA);
 }
 
 //
@@ -3305,7 +3301,7 @@ void P_MobjCheckWater(mobj_t *mobj)
 
 		if (mobj->eflags & (MFE_TOUCHWATER|MFE_UNDERWATER))
 		{
-			if (rover->master->frontsector->damagetype == SD_FIRE)
+			if (rover->master->frontsector->damagetype == SD_FIRE || rover->master->frontsector->damagetype == SD_LAVA)
 				mobj->eflags |= MFE_TOUCHLAVA;
 
 			if (rover->flags & FF_GOOWATER && !(mobj->flags & MF_NOGRAVITY))
@@ -4096,9 +4092,11 @@ static void P_KillRingsInLava(mobj_t *mo)
 			{
 				if (!(rover->flags & FF_EXISTS)) continue; // fof must be real
 
-				if (!(rover->flags & FF_SWIMMABLE // fof must be water
-					&& rover->master->frontsector->damagetype == SD_FIRE)) // fof must be lava water
-					continue;
+				if (!(rover->flags & FF_SWIMMABLE))
+					continue; // fof must be water
+
+				if (rover->master->frontsector->damagetype != SD_FIRE && rover->master->frontsector->damagetype != SD_LAVA)
+					continue;  // fof must have fire or lava damage
 
 				// find heights of FOF
 				topheight = P_GetFOFTopZ(mo, node->m_sector, rover, mo->x, mo->y, NULL);
diff --git a/src/p_setup.c b/src/p_setup.c
index 6fac64568bf56c7d10b283d75949948263cce677..b7afe6fb460b26036b75ef8d0216fa2f28b943b8 100644
--- a/src/p_setup.c
+++ b/src/p_setup.c
@@ -1735,6 +1735,8 @@ static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val)
 			sectors[i].damagetype = SD_WATER;
 		if (fastcmp(val, "Fire"))
 			sectors[i].damagetype = SD_FIRE;
+		if (fastcmp(val, "Lava"))
+			sectors[i].damagetype = SD_LAVA;
 		if (fastcmp(val, "Electric"))
 			sectors[i].damagetype = SD_ELECTRIC;
 		if (fastcmp(val, "Spike"))
@@ -5105,8 +5107,29 @@ static void P_ConvertBinaryMap(void)
 				sectors[i].damagetype = SD_WATER;
 				break;
 			case 3: //Damage (Fire)
-				sectors[i].damagetype = SD_FIRE;
+			{
+				size_t j;
+				boolean isLava = false;
+
+				for (j = 0; j < sectors[i].linecount; j++)
+				{
+					line_t *line = sectors[i].lines[j];
+
+					if (line->frontsector != &sectors[i])
+						continue;
+
+					if (line->flags & ML_BLOCKMONSTERS)
+						continue;
+
+					if (line->special == 120 || (line->special == 259 && (line->args[2] & FF_SWIMMABLE)))
+					{
+						isLava = true;
+						break;
+					}
+				}
+				sectors[i].damagetype = isLava ? SD_LAVA : SD_FIRE;
 				break;
+			}
 			case 4: //Damage (Electric)
 				sectors[i].damagetype = SD_ELECTRIC;
 				break;
diff --git a/src/p_spec.c b/src/p_spec.c
index 973c6ee3ce8e7180454b770616d1f8ed5d9d74ed..e6b1e4ec5ad163f31b77ed54f9f160e4d5be1002 100644
--- a/src/p_spec.c
+++ b/src/p_spec.c
@@ -5010,6 +5010,7 @@ static void P_EvaluateDamageType(player_t *player, sector_t *sector, boolean isT
 				P_DamageMobj(player->mo, NULL, NULL, 1, DMG_WATER);
 			break;
 		case SD_FIRE:
+		case SD_LAVA:
 			if (isTouching)
 				P_DamageMobj(player->mo, NULL, NULL, 1, DMG_FIRE);
 			break;
diff --git a/src/p_user.c b/src/p_user.c
index 7360d2ef91724594c3e50afdef94df4937f63f6b..254bcc65ef51910ebe482d0f0452e86bd976a75b 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -12230,7 +12230,10 @@ static boolean P_MobjAboveLava(mobj_t *mobj)
 
 		for (rover = sector->ffloors; rover; rover = rover->next)
 		{
-			if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_SWIMMABLE) || rover->master->frontsector->damagetype != SD_FIRE)
+			if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_SWIMMABLE))
+				continue;
+
+			if (rover->master->frontsector->damagetype != SD_FIRE && rover->master->frontsector->damagetype != SD_LAVA)
 				continue;
 
 			if (mobj->eflags & MFE_VERTICALFLIP)
diff --git a/src/r_defs.h b/src/r_defs.h
index cd632aecabf285adc856273c8ee2c47b048baddc..c56abdbfdf79d7a34e33708267b4adea36781d5b 100644
--- a/src/r_defs.h
+++ b/src/r_defs.h
@@ -321,12 +321,13 @@ typedef enum
 	SD_GENERIC = 1,
 	SD_WATER = 2,
 	SD_FIRE = 3,
-	SD_ELECTRIC = 4,
-	SD_SPIKE = 5,
-	SD_DEATHPITTILT = 6,
-	SD_DEATHPITNOTILT = 7,
-	SD_INSTAKILL = 8,
-	SD_SPECIALSTAGE = 9,
+	SD_LAVA = 4,
+	SD_ELECTRIC = 5,
+	SD_SPIKE = 6,
+	SD_DEATHPITTILT = 7,
+	SD_DEATHPITNOTILT = 8,
+	SD_INSTAKILL = 9,
+	SD_SPECIALSTAGE = 10,
 } sectordamage_t;
 
 typedef enum