diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt
index 055636870..542717654 100644
--- a/source/CMakeLists.txt
+++ b/source/CMakeLists.txt
@@ -773,6 +773,7 @@ set (PCH_SOURCES
 	common/searchpaths.cpp
 	common/initfs.cpp
 	common/openaudio.cpp
+	common/optionmenu/optionmenu.cpp
 
 	common/2d/v_2ddrawer.cpp
 	common/2d/v_draw.cpp
diff --git a/source/blood/src/menu.cpp b/source/blood/src/menu.cpp
index bc57a8afb..d21148a08 100644
--- a/source/blood/src/menu.cpp
+++ b/source/blood/src/menu.cpp
@@ -244,7 +244,7 @@ CGameMenuItem7EE34 itemOption2("VIDEO MODE...", 3, 0, 160, 320, 1);
 CGameMenuItemChain itemChainParentalLock("PARENTAL LOCK", 3, 0, 170, 320, 1, &menuParentalLock, -1, NULL, 0);
 
 CGameMenuItemTitle itemControlsTitle("CONTROLS", 1, 160, 20, 2038);
-CGameMenuItemSliderFloat sliderMouseSpeed("Mouse Sensitivity:", 1, 10, 70, 300, CONTROL_MouseSensitivity, 0.5f, 16.f, 0.5f, SetMouseSensitivity, -1,-1);
+CGameMenuItemSliderFloat sliderMouseSpeed("Mouse Sensitivity:", 1, 10, 70, 300, in_mousesensitivity, 0.5f, 16.f, 0.5f, SetMouseSensitivity, -1,-1);
 CGameMenuItemZBool boolMouseFlipped("Invert Mouse Aim:", 1, 10, 90, 300, in_mouseflip, SetMouseAimFlipped, NULL, NULL);
 CGameMenuItemSlider sliderTurnSpeed("Key Turn Speed:", 1, 10, 110, 300, gTurnSpeed, 64, 128, 4, SetTurnSpeed, -1, -1);
 CGameMenuItemChain itemChainKeyList("Configure Keys...", 1, 0, 130, 320, 1, &menuKeys, -1, NULL, 0);
@@ -492,9 +492,9 @@ CGameMenuItemChain itemOptionsDisplayModeApply("APPLY CHANGES", 3, 66, 125, 180,
 void PreDrawDisplayColor(CGameMenuItem *);
 
 CGameMenuItemTitle itemOptionsDisplayColorTitle("COLOR CORRECTION", 1, 160, 20, -1);
-CGameMenuItemSliderFloat itemOptionsDisplayColorGamma("GAMMA:", 3, 66, 140, 180, &g_videoGamma, 0.3f, 4.f, 0.1f, UpdateVideoColorMenu, -1, -1, kMenuSliderValue);
-CGameMenuItemSliderFloat itemOptionsDisplayColorContrast("CONTRAST:", 3, 66, 150, 180, &g_videoContrast, 0.1f, 2.7f, 0.05f, UpdateVideoColorMenu, -1, -1, kMenuSliderValue);
-CGameMenuItemSliderFloat itemOptionsDisplayColorBrightness("BRIGHTNESS:", 3, 66, 160, 180, &g_videoBrightness, -0.8f, 0.8f, 0.05f, UpdateVideoColorMenu, -1, -1, kMenuSliderValue);
+CGameMenuItemSliderFloat itemOptionsDisplayColorGamma("GAMMA:", 3, 66, 140, 180, &vid_gamma.Value, 0.3f, 4.f, 0.1f, UpdateVideoColorMenu, -1, -1, kMenuSliderValue);
+CGameMenuItemSliderFloat itemOptionsDisplayColorContrast("CONTRAST:", 3, 66, 150, 180, &vid_contrast.Value, 0.1f, 2.7f, 0.05f, UpdateVideoColorMenu, -1, -1, kMenuSliderValue);
+CGameMenuItemSliderFloat itemOptionsDisplayColorBrightness("BRIGHTNESS:", 3, 66, 160, 180, &vid_brightness.Value, -0.8f, 0.8f, 0.05f, UpdateVideoColorMenu, -1, -1, kMenuSliderValue);
 CGameMenuItemSliderFloat itemOptionsDisplayColorVisibility("VISIBILITY:", 3, 66, 170, 180, &r_ambientlight.Value, 0.125f, 4.f, 0.125f, UpdateVideoColorMenu, -1, -1, kMenuSliderValue);
 CGameMenuItemChain itemOptionsDisplayColorReset("RESET TO DEFAULTS", 3, 66, 180, 180, 0, NULL, 0, ResetVideoColor, 0);
 
@@ -550,7 +550,6 @@ CGameMenuItemTitle itemOptionsDisplayPolymostTitle("POLYMOST SETUP", 1, 160, 20,
 CGameMenuItemZCycle itemOptionsDisplayPolymostTextureMode("TEXTURE MODE:", 3, 66, 60, 180, 0, UpdateTextureMode, pzTextureModeStrings, 2, 0);
 CGameMenuItemZCycle itemOptionsDisplayPolymostAnisotropy("ANISOTROPY:", 3, 66, 70, 180, 0, UpdateAnisotropy, pzAnisotropyStrings, 6, 0);
 CGameMenuItemZBool itemOptionsDisplayPolymostTrueColorTextures("TRUE COLOR TEXTURES:", 3, 66, 80, 180, 0, UpdateTrueColorTextures, NULL, NULL);
-CGameMenuItemZCycle itemOptionsDisplayPolymostTexQuality("GL TEXTURE QUALITY:", 3, 66, 90, 180, 0, UpdateTexQuality, pzTexQualityStrings, 3, 0);
 CGameMenuItemZBool itemOptionsDisplayPolymostPreloadCache("PRE-LOAD MAP TEXTURES:", 3, 66, 100, 180, 0, UpdatePreloadCache, NULL, NULL);
 CGameMenuItemZBool itemOptionsDisplayPolymostDetailTex("DETAIL TEXTURES:", 3, 66, 120, 180, 0, UpdateDetailTex, NULL, NULL);
 CGameMenuItemZBool itemOptionsDisplayPolymostGlowTex("GLOW TEXTURES:", 3, 66, 130, 180, 0, UpdateGlowTex, NULL, NULL);
@@ -642,13 +641,13 @@ void SetupMouseButtonMenu(CGameMenuItemChain *pItem);
 
 CGameMenuItemTitle itemOptionsControlMouseTitle("MOUSE SETUP", 1, 160, 20, 2038);
 CGameMenuItemChain itemOptionsControlMouseButton("BUTTON ASSIGNMENT", 3, 66, 60, 180, 0, &menuOptionsControlMouseButtonAssignment, 0, SetupMouseButtonMenu, 0);
-CGameMenuItemSliderFloat itemOptionsControlMouseSensitivity("SENSITIVITY:", 3, 66, 70, 180, &CONTROL_MouseSensitivity, 0.5f, 16.f, 0.5f, SetMouseSensitivity, -1, -1, kMenuSliderValue);
+CGameMenuItemSliderFloat itemOptionsControlMouseSensitivity("SENSITIVITY:", 3, 66, 70, 180, &in_mousesensitivity.Value, 0.5f, 16.f, 0.5f, SetMouseSensitivity, -1, -1, kMenuSliderValue);
 CGameMenuItemZBool itemOptionsControlMouseAimFlipped("INVERT AIMING:", 3, 66, 80, 180, false, SetMouseAimFlipped, NULL, NULL);
 CGameMenuItemZBool itemOptionsControlMouseFilterInput("FILTER INPUT:", 3, 66, 90, 180, false, SetMouseFilterInput, NULL, NULL);
 CGameMenuItemZBool itemOptionsControlMouseAimMode("AIMING TYPE:", 3, 66, 100, 180, false, SetMouseAimMode, "HOLD", "TOGGLE");
 CGameMenuItemZBool itemOptionsControlMouseVerticalAim("VERTICAL AIMING:", 3, 66, 110, 180, false, SetMouseVerticalAim, NULL, NULL);
-CGameMenuItemSlider itemOptionsControlMouseXScale("X-SCALE:", 3, 66, 120, 180, (int*)&MouseAnalogueScale[0], 0, 65536, 1024, SetMouseXScale, -1, -1, kMenuSliderQ16);
-CGameMenuItemSlider itemOptionsControlMouseYScale("Y-SCALE:", 3, 66, 130, 180, (int*)&MouseAnalogueScale[1], 0, 65536, 1024, SetMouseYScale, -1, -1, kMenuSliderQ16);
+CGameMenuItemSlider itemOptionsControlMouseXScale("X-SCALE:", 3, 66, 120, 180, (int*)&in_mousescalex, 0, 65536, 1024, SetMouseXScale, -1, -1, kMenuSliderQ16);
+CGameMenuItemSlider itemOptionsControlMouseYScale("Y-SCALE:", 3, 66, 130, 180, (int*)&in_mousescaley, 0, 65536, 1024, SetMouseYScale, -1, -1, kMenuSliderQ16);
 CGameMenuItemZCycle itemOptionsControlMouseDigitalUp("DIGITAL UP", 3, 66, 140, 180, 0, SetMouseDigitalAxis, NULL, 0, 0, true);
 CGameMenuItemZCycle itemOptionsControlMouseDigitalDown("DIGITAL DOWN", 3, 66, 150, 180, 0, SetMouseDigitalAxis, NULL, 0, 0, true);
 CGameMenuItemZCycle itemOptionsControlMouseDigitalLeft("DIGITAL LEFT", 3, 66, 160, 180, 0, SetMouseDigitalAxis, NULL, 0, 0, true);
@@ -748,7 +747,7 @@ void SetupMessagesMenu(void)
 
 void SetupControlsMenu(void)
 {
-    sliderMouseSpeed.fValue = ClipRangeF(CONTROL_MouseSensitivity, sliderMouseSpeed.fRangeLow, sliderMouseSpeed.fRangeHigh);
+    sliderMouseSpeed.fValue = ClipRangeF(in_mousesensitivity, sliderMouseSpeed.fRangeLow, sliderMouseSpeed.fRangeHigh);
     sliderTurnSpeed.nValue = ClipRange(gTurnSpeed, sliderTurnSpeed.nRangeLow, sliderTurnSpeed.nRangeHigh);
     boolMouseFlipped.at20 = in_mouseflip;
     menuControls.Add(&itemControlsTitle, false);
@@ -1230,7 +1229,6 @@ void SetupOptionsMenu(void)
     //menuOptionsDisplayPolymost.Add(&itemOptionsDisplayPolymostTextureMode, true);
     //menuOptionsDisplayPolymost.Add(&itemOptionsDisplayPolymostAnisotropy, false);
     menuOptionsDisplayPolymost.Add(&itemOptionsDisplayPolymostTrueColorTextures, true);
-    menuOptionsDisplayPolymost.Add(&itemOptionsDisplayPolymostTexQuality, false);
     menuOptionsDisplayPolymost.Add(&itemOptionsDisplayPolymostPreloadCache, false);
     menuOptionsDisplayPolymost.Add(&itemOptionsDisplayPolymostDetailTex, false);
     menuOptionsDisplayPolymost.Add(&itemOptionsDisplayPolymostGlowTex, false);
@@ -1238,7 +1236,6 @@ void SetupOptionsMenu(void)
     menuOptionsDisplayPolymost.Add(&itemOptionsDisplayPolymostDeliriumBlur, false);
     menuOptionsDisplayPolymost.Add(&itemBloodQAV, false);
 
-    itemOptionsDisplayPolymostTexQuality.pPreDrawCallback = PreDrawDisplayPolymost;
     itemOptionsDisplayPolymostPreloadCache.pPreDrawCallback = PreDrawDisplayPolymost;
     itemOptionsDisplayPolymostDetailTex.pPreDrawCallback = PreDrawDisplayPolymost;
     itemOptionsDisplayPolymostGlowTex.pPreDrawCallback = PreDrawDisplayPolymost;
@@ -1656,9 +1653,9 @@ void PreDrawVideoModeMenu(CGameMenuItem *pItem)
 void UpdateVideoColorMenu(CGameMenuItemSliderFloat *pItem)
 {
     UNREFERENCED_PARAMETER(pItem);
-    g_videoGamma = itemOptionsDisplayColorGamma.fValue;
-    g_videoContrast = itemOptionsDisplayColorContrast.fValue;
-    g_videoBrightness = itemOptionsDisplayColorBrightness.fValue;
+    vid_gamma = itemOptionsDisplayColorGamma.fValue;
+    vid_contrast = itemOptionsDisplayColorContrast.fValue;
+    vid_brightness = itemOptionsDisplayColorBrightness.fValue;
     r_ambientlight = itemOptionsDisplayColorVisibility.fValue;
 }
 
@@ -1673,9 +1670,9 @@ void PreDrawDisplayColor(CGameMenuItem *pItem)
 void ResetVideoColor(CGameMenuItemChain *pItem)
 {
     UNREFERENCED_PARAMETER(pItem);
-    g_videoGamma = DEFAULT_GAMMA;
-    g_videoContrast = DEFAULT_CONTRAST;
-    g_videoBrightness = DEFAULT_BRIGHTNESS;
+    vid_gamma = 1.f;
+    vid_contrast = 1.f;
+    vid_brightness = 0.f;
     r_ambientlight = 1.f;
 }
 
@@ -1702,7 +1699,6 @@ void SetupVideoPolymostMenu(CGameMenuItemChain *pItem)
         }
     }
     itemOptionsDisplayPolymostTrueColorTextures.at20 = hw_hightile;
-    itemOptionsDisplayPolymostTexQuality.m_nFocus = r_downsize;
     itemOptionsDisplayPolymostPreloadCache.at20 = r_precache;
     itemOptionsDisplayPolymostDetailTex.at20 = hw_detailmapping;
     itemOptionsDisplayPolymostGlowTex.at20 = hw_glowmapping;
@@ -1737,13 +1733,6 @@ void DoModeChange(void)
 }
 
 #ifdef USE_OPENGL
-void UpdateTexQuality(CGameMenuItemZCycle *pItem)
-{
-    r_downsize = pItem->m_nFocus;
-    r_downsizevar = r_downsize;
-    DoModeChange();
-}
-
 void UpdatePreloadCache(CGameMenuItemZBool *pItem)
 {
     r_precache = pItem->at20;
@@ -1771,9 +1760,7 @@ void UpdateDeliriumBlur(CGameMenuItemZBool *pItem)
 
 void PreDrawDisplayPolymost(CGameMenuItem *pItem)
 {
-    if (pItem == &itemOptionsDisplayPolymostTexQuality)
-        pItem->bEnable = hw_hightile;
-    else if (pItem == &itemOptionsDisplayPolymostPreloadCache)
+    if (pItem == &itemOptionsDisplayPolymostPreloadCache)
         pItem->bEnable = hw_hightile;
     else if (pItem == &itemOptionsDisplayPolymostDetailTex)
         pItem->bEnable = hw_hightile;
@@ -1912,14 +1899,12 @@ void SetMouseVerticalAim(CGameMenuItemZBool *pItem)
 
 void SetMouseXScale(CGameMenuItemSlider *pItem)
 {
-    MouseAnalogueScale[0] = pItem->nValue;
-    CONTROL_SetAnalogAxisScale(0, pItem->nValue, controldevice_mouse);
+    in_mousescalex = pItem->nValue;
 }
 
 void SetMouseYScale(CGameMenuItemSlider *pItem)
 {
-    MouseAnalogueScale[1] = pItem->nValue;
-    CONTROL_SetAnalogAxisScale(1, pItem->nValue, controldevice_mouse);
+    in_mousescaley = pItem->nValue;
 }
 
 void SetMouseDigitalAxis(CGameMenuItemZCycle *pItem)
diff --git a/source/blood/src/screentext.cpp b/source/blood/src/screentext.cpp
index 7084156f0..8267aea4d 100644
--- a/source/blood/src/screentext.cpp
+++ b/source/blood/src/screentext.cpp
@@ -1077,7 +1077,7 @@ void P_DoQuote(int32_t q, DukePlayer_t *p)
 {
     int32_t cq = 0;
 
-    if (ud.fta_on == 0 || q < 0 || !(p->gm & MODE_GAME))
+    if (hud_messages == 0 || q < 0 || !(p->gm & MODE_GAME))
         return;
 
     if (q & MAXQUOTES)
diff --git a/source/build/include/baselayer.h b/source/build/include/baselayer.h
index bbed232d0..e509faa69 100644
--- a/source/build/include/baselayer.h
+++ b/source/build/include/baselayer.h
@@ -25,10 +25,12 @@ extern char modechange;
 extern char nogl;
 
 extern int32_t swapcomplete;
+
 EXTERN_CVAR(Int, r_borderless);
+EXTERN_CVAR(Bool, r_usenewaspect)
 
 // video
-extern int32_t r_usenewaspect, newaspect_enable;
+extern int32_t newaspect_enable;
 extern int32_t r_fpgrouscan;
 extern int32_t setaspect_new_use_dimen;
 extern uint32_t r_screenxy;
@@ -66,13 +68,7 @@ extern int32_t lockcount;
 } while(0)
 #endif
 
-extern float g_videoGamma, g_videoContrast, g_videoBrightness;
-
-#define DEFAULT_GAMMA 1.0f
-#define DEFAULT_CONTRAST 1.0f
-#define DEFAULT_BRIGHTNESS 0.0f
-
-#define GAMMA_CALC ((int32_t)(min(max((float)((g_videoGamma - 1.0f) * 10.0f), 0.f), 15.f)))
+#define GAMMA_CALC ((int32_t)(min(max((float)((vid_gamma - 1.0f) * 10.0f), 0.f), 15.f)))
 
 #ifdef USE_OPENGL
 extern int osdcmd_glinfo(osdcmdptr_t parm);
diff --git a/source/build/include/build.h b/source/build/include/build.h
index 7a6357275..75999d0c1 100644
--- a/source/build/include/build.h
+++ b/source/build/include/build.h
@@ -1095,7 +1095,6 @@ EXTERN_CVAR(Bool, r_voxels)
 
 extern int32_t r_parallaxskyclamping;
 extern int32_t r_downsize;
-extern int32_t r_downsizevar;
 extern int32_t mdtims, omdtims;
 extern int32_t glrendmode;
 
diff --git a/source/build/src/engine.cpp b/source/build/src/engine.cpp
index e35f25402..c11e2c805 100644
--- a/source/build/src/engine.cpp
+++ b/source/build/src/engine.cpp
@@ -132,16 +132,13 @@ static int32_t beforedrawrooms = 1;
 static int32_t oxdimen = -1, oviewingrange = -1, oxyaspect = -1;
 
 // r_usenewaspect is the cvar, newaspect_enable to trigger the new behaviour in the code
-int32_t r_usenewaspect = 1, newaspect_enable=0;
+CVAR(Bool, r_usenewaspect, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG);
+int32_t newaspect_enable=0;
 uint32_t r_screenxy = 0;
 
 int32_t r_fpgrouscan = 1;
 int32_t globalflags;
 
-float g_videoGamma = DEFAULT_GAMMA;
-float g_videoContrast = DEFAULT_CONTRAST;
-float g_videoBrightness = DEFAULT_BRIGHTNESS;
-
 //Textured Map variables
 static char globalpolytype;
 static int16_t **dotp1, **dotp2;
diff --git a/source/build/src/polymost.cpp b/source/build/src/polymost.cpp
index 21389cbcd..a3a0431df 100644
--- a/source/build/src/polymost.cpp
+++ b/source/build/src/polymost.cpp
@@ -138,8 +138,6 @@ int32_t glprojectionhacks = 2;
 static FHardwareTexture *polymosttext = 0;
 int32_t glrendmode = REND_POLYMOST;
 
-int32_t r_downsize = 0;
-int32_t r_downsizevar = -1;
 int32_t r_scenebrightness = 0;
 
 int32_t r_rortexture = 0;
diff --git a/source/common/console/c_cvars.cpp b/source/common/console/c_cvars.cpp
index 66f709d0b..687fefb58 100644
--- a/source/common/console/c_cvars.cpp
+++ b/source/common/console/c_cvars.cpp
@@ -81,17 +81,17 @@ FBaseCVar::FBaseCVar (const char *var_name, uint32_t flags, void (*callback)(FBa
 		*/
 	}
 
-	FBaseCVar *var;
 
-	var = FindCVar (var_name, NULL);
 
 	m_Callback = callback;
 	Flags = 0;
 	VarName = "";
 	Description = descr;
 
+	FBaseCVar* var = nullptr;
 	if (var_name)
 	{
+		var = FindCVar(var_name, NULL);
 		C_AddTabCommand (var_name);
 		VarName = var_name;
 		m_Next = CVars;
diff --git a/source/common/console/c_cvars.h b/source/common/console/c_cvars.h
index a71caa483..641af4605 100644
--- a/source/common/console/c_cvars.h
+++ b/source/common/console/c_cvars.h
@@ -120,6 +120,13 @@ public:
 	void SetArchiveBit () { Flags |= CVAR_ARCHIVE; }
 	void MarkUnsafe();
 
+	int ToInt()
+	{
+		ECVarType vt;
+		auto val = GetFavoriteRep(&vt);
+		return ToInt(val, vt);
+	}
+
 	virtual ECVarType GetRealType () const = 0;
 
 	virtual const char *GetHumanString(int precision=-1) const;
@@ -448,6 +455,9 @@ void C_ForgetCVars (void);
 #define CVARD_NAMED(type,name,varname,def,flags, descr) \
 F##type##CVar varname (#name, def, flags, nullptr, descr);
 
+#define CVAR_UNAMED(type,varname) \
+F##type##CVar varname (nullptr, 0, 0, nullptr, nullptr);
+
 extern FBaseCVar *CVars;
 
 #endif //__C_CVARS_H__
diff --git a/source/common/gamecontrol.cpp b/source/common/gamecontrol.cpp
index 5125df0bf..94cd0b901 100644
--- a/source/common/gamecontrol.cpp
+++ b/source/common/gamecontrol.cpp
@@ -465,7 +465,6 @@ int CONFIG_SetMapBestTime(uint8_t const* const mapmd4, int32_t tm)
 
 int32_t MouseDigitalFunctions[MAXMOUSEAXES][2];
 int32_t MouseAnalogueAxes[MAXMOUSEAXES];
-int32_t MouseAnalogueScale[MAXMOUSEAXES];
 int32_t JoystickFunctions[MAXJOYBUTTONSANDHATS][2];
 int32_t JoystickDigitalFunctions[MAXJOYAXES][2];
 int32_t JoystickAnalogueAxes[MAXJOYAXES];
@@ -612,41 +611,6 @@ const char* CONFIG_AnalogNumToName(int32_t func)
 
 void CONFIG_SetupMouse(void)
 {
-	const char* val;
-	FString section = currentGame + ".MouseSettings";
-	if (!GameConfig->SetSection(section)) return;
-
-	// map over the axes
-	for (int i = 0; i < MAXMOUSEAXES; i++)
-	{
-		section.Format("MouseAnalogAxes%d", i);
-		val = GameConfig->GetValueForKey(section);
-		if (val)
-			MouseAnalogueAxes[i] = CONFIG_AnalogNameToNum(val);
-
-		section.Format("MouseDigitalAxes%d_0", i);
-		val = GameConfig->GetValueForKey(section);
-		if (val)
-			MouseDigitalFunctions[i][0] = buttonMap.FindButtonIndex(val);
-
-		section.Format("MouseDigitalAxes%d_1", i);
-		val = GameConfig->GetValueForKey(section);
-		if (val)
-			MouseDigitalFunctions[i][1] = buttonMap.FindButtonIndex(val);
-
-		section.Format("MouseAnalogScale%d", i);
-		val = GameConfig->GetValueForKey(section);
-		if (val)
-			MouseAnalogueScale[i] = (int32_t)strtoull(val, nullptr, 0);
-	}
-
-	for (int i = 0; i < MAXMOUSEAXES; i++)
-	{
-		CONTROL_MapAnalogAxis(i, MouseAnalogueAxes[i], controldevice_mouse);
-		CONTROL_MapDigitalAxis(i, MouseDigitalFunctions[i][0], 0, controldevice_mouse);
-		CONTROL_MapDigitalAxis(i, MouseDigitalFunctions[i][1], 1, controldevice_mouse);
-		CONTROL_SetAnalogAxisScale(i, MouseAnalogueScale[i], controldevice_mouse);
-	}
 	CONTROL_MouseEnabled    = (in_mouse && CONTROL_MousePresent);
 }
 
@@ -1043,9 +1007,6 @@ void CONFIG_InitMouseAndController()
 
 	for (int i = 0; i < MAXMOUSEAXES; i++)
 	{
-		MouseAnalogueScale[i] = DEFAULTMOUSEANALOGUESCALE;
-		CONTROL_SetAnalogAxisScale(i, MouseAnalogueScale[i], controldevice_mouse);
-
 		MouseDigitalFunctions[i][0] = buttonMap.FindButtonIndex(mousedigitaldefaults[i * 2]);
 		MouseDigitalFunctions[i][1] = buttonMap.FindButtonIndex(mousedigitaldefaults[i * 2 + 1]);
 		CONTROL_MapDigitalAxis(i, MouseDigitalFunctions[i][0], 0, controldevice_mouse);
@@ -1071,34 +1032,7 @@ void CONFIG_PutNumber(const char* key, int number)
 void CONFIG_WriteControllerSettings()
 {
 	FString buf;
-	if (in_mouse)
-	{
-		FString section = currentGame + ".MouseSettings";
-		GameConfig->SetSection(section);
-		for (int i = 0; i < MAXMOUSEAXES; i++)
-		{
-			if (CONFIG_AnalogNumToName(MouseAnalogueAxes[i]))
-			{
-				buf.Format("MouseAnalogAxes%d", i);
-				GameConfig->SetValueForKey(buf, CONFIG_AnalogNumToName(MouseAnalogueAxes[i]));
-			}
 
-			if (buttonMap.GetButtonName(MouseDigitalFunctions[i][0]))
-			{
-				buf.Format("MouseDigitalAxes%d_0", i);
-				GameConfig->SetValueForKey(buf, buttonMap.GetButtonName(MouseDigitalFunctions[i][0]));
-			}
-
-			if (buttonMap.GetButtonName(MouseDigitalFunctions[i][1]))
-			{
-				buf.Format("MouseDigitalAxes%d_1", i);
-				GameConfig->SetValueForKey(buf, buttonMap.GetButtonName(MouseDigitalFunctions[i][1]));
-			}
-
-			buf.Format("MouseAnalogScale%d", i);
-			CONFIG_PutNumber(buf, MouseAnalogueScale[i]);
-		}
-	}
 
 	if (in_joystick)
 	{
diff --git a/source/common/gamecontrol.h b/source/common/gamecontrol.h
index 852109816..61d3a1068 100644
--- a/source/common/gamecontrol.h
+++ b/source/common/gamecontrol.h
@@ -36,7 +36,6 @@ void CONFIG_SetDefaultKeys(const char *defbinds);
 
 extern int32_t MouseDigitalFunctions[MAXMOUSEAXES][2];
 extern int32_t MouseAnalogueAxes[MAXMOUSEAXES];
-extern int32_t MouseAnalogueScale[MAXMOUSEAXES];
 extern int32_t JoystickFunctions[MAXJOYBUTTONSANDHATS][2];
 extern int32_t JoystickDigitalFunctions[MAXJOYAXES][2];
 extern int32_t JoystickAnalogueAxes[MAXJOYAXES];
diff --git a/source/common/gamecvars.cpp b/source/common/gamecvars.cpp
index ed29b4cbf..33f591620 100644
--- a/source/common/gamecvars.cpp
+++ b/source/common/gamecvars.cpp
@@ -317,7 +317,18 @@ CUSTOM_CVARD(Float, in_mousesensitivity, DEFAULTMOUSESENSITIVITY, CVAR_ARCHIVE|C
 {
 	if (self < 0) self = 0;
 	else if (self > 25) self = 25;
-	else CONTROL_MouseSensitivity = self;
+}
+
+CUSTOM_CVARD(Int, in_mousescalex, 65536, CVAR_ARCHIVE | CVAR_GLOBALCONFIG, "changes the mouse sensitivity")
+{
+	if (self < -4) self = 4;
+	else if (self > 4) self = 4;
+}
+
+CUSTOM_CVARD(Int, in_mousescaley, 65536, CVAR_ARCHIVE | CVAR_GLOBALCONFIG, "changes the mouse sensitivity")
+{
+	if (self < -4) self = 4;
+	else if (self > 4) self = 4;
 }
 
 
@@ -457,6 +468,31 @@ CUSTOM_CVAR(String, playername, "Player", CVAR_ARCHIVE | CVAR_USERINFO)
 	//Net_SendClientInfo();	This is in the client code. Todo.
 }
 
+CUSTOM_CVARD(Float, vid_gamma, 1.f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG, "adjusts gamma component of gamma ramp")
+{
+	if (self < 0) self = 0;
+	else if (self > 5) self = 5;
+	// todo: tell the system to update
+}
+
+CUSTOM_CVARD(Float, vid_contrast, 1.f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG, "adjusts contrast component of gamma ramp")
+{
+	if (self < 0) self = 0;
+	else if (self > 5) self = 5;
+	// todo: tell the system to update
+}
+
+CUSTOM_CVARD(Float, vid_brightness, 0.f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG, "adjusts brightness component of gamma ramp")
+{
+	if (self < 0) self = 0;
+	else if (self > 5) self = 5;
+	// todo: tell the system to update
+}
+
+//{ "vid_contrast","adjusts contrast component of gamma ramp",(void *) &vid_contrast, CVAR_FLOAT|CVAR_FUNCPTR, 0, 10 },
+//{ "vid_brightness","adjusts brightness component of gamma ramp",(void *) &vid_brightness, CVAR_FLOAT|CVAR_FUNCPTR, 0, 10 },
+
+
 CUSTOM_CVAR(String, rtsname, "", CVAR_ARCHIVE | CVAR_USERINFO)
 {
 	RTS_Init(self);
@@ -464,6 +500,17 @@ CUSTOM_CVAR(String, rtsname, "", CVAR_ARCHIVE | CVAR_USERINFO)
 
 CVAR(String, usermapfolder, "", CVAR_ARCHIVE);
 
+
+// Internal settings for demo recording and the multiplayer menu. These won't get saved and only are CVARs so that the menu code can use them.
+CVAR(Bool, m_recstat, false, CVAR_NOSET)
+CVAR(Int, m_coop, 0, CVAR_NOSET)
+CVAR(Int, m_ffire, 1, CVAR_NOSET)
+CVAR(Int, m_marker, 1, CVAR_NOSET)
+CVAR(Int, m_level_number, 0, CVAR_NOSET)
+CVAR(Int, m_noexits, 0, CVAR_NOSET)
+CVAR(Int, playercolor, 0, CVAR_NOSET)
+CVAR(Int, playerteam, 0, CVAR_NOSET)
+
 #if 0
 
 // These have to wait until the HUD code is cleaned up (no idea which may survive and which won't.)
@@ -473,12 +520,10 @@ CVAR(String, usermapfolder, "", CVAR_ARCHIVE);
 	// Currently unavailable due to dependency on an obsolete OpenGL feature
 	{ "deliriumblur", "enable/disable delirium blur effect(polymost)", (void *)&gDeliriumBlur, CVAR_BOOL, 0, 1 },
 
-	// This needs some serious internal cleanup first, the implementation is all over the place and prone to whacking the user setting.
-	{ "color", "changes player palette", (void *)&ud.color, CVAR_INT|CVAR_MULTI, 0, MAXPALOOKUPS-1 },
 	if (!Bstrcasecmp(parm->name, "color"))
 	{
-		ud.color = G_CheckPlayerColor(ud.color);
-		g_player[0].ps->palookup = g_player[0].pcolor = ud.color;
+		playercolor = G_CheckPlayerColor(playercolor);
+		g_player[0].ps->palookup = g_player[0].pcolor = playercolor;
 	}
 
 	// This one gets changed at run time by the game code, so making it persistent does not work
@@ -490,7 +535,7 @@ CVAR(String, usermapfolder, "", CVAR_ARCHIVE);
 	{ "skill","changes the game skill setting", (void *)&ud.m_player_skill, CVAR_INT|CVAR_FUNCPTR|CVAR_NOSAVE/*|CVAR_NOMULTI*/, 0, 5 },
 
 	// requires cleanup first
-	//{ "team","change team in multiplayer", (void *)&ud.team, CVAR_INT|CVAR_MULTI, 0, 3 },
+	//{ "team","change team in multiplayer", (void *)&playerteam, CVAR_INT|CVAR_MULTI, 0, 3 },
 
 	// just as a reminder:
 	/*
@@ -505,12 +550,8 @@ CVAR(String, usermapfolder, "", CVAR_ARCHIVE);
 	/* Baselayer CVARs. Some are pointless, some not worth bothering before the backend is swappewd out, the only relevant one was r_voxels.
 	static osdcvardata_t cvars_engine[] =
 	{
-		{ "r_usenewaspect","enable/disable new screen aspect ratio determination code",(void *) &r_usenewaspect, CVAR_BOOL, 0, 1 },
 		{ "r_screenaspect","if using r_usenewaspect and in fullscreen, screen aspect ratio in the form XXYY, e.g. 1609 for 16:9",
 		  (void *) &r_screenxy, SCREENASPECT_CVAR_TYPE, 0, 9999 },
-		//{ "vid_gamma","adjusts gamma component of gamma ramp",(void *) &g_videoGamma, CVAR_FLOAT|CVAR_FUNCPTR, 0, 10 },
-		//{ "vid_contrast","adjusts contrast component of gamma ramp",(void *) &g_videoContrast, CVAR_FLOAT|CVAR_FUNCPTR, 0, 10 },
-		//{ "vid_brightness","adjusts brightness component of gamma ramp",(void *) &g_videoBrightness, CVAR_FLOAT|CVAR_FUNCPTR, 0, 10 },
 	};
 	*/
 
diff --git a/source/common/gamecvars.h b/source/common/gamecvars.h
index 12c3f6527..1b9265c47 100644
--- a/source/common/gamecvars.h
+++ b/source/common/gamecvars.h
@@ -52,6 +52,8 @@ extern int MusicDevice;
 
 EXTERN_CVAR(Int, hud_layout)
 EXTERN_CVAR(Int, hud_scale)
+EXTERN_CVAR(Int, hud_size)
+
 EXTERN_CVAR(Int, hud_custom)
 EXTERN_CVAR(Bool, hud_stats)
 EXTERN_CVAR(Bool, hud_showmapname)
@@ -79,6 +81,11 @@ EXTERN_CVAR(Bool, r_shadows)
 EXTERN_CVAR(Bool, r_rotatespritenowidescreen)
 EXTERN_CVAR(Bool, r_precache)
 EXTERN_CVAR(Bool, r_voxels)
+EXTERN_CVAR(Int, r_upscalefactor)
+
+EXTERN_CVAR(Float, vid_gamma)
+EXTERN_CVAR(Float, vid_contrast)
+EXTERN_CVAR(Float, vid_brightness)
 
 
 EXTERN_CVAR(Bool, in_joystick)
@@ -90,6 +97,8 @@ EXTERN_CVAR(Bool, in_mouseflip)
 EXTERN_CVAR(Bool, in_mousemode)
 EXTERN_CVAR(Bool, in_mousesmoothing)
 EXTERN_CVAR(Float, in_mousesensitivity)
+EXTERN_CVAR(Int, in_mousescalex)
+EXTERN_CVAR(Int, in_mousescaley)
 extern int32_t g_MyAimMode;
 EXTERN_CVAR(Bool, in_mousemode)
 EXTERN_CVAR(String, wchoice)
@@ -107,6 +116,16 @@ EXTERN_CVAR(String, playername)
 EXTERN_CVAR(String, rtsname)
 EXTERN_CVAR(String, usermapfolder)
 
+EXTERN_CVAR(Bool, m_recstat)
+EXTERN_CVAR(Int, m_coop)
+EXTERN_CVAR(Int, m_marker)
+EXTERN_CVAR(Int, m_level_number)
+EXTERN_CVAR(Int, m_ffire)
+EXTERN_CVAR(Int, m_noexits)
+EXTERN_CVAR(Int, m_levelnumber)
+EXTERN_CVAR(Int, playercolor)
+EXTERN_CVAR(Int, playerteam)
+
 extern bool gNoAutoLoad;
 extern float r_ambientlightrecip;
 extern int hud_statusbarrange;	// will be set by the game's configuration setup.
diff --git a/source/duke3d/src/cheats.cpp b/source/duke3d/src/cheats.cpp
index 0cae13a14..7b317e6a6 100644
--- a/source/duke3d/src/cheats.cpp
+++ b/source/duke3d/src/cheats.cpp
@@ -368,13 +368,13 @@ void G_DoCheats(void)
                     levnume--;
 
                     ud.m_volume_number = volnume;
-                    ud.m_level_number = levnume;
+                    m_level_number = levnume;
                 }
                 else
                 {
                     // JBF 20030914
                     ud.m_volume_number = osdcmd_cheatsinfo_stat.volume;
-                    ud.m_level_number = osdcmd_cheatsinfo_stat.level;
+                    m_level_number = osdcmd_cheatsinfo_stat.level;
                 }
             }
             else if (cheatNum == CHEAT_SKILL)
@@ -399,7 +399,7 @@ void G_DoCheats(void)
                 if (originalCheatNum == CHEAT_SCOTTY)
                 {
                     ud.m_volume_number = ud.volume_number;
-                    ud.m_level_number = ud.level_number;
+                    m_level_number = ud.level_number;
                 }
                 else if (originalCheatNum == CHEAT_SKILL)
                 {
@@ -555,7 +555,7 @@ void G_DoCheats(void)
 
                 case CHEAT_SCOTTY:
                 {
-                    int32_t const volnume = ud.m_volume_number, levnume = ud.m_level_number;
+                    int32_t const volnume = ud.m_volume_number, levnume = m_level_number;
 
                     if ((!VOLUMEONE || volnume == 0) && (unsigned)volnume < (unsigned)g_volumeCnt &&
                         (unsigned)levnume < MAXLEVELS && g_mapInfo[volnume*MAXLEVELS + levnume].filename != NULL)
@@ -580,7 +580,7 @@ void G_DoCheats(void)
 
 #if 0
                     if (numplayers > 1 && g_netServer)
-                        Net_NewGame(ud.m_volume_number, ud.m_level_number);
+                        Net_NewGame(ud.m_volume_number, m_level_number);
                     else
 #endif
                         pPlayer->gm |= MODE_RESTART;
diff --git a/source/duke3d/src/config.cpp b/source/duke3d/src/config.cpp
index 3aaa33a6d..886984031 100644
--- a/source/duke3d/src/config.cpp
+++ b/source/duke3d/src/config.cpp
@@ -73,14 +73,11 @@ void CONFIG_SetDefaults(void)
     ud.althud                 = 1;
     ud.angleinterpolation     = 0;
     ud.camerasprite           = -1;
-    ud.color                  = 0;
     ud.config.ShowWeapons     = 0;
     ud.default_skill          = 1;
-    ud.detail                 = 0;
     ud.display_bonus_screen   = 1;
 
     hud_position               = 0;
-    ud.m_marker               = 1;
     ud.menu_scrollbartilenum  = -1;
     ud.menu_scrollbarz        = 65536;
     ud.menu_scrollcursorz     = 65536;
@@ -98,16 +95,14 @@ void CONFIG_SetDefaults(void)
     ud.statusbarflags         = 0;//STATUSBAR_NOSHRINK;
     ud.statusbarmode          = 1;
     ud.statusbarscale         = 100;
-    ud.team                   = 0;
 
-	ud.fta_on = 1;
 	ud.god = 0;
 	ud.m_respawn_items = 0;
 	ud.m_respawn_monsters = 0;
 	ud.m_respawn_inventory = 0;
 	ud.warp_on = 0;
 	ud.cashman = 0;
-	ud.m_ffire = 1;
+	m_ffire = 1;
 	ud.m_player_skill = ud.player_skill = 2;
 	memcpy(g_player[0].wchoice, "\3\4\5\7\0x8\6\0\2\0x9\1", 10);
 	wchoice.Callback();
diff --git a/source/duke3d/src/demo.cpp b/source/duke3d/src/demo.cpp
index 723f7aba5..ea8c1f243 100644
--- a/source/duke3d/src/demo.cpp
+++ b/source/duke3d/src/demo.cpp
@@ -144,7 +144,7 @@ void G_OpenDemoWrite(void)
     {
         Bstrcpy(apStrings[QUOTE_RESERVED4], "CANNOT START DEMO RECORDING WHEN DEAD!");
         P_DoQuote(QUOTE_RESERVED4, g_player[myconnectindex].ps);
-        ud.recstat = ud.m_recstat = 0;
+        ud.recstat = m_recstat = 0;
         return;
     }
     do
@@ -181,7 +181,7 @@ void G_OpenDemoWrite(void)
 error_wopen_demo:
         Bstrcpy(apStrings[QUOTE_RESERVED4], "FAILED STARTING DEMO RECORDING. SEE CONSOLE FOR DETAILS.");
         P_DoQuote(QUOTE_RESERVED4, g_player[myconnectindex].ps);
-        ud.recstat = ud.m_recstat = 0;
+        ud.recstat = m_recstat = 0;
         return;
     }
 
@@ -193,7 +193,7 @@ error_wopen_demo:
     P_DoQuote(QUOTE_RESERVED4, g_player[myconnectindex].ps);
 
     ud.reccnt = 0;
-    ud.recstat = ud.m_recstat = 1;  //
+    ud.recstat = m_recstat = 1;  //
 
 # if KRANDDEBUG
     krd_enable(1);
@@ -278,7 +278,7 @@ void G_CloseDemoWrite(void)
         // lastly, we need to write the number of written recsyncs to the demo file
 		g_demo_filePtr->Write(&g_demo_cnt, sizeof(g_demo_cnt));
 
-        ud.recstat = ud.m_recstat = 0;
+        ud.recstat = m_recstat = 0;
         delete g_demo_filePtr;
 		g_demo_filePtr = nullptr;
 
diff --git a/source/duke3d/src/game.cpp b/source/duke3d/src/game.cpp
index 8a21166f2..41f2c7f29 100644
--- a/source/duke3d/src/game.cpp
+++ b/source/duke3d/src/game.cpp
@@ -188,11 +188,11 @@ void G_HandleSpecialKeys(void)
 
     if (g_networkMode != NET_DEDICATED_SERVER && ALT_IS_PRESSED && inputState.GetKeyStatus(sc_Enter))
     {
-        if (videoSetGameMode(!ScreenMode, ScreenWidth, ScreenHeight, ScreenBPP, ud.detail))
+        if (videoSetGameMode(!ScreenMode, ScreenWidth, ScreenHeight, ScreenBPP, 1))
         {
             OSD_Printf(OSD_ERROR "Failed setting video mode!\n");
 
-            if (videoSetGameMode(ScreenMode, ScreenWidth, ScreenHeight, ScreenBPP, ud.detail))
+            if (videoSetGameMode(ScreenMode, ScreenWidth, ScreenHeight, ScreenBPP, 1))
                 G_GameExit("Fatal error: unable to recover from failure setting video mode!\n");
         }
         else
@@ -273,7 +273,7 @@ void G_GameExit(const char *msg)
            g_mostConcurrentPlayers > 1 && g_player[myconnectindex].ps->gm & MODE_GAME && GTFLAGS(GAMETYPE_SCORESHEET) && *msg == ' ')
         {
             G_BonusScreen(1);
-            videoSetGameMode(ScreenMode, ScreenWidth, ScreenHeight, ScreenBPP, ud.detail);
+            videoSetGameMode(ScreenMode, ScreenWidth, ScreenHeight, ScreenBPP, 1);
         }
 
         // shareware and TEN screens
@@ -4466,7 +4466,7 @@ void GameInterface::set_hud_layout(int layout)
 
 void GameInterface::set_hud_scale(int scale)
 {
-	G_UpdateScreenArea();
+	G_SetStatusBarScale(scale);
 }
 
 void G_HandleLocalKeys(void)
@@ -4862,10 +4862,10 @@ FAKE_F3:
         {
             inputState.ClearKeyStatus(sc_F8);
 
-            int const fta = !ud.fta_on;
-            ud.fta_on     = 1;
+            int const fta = !hud_messages;
+            hud_messages     = 1;
             P_DoQuote(fta ? QUOTE_MESSAGES_ON : QUOTE_MESSAGES_OFF, &myplayer);
-            ud.fta_on     = fta;
+            hud_messages     = fta;
         }
 
         if ((buttonMap.ButtonDown(gamefunc_Quick_Load) || g_doQuickSave == 2) && (myplayer.gm & MODE_GAME))
@@ -5729,9 +5729,9 @@ static void G_CompileScripts(void)
 
 static inline void G_CheckGametype(void)
 {
-    ud.m_coop = clamp(ud.m_coop, 0, g_gametypeCnt-1);
-    initprintf("%s\n",g_gametypeNames[ud.m_coop]);
-    if (g_gametypeFlags[ud.m_coop] & GAMETYPE_ITEMRESPAWN)
+    m_coop = clamp(*m_coop, 0, g_gametypeCnt-1);
+    initprintf("%s\n",g_gametypeNames[m_coop]);
+    if (g_gametypeFlags[m_coop] & GAMETYPE_ITEMRESPAWN)
         ud.m_respawn_items = ud.m_respawn_inventory = 1;
 }
 
@@ -5991,9 +5991,9 @@ void G_UpdatePlayerFromMenu(void)
         /*int32_t j = p.team;*/
 
         P_SetupMiscInputSettings();
-        p.palookup = g_player[myconnectindex].pcolor = ud.color;
+        p.palookup = g_player[myconnectindex].pcolor = playercolor;
 
-        g_player[myconnectindex].pteam = ud.team;
+        g_player[myconnectindex].pteam = playerteam;
 
         if (sprite[p.i].picnum == APLAYER && sprite[p.i].pal != 1)
             sprite[p.i].pal = g_player[myconnectindex].pcolor;
@@ -6055,7 +6055,7 @@ static int G_EndOfLevel(void)
             }
             else
             {
-                ud.m_level_number = 0;
+                m_level_number = 0;
                 ud.level_number = 0;
             }
         }
@@ -6208,7 +6208,7 @@ int GameInterface::app_main()
 
     if (numplayers == 1 && boardfilename[0] != 0)
     {
-        ud.m_level_number  = 7;
+        m_level_number  = 7;
         ud.m_volume_number = 0;
         ud.warp_on         = 1;
     }
@@ -6252,7 +6252,7 @@ int GameInterface::app_main()
 
     if (g_networkMode != NET_DEDICATED_SERVER && validmodecnt > 0)
     {
-        if (videoSetGameMode(ScreenMode, ScreenWidth, ScreenHeight, ScreenBPP, ud.detail) < 0)
+        if (videoSetGameMode(ScreenMode, ScreenWidth, ScreenHeight, ScreenBPP, 1) < 0)
         {
             initprintf("Failure setting video mode %dx%dx%d %s! Trying next mode...\n", *ScreenWidth, *ScreenHeight,
                        *ScreenBPP, *ScreenMode ? "fullscreen" : "windowed");
@@ -6271,7 +6271,7 @@ int GameInterface::app_main()
             int const savedIdx = resIdx;
             int bpp = ScreenBPP;
 
-            while (videoSetGameMode(0, validmode[resIdx].xdim, validmode[resIdx].ydim, bpp, ud.detail) < 0)
+            while (videoSetGameMode(0, validmode[resIdx].xdim, validmode[resIdx].ydim, bpp, 1) < 0)
             {
                 initprintf("Failure setting video mode %dx%dx%d windowed! Trying next mode...\n",
                            validmode[resIdx].xdim, validmode[resIdx].ydim, bpp);
@@ -6360,7 +6360,7 @@ MAIN_LOOP_RESTART:
     {
         if ((g_netServer || ud.multimode > 1) && boardfilename[0] != 0)
         {
-            ud.m_level_number     = 7;
+            m_level_number     = 7;
             ud.m_volume_number    = 0;
             ud.m_respawn_monsters = !!(ud.m_player_skill == 4);
 
@@ -6393,13 +6393,13 @@ MAIN_LOOP_RESTART:
 
     ud.showweapons = ud.config.ShowWeapons;
     P_SetupMiscInputSettings();
-    g_player[myconnectindex].pteam = ud.team;
+    g_player[myconnectindex].pteam = playerteam;
 
     if (g_gametypeFlags[ud.coop] & GAMETYPE_TDM)
         myplayer.palookup = g_player[myconnectindex].pcolor = G_GetTeamPalette(g_player[myconnectindex].pteam);
     else
     {
-        if (ud.color) myplayer.palookup = g_player[myconnectindex].pcolor = ud.color;
+        if (playercolor) myplayer.palookup = g_player[myconnectindex].pcolor = playercolor;
         else myplayer.palookup = g_player[myconnectindex].pcolor;
     }
 
diff --git a/source/duke3d/src/game.h b/source/duke3d/src/game.h
index 771f9e09a..cf89ab514 100644
--- a/source/duke3d/src/game.h
+++ b/source/duke3d/src/game.h
@@ -163,21 +163,21 @@ typedef struct {
     int32_t reccnt;
 
     int32_t runkey_mode,statusbarscale,weaponswitch;   // JBF 20031125
-    int32_t color,statusbarmode;
-    int32_t m_noexits,noexits;
-    int32_t team, althud;
+    int32_t statusbarmode;
+    int32_t noexits;
+    int32_t althud;
     int32_t statusbarflags, statusbarrange;
     int32_t menu_slidebarz, menu_slidebarmargin, menu_slidecursorz;
     int32_t menu_scrollbartilenum, menu_scrollbarz, menu_scrollcursorz;
 
-	int32_t entered_name,screen_tilting,fta_on;
-    int32_t m_coop,coop,screen_size;
+	int32_t entered_name,screen_tilting;
+    int32_t coop,screen_size;
     int32_t playerai,angleinterpolation;
 
     int32_t respawn_monsters,respawn_items,respawn_inventory,recstat,monsters_off,brightness;
-    int32_t m_respawn_items,m_respawn_monsters,m_respawn_inventory,m_recstat,m_monsters_off,detail;
-    int32_t m_ffire,ffire,m_player_skill,m_level_number,m_volume_number,multimode;
-    int32_t player_skill,level_number,volume_number,m_marker,marker;
+    int32_t m_respawn_items,m_respawn_monsters,m_respawn_inventory,m_monsters_off;
+    int32_t ffire,m_player_skill,m_level_number,m_volume_number,multimode;
+    int32_t player_skill,level_number,volume_number,marker;
     int32_t music_episode, music_level, skill_voice;
 
     int32_t playerbest;
@@ -236,7 +236,7 @@ static inline int G_HaveUserMap(void)
 
 static inline int Menu_HaveUserMap(void)
 {
-    return (boardfilename[0] != 0 && ud.m_level_number == 7 && ud.m_volume_number == 0);
+    return (boardfilename[0] != 0 && m_level_number == 7 && ud.m_volume_number == 0);
 }
 
 extern const char *G_DefaultRtsFile(void);
@@ -461,7 +461,7 @@ enum
 
 static inline void G_NewGame_EnterLevel(void)
 {
-    G_NewGame(ud.m_volume_number, ud.m_level_number, ud.m_player_skill);
+    G_NewGame(ud.m_volume_number, m_level_number, ud.m_player_skill);
 
     if (G_EnterLevel(MODE_GAME))
         G_BackToMenu();
@@ -525,7 +525,7 @@ EXTERN_INLINE_HEADER void SetIfGreater(int32_t *variable, int32_t potentialValue
 
 EXTERN_INLINE void G_SetStatusBarScale(int32_t sc)
 {
-    ud.statusbarscale = clamp(sc, 50, 100);
+    ud.statusbarscale = clamp(sc, 36, 100);
     G_UpdateScreenArea();
 }
 
diff --git a/source/duke3d/src/gameexec.cpp b/source/duke3d/src/gameexec.cpp
index dd99b204a..52d700d07 100644
--- a/source/duke3d/src/gameexec.cpp
+++ b/source/duke3d/src/gameexec.cpp
@@ -3936,7 +3936,7 @@ badindex:
                     }
 
                     ud.m_volume_number = ud.volume_number = volumeNum;
-                    ud.m_level_number = ud.level_number = levelNum;
+                    m_level_number = ud.level_number = levelNum;
                     // if (numplayers > 1 && g_netServer)
                     //    Net_NewGame(volnume,levnume);
                      //else
diff --git a/source/duke3d/src/gamestructures.cpp b/source/duke3d/src/gamestructures.cpp
index 29528f9bd..da3abf8b6 100644
--- a/source/duke3d/src/gamestructures.cpp
+++ b/source/duke3d/src/gamestructures.cpp
@@ -1409,12 +1409,12 @@ int32_t __fastcall VM_GetUserdef(int32_t labelNum, int const lParm2)
         case USERDEFS_ENTERED_NAME:           labelNum = ud.entered_name;                 break;
         case USERDEFS_SCREEN_TILTING:         labelNum = ud.screen_tilting;               break;
 		case USERDEFS_SHADOWS:                labelNum = r_shadows;                       break;
-        case USERDEFS_FTA_ON:                 labelNum = ud.fta_on;                       break;
+        case USERDEFS_FTA_ON:                 labelNum = hud_messages;                       break;
         case USERDEFS_EXECUTIONS:             labelNum = 1;                               break;
         case USERDEFS_AUTO_RUN:               labelNum = cl_autorun;                      break;
         case USERDEFS_COORDS:                 labelNum = cl_showcoords;                   break;
         case USERDEFS_TICKRATE:               labelNum = r_showfps;                       break;
-        case USERDEFS_M_COOP:                 labelNum = ud.m_coop;                       break;
+        case USERDEFS_M_COOP:                 labelNum = m_coop;                       break;
         case USERDEFS_COOP:                   labelNum = ud.coop;                         break;
         case USERDEFS_SCREEN_SIZE:            labelNum = ud.screen_size;                  break;
         case USERDEFS_LOCKOUT:                labelNum = adult_lockout;                   break;
@@ -1429,13 +1429,13 @@ int32_t __fastcall VM_GetUserdef(int32_t labelNum, int const lParm2)
         case USERDEFS_M_RESPAWN_ITEMS:        labelNum = ud.m_respawn_items;              break;
         case USERDEFS_M_RESPAWN_MONSTERS:     labelNum = ud.m_respawn_monsters;           break;
         case USERDEFS_M_RESPAWN_INVENTORY:    labelNum = ud.m_respawn_inventory;          break;
-        case USERDEFS_M_RECSTAT:              labelNum = ud.m_recstat;                    break;
+        case USERDEFS_M_RECSTAT:              labelNum = m_recstat;                    break;
         case USERDEFS_M_MONSTERS_OFF:         labelNum = ud.m_monsters_off;               break;
-        case USERDEFS_DETAIL:                 labelNum = ud.detail;                       break;
-        case USERDEFS_M_FFIRE:                labelNum = ud.m_ffire;                      break;
+        case USERDEFS_DETAIL:                 labelNum = 1;                       break;
+        case USERDEFS_M_FFIRE:                labelNum = m_ffire;                      break;
         case USERDEFS_FFIRE:                  labelNum = ud.ffire;                        break;
         case USERDEFS_M_PLAYER_SKILL:         labelNum = ud.m_player_skill;               break;
-        case USERDEFS_M_LEVEL_NUMBER:         labelNum = ud.m_level_number;               break;
+        case USERDEFS_M_LEVEL_NUMBER:         labelNum = m_level_number;               break;
         case USERDEFS_M_VOLUME_NUMBER:        labelNum = ud.m_volume_number;              break;
         case USERDEFS_M_USER_MAP:             labelNum = Menu_HaveUserMap();              break;
         case USERDEFS_MULTIMODE:              labelNum = ud.multimode;                    break;
@@ -1443,7 +1443,7 @@ int32_t __fastcall VM_GetUserdef(int32_t labelNum, int const lParm2)
         case USERDEFS_LEVEL_NUMBER:           labelNum = ud.level_number;                 break;
         case USERDEFS_VOLUME_NUMBER:          labelNum = ud.volume_number;                break;
         case USERDEFS_USER_MAP:               labelNum = G_HaveUserMap();                 break;
-        case USERDEFS_M_MARKER:               labelNum = ud.m_marker;                     break;
+        case USERDEFS_M_MARKER:               labelNum = m_marker;                     break;
         case USERDEFS_MARKER:                 labelNum = ud.marker;                       break;
         case USERDEFS_MOUSEFLIP:              labelNum = !in_mouseflip;                   break;
         case USERDEFS_STATUSBARSCALE:         labelNum = ud.statusbarscale;               break;
@@ -1451,15 +1451,15 @@ int32_t __fastcall VM_GetUserdef(int32_t labelNum, int const lParm2)
         case USERDEFS_MOUSEAIMING:            labelNum = in_aimmode;                      break;
         case USERDEFS_WEAPONSWITCH:           labelNum = cl_weaponswitch;                 break;
         case USERDEFS_DEMOCAMS:               labelNum = cl_democams;                     break;
-        case USERDEFS_COLOR:                  labelNum = ud.color;                        break;
+        case USERDEFS_COLOR:                  labelNum = playercolor;                        break;
         case USERDEFS_MSGDISPTIME:            labelNum = hud_messagetime;                  break;
         case USERDEFS_STATUSBARMODE:          labelNum = ud.statusbarmode;                break;
-        case USERDEFS_M_NOEXITS:              labelNum = ud.m_noexits;                    break;
+        case USERDEFS_M_NOEXITS:              labelNum = m_noexits;                    break;
         case USERDEFS_NOEXITS:                labelNum = ud.noexits;                      break;
         case USERDEFS_AUTOVOTE:               labelNum = cl_autovote;                     break;
         case USERDEFS_AUTOMSG:                labelNum = cl_automsg;                      break;
         case USERDEFS_IDPLAYERS:              labelNum = cl_idplayers;                    break;
-        case USERDEFS_TEAM:                   labelNum = ud.team;                         break;
+        case USERDEFS_TEAM:                   labelNum = playerteam;                         break;
         case USERDEFS_VIEWBOB:                labelNum = cl_viewbob;                      break;
         case USERDEFS_WEAPONSWAY:             labelNum = cl_weaponsway;                   break;
         case USERDEFS_ANGLEINTERPOLATION:     labelNum = ud.angleinterpolation;           break;
@@ -1480,7 +1480,7 @@ int32_t __fastcall VM_GetUserdef(int32_t labelNum, int const lParm2)
         case USERDEFS_USEHIGHTILE:            labelNum = hw_hightile;                     break;
         case USERDEFS_USEMODELS:              labelNum = hw_models;                       break;
         case USERDEFS_GAMETYPEFLAGS:          labelNum = g_gametypeFlags[ud.coop];        break;
-        case USERDEFS_M_GAMETYPEFLAGS:        labelNum = g_gametypeFlags[ud.m_coop];      break;
+        case USERDEFS_M_GAMETYPEFLAGS:        labelNum = g_gametypeFlags[m_coop];      break;
         case USERDEFS_GLOBALFLAGS:            labelNum = globalflags;                     break;
         case USERDEFS_GLOBALGAMEFLAGS:        labelNum = duke3d_globalflags;              break;
         case USERDEFS_VM_PLAYER:              labelNum = vm.playerNum;                    break;
@@ -1597,12 +1597,12 @@ void __fastcall VM_SetUserdef(int const labelNum, int const lParm2, int32_t cons
         case USERDEFS_ENTERED_NAME:                 ud.entered_name                  = iSet; break;
         case USERDEFS_SCREEN_TILTING:               ud.screen_tilting                = iSet; break;
         case USERDEFS_SHADOWS:                      r_shadows.SetGenericRepDefault(iSet, CVAR_Int); break;
-        case USERDEFS_FTA_ON:                       ud.fta_on                        = iSet; break;
+        case USERDEFS_FTA_ON:                       hud_messages                        = iSet; break;
         case USERDEFS_EXECUTIONS:                                                            break; // what was this supposed to accomplish?
         case USERDEFS_AUTO_RUN:                     cl_autorun.SetGenericRepDefault(iSet, CVAR_Int); break;
         case USERDEFS_COORDS:                       cl_showcoords.SetGenericRepDefault(iSet, CVAR_Int); break;
         case USERDEFS_TICKRATE:                     r_showfps                       = iSet; break;
-        case USERDEFS_M_COOP:                       ud.m_coop                        = iSet; break;
+        case USERDEFS_M_COOP:                       m_coop                        = iSet; break;
         case USERDEFS_COOP:                         ud.coop                          = iSet; break;
         case USERDEFS_SCREEN_SIZE:
             if (ud.screen_size != iSet)
@@ -1623,20 +1623,20 @@ void __fastcall VM_SetUserdef(int const labelNum, int const lParm2, int32_t cons
         case USERDEFS_M_RESPAWN_ITEMS:              ud.m_respawn_items               = iSet; break;
         case USERDEFS_M_RESPAWN_MONSTERS:           ud.m_respawn_monsters            = iSet; break;
         case USERDEFS_M_RESPAWN_INVENTORY:          ud.m_respawn_inventory           = iSet; break;
-        case USERDEFS_M_RECSTAT:                    ud.m_recstat                     = iSet; break;
+        case USERDEFS_M_RECSTAT:                    m_recstat                     = iSet; break;
         case USERDEFS_M_MONSTERS_OFF:               ud.m_monsters_off                = iSet; break;
         // REMINDER: must implement "boolean" setters like "!!iSet" in Lunatic, too.
-        case USERDEFS_DETAIL:                       ud.detail                        = clamp(iSet, 1, 16); break;
-        case USERDEFS_M_FFIRE:                      ud.m_ffire                       = iSet; break;
+        case USERDEFS_DETAIL:                       /*ud.detail                        = clamp(iSet, 1, 16); obsolete*/ break;
+        case USERDEFS_M_FFIRE:                      m_ffire                       = iSet; break;
         case USERDEFS_FFIRE:                        ud.ffire                         = iSet; break;
         case USERDEFS_M_PLAYER_SKILL:               ud.m_player_skill                = iSet; break;
-        case USERDEFS_M_LEVEL_NUMBER:               ud.m_level_number                = iSet; break;
+        case USERDEFS_M_LEVEL_NUMBER:               m_level_number                = iSet; break;
         case USERDEFS_M_VOLUME_NUMBER:              ud.m_volume_number               = iSet; break;
         case USERDEFS_MULTIMODE:                    ud.multimode                     = iSet; break;
         case USERDEFS_PLAYER_SKILL:                 ud.player_skill                  = iSet; break;
         case USERDEFS_LEVEL_NUMBER:                 ud.level_number                  = iSet; break;
         case USERDEFS_VOLUME_NUMBER:                ud.volume_number                 = iSet; break;
-        case USERDEFS_M_MARKER:                     ud.m_marker                      = iSet; break;
+        case USERDEFS_M_MARKER:                     m_marker                      = iSet; break;
         case USERDEFS_MARKER:                       ud.marker                        = iSet; break;
         case USERDEFS_MOUSEFLIP:                    in_mouseflip.SetGenericRepDefault(iSet, CVAR_Int); break;
         case USERDEFS_STATUSBARSCALE:               ud.statusbarscale                = iSet; break;
@@ -1644,15 +1644,15 @@ void __fastcall VM_SetUserdef(int const labelNum, int const lParm2, int32_t cons
         case USERDEFS_MOUSEAIMING:                  in_aimmode.SetGenericRepDefault(iSet, CVAR_Int); break;
         case USERDEFS_WEAPONSWITCH:                 cl_weaponswitch.SetGenericRepDefault(iSet, CVAR_Int); break;
         case USERDEFS_DEMOCAMS:                     cl_democams                      = iSet; break;
-        case USERDEFS_COLOR:                        ud.color                         = iSet; break;
+        case USERDEFS_COLOR:                        playercolor                         = iSet; break;
         case USERDEFS_MSGDISPTIME:                  hud_messagetime.SetGenericRepDefault(iSet, CVAR_Int); break;
         case USERDEFS_STATUSBARMODE:                ud.statusbarmode                 = iSet; break;
-        case USERDEFS_M_NOEXITS:                    ud.m_noexits                     = iSet; break;
+        case USERDEFS_M_NOEXITS:                    m_noexits                     = iSet; break;
         case USERDEFS_NOEXITS:                      ud.noexits                       = iSet; break;
         case USERDEFS_AUTOVOTE:                     cl_autovote.SetGenericRepDefault(iSet, CVAR_Int); break;
         case USERDEFS_AUTOMSG:                      cl_automsg.SetGenericRepDefault(iSet, CVAR_Int); break;
         case USERDEFS_IDPLAYERS:                    cl_idplayers.SetGenericRepDefault(iSet, CVAR_Int); break;
-        case USERDEFS_TEAM:                         ud.team                          = iSet; break;
+        case USERDEFS_TEAM:                         playerteam                          = iSet; break;
         case USERDEFS_VIEWBOB:                      cl_viewbob.SetGenericRepDefault(iSet, CVAR_Int); break;
         case USERDEFS_WEAPONSWAY:                   cl_weaponsway.SetGenericRepDefault(iSet, CVAR_Int); break;
         case USERDEFS_ANGLEINTERPOLATION:           ud.angleinterpolation            = iSet; break;
diff --git a/source/duke3d/src/menus.cpp b/source/duke3d/src/menus.cpp
index c76611de0..81f238ce6 100644
--- a/source/duke3d/src/menus.cpp
+++ b/source/duke3d/src/menus.cpp
@@ -36,6 +36,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 #include "c_bind.h"
 #include "../../glbackend/glbackend.h"
 
+bool ShowOptionMenu();
+
+namespace ImGui
+{
+	void ShowDemoWindow(bool*);
+}
+
 BEGIN_DUKE_NS
 
 
@@ -393,10 +400,10 @@ static int32_t MEOSV_GAMESETUP_AIM_AUTO[] = { 0, 1, 2,
 };
 
 static MenuOptionSet_t MEOS_GAMESETUP_AIM_AUTO = MAKE_MENUOPTIONSET( MEOSN_GAMESETUP_AIM_AUTO, MEOSV_GAMESETUP_AIM_AUTO, 0x2 );
-static MenuOption_t MEO_GAMESETUP_AIM_AUTO = MAKE_MENUOPTION( &MF_Redfont, &MEOS_GAMESETUP_AIM_AUTO, &cl_autoaim.Value );
+static MenuOption_t MEO_GAMESETUP_AIM_AUTO = MAKE_MENUOPTION( &MF_Redfont, &MEOS_GAMESETUP_AIM_AUTO, &cl_autoaim );
 static MenuEntry_t ME_GAMESETUP_AIM_AUTO = MAKE_MENUENTRY( "Auto aim:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_AIM_AUTO, Option );
 
-static MenuOption_t MEO_GAMESETUP_ALWAYS_RUN = MAKE_MENUOPTION( &MF_Redfont, &MEOS_NoYes, &cl_autorun.Value);
+static MenuOption_t MEO_GAMESETUP_ALWAYS_RUN = MAKE_MENUOPTION( &MF_Redfont, &MEOS_NoYes, &cl_autorun);
 static MenuEntry_t ME_GAMESETUP_ALWAYS_RUN = MAKE_MENUENTRY( "Always run:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_ALWAYS_RUN, Option );
 
 static char const *MEOSN_GAMESETUP_WEAPSWITCH_PICKUP[] = { "Never", "If new", /*"If favored",*/ };
@@ -406,10 +413,10 @@ static MenuEntry_t ME_GAMESETUP_WEAPSWITCH_PICKUP = MAKE_MENUENTRY( "Equip picku
 
 static char const *MEOSN_DemoRec[] = { "Off", "Running", };
 static MenuOptionSet_t MEOS_DemoRec = MAKE_MENUOPTIONSET( MEOSN_DemoRec, NULL, 0x3 );
-static MenuOption_t MEO_GAMESETUP_DEMOREC = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &ud.m_recstat );
+static MenuOption_t MEO_GAMESETUP_DEMOREC = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &m_recstat );
 static MenuEntry_t ME_GAMESETUP_DEMOREC = MAKE_MENUENTRY( "Record demo:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_DEMOREC, Option );
 
-static MenuOption_t MEO_ADULTMODE = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &adult_lockout.Value);
+static MenuOption_t MEO_ADULTMODE = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &adult_lockout);
 static MenuEntry_t ME_ADULTMODE = MAKE_MENUENTRY( "Parental lock:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_ADULTMODE, Option );
 
 #if defined(EDUKE32_ANDROID_MENU) || !defined(EDUKE32_SIMPLE_MENU)
@@ -448,7 +455,14 @@ MAKE_MENU_TOP_ENTRYLINK( "Touch Setup", MEF_BigOptionsRtSections, OPTIONS_TOUCHS
 MAKE_MENU_TOP_ENTRYLINK("Cheats", MEF_OptionsMenu, OPTIONS_CHEATS, MENU_CHEATS);
 #endif
 
-static int32_t newresolution, newrendermode, newfullscreen, newvsync, newborderless;
+// Zhe menu code lacks flexibility, it can either be hardwired to ints or to CVARs.
+// Since CVARs are more important it means that these need to be implemented as CVARs even though they are just temporaries.
+// By giving them no name we ensure that they remain outside the CVAR system.
+CVAR_UNAMED(Int, newresolution)
+CVAR_UNAMED(Int, newrendermode)
+CVAR_UNAMED(Int, newfullscreen)
+CVAR_UNAMED(Int, newvsync)
+CVAR_UNAMED(Int, newborderless)
 
 enum resflags_t {
     RES_FS  = 0x1,
@@ -472,13 +486,8 @@ static MenuOption_t MEO_VIDEOSETUP_RESOLUTION = MAKE_MENUOPTION( &MF_Redfont, &M
 static MenuEntry_t ME_VIDEOSETUP_RESOLUTION = MAKE_MENUENTRY( "Resolution:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_VIDEOSETUP_RESOLUTION, Option );
 
 #ifdef USE_OPENGL
-#ifdef POLYMER
-static char const *MEOSN_VIDEOSETUP_RENDERER[] = { "Classic", "Polymost", "Polymer", };
-static int32_t MEOSV_VIDEOSETUP_RENDERER[] = { REND_CLASSIC, REND_POLYMOST, REND_POLYMER, };
-#else
 static char const *MEOSN_VIDEOSETUP_RENDERER[] = { "Classic", "OpenGL", };
 static int32_t MEOSV_VIDEOSETUP_RENDERER[] = { REND_CLASSIC, REND_POLYMOST, };
-#endif
 
 static MenuOptionSet_t MEOS_VIDEOSETUP_RENDERER = MAKE_MENUOPTIONSET( MEOSN_VIDEOSETUP_RENDERER, MEOSV_VIDEOSETUP_RENDERER, 0x2 );
 
@@ -512,85 +521,53 @@ static MenuLink_t MEO_DISPLAYSETUP_COLORCORR = { MENU_COLCORR, MA_Advance, };
 static MenuEntry_t ME_DISPLAYSETUP_COLORCORR = MAKE_MENUENTRY( "Color Correction", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_COLORCORR, Link );
 
 
-static char const *MEOSN_DISPLAYSETUP_UPSCALING[] = { "None", "2x" };
-static int32_t MEOSV_DISPLAYSETUP_UPSCALING[] = { 1, 2 };
-static MenuOptionSet_t MEOS_DISPLAYSETUP_UPSCALING = MAKE_MENUOPTIONSET( MEOSN_DISPLAYSETUP_UPSCALING, MEOSV_DISPLAYSETUP_UPSCALING, 0x0 );
-static MenuOption_t MEO_DISPLAYSETUP_UPSCALING = MAKE_MENUOPTION( &MF_Redfont, &MEOS_DISPLAYSETUP_UPSCALING, &ud.detail );
-static MenuEntry_t ME_DISPLAYSETUP_UPSCALING = MAKE_MENUENTRY( "Upscaling:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_UPSCALING, Option );
-
-
 #ifndef EDUKE32_ANDROID_MENU
 static MenuOption_t MEO_DISPLAYSETUP_ASPECTRATIO = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &r_usenewaspect);
 static MenuEntry_t ME_DISPLAYSETUP_ASPECTRATIO = MAKE_MENUENTRY( "Widescreen:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_ASPECTRATIO, Option );
 #endif
 
-static MenuOption_t MEO_DISPLAYSETUP_VOXELS = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &r_voxels.Value);
+static MenuOption_t MEO_DISPLAYSETUP_VOXELS = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &r_voxels);
 static MenuEntry_t ME_DISPLAYSETUP_VOXELS = MAKE_MENUENTRY( "Voxels:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_VOXELS, Option );
 
-static MenuRangeInt32_t MEO_DISPLAYSETUP_FOV = MAKE_MENURANGE( &r_fov.Value, &MF_Redfont, 70, 120, 0, 11, 1 );
+static MenuRangeInt32_t MEO_DISPLAYSETUP_FOV = MAKE_MENURANGE( &r_fov, &MF_Redfont, 70, 120, 0, 11, 1 );
 static MenuEntry_t ME_DISPLAYSETUP_FOV = MAKE_MENUENTRY( "FOV:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_FOV, RangeInt32 );
 
 
 #ifdef USE_OPENGL
-# if !(defined EDUKE32_STANDALONE) || defined POLYMER
-#define TEXFILTER_MENU_OPTIONS
-//POGOTODO: allow filtering again in standalone once indexed colour textures support filtering
-#ifdef TEXFILTER_MENU_OPTIONS
 static char const *MEOSN_DISPLAYSETUP_TEXFILTER[] = { "Classic", "Filtered" };
 static int32_t MEOSV_DISPLAYSETUP_TEXFILTER[] = { TEXFILTER_OFF, TEXFILTER_ON };
 static MenuOptionSet_t MEOS_DISPLAYSETUP_TEXFILTER = MAKE_MENUOPTIONSET( MEOSN_DISPLAYSETUP_TEXFILTER, MEOSV_DISPLAYSETUP_TEXFILTER, 0x2 );
-static MenuOption_t MEO_DISPLAYSETUP_TEXFILTER = MAKE_MENUOPTION( &MF_Redfont, &MEOS_DISPLAYSETUP_TEXFILTER, &hw_texfilter.Value );
+static MenuOption_t MEO_DISPLAYSETUP_TEXFILTER = MAKE_MENUOPTION( &MF_Redfont, &MEOS_DISPLAYSETUP_TEXFILTER, &hw_texfilter );
 static MenuEntry_t ME_DISPLAYSETUP_TEXFILTER = MAKE_MENUENTRY( "Texture Mode:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_TEXFILTER, Option );
 
 static char const *MEOSN_DISPLAYSETUP_ANISOTROPY[] = { "Max", "None", "2x", "4x", "8x", "16x", };
 static int32_t MEOSV_DISPLAYSETUP_ANISOTROPY[] = { 0, 1, 2, 4, 8, 16, };
 static MenuOptionSet_t MEOS_DISPLAYSETUP_ANISOTROPY = MAKE_MENUOPTIONSET( MEOSN_DISPLAYSETUP_ANISOTROPY, MEOSV_DISPLAYSETUP_ANISOTROPY, 0x0 );
-static MenuOption_t MEO_DISPLAYSETUP_ANISOTROPY = MAKE_MENUOPTION(&MF_Redfont, &MEOS_DISPLAYSETUP_ANISOTROPY, &hw_anisotropy.Value);
+static MenuOption_t MEO_DISPLAYSETUP_ANISOTROPY = MAKE_MENUOPTION(&MF_Redfont, &MEOS_DISPLAYSETUP_ANISOTROPY, &hw_anisotropy);
 static MenuEntry_t ME_DISPLAYSETUP_ANISOTROPY = MAKE_MENUENTRY( "Anisotropy:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_ANISOTROPY, Option );
-#endif
-# endif
-
-# ifdef EDUKE32_ANDROID_MENU
-static MenuOption_t MEO_DISPLAYSETUP_HIDEDPAD = MAKE_MENUOPTION(&MF_Redfont, &MEOS_NoYes, &droidinput.hideStick);
-static MenuEntry_t ME_DISPLAYSETUP_HIDEDPAD = MAKE_MENUENTRY("Hide touch D-pad:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_HIDEDPAD, Option);
-
-static MenuRangeFloat_t MEO_DISPLAYSETUP_TOUCHALPHA = MAKE_MENURANGE(&droidinput.gameControlsAlpha, &MF_Redfont, 0, 1, 0, 16, 2);
-static MenuEntry_t ME_DISPLAYSETUP_TOUCHALPHA = MAKE_MENUENTRY("UI opacity:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_TOUCHALPHA, RangeFloat);
-# endif
 
 #endif
 
 static char const s_Scale[] = "Scale:";
 
-static MenuOption_t MEO_SCREENSETUP_CROSSHAIR = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &cl_crosshair.Value);
+static MenuOption_t MEO_SCREENSETUP_CROSSHAIR = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &cl_crosshair);
 static MenuEntry_t ME_SCREENSETUP_CROSSHAIR = MAKE_MENUENTRY( "Crosshair:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SCREENSETUP_CROSSHAIR, Option );
-static MenuRangeInt32_t MEO_SCREENSETUP_CROSSHAIRSIZE = MAKE_MENURANGE( &cl_crosshairscale.Value, &MF_Redfont, 25, 100, 0, 16, 2 );
+static MenuRangeInt32_t MEO_SCREENSETUP_CROSSHAIRSIZE = MAKE_MENURANGE( &cl_crosshairscale, &MF_Redfont, 25, 100, 0, 16, 2 );
 static MenuEntry_t ME_SCREENSETUP_CROSSHAIRSIZE = MAKE_MENUENTRY( s_Scale, &MF_Redfont, &MEF_BigOptions_Apply, &MEO_SCREENSETUP_CROSSHAIRSIZE, RangeInt32 );
 
-static int32_t vpsize;
-static MenuRangeInt32_t MEO_SCREENSETUP_SCREENSIZE = MAKE_MENURANGE( &vpsize, &MF_Redfont, 0, 0, 0, 1, EnforceIntervals );
-static MenuOption_t MEO_SCREENSETUP_SCREENSIZE_TWO = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &vpsize );
+static MenuRangeInt32_t MEO_SCREENSETUP_SCREENSIZE = MAKE_MENURANGE( &hud_size, &MF_Redfont, 0, 11, 0, 1, EnforceIntervals );
+static MenuOption_t MEO_SCREENSETUP_SCREENSIZE_TWO = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &hud_size );
 static MenuEntry_t ME_SCREENSETUP_SCREENSIZE = MAKE_MENUENTRY( "Status bar:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SCREENSETUP_SCREENSIZE, RangeInt32 );
-static MenuRangeInt32_t MEO_SCREENSETUP_TEXTSIZE = MAKE_MENURANGE( &hud_textscale.Value, &MF_Redfont, 100, 400, 0, 16, 2 );
+static MenuRangeInt32_t MEO_SCREENSETUP_TEXTSIZE = MAKE_MENURANGE( &hud_textscale, &MF_Redfont, 100, 400, 0, 16, 2 );
 static MenuEntry_t ME_SCREENSETUP_TEXTSIZE = MAKE_MENUENTRY( s_Scale, &MF_Redfont, &MEF_BigOptions_Apply, &MEO_SCREENSETUP_TEXTSIZE, RangeInt32 );
-static MenuOption_t MEO_SCREENSETUP_LEVELSTATS = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &hud_stats.Value);
+static MenuOption_t MEO_SCREENSETUP_LEVELSTATS = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &hud_stats);
 static MenuEntry_t ME_SCREENSETUP_LEVELSTATS = MAKE_MENUENTRY( "Level stats:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SCREENSETUP_LEVELSTATS, Option );
 
 
-static MenuOption_t MEO_SCREENSETUP_SHOWPICKUPMESSAGES = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &ud.fta_on);
+static MenuOption_t MEO_SCREENSETUP_SHOWPICKUPMESSAGES = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &hud_messages);
 static MenuEntry_t ME_SCREENSETUP_SHOWPICKUPMESSAGES = MAKE_MENUENTRY( "Game messages:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SCREENSETUP_SHOWPICKUPMESSAGES, Option );
 
-
-
-#ifdef EDUKE32_ANDROID_MENU
-static char const *MEOSN_SCREENSETUP_STATUSBARONTOP[] = { "Bottom", "Top" };
-static int32_t MEOSV_SCREENSETUP_STATUSBARONTOP[] = { 0, 1 };
-static MenuOptionSet_t MEOS_SCREENSETUP_STATUSBARONTOP = MAKE_MENUOPTIONSET( MEOSN_SCREENSETUP_STATUSBARONTOP, MEOSV_SCREENSETUP_STATUSBARONTOP, 0x2 );
-static MenuOption_t MEO_SCREENSETUP_STATUSBARONTOP = MAKE_MENUOPTION(&MF_Redfont, &MEOS_SCREENSETUP_STATUSBARONTOP, &hud_position.Value);
-static MenuEntry_t ME_SCREENSETUP_STATUSBARONTOP = MAKE_MENUENTRY( "Status bar:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SCREENSETUP_STATUSBARONTOP, Option );
-#endif
-
-static MenuRangeInt32_t MEO_SCREENSETUP_SBARSIZE = MAKE_MENURANGE( &ud.statusbarscale, &MF_Redfont, 50, 100, 0, 10, 2 );
+static MenuRangeInt32_t MEO_SCREENSETUP_SBARSIZE = MAKE_MENURANGE( &hud_scale, &MF_Redfont, 50, 100, 0, 10, 2 );
 static MenuEntry_t ME_SCREENSETUP_SBARSIZE = MAKE_MENUENTRY( s_Scale, &MF_Redfont, &MEF_BigOptions_Apply, &MEO_SCREENSETUP_SBARSIZE, RangeInt32 );
 
 
@@ -598,16 +575,9 @@ static MenuLink_t MEO_DISPLAYSETUP_SCREENSETUP = { MENU_SCREENSETUP, MA_Advance,
 static MenuEntry_t ME_DISPLAYSETUP_SCREENSETUP = MAKE_MENUENTRY( "HUD setup", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_SCREENSETUP, Link );
 
 
-#ifndef EDUKE32_SIMPLE_MENU
 #ifdef USE_OPENGL
 static MenuLink_t MEO_DISPLAYSETUP_ADVANCED_GL_POLYMOST = { MENU_POLYMOST, MA_Advance, };
 static MenuEntry_t ME_DISPLAYSETUP_ADVANCED_GL_POLYMOST = MAKE_MENUENTRY( "Polymost setup", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_ADVANCED_GL_POLYMOST, Link );
-
-#ifdef POLYMER
-static MenuLink_t MEO_DISPLAYSETUP_ADVANCED_GL_POLYMER = { MENU_POLYMER, MA_Advance, };
-static MenuEntry_t ME_DISPLAYSETUP_ADVANCED_GL_POLYMER = MAKE_MENUENTRY("Polymer setup", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_ADVANCED_GL_POLYMER, Link);
-#endif
-#endif
 #endif
 
 #ifndef EDUKE32_ANDROID_MENU
@@ -710,60 +680,22 @@ static MenuEntry_t *MEL_DISPLAYSETUP[] = {
     &ME_DISPLAYSETUP_VOXELS,
     &ME_DISPLAYSETUP_FOV,
 #endif
-    &ME_DISPLAYSETUP_UPSCALING,
 };
 
 #ifdef USE_OPENGL
 static MenuEntry_t *MEL_DISPLAYSETUP_GL[] = {
     &ME_DISPLAYSETUP_SCREENSETUP,
     &ME_DISPLAYSETUP_COLORCORR,
-#ifndef EDUKE32_ANDROID_MENU
     &ME_DISPLAYSETUP_VIDEOSETUP,
     &ME_DISPLAYSETUP_ASPECTRATIO,
     &ME_DISPLAYSETUP_VOXELS,
     &ME_DISPLAYSETUP_FOV,
-#endif
-#ifndef EDUKE32_STANDALONE
-# ifdef TEXFILTER_MENU_OPTIONS
     &ME_DISPLAYSETUP_TEXFILTER,
-# endif
-#endif
-#ifdef EDUKE32_ANDROID_MENU
-    &ME_DISPLAYSETUP_HIDEDPAD,
-    &ME_DISPLAYSETUP_TOUCHALPHA,
-#else
-# ifndef EDUKE32_STANDALONE
-#  ifdef TEXFILTER_MENU_OPTIONS
     &ME_DISPLAYSETUP_ANISOTROPY,
-#  endif
-# endif
-# ifndef EDUKE32_SIMPLE_MENU
     &ME_DISPLAYSETUP_ADVANCED_GL_POLYMOST,
-# endif
 #endif
 };
 
-#ifdef POLYMER
-static MenuEntry_t *MEL_DISPLAYSETUP_GL_POLYMER[] = {
-    &ME_DISPLAYSETUP_SCREENSETUP,
-    &ME_DISPLAYSETUP_COLORCORR,
-#ifndef EDUKE32_ANDROID_MENU
-    &ME_DISPLAYSETUP_VIDEOSETUP,
-    &ME_DISPLAYSETUP_FOV,
-    &ME_DISPLAYSETUP_VOXELS,
-#endif
-#ifdef TEXFILTER_MENU_OPTIONS
-    &ME_DISPLAYSETUP_TEXFILTER,
-    &ME_DISPLAYSETUP_ANISOTROPY,
-#endif
-#ifndef EDUKE32_SIMPLE_MENU
-    &ME_DISPLAYSETUP_ADVANCED_GL_POLYMER,
-#endif
-};
-
-#endif
-#endif
-
 
 
 static char const *MenuKeyNone = "  -";
@@ -830,37 +762,32 @@ static int32_t MenuMouseDataIndex[MENUMOUSEFUNCTIONS][2] = {
 static MenuOption_t MEO_MOUSEJOYSETUPBTNS_TEMPLATE = MAKE_MENUOPTION( &MF_Minifont, &MEOS_Gamefuncs, NULL );
 static MenuOption_t MEO_MOUSESETUPBTNS[MENUMOUSEFUNCTIONS];
 static MenuEntry_t ME_MOUSEJOYSETUPBTNS_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Minifont, &MEF_FuncList, NULL, Option );
-static MenuEntry_t ME_MOUSESETUPBTNS[MENUMOUSEFUNCTIONS];
-static MenuEntry_t *MEL_MOUSESETUPBTNS[MENUMOUSEFUNCTIONS];
 
-static MenuLink_t MEO_MOUSESETUP_BTNS = { MENU_MOUSEBTNS, MA_Advance, };
-static MenuEntry_t ME_MOUSESETUP_BTNS = MAKE_MENUENTRY( "Button assignment", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_BTNS, Link );
-static MenuRangeFloat_t MEO_MOUSESETUP_SENSITIVITY = MAKE_MENURANGE( &CONTROL_MouseSensitivity, &MF_Redfont, .5f, 16.f, 0.f, 32, 1 );
+static MenuRangeFloat_t MEO_MOUSESETUP_SENSITIVITY = MAKE_MENURANGE( &in_mousesensitivity, &MF_Redfont, .5f, 16.f, 0.f, 32, 1 );
 static MenuEntry_t ME_MOUSESETUP_SENSITIVITY = MAKE_MENUENTRY( "Sensitivity:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_SENSITIVITY, RangeFloat );
 
 #ifndef EDUKE32_SIMPLE_MENU
 static char const *MEOSN_MOUSESETUP_AIM_TYPE [] = { "Toggle", "Hold" };
 static MenuOptionSet_t MEOS_MOUSESETUP_AIM_TYPE = MAKE_MENUOPTIONSET(MEOSN_MOUSESETUP_AIM_TYPE, NULL, 0x2);
-static MenuOption_t MEO_MOUSESETUP_MOUSEAIMINGTYPE = MAKE_MENUOPTION(&MF_Redfont, &MEOS_MOUSESETUP_AIM_TYPE, &in_aimmode.Value);
+static MenuOption_t MEO_MOUSESETUP_MOUSEAIMINGTYPE = MAKE_MENUOPTION(&MF_Redfont, &MEOS_MOUSESETUP_AIM_TYPE, &in_aimmode);
 static MenuEntry_t ME_MOUSESETUP_MOUSEAIMINGTYPE = MAKE_MENUENTRY("Aiming type:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_MOUSEAIMINGTYPE, Option);
-static MenuOption_t MEO_MOUSESETUP_MOUSEAIMING = MAKE_MENUOPTION( &MF_Redfont, &MEOS_NoYes, &in_mousemode.Value );
+static MenuOption_t MEO_MOUSESETUP_MOUSEAIMING = MAKE_MENUOPTION( &MF_Redfont, &MEOS_NoYes, &in_mousemode );
 static MenuEntry_t ME_MOUSESETUP_MOUSEAIMING = MAKE_MENUENTRY( "Vertical aiming:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_MOUSEAIMING, Option );
 #endif
-static MenuOption_t MEO_MOUSESETUP_INVERT = MAKE_MENUOPTION( &MF_Redfont, &MEOS_YesNo, &in_mouseflip.Value );
+static MenuOption_t MEO_MOUSESETUP_INVERT = MAKE_MENUOPTION( &MF_Redfont, &MEOS_YesNo, &in_mouseflip );
 static MenuEntry_t ME_MOUSESETUP_INVERT = MAKE_MENUENTRY( "Invert aiming:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_INVERT, Option );
-static MenuOption_t MEO_MOUSESETUP_SMOOTH = MAKE_MENUOPTION( &MF_Redfont, &MEOS_NoYes, &in_mousesmoothing.Value );
+static MenuOption_t MEO_MOUSESETUP_SMOOTH = MAKE_MENUOPTION( &MF_Redfont, &MEOS_NoYes, &in_mousesmoothing );
 static MenuEntry_t ME_MOUSESETUP_SMOOTH = MAKE_MENUENTRY( "Filter input:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_SMOOTH, Option );
 #ifndef EDUKE32_SIMPLE_MENU
 static MenuLink_t MEO_MOUSESETUP_ADVANCED = { MENU_MOUSEADVANCED, MA_Advance, };
 static MenuEntry_t ME_MOUSESETUP_ADVANCED = MAKE_MENUENTRY( "Advanced setup", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_ADVANCED, Link );
 #endif
-static MenuRangeInt32_t MEO_MOUSEADVANCED_SCALEX = MAKE_MENURANGE(&MouseAnalogueScale[0], &MF_Redfont, -262144, 262144, 65536, 161, 3);
+static MenuRangeInt32_t MEO_MOUSEADVANCED_SCALEX = MAKE_MENURANGE(&in_mousescalex, &MF_Redfont, -262144, 262144, 65536, 161, 3);
 static MenuEntry_t ME_MOUSEADVANCED_SCALEX = MAKE_MENUENTRY("X-Scale:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSEADVANCED_SCALEX, RangeInt32);
-static MenuRangeInt32_t MEO_MOUSEADVANCED_SCALEY = MAKE_MENURANGE(&MouseAnalogueScale[1], &MF_Redfont, -262144, 262144, 65536, 161, 3);
+static MenuRangeInt32_t MEO_MOUSEADVANCED_SCALEY = MAKE_MENURANGE(&in_mousescaley, &MF_Redfont, -262144, 262144, 65536, 161, 3);
 static MenuEntry_t ME_MOUSEADVANCED_SCALEY = MAKE_MENUENTRY("Y-Scale:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSEADVANCED_SCALEY, RangeInt32);
 
 static MenuEntry_t *MEL_MOUSESETUP[] = {
-    &ME_MOUSESETUP_BTNS,
     &ME_MOUSESETUP_SENSITIVITY,
 #ifdef EDUKE32_SIMPLE_MENU
     &ME_MOUSEADVANCED_SCALEX,
@@ -910,7 +837,7 @@ static MenuEntry_t *MEL_TOUCHSENS [] = {
 };
 #endif
 
-static MenuOption_t MEO_JOYSTICK_ENABLE = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &in_joystick.Value );
+static MenuOption_t MEO_JOYSTICK_ENABLE = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &in_joystick );
 static MenuEntry_t ME_JOYSTICK_ENABLE = MAKE_MENUENTRY( "Enable Gamepad:", &MF_Redfont, &MEF_BigOptionsRtSections, &MEO_JOYSTICK_ENABLE, Option );
 
 MAKE_MENU_TOP_ENTRYLINK( "Edit Buttons", MEF_BigOptionsRtSections, JOYSTICK_EDITBUTTONS, MENU_JOYSTICKBTNS );
@@ -992,28 +919,23 @@ static MenuEntry_t *MEL_INTERNAL_JOYSTICKAXIS_DIGITAL[] = {
 };
 
 #ifdef USE_OPENGL
-static MenuOption_t MEO_RENDERERSETUP_HIGHTILE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NoYes, &hw_hightile.Value );
+static MenuOption_t MEO_RENDERERSETUP_HIGHTILE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NoYes, &hw_hightile );
 static MenuEntry_t ME_RENDERERSETUP_HIGHTILE = MAKE_MENUENTRY( "True color textures:", &MF_Bluefont, &MEF_SmallOptions, &MEO_RENDERERSETUP_HIGHTILE, Option );
 
-static char const *MEOSN_RENDERERSETUP_TEXQUALITY [] = { "Full", "Half", "Barf", };
-static MenuOptionSet_t MEOS_RENDERERSETUP_TEXQUALITY = MAKE_MENUOPTIONSET(MEOSN_RENDERERSETUP_TEXQUALITY, NULL, 0x2);
-static MenuOption_t MEO_RENDERERSETUP_TEXQUALITY = MAKE_MENUOPTION(&MF_Bluefont, &MEOS_RENDERERSETUP_TEXQUALITY, &r_downsize);
-static MenuEntry_t ME_RENDERERSETUP_TEXQUALITY = MAKE_MENUENTRY("GL texture quality:", &MF_Bluefont, &MEF_SmallOptions, &MEO_RENDERERSETUP_TEXQUALITY, Option);
 
-
-static MenuOption_t MEO_RENDERERSETUP_PRECACHE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &r_precache.Value );
+static MenuOption_t MEO_RENDERERSETUP_PRECACHE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &r_precache );
 static MenuEntry_t ME_RENDERERSETUP_PRECACHE = MAKE_MENUENTRY( "Pre-load map textures:", &MF_Bluefont, &MEF_SmallOptions, &MEO_RENDERERSETUP_PRECACHE, Option );
 # ifndef EDUKE32_GLES
 static char const *MEOSN_RENDERERSETUP_TEXCACHE[] = { "Off", "On", "Compr.", };
 static MenuOptionSet_t MEOS_RENDERERSETUP_TEXCACHE = MAKE_MENUOPTIONSET( MEOSN_RENDERERSETUP_TEXCACHE, NULL, 0x2 );
 # endif
 # ifdef USE_GLEXT
-static MenuOption_t MEO_RENDERERSETUP_DETAILTEX = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NoYes, &hw_detailmapping.Value );
+static MenuOption_t MEO_RENDERERSETUP_DETAILTEX = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NoYes, &hw_detailmapping );
 static MenuEntry_t ME_RENDERERSETUP_DETAILTEX = MAKE_MENUENTRY( "Detail textures:", &MF_Bluefont, &MEF_SmallOptions, &MEO_RENDERERSETUP_DETAILTEX, Option );
-static MenuOption_t MEO_RENDERERSETUP_GLOWTEX = MAKE_MENUOPTION(&MF_Bluefont, &MEOS_NoYes, &hw_glowmapping.Value);
+static MenuOption_t MEO_RENDERERSETUP_GLOWTEX = MAKE_MENUOPTION(&MF_Bluefont, &MEOS_NoYes, &hw_glowmapping);
 static MenuEntry_t ME_RENDERERSETUP_GLOWTEX = MAKE_MENUENTRY("Glow textures:", &MF_Bluefont, &MEF_SmallOptions, &MEO_RENDERERSETUP_GLOWTEX, Option);
 # endif
-static MenuOption_t MEO_RENDERERSETUP_MODELS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NoYes, &hw_models.Value );
+static MenuOption_t MEO_RENDERERSETUP_MODELS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NoYes, &hw_models );
 static MenuEntry_t ME_RENDERERSETUP_MODELS = MAKE_MENUENTRY( "3D models:", &MF_Bluefont, &MEF_SmallOptions, &MEO_RENDERERSETUP_MODELS, Option );
 #endif
 
@@ -1021,7 +943,6 @@ static MenuEntry_t ME_RENDERERSETUP_MODELS = MAKE_MENUENTRY( "3D models:", &MF_B
 #ifdef USE_OPENGL
 static MenuEntry_t *MEL_RENDERERSETUP_POLYMOST[] = {
     &ME_RENDERERSETUP_HIGHTILE,
-    &ME_RENDERERSETUP_TEXQUALITY,
     &ME_RENDERERSETUP_PRECACHE,
 # ifdef USE_GLEXT
     &ME_RENDERERSETUP_DETAILTEX,
@@ -1033,15 +954,11 @@ static MenuEntry_t *MEL_RENDERERSETUP_POLYMOST[] = {
 
 #endif
 
-#ifdef EDUKE32_ANDROID_MENU
-static MenuRangeFloat_t MEO_COLCORR_GAMMA = MAKE_MENURANGE( &g_videoGamma, &MF_Bluefont, 1.f, 2.5f, 0.f, 39, 1 );
-#else
-static MenuRangeFloat_t MEO_COLCORR_GAMMA = MAKE_MENURANGE( &g_videoGamma, &MF_Bluefont, 0.3f, 4.f, 0.f, 75, 1 );
-#endif
+static MenuRangeFloat_t MEO_COLCORR_GAMMA = MAKE_MENURANGE( &vid_gamma, &MF_Bluefont, 0.3f, 4.f, 0.f, 75, 1 );
 static MenuEntry_t ME_COLCORR_GAMMA = MAKE_MENUENTRY( "Gamma:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_GAMMA, RangeFloat );
-static MenuRangeFloat_t MEO_COLCORR_CONTRAST = MAKE_MENURANGE( &g_videoContrast, &MF_Bluefont, 0.1f, 2.7f, 0.f, 53, 1 );
+static MenuRangeFloat_t MEO_COLCORR_CONTRAST = MAKE_MENURANGE( &vid_contrast, &MF_Bluefont, 0.1f, 2.7f, 0.f, 53, 1 );
 static MenuEntry_t ME_COLCORR_CONTRAST = MAKE_MENUENTRY( "Contrast:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_CONTRAST, RangeFloat );
-static MenuRangeFloat_t MEO_COLCORR_BRIGHTNESS = MAKE_MENURANGE( &g_videoBrightness, &MF_Bluefont, -0.8f, 0.8f, 0.f, 33, 1 );
+static MenuRangeFloat_t MEO_COLCORR_BRIGHTNESS = MAKE_MENURANGE( &vid_brightness, &MF_Bluefont, -0.8f, 0.8f, 0.f, 33, 1 );
 static MenuEntry_t ME_COLCORR_BRIGHTNESS = MAKE_MENUENTRY( "Brightness:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_BRIGHTNESS, RangeFloat );
 static MenuLink_t MEO_COLCORR_RESET = { MENU_COLCORRRESETVERIFY, MA_None, };
 static MenuEntry_t ME_COLCORR_RESET = MAKE_MENUENTRY( "Reset To Defaults", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_RESET, Link );
@@ -1051,7 +968,7 @@ static MenuEntry_t ME_COLCORR_RESET = MAKE_MENUENTRY( "Reset To Defaults", &MF_R
 #define MINVIS 0.125f
 #endif
 #ifndef EDUKE32_SIMPLE_MENU
-static MenuRangeFloat_t MEO_COLCORR_AMBIENT = MAKE_MENURANGE( &r_ambientlight.Value, &MF_Bluefont, MINVIS, 4.f, 0.f, 32, 1 );
+static MenuRangeFloat_t MEO_COLCORR_AMBIENT = MAKE_MENURANGE( &r_ambientlight, &MF_Bluefont, MINVIS, 4.f, 0.f, 32, 1 );
 static MenuEntry_t ME_COLCORR_AMBIENT = MAKE_MENUENTRY( "Visibility:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_AMBIENT, RangeFloat );
 #endif
 static MenuEntry_t *MEL_COLCORR[] = {
@@ -1099,19 +1016,21 @@ static MenuEntry_t ME_SAVE_NEW = MAKE_MENUENTRY( s_NewSaveGame, &MF_Minifont, &M
 static MenuEntry_t *ME_SAVE;
 static MenuEntry_t **MEL_SAVE;
 
-static int32_t soundrate, soundvoices, musicdevice;
-static MenuOption_t MEO_SOUND = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &snd_enabled.Value );
+CVAR_UNAMED(Int, soundrate)
+CVAR_UNAMED(Int, soundvoices)
+CVAR_UNAMED(Int, musicdevice)
+static MenuOption_t MEO_SOUND = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &snd_enabled );
 static MenuEntry_t ME_SOUND = MAKE_MENUENTRY( "Sound:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND, Option );
 
-static MenuOption_t MEO_SOUND_MUSIC = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &mus_enabled.Value );
+static MenuOption_t MEO_SOUND_MUSIC = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &mus_enabled );
 static MenuEntry_t ME_SOUND_MUSIC = MAKE_MENUENTRY( "Music:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_MUSIC, Option );
 
 static char const s_Volume[] = "Volume:";
 
-static MenuRangeInt32_t MEO_SOUND_VOLUME_FX = MAKE_MENURANGE( &snd_fxvolume.Value, &MF_Redfont, 0, 255, 0, 33, 2 );
+static MenuRangeInt32_t MEO_SOUND_VOLUME_FX = MAKE_MENURANGE( &snd_fxvolume, &MF_Redfont, 0, 255, 0, 33, 2 );
 static MenuEntry_t ME_SOUND_VOLUME_FX = MAKE_MENUENTRY( s_Volume, &MF_Redfont, &MEF_BigOptions_Apply, &MEO_SOUND_VOLUME_FX, RangeInt32 );
 
-static MenuRangeInt32_t MEO_SOUND_VOLUME_MUSIC = MAKE_MENURANGE( &mus_volume.Value, &MF_Redfont, 0, 255, 0, 33, 2 );
+static MenuRangeInt32_t MEO_SOUND_VOLUME_MUSIC = MAKE_MENURANGE( &mus_volume, &MF_Redfont, 0, 255, 0, 33, 2 );
 static MenuEntry_t ME_SOUND_VOLUME_MUSIC = MAKE_MENUENTRY( s_Volume, &MF_Redfont, &MEF_BigOptions_Apply, &MEO_SOUND_VOLUME_MUSIC, RangeInt32 );
 
 #ifndef EDUKE32_STANDALONE
@@ -1180,12 +1099,12 @@ static MenuEntry_t *MEL_ADVSOUND[] = {
 };
 
 
-static MenuOption_t MEO_SAVESETUP_AUTOSAVE = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &cl_autosave.Value );
+static MenuOption_t MEO_SAVESETUP_AUTOSAVE = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &cl_autosave );
 static MenuEntry_t ME_SAVESETUP_AUTOSAVE = MAKE_MENUENTRY( "Checkpoints:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SAVESETUP_AUTOSAVE, Option );
 
-static MenuOption_t MEO_SAVESETUP_AUTOSAVEDELETION = MAKE_MENUOPTION( &MF_Redfont, &MEOS_NoYes, &cl_autosavedeletion.Value );
+static MenuOption_t MEO_SAVESETUP_AUTOSAVEDELETION = MAKE_MENUOPTION( &MF_Redfont, &MEOS_NoYes, &cl_autosavedeletion );
 static MenuEntry_t ME_SAVESETUP_AUTOSAVEDELETION = MAKE_MENUENTRY( "Auto-Delete:", &MF_Redfont, &MEF_BigOptions_Apply, &MEO_SAVESETUP_AUTOSAVEDELETION, Option );
-static MenuRangeInt32_t MEO_SAVESETUP_MAXAUTOSAVES = MAKE_MENURANGE( &cl_maxautosaves.Value, &MF_Redfont, 1, 10, 0, 10, 1 );
+static MenuRangeInt32_t MEO_SAVESETUP_MAXAUTOSAVES = MAKE_MENURANGE( &cl_maxautosaves, &MF_Redfont, 1, 10, 0, 10, 1 );
 static MenuEntry_t ME_SAVESETUP_MAXAUTOSAVES = MAKE_MENUENTRY( "Limit:", &MF_Redfont, &MEF_BigOptions_Apply, &MEO_SAVESETUP_MAXAUTOSAVES, RangeInt32 );
 
 static MenuEntry_t ME_SAVESETUP_CLEANUP = MAKE_MENUENTRY( "Clean Up Saves", &MF_Redfont, &MEF_BigOptionsRt, &MEO_NULL, Link );
@@ -1213,11 +1132,11 @@ static MenuEntry_t *MEL_NETWORK[] = {
 static char const *MEOSN_PLAYER_COLOR[] = { "Auto", "Blue", "Red", "Green", "Gray", "Dark gray", "Dark green", "Brown", "Dark blue", "Bright red", "Yellow", };
 static int32_t MEOSV_PLAYER_COLOR[] = { 0, 9, 10, 11, 12, 13, 14, 15, 16, 21, 23, };
 static MenuOptionSet_t MEOS_PLAYER_COLOR = MAKE_MENUOPTIONSET( MEOSN_PLAYER_COLOR, MEOSV_PLAYER_COLOR, 0x2 );
-static MenuOption_t MEO_PLAYER_COLOR = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_PLAYER_COLOR, &ud.color );
+static MenuOption_t MEO_PLAYER_COLOR = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_PLAYER_COLOR, &playercolor );
 static MenuEntry_t ME_PLAYER_COLOR = MAKE_MENUENTRY( "Color", &MF_Bluefont, &MEF_PlayerNarrow, &MEO_PLAYER_COLOR, Option );
 static char const *MEOSN_PLAYER_TEAM[] = { "Blue", "Red", "Green", "Gray", };
 static MenuOptionSet_t MEOS_PLAYER_TEAM = MAKE_MENUOPTIONSET( MEOSN_PLAYER_TEAM, NULL, 0x2 );
-static MenuOption_t MEO_PLAYER_TEAM = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_PLAYER_TEAM, &ud.team );
+static MenuOption_t MEO_PLAYER_TEAM = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_PLAYER_TEAM, &playerteam );
 static MenuEntry_t ME_PLAYER_TEAM = MAKE_MENUENTRY( "Team", &MF_Bluefont, &MEF_PlayerNarrow, &MEO_PLAYER_TEAM, Option );
 #ifndef EDUKE32_SIMPLE_MENU
 static MenuLink_t MEO_PLAYER_MACROS = { MENU_MACROS, MA_Advance, };
@@ -1266,26 +1185,26 @@ static MenuEntry_t *MEL_NETHOST[] = {
 };
 
 static MenuOptionSet_t MEOS_NETOPTIONS_GAMETYPE = MAKE_MENUOPTIONSET( MEOSN_NetGametypes, NULL, 0x0 );
-static MenuOption_t MEO_NETOPTIONS_GAMETYPE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NETOPTIONS_GAMETYPE, &ud.m_coop );
+static MenuOption_t MEO_NETOPTIONS_GAMETYPE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NETOPTIONS_GAMETYPE, &m_coop );
 static MenuEntry_t ME_NETOPTIONS_GAMETYPE = MAKE_MENUENTRY( "Game Type", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_GAMETYPE, Option );
 static MenuOptionSet_t MEOS_NETOPTIONS_EPISODE = MAKE_MENUOPTIONSET( MEOSN_NetEpisodes, MEOSV_NetEpisodes, 0x0 );
-static int32_t NetEpisode;
+CVAR_UNAMED(Int, NetEpisode);
 static MenuOption_t MEO_NETOPTIONS_EPISODE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NETOPTIONS_EPISODE, &NetEpisode );
 static MenuEntry_t ME_NETOPTIONS_EPISODE = MAKE_MENUENTRY( "Episode", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_EPISODE, Option );
 static MenuOptionSet_t MEOS_NETOPTIONS_LEVEL_TEMPLATE = MAKE_MENUOPTIONSETNULL;
 static MenuOptionSet_t MEOS_NETOPTIONS_LEVEL[MAXVOLUMES];
-static MenuOption_t MEO_NETOPTIONS_LEVEL = MAKE_MENUOPTION( &MF_Bluefont, NULL, &ud.m_level_number );
+static MenuOption_t MEO_NETOPTIONS_LEVEL = MAKE_MENUOPTION( &MF_Bluefont, NULL, &m_level_number );
 static MenuEntry_t ME_NETOPTIONS_LEVEL = MAKE_MENUENTRY( "Level", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_LEVEL, Option );
 static MenuLink_t MEO_NETOPTIONS_USERMAP = { MENU_NETUSERMAP, MA_Advance, };
 static MenuEntry_t ME_NETOPTIONS_USERMAP = MAKE_MENUENTRY( "User Map", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_USERMAP, Link );
 static MenuOptionSet_t MEOS_NETOPTIONS_MONSTERS = MAKE_MENUOPTIONSET( MEOSN_NetSkills, NULL, 0x0 );
 static MenuOption_t MEO_NETOPTIONS_MONSTERS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NETOPTIONS_MONSTERS, NULL );
 static MenuEntry_t ME_NETOPTIONS_MONSTERS = MAKE_MENUENTRY( "Monsters", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_MONSTERS, Option );
-static MenuOption_t MEO_NETOPTIONS_MARKERS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &ud.m_marker );
+static MenuOption_t MEO_NETOPTIONS_MARKERS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &m_marker );
 static MenuEntry_t ME_NETOPTIONS_MARKERS = MAKE_MENUENTRY( "Markers", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_MARKERS, Option );
-static MenuOption_t MEO_NETOPTIONS_MAPEXITS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OnOff, &ud.m_noexits );
+static MenuOption_t MEO_NETOPTIONS_MAPEXITS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OnOff, &m_noexits );
 static MenuEntry_t ME_NETOPTIONS_MAPEXITS = MAKE_MENUENTRY( "Map Exits", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_MAPEXITS, Option );
-static MenuOption_t MEO_NETOPTIONS_FRFIRE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &ud.m_ffire );
+static MenuOption_t MEO_NETOPTIONS_FRFIRE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &m_ffire );
 static MenuEntry_t ME_NETOPTIONS_FRFIRE = MAKE_MENUENTRY( "Fr. Fire", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_FRFIRE, Option );
 static MenuEntry_t ME_NETOPTIONS_ACCEPT = MAKE_MENUENTRY( "Accept", &MF_Redfont, &MEF_NetSetup_Confirm, &MEO_NETWORK_HOSTGAME, Link );
 
@@ -1341,10 +1260,8 @@ static MenuMenu_t M_TOUCHSENS = MAKE_MENUMENU( "Sensitivity", &MMF_BigOptions, M
 static MenuPanel_t M_TOUCHBUTTONS = { "Button Setup", MENU_TOUCHSETUP, MA_Return, MENU_TOUCHSETUP, MA_Advance, };
 #endif
 static MenuMenu_t M_JOYSTICKSETUP = MAKE_MENUMENU( "Gamepad Setup", &MMF_BigOptions, MEL_JOYSTICKSETUP );
-static MenuMenu_t M_JOYSTICKBTNS = MAKE_MENUMENU( "Gamepad Buttons", &MMF_MouseJoySetupBtns, MEL_JOYSTICKBTNS );
 static MenuMenu_t M_JOYSTICKAXES = MAKE_MENUMENU( "Gamepad Axes", &MMF_BigSliders, MEL_JOYSTICKAXES );
 static MenuMenu_t M_KEYBOARDKEYS = MAKE_MENUMENU( "Key Configuration", &MMF_KeyboardSetupFuncs, MEL_KEYBOARDSETUPFUNCS );
-static MenuMenu_t M_MOUSEBTNS = MAKE_MENUMENU( "Mouse Buttons", &MMF_MouseJoySetupBtns, MEL_MOUSESETUPBTNS );
 static MenuMenu_t M_MOUSEADVANCED = MAKE_MENUMENU( "Advanced Mouse", &MMF_BigSliders, MEL_MOUSEADVANCED );
 static MenuMenu_t M_JOYSTICKAXIS = MAKE_MENUMENU( NULL, &MMF_BigSliders, MEL_JOYSTICKAXIS );
 #ifdef USE_OPENGL
@@ -1432,17 +1349,10 @@ static Menu_t Menus[] = {
     { &M_KEYBOARDSETUP, MENU_KEYBOARDSETUP, MENU_CONTROLS, MA_Return, Menu },
     { &M_MOUSESETUP, MENU_MOUSESETUP, MENU_CONTROLS, MA_Return, Menu },
     { &M_JOYSTICKSETUP, MENU_JOYSTICKSETUP, MENU_CONTROLS, MA_Return, Menu },
-    { &M_JOYSTICKBTNS, MENU_JOYSTICKBTNS, MENU_JOYSTICKSETUP, MA_Return, Menu },
     { &M_JOYSTICKAXES, MENU_JOYSTICKAXES, MENU_JOYSTICKSETUP, MA_Return, Menu },
     { &M_KEYBOARDKEYS, MENU_KEYBOARDKEYS, MENU_KEYBOARDSETUP, MA_Return, Menu },
-    { &M_MOUSEBTNS, MENU_MOUSEBTNS, MENU_MOUSESETUP, MA_Return, Menu },
     { &M_MOUSEADVANCED, MENU_MOUSEADVANCED, MENU_MOUSESETUP, MA_Return, Menu },
     { &M_JOYSTICKAXIS, MENU_JOYSTICKAXIS, MENU_JOYSTICKAXES, MA_Return, Menu },
-#ifdef EDUKE32_ANDROID_MENU
-    { &M_TOUCHSETUP, MENU_TOUCHSETUP, MENU_OPTIONS, MA_Return, Menu },
-    { &M_TOUCHSENS, MENU_TOUCHSENS, MENU_TOUCHSETUP, MA_Return, Menu },
-    { &M_TOUCHBUTTONS, MENU_TOUCHBUTTONS, MENU_TOUCHSETUP, MA_Return, Panel },
-#endif
     { &M_CONTROLS, MENU_CONTROLS, MENU_OPTIONS, MA_Return, Menu },
 #ifdef USE_OPENGL
     { &M_RENDERERSETUP_POLYMOST, MENU_POLYMOST, MENU_DISPLAYSETUP, MA_Return, Menu },
@@ -1829,16 +1739,6 @@ void Menu_Init(void)
         MEO_KEYBOARDSETUPFUNCS[i] = MEO_KEYBOARDSETUPFUNCS_TEMPLATE;
     }
     M_KEYBOARDKEYS.numEntries = NUMGAMEFUNCTIONS;
-    for (i = 0; i < MENUMOUSEFUNCTIONS; ++i)
-    {
-        MEL_MOUSESETUPBTNS[i] = &ME_MOUSESETUPBTNS[i];
-        ME_MOUSESETUPBTNS[i] = ME_MOUSEJOYSETUPBTNS_TEMPLATE;
-        ME_MOUSESETUPBTNS[i].name = MenuMouseNames[i];
-        ME_MOUSESETUPBTNS[i].entry = &MEO_MOUSESETUPBTNS[i];
-        MEO_MOUSESETUPBTNS[i] = MEO_MOUSEJOYSETUPBTNS_TEMPLATE;
-		static int32_t sink;
-        MEO_MOUSESETUPBTNS[i].data = &sink;
-    }
     for (i = 0; i < 2*joystick.numButtons + 8*joystick.numHats; ++i)
     {
         if (i < 2*joystick.numButtons)
@@ -1852,15 +1752,7 @@ void Menu_Init(void)
         {
             Bsnprintf(MenuJoystickNames[i], MAXJOYBUTTONSTRINGLENGTH, (i & 1) ? "Double Hat %d %s" : "Hat %d %s", ((i - 2*joystick.numButtons)>>3), MenuJoystickHatDirections[((i - 2*joystick.numButtons)>>1) % 4]);
         }
-
-        MEL_JOYSTICKBTNS[i] = &ME_JOYSTICKBTNS[i];
-        ME_JOYSTICKBTNS[i] = ME_MOUSEJOYSETUPBTNS_TEMPLATE;
-        ME_JOYSTICKBTNS[i].name = MenuJoystickNames[i];
-        ME_JOYSTICKBTNS[i].entry = &MEO_JOYSTICKBTNS[i];
-        MEO_JOYSTICKBTNS[i] = MEO_MOUSEJOYSETUPBTNS_TEMPLATE;
-        MEO_JOYSTICKBTNS[i].data = &JoystickFunctions[i>>1][i&1];
     }
-    M_JOYSTICKBTNS.numEntries = 2*joystick.numButtons + 8*joystick.numHats;
     for (i = 0; i < joystick.numAxes; ++i)
     {
         ME_JOYSTICKAXES[i] = ME_JOYSTICKAXES_TEMPLATE;
@@ -1967,7 +1859,7 @@ static void Menu_Pre(MenuID_t cm)
 
     case MENU_GAMESETUP:
         MEO_GAMESETUP_DEMOREC.options = (ps->gm&MODE_GAME) ? &MEOS_DemoRec : &MEOS_OffOn;
-        MenuEntry_DisableOnCondition(&ME_GAMESETUP_DEMOREC, (ps->gm&MODE_GAME) && ud.m_recstat != 1);
+        MenuEntry_DisableOnCondition(&ME_GAMESETUP_DEMOREC, (ps->gm&MODE_GAME) && m_recstat != 1);
         break;
 
     case MENU_DISPLAYSETUP:
@@ -1975,10 +1867,6 @@ static void Menu_Pre(MenuID_t cm)
 #ifdef USE_OPENGL
         if (videoGetRenderMode() == REND_CLASSIC)
             MenuMenu_ChangeEntryList(M_DISPLAYSETUP, MEL_DISPLAYSETUP);
-#ifdef POLYMER
-        else if (videoGetRenderMode() == REND_POLYMER)
-            MenuMenu_ChangeEntryList(M_DISPLAYSETUP, MEL_DISPLAYSETUP_GL_POLYMER);
-#endif
         else
             MenuMenu_ChangeEntryList(M_DISPLAYSETUP, MEL_DISPLAYSETUP_GL);
 
@@ -2001,37 +1889,13 @@ static void Menu_Pre(MenuID_t cm)
         }
         MenuEntry_HideOnCondition(&ME_SCREENSETUP_SCREENSIZE, (MEO_SCREENSETUP_SCREENSIZE.steps < 2));
 
-        vpsize = -1;
-
-#ifndef EDUKE32_STANDALONE
-#ifdef TEXFILTER_MENU_OPTIONS
-        if (videoGetRenderMode() != REND_CLASSIC)
-        {
-            //POGOTODO: allow setting anisotropy again while hw_useindexedcolortextures is set when support is added down the line
-            // don't allow setting anisotropy while in POLYMOST and hw_useindexedcolortextures is enabled
-            MenuEntry_DisableOnCondition(&ME_DISPLAYSETUP_ANISOTROPY, videoGetRenderMode() == REND_POLYMOST && hw_useindexedcolortextures);
-
-            for (i = (int32_t) ARRAY_SIZE(MEOSV_DISPLAYSETUP_ANISOTROPY) - 1; i >= 0; --i)
-            {
-                if (MEOSV_DISPLAYSETUP_ANISOTROPY[i] <= GLInterface.glinfo.maxanisotropy)
-                {
-                    MEOS_DISPLAYSETUP_ANISOTROPY.numOptions = i + 1;
-                    break;
-                }
-            }
-        }
-#endif
-#endif
         break;
 
     case MENU_POLYMER:
     case MENU_POLYMOST:
-        MenuEntry_DisableOnCondition(&ME_RENDERERSETUP_TEXQUALITY, !hw_hightile);
         MenuEntry_DisableOnCondition(&ME_RENDERERSETUP_PRECACHE, !hw_hightile);
-# ifdef USE_GLEXT
         MenuEntry_DisableOnCondition(&ME_RENDERERSETUP_DETAILTEX, !hw_hightile);
         MenuEntry_DisableOnCondition(&ME_RENDERERSETUP_GLOWTEX, !hw_hightile);
-# endif
 #endif
         break;
 
@@ -2123,7 +1987,7 @@ static void Menu_Pre(MenuID_t cm)
             MEL_NETOPTIONS[2] = &ME_NETOPTIONS_LEVEL;
             MEO_NETOPTIONS_LEVEL.options = &MEOS_NETOPTIONS_LEVEL[MEOSV_NetEpisodes[MEO_NETOPTIONS_EPISODE.currentOption]];
         }
-        if (!(g_gametypeFlags[ud.m_coop] & GAMETYPE_MARKEROPTION))
+        if (!(g_gametypeFlags[m_coop] & GAMETYPE_MARKEROPTION))
         {
             ME_NETOPTIONS_MARKERS.type = Dummy;
             ME_NETOPTIONS_MARKERS.flags |= MEF_Disabled;
@@ -2133,7 +1997,7 @@ static void Menu_Pre(MenuID_t cm)
             ME_NETOPTIONS_MARKERS.type = Option;
             ME_NETOPTIONS_MARKERS.flags &= ~MEF_Disabled;
         }
-        MEL_NETOPTIONS[5] = (g_gametypeFlags[ud.m_coop] & (GAMETYPE_PLAYERSFRIENDLY|GAMETYPE_TDM)) ? &ME_NETOPTIONS_FRFIRE : &ME_NETOPTIONS_MAPEXITS;
+        MEL_NETOPTIONS[5] = (g_gametypeFlags[m_coop] & (GAMETYPE_PLAYERSFRIENDLY|GAMETYPE_TDM)) ? &ME_NETOPTIONS_FRFIRE : &ME_NETOPTIONS_MAPEXITS;
         break;
 
     case MENU_OPTIONS:
@@ -2281,7 +2145,7 @@ static void Menu_PreDraw(MenuID_t cm, MenuEntry_t *entry, const vec2_t origin)
         break;
 
     case MENU_PLAYER:
-        rotatesprite_fs(origin.x + (260<<16), origin.y + ((24+(tilesiz[APLAYER].y>>1))<<16), 49152L,0,1441-((((4-((int32_t) totalclock>>4)))&3)*5),0,entry == &ME_PLAYER_TEAM ? G_GetTeamPalette(ud.team) : ud.color,10);
+        rotatesprite_fs(origin.x + (260<<16), origin.y + ((24+(tilesiz[APLAYER].y>>1))<<16), 49152L,0,1441-((((4-((int32_t) totalclock>>4)))&3)*5),0,entry == &ME_PLAYER_TEAM ? G_GetTeamPalette(playerteam) : playercolor,10);
         break;
 
     case MENU_MACROS:
@@ -2307,27 +2171,27 @@ static void Menu_PreDraw(MenuID_t cm, MenuEntry_t *entry, const vec2_t origin)
         mminitext(origin.x + (90<<16), origin.y + ((90+8)<<16), "Episode", MF_Minifont.pal_deselected);
         mminitext(origin.x + (90<<16), origin.y + ((90+8+8)<<16), "Level", MF_Minifont.pal_deselected);
         mminitext(origin.x + (90<<16), origin.y + ((90+8+8+8)<<16), ME_NETOPTIONS_MONSTERS.name, MF_Minifont.pal_deselected);
-        if (ud.m_coop == 0)
+        if (m_coop == 0)
             mminitext(origin.x + (90<<16), origin.y + ((90+8+8+8+8)<<16), "Markers", MF_Minifont.pal_deselected);
-        else if (ud.m_coop == 1)
+        else if (m_coop == 1)
             mminitext(origin.x + (90<<16), origin.y + ((90+8+8+8+8)<<16), "Friendly Fire", MF_Minifont.pal_deselected);
         mminitext(origin.x + (90<<16), origin.y + ((90+8+8+8+8+8)<<16), "User Map", MF_Minifont.pal_deselected);
 
-        mminitext(origin.x + ((90+60)<<16), origin.y + (90<<16), g_gametypeNames[ud.m_coop], MF_Minifont.pal_deselected_right);
+        mminitext(origin.x + ((90+60)<<16), origin.y + (90<<16), g_gametypeNames[m_coop], MF_Minifont.pal_deselected_right);
 
         mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8)<<16), g_volumeNames[ud.m_volume_number], MF_Minifont.pal_deselected_right);
-        mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8)<<16), g_mapInfo[MAXLEVELS*ud.m_volume_number+ud.m_level_number].name, MF_Minifont.pal_deselected_right);
+        mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8)<<16), g_mapInfo[MAXLEVELS*ud.m_volume_number+m_level_number].name, MF_Minifont.pal_deselected_right);
         if (ud.m_monsters_off == 0 || ud.m_player_skill > 0)
             mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8)<<16), g_skillNames[ud.m_player_skill], MF_Minifont.pal_deselected_right);
         else mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8)<<16), "None", MF_Minifont.pal_deselected_right);
-        if (ud.m_coop == 0)
+        if (m_coop == 0)
         {
-            if (ud.m_marker) mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8+8)<<16), "On", MF_Minifont.pal_deselected_right);
+            if (m_marker) mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8+8)<<16), "On", MF_Minifont.pal_deselected_right);
             else mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8+8)<<16), "Off", MF_Minifont.pal_deselected_right);
         }
