diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg
index 4139fa967a3fa59ec5cb9dcebaa3e8a18a55f67a..36518be9f52b3eb9b0673885f86a605ed700586f 100644
--- a/extras/conf/udb/Includes/SRB222_misc.cfg
+++ b/extras/conf/udb/Includes/SRB222_misc.cfg
@@ -79,6 +79,7 @@ sectorflags
 	triggerspecial_touch = "Trigger on Edge Touch";
 	triggerspecial_headbump = "Trigger on Headbump";
 	invertprecip = "Invert Precipitation";
+	gravityflip = "Flip Objects in Reverse Gravity";
 	heatwave = "Heat Wave";
 }
 
diff --git a/src/deh_lua.c b/src/deh_lua.c
index 28030052a86eacdda0a1c89a78b8cb9eade97a48..e360febaf2269c36f8cd736e3f86e5a347faf5db 100644
--- a/src/deh_lua.c
+++ b/src/deh_lua.c
@@ -340,7 +340,7 @@ static inline int lib_getenum(lua_State *L)
 	}
 	else if (fastncmp("MSF_", word, 3)) {
 		p = word + 4;
-		for (i = 0; i < 5; i++)
+		for (i = 0; i < 6; i++)
 			if (MSF_LIST[i] && fastcmp(p, MSF_LIST[i])) {
 				lua_pushinteger(L, ((lua_Integer)1 << i));
 				return 1;
diff --git a/src/deh_tables.c b/src/deh_tables.c
index b6a9e02254ff422c5b457dd5f372e2cb34cb3279..095aae0f266104de92bc2bbe5bd2ff1381ba30f0 100644
--- a/src/deh_tables.c
+++ b/src/deh_tables.c
@@ -4472,11 +4472,12 @@ const char *const ML_LIST[16] = {
 };
 
 // Sector flags
-const char *const MSF_LIST[5] = {
+const char *const MSF_LIST[6] = {
 	"FLIPSPECIAL_FLOOR",
 	"FLIPSPECIAL_CEILING",
 	"TRIGGERSPECIAL_TOUCH",
 	"TRIGGERSPECIAL_HEADBUMP",
+	"GRAVITYFLIP",
 	"HEATWAVE",
 };
 
diff --git a/src/deh_tables.h b/src/deh_tables.h
index 982c6ff4a3dccb4985b0bef5ba80714aab73c34b..2e514a5b15c624f224d01ab8cf3a3c172cb20ecf 100644
--- a/src/deh_tables.h
+++ b/src/deh_tables.h
@@ -65,7 +65,7 @@ extern const char *const MAPTHINGFLAG_LIST[4];
 extern const char *const PLAYERFLAG_LIST[];
 extern const char *const GAMETYPERULE_LIST[];
 extern const char *const ML_LIST[16]; // Linedef flags
-extern const char* const MSF_LIST[5]; // Sector flags
+extern const char* const MSF_LIST[6]; // Sector flags
 extern const char *COLOR_ENUMS[];
 extern const char *const POWERS_LIST[];
 extern const char *const HUDITEMS_LIST[];
diff --git a/src/lua_maplib.c b/src/lua_maplib.c
index 0a147acbb3560816adfbf7e97192dc8e871c270a..74f45535f8b0730eee8208329894ce15a6c264ca 100644
--- a/src/lua_maplib.c
+++ b/src/lua_maplib.c
@@ -753,6 +753,7 @@ static int sector_set(lua_State *L)
 		return LUA_ErrSetDirectly(L, "sector_t", "taglist");
 	case sector_flags:
 		sector->flags = luaL_checkinteger(L, 3);
+		CheckForReverseGravity |= (sector->flags & MSF_GRAVITYFLIP);
 		break;
 	case sector_gravity:
 		sector->gravity = luaL_checkfixed(L, 3);
diff --git a/src/p_mobj.c b/src/p_mobj.c
index aea7964beffb3c4751d475bc84d7caf9842ea874..bdfee2616a1d1024a50297bfe010a661ec3d7a57 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -1463,7 +1463,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo)
 
 			gravityadd = -FixedMul(gravity, gravfactor);
 
-			if (rover->master->frontsector->verticalflip && gravityadd > 0)
+			if ((rover->master->frontsector->flags & MSF_GRAVITYFLIP) && gravityadd > 0)
 				mo->eflags |= MFE_VERTICALFLIP;
 
 			no3dfloorgrav = false;
@@ -1475,7 +1475,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo)
 	{
 		gravityadd = -FixedMul(gravity, P_GetSectorGravityFactor(mo->subsector->sector));
 
-		if (mo->subsector->sector->verticalflip && gravityadd > 0)
+		if ((mo->subsector->sector->flags & MSF_GRAVITYFLIP) && gravityadd > 0)
 			mo->eflags |= MFE_VERTICALFLIP;
 	}
 
diff --git a/src/p_saveg.c b/src/p_saveg.c
index 66df83603b3646ca6976d8f3088b1ef6ba936ff5..d7a9750b774623719493c2a5dcd8ba4ee8505bbc 100644
--- a/src/p_saveg.c
+++ b/src/p_saveg.c
@@ -1213,7 +1213,10 @@ static void UnArchiveSectors(void)
 			sectors[i].ceilinglightabsolute = READUINT8(save_p);
 		}
 		if (diff3 & SD_FLAG)
