diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg
index e8ec7de2b74f7e1d69defd544e9f3cde876f122e..e2e1d187ae047d23960b271d7e1aeac18785d671 100644
--- a/extras/conf/udb/Includes/SRB222_linedefs.cfg
+++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg
@@ -3677,6 +3677,43 @@ udmf
 				enum = "setadd";
 			}
 		}
+
+		469
+		{
+			title = "Change Tagged Sector's Gravity";
+			prefix = "(469)";
+			arg0
+			{
+				title = "Target sector tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Set/Multiply?";
+				type = 11;
+				enum
+				{
+					0 = "Set";
+					1 = "Multiply";
+				}
+			}
+			arg2
+			{
+				title = "Flip flag";
+				type = 11;
+				enum
+				{
+					0 = "Don't change";
+					1 = "Set";
+					2 = "Remove";
+				}
+			}
+			stringarg0
+			{
+				title = "Gravity value";
+				type = 2;
+			}
+		}
 	}
 
 	linedefexecplane
diff --git a/src/p_spec.c b/src/p_spec.c
index 6049214455a7d6612ab41f41d17c2afe8abe5c02..2e6094ef2c67526559e428b0c0e8b3a7c9b72718 100644
--- a/src/p_spec.c
+++ b/src/p_spec.c
@@ -3801,6 +3801,33 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
 		}
 		break;
 
+		case 469: // Change sector gravity
+		{
+			fixed_t gravityvalue;
+
+			if (!udmf)
+				break;
+
+			if (!line->stringargs[0])
+				break;
+
+			gravityvalue = FloatToFixed(atof(line->stringargs[0]));
+
+			TAG_ITER_SECTORS(line->args[0], secnum)
+			{
+				if (line->args[1])
+					sectors[secnum].gravity = FixedMul(sectors[secnum].gravity, gravityvalue);
+				else
+					sectors[secnum].gravity = gravityvalue;
+
+				if (line->args[2] == TMF_ADD)
+					sectors[secnum].flags |= MSF_GRAVITYFLIP;
+				else if (line->args[2] == TMF_REMOVE)
+					sectors[secnum].flags &= ~MSF_GRAVITYFLIP;
+			}
+		}
+		break;
+
 		case 480: // Polyobj_DoorSlide
 		case 481: // Polyobj_DoorSwing
 			PolyDoor(line);
@@ -6112,6 +6139,9 @@ void P_SpawnSpecials(boolean fromnetsave)
 			ffloortype_e ffloorflags;
 
 			case 1: // Definable gravity per sector
+				if (udmf)
+					break;
+
 				sec = sides[*lines[i].sidenum].sector - sectors;
 				TAG_ITER_SECTORS(tag, s)
 				{
diff --git a/src/p_spec.h b/src/p_spec.h
index 82f858a059f4977222b07319b7ab3baccf44c37a..c1f25b3d6ee3f98ab42e64383209956f721f37df 100644
--- a/src/p_spec.h
+++ b/src/p_spec.h
@@ -412,6 +412,13 @@ typedef enum
 	//TMP_FREEZETHINKERS = 1<<6,
 } textmappromptflags_t;
 
+typedef enum
+{
+	TMF_NOCHANGE = 0,
+	TMF_ADD      = 1,
+	TMF_REMOVE   = 2,
+} textmapsetflagflags_t;
+
 typedef enum
 {
 	TMSD_FRONT = 0,