-        else if (ud.m_coop == 1)
+        else if (m_coop == 1)
         {
-            if (ud.m_ffire) mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8+8)<<16), "On", MF_Minifont.pal_deselected_right);
+            if (m_ffire) mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8+8)<<16), "On", MF_Minifont.pal_deselected_right);
             else mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8+8)<<16), "Off", MF_Minifont.pal_deselected_right);
         }
         break;
@@ -3055,7 +2919,7 @@ static void Menu_EntryLinkActivate(MenuEntry_t *entry)
         if (entry != &ME_EPISODE_USERMAP)
         {
             ud.m_volume_number = M_EPISODE.currentEntry;
-            ud.m_level_number = 0;
+            m_level_number = 0;
 
             if (g_skillCnt == 0)
                 Menu_StartGameWithoutSkill();
@@ -3113,13 +2977,13 @@ static void Menu_EntryLinkActivate(MenuEntry_t *entry)
 
     case MENU_JOYSTICKAXES:
         M_JOYSTICKAXIS.title = joyGetName(0, M_JOYSTICKAXES.currentEntry);
+#if 0
         MEO_JOYSTICKAXIS_ANALOG.data = &JoystickAnalogueAxes[M_JOYSTICKAXES.currentEntry];
         MEO_JOYSTICKAXIS_SCALE.variable = &JoystickAnalogueScale[M_JOYSTICKAXES.currentEntry];
         MEO_JOYSTICKAXIS_INVERT.data = &JoystickAnalogueInvert[M_JOYSTICKAXES.currentEntry];
         MEO_JOYSTICKAXIS_DEAD.variable = &JoystickAnalogueDead[M_JOYSTICKAXES.currentEntry];
         MEO_JOYSTICKAXIS_SATU.variable = &JoystickAnalogueSaturate[M_JOYSTICKAXES.currentEntry];
-        MEO_JOYSTICKAXIS_DIGITALNEGATIVE.data = &JoystickDigitalFunctions[M_JOYSTICKAXES.currentEntry][0];
-        MEO_JOYSTICKAXIS_DIGITALPOSITIVE.data = &JoystickDigitalFunctions[M_JOYSTICKAXES.currentEntry][1];
+#endif
         break;
 
     case MENU_CHEATS:
@@ -3349,26 +3213,7 @@ static void Menu_EntryOptionDidModify(MenuEntry_t *entry)
         entry == &ME_PLAYER_COLOR ||
         entry == &ME_PLAYER_TEAM)
         G_UpdatePlayerFromMenu();