+		{
 			sectors[i].flags = READUINT32(save_p);
+			CheckForReverseGravity |= (sectors[i].flags & MSF_GRAVITYFLIP);
+		}
 		if (diff3 & SD_GRAVITY)
 			sectors[i].gravity = READFIXED(save_p);
 
diff --git a/src/p_setup.c b/src/p_setup.c
index 2bcde2b92f921c5e9fc3320474c5df69e67823d5..70c6276d0afb1f654f71eee77c1fff80ac39fe24 100644
--- a/src/p_setup.c
+++ b/src/p_setup.c
@@ -1000,7 +1000,6 @@ static void P_InitializeSector(sector_t *ss)
 	ss->extra_colormap = NULL;
 
 	ss->gravityptr = NULL;
-	ss->verticalflip = false;
 
 	ss->cullheight = NULL;
 
@@ -1674,6 +1673,8 @@ static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val)
 		sectors[i].flags |= MSF_TRIGGERSPECIAL_HEADBUMP;
 	else if (fastcmp(param, "invertprecip") && fastcmp("true", val))
 		sectors[i].flags |= MSF_INVERTPRECIP;
+	else if (fastcmp(param, "gravityflip") && fastcmp("true", val))
+		sectors[i].flags |= MSF_GRAVITYFLIP;
 	else if (fastcmp(param, "heatwave") && fastcmp("true", val))
 		sectors[i].flags |= MSF_HEATWAVE;
 	else if (fastcmp(param, "friction"))
diff --git a/src/p_spec.c b/src/p_spec.c
index 846ce937690003dea80f3f0dfcd1bc8c57dc48dd..6049214455a7d6612ab41f41d17c2afe8abe5c02 100644
--- a/src/p_spec.c
+++ b/src/p_spec.c
@@ -5994,6 +5994,8 @@ void P_SpawnSpecials(boolean fromnetsave)
 	sector = sectors;
 	for (i = 0; i < numsectors; i++, sector++)
 	{
+		CheckForReverseGravity |= (sector->flags & MSF_GRAVITYFLIP);
+
 		if (!sector->special)
 			continue;
 
@@ -6116,11 +6118,11 @@ void P_SpawnSpecials(boolean fromnetsave)
 					sectors[s].gravityptr = &sectors[sec].floorheight; // This allows it to change in realtime!
 
 					if (lines[i].flags & ML_NOCLIMB)
-						sectors[s].verticalflip = true;
+						sectors[s].flags |= MSF_GRAVITYFLIP;
 					else
-						sectors[s].verticalflip = false;
+						sectors[s].flags &= ~MSF_GRAVITYFLIP;
 
-					CheckForReverseGravity = sectors[s].verticalflip;
+					CheckForReverseGravity |= (sectors[s].flags & MSF_GRAVITYFLIP);
 				}
 				break;
 
diff --git a/src/r_defs.h b/src/r_defs.h
index 0fd13b70773aa5d653a6a2f3969813f9aab456bd..c565473dd0fee089809c34e1715ea95358c81b1a 100644
--- a/src/r_defs.h
+++ b/src/r_defs.h
@@ -284,7 +284,8 @@ typedef enum
 	MSF_TRIGGERSPECIAL_HEADBUMP =  1<<3,
 	// invertprecip - inverts presence of precipitation
 	MSF_INVERTPRECIP            =  1<<4,
-	MSF_HEATWAVE                =  1<<5, // heat wave effect
+	MSF_GRAVITYFLIP             =  1<<5,
+	MSF_HEATWAVE                =  1<<6,
 } sectorflags_t;
 
 
@@ -368,7 +369,6 @@ typedef struct sector_s
 
 	fixed_t gravity; // per-sector gravity factor
 	fixed_t *gravityptr; // For binary format: Read gravity from floor height of master sector
-	boolean verticalflip; // If gravity < 0, then allow flipped physics
 	sectorflags_t flags;
 
 	INT32 friction;