diff --git a/src/dehacked.c b/src/dehacked.c
index c05a8f4441b0b47d0fe0c9575eec18a91614a90d..268f9943c93359a9684edc460b685ee3f3334d46 100644
--- a/src/dehacked.c
+++ b/src/dehacked.c
@@ -1867,6 +1867,8 @@ static void readlevelheader(MYFILE *f, INT32 num)
 				mapheaderinfo[num-1]->sstimer = i;
 			else if (fastcmp(word, "SPECIALSTAGESPHERES"))
 				mapheaderinfo[num-1]->ssspheres = i;
+			else if (fastcmp(word, "GRAVITY"))
+				mapheaderinfo[num-1]->gravity = FLOAT_TO_FIXED(atof(word2));
 			else
 				deh_warning("Level header %d: unknown word '%s'", num, word);
 		}
diff --git a/src/doomstat.h b/src/doomstat.h
index e6a227a4226f16c6789467bc39497d558dc1e647..1ec03a86cd438b1425a251942e909170589809c0 100644
--- a/src/doomstat.h
+++ b/src/doomstat.h
@@ -320,7 +320,8 @@ typedef struct
 	char selectheading[22]; ///< Level select heading. Allows for controllable grouping.
 	UINT16 startrings;      ///< Number of rings players start with.
 	INT32 sstimer;          ///< Timer for special stages.
-	UINT32 ssspheres;        ///< Sphere requirement in special stages.
+	UINT32 ssspheres;       ///< Sphere requirement in special stages.
+	fixed_t gravity;        ///< Map-wide gravity.
 
 	// Title card.
 	char ltzzpatch[8];      ///< Zig zag patch.
diff --git a/src/lua_maplib.c b/src/lua_maplib.c
index 1737216e3791dc0b3aa8a3ce2a190c992ec8d07f..ece42b8d3dec950b8c6a904eb6370715963f2cd7 100644
--- a/src/lua_maplib.c
+++ b/src/lua_maplib.c
@@ -2086,6 +2086,8 @@ static int mapheaderinfo_get(lua_State *L)
 		lua_pushinteger(L, header->sstimer);
 	else if (fastcmp(field, "ssspheres"))
 		lua_pushinteger(L, header->ssspheres);
+	else if (fastcmp(field, "gravity"))
+		lua_pushfixed(L, header->gravity);
 	// TODO add support for reading numGradedMares and grades
 	else {
 		// Read custom vars now
diff --git a/src/p_setup.c b/src/p_setup.c
index 1d1826a5393e024a3dbac5a39ba32abdea5c1d51..b4a5f2c3c75a49b2fdd6d61229c581b67f615414 100644
--- a/src/p_setup.c
+++ b/src/p_setup.c
@@ -220,6 +220,7 @@ static void P_ClearSingleMapHeaderInfo(INT16 i)
 	mapheaderinfo[num]->startrings = 0;
 	mapheaderinfo[num]->sstimer = 90;
 	mapheaderinfo[num]->ssspheres = 1;
+	mapheaderinfo[num]->gravity = FRACUNIT/2;
 	mapheaderinfo[num]->keywords[0] = '\0';
 	snprintf(mapheaderinfo[num]->musname, 7, "%sM", G_BuildMapName(i));
 	mapheaderinfo[num]->musname[6] = 0;
diff --git a/src/p_spec.c b/src/p_spec.c
index fafe2cdf3b485636bb4e761df5a328b7d81a6bb6..2e5b1f44b3ba3f21907db3366ea48f3074553097 100644
--- a/src/p_spec.c
+++ b/src/p_spec.c
@@ -6246,7 +6246,7 @@ static void P_RunLevelLoadExecutors(void)
 void P_InitSpecials(void)
 {
 	// Set the default gravity. Custom gravity overrides this setting.
-	gravity = FRACUNIT/2;
+	gravity = mapheaderinfo[gamemap-1]->gravity;
 
 	// Defaults in case levels don't have them set.
 	sstimer = mapheaderinfo[gamemap-1]->sstimer*TICRATE + 6;