-    else if (entry == &ME_DISPLAYSETUP_UPSCALING)
-    {
-        if (in3dmode())
-        {
-            videoSetGameMode(fullscreen, xres, yres, bpp, ud.detail);
-        }
-    }
 #ifdef USE_OPENGL
-#ifndef EDUKE32_STANDALONE
-#ifdef TEXFILTER_MENU_OPTIONS
-    else if (entry == &ME_DISPLAYSETUP_ANISOTROPY || entry == &ME_DISPLAYSETUP_TEXFILTER)
-        gltexapplyprops();
-#endif
-#endif
-    else if (entry == &ME_RENDERERSETUP_TEXQUALITY)
-    {
-        r_downsizevar = r_downsize;
-        domodechange = 1;
-    }
-
     if (domodechange)
     {
         videoResetMode();
@@ -3397,16 +3242,12 @@ static int32_t Menu_EntryRangeInt32Modify(MenuEntry_t *entry, int32_t newValue)
         FX_SetVolume(newValue);
     else if (entry == &ME_SOUND_VOLUME_MUSIC)
         S_MusicVolume(newValue);
-    else if (entry == &ME_MOUSEADVANCED_SCALEX)
-        CONTROL_SetAnalogAxisScale(0, newValue, controldevice_mouse);
-    else if (entry == &ME_MOUSEADVANCED_SCALEY)
-        CONTROL_SetAnalogAxisScale(1, newValue, controldevice_mouse);
     else if (entry == &ME_JOYSTICKAXIS_SCALE)
         CONTROL_SetAnalogAxisScale(M_JOYSTICKAXES.currentEntry, newValue, controldevice_joystick);
     else if (entry == &ME_JOYSTICKAXIS_DEAD)
-        joySetDeadZone(M_JOYSTICKAXES.currentEntry, newValue, *MEO_JOYSTICKAXIS_SATU.variable);
+        joySetDeadZone(M_JOYSTICKAXES.currentEntry, newValue, *MEO_JOYSTICKAXIS_SATU.cVar);
     else if (entry == &ME_JOYSTICKAXIS_SATU)
-        joySetDeadZone(M_JOYSTICKAXES.currentEntry, *MEO_JOYSTICKAXIS_DEAD.variable, newValue);
+        joySetDeadZone(M_JOYSTICKAXES.currentEntry, *MEO_JOYSTICKAXIS_DEAD.cVar, newValue);
 
     return 0;
 }
@@ -3634,9 +3475,9 @@ static void Menu_Verify(int32_t input)
     case MENU_COLCORRRESETVERIFY:
         if (input)
         {
-            g_videoGamma = DEFAULT_GAMMA;
-            g_videoContrast = DEFAULT_CONTRAST;
-            g_videoBrightness = DEFAULT_BRIGHTNESS;
+            vid_gamma = 1.f;
+            vid_contrast = 1.f;
+            vid_brightness = 0.f;
             r_ambientlight = 1.f;
             videoSetPalette(0,g_player[myconnectindex].ps->palette,0);
         }
@@ -3861,7 +3702,7 @@ static void Menu_FileSelect(int32_t input)
         if (input)
         {
             ud.m_volume_number = 0;
-            ud.m_level_number = 7;
+            m_level_number = 7;
 
             if (g_skillCnt > 0)
                 Menu_AnimateChange(MENU_SKILL, MA_Advance);
@@ -3943,8 +3784,8 @@ void Menu_AnimateChange(int32_t cm, MenuAnimationType_t animtype)
 {
 	if (cm == MENU_OPTIONS)
 	{
-		GUICapture |= 2;
-		return;
+		//GUICapture |= 2;
+		//return;
 	}
 
     if (FURY)
@@ -4841,7 +4682,7 @@ static int32_t M_RunMenu_Menu(Menu_t *cm, MenuMenu_t *menu, MenuEntry_t *current
                     case Option:
                     {
                         auto object = (MenuOption_t*)entry->entry;
-                        int32_t currentOption = Menu_FindOptionBinarySearch(object, object->data == NULL ? Menu_EntryOptionSource(entry, object->currentOption) : *object->data, 0, object->options->numOptions);
+                        int32_t currentOption = Menu_FindOptionBinarySearch(object, object->cVar == NULL ? Menu_EntryOptionSource(entry, object->currentOption) : object->cVar->ToInt(), 0, object->options->numOptions);
 
                         if (currentOption >= 0)
                             object->currentOption = currentOption;
@@ -4993,7 +4834,7 @@ static int32_t M_RunMenu_Menu(Menu_t *cm, MenuMenu_t *menu, MenuEntry_t *current
                         rotatesprite_ybounds(slidebarx, slidebary, mulscale16(ud.menu_slidebarz, z), 0, SLIDEBAR, s, p, 2|8|16|ROTATESPRITE_FULL16, ydim_upper, ydim_lower);
 
                         const int32_t slideregionwidth = mulscale16((tilesiz[SLIDEBAR].x * ud.menu_slidebarz) - (ud.menu_slidebarmargin<<1) - (tilesiz[SLIDEBAR+1].x * ud.menu_slidecursorz), z);
-                        const int32_t slidepointx = slidebarx + mulscale16(ud.menu_slidebarmargin, z) + scale(slideregionwidth, *object->variable - object->min, object->max - object->min);
+                        const int32_t slidepointx = slidebarx + mulscale16(ud.menu_slidebarmargin, z) + scale(slideregionwidth, *object->cVar - object->min, object->max - object->min);
                         const int32_t slidepointy = slidebary + mulscale16((((tilesiz[SLIDEBAR].y>>1) * ud.menu_slidebarz) - ((tilesiz[SLIDEBAR+1].y>>1) * ud.menu_slidecursorz)), z);
 
                         rotatesprite_ybounds(slidepointx, slidepointy, mulscale16(ud.menu_slidecursorz, z), 0, SLIDEBAR+1, s, p, 2|8|16|ROTATESPRITE_FULL16, ydim_upper, ydim_lower);
@@ -5009,13 +4850,13 @@ static int32_t M_RunMenu_Menu(Menu_t *cm, MenuMenu_t *menu, MenuEntry_t *current
                             switch (object->flags & DisplayTypeMask)
                             {
                                 case DisplayTypeInteger:
-                                    Bsprintf(tempbuf, "%d", *object->variable);
+                                    Bsprintf(tempbuf, "%d", **object->cVar);
                                     break;
                                 case DisplayTypePercent:
-                                    Bsprintf(tempbuf, "%d%%", roundscale(*object->variable, 100, onehundredpercent));
+                                    Bsprintf(tempbuf, "%d%%", roundscale(*object->cVar, 100, onehundredpercent));
                                     break;
                                 case DisplayTypeNormalizedDecimal:
-                                    Bsprintf(tempbuf, "%.2f", (double) *object->variable / (double) onehundredpercent);
+                                    Bsprintf(tempbuf, "%.2f", (double) *object->cVar / (double) onehundredpercent);
                                     break;
                             }
 
@@ -5092,7 +4933,7 @@ static int32_t M_RunMenu_Menu(Menu_t *cm, MenuMenu_t *menu, MenuEntry_t *current
                         rotatesprite_ybounds(slidebarx, slidebary, mulscale16(ud.menu_slidebarz, z), 0, SLIDEBAR, s, p, 2|8|16|ROTATESPRITE_FULL16, ydim_upper, ydim_lower);
 
                         const int32_t slideregionwidth = mulscale16((tilesiz[SLIDEBAR].x * ud.menu_slidebarz) - (ud.menu_slidebarmargin<<1) - (tilesiz[SLIDEBAR+1].x * ud.menu_slidecursorz), z);
-                        const int32_t slidepointx = slidebarx + mulscale16(ud.menu_slidebarmargin, z) + Blrintf((float) slideregionwidth * (*object->variable - object->min) / (object->max - object->min));
+                        const int32_t slidepointx = slidebarx + mulscale16(ud.menu_slidebarmargin, z) + Blrintf((float) slideregionwidth * (*object->cVar - object->min) / (object->max - object->min));
                         const int32_t slidepointy = slidebary + mulscale16(((tilesiz[SLIDEBAR].y>>1) * ud.menu_slidebarz) - ((tilesiz[SLIDEBAR+1].y>>1) * ud.menu_slidecursorz), z);
 
                         rotatesprite_ybounds(slidepointx, slidepointy, mulscale16(ud.menu_slidecursorz, z), 0, SLIDEBAR+1, s, p, 2|8|16|ROTATESPRITE_FULL16, ydim_upper, ydim_lower);
@@ -5108,13 +4949,13 @@ static int32_t M_RunMenu_Menu(Menu_t *cm, MenuMenu_t *menu, MenuEntry_t *current
                             switch (object->flags & DisplayTypeMask)
                             {
                                 case DisplayTypeInteger:
-                                    Bsprintf(tempbuf, "%.2f", *object->variable);
+                                    Bsprintf(tempbuf, "%.2f", **object->cVar);
                                     break;
                                 case DisplayTypePercent:
-                                    Bsprintf(tempbuf, "%ld%%", lrintf(*object->variable * 100.f / onehundredpercent));
+                                    Bsprintf(tempbuf, "%ld%%", lrintf(*object->cVar * 100.f / onehundredpercent));
                                     break;
                                 case DisplayTypeNormalizedDecimal:
-                                    Bsprintf(tempbuf, "%.2f", *object->variable / onehundredpercent);
+                                    Bsprintf(tempbuf, "%.2f", *object->cVar / onehundredpercent);
                                     break;
                             }
 
@@ -5937,9 +5778,12 @@ static int32_t Menu_RunInput_EntryOption_Modify(MenuEntry_t *entry, MenuOption_t
     {
         object->currentOption = newValueIndex;
 
-        if ((int32_t*)object->data != NULL) // NULL implies the functions will handle it
-            *((int32_t*)object->data) = newValue;
-
+		if (object->cVar != NULL) // NULL implies the functions will handle it
+		{
+			UCVarValue v;
+			v.Int = newValue;
+			object->cVar->ForceSet(v, CVAR_Int, false);
+		}
         Menu_EntryOptionDidModify(entry);
 
         return 0;
@@ -6016,7 +5860,7 @@ static void Menu_RunInput_EntryCustom2Col_Activate(MenuEntry_t *entry)
 static void Menu_RunInput_EntryRangeInt32_MovementVerify(MenuEntry_t *entry, MenuRangeInt32_t *object, int32_t newValue)
 {
     if (!Menu_EntryRangeInt32Modify(entry, newValue))
-        *object->variable = newValue;
+        *object->cVar = newValue;
 }
 
 static void Menu_RunInput_EntryRangeInt32_MovementArbitrary(MenuEntry_t *entry, MenuRangeInt32_t *object, int32_t newValue)
@@ -6034,7 +5878,7 @@ static void Menu_RunInput_EntryRangeInt32_MovementArbitrary(MenuEntry_t *entry,
 
 static void Menu_RunInput_EntryRangeInt32_Movement(MenuEntry_t *entry, MenuRangeInt32_t *object, MenuMovement_t direction)
 {
-    int32_t const oldValue = *object->variable;
+    int32_t const oldValue = *object->cVar;
     int32_t const range = object->max - object->min;
     int32_t const maxInterval = object->steps - 1;
     int32_t const oldValueIndex = roundscale(oldValue - object->min, maxInterval, range);
@@ -6075,7 +5919,7 @@ static void Menu_RunInput_EntryRangeFloat_MovementVerify(MenuEntry_t *entry, Men
 {
     if (!Menu_EntryRangeFloatModify(entry, newValue))
     {
-        *object->variable = newValue;
+        *object->cVar = newValue;
         Menu_EntryRangeFloatDidModify(entry);
     }
 }
@@ -6095,7 +5939,7 @@ static void Menu_RunInput_EntryRangeFloat_MovementArbitrary(MenuEntry_t *entry,
 
 static void Menu_RunInput_EntryRangeFloat_Movement(MenuEntry_t *entry, MenuRangeFloat_t *object, MenuMovement_t direction)
 {
-    float const oldValue = *object->variable;
+    float const oldValue = *object->cVar;
     float const range = object->max - object->min;
     float const maxInterval = (float)(object->steps - 1);
     float const oldValueIndexUnrounded = (oldValue - object->min) * maxInterval / range;
@@ -6910,17 +6754,6 @@ static void Menu_RunInput(Menu_t *cm)
     }
 }
 
-END_DUKE_NS
-
-namespace ImGui
-{
-	void ShowAboutWindow(bool*);
-	void ShowDemoWindow(bool*);
-	void ShowUserGuide();
-}
-
-BEGIN_DUKE_NS
-
 void M_DisplayMenus(void)
 {
     vec2_t origin = { 0, 0 }, previousOrigin = { 0, 0 };
@@ -7070,8 +6903,13 @@ void M_DisplayMenus(void)
 	{
 		ImGui_Begin_Frame();
 		bool b = true;
+		videoFadeToBlack(1);
+#if 0
 		ImGui::ShowDemoWindow(&b);
 		if (!b)
+#else
+		if (!ShowOptionMenu())
+#endif
 		{
 			GUICapture &= ~2;
 			GUICapture |= 4;
diff --git a/source/duke3d/src/menus.h b/source/duke3d/src/menus.h
index 0ed13baeb..4ec5c6e3f 100644
--- a/source/duke3d/src/menus.h
+++ b/source/duke3d/src/menus.h
@@ -207,7 +207,7 @@ typedef struct MenuOption_t
     MenuOptionSet_t *options; // so that common sets such as Yes/No, On/Off can be reused
 
     // effect
-    int32_t *data;
+    FBaseCVar *cVar;
 
     // state
     int32_t currentOption;
@@ -241,7 +241,7 @@ enum MenuRangeFlags_t
 typedef struct MenuRangeInt32_t
 {
     // effect
-    int32_t *variable;
+    FIntCVar *cVar;
 
     // appearance
     MenuFont_t *font;
@@ -257,7 +257,7 @@ typedef struct MenuRangeInt32_t
 typedef struct MenuRangeFloat_t
 {
     // effect
-    float *variable;
+    FFloatCVar *cVar;
 
     // appearance
     MenuFont_t *font;
diff --git a/source/duke3d/src/network.cpp b/source/duke3d/src/network.cpp
index 550005252..f0864e9c1 100644
--- a/source/duke3d/src/network.cpp
+++ b/source/duke3d/src/network.cpp
@@ -1993,22 +1993,22 @@ static void Net_ReceiveUserMapName(uint8_t *pbuf, int32_t packbufleng)
         }
     }
 
-    if (ud.m_level_number == 7 && ud.m_volume_number == 0 && boardfilename[0] == 0)
-        ud.m_level_number = 0;
+    if (m_level_number == 7 && ud.m_volume_number == 0 && boardfilename[0] == 0)
+        m_level_number = 0;
 }
 
 static void Net_ExtractNewGame(newgame_t *newgame, int32_t menuonly)
 {
-    ud.m_level_number      = newgame->level_number;
+    m_level_number      = newgame->level_number;
     ud.m_volume_number     = newgame->volume_number;
     ud.m_player_skill      = newgame->player_skill;
     ud.m_monsters_off      = newgame->monsters_off;
     ud.m_respawn_monsters  = newgame->respawn_monsters;
     ud.m_respawn_items     = newgame->respawn_items;
     ud.m_respawn_inventory = newgame->respawn_inventory;
-    ud.m_ffire             = newgame->ffire;
-    ud.m_noexits           = newgame->noexits;
-    ud.m_coop              = newgame->coop;
+    m_ffire             = newgame->ffire;
+    m_noexits           = newgame->noexits;
+    m_coop              = newgame->coop;
 
     if (!menuonly)
     {
@@ -4536,16 +4536,16 @@ void Net_FillNewGame(newgame_t *newgame, int32_t frommenu)
 {
     if (frommenu)
     {
-        newgame->level_number      = ud.m_level_number;
+        newgame->level_number      = m_level_number;
         newgame->volume_number     = ud.m_volume_number;
         newgame->player_skill      = ud.m_player_skill;
         newgame->monsters_off      = ud.m_monsters_off;
         newgame->respawn_monsters  = ud.m_respawn_monsters;
         newgame->respawn_items     = ud.m_respawn_items;
         newgame->respawn_inventory = ud.m_respawn_inventory;
-        newgame->ffire             = ud.m_ffire;
-        newgame->noexits           = ud.m_noexits;
-        newgame->coop              = ud.m_coop;
+        newgame->ffire             = m_ffire;
+        newgame->noexits           = m_noexits;
+        newgame->coop              = m_coop;
     }
     else
     {
@@ -4802,9 +4802,9 @@ void Net_SendClientInfo(void)
     tempnetbuf[l++] = g_player[myconnectindex].ps->aim_mode = in_aimmode;
     tempnetbuf[l++] = g_player[myconnectindex].ps->auto_aim = cl_autoaim;
     tempnetbuf[l++] = g_player[myconnectindex].ps->weaponswitch = cl_weaponswitch;
-    tempnetbuf[l++] = g_player[myconnectindex].ps->palookup = g_player[myconnectindex].pcolor = ud.color;
+    tempnetbuf[l++] = g_player[myconnectindex].ps->palookup = g_player[myconnectindex].pcolor = playercolor;
 
-    tempnetbuf[l++] = g_player[myconnectindex].pteam = ud.team;
+    tempnetbuf[l++] = g_player[myconnectindex].pteam = playerteam;
 
     for (i = 0; i < 10; i++)
     {
@@ -5176,7 +5176,7 @@ void Net_StartNewGame()
 
     Net_ExtractNewGame(&pendingnewgame, 0);
     G_NewGame(ud.volume_number, ud.level_number, ud.player_skill);
-    ud.coop = ud.m_coop;
+    ud.coop = m_coop;
 
     if (G_EnterLevel(MODE_GAME))
     {
diff --git a/source/duke3d/src/osdcmds.cpp b/source/duke3d/src/osdcmds.cpp
index e9e512ed1..db76be6ec 100644
--- a/source/duke3d/src/osdcmds.cpp
+++ b/source/duke3d/src/osdcmds.cpp
@@ -85,7 +85,7 @@ static int osdcmd_changelevel(osdcmdptr_t parm)
         else if (voting == -1)
         {
             ud.m_volume_number = volume;
-            ud.m_level_number = level;
+            m_level_number = level;
 
             if (g_player[myconnectindex].ps->i)
             {
@@ -104,12 +104,12 @@ static int osdcmd_changelevel(osdcmdptr_t parm)
                 tempbuf[0] = PACKET_MAP_VOTE_INITIATE;
                 tempbuf[1] = myconnectindex;
                 tempbuf[2] = ud.m_volume_number;
-                tempbuf[3] = ud.m_level_number;
+                tempbuf[3] = m_level_number;
 
                 enet_peer_send(g_netClientPeer, CHAN_GAMESTATE, enet_packet_create(tempbuf, 4, ENET_PACKET_FLAG_RELIABLE));
             }
-            if ((g_gametypeFlags[ud.m_coop] & GAMETYPE_PLAYERSFRIENDLY) && !(g_gametypeFlags[ud.m_coop] & GAMETYPE_TDM))
-                ud.m_noexits = 0;
+            if ((g_gametypeFlags[m_coop] & GAMETYPE_PLAYERSFRIENDLY) && !(g_gametypeFlags[m_coop] & GAMETYPE_TDM))
+                m_noexits = 0;
 
             M_OpenMenu(myconnectindex);
             Menu_Change(MENU_NETWAITVOTES);
@@ -130,7 +130,7 @@ static int osdcmd_changelevel(osdcmdptr_t parm)
         osdcmd_cheatsinfo_stat.cheatnum = -1;
 
         ud.m_volume_number     = volume;
-        ud.m_level_number      = level;
+        m_level_number      = level;
 
         ud.m_monsters_off      = 0;
         ud.monsters_off        = 0;
@@ -177,15 +177,15 @@ static int osdcmd_map(osdcmdptr_t parm)
         {
             Net_SendUserMapName();
             ud.m_volume_number = 0;
-            ud.m_level_number = 7;
-            Net_NewGame(ud.m_volume_number, ud.m_level_number);
+            m_level_number = 7;
+            Net_NewGame(ud.m_volume_number, m_level_number);
         }
         else if (voting == -1)
         {
             Net_SendUserMapName();
 
             ud.m_volume_number = 0;
-            ud.m_level_number = 7;
+            m_level_number = 7;
 
             if (g_player[myconnectindex].ps->i)
             {
@@ -203,12 +203,12 @@ static int osdcmd_map(osdcmdptr_t parm)
                 tempbuf[0] = PACKET_MAP_VOTE_INITIATE;
                 tempbuf[1] = myconnectindex;
                 tempbuf[2] = ud.m_volume_number;
-                tempbuf[3] = ud.m_level_number;
+                tempbuf[3] = m_level_number;
 
                 enet_peer_send(g_netClientPeer, CHAN_GAMESTATE, enet_packet_create(tempbuf, 4, ENET_PACKET_FLAG_RELIABLE));
             }
-            if ((g_gametypeFlags[ud.m_coop] & GAMETYPE_PLAYERSFRIENDLY) && !(g_gametypeFlags[ud.m_coop] & GAMETYPE_TDM))
-                ud.m_noexits = 0;
+            if ((g_gametypeFlags[m_coop] & GAMETYPE_PLAYERSFRIENDLY) && !(g_gametypeFlags[m_coop] & GAMETYPE_TDM))
+                m_noexits = 0;
 
             M_OpenMenu(myconnectindex);
             Menu_Change(MENU_NETWAITVOTES);
@@ -219,7 +219,7 @@ static int osdcmd_map(osdcmdptr_t parm)
 
     osdcmd_cheatsinfo_stat.cheatnum = -1;
     ud.m_volume_number = 0;
-    ud.m_level_number = 7;
+    m_level_number = 7;
 
     ud.m_monsters_off = ud.monsters_off = 0;
 
@@ -230,7 +230,7 @@ static int osdcmd_map(osdcmdptr_t parm)
 
     if (g_player[myconnectindex].ps->gm & MODE_GAME)
     {
-        G_NewGame(ud.m_volume_number, ud.m_level_number, ud.m_player_skill);
+        G_NewGame(ud.m_volume_number, m_level_number, ud.m_player_skill);
         g_player[myconnectindex].ps->gm = MODE_RESTART;
     }
     else G_NewGame_EnterLevel();
diff --git a/source/duke3d/src/player.cpp b/source/duke3d/src/player.cpp
index 18636bc64..1519e9b69 100644
--- a/source/duke3d/src/player.cpp
+++ b/source/duke3d/src/player.cpp
@@ -4374,13 +4374,13 @@ void P_EndLevel(void)
     if (ud.from_bonus)
     {
         ud.level_number   = ud.from_bonus;
-        ud.m_level_number = ud.level_number;
+        m_level_number = ud.level_number;
         ud.from_bonus     = 0;
     }
     else
     {
         ud.level_number   = (++ud.level_number < MAXLEVELS) ? ud.level_number : 0;
-        ud.m_level_number = ud.level_number;
+        m_level_number = ud.level_number;
     }
 }
 
@@ -4413,7 +4413,7 @@ static int P_DoFist(DukePlayer_t *pPlayer)
             if ((unsigned)ud.secretlevel <= MAXLEVELS)
                 ud.level_number = ud.secretlevel - 1;
 
-            ud.m_level_number = ud.level_number;
+            m_level_number = ud.level_number;
         }
         else
             P_EndLevel();
diff --git a/source/duke3d/src/premap.cpp b/source/duke3d/src/premap.cpp
index 49d5e366a..2d8dba18b 100644
--- a/source/duke3d/src/premap.cpp
+++ b/source/duke3d/src/premap.cpp
@@ -1324,7 +1324,7 @@ void G_NewGame(int volumeNum, int levelNum, int skillNum)
 
     ready2send = 0;
 
-    if (ud.m_recstat != 2 && ud.last_level != -1 && !VM_OnEventWithReturn(EVENT_EXITGAMESCREEN, g_player[myconnectindex].ps->i, myconnectindex, 0)
+    if (m_recstat != 2 && ud.last_level != -1 && !VM_OnEventWithReturn(EVENT_EXITGAMESCREEN, g_player[myconnectindex].ps->i, myconnectindex, 0)
         && (g_netServer || ud.multimode > 1) && (ud.coop & GAMETYPE_SCORESHEET))
         G_BonusScreen(1);
 
@@ -1368,7 +1368,7 @@ void G_NewGame(int volumeNum, int levelNum, int skillNum)
     for (int i=0; i < (MAXVOLUMES*MAXLEVELS); i++)
         G_FreeMapState(i);
 
-    if (ud.m_coop != 1)
+    if (m_coop != 1)
     {
         for (int weaponNum = 0; weaponNum < MAX_WEAPONS; weaponNum++)
         {
@@ -1775,13 +1775,13 @@ int G_EnterLevel(int gameMode)
     ud.respawn_items     = ud.m_respawn_items;
     ud.respawn_inventory = ud.m_respawn_inventory;
     ud.monsters_off      = ud.m_monsters_off;
-    ud.coop              = ud.m_coop;
-    ud.marker            = ud.m_marker;
-    ud.ffire             = ud.m_ffire;
-    ud.noexits           = ud.m_noexits;
+    ud.coop              = m_coop;
+    ud.marker            = m_marker;
+    ud.ffire             = m_ffire;
+    ud.noexits           = m_noexits;
 
     if ((gameMode & MODE_DEMO) != MODE_DEMO)
-        ud.recstat = ud.m_recstat;
+        ud.recstat = m_recstat;
     if ((gameMode & MODE_DEMO) == 0 && ud.recstat == 2)
         ud.recstat = 0;
 
@@ -1807,7 +1807,7 @@ int G_EnterLevel(int gameMode)
             levelNum &= MAXLEVELS-1;
             volumeNum = (volumeNum - levelNum) / MAXLEVELS;
 
-            ud.level_number = ud.m_level_number = levelNum;
+            ud.level_number = m_level_number = levelNum;
             ud.volume_number = ud.m_volume_number = volumeNum;
 
             boardfilename[0] = 0;
diff --git a/source/duke3d/src/savegame.cpp b/source/duke3d/src/savegame.cpp
index 2b137d24c..efbd75a0c 100644
--- a/source/duke3d/src/savegame.cpp
+++ b/source/duke3d/src/savegame.cpp
@@ -437,7 +437,7 @@ int32_t G_LoadPlayer(savebrief_t & sv)
             S_ClearSoundLocks();
 
             ud.m_volume_number = volume;
-            ud.m_level_number = level;
+            m_level_number = level;
             ud.m_player_skill = skill;
 
             boardfilename[0] = '\0';
@@ -501,7 +501,7 @@ int32_t G_LoadPlayer(savebrief_t & sv)
             for (int i=0; i < (MAXVOLUMES*MAXLEVELS); i++)
                 G_FreeMapState(i);
 
-            if (ud.m_coop != 1)
+            if (m_coop != 1)
                 p0.last_weapon = -1;
 
             display_mirror = 0;
@@ -634,7 +634,7 @@ int32_t G_LoadPlayer(savebrief_t & sv)
 
     // non-"m_" fields will be loaded from svgm_udnetw
     ud.m_volume_number = h.volnum;
-    ud.m_level_number = h.levnum;
+    m_level_number = h.levnum;
     ud.m_player_skill = h.skill;
 
     // NOTE: Bmemcpy needed for SAVEGAME_MUSIC.
@@ -1945,17 +1945,17 @@ static void sv_postudload()
 {
 //    Bmemcpy(&boardfilename[0], &currentboardfilename[0], BMAX_PATH);  // DON'T do this in demos!
 #if 1
-    ud.m_level_number      = ud.level_number;
+    m_level_number      = ud.level_number;
     ud.m_volume_number     = ud.volume_number;
     ud.m_player_skill      = ud.player_skill;
     ud.m_respawn_monsters  = ud.respawn_monsters;
     ud.m_respawn_items     = ud.respawn_items;
     ud.m_respawn_inventory = ud.respawn_inventory;
     ud.m_monsters_off      = ud.monsters_off;
-    ud.m_coop              = ud.coop;
-    ud.m_marker            = ud.marker;
-    ud.m_ffire             = ud.ffire;
-    ud.m_noexits           = ud.noexits;
+    m_coop              = ud.coop;
+    m_marker            = ud.marker;
+    m_ffire             = ud.ffire;
+    m_noexits           = ud.noexits;
 #endif
 }
 //static int32_t lockclock_dummy;
diff --git a/source/duke3d/src/screentext.cpp b/source/duke3d/src/screentext.cpp
index 46092d6c4..9329c52e3 100644
--- a/source/duke3d/src/screentext.cpp
+++ b/source/duke3d/src/screentext.cpp
@@ -1133,7 +1133,7 @@ void P_DoQuote(int32_t q, DukePlayer_t *p)
 {
     int32_t cq = 0;
 
-    if (ud.fta_on == 0 || q < 0 || !(p->gm & MODE_GAME))
+    if (hud_messages == 0 || q < 0 || !(p->gm & MODE_GAME))
         return;
 
     if (q & MAXQUOTES)
diff --git a/source/mact/include/control.h b/source/mact/include/control.h
index f9e32ccbd..23cfbb374 100644
--- a/source/mact/include/control.h
+++ b/source/mact/include/control.h
@@ -162,7 +162,7 @@ int CONTROL_FlagActive( int which );
 void CONTROL_ClearAssignments( void );
 // void CONTROL_GetFunctionInput( void );
 void CONTROL_GetInput( ControlInfo *info );
-extern float CONTROL_MouseSensitivity;
+
 bool CONTROL_Startup(controltype which, int32_t ( *TimeFunction )( void ), int32_t ticspersecond);
 void CONTROL_Shutdown( void );
 
diff --git a/source/mact/src/control.cpp b/source/mact/src/control.cpp
index 959b285ff..3bf9323df 100644
--- a/source/mact/src/control.cpp
+++ b/source/mact/src/control.cpp
@@ -14,6 +14,7 @@
 #include "keyboard.h"
 #include "mouse.h"
 #include "osd.h"
+#include "gamecvars.h"
 #include "pragmas.h"
 
 bool CONTROL_Started         = false;
@@ -24,15 +25,12 @@ bool CONTROL_JoystickEnabled = false;
 
 LastSeenInput CONTROL_LastSeenInput;
 
-float          CONTROL_MouseSensitivity = DEFAULTMOUSESENSITIVITY;
 static int32_t CONTROL_NumMouseButtons  = 0;
 static int32_t CONTROL_NumJoyButtons    = 0;
 static int32_t CONTROL_NumJoyAxes       = 0;
 
 // static controlkeymaptype  CONTROL_KeyMapping[CONTROL_NUM_FLAGS];
 
-static int32_t            CONTROL_MouseAxesScale[2];
-
 static controlaxismaptype CONTROL_JoyAxesMap[MAXJOYAXES];
 static controlaxistype    CONTROL_JoyAxes[MAXJOYAXES];
 static controlaxistype    CONTROL_LastJoyAxes[MAXJOYAXES];
@@ -89,8 +87,8 @@ static void CONTROL_GetMouseDelta(ControlInfo * info)
         last = input;
     }
 
-    info->mousex = mulscale16(Blrintf(finput.x * 4.f * CONTROL_MouseSensitivity), CONTROL_MouseAxesScale[0]);
-    info->mousey = mulscale16(Blrintf(finput.y * 4.f * CONTROL_MouseSensitivity), CONTROL_MouseAxesScale[1]);
+    info->mousex = mulscale16(Blrintf(finput.x * 4.f * in_mousesensitivity), in_mousescalex);
+    info->mousey = mulscale16(Blrintf(finput.y * 4.f * in_mousesensitivity), in_mousescaley);
 }
 
 static int32_t CONTROL_GetTime(void)
@@ -167,17 +165,6 @@ void CONTROL_SetAnalogAxisScale(int32_t whichaxis, int32_t axisscale, controldev
 
     switch (device)
     {
-    case controldevice_mouse:
-        if ((unsigned) whichaxis >= ARRAY_SIZE(CONTROL_MouseAxesScale))
-        {
-            //Error("CONTROL_SetAnalogAxisScale: axis %d out of valid range for %d mouse axes.",
-            //		whichaxis, MAXMOUSEAXES);
-            return;
-        }
-
-        set = CONTROL_MouseAxesScale;
-        break;
-
     case controldevice_joystick:
         if ((unsigned) whichaxis >= (unsigned) MAXJOYAXES)
         {
@@ -270,12 +257,6 @@ void CONTROL_ClearAssignments(void)
 //    memset(CONTROL_KeyMapping,          KEYUNDEFINED,    sizeof(CONTROL_KeyMapping));
     memset(CONTROL_LastJoyAxes,         0,               sizeof(CONTROL_LastJoyAxes));
     memset(CONTROL_MouseButtonMapping,  BUTTONUNDEFINED, sizeof(CONTROL_MouseButtonMapping));
-
-    for (int & i : CONTROL_MouseAxesScale)
-        i = NORMALAXISSCALE;
-
-    for (int & i : CONTROL_JoyAxesScale)
-        i = NORMALAXISSCALE;
 }
 
 static int DoGetDeviceButtons(
diff --git a/source/rr/src/actors.cpp b/source/rr/src/actors.cpp
index f30ded343..12ae0d40c 100644
--- a/source/rr/src/actors.cpp
+++ b/source/rr/src/actors.cpp
@@ -3986,7 +3986,7 @@ ACTOR_STATIC void G_MoveActors(void)
                 ud.level_number++;
                 if (ud.level_number > 6)
                     ud.level_number = 0;
-                ud.m_level_number = ud.level_number;
+                m_level_number = ud.level_number;
             }
         }
 
diff --git a/source/rr/src/cheats.cpp b/source/rr/src/cheats.cpp
index e1c1007bf..603b364bb 100644
--- a/source/rr/src/cheats.cpp
+++ b/source/rr/src/cheats.cpp
@@ -361,13 +361,13 @@ void G_DoCheats(void)
                     levnume--;
 
                     ud.m_volume_number = volnume;
-                    ud.m_level_number = levnume;
+                    m_level_number = levnume;
                 }
                 else
                 {
                     // JBF 20030914
                     ud.m_volume_number = osdcmd_cheatsinfo_stat.volume;
-                    ud.m_level_number = osdcmd_cheatsinfo_stat.level;
+                    m_level_number = osdcmd_cheatsinfo_stat.level;
                 }
             }
             else if (cheatNum == CHEAT_SKILL)
@@ -554,7 +554,7 @@ void G_DoCheats(void)
                 {
                     if (RR)
                         g_lastLevel = 0;
-                    int32_t const volnume = ud.m_volume_number, levnume = ud.m_level_number;
+                    int32_t const volnume = ud.m_volume_number, levnume = m_level_number;
 
                     if ((!VOLUMEONE || volnume == 0) && (unsigned)volnume < (unsigned)g_volumeCnt &&
                         (unsigned)levnume < MAXLEVELS && g_mapInfo[volnume*MAXLEVELS + levnume].filename != NULL)
@@ -581,7 +581,7 @@ void G_DoCheats(void)
 
 #if 0
                     if (numplayers > 1 && g_netServer)
-                        Net_NewGame(ud.m_volume_number, ud.m_level_number);
+                        Net_NewGame(ud.m_volume_number, m_level_number);
                     else
 #endif
                         pPlayer->gm |= MODE_RESTART;
diff --git a/source/rr/src/config.cpp b/source/rr/src/config.cpp
index d4c68ea9b..8a11aeb15 100644
--- a/source/rr/src/config.cpp
+++ b/source/rr/src/config.cpp
@@ -68,10 +68,6 @@ void CONFIG_SetDefaults(void)
 
 	ud.camera_time = 0;//4;
 
-    ud.color = 0;
-    ud.detail = 0;
-    ud.m_ffire = 1;
-    ud.m_marker = 1;
     ud.menu_slidebarz = 65536;
     ud.menu_slidebarmargin = RR ? 6 * 65536 : 65536;
     ud.menu_slidecursorz = RR ? 32768 : 65536;
@@ -81,7 +77,7 @@ void CONFIG_SetDefaults(void)
     ud.statusbarflags = STATUSBAR_NOSHRINK;
     ud.statusbarmode = 1;
     ud.statusbarscale = 100;
-    ud.team = 0;
+    playerteam = 0;
     ud.angleinterpolation = 0;
 
     ScreenMode = 1;
diff --git a/source/rr/src/demo.cpp b/source/rr/src/demo.cpp
index 706f7a8e1..1ca20b462 100644
--- a/source/rr/src/demo.cpp
+++ b/source/rr/src/demo.cpp
@@ -145,7 +145,7 @@ void G_OpenDemoWrite(void)
     {
         Bstrcpy(apStrings[QUOTE_RESERVED4], "CANNOT START DEMO RECORDING WHEN DEAD!");
         P_DoQuote(QUOTE_RESERVED4, g_player[myconnectindex].ps);
-        ud.recstat = ud.m_recstat = 0;
+        ud.recstat = m_recstat = 0;
         return;
     }
     do
@@ -182,7 +182,7 @@ void G_OpenDemoWrite(void)
 error_wopen_demo:
         Bstrcpy(apStrings[QUOTE_RESERVED4], "FAILED STARTING DEMO RECORDING. SEE CONSOLE FOR DETAILS.");
         P_DoQuote(QUOTE_RESERVED4, g_player[myconnectindex].ps);
-        ud.recstat = ud.m_recstat = 0;
+        ud.recstat = m_recstat = 0;
         return;
     }
 
@@ -194,7 +194,7 @@ error_wopen_demo:
     P_DoQuote(QUOTE_RESERVED4, g_player[myconnectindex].ps);
 
     ud.reccnt = 0;
-    ud.recstat = ud.m_recstat = 1;  //
+    ud.recstat = m_recstat = 1;  //
 
 # if KRANDDEBUG
     krd_enable(1);
@@ -279,7 +279,7 @@ void G_CloseDemoWrite(void)
         // lastly, we need to write the number of written recsyncs to the demo file
 		g_demo_filePtr->Write(&g_demo_cnt, sizeof(g_demo_cnt));
 
-        ud.recstat = ud.m_recstat = 0;
+        ud.recstat = m_recstat = 0;
         delete g_demo_filePtr;
 		g_demo_filePtr = nullptr;
 
diff --git a/source/rr/src/game.cpp b/source/rr/src/game.cpp
index 70d448aca..d257d1a51 100644
--- a/source/rr/src/game.cpp
+++ b/source/rr/src/game.cpp
@@ -170,10 +170,10 @@ void G_HandleSpecialKeys(void)
 
     if (/*g_networkMode != NET_DEDICATED_SERVER && */ALT_IS_PRESSED && inputState.GetKeyStatus(sc_Enter))
     {
-        if (videoSetGameMode(!ScreenMode,ScreenWidth,ScreenHeight,ScreenBPP,ud.detail))
+        if (videoSetGameMode(!ScreenMode,ScreenWidth,ScreenHeight,ScreenBPP,1))
         {
             OSD_Printf(OSD_ERROR "Failed setting fullscreen video mode.\n");
-            if (videoSetGameMode(ScreenMode, ScreenWidth, ScreenHeight, ScreenBPP, ud.detail))
+            if (videoSetGameMode(ScreenMode, ScreenWidth, ScreenHeight, ScreenBPP, 1))
                 G_GameExit("Failed to recover from failure to set fullscreen video mode.\n");
         }
         else ScreenMode = !ScreenMode;
@@ -374,7 +374,7 @@ void G_GameExit(const char *msg)
         if (g_mostConcurrentPlayers > 1 && g_player[myconnectindex].ps->gm&MODE_GAME && GTFLAGS(GAMETYPE_SCORESHEET) && *msg == ' ')
         {
             G_BonusScreen(1);
-            videoSetGameMode(ScreenMode,ScreenWidth,ScreenHeight,ScreenBPP,ud.detail);
+            videoSetGameMode(ScreenMode,ScreenWidth,ScreenHeight,ScreenBPP,1);
         }
 
         // shareware and TEN screens
@@ -6014,7 +6014,7 @@ void GameInterface::set_hud_layout(int layout)
 
 void GameInterface::set_hud_scale(int scale)
 {
-	G_UpdateScreenArea();
+	G_SetStatusBarScale(scale);
 }
 
 void G_HandleLocalKeys(void)
@@ -6408,10 +6408,10 @@ FAKE_F3:
         {
             inputState.ClearKeyStatus(sc_F8);
 
-            int const fta = !ud.fta_on;
-            ud.fta_on     = 1;
+            int const fta = !hud_messages;
+            hud_messages     = 1;
             P_DoQuote(fta ? QUOTE_MESSAGES_ON : QUOTE_MESSAGES_OFF, g_player[myconnectindex].ps);
-            ud.fta_on     = fta;
+            hud_messages     = fta;
         }
 
         if ((buttonMap.ButtonDown(gamefunc_Quick_Load) || g_doQuickSave == 2) && (!RRRA || ud.player_skill != 4) && (!RR || RRRA || ud.player_skill != 5) && (g_player[myconnectindex].ps->gm&MODE_GAME))
@@ -7119,9 +7119,9 @@ static void G_CompileScripts(void)
 
 static inline void G_CheckGametype(void)
 {
-    ud.m_coop = clamp(ud.m_coop, 0, g_gametypeCnt-1);
-    initprintf("%s\n",g_gametypeNames[ud.m_coop]);
-    if (g_gametypeFlags[ud.m_coop] & GAMETYPE_ITEMRESPAWN)
+    m_coop = clamp(*m_coop, 0, g_gametypeCnt-1);
+    initprintf("%s\n",g_gametypeNames[m_coop]);
+    if (g_gametypeFlags[m_coop] & GAMETYPE_ITEMRESPAWN)
         ud.m_respawn_items = ud.m_respawn_inventory = 1;
 }
 
@@ -7413,9 +7413,9 @@ void G_UpdatePlayerFromMenu(void)
         /*int32_t j = g_player[myconnectindex].ps->team;*/
 
         P_SetupMiscInputSettings();
-        g_player[myconnectindex].ps->palookup = g_player[myconnectindex].pcolor = ud.color;
+        g_player[myconnectindex].ps->palookup = g_player[myconnectindex].pcolor = playercolor;
 
-        g_player[myconnectindex].pteam = ud.team;
+        g_player[myconnectindex].pteam = playerteam;
 
         if (sprite[g_player[myconnectindex].ps->i].picnum == APLAYER && sprite[g_player[myconnectindex].ps->i].pal != 1)
             sprite[g_player[myconnectindex].ps->i].pal = g_player[myconnectindex].pcolor;
@@ -7478,7 +7478,7 @@ static int G_EndOfLevel(void)
             }
             else
             {
-                ud.m_level_number = 0;
+                m_level_number = 0;
                 ud.level_number = 0;
             }
         }
@@ -7650,7 +7650,7 @@ int GameInterface::app_main()
 
     if (numplayers == 1 && boardfilename[0] != 0)
     {
-        ud.m_level_number  = 7;
+        m_level_number  = 7;
         ud.m_volume_number = 0;
         ud.warp_on         = 1;
     }
@@ -7689,7 +7689,7 @@ int GameInterface::app_main()
 
     //if (g_networkMode != NET_DEDICATED_SERVER)
     {
-        if (videoSetGameMode(ScreenMode, ScreenWidth, ScreenHeight, ScreenBPP, ud.detail) < 0)
+        if (videoSetGameMode(ScreenMode, ScreenWidth, ScreenHeight, ScreenBPP, 1) < 0)
         {
             initprintf("Failure setting video mode %dx%dx%d %s! Trying next mode...\n", *ScreenWidth, *ScreenHeight,
                        *ScreenBPP, *ScreenMode ? "fullscreen" : "windowed");
@@ -7708,7 +7708,7 @@ int GameInterface::app_main()
             int const savedIdx = resIdx;
             int bpp = ScreenBPP;
 
-            while (videoSetGameMode(0, validmode[resIdx].xdim, validmode[resIdx].ydim, bpp, ud.detail) < 0)
+            while (videoSetGameMode(0, validmode[resIdx].xdim, validmode[resIdx].ydim, bpp, 1) < 0)
             {
                 initprintf("Failure setting video mode %dx%dx%d windowed! Trying next mode...\n",
                            validmode[resIdx].xdim, validmode[resIdx].ydim, bpp);
@@ -7784,7 +7784,7 @@ MAIN_LOOP_RESTART:
     {
         if ((g_netServer || ud.multimode > 1) && boardfilename[0] != 0)
         {
-            ud.m_level_number = 7;
+            m_level_number = 7;
             ud.m_volume_number = 0;
 
             if (ud.m_player_skill == 4)
@@ -7820,13 +7820,13 @@ MAIN_LOOP_RESTART:
 
     ud.showweapons = ud.config.ShowOpponentWeapons;
     P_SetupMiscInputSettings();
-    g_player[myconnectindex].pteam = ud.team;
+    g_player[myconnectindex].pteam = playerteam;
 
     if (g_gametypeFlags[ud.coop] & GAMETYPE_TDM)
         g_player[myconnectindex].ps->palookup = g_player[myconnectindex].pcolor = G_GetTeamPalette(g_player[myconnectindex].pteam);
     else
     {
-        if (ud.color) g_player[myconnectindex].ps->palookup = g_player[myconnectindex].pcolor = ud.color;
+        if (playercolor) g_player[myconnectindex].ps->palookup = g_player[myconnectindex].pcolor = playercolor;
         else g_player[myconnectindex].ps->palookup = g_player[myconnectindex].pcolor;
     }
 
diff --git a/source/rr/src/game.h b/source/rr/src/game.h
index b2ed285d4..75f91f351 100644
--- a/source/rr/src/game.h
+++ b/source/rr/src/game.h
@@ -144,21 +144,21 @@ typedef struct {
     int32_t reccnt;
 
     int32_t runkey_mode,statusbarscale,weaponswitch;   // JBF 20031125
-    int32_t color,statusbarmode;
-	int32_t m_noexits,noexits,automsg;
-    int32_t team, althud;
+    int32_t statusbarmode;
+	int32_t noexits,automsg;
+    int32_t althud;
     int32_t statusbarflags, statusbarrange;
     int32_t menu_slidebarz, menu_slidebarmargin, menu_slidecursorz;
     int32_t menu_scrollbartilenum, menu_scrollbarz, menu_scrollcursorz;
 
-    int32_t entered_name,screen_tilting,fta_on;
-    int32_t m_coop,coop,screen_size,lockout,crosshair;
+    int32_t entered_name,screen_tilting;
+    int32_t coop,screen_size,lockout,crosshair;
     int32_t playerai,angleinterpolation;
 
     int32_t respawn_monsters,respawn_items,respawn_inventory,recstat,monsters_off,brightness;
-    int32_t m_respawn_items,m_respawn_monsters,m_respawn_inventory,m_recstat,m_monsters_off,detail;
-    int32_t m_ffire,ffire,m_player_skill,m_level_number,m_volume_number,multimode;
-    int32_t player_skill,level_number,volume_number,m_marker,marker;
+    int32_t m_respawn_items,m_respawn_monsters,m_respawn_inventory,m_recstat,m_monsters_off;
+    int32_t ffire,m_player_skill,m_level_number,m_volume_number,multimode;
+    int32_t player_skill,level_number,volume_number,marker;
     int32_t music_episode, music_level;
 
     int32_t playerbest;
@@ -209,7 +209,7 @@ static inline int G_HaveUserMap(void)
 
 static inline int Menu_HaveUserMap(void)
 {
-    return (boardfilename[0] != 0 && ud.m_level_number == 7 && ud.m_volume_number == 0);
+    return (boardfilename[0] != 0 && m_level_number == 7 && ud.m_volume_number == 0);
 }
 
 extern const char *defaultrtsfilename[GAMECOUNT];
@@ -437,7 +437,7 @@ enum
 
 static inline void G_NewGame_EnterLevel(void)
 {
-    G_NewGame(ud.m_volume_number, ud.m_level_number, ud.m_player_skill);
+    G_NewGame(ud.m_volume_number, m_level_number, ud.m_player_skill);
 
     if (G_EnterLevel(MODE_GAME))
         G_BackToMenu();
diff --git a/source/rr/src/gameexec.cpp b/source/rr/src/gameexec.cpp
index 7bb0154f8..500b78f5b 100644
--- a/source/rr/src/gameexec.cpp
+++ b/source/rr/src/gameexec.cpp
@@ -1632,7 +1632,7 @@ GAMEEXEC_STATIC void VM_Execute(native_t loop)
                         g_player[playerNum].ps->gm = MODE_EOL;
                     if (++ud.level_number > 6)
                         ud.level_number = 0;
-                    ud.m_level_number = ud.level_number;
+                    m_level_number = ud.level_number;
                 }
                 continue;
 
diff --git a/source/rr/src/menus.cpp b/source/rr/src/menus.cpp
index 6bdb89f71..981c9df1f 100644
--- a/source/rr/src/menus.cpp
+++ b/source/rr/src/menus.cpp
@@ -375,7 +375,7 @@ static MenuEntry_t ME_GAMESETUP_WEAPSWITCH_PICKUP = MAKE_MENUENTRY( "Equip picku
 
 static char const *MEOSN_DemoRec[] = { "Off", "Running", };
 static MenuOptionSet_t MEOS_DemoRec = MAKE_MENUOPTIONSET( MEOSN_DemoRec, NULL, 0x3 );
-static MenuOption_t MEO_GAMESETUP_DEMOREC = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &ud.m_recstat );
+static MenuOption_t MEO_GAMESETUP_DEMOREC = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &m_recstat.Value );
 static MenuEntry_t ME_GAMESETUP_DEMOREC = MAKE_MENUENTRY( "Record demo:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_DEMOREC, Option );
 
 static MenuOption_t MEO_ADULTMODE = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &adult_lockout.Value);
@@ -479,15 +479,8 @@ static MenuLink_t MEO_DISPLAYSETUP_COLORCORR = { MENU_COLCORR, MA_Advance, };
 static MenuEntry_t ME_DISPLAYSETUP_COLORCORR = MAKE_MENUENTRY( "Color Correction", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_COLORCORR, Link );
 
 
-static char const *MEOSN_DISPLAYSETUP_UPSCALING[] = { "None", "2x", "4x" };
-static int32_t MEOSV_DISPLAYSETUP_UPSCALING[] = { 1, 2, 4  };
-static MenuOptionSet_t MEOS_DISPLAYSETUP_UPSCALING = MAKE_MENUOPTIONSET( MEOSN_DISPLAYSETUP_UPSCALING, MEOSV_DISPLAYSETUP_UPSCALING, 0x0 );
-static MenuOption_t MEO_DISPLAYSETUP_UPSCALING = MAKE_MENUOPTION( &MF_Redfont, &MEOS_DISPLAYSETUP_UPSCALING, &ud.detail );
-static MenuEntry_t ME_DISPLAYSETUP_UPSCALING = MAKE_MENUENTRY( "Upscaling:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_UPSCALING, Option );
-
-
 #ifndef EDUKE32_ANDROID_MENU
-static MenuOption_t MEO_DISPLAYSETUP_ASPECTRATIO = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &r_usenewaspect);
+static MenuOption_t MEO_DISPLAYSETUP_ASPECTRATIO = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &r_usenewaspect.Value);
 static MenuEntry_t ME_DISPLAYSETUP_ASPECTRATIO = MAKE_MENUENTRY( "Widescreen:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_ASPECTRATIO, Option );
 #endif
 
@@ -537,7 +530,7 @@ static MenuOption_t MEO_SCREENSETUP_LEVELSTATS = MAKE_MENUOPTION(&MF_Redfont, &M
 static MenuEntry_t ME_SCREENSETUP_LEVELSTATS = MAKE_MENUENTRY( "Level stats:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SCREENSETUP_LEVELSTATS, Option );
 
 
-static MenuOption_t MEO_SCREENSETUP_SHOWPICKUPMESSAGES = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &ud.fta_on);
+static MenuOption_t MEO_SCREENSETUP_SHOWPICKUPMESSAGES = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &hud_messages.Value);
 static MenuEntry_t ME_SCREENSETUP_SHOWPICKUPMESSAGES = MAKE_MENUENTRY( "Game messages:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SCREENSETUP_SHOWPICKUPMESSAGES, Option );
 
 
@@ -660,7 +653,6 @@ static MenuEntry_t *MEL_DISPLAYSETUP[] = {
     &ME_DISPLAYSETUP_ASPECTRATIO,
     &ME_DISPLAYSETUP_FOV,
 #endif
-    &ME_DISPLAYSETUP_UPSCALING,
 };
 
 #ifdef USE_OPENGL
@@ -773,7 +765,7 @@ static MenuEntry_t *MEL_MOUSESETUPBTNS[MENUMOUSEFUNCTIONS];
 
 static MenuLink_t MEO_MOUSESETUP_BTNS = { MENU_MOUSEBTNS, MA_Advance, };
 static MenuEntry_t ME_MOUSESETUP_BTNS = MAKE_MENUENTRY( "Button assignment", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_BTNS, Link );
-static MenuRangeFloat_t MEO_MOUSESETUP_SENSITIVITY = MAKE_MENURANGE( &CONTROL_MouseSensitivity, &MF_Redfont, .5f, 16.f, 0.f, 32, 1 );
+static MenuRangeFloat_t MEO_MOUSESETUP_SENSITIVITY = MAKE_MENURANGE( &in_mousesensitivity.Value, &MF_Redfont, .5f, 16.f, 0.f, 32, 1 );
 static MenuEntry_t ME_MOUSESETUP_SENSITIVITY = MAKE_MENUENTRY( "Sensitivity:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_SENSITIVITY, RangeFloat );
 
 #ifndef EDUKE32_SIMPLE_MENU
@@ -792,9 +784,9 @@ static MenuEntry_t ME_MOUSESETUP_SMOOTH = MAKE_MENUENTRY( "Filter input:", &MF_R
 static MenuLink_t MEO_MOUSESETUP_ADVANCED = { MENU_MOUSEADVANCED, MA_Advance, };
 static MenuEntry_t ME_MOUSESETUP_ADVANCED = MAKE_MENUENTRY( "Advanced setup", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_ADVANCED, Link );
 #endif
-static MenuRangeInt32_t MEO_MOUSEADVANCED_SCALEX = MAKE_MENURANGE(&MouseAnalogueScale[0], &MF_Redfont, -262144, 262144, 65536, 161, 3);
+static MenuRangeInt32_t MEO_MOUSEADVANCED_SCALEX = MAKE_MENURANGE(&in_mousescalex.Value, &MF_Redfont, -262144, 262144, 65536, 161, 3);
 static MenuEntry_t      ME_MOUSEADVANCED_SCALEX  = MAKE_MENUENTRY("X-Scale:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSEADVANCED_SCALEX, RangeInt32);
-static MenuRangeInt32_t MEO_MOUSEADVANCED_SCALEY = MAKE_MENURANGE(&MouseAnalogueScale[1], &MF_Redfont, -262144, 262144, 65536, 161, 3);
+static MenuRangeInt32_t MEO_MOUSEADVANCED_SCALEY = MAKE_MENURANGE(&in_mousescaley.Value, &MF_Redfont, -262144, 262144, 65536, 161, 3);
 static MenuEntry_t      ME_MOUSEADVANCED_SCALEY  = MAKE_MENUENTRY("Y-Scale:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSEADVANCED_SCALEY, RangeInt32);
 
 static MenuEntry_t *MEL_MOUSESETUP[] = {
@@ -938,12 +930,6 @@ static MenuEntry_t *MEL_INTERNAL_JOYSTICKAXIS_DIGITAL[] = {
 static MenuOption_t MEO_RENDERERSETUP_HIGHTILE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NoYes, &hw_hightile.Value );
 static MenuEntry_t ME_RENDERERSETUP_HIGHTILE = MAKE_MENUENTRY( "True color textures:", &MF_Bluefont, &MEF_SmallOptions, &MEO_RENDERERSETUP_HIGHTILE, Option );
 
-static char const *MEOSN_RENDERERSETUP_TEXQUALITY [] = { "Full", "Half", "Barf", };
-static MenuOptionSet_t MEOS_RENDERERSETUP_TEXQUALITY = MAKE_MENUOPTIONSET(MEOSN_RENDERERSETUP_TEXQUALITY, NULL, 0x2);
-static MenuOption_t MEO_RENDERERSETUP_TEXQUALITY = MAKE_MENUOPTION(&MF_Bluefont, &MEOS_RENDERERSETUP_TEXQUALITY, &r_downsize);
-static MenuEntry_t ME_RENDERERSETUP_TEXQUALITY = MAKE_MENUENTRY("GL texture quality:", &MF_Bluefont, &MEF_SmallOptions, &MEO_RENDERERSETUP_TEXQUALITY, Option);
-
-
 static MenuOption_t MEO_RENDERERSETUP_PRECACHE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &r_precache.Value );
 static MenuEntry_t ME_RENDERERSETUP_PRECACHE = MAKE_MENUENTRY( "Pre-load map textures:", &MF_Bluefont, &MEF_SmallOptions, &MEO_RENDERERSETUP_PRECACHE, Option );
 # ifndef EDUKE32_GLES
@@ -964,7 +950,6 @@ static MenuEntry_t ME_RENDERERSETUP_MODELS = MAKE_MENUENTRY( "3D models:", &MF_B
 #ifdef USE_OPENGL
 static MenuEntry_t *MEL_RENDERERSETUP_POLYMOST[] = {
     &ME_RENDERERSETUP_HIGHTILE,
-    &ME_RENDERERSETUP_TEXQUALITY,
     &ME_RENDERERSETUP_PRECACHE,
 # ifdef USE_GLEXT
     &ME_RENDERERSETUP_DETAILTEX,
@@ -977,14 +962,14 @@ static MenuEntry_t *MEL_RENDERERSETUP_POLYMOST[] = {
 #endif
 
 #ifdef EDUKE32_ANDROID_MENU
-static MenuRangeFloat_t MEO_COLCORR_GAMMA = MAKE_MENURANGE( &g_videoGamma, &MF_Bluefont, 1.f, 2.5f, 0.f, 39, 1 );
+static MenuRangeFloat_t MEO_COLCORR_GAMMA = MAKE_MENURANGE( &vid_gamma, &MF_Bluefont, 1.f, 2.5f, 0.f, 39, 1 );
 #else
-static MenuRangeFloat_t MEO_COLCORR_GAMMA = MAKE_MENURANGE( &g_videoGamma, &MF_Bluefont, 0.3f, 4.f, 0.f, 38, 1 );
+static MenuRangeFloat_t MEO_COLCORR_GAMMA = MAKE_MENURANGE( &vid_gamma.Value, &MF_Bluefont, 0.3f, 4.f, 0.f, 38, 1 );
 #endif
 static MenuEntry_t ME_COLCORR_GAMMA = MAKE_MENUENTRY( "Gamma:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_GAMMA, RangeFloat );
-static MenuRangeFloat_t MEO_COLCORR_CONTRAST = MAKE_MENURANGE( &g_videoContrast, &MF_Bluefont, 0.1f, 2.7f, 0.f, 53, 1 );
+static MenuRangeFloat_t MEO_COLCORR_CONTRAST = MAKE_MENURANGE( &vid_contrast.Value, &MF_Bluefont, 0.1f, 2.7f, 0.f, 53, 1 );
 static MenuEntry_t ME_COLCORR_CONTRAST = MAKE_MENUENTRY( "Contrast:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_CONTRAST, RangeFloat );
-static MenuRangeFloat_t MEO_COLCORR_BRIGHTNESS = MAKE_MENURANGE( &g_videoBrightness, &MF_Bluefont, -0.8f, 0.8f, 0.f, 33, 1 );
+static MenuRangeFloat_t MEO_COLCORR_BRIGHTNESS = MAKE_MENURANGE( &vid_brightness.Value, &MF_Bluefont, -0.8f, 0.8f, 0.f, 33, 1 );
 static MenuEntry_t ME_COLCORR_BRIGHTNESS = MAKE_MENUENTRY( "Brightness:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_BRIGHTNESS, RangeFloat );
 static MenuEntry_t ME_COLCORR_RESET = MAKE_MENUENTRY( "Reset To Defaults", &MF_Redfont, &MEF_ColorCorrect, &MEO_NULL, Link );
 #ifdef EDUKE32_ANDROID_MENU
@@ -1146,11 +1131,11 @@ static MenuEntry_t *MEL_NETWORK[] = {
 static char const *MEOSN_PLAYER_COLOR[] = { "Auto", "Blue", "Red", "Green", "Gray", "Dark gray", "Dark green", "Brown", "Dark blue", "Bright red", "Yellow", };
 static int32_t MEOSV_PLAYER_COLOR[] = { 0, 9, 10, 11, 12, 13, 14, 15, 16, 21, 23, };
 static MenuOptionSet_t MEOS_PLAYER_COLOR = MAKE_MENUOPTIONSET( MEOSN_PLAYER_COLOR, MEOSV_PLAYER_COLOR, 0x2 );
-static MenuOption_t MEO_PLAYER_COLOR = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_PLAYER_COLOR, &ud.color );
+static MenuOption_t MEO_PLAYER_COLOR = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_PLAYER_COLOR, &playercolor.Value );
 static MenuEntry_t ME_PLAYER_COLOR = MAKE_MENUENTRY( "Color", &MF_Bluefont, &MEF_PlayerNarrow, &MEO_PLAYER_COLOR, Option );
 static char const *MEOSN_PLAYER_TEAM[] = { "Blue", "Red", "Green", "Gray", };
 static MenuOptionSet_t MEOS_PLAYER_TEAM = MAKE_MENUOPTIONSET( MEOSN_PLAYER_TEAM, NULL, 0x2 );
-static MenuOption_t MEO_PLAYER_TEAM = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_PLAYER_TEAM, &ud.team );
+static MenuOption_t MEO_PLAYER_TEAM = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_PLAYER_TEAM, &playerteam.Value );
 static MenuEntry_t ME_PLAYER_TEAM = MAKE_MENUENTRY( "Team", &MF_Bluefont, &MEF_PlayerNarrow, &MEO_PLAYER_TEAM, Option );
 #ifndef EDUKE32_SIMPLE_MENU
 static MenuLink_t MEO_PLAYER_MACROS = { MENU_MACROS, MA_Advance, };
@@ -1199,7 +1184,7 @@ static MenuEntry_t *MEL_NETHOST[] = {
 };
 
 static MenuOptionSet_t MEOS_NETOPTIONS_GAMETYPE = MAKE_MENUOPTIONSET( MEOSN_NetGametypes, NULL, 0x0 );
-static MenuOption_t MEO_NETOPTIONS_GAMETYPE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NETOPTIONS_GAMETYPE, &ud.m_coop );
+static MenuOption_t MEO_NETOPTIONS_GAMETYPE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NETOPTIONS_GAMETYPE, &m_coop.Value );
 static MenuEntry_t ME_NETOPTIONS_GAMETYPE = MAKE_MENUENTRY( "Game Type", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_GAMETYPE, Option );
 static MenuOptionSet_t MEOS_NETOPTIONS_EPISODE = MAKE_MENUOPTIONSET( MEOSN_NetEpisodes, MEOSV_NetEpisodes, 0x0 );
 static int32_t NetEpisode;
@@ -1207,18 +1192,18 @@ static MenuOption_t MEO_NETOPTIONS_EPISODE = MAKE_MENUOPTION( &MF_Bluefont, &MEO
 static MenuEntry_t ME_NETOPTIONS_EPISODE = MAKE_MENUENTRY( "Episode", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_EPISODE, Option );
 static MenuOptionSet_t MEOS_NETOPTIONS_LEVEL_TEMPLATE = MAKE_MENUOPTIONSETNULL;
 static MenuOptionSet_t MEOS_NETOPTIONS_LEVEL[MAXVOLUMES];
-static MenuOption_t MEO_NETOPTIONS_LEVEL = MAKE_MENUOPTION( &MF_Bluefont, NULL, &ud.m_level_number );
+static MenuOption_t MEO_NETOPTIONS_LEVEL = MAKE_MENUOPTION( &MF_Bluefont, NULL, &m_level_number.Value );
 static MenuEntry_t ME_NETOPTIONS_LEVEL = MAKE_MENUENTRY( "Level", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_LEVEL, Option );
 static MenuLink_t MEO_NETOPTIONS_USERMAP = { MENU_NETUSERMAP, MA_Advance, };
 static MenuEntry_t ME_NETOPTIONS_USERMAP = MAKE_MENUENTRY( "User Map", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_USERMAP, Link );
 static MenuOptionSet_t MEOS_NETOPTIONS_MONSTERS = MAKE_MENUOPTIONSET( MEOSN_NetSkills, NULL, 0x0 );
 static MenuOption_t MEO_NETOPTIONS_MONSTERS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NETOPTIONS_MONSTERS, NULL );
 static MenuEntry_t ME_NETOPTIONS_MONSTERS = MAKE_MENUENTRY( "Monsters", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_MONSTERS, Option );
-static MenuOption_t MEO_NETOPTIONS_MARKERS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &ud.m_marker );
+static MenuOption_t MEO_NETOPTIONS_MARKERS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &m_marker.Value);
 static MenuEntry_t ME_NETOPTIONS_MARKERS = MAKE_MENUENTRY( "Markers", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_MARKERS, Option );
-static MenuOption_t MEO_NETOPTIONS_MAPEXITS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OnOff, &ud.m_noexits );
+static MenuOption_t MEO_NETOPTIONS_MAPEXITS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OnOff, &m_noexits.Value);
 static MenuEntry_t ME_NETOPTIONS_MAPEXITS = MAKE_MENUENTRY( "Map Exits", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_MAPEXITS, Option );
-static MenuOption_t MEO_NETOPTIONS_FRFIRE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &ud.m_ffire );
+static MenuOption_t MEO_NETOPTIONS_FRFIRE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &m_ffire.Value);
 static MenuEntry_t ME_NETOPTIONS_FRFIRE = MAKE_MENUENTRY( "Fr. Fire", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_FRFIRE, Option );
 static MenuEntry_t ME_NETOPTIONS_ACCEPT = MAKE_MENUENTRY( "Accept", &MF_Redfont, &MEF_NetSetup_Confirm, &MEO_NETWORK_HOSTGAME, Link );
 
@@ -1917,7 +1902,7 @@ static void Menu_Pre(MenuID_t cm)
 
     case MENU_GAMESETUP:
         MEO_GAMESETUP_DEMOREC.options = (ps->gm&MODE_GAME) ? &MEOS_DemoRec : &MEOS_OffOn;
-        MenuEntry_DisableOnCondition(&ME_GAMESETUP_DEMOREC, (ps->gm&MODE_GAME) && ud.m_recstat != 1);
+        MenuEntry_DisableOnCondition(&ME_GAMESETUP_DEMOREC, (ps->gm&MODE_GAME) && m_recstat != 1);
         break;
 
 #ifdef USE_OPENGL
@@ -1964,7 +1949,6 @@ static void Menu_Pre(MenuID_t cm)
 
     case MENU_POLYMER:
     case MENU_POLYMOST:
-        MenuEntry_DisableOnCondition(&ME_RENDERERSETUP_TEXQUALITY, !hw_hightile);
         MenuEntry_DisableOnCondition(&ME_RENDERERSETUP_PRECACHE, !hw_hightile);
 # ifdef USE_GLEXT
         MenuEntry_DisableOnCondition(&ME_RENDERERSETUP_DETAILTEX, !hw_hightile);
@@ -2021,7 +2005,7 @@ static void Menu_Pre(MenuID_t cm)
             MEL_NETOPTIONS[2] = &ME_NETOPTIONS_LEVEL;
             MEO_NETOPTIONS_LEVEL.options = &MEOS_NETOPTIONS_LEVEL[MEOSV_NetEpisodes[MEO_NETOPTIONS_EPISODE.currentOption]];
         }
-        if (!(g_gametypeFlags[ud.m_coop] & GAMETYPE_MARKEROPTION))
+        if (!(g_gametypeFlags[m_coop] & GAMETYPE_MARKEROPTION))
         {
             ME_NETOPTIONS_MARKERS.type = Dummy;
             ME_NETOPTIONS_MARKERS.flags |= MEF_Disabled;
@@ -2031,7 +2015,7 @@ static void Menu_Pre(MenuID_t cm)
             ME_NETOPTIONS_MARKERS.type = Option;
             ME_NETOPTIONS_MARKERS.flags &= ~MEF_Disabled;
         }
-        MEL_NETOPTIONS[5] = (g_gametypeFlags[ud.m_coop] & (GAMETYPE_PLAYERSFRIENDLY|GAMETYPE_TDM)) ? &ME_NETOPTIONS_FRFIRE : &ME_NETOPTIONS_MAPEXITS;
+        MEL_NETOPTIONS[5] = (g_gametypeFlags[m_coop] & (GAMETYPE_PLAYERSFRIENDLY|GAMETYPE_TDM)) ? &ME_NETOPTIONS_FRFIRE : &ME_NETOPTIONS_MAPEXITS;
         break;
 
     case MENU_OPTIONS:
@@ -2200,9 +2184,9 @@ static void Menu_PreDraw(MenuID_t cm, MenuEntry_t *entry, const vec2_t origin)
 
     case MENU_PLAYER:
         if (RR)
-            rotatesprite_fs(origin.x + (260<<16), origin.y + ((24+(tilesiz[APLAYER].y>>2))<<16), 24576L,0,3845+36-((((8-((int32_t) totalclock>>4)))&7)*5),0,entry == &ME_PLAYER_TEAM ? G_GetTeamPalette(ud.team) : ud.color,10);
+            rotatesprite_fs(origin.x + (260<<16), origin.y + ((24+(tilesiz[APLAYER].y>>2))<<16), 24576L,0,3845+36-((((8-((int32_t) totalclock>>4)))&7)*5),0,entry == &ME_PLAYER_TEAM ? G_GetTeamPalette(playerteam) : playercolor,10);
         else
-            rotatesprite_fs(origin.x + (260<<16), origin.y + ((24+(tilesiz[APLAYER].y>>1))<<16), 49152L,0,1441-((((4-((int32_t) totalclock>>4)))&3)*5),0,entry == &ME_PLAYER_TEAM ? G_GetTeamPalette(ud.team) : ud.color,10);
+            rotatesprite_fs(origin.x + (260<<16), origin.y + ((24+(tilesiz[APLAYER].y>>1))<<16), 49152L,0,1441-((((4-((int32_t) totalclock>>4)))&3)*5),0,entry == &ME_PLAYER_TEAM ? G_GetTeamPalette(playerteam) : playercolor,10);
         break;
 
     case MENU_MACROS:
@@ -2229,27 +2213,27 @@ static void Menu_PreDraw(MenuID_t cm, MenuEntry_t *entry, const vec2_t origin)
         mminitext(origin.x + (90<<16), origin.y + ((90+8)<<16), "Episode", MF_Minifont.pal_deselected);
         mminitext(origin.x + (90<<16), origin.y + ((90+8+8)<<16), "Level", MF_Minifont.pal_deselected);
         mminitext(origin.x + (90<<16), origin.y + ((90+8+8+8)<<16), ME_NETOPTIONS_MONSTERS.name, MF_Minifont.pal_deselected);
-        if (ud.m_coop == 0)
+        if (m_coop == 0)
             mminitext(origin.x + (90<<16), origin.y + ((90+8+8+8+8)<<16), "Markers", MF_Minifont.pal_deselected);
-        else if (ud.m_coop == 1)
+        else if (m_coop == 1)
             mminitext(origin.x + (90<<16), origin.y + ((90+8+8+8+8)<<16), "Friendly Fire", MF_Minifont.pal_deselected);
         mminitext(origin.x + (90<<16), origin.y + ((90+8+8+8+8+8)<<16), "User Map", MF_Minifont.pal_deselected);
 
-        mminitext(origin.x + ((90+60)<<16), origin.y + (90<<16), g_gametypeNames[ud.m_coop], MF_Minifont.pal_deselected_right);
+        mminitext(origin.x + ((90+60)<<16), origin.y + (90<<16), g_gametypeNames[m_coop], MF_Minifont.pal_deselected_right);
 
         mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8)<<16), g_volumeNames[ud.m_volume_number], MF_Minifont.pal_deselected_right);
-        mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8)<<16), g_mapInfo[MAXLEVELS*ud.m_volume_number+ud.m_level_number].name, MF_Minifont.pal_deselected_right);
+        mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8)<<16), g_mapInfo[MAXLEVELS*ud.m_volume_number+m_level_number].name, MF_Minifont.pal_deselected_right);
         if (ud.m_monsters_off == 0 || ud.m_player_skill > 0)
             mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8)<<16), g_skillNames[ud.m_player_skill], MF_Minifont.pal_deselected_right);
         else mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8)<<16), "None", MF_Minifont.pal_deselected_right);
-        if (ud.m_coop == 0)
+        if (m_coop == 0)
         {
-            if (ud.m_marker) mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8+8)<<16), "On", MF_Minifont.pal_deselected_right);
+            if (m_marker) mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8+8)<<16), "On", MF_Minifont.pal_deselected_right);
             else mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8+8)<<16), "Off", MF_Minifont.pal_deselected_right);
         }
-        else if (ud.m_coop == 1)
+        else if (m_coop == 1)
         {
-            if (ud.m_ffire) mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8+8)<<16), "On", MF_Minifont.pal_deselected_right);
+            if (m_ffire) mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8+8)<<16), "On", MF_Minifont.pal_deselected_right);
             else mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8+8)<<16), "Off", MF_Minifont.pal_deselected_right);
         }
         break;
@@ -3418,7 +3402,7 @@ static void Menu_EntryLinkActivate(MenuEntry_t *entry)
         if (entry != &ME_EPISODE_USERMAP)
         {
             ud.m_volume_number = M_EPISODE.currentEntry;
-            ud.m_level_number = 0;
+            m_level_number = 0;
 
             if (g_skillCnt == 0)
                 Menu_StartGameWithoutSkill();
@@ -3573,10 +3557,10 @@ static void Menu_EntryLinkActivate(MenuEntry_t *entry)
     }
     else if (entry == &ME_COLCORR_RESET)
     {
-        g_videoGamma = DEFAULT_GAMMA;
-        g_videoContrast = DEFAULT_CONTRAST;
-        g_videoBrightness = DEFAULT_BRIGHTNESS;
-        r_ambientlight = 1.f;
+		vid_gamma = 1.f;
+		vid_contrast = 1.f;
+		vid_brightness = 0.f;
+		r_ambientlight = 1.f;
         videoSetPalette(0,g_player[myconnectindex].ps->palette,0);
     }
     else if (entry == &ME_KEYBOARDSETUP_RESET)
@@ -3722,21 +3706,9 @@ static void Menu_EntryOptionDidModify(MenuEntry_t *entry)
         entry == &ME_PLAYER_COLOR ||
         entry == &ME_PLAYER_TEAM)
         G_UpdatePlayerFromMenu();
-    else if (entry == &ME_DISPLAYSETUP_UPSCALING)
-    {
-        if (in3dmode())
-        {
-            videoSetGameMode(fullscreen, xres, yres, bpp, ud.detail);
-        }
-    }
 #ifdef USE_OPENGL
     else if (entry == &ME_DISPLAYSETUP_ANISOTROPY || entry == &ME_DISPLAYSETUP_TEXFILTER)
         gltexapplyprops();
-    else if (entry == &ME_RENDERERSETUP_TEXQUALITY)
-    {
-        r_downsizevar = r_downsize;
-        domodechange = 1;
-    }
 
     if (domodechange)
     {
@@ -3766,10 +3738,6 @@ static int32_t Menu_EntryRangeInt32Modify(MenuEntry_t *entry, int32_t newValue)
         FX_SetVolume(newValue);
     else if (entry == &ME_SOUND_VOLUME_MUSIC)
         S_MusicVolume(newValue);
-    else if (entry == &ME_MOUSEADVANCED_SCALEX)
-        CONTROL_SetAnalogAxisScale(0, newValue, controldevice_mouse);
-    else if (entry == &ME_MOUSEADVANCED_SCALEY)
-        CONTROL_SetAnalogAxisScale(1, newValue, controldevice_mouse);
     else if (entry == &ME_JOYSTICKAXIS_SCALE)
         CONTROL_SetAnalogAxisScale(M_JOYSTICKAXES.currentEntry, newValue, controldevice_joystick);
     else if (entry == &ME_JOYSTICKAXIS_DEAD)
@@ -4186,7 +4154,7 @@ static void Menu_FileSelect(int32_t input)
         if (input)
         {
             ud.m_volume_number = 0;
-            ud.m_level_number = 7;
+            m_level_number = 7;
 
             if (g_skillCnt > 0)
                 Menu_AnimateChange(MENU_SKILL, MA_Advance);
diff --git a/source/rr/src/net.cpp b/source/rr/src/net.cpp
index ba24d3af0..7506641c5 100644
--- a/source/rr/src/net.cpp
+++ b/source/rr/src/net.cpp
@@ -2403,7 +2403,7 @@ void Net_ParsePacket(uint8_t *packbuf, int packbufleng)
             if (vote_map != -1 || vote_episode != -1 || voting != -1)
                 G_AddUserQuote("VOTE SUCCEEDED");
 
-            ud.m_level_number = ud.level_number = packbuf[1];
+            m_level_number = ud.level_number = packbuf[1];
             ud.m_volume_number = ud.volume_number = packbuf[2];
             ud.m_player_skill = ud.player_skill = packbuf[3];
 
@@ -2412,10 +2412,10 @@ void Net_ParsePacket(uint8_t *packbuf, int packbufleng)
             ud.m_respawn_monsters = packbuf[5];
             ud.m_respawn_items = packbuf[6];
             ud.m_respawn_inventory = packbuf[7];
-            ud.m_coop = packbuf[8];
-            ud.m_marker = packbuf[9];
-            ud.m_ffire = packbuf[10];
-            ud.m_noexits = packbuf[11];
+            m_coop = packbuf[8];
+            m_marker = packbuf[9];
+            m_ffire = packbuf[10];
+            m_noexits = packbuf[11];
             //ud.m_weaponstay = packbuf[12];
 
             for (int TRAVERSE_CONNECT(i))
@@ -2437,7 +2437,7 @@ void Net_ParsePacket(uint8_t *packbuf, int packbufleng)
                 for (i = connectpoint2[connecthead]; i >= 0; i = connectpoint2[i])
                     if (i != other) Net_SendPacket(i, packbuf, packbufleng);
 
-            ud.m_level_number = ud.level_number = packbuf[1];
+            m_level_number = ud.level_number = packbuf[1];
             ud.m_volume_number = ud.volume_number = packbuf[2];
             ud.m_player_skill = ud.player_skill = packbuf[3];
 
@@ -2446,10 +2446,10 @@ void Net_ParsePacket(uint8_t *packbuf, int packbufleng)
             ud.m_respawn_monsters = packbuf[5];
             ud.m_respawn_items = packbuf[6];
             ud.m_respawn_inventory = packbuf[7];
-            ud.m_coop = packbuf[8];
-            ud.m_marker = packbuf[9];
-            ud.m_ffire = packbuf[10];
-            ud.m_noexits = packbuf[11];
+            m_coop = packbuf[8];
+            m_marker = packbuf[9];
+            m_ffire = packbuf[10];
+            m_noexits = packbuf[11];
             //ud.m_weaponstay = packbuf[12];
             break;
 
@@ -2518,7 +2518,7 @@ void Net_ParsePacket(uint8_t *packbuf, int packbufleng)
             g_player[i].ps->gm = MODE_EOL;
 
             ud.level_number = packbuf[1];
-            ud.m_level_number = ud.level_number;
+            m_level_number = ud.level_number;
             ud.from_bonus = packbuf[2];
             break;
 
@@ -2601,8 +2601,8 @@ void Net_ParsePacket(uint8_t *packbuf, int packbufleng)
                 }
             }
 
-            if (ud.m_level_number == 7 && ud.m_volume_number == 0 && boardfilename[0] == 0)
-                ud.m_level_number = 0;
+            if (m_level_number == 7 && ud.m_volume_number == 0 && boardfilename[0] == 0)
+                m_level_number = 0;
 
             break;
 
@@ -3430,9 +3430,9 @@ void Net_SendClientInfo(void)
     tempbuf[l++] = g_player[myconnectindex].ps->aim_mode = in_aimmode;
     tempbuf[l++] = g_player[myconnectindex].ps->auto_aim = cl_autoaim;
     tempbuf[l++] = g_player[myconnectindex].ps->weaponswitch = cl_weaponswitch;
-    tempbuf[l++] = g_player[myconnectindex].ps->palookup = g_player[myconnectindex].pcolor = ud.color;
+    tempbuf[l++] = g_player[myconnectindex].ps->palookup = g_player[myconnectindex].pcolor = playercolor;
 
-    tempbuf[l++] = g_player[myconnectindex].pteam = ud.team;
+    tempbuf[l++] = g_player[myconnectindex].pteam = playerteam;
 
     for (i=0; i<10; i++)
     {
@@ -3527,8 +3527,8 @@ void Net_ReceiveUserMapName(uint8_t *pbuf, int32_t packbufleng)
         }
     }
 
-    if (ud.m_level_number == 7 && ud.m_volume_number == 0 && boardfilename[0] == 0)
-        ud.m_level_number = 0;
+    if (m_level_number == 7 && ud.m_volume_number == 0 && boardfilename[0] == 0)
+        m_level_number = 0;
 }
 
 void Net_SendMessage(void)
@@ -3707,7 +3707,7 @@ void Net_StartNewGame()
 
     Net_ExtractNewGame(&pendingnewgame, 0);
     G_NewGame(ud.volume_number,ud.level_number,ud.player_skill);
-    ud.coop = ud.m_coop;
+    ud.coop = m_coop;
 
     //g_netMapRevision = 0;
 
@@ -3762,16 +3762,16 @@ void Net_FillNewGame(newgame_t *newgame, int32_t frommenu)
 {
     if (frommenu)
     {
-        newgame->level_number = ud.m_level_number;
+        newgame->level_number = m_level_number;
         newgame->volume_number = ud.m_volume_number;
         newgame->player_skill = ud.m_player_skill;
         newgame->monsters_off = ud.m_monsters_off;
         newgame->respawn_monsters = ud.m_respawn_monsters;
         newgame->respawn_items = ud.m_respawn_items;
         newgame->respawn_inventory = ud.m_respawn_inventory;
-        newgame->ffire = ud.m_ffire;
-        newgame->noexits = ud.m_noexits;
-        newgame->coop = ud.m_coop;
+        newgame->ffire = m_ffire;
+        newgame->noexits = m_noexits;
+        newgame->coop = m_coop;
     }
     else
     {
@@ -3790,16 +3790,16 @@ void Net_FillNewGame(newgame_t *newgame, int32_t frommenu)
 
 void Net_ExtractNewGame(newgame_t *newgame, int32_t menuonly)
 {
-    ud.m_level_number = newgame->level_number;
+    m_level_number = newgame->level_number;
     ud.m_volume_number = newgame->volume_number;
     ud.m_player_skill = newgame->player_skill;
     ud.m_monsters_off = newgame->monsters_off;
     ud.m_respawn_monsters = newgame->respawn_monsters;
     ud.m_respawn_items = newgame->respawn_items;
     ud.m_respawn_inventory = newgame->respawn_inventory;
-    ud.m_ffire = newgame->ffire;
-    ud.m_noexits = newgame->noexits;
-    ud.m_coop = newgame->coop;
+    m_ffire = newgame->ffire;
+    m_noexits = newgame->noexits;
+    m_coop = newgame->coop;
 
     if (!menuonly)
     {
diff --git a/source/rr/src/osdcmds.cpp b/source/rr/src/osdcmds.cpp
index 0f864801a..c42665d92 100644
--- a/source/rr/src/osdcmds.cpp
+++ b/source/rr/src/osdcmds.cpp
@@ -82,7 +82,7 @@ static int osdcmd_changelevel(osdcmdptr_t parm)
         else if (voting == -1)
         {
             ud.m_volume_number = volume;
-            ud.m_level_number = level;
+            m_level_number = level;
 
             if (g_player[myconnectindex].ps->i)
             {
@@ -101,12 +101,12 @@ static int osdcmd_changelevel(osdcmdptr_t parm)
                 tempbuf[0] = PACKET_MAP_VOTE_INITIATE;
                 tempbuf[1] = myconnectindex;
                 tempbuf[2] = ud.m_volume_number;
-                tempbuf[3] = ud.m_level_number;
+                tempbuf[3] = m_level_number;
 
                 enet_peer_send(g_netClientPeer, CHAN_GAMESTATE, enet_packet_create(tempbuf, 4, ENET_PACKET_FLAG_RELIABLE));
             }
-            if ((g_gametypeFlags[ud.m_coop] & GAMETYPE_PLAYERSFRIENDLY) && !(g_gametypeFlags[ud.m_coop] & GAMETYPE_TDM))
-                ud.m_noexits = 0;
+            if ((g_gametypeFlags[m_coop] & GAMETYPE_PLAYERSFRIENDLY) && !(g_gametypeFlags[m_coop] & GAMETYPE_TDM))
+                m_noexits = 0;
 
             M_OpenMenu(myconnectindex);
             Menu_Change(MENU_NETWAITVOTES);
@@ -127,7 +127,7 @@ static int osdcmd_changelevel(osdcmdptr_t parm)
         osdcmd_cheatsinfo_stat.cheatnum = -1;
 
         ud.m_volume_number     = volume;
-        ud.m_level_number      = level;
+        m_level_number      = level;
 
         ud.m_monsters_off      = 0;
         ud.monsters_off        = 0;
@@ -174,15 +174,15 @@ static int osdcmd_map(osdcmdptr_t parm)
         {
             Net_SendUserMapName();
             ud.m_volume_number = 0;
-            ud.m_level_number = 7;
-            Net_NewGame(ud.m_volume_number, ud.m_level_number);
+            m_level_number = 7;
+            Net_NewGame(ud.m_volume_number, m_level_number);
         }
         else if (voting == -1)
         {
             Net_SendUserMapName();
 
             ud.m_volume_number = 0;
-            ud.m_level_number = 7;
+            m_level_number = 7;
 
             if (g_player[myconnectindex].ps->i)
             {
@@ -200,12 +200,12 @@ static int osdcmd_map(osdcmdptr_t parm)
                 tempbuf[0] = PACKET_MAP_VOTE_INITIATE;
                 tempbuf[1] = myconnectindex;
                 tempbuf[2] = ud.m_volume_number;
-                tempbuf[3] = ud.m_level_number;
+                tempbuf[3] = m_level_number;
 
                 enet_peer_send(g_netClientPeer, CHAN_GAMESTATE, enet_packet_create(tempbuf, 4, ENET_PACKET_FLAG_RELIABLE));
             }
-            if ((g_gametypeFlags[ud.m_coop] & GAMETYPE_PLAYERSFRIENDLY) && !(g_gametypeFlags[ud.m_coop] & GAMETYPE_TDM))
-                ud.m_noexits = 0;
+            if ((g_gametypeFlags[m_coop] & GAMETYPE_PLAYERSFRIENDLY) && !(g_gametypeFlags[m_coop] & GAMETYPE_TDM))
+                m_noexits = 0;
 
             M_OpenMenu(myconnectindex);
             Menu_Change(MENU_NETWAITVOTES);
@@ -216,7 +216,7 @@ static int osdcmd_map(osdcmdptr_t parm)
 
     osdcmd_cheatsinfo_stat.cheatnum = -1;
     ud.m_volume_number = 0;
-    ud.m_level_number = 7;
+    m_level_number = 7;
 
     ud.m_monsters_off = ud.monsters_off = 0;
 
@@ -227,7 +227,7 @@ static int osdcmd_map(osdcmdptr_t parm)
 
     if (g_player[myconnectindex].ps->gm & MODE_GAME)
     {
-        G_NewGame(ud.m_volume_number, ud.m_level_number, ud.m_player_skill);
+        G_NewGame(ud.m_volume_number, m_level_number, ud.m_player_skill);
         g_player[myconnectindex].ps->gm = MODE_RESTART;
     }
     else G_NewGame_EnterLevel();
diff --git a/source/rr/src/player.cpp b/source/rr/src/player.cpp
index 5a60bbdc0..6cd9c4fdc 100644
--- a/source/rr/src/player.cpp
+++ b/source/rr/src/player.cpp
@@ -5874,13 +5874,13 @@ void P_EndLevel(void)
     if (ud.from_bonus)
     {
         ud.level_number   = ud.from_bonus;
-        ud.m_level_number = ud.level_number;
+        m_level_number = ud.level_number;
         ud.from_bonus     = 0;
     }
     else
     {
         ud.level_number   = (++ud.level_number < MAXLEVELS) ? ud.level_number : 0;
-        ud.m_level_number = ud.level_number;
+        m_level_number = ud.level_number;
     }
 }
 
@@ -5909,7 +5909,7 @@ static int P_DoFist(DukePlayer_t *pPlayer)
             if ((unsigned)ud.secretlevel <= MAXLEVELS)
                 ud.level_number = ud.secretlevel - 1;
 
-            ud.m_level_number = ud.level_number;
+            m_level_number = ud.level_number;
         }
         else
             P_EndLevel();
@@ -6935,13 +6935,13 @@ check_enemy_sprite:
             if (!RR && ud.from_bonus)
             {
                 ud.level_number   = ud.from_bonus;
-                ud.m_level_number = ud.level_number;
+                m_level_number = ud.level_number;
                 ud.from_bonus     = 0;
             }
             else
             {
                 ud.level_number   = (++ud.level_number < MAXLEVELS) ? ud.level_number : 0;
-                ud.m_level_number = ud.level_number;
+                m_level_number = ud.level_number;
             }
             return;
         }
diff --git a/source/rr/src/premap.cpp b/source/rr/src/premap.cpp
index 3884b5c8b..558f132e7 100644
--- a/source/rr/src/premap.cpp
+++ b/source/rr/src/premap.cpp
@@ -1880,7 +1880,7 @@ void G_NewGame(int volumeNum, int levelNum, int skillNum)
 
     ready2send = 0;
 
-    if (ud.m_recstat != 2 && ud.last_level >= 0 &&
+    if (m_recstat != 2 && ud.last_level >= 0 &&
         (g_netServer || ud.multimode > 1) && (ud.coop&GAMETYPE_SCORESHEET))
     {
         if (!RRRA || g_mostConcurrentPlayers > 1 || g_netServer || numplayers > 1)
@@ -1952,7 +1952,7 @@ end_vol4a:
     for (bssize_t i=0; i<(MAXVOLUMES*MAXLEVELS); i++)
         G_FreeMapState(i);
 
-    if (ud.m_coop != 1)
+    if (m_coop != 1)
     {
         for (bssize_t weaponNum = 0; weaponNum < MAX_WEAPONS; weaponNum++)
         {
@@ -2304,13 +2304,13 @@ int G_EnterLevel(int gameMode)
     ud.respawn_items     = ud.m_respawn_items;
     ud.respawn_inventory = ud.m_respawn_inventory;
     ud.monsters_off      = ud.m_monsters_off;
-    ud.coop              = ud.m_coop;
-    ud.marker            = ud.m_marker;
-    ud.ffire             = ud.m_ffire;
-    ud.noexits           = ud.m_noexits;
+    ud.coop              = m_coop;
+    ud.marker            = m_marker;
+    ud.ffire             = m_ffire;
+    ud.noexits           = m_noexits;
 
     if ((gameMode & MODE_DEMO) != MODE_DEMO)
-        ud.recstat = ud.m_recstat;
+        ud.recstat = m_recstat;
     if ((gameMode & MODE_DEMO) == 0 && ud.recstat == 2)
         ud.recstat = 0;
 
@@ -2336,7 +2336,7 @@ int G_EnterLevel(int gameMode)
             levelNum &= MAXLEVELS-1;
             volumeNum = (volumeNum - levelNum) / MAXLEVELS;
 
-            ud.level_number = ud.m_level_number = levelNum;
+            ud.level_number = m_level_number = levelNum;
             ud.volume_number = ud.m_volume_number = volumeNum;
 
             boardfilename[0] = 0;
@@ -2388,7 +2388,7 @@ int G_EnterLevel(int gameMode)
         }
 
         G_LoadMapHack(levelName, "endgame.map");
-        G_SetupFilenameBasedMusic(levelName, "endgame.map", ud.m_level_number);
+        G_SetupFilenameBasedMusic(levelName, "endgame.map", m_level_number);
     }
     else if (!VOLUMEONE && Menu_HaveUserMap())
     {
@@ -2399,7 +2399,7 @@ int G_EnterLevel(int gameMode)
         }
 
         G_LoadMapHack(levelName, boardfilename);
-        G_SetupFilenameBasedMusic(levelName, boardfilename, ud.m_level_number);
+        G_SetupFilenameBasedMusic(levelName, boardfilename, m_level_number);
     }
     else if (engineLoadBoard(g_mapInfo[mii].filename, VOLUMEONE, &pPlayer->pos, &lbang, &pPlayer->cursectnum) < 0)
     {
diff --git a/source/rr/src/savegame.cpp b/source/rr/src/savegame.cpp
index 9d274b2ab..0021b377b 100644
--- a/source/rr/src/savegame.cpp
+++ b/source/rr/src/savegame.cpp
@@ -382,7 +382,7 @@ int32_t G_LoadPlayer(savebrief_t & sv)
 
     // non-"m_" fields will be loaded from svgm_udnetw
     ud.m_volume_number = h.volnum;
-    ud.m_level_number = h.levnum;
+    m_level_number = h.levnum;
     ud.m_player_skill = h.skill;
 
     // NOTE: Bmemcpy needed for SAVEGAME_MUSIC.
@@ -1620,17 +1620,17 @@ static void sv_postudload()
 {
 //    Bmemcpy(&boardfilename[0], &currentboardfilename[0], BMAX_PATH);  // DON'T do this in demos!
 #if 1
-    ud.m_level_number      = ud.level_number;
+    m_level_number      = ud.level_number;
     ud.m_volume_number     = ud.volume_number;
     ud.m_player_skill      = ud.player_skill;
     ud.m_respawn_monsters  = ud.respawn_monsters;
     ud.m_respawn_items     = ud.respawn_items;
     ud.m_respawn_inventory = ud.respawn_inventory;
     ud.m_monsters_off      = ud.monsters_off;
-    ud.m_coop              = ud.coop;
-    ud.m_marker            = ud.marker;
-    ud.m_ffire             = ud.ffire;
-    ud.m_noexits           = ud.noexits;
+    m_coop              = ud.coop;
+    m_marker            = ud.marker;
+    m_ffire             = ud.ffire;
+    m_noexits           = ud.noexits;
 #endif
 }
 //static int32_t lockclock_dummy;
diff --git a/source/rr/src/screens.cpp b/source/rr/src/screens.cpp
index 64a4884aa..ccaf81157 100644
--- a/source/rr/src/screens.cpp
+++ b/source/rr/src/screens.cpp
@@ -3083,7 +3083,7 @@ void G_BonusScreenRRRA(int32_t bonusonly)
     {
         g_RAendEpisode = 0;
         ud.m_volume_number = ud.volume_number = 1;
-        ud.m_level_number = ud.level_number = 0;
+        m_level_number = ud.level_number = 0;
         ud.eog = 0;
     }
     if (g_turdLevel)
diff --git a/source/rr/src/screentext.cpp b/source/rr/src/screentext.cpp
index 94525016b..a16907825 100644
--- a/source/rr/src/screentext.cpp
+++ b/source/rr/src/screentext.cpp
@@ -1135,7 +1135,7 @@ void P_DoQuote(int32_t q, DukePlayer_t *p)
 {
     int32_t cq = 0;
 
-    if (ud.fta_on == 0 || q < 0 || !(p->gm & MODE_GAME))
+    if (hud_messages == 0 || q < 0 || !(p->gm & MODE_GAME))
         return;
 
     if (q & MAXQUOTES)
diff --git a/source/rr/src/sector.cpp b/source/rr/src/sector.cpp
index 013e348cb..162b8268e 100644
--- a/source/rr/src/sector.cpp
+++ b/source/rr/src/sector.cpp
@@ -4297,7 +4297,7 @@ void P_CheckSectors(int playerNum)
                     if (ud.from_bonus)
                     {
                         ud.level_number = ud.from_bonus;
-                        ud.m_level_number = ud.level_number;
+                        m_level_number = ud.level_number;
                         ud.from_bonus = 0;
                     }
                     else
@@ -4305,7 +4305,7 @@ void P_CheckSectors(int playerNum)
                         if (RRRA && ud.level_number == 6 && ud.volume_number == 0)
                             g_RAendEpisode = 1;
                         ud.level_number = (++ud.level_number < MAXLEVELS) ? ud.level_number : 0;
-                        ud.m_level_number = ud.level_number;
+                        m_level_number = ud.level_number;
                     }
                     g_RAendLevel = 1;
                 }
diff --git a/source/sw/src/menus.cpp b/source/sw/src/menus.cpp
index fa3ba7491..36143261e 100644
--- a/source/sw/src/menus.cpp
+++ b/source/sw/src/menus.cpp
@@ -3765,8 +3765,8 @@ MNU_DoSlider(short dir, MenuItem_p item, SWBOOL draw)
         if (slidersettings[item->slider] != offset)
         {
             slidersettings[item->slider] = offset;
-            //MouseAnalogScale[item->slider - sldr_mousescalex] = offset<<13;
-            CONTROL_SetAnalogAxisScale(item->slider - sldr_mousescalex, offset<<13, controldevice_mouse);
+			if (item->slider == sldr_mousescalex) in_mousescalex = offset<<13;
+			else in_mousescaley = offset<13;
         }
 
         sprintf(tmp_text, "%.2f", (float)(slidersettings[item->slider]<<13) / 65535.f);
diff --git a/source/thirdparty/imgui/imgui_demo.cpp b/source/thirdparty/imgui/imgui_demo.cpp
index 3eedda458..0fb15e611 100644
--- a/source/thirdparty/imgui/imgui_demo.cpp
+++ b/source/thirdparty/imgui/imgui_demo.cpp
@@ -262,8 +262,8 @@ void ImGui::ShowDemoWindow(bool* p_open)
     if (no_close)           p_open = NULL; // Don't pass our bool* to Begin
 
     // We specify a default position/size in case there's no data in the .ini file. Typically this isn't required! We only do it to make the Demo applications a little more welcoming.
-    ImGui::SetNextWindowPos(ImVec2(650, 20), ImGuiCond_FirstUseEver);
-    ImGui::SetNextWindowSize(ImVec2(550, 680), ImGuiCond_FirstUseEver);
+    ImGui::SetNextWindowPos(ImVec2(650, 20), ImGuiCond_Always);
+    ImGui::SetNextWindowSize(ImVec2(550, 680), ImGuiCond_Always);
 
     // Main body of the Demo window starts here.
     if (!ImGui::Begin("Dear ImGui Demo", p_open, window_flags))