diff --git a/src/command.c b/src/command.c
index 961dbe97c441b9b3aaf0d2ee4a109259902145f3..89d09b3590b29fc7e6644915c3131ac5add34b8e 100644
--- a/src/command.c
+++ b/src/command.c
@@ -66,8 +66,8 @@ CV_PossibleValue_t CV_Natural[] = {{1, "MIN"}, {999999999, "MAX"}, {0, NULL}};
 CV_PossibleValue_t karthud_cons_t[] = {
 	{0, "Off"}, {1, "Default"}, {2, "SNES"}, {3, "MK64"},
 	{0, NULL}};
-CV_PossibleValue_t kartcc_cons_t[] = {
-	{50, "50cc"}, {100, "100cc"}, {150, "150cc"},
+CV_PossibleValue_t kartspeed_cons_t[] = {
+	{0, "Relaxed"}, {1, "Standard"}, {2, "Turbo"},
 	{0, NULL}};
 
 #define COM_BUF_SIZE 8192 // command buffer size
diff --git a/src/command.h b/src/command.h
index cd2ead99139b49de966f250bf6408a764589ceb7..513883d4e8b10701f784bdc9b91132fb0d57a06c 100644
--- a/src/command.h
+++ b/src/command.h
@@ -128,7 +128,7 @@ extern CV_PossibleValue_t CV_Natural[];
 
 // SRB2kart
 extern CV_PossibleValue_t karthud_cons_t[];
-extern CV_PossibleValue_t kartcc_cons_t[];
+extern CV_PossibleValue_t kartspeed_cons_t[];
 
 // register a variable for use at the console
 void CV_RegisterVar(consvar_t *variable);
diff --git a/src/d_clisrv.c b/src/d_clisrv.c
index 634c6b81453cad55bf9ea5315998dd58a62a75b9..dea769230de42d8f2f0cc12ff1963dd09c756e4c 100644
--- a/src/d_clisrv.c
+++ b/src/d_clisrv.c
@@ -2896,7 +2896,7 @@ static void Got_KickCmd(UINT8 **p, INT32 playernum)
 
 consvar_t cv_allownewplayer = {"allowjoin", "On", CV_NETVAR, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL	};
 consvar_t cv_joinnextround = {"joinnextround", "Off", CV_NETVAR, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; /// \todo not done
-static CV_PossibleValue_t maxplayers_cons_t[] = {{2, "MIN"}, {32, "MAX"}, {0, NULL}};
+static CV_PossibleValue_t maxplayers_cons_t[] = {{2, "MIN"}, {MAXPLAYERS, "MAX"}, {0, NULL}};
 consvar_t cv_maxplayers = {"maxplayers", "8", CV_SAVE, maxplayers_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 static CV_PossibleValue_t resynchattempts_cons_t[] = {{0, "MIN"}, {20, "MAX"}, {0, NULL}};
 consvar_t cv_resynchattempts = {"resynchattempts", "10", 0, resynchattempts_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL	};
diff --git a/src/d_netcmd.c b/src/d_netcmd.c
index 11c9acff7033e0cacce3c2370baa98d0b7eda9f7..ca63df6990c47932a576cf7d0e288d84215e73e2 100644
--- a/src/d_netcmd.c
+++ b/src/d_netcmd.c
@@ -229,7 +229,7 @@ consvar_t cv_allowteamchange = {"allowteamchange", "Yes", CV_NETVAR, CV_YesNo, N
 consvar_t cv_startinglives = {"startinglives", "3", CV_NETVAR|CV_CHEAT, startingliveslimit_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 
 static CV_PossibleValue_t respawntime_cons_t[] = {{0, "MIN"}, {30, "MAX"}, {0, NULL}};
-consvar_t cv_respawntime = {"respawndelay", "3", CV_NETVAR|CV_CHEAT, respawntime_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
+consvar_t cv_respawntime = {"respawndelay", "1", CV_NETVAR|CV_CHEAT, respawntime_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 
 consvar_t cv_competitionboxes = {"competitionboxes", "Random", CV_NETVAR|CV_CHEAT, competitionboxes_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 
@@ -343,10 +343,11 @@ consvar_t cv_lightning = 		{"lightning", 			"On", CV_NETVAR|CV_CHEAT, CV_OnOff,
 consvar_t cv_feather = 			{"feathers", 			"On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
 
 consvar_t cv_karthud = {"karthud", "Default", CV_SAVE|CV_CALL, karthud_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
-consvar_t cv_kartcheck = {"kartcheck", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
+consvar_t cv_kartminimap = {"kartminimap", "Yes", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
+consvar_t cv_kartcheck = {"kartcheck", "Yes", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
 static CV_PossibleValue_t kartstarsfx_cons_t[] = {{0, "Music"}, {1, "SMK"}, {0, NULL}};
 consvar_t cv_kartstarsfx = {"kartstarsfx", "SMK", CV_SAVE, kartstarsfx_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
-consvar_t cv_kartcc = {"kartcc", "100cc", CV_NETVAR, kartcc_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
+consvar_t cv_kartspeed = {"kartspeed", "Standard", CV_NETVAR, kartspeed_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 static CV_PossibleValue_t kartballoons_cons_t[] = {{1, "MIN"}, {12, "MAX"}, {0, NULL}};
 consvar_t cv_kartballoons = {"kartballoons", "3", CV_NETVAR, kartballoons_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 consvar_t cv_kartfrantic = {"kartfrantic", "Off", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
@@ -399,7 +400,7 @@ consvar_t cv_timelimit = {"timelimit", "0", CV_NETVAR|CV_CALL|CV_NOINIT, timelim
 static CV_PossibleValue_t numlaps_cons_t[] = {{0, "MIN"}, {50, "MAX"}, {0, NULL}};
 consvar_t cv_numlaps = {"numlaps", "3", CV_NETVAR|CV_CALL|CV_NOINIT, numlaps_cons_t,
 	NumLaps_OnChange, 0, NULL, NULL, 0, 0, NULL};
-consvar_t cv_usemapnumlaps = {"usemaplaps", "Yes", CV_NETVAR, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
+consvar_t cv_usemapnumlaps = {"usemaplaps", "Yes", CV_NETVAR|CV_CHEAT, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
 
 // log elemental hazards -- not a netvar, is local to current player
 consvar_t cv_hazardlog = {"hazardlog", "Yes", 0, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
diff --git a/src/d_netcmd.h b/src/d_netcmd.h
index 1ffe4e214084427eb74e2d80b1913231ecc114b3..66a1d982dc5544b0aed5776c4a67275d71584eaa 100644
--- a/src/d_netcmd.h
+++ b/src/d_netcmd.h
@@ -116,9 +116,10 @@ extern consvar_t cv_blueshell, cv_jaws, cv_fireflower, cv_tripleredshell, cv_lig
 extern consvar_t cv_feather;
 
 extern consvar_t cv_karthud;
+extern consvar_t cv_kartminimap;
 extern consvar_t cv_kartcheck;
 extern consvar_t cv_kartstarsfx;
-extern consvar_t cv_kartcc;
+extern consvar_t cv_kartspeed;
 extern consvar_t cv_kartballoons;
 extern consvar_t cv_kartfrantic;
 extern consvar_t cv_kartcomeback;
diff --git a/src/dehacked.c b/src/dehacked.c
index 93308fda822901d4eec3fc949f5a3367b8ae437c..7d54ce0070fecdfcec0563b3c64506e0d3122da5 100644
--- a/src/dehacked.c
+++ b/src/dehacked.c
@@ -2477,15 +2477,16 @@ static void readcondition(UINT8 set, UINT32 id, char *word2)
 		return;
 	}
 
-	if (fastcmp(params[0], "PLAYTIME"))
+	if				(fastcmp(params[0], "PLAYTIME")
+	|| (++offset && fastcmp(params[0], "MATCHESPLAYED")))
 	{
 		PARAMCHECK(1);
-		ty = UC_PLAYTIME;
+		ty = UC_PLAYTIME + offset;
 		re = atoi(params[1]);
 	}
-	else if        (fastcmp(params[0], "GAMECLEAR")
-	|| (++offset && fastcmp(params[0], "ALLEMERALDS"))
-	|| (++offset && fastcmp(params[0], "ULTIMATECLEAR")))
+	else if ((offset=0) || fastcmp(params[0], "GAMECLEAR")
+	||        (++offset && fastcmp(params[0], "ALLEMERALDS"))
+	||        (++offset && fastcmp(params[0], "ULTIMATECLEAR")))
 	{
 		ty = UC_GAMECLEAR + offset;
 		re = (params[1]) ? atoi(params[1]) : 1;
diff --git a/src/doomstat.h b/src/doomstat.h
index 0915e138205c78818507a308f53e56a9682d914c..25fa25a318ef822af30685b9e1cd9b4fac60a470 100644
--- a/src/doomstat.h
+++ b/src/doomstat.h
@@ -322,6 +322,7 @@ enum GameType
 // If you alter this list, update gametype_cons_t in m_menu.c
 
 extern tic_t totalplaytime;
+extern UINT32 matchesplayed;
 
 extern UINT8 stagefailed;
 
@@ -437,6 +438,12 @@ extern INT16 scramblecount; //for CTF team scramble
 
 extern INT32 cheats;
 
+// SRB2kart
+extern UINT8 gamespeed;
+extern boolean franticitems;
+extern boolean mirrormode;
+extern boolean comeback;
+
 extern tic_t hidetime;
 
 extern UINT32 timesBeaten; // # of times the game has been beaten.
diff --git a/src/g_game.c b/src/g_game.c
index a0a4032949fcf8eea90c74e17460c3c778abbdff..1b958cf28d1be694639e5c4420a3390d9355fa6e 100644
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -167,6 +167,7 @@ INT32 tokenbits; // Used for setting token bits
 INT32 sstimer; // Time allotted in the special stage
 
 tic_t totalplaytime;
+UINT32 matchesplayed; // SRB2Kart
 boolean gamedataloaded = false;
 
 // Time attack data for levels
@@ -238,6 +239,12 @@ INT16 scramblecount; //for CTF team scramble
 
 INT32 cheats; //for multiplayer cheat commands
 
+// SRB2Kart
+UINT8 gamespeed; // Game's current speed (or difficulty, or cc, or etc); 0-2 for relaxed, standard, & turbo
+boolean mirrormode; // Mirror Mode currently enabled?
+boolean franticitems; // Frantic items currently enabled?
+boolean comeback; // Battle Mode's karma comeback is on/off
+
 tic_t hidetime;
 
 // Grading
@@ -1271,7 +1278,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
 
 	axis = JoyAxis(AXISTURN, ssplayer);
 
-	if (cv_kartmirror.value)
+	if (mirrormode)
 	{
 		turnright ^= turnleft; // swap these using three XORs
 		turnleft ^= turnright;
@@ -1553,12 +1560,12 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
 	cmd->forwardmove = (SINT8)(cmd->forwardmove + forward);
 	cmd->sidemove = (SINT8)(cmd->sidemove + side);
 
-	if (cv_kartmirror.value)
+	if (mirrormode)
 		cmd->sidemove = -cmd->sidemove;
 
 	//{ SRB2kart - Drift support
 	axis = JoyAxis(AXISTURN, ssplayer);
-	if (cv_kartmirror.value)
+	if (mirrormode)
 		axis = -axis;
 
 	if (cmd->angleturn > 0) // Drifting to the left
@@ -3343,6 +3350,7 @@ void G_LoadGameData(void)
 	G_ClearRecords(); // main and nights records
 	M_ClearSecrets(); // emblems, unlocks, maps visited, etc
 	totalplaytime = 0; // total play time (separate from all)
+	matchesplayed = 0; // SRB2Kart: matches played & finished
 
 	if (M_CheckParm("-nodata"))
 		return; // Don't load.
@@ -3372,6 +3380,7 @@ void G_LoadGameData(void)
 	}
 
 	totalplaytime = READUINT32(save_p);
+	matchesplayed = READUINT32(save_p);
 
 	modded = READUINT8(save_p);
 
@@ -3514,6 +3523,7 @@ void G_SaveGameData(void)
 	WRITEUINT32(save_p, 0xFCAFE211);
 
 	WRITEUINT32(save_p, totalplaytime);
+	WRITEUINT32(save_p, matchesplayed);
 
 	btemp = (UINT8)(savemoddata || modifiedgame);
 	WRITEUINT8(save_p, btemp);
diff --git a/src/k_kart.c b/src/k_kart.c
index 4ceb8b72839dfb87e8767aecebe4d62c8d06d6ba..082f79ca658e4885f5e5a7567e3e3434e0763982 100644
--- a/src/k_kart.c
+++ b/src/k_kart.c
@@ -20,6 +20,13 @@
 #include "k_kart.h"
 #include "f_finale.h"
 
+// SOME IMPORTANT VARIABLES DEFINED IN DOOMDEF.H:
+// gamespeed is cc (0 for easy, 1 for normal, 2 for hard)
+// franticitems is Frantic Mode items, bool
+// mirrormode is Mirror Mode (duh), bool
+// comeback is Battle Mode's karma comeback, also bool
+
+
 //{ SRB2kart Color Code
 
 #define SKIN_RAMP_LENGTH 16
@@ -303,9 +310,10 @@ void K_RegisterKartStuff(void)
 	CV_RegisterVar(&cv_lightning);
 	CV_RegisterVar(&cv_feather);
 
+	CV_RegisterVar(&cv_kartminimap);
 	CV_RegisterVar(&cv_kartcheck);
 	CV_RegisterVar(&cv_kartstarsfx);
-	CV_RegisterVar(&cv_kartcc);
+	CV_RegisterVar(&cv_kartspeed);
 	CV_RegisterVar(&cv_kartballoons);
 	CV_RegisterVar(&cv_kartfrantic);
 	CV_RegisterVar(&cv_kartcomeback);
@@ -318,16 +326,6 @@ void K_RegisterKartStuff(void)
 
 //}
 
-UINT8 K_GetKartCC(void)
-{
-	if (gametype == GT_MATCH)
-		return 50;
-	else if (modeattacking)
-		return 150;
-	else
-		return cv_kartcc.value;
-}
-
 //{ SRB2kart Roulette Code - Position Based
 
 #define NUMKARTITEMS 	19
@@ -975,7 +973,7 @@ static INT32 K_KartGetItemOdds(INT32 pos, INT32 itemnum)
 	else
 		newodds = K_KartItemOddsDistance_Retro[itemnum-1][pos];
 
-	if ((cv_kartfrantic.value) && (itemnum == 1 || itemnum == 4 || itemnum == 5 || itemnum == 6
+	if (franticitems && (itemnum == 1 || itemnum == 4 || itemnum == 5 || itemnum == 6
 		|| itemnum == 7 || itemnum == 8 || itemnum == 12 || itemnum == 13 || itemnum == 14 || itemnum == 15
 		|| itemnum == 16 || itemnum == 17 || itemnum == 18))
 		newodds *= 2;
@@ -1059,7 +1057,7 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd)
 	}
 	else
 	{
-		if (cv_kartfrantic.value) // Frantic items
+		if (franticitems) // Frantic items
 		{
 			pdis = (13*pdis/12); // make the distances between everyone artifically higher...
 			//pdis += distvar; // and set everyone back another place!
@@ -1466,7 +1464,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
 
 	if (player->kartstuff[k_spinouttimer])
 		player->kartstuff[k_spinouttimer]--;
-	else if (!cv_kartcomeback.value)
+	else if (!comeback)
 		player->kartstuff[k_comebacktimer] = comebacktime;
 	else if (player->kartstuff[k_comebacktimer])
 	{
@@ -1701,12 +1699,12 @@ static fixed_t K_GetKartBoostPower(player_t *player, boolean speed)
 	{												// Mushroom
 		if (speed)
 		{
-			switch (K_GetKartCC())
+			switch (gamespeed)
 			{
-				case 50:
+				case 0:
 					boostvalue = max(boostvalue, 53740+768);
 					break;
-				case 150:
+				case 2:
 					boostvalue = max(boostvalue, 17294+768);
 					break;
 				default:
@@ -1731,12 +1729,12 @@ fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower)
 	UINT8 kartspeed = player->kartspeed;
 	fixed_t finalspeed;
 
-	switch (K_GetKartCC())
+	switch (gamespeed)
 	{
-		case 50:
+		case 0:
 			g_cc = 53248 + xspd; //  50cc =  81.25 + 4.69 =  85.94%
 			break;
-		case 150:
+		case 2:
 			g_cc = 77824 + xspd; // 150cc = 118.75 + 4.69 = 123.44%
 			break;
 		default:
@@ -1946,7 +1944,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju
 			if (source->player->kartstuff[k_balloon] <= 0)
 			{
 				source->player->kartstuff[k_comebackpoints] += 2;
-				if (netgame)
+				if (netgame && cv_hazardlog.value)
 					CONS_Printf(M_GetText("%s bombed %s!\n"), player_names[source->player-players], player_names[player-players]);
 				if (source->player->kartstuff[k_comebackpoints] >= 3)
 					K_StealBalloon(source->player, player, true);
@@ -2020,7 +2018,7 @@ void K_StealBalloon(player_t *player, player_t *victim, boolean force)
 	{
 		if (player->kartstuff[k_balloon] <= 0)
 			CONS_Printf(M_GetText("%s is back in the game!\n"), player_names[player-players]);
-		else
+		else if (cv_hazardlog.value)
 			CONS_Printf(M_GetText("%s stole a balloon from %s!\n"), player_names[player-players], player_names[victim-players]);
 	}
 
@@ -2294,12 +2292,12 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map
 		return NULL;
 
 	// Figure out projectile speed by CC
-	switch (K_GetKartCC())
+	switch (gamespeed)
 	{
-		case 50:
+		case 0:
 			PROJSPEED = 68*FRACUNIT; // Avg Speed is 34
 			break;
-		case 150:
+		case 2:
 			PROJSPEED = 96*FRACUNIT; // Avg Speed is 48
 			break;
 		default:
@@ -4879,7 +4877,7 @@ fixed_t K_FindCheckX(fixed_t px, fixed_t py, angle_t ang, fixed_t mx, fixed_t my
 	fixed_t range = RING_DIST/3;
 	angle_t diff;
 
-	range *= (K_GetKartCC()/50);
+	range *= gamespeed+1;
 
 	dist = abs(R_PointToDist2(px, py, mx, my));
 	if (dist > range)
@@ -4892,7 +4890,7 @@ fixed_t K_FindCheckX(fixed_t px, fixed_t py, angle_t ang, fixed_t mx, fixed_t my
 	else
 		x = (FixedMul(FINETANGENT(((diff+ANGLE_90)>>ANGLETOFINESHIFT) & 4095), 160<<FRACBITS) + (160<<FRACBITS))>>FRACBITS;
 
-	if (cv_kartmirror.value)
+	if (mirrormode)
 		x = 320-x;
 
 	if (splitscreen > 1)
@@ -5018,7 +5016,7 @@ static void K_drawKartMinimap(void)
 	if (splitscreen == 2)
 		splitflags = 0;
 
-	if (cv_kartmirror.value)
+	if (mirrormode)
 		V_DrawSmallScaledPatch(x+(AutomapPic->width/2), y, splitflags|V_FLIP, AutomapPic);
 	else
 		V_DrawSmallScaledPatch(x, y, splitflags, AutomapPic);
@@ -5074,7 +5072,7 @@ static void K_drawKartMinimap(void)
 			amxpos = amnumxpos + ((x + AutomapPic->width/4 - (iconprefix[players[i].skin]->width/4))<<FRACBITS);
 			amypos = amnumypos + ((y + AutomapPic->height/4 - (iconprefix[players[i].skin]->height/4))<<FRACBITS);
 
-			if (cv_kartmirror.value)
+			if (mirrormode)
 			{
 				amxpos = -amnumxpos + ((x + AutomapPic->width/4 + (iconprefix[players[i].skin]->width/4))<<FRACBITS);
 				if (!players[i].skincolor) // 'default' color
@@ -5140,7 +5138,7 @@ static void K_drawBattleFullscreen(void)
 		else if (splitscreen < 2)
 			V_DrawFixedPatch(x<<FRACBITS, y<<FRACBITS, scale, 0, kp_battlelose, NULL);
 	}
-	else if (stplyr->kartstuff[k_balloon] <= 0 && stplyr->kartstuff[k_comebacktimer] && cv_kartcomeback.value)
+	else if (stplyr->kartstuff[k_balloon] <= 0 && stplyr->kartstuff[k_comebacktimer] && comeback)
 	{
 		INT32 t = stplyr->kartstuff[k_comebacktimer]/TICRATE;
 		INT32 txoff = 0;
@@ -5213,7 +5211,7 @@ static void K_drawStartLakitu(void)
 	else
 		adjustY = 200;
 
-	if (cv_kartmirror.value)
+	if (mirrormode)
 		V_DrawSmallScaledPatch(320-LAKI_X, LAKI_Y + adjustY, V_SNAPTOTOP|V_FLIP, localpatch);
 	else
 		V_DrawSmallScaledPatch(LAKI_X, LAKI_Y + adjustY, V_SNAPTOTOP, localpatch);
@@ -5286,7 +5284,7 @@ static void K_drawLapLakitu(void)
 			adjustY = 200;
 	}
 
-	if (cv_kartmirror.value)
+	if (mirrormode)
 		V_DrawSmallScaledPatch(320-(LAKI_X+14+(swoopTimer/4)), LAKI_Y + adjustY, V_SNAPTOTOP|V_FLIP, localpatch);
 	else
 		V_DrawSmallScaledPatch(LAKI_X+14+(swoopTimer/4), LAKI_Y + adjustY, V_SNAPTOTOP, localpatch);
@@ -5303,7 +5301,7 @@ void K_drawKartHUD(void)
 		&& (stplyr->exiting
 		|| (stplyr->kartstuff[k_balloon] <= 0
 		&& stplyr->kartstuff[k_comebacktimer]
-		&& cv_kartcomeback.value
+		&& comeback
 		&& stplyr->playerstate == PST_LIVE)))
 	{
 		K_drawBattleFullscreen();
@@ -5326,7 +5324,7 @@ void K_drawKartHUD(void)
 			K_drawKartPlayerCheck();
 	}
 
-	if (splitscreen == 0 || splitscreen == 2)
+	if ((splitscreen == 0 || splitscreen == 2) && cv_kartminimap.value)
 		K_drawKartMinimap();
 
 	// If the item window is closing, draw it closing!
diff --git a/src/k_kart.h b/src/k_kart.h
index 163d842439cb1ac9dfe3f14e03731dadeda5be77..9a6c62bb9f34c056bb43d35aa81c4cad5d648ba8 100644
--- a/src/k_kart.h
+++ b/src/k_kart.h
@@ -17,7 +17,6 @@ UINT8 K_GetKartColorByName(const char *name);
 
 void K_RegisterKartStuff(void);
 
-UINT8 K_GetKartCC(void);
 void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid);
 void K_LakituChecker(player_t *player);
 void K_KartMoveAnimation(player_t *player);
diff --git a/src/lua_baselib.c b/src/lua_baselib.c
index 1435f2240439bd568e50d0ae1b42b9c4f284eeb1..67fc7ac265c2790a81b3c0d5c9b6d3513c1dea56 100644
--- a/src/lua_baselib.c
+++ b/src/lua_baselib.c
@@ -1993,13 +1993,6 @@ static int lib_kGetKartColorByName(lua_State *L)
 	return 1;
 }
 
-static int lib_kGetKartCC(lua_State *L)
-{
-	//HUDSAFE
-	lua_pushinteger(L, K_GetKartCC());
-	return 1;
-}
-
 static int lib_kKartBouncing(lua_State *L)
 {
 	mobj_t *mobj1 = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ));
@@ -2336,7 +2329,6 @@ static luaL_Reg lib[] = {
 
 	// k_kart
 	{"K_GetKartColorByName",lib_kGetKartColorByName},
-	{"K_GetKartCC",lib_kGetKartCC},
 	{"K_KartBouncing",lib_kKartBouncing},
 	{"K_SpinPlayer",lib_kSpinPlayer},
 	{"K_SquishPlayer",lib_kSquishPlayer},
diff --git a/src/m_cond.c b/src/m_cond.c
index c67930d93acf4cc596d76751e748da536b080f86..d936c3fe77bdde60e42ebc31f5a0fa274fe60d27 100644
--- a/src/m_cond.c
+++ b/src/m_cond.c
@@ -32,532 +32,9 @@ conditionset_t conditionSets[MAXCONDITIONSETS];
 // Default Emblem locations
 emblem_t emblemlocations[MAXEMBLEMS] =
 {
-	// GREEN FLOWER 1
-	// ---
-	{0,  8156,  6936,   129, 1, 'A', SKINCOLOR_BLUE, 0,
-		"Go get your feet wet\n"
-		"to find this, the first emblem.\n"
-		"Yes, it's very deep.", 0},
-	{0,  3184,  1812,   928, 1, 'B', SKINCOLOR_LAVENDER, 0,
-		"There are many rings,\n"
-		"but this one's not what you think.\n"
-		"There lies the emblem.", 0},
-	{0,  9024,  6716,   769, 1, 'C', SKINCOLOR_RED, 0,
-		"Right next to a lake,\n"
-		"a ledge has been constructed.\n"
-		"Near there is the goal.", 0},
-	{0,  2080,  -384,   512, 1, 'D', SKINCOLOR_ORANGE, 0,
-		"Streams come to an end\n"
-		"where they can no longer fall.\n"
-		"But if you went up...", 0},
-	{0,  -336,  2064,   195, 1, 'E', SKINCOLOR_NEONGREEN, 0,
-		"This one's in plain sight.\n"
-		"Why haven't you claimed it?\n"
-		"Surely you saw it.", 0},
-
-	{ET_SCORE, 0,0,0,  1, 'S', SKINCOLOR_BROWN,      125000, "", 0},
-	{ET_TIME,  0,0,0,  1, 'T', SKINCOLOR_GREY,   20*TICRATE, "", 0},
-	{ET_RINGS, 0,0,0,  1, 'R', SKINCOLOR_GOLD,          200, "", 0},
-
-
-	// GREEN FLOWER 2
-	// ---
-	{0,  2624, -6816,  1332, 2, 'A', SKINCOLOR_BLUE, 0,
-		"Near the giant lake\n"
-		"lies a cave with a 1-Up.\n"
-		"An emblem's there, too!", 0},
-	{0, -5728, -2848,  2848, 2, 'B', SKINCOLOR_LAVENDER, 0,
-		"Near the final lake,\n"
-		"a higher lake falls on in.\n"
-		"Three platforms await.", 0},
-	{0,  3648,  6464,  2576, 2, 'C', SKINCOLOR_RED, 0,
-		"Near the level's start,\n"
-		"a bridge crosses a river.\n"
-		"What's that river's source?", 0},
-	{0, -2032,-10048,   986, 2, 'D', SKINCOLOR_ORANGE, 0,
-		"Near the level's end,\n"
-		"another bridge spans a lake.\n"
-		"What could be under...?", 0},
-	{0,  -170,   491,  3821, 2, 'E', SKINCOLOR_NEONGREEN, 0,
-		"An ivied tunnel\n"
-		"has a corner that's sunlit.\n"
-		"Go reach for the sky!", 0},
-
-	{ET_SCORE, 0,0,0,  2, 'S', SKINCOLOR_BROWN,      150000, "", 0},
-	{ET_TIME,  0,0,0,  2, 'T', SKINCOLOR_GREY,   40*TICRATE, "", 0},
-	{ET_RINGS, 0,0,0,  2, 'R', SKINCOLOR_GOLD,          200, "", 0},
-
-
-	// GREEN FLOWER 3
-	// ---
-	{ET_TIME,  0,0,0,  3, 'T', SKINCOLOR_GREY,   30*TICRATE, "", 0},
-
-
-	// TECHNO HILL 1
-	// ---
-	{0, -5664, -5072,  2396, 4, 'A', SKINCOLOR_BLUE, 0,
-		"Three pipes reside near\n"
-		"where our heroes' paths split off.\n"
-		"You'll have to look up!", 0},
-	{0,  -784,-13968,  2888, 4, 'B', SKINCOLOR_LAVENDER, 0,
-		"Climbing yields great range.\n"
-		"Yet, on a path for climbers,\n"
-		"flying is the key.", 0},
-	{0,  4160, -5824,  3776, 4, 'C', SKINCOLOR_RED, 0,
-		"That's sure lots of slime.\n"
-		"Say, do you ever wonder\n"
-		"what's dumping it all?", 0},
-	{0,  6400, -8352,  1764, 4, 'D', SKINCOLOR_ORANGE, 0,
-		"Spinning through small gaps\n"
-		"can slip you into a cave.\n"
-		"In that cave's first stretch...", 0},
-	{0,  2848, -9088,   488, 4, 'E', SKINCOLOR_NEONGREEN, 0,
-		"The slime lake is deep,\n"
-		"but reaching the floor takes height.\n"
-		"Scream \"Geronimo!\"...", 0},
-
-	{ET_SCORE, 0,0,0,  4, 'S', SKINCOLOR_BROWN,       75000, "", 0},
-	{ET_TIME,  0,0,0,  4, 'T', SKINCOLOR_GREY,   75*TICRATE, "", 0},
-	{ET_RINGS, 0,0,0,  4, 'R', SKINCOLOR_GOLD,          300, "", 0},
-
-
-	// TECHNO HILL 2
-	// ---
-	{0,-19138, -2692,   688, 5, 'A', SKINCOLOR_BLUE, 0,
-		"Near the first checkpoint,\n"
-		"a bridge crosses a slime pool.\n"
-		"(Sensing a pattern?)", 0},
-	{0,-13120,  8062,  1248, 5, 'B', SKINCOLOR_LAVENDER, 0,
-		"Behind the windows,\n"
-		"near crushers, ever smashing\n"
-		"a conveyor belt.", 0},
-	{0,   580,  4552,  1344, 5, 'C', SKINCOLOR_RED, 0,
-		"A pipe drops onto\n"
-		"a half-outdoors conveyor.\n"
-		"But is it empty?", 0},
-	{0,   192, -8768,    24, 5, 'D', SKINCOLOR_ORANGE, 0,
-		"There is a hallway\n"
-		"that a button floods with slime.\n"
-		"Go through it again!", 0},
-	{0, -2468,-12128,  1312, 5, 'E', SKINCOLOR_NEONGREEN, 0,
-		"Jumping on turtles\n"
-		"will send you springing skyward.\n"
-		"Now, do that six times...", 0},
-
-	{ET_SCORE, 0,0,0,  5, 'S', SKINCOLOR_BROWN,      100000, "", 0},
-	{ET_TIME,  0,0,0,  5, 'T', SKINCOLOR_GREY,  120*TICRATE, "", 0},
-	{ET_RINGS, 0,0,0,  5, 'R', SKINCOLOR_GOLD,          600, "", 0},
-
-
-	// TECHNO HILL 3
-	// ---
-	{ET_TIME,  0,0,0,  6, 'T', SKINCOLOR_GREY,   40*TICRATE, "", 0},
-
-
-	// DEEP SEA 1
-	// ---
-	{0,-16224, -2880,  3530, 7, 'A', SKINCOLOR_BLUE, 0,
-		"Climb up two maze walls.\n"
-		"Break the roof, then a corner.\n"
-		"There, glide, but stay dry.", 0},
-	{0, -8224,   896,  1056, 7, 'B', SKINCOLOR_LAVENDER, 0,
-		"Follow the left path.\n"
-		"A square green button lurks deep.\n"
-		"Weight it down, somehow.", 0},
-	{0,  4992, -5072,  4136, 7, 'C', SKINCOLOR_RED, 0,
-		"A certain path holds\n"
-		"many gargoyle puzzles.\n"
-		"Victors reach a \"V\".", 0},
-	{0,  4576,  5168,  2660, 7, 'D', SKINCOLOR_ORANGE, 0,
-		"A caved-in hallway?\n"
-		"The floor falls; the path goes down.\n"
-		"But those rocks looked weak...", 0},
-	{0, 12576, 16096,  -992, 7, 'E', SKINCOLOR_NEONGREEN, 0,
-		"The end is quite dry.\n"
-		"Some rocks dam the water in.\n"
-		"Knuckles can fix that...", 0},
-
-	{ET_SCORE, 0,0,0,  7, 'S', SKINCOLOR_BROWN,       75000, "", 0},
-	{ET_TIME,  0,0,0,  7, 'T', SKINCOLOR_GREY,  120*TICRATE, "", 0},
-	{ET_RINGS, 0,0,0,  7, 'R', SKINCOLOR_GOLD,          400, "", 0},
-
-
-	// DEEP SEA 2
-	// ---
-	{0,-15040,  6976,  2016, 8, 'A', SKINCOLOR_BLUE, 0,
-		"A waterfall lands\n"
-		"near a starpost in a cave.\n"
-		"It's dark up there, but...", 0},
-	{0,  4288,  2912,   544, 8, 'B', SKINCOLOR_LAVENDER, 0,
-		"So many blocks here!\n"
-		"Take five; bathe in the fountain.\n"
-		"Hmmm? A hidden path...?", 0},
-	{0, -5696, 16992,   791, 8, 'C', SKINCOLOR_RED, 0,
-		"An ornate dragon\n"
-		"faces a secret passage.\n"
-		"Knuckles! Don't get crushed!", 0},
-	{0,-13344, 18688,  1034, 8, 'D', SKINCOLOR_ORANGE, 0,
-		"In the current maze\n"
-		"hides a dark room of columns.\n"
-		"Find it, then look up.", 0},
-	{0,  3104, 16192,  2408, 8, 'E', SKINCOLOR_NEONGREEN,  0,
-		"That same dragon's eye\n"
-		"hides another secret room.\n"
-		"There, solve its riddle.", 0},
-
-	{ET_SCORE, 0,0,0,  8, 'S', SKINCOLOR_BROWN,       50000, "", 0},
-	{ET_TIME,  0,0,0,  8, 'T', SKINCOLOR_GREY,  150*TICRATE, "", 0},
-	{ET_RINGS, 0,0,0,  8, 'R', SKINCOLOR_GOLD,          250, "", 0},
-
-
-	// DEEP SEA 3
-	// ---
-	{ET_TIME,  0,0,0,  9, 'T', SKINCOLOR_GREY,   90*TICRATE, "", 0},
-
-
-	// CASTLE EGGMAN 1
-	// ---
-	{0, -6176, -5184,  -128, 10, 'A', SKINCOLOR_BLUE, 0,
-		"A drain feeds the lake.\n"
-		"Water rushes quickly through.\n"
-		"Go against the flow.", 0},
-	{0,  3648,-15296,  -992, 10, 'B', SKINCOLOR_LAVENDER, 0,
-		"The left starting path\n"
-		"goes atop a large wood deck.\n"
-		"Checked underneath yet?", 0},
-	{0, 11712, 21312,  5472, 10, 'C', SKINCOLOR_RED, 0,
-		"At last, the castle!\n"
-		"Hold up! Don't just barge right in!\n"
-		"What's the facade hold...?", 0},
-	{0, 20224, 13344,  3104, 10, 'D', SKINCOLOR_ORANGE, 0,
-		"The final approach!\n"
-		"A tower holds the emblem\n"
-		"near a ring arrow.", 0},
-	{0,  9472, -5890,   710, 10, 'E', SKINCOLOR_NEONGREEN, 0,
-		"The right starting path\n"
-		"hides this near a canopy,\n"
-		"high, where two trees meet.", 0},
-
-	{ET_SCORE, 0,0,0, 10, 'S', SKINCOLOR_BROWN,       50000, "", 0},
-	{ET_TIME,  0,0,0, 10, 'T', SKINCOLOR_GREY,  120*TICRATE, "", 0},
-	{ET_RINGS, 0,0,0, 10, 'R', SKINCOLOR_GOLD,          200, "", 0},
-
-
-	// CASTLE EGGMAN 2
-	// ---
-	{0,   832,-15168,  7808, 11, 'A', SKINCOLOR_BLUE, 0,
-		"Find a trick bookcase\n"
-		"that hides a darkened hallway.\n"
-		"There, climb a tower.", 0},
-	{0,-18460,-22180,  2416, 11, 'B', SKINCOLOR_LAVENDER, 0,
-		"Down in the dungeon,\n"
-		"a cracked wall hides secret paths.\n"
-		"Echidnas only!", 0},
-	{0, -6144,-11792,  3232, 11, 'C', SKINCOLOR_RED, 0,
-		"A room you can flood!\n"
-		"A brown grate's near its exit.\n"
-		"Knuckles can break it...", 0},
-	{0,  4608, -7024,  4256, 11, 'D', SKINCOLOR_ORANGE, 0,
-		"Some of these bookshelves\n"
-		"are not flush against the walls.\n"
-		"Wonder why that is?", 0},
-	{0, 12708,-13536,  4768, 11, 'E', SKINCOLOR_NEONGREEN, 0,
-		"The ending's towers\n"
-		"are hiding a small alcove.\n"
-		"Check around outside.", 0},
-
-	{ET_SCORE, 0,0,0, 11, 'S', SKINCOLOR_BROWN,      400000, "", 0},
-	{ET_TIME,  0,0,0, 11, 'T', SKINCOLOR_GREY,  210*TICRATE, "", 0},
-	{ET_RINGS, 0,0,0, 11, 'R', SKINCOLOR_GOLD,          600, "", 0},
-
-
-	// CASTLE EGGMAN 3
-	// ---
-	{ET_TIME,  0,0,0, 12, 'T', SKINCOLOR_GREY,  120*TICRATE, "", 0},
-
-
-	// ARID CANYON 1
-	// ---
-	{0,  3488,  2208,  3072, 13, 'A', SKINCOLOR_BLUE, 0,
-		"A rather large gap\n"
-		"must be crossed by way of tram.\n"
-		"At its end, jump left.", 0},
-	{0, -7552, 10464,  4094, 13, 'B', SKINCOLOR_LAVENDER, 0,
-		"Crushers that go up!\n"
-		"Mind your step; if they're triggered,\n"
-		"they'll block this emblem.", 0},
-	{0,-12093, 14575,  5752, 13, 'C', SKINCOLOR_RED, 0,
-		"There's an oil lake\n"
-		"that you can sink deep into.\n"
-		"Drain it, and explore.", 0},
-	{0,   512, -7136,  4640, 13, 'D', SKINCOLOR_ORANGE, 0,
-		"Not far from the start,\n"
-		"if you climb toward the sky,\n"
-		"the cliffs hide something.", 0},
-	{0, 12504,  6848,  3424, 13, 'E', SKINCOLOR_NEONGREEN, 0,
-		"Right by the exit,\n"
-		"an emblem lies on a cliff.\n"
-		"Ride ropes to reach it.", 0},
-
-	{ET_SCORE, 0,0,0, 13, 'S', SKINCOLOR_BROWN,       50000, "", 0},
-	{ET_TIME,  0,0,0, 13, 'T', SKINCOLOR_GREY,  120*TICRATE, "", 0},
-	{ET_RINGS, 0,0,0, 13, 'R', SKINCOLOR_GOLD,          300, "", 0},
-
-
-	// RED VOLCANO 1
-	// ---
-	{0,-13184, 11424,  3080, 16, 'A', SKINCOLOR_BLUE, 0,
-		"Look around the room,\n"
-		"just before you clear the stage;\n"
-		"something's hidden there!", 0},
-	{0, -2816,  3120,  3044, 16, 'B', SKINCOLOR_LAVENDER, 0,
-		"Ever look upwards\n"
-		"when you're traversing across\n"
-		"collapsing platforms?", 0},
-	{0,  6720,  6784,  1452, 16, 'C', SKINCOLOR_RED, 0,
-		"Check out a corner\n"
-		"of a lake of magma near\n"
-		"spinning jets of flame.", 0},
-	{0, -5504,  9824,   800, 16, 'D', SKINCOLOR_ORANGE, 0,
-		"Where once a bridge stood,\n"
-		"now magma falls from above.\n"
-		"The bridge dropped something...", 0},
-	{0,  8287,-11043,  1328, 16, 'E', SKINCOLOR_NEONGREEN, 0,
-		"A lake of magma\n"
-		"ebbs and flows unendingly.\n"
-		"Wait for its nadir.", 0},
-
-	{ET_SCORE, 0,0,0, 16, 'S', SKINCOLOR_BROWN,       30000, "", 0},
-	{ET_TIME,  0,0,0, 16, 'T', SKINCOLOR_GREY,  120*TICRATE, "", 0},
-	{ET_RINGS, 0,0,0, 16, 'R', SKINCOLOR_GOLD,          100, "", 0},
-
-
-	// EGG ROCK 1
-	// ---
-	{0,-10976, -7328,  1584, 22, 'A', SKINCOLOR_BLUE, 0,
-		"Vanishing platforms,\n"
-		"then collapsing ones herald\n"
-		"a last-second jump.", 0},
-	{0, -6592,-11200,  2208, 22, 'B', SKINCOLOR_LAVENDER, 0,
-		"What is this red stuff?\n"
-		"You can't breathe it in, but look!\n"
-		"It can't reach up there...", 0},
-	{0,  6816,   832,   936, 22, 'C', SKINCOLOR_RED, 0,
-		"The team's paths diverge.\n"
-		"Should Tails run the crusher path?\n"
-		"No! Fly outside it!", 0},
-	{0,  6942, -8902,  2080, 22, 'D', SKINCOLOR_ORANGE, 0,
-		"Don't jump too high here!\n"
-		"No conveyor will catch you;\n"
-		"you'd fall to your death.", 0},
-	{0, -6432, -6192,   584, 22, 'E', SKINCOLOR_NEONGREEN, 0,
-		"Conveyors! Magma!\n"
-		"What an intense room this is!\n"
-		"But, what brought you here?", 0},
-
-	{ET_SCORE, 0,0,0, 22, 'S', SKINCOLOR_BROWN,       25000, "", 0},
-	{ET_TIME,  0,0,0, 22, 'T', SKINCOLOR_GREY,  120*TICRATE, "", 0},
-	{ET_RINGS, 0,0,0, 22, 'R', SKINCOLOR_GOLD,          150, "", 0},
-
-
-	// EGG ROCK 2
-	// ---
-	{0, -6672,  7792,   352, 23, 'A', SKINCOLOR_BLUE, 0,
-		"Walk on the ceiling;\n"
-		"resist the urge to flip back!\n"
-		"Find the cyan path...", 0},
-	{0,-12256, 15136,  -288, 23, 'B', SKINCOLOR_LAVENDER, 0,
-		"X marks the spot? Nope!\n"
-		"Try standing further away\n"
-		"when the timer flips.", 0},
-	{0,  1536, 16224,  1144, 23, 'C', SKINCOLOR_RED, 0,
-		"There is more than one\n"
-		"elevator inside the\n"
-		"elevator shaft...", 0},
-	{0,-15968, 14192,  3152, 23, 'D', SKINCOLOR_ORANGE, 0,
-		"Gears with missing teeth\n"
-		"can hide a clever secret!\n"
-		"Think Green Hill Zone boss.", 0},
-	{0,  1920, 20608,  1064, 23, 'E', SKINCOLOR_NEONGREEN, 0,
-		"Just before you reach\n"
-		"the defective cargo bay,\n"
-		"fly under a bridge.", 0},
-
-	{ET_SCORE, 0,0,0, 23, 'S', SKINCOLOR_BROWN,       60000, "", 0},
-	{ET_TIME,  0,0,0, 23, 'T', SKINCOLOR_GREY,  300*TICRATE, "", 0},
-	{ET_RINGS, 0,0,0, 23, 'R', SKINCOLOR_GOLD,          250, "", 0},
-
-
-	// EGG ROCK 3
-	// ---
-/* Just in case, I'll leave these here in the source.
-	{0,   848, -3584,   592, 24, 'A', SKINCOLOR_BLUE, 0,
-		"[PH] Hiding at the end of the first hallway.", 0},
-	{0,-10368, -2816,   144, 24, 'B', SKINCOLOR_LAVENDER, 0,
-		"Directions are meaningless.", 0},
-	{0, -8160, -5952,   560, 24, 'C', SKINCOLOR_RED, 0,
-		"[PH] In the ceiling of the conveyor belt + laser hallway.", 0},
-	{0,-13728,-13728,  1552, 24, 'D', SKINCOLOR_ORANGE, 0,
-		"[PH] On top of the platform with rows of spikes in reverse gravity.", 0},
-	{0,-14944,   768,  1232, 24, 'E', SKINCOLOR_NEONGREEN, 0,
-		"Follow the leader.", 0},
-*/
-
-	{ET_SCORE, 0,0,0, 24, 'S', SKINCOLOR_BROWN,       14000, "", 0},
-	{ET_TIME,  0,0,0, 24, 'T', SKINCOLOR_GREY,  210*TICRATE, "", 0},
-	{ET_RINGS, 0,0,0, 24, 'R', SKINCOLOR_GOLD,          100, "", 0},
-
-
-	// EGG ROCK CORE
-	// ---
-	{ET_TIME,  0,0,0, 25, 'T', SKINCOLOR_GREY,  100*TICRATE, "", 0},
-
-
-	// PIPE TOWERS
-	// ---
-	{0,  3182,  5040,  3008, 30, 'A', SKINCOLOR_BLUE, 0,
-		"A pipe in the roof\n"
-		"eternally drops water.\n"
-		"Something's stuck up there.", 0},
-	{0, -2400,  5984,  2752, 30, 'B', SKINCOLOR_LAVENDER, 0,
-		"Pushing a red switch\n"
-		"raises the water level;\n"
-		"from there, can't miss it.", 0},
-	{0,  6112,  7008,  4032, 30, 'C', SKINCOLOR_RED, 0,
-		"A high-up passage\n"
-		"hides near the second checkpoint.\n"
-		"Climb in; then, climb more.", 0},
-	{0, 11424, -4832,  1376, 30, 'D', SKINCOLOR_ORANGE, 0,
-		"The underground room\n"
-		"with platforms that fall and rise\n"
-		"only LOOKS empty...", 0},
-	{0 , 4960, -6112,  1312, 30, 'E', SKINCOLOR_NEONGREEN, 0,
-		"This one's straightforward.\n"
-		"What comes to mind when I say:\n"
-		"\"WELCOME TO WARP ZONE!\"?", 0},
-
-	{ET_SCORE, 0,0,0, 30, 'S', SKINCOLOR_BROWN,       75000, "", 0},
-	{ET_TIME,  0,0,0, 30, 'T', SKINCOLOR_GREY,  100*TICRATE, "", 0},
-	{ET_RINGS, 0,0,0, 30, 'R', SKINCOLOR_GOLD,          300, "", 0},
-
-
-	// AERIAL GARDEN
-	// ---
-	{0, 10176,-14304,  1796, 40, 'A', SKINCOLOR_BLUE, 0,
-		"A central tower,\n"
-		"one with many waterfalls,\n"
-		"hides a secret room.", 0},
-	{0,   480, 17696,  6496, 40, 'B', SKINCOLOR_LAVENDER, 0,
-		"Hidden off the path\n"
-		"lies a skyscraping tower.\n"
-		"A lake's at the top.", 0},
-	{0, -8896, 13248,  3362, 40, 'C', SKINCOLOR_RED, 0,
-		"Find all four buttons\n"
-		"that sink when you stand on them.\n"
-		"They'll open a door...", 0},
-	{0, -8896, -9952,  2480, 40, 'D', SKINCOLOR_ORANGE, 0,
-		"Much like the last one,\n"
-		"you need to find some switches.\n"
-		"Only two, this time.", 0},
-	{0, 13184, 18880,  6672, 40, 'E', SKINCOLOR_NEONGREEN, 0,
-		"The inner sanctum!\n"
-		"Teleport to its switches;\n"
-		"then, check near the goal.", 0},
-
-	{ET_SCORE, 0,0,0, 40, 'S', SKINCOLOR_BROWN,      300000, "", 0},
-	{ET_TIME,  0,0,0, 40, 'T', SKINCOLOR_GREY,  240*TICRATE, "", 0},
-	{ET_RINGS, 0,0,0, 40, 'R', SKINCOLOR_GOLD,         1200, "", 0},
-
-
-	// AZURE TEMPLE
-	// ---
-	{0, -2400,  7552,  1120, 41, 'A', SKINCOLOR_BLUE, 0,
-		"For those who can swim,\n"
-		"a long tunnel hides rewards.\n"
-		"Do mind the Buzzes!", 0},
-	{0,   -64, 14016,  2072, 41, 'B', SKINCOLOR_LAVENDER, 0,
-		"So many skylights!\n"
-		"A markedly large one hides\n"
-		"behind a starpost...", 0},
-	{0,  2976, 13920,   -32, 41, 'C', SKINCOLOR_RED, 0,
-		"When you reach gauntlets\n"
-		"of diagonal fire,\n"
-		"check out the corners.", 0},
-	{0,  2176, 22592,  1376, 41, 'D', SKINCOLOR_ORANGE, 0,
-		"A room of currents;\n"
-		"most of them are marked by spikes.\n"
-		"This one? A corner.", 0},
-	{0, -4128, 21344,  1120, 41, 'E', SKINCOLOR_NEONGREEN, 0,
-		"The only way to hit\n"
-		"all those gems at once is with\n"
-		"a radial blast.", 0},
-
-	{ET_SCORE, 0,0,0, 41, 'S', SKINCOLOR_BROWN,      425000, "", 0},
-	{ET_TIME,  0,0,0, 41, 'T', SKINCOLOR_GREY,  240*TICRATE, "", 0},
-	{ET_RINGS, 0,0,0, 41, 'R', SKINCOLOR_GOLD,          300, "", 0},
-
-
-	// FLORAL FIELD
-	// ---
-	{0, 5394, -996, 160, 50, 'N', SKINCOLOR_ROSEWOOD, 0, "", 0},
-	{ET_NGRADE, 0,0,0,   50, 'Q', SKINCOLOR_TEAL,     GRADE_A, "", 0},
-	{ET_NTIME,  0,0,0,   50, 'T', SKINCOLOR_GREY,  40*TICRATE, "", 0},
-
-
-	// TOXIC PLATEAU
-	// ---
-	{0, 780, -1664, 32, 51, 'N', SKINCOLOR_ROSEWOOD, 0, "", 0},
-	{ET_NGRADE, 0,0,0,  51, 'Q', SKINCOLOR_TEAL,     GRADE_A, "", 0},
-	{ET_NTIME,  0,0,0,  51, 'T', SKINCOLOR_GREY,  50*TICRATE, "", 0},
-
-
-	// FLOODED COVE
-	// ---
-	{0, 1824, -1888, 2448, 52, 'N', SKINCOLOR_ROSEWOOD, 0, "", 0},
-	{ET_NGRADE, 0,0,0,     52, 'Q', SKINCOLOR_TEAL,     GRADE_A, "", 0},
-	{ET_NTIME,  0,0,0,     52, 'T', SKINCOLOR_GREY,  90*TICRATE, "", 0},
-
-
-	// CAVERN FORTRESS
-	// ---
-	{0, -3089, -431, 1328, 53, 'N', SKINCOLOR_ROSEWOOD, 0, "", 0},
-	{ET_NGRADE, 0,0,0,     53, 'Q', SKINCOLOR_TEAL,     GRADE_A, "", 0},
-	{ET_NTIME,  0,0,0,     53, 'T', SKINCOLOR_GREY,  75*TICRATE, "", 0},
-
-
-	// DUSTY WASTELAND
-	// ---
-	{0, 957, 924, 2956, 54, 'N', SKINCOLOR_ROSEWOOD, 0, "", 0},
-	{ET_NGRADE, 0,0,0,  54, 'Q', SKINCOLOR_TEAL,     GRADE_A, "", 0},
-	{ET_NTIME,  0,0,0,  54, 'T', SKINCOLOR_GREY,  65*TICRATE, "", 0},
-
-
-	// MAGMA CAVES
-	// ---
-	{0, -2752, 3104, 1800, 55, 'N', SKINCOLOR_ROSEWOOD, 0, "", 0},
-	{ET_NGRADE, 0,0,0,     55, 'Q', SKINCOLOR_TEAL,     GRADE_A, "", 0},
-	{ET_NTIME,  0,0,0,     55, 'T', SKINCOLOR_GREY,  80*TICRATE, "", 0},
-
-
-	// EGG SATELLITE
-	// ---
-	{0, 5334, -609, 3426, 56, 'N', SKINCOLOR_ROSEWOOD, 0, "", 0},
-	{ET_NGRADE, 0,0,0,    56, 'Q', SKINCOLOR_TEAL,     GRADE_A, "", 0},
-	{ET_NTIME,  0,0,0,    56, 'T', SKINCOLOR_GREY, 120*TICRATE, "", 0},
-
-
-	// BLACK HOLE
-	// ---
-	{0, 2108, 3776, 32, 57, 'N', SKINCOLOR_ROSEWOOD, 0, "", 0},
-	{ET_NGRADE, 0,0,0,  57, 'Q', SKINCOLOR_TEAL,     GRADE_A, "", 0},
-	{ET_NTIME,  0,0,0,  57, 'T', SKINCOLOR_GREY, 150*TICRATE, "", 0},
-
-
-	// SPRING HILL
-	// ---
-	{0, -1840, -1024, 1644, 58, 'N', SKINCOLOR_ROSEWOOD, 0, "", 0},
-	{ET_NGRADE, 0,0,0,      58, 'Q', SKINCOLOR_TEAL,     GRADE_A, "", 0},
-	{ET_NTIME,  0,0,0,      58, 'T', SKINCOLOR_GREY,  60*TICRATE, "", 0},
+	// GREEN HILLS
+	// 1:30.00
+	{ET_TIME,  0,0,0,  1, 'T', SKINCOLOR_GREY,   90*TICRATE, "", 0},
 };
 
 // Default Extra Emblems
@@ -574,8 +51,8 @@ extraemblem_t extraemblems[MAXEXTRAEMBLEMS] =
 unlockable_t unlockables[MAXUNLOCKABLES] =
 {
 	// Name, Objective, Menu Height, ConditionSet, Unlock Type, Variable, NoCecho, NoChecklist
-	/* 01 */ {"Record Attack",     "Complete Greenflower Zone, Act 1", 0, -1, SECRET_RECORDATTACK,  0,  true,  true, 0},
-	/* 02 */ {"NiGHTS Mode",       "Complete Floral Field",            0, -1, SECRET_NIGHTSMODE,    0,  true,  true, 0},
+	/* 01 */ {"Record Attack",     "", 0, -1, SECRET_RECORDATTACK,  0,  true,  true, 0},
+	/* 02 */ {"NiGHTS Mode",       "", 0, -1, SECRET_NIGHTSMODE,    0,  true,  true, 0},
 
 	/* 03 */ {"Play Credits",      "Complete 1P Mode", 30, 10, SECRET_CREDITS,   0,  true,  true, 0},
 	/* 04 */ {"Sound Test",        "Complete 1P Mode", 40, 10, SECRET_SOUNDTEST, 0, false, false, 0},
@@ -602,7 +79,7 @@ unlockable_t unlockables[MAXUNLOCKABLES] =
 };
 
 // Default number of emblems and extra emblems
-INT32 numemblems = 155;
+INT32 numemblems = 1;
 INT32 numextraemblems = 5;
 
 // DEFAULT CONDITION SETS FOR SRB2 2.1:
@@ -739,6 +216,8 @@ static UINT8 M_CheckCondition(condition_t *cn)
 	{
 		case UC_PLAYTIME: // Requires total playing time >= x
 			return (totalplaytime >= (unsigned)cn->requirement);
+		case UC_MATCHESPLAYED: // Requires any level completed >= x times
+			return (matchesplayed >= (unsigned)cn->requirement);
 		case UC_GAMECLEAR: // Requires game beaten >= x times
 			return (timesBeaten >= (unsigned)cn->requirement);
 		case UC_ALLEMERALDS: // Requires game beaten with all 7 emeralds >= x times
diff --git a/src/m_cond.h b/src/m_cond.h
index e61ff1f795819c03a4ff59803e9fa836afb25088..1f2644c5565da0fd2a4fbdb8a1930fc09d159c2e 100644
--- a/src/m_cond.h
+++ b/src/m_cond.h
@@ -21,6 +21,7 @@
 typedef enum
 {
 	UC_PLAYTIME,        // PLAYTIME [tics]
+	UC_MATCHESPLAYED,   // MATCHESPLAYED [x played]
 	UC_GAMECLEAR,       // GAMECLEAR <x times>
 	UC_ALLEMERALDS,     // ALLEMERALDS <x times>
 	UC_ULTIMATECLEAR,   // ULTIMATECLEAR <x times>
diff --git a/src/m_menu.c b/src/m_menu.c
index 7260568925a7dd38c9eee1eb777d8f0a029543f8..4b9ac3545f7faa5630c81a24621e705e3d062702 100644
--- a/src/m_menu.c
+++ b/src/m_menu.c
@@ -238,9 +238,9 @@ menu_t SP_MainDef, MP_MainDef, OP_MainDef;
 menu_t MISC_ScrambleTeamDef, MISC_ChangeTeamDef;
 
 // Single Player
-static void M_LoadGame(INT32 choice);
+//static void M_LoadGame(INT32 choice);
 static void M_TimeAttack(INT32 choice);
-static void M_NightsAttack(INT32 choice);
+//static void M_NightsAttack(INT32 choice);
 static void M_Statistics(INT32 choice);
 static void M_HandleStaffReplay(INT32 choice);
 static void M_ReplayTimeAttack(INT32 choice);
@@ -342,7 +342,7 @@ static void M_DrawNightsAttackMenu(void);
 static void M_DrawSetupChoosePlayerMenu(void);
 static void M_DrawControl(void);
 static void M_DrawVideoMode(void);
-static void M_DrawMonitorToggles(void);
+//static void M_DrawMonitorToggles(void);
 #ifdef HWRENDER
 static void M_OGL_DrawFogMenu(void);
 static void M_OGL_DrawColorMenu(void);
@@ -477,7 +477,7 @@ static consvar_t cv_dummystaff = {"dummystaff", "0", CV_HIDEN|CV_CALL, dummystaf
 static menuitem_t MainMenu[] =
 {
 	{IT_CALL   |IT_STRING, NULL, "Secrets",     M_SecretsMenu,      84},
-	{IT_CALL   |IT_STRING, NULL, "1 Player",   M_SinglePlayerMenu, 92},
+	{IT_CALL   |IT_STRING, NULL, "1 Player",    M_SinglePlayerMenu, 92},
 	{IT_SUBMENU|IT_STRING, NULL, "Multiplayer", &MP_MainDef,       100},
 	{IT_CALL   |IT_STRING, NULL, "Options",     M_Options,         108},
 	{IT_CALL   |IT_STRING, NULL, "Quit  Game",  M_QuitSRB2,        116},
@@ -706,17 +706,17 @@ static menuitem_t SR_EmblemHintMenu[] =
 // Single Player Main
 static menuitem_t SP_MainMenu[] =
 {
-	{IT_CALL | IT_STRING,                       NULL, "Start Game",    M_LoadGame,        92},
+	//{IT_CALL | IT_STRING,                       NULL, "Start Game",    M_LoadGame,        92},
 	{IT_SECRET,                                 NULL, "Record Attack", M_TimeAttack,     100},
-	{IT_SECRET,                                 NULL, "NiGHTS Mode",   M_NightsAttack,   108},
-	{IT_CALL | IT_STRING | IT_CALL_NOTMODIFIED, NULL, "Statistics",    M_Statistics,     116},
+	//{IT_SECRET,                                 NULL, "NiGHTS Mode",   M_NightsAttack,   108},
+	{IT_CALL | IT_STRING | IT_CALL_NOTMODIFIED, NULL, "Statistics",    M_Statistics,     108},
 };
 
 enum
 {
-	sploadgame,
+	//sploadgame,
 	sprecordattack,
-	spnightsmode,
+	//spnightsmode,
 	spstatistics
 };
 
@@ -1413,24 +1413,29 @@ static menuitem_t OP_GameOptionsMenu[] =
 	{IT_STRING | IT_CVAR, NULL, "Show HUD",               &cv_showhud,     40},
 	{IT_STRING | IT_CVAR | IT_CV_SLIDER,
 	                      NULL, "HUD Visibility",         &cv_translucenthud, 50},
-	{IT_STRING | IT_CVAR, NULL, "Timer Display",          &cv_timetic,     60},
+
+	{IT_STRING | IT_CVAR, NULL, "Star SFX",                &cv_kartstarsfx,    62},
+	{IT_STRING | IT_CVAR, NULL, "Speedometer Display",     &cv_speedometer,    72},
+	{IT_STRING | IT_CVAR, NULL, "Show Minimap",            &cv_kartminimap,    82},
+	{IT_STRING | IT_CVAR, NULL, "Show \"CHECK\"",          &cv_kartcheck,      92},
+
 #ifdef SEENAMES
-	{IT_STRING | IT_CVAR, NULL, "HUD Player Names",       &cv_seenames,    80},
+	{IT_STRING | IT_CVAR, NULL, "HUD Player Names",       &cv_seenames,    104},
 #endif
-	{IT_STRING | IT_CVAR, NULL, "Log Hazard Damage",      &cv_hazardlog,   90},
+	{IT_STRING | IT_CVAR, NULL, "Log Hazard Damage",      &cv_hazardlog,   114},
 
-	{IT_STRING | IT_CVAR, NULL, "Console Back Color",     &cons_backcolor, 100},
-	{IT_STRING | IT_CVAR, NULL, "Console Text Size",      &cv_constextsize,110},
-	{IT_STRING | IT_CVAR, NULL, "Uppercase Console",      &cv_allcaps,     120},
+	{IT_STRING | IT_CVAR, NULL, "Console Back Color",     &cons_backcolor, 126},
+	{IT_STRING | IT_CVAR, NULL, "Console Text Size",      &cv_constextsize,136},
+	{IT_STRING | IT_CVAR, NULL, "Uppercase Console",      &cv_allcaps,     146},
 
-	{IT_STRING | IT_CVAR, NULL, "Title Screen Demos",     &cv_rollingdemos, 140},
+	{IT_STRING | IT_CVAR, NULL, "Title Screen Demos",     &cv_rollingdemos, 158},
 };
 
 static menuitem_t OP_ServerOptionsMenu[] =
 {
 	{IT_STRING | IT_SUBMENU, NULL, "General netgame options...",  &OP_NetgameOptionsDef,  10},
 	{IT_STRING | IT_SUBMENU, NULL, "Gametype options...",         &OP_GametypeOptionsDef, 20},
-	{IT_STRING | IT_SUBMENU, NULL, "Random Monitor Toggles...",   &OP_MonitorToggleDef,   30},
+	{IT_STRING | IT_SUBMENU, NULL, "Random item toggles...",      &OP_MonitorToggleDef,   30},
 
 #ifndef NONET
 	{IT_STRING | IT_CVAR | IT_CV_STRING,
@@ -1452,65 +1457,57 @@ static menuitem_t OP_NetgameOptionsMenu[] =
 {
 	{IT_STRING | IT_CVAR, NULL, "Time Limit",            &cv_timelimit,        10},
 	{IT_STRING | IT_CVAR, NULL, "Point Limit",           &cv_pointlimit,       18},
-	{IT_STRING | IT_CVAR, NULL, "Overtime Tie-Breaker",  &cv_overtime,         26},
 
-	{IT_STRING | IT_CVAR, NULL, "Special Ring Weapons",  &cv_specialrings,     42},
-	{IT_STRING | IT_CVAR, NULL, "Emeralds",              &cv_powerstones,      50},
-	{IT_STRING | IT_CVAR, NULL, "Item Boxes",            &cv_matchboxes,       58},
-	{IT_STRING | IT_CVAR, NULL, "Item Respawn",          &cv_itemrespawn,      66},
-	{IT_STRING | IT_CVAR, NULL, "Item Respawn time",     &cv_itemrespawntime,  74},
+	{IT_STRING | IT_CVAR, NULL, "Frantic Items",         &cv_kartfrantic,      34},
+
+	{IT_STRING | IT_CVAR, NULL, "Item Respawn",          &cv_itemrespawn,      50},
+	{IT_STRING | IT_CVAR, NULL, "Item Respawn time",     &cv_itemrespawntime,  58},
 
-	{IT_STRING | IT_CVAR, NULL, "Sudden Death",          &cv_suddendeath,      90},
-	{IT_STRING | IT_CVAR, NULL, "Player respawn delay",  &cv_respawntime,      98},
+	{IT_STRING | IT_CVAR, NULL, "Player respawn delay",  &cv_respawntime,      74},
 
-	{IT_STRING | IT_CVAR, NULL, "Force Skin #",          &cv_forceskin,          114},
-	{IT_STRING | IT_CVAR, NULL, "Restrict skin changes", &cv_restrictskinchange, 122},
+	{IT_STRING | IT_CVAR, NULL, "Force Skin #",          &cv_forceskin,          90},
+	{IT_STRING | IT_CVAR, NULL, "Restrict skin changes", &cv_restrictskinchange, 98},
 
-	{IT_STRING | IT_CVAR, NULL, "Autobalance Teams",            &cv_autobalance,      138},
-	{IT_STRING | IT_CVAR, NULL, "Scramble Teams on Map Change", &cv_scrambleonchange, 146},
+	//{IT_STRING | IT_CVAR, NULL, "Autobalance Teams",            &cv_autobalance,      114},
+	//{IT_STRING | IT_CVAR, NULL, "Scramble Teams on Map Change", &cv_scrambleonchange, 122},
 };
 
 static menuitem_t OP_GametypeOptionsMenu[] =
 {
-	// This is Kart, we don't need half this shit!
-/*	{IT_HEADER,           NULL, "CO-OP",                 NULL,                  2},
-	{IT_STRING | IT_CVAR, NULL, "Players for exit",      &cv_playersforexit,   10},
-	{IT_STRING | IT_CVAR, NULL, "Starting Lives",        &cv_startinglives,    18},
-
-	{IT_HEADER,           NULL, "COMPETITION",           NULL,                 34},
-	{IT_STRING | IT_CVAR, NULL, "Item Boxes",            &cv_competitionboxes, 42},
-	{IT_STRING | IT_CVAR, NULL, "Countdown Time",        &cv_countdowntime,    50},*/
-
-	{IT_HEADER,           NULL, "RACE",                  NULL,                  2},
-	{IT_STRING | IT_CVAR, NULL, "Number of Laps",        &cv_numlaps,          10},
-	{IT_STRING | IT_CVAR, NULL, "Use Map Lap Counts",    &cv_usemapnumlaps,    18},
-	{IT_STRING | IT_CVAR, NULL, "CC",    				 &cv_kartcc,    	   26},
+	{IT_HEADER,           NULL, "RACE",                  NULL,                 2},
+	{IT_STRING | IT_CVAR, NULL, "Game Speed",    		  &cv_kartspeed,    	10},
+	{IT_STRING | IT_CVAR, NULL, "Mirror Mode",    		  &cv_kartmirror,    	18},
+	{IT_STRING | IT_CVAR, NULL, "Number of Laps",        &cv_numlaps,          26},
+	{IT_STRING | IT_CVAR, NULL, "Use Map Lap Counts",    &cv_usemapnumlaps,    34},
 
-	{IT_HEADER,           NULL, "BATTLE",                 NULL,                50},
-/*	{IT_STRING | IT_CVAR, NULL, "Scoring Type",          &cv_match_scoring,   106},
-
-	{IT_HEADER,           NULL, "TAG",                   NULL,                122},
-	{IT_STRING | IT_CVAR, NULL, "Hide Time",             &cv_hidetime,        130},
-
-	{IT_HEADER,           NULL, "CTF",                   NULL,                146},
-	{IT_STRING | IT_CVAR, NULL, "Flag Respawn Time",     &cv_flagtime,        154},*/
+	{IT_HEADER,           NULL, "BATTLE",                NULL,                 50},
+	{IT_STRING | IT_CVAR, NULL, "Starting Balloons",     &cv_kartballoons,     58},
+	{IT_STRING | IT_CVAR, NULL, "Karma Comeback",        &cv_kartcomeback,     66},
 };
 
 static menuitem_t OP_MonitorToggleMenu[] =
 {
 	// Printing handled by drawing function
-	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Recycler",          &cv_recycler,      20},
-	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Teleporters",       &cv_teleporters,   30},
-	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Super Ring",        &cv_superring,     40},
-	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Super Sneakers",    &cv_supersneakers, 50},
-	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Invincibility",     &cv_invincibility, 60},
-	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Jump Shield",       &cv_jumpshield,    70},
-	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Elemental Shield",  &cv_watershield,   80},
-	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Attraction Shield", &cv_ringshield,    90},
-	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Force Shield",      &cv_forceshield,  100},
-	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Armageddon Shield", &cv_bombshield,   110},
-	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "1 Up",              &cv_1up,          120},
-	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Eggman Box",        &cv_eggmanbox,    130},
+	// Instead of using this for dumb monitors, lets use the new item bools we have :V
+	{IT_STRING | IT_CVAR, NULL, "Mushrooms",			&cv_mushroom,          10},
+	{IT_STRING | IT_CVAR, NULL, "Triple Mushrooms",	&cv_triplemushroom,    18},
+	{IT_STRING | IT_CVAR, NULL, "Mega Mushrooms",		&cv_megashroom,        26},
+	{IT_STRING | IT_CVAR, NULL, "Golden Mushrooms",	&cv_goldshroom,        34},
+	{IT_STRING | IT_CVAR, NULL, "Stars",				&cv_star,              42},
+	{IT_STRING | IT_CVAR, NULL, "Bananas",				&cv_banana,            50},
+	{IT_STRING | IT_CVAR, NULL, "Triple Bananas",		&cv_triplebanana,      58},
+	{IT_STRING | IT_CVAR, NULL, "Fake Items",			&cv_fakeitem,          66},
+	{IT_STRING | IT_CVAR, NULL, "Green Shells",		&cv_greenshell,        74},
+	{IT_STRING | IT_CVAR, NULL, "Red Shells",			&cv_redshell,          82},
+	{IT_STRING | IT_CVAR, NULL, "Triple Green Shells",	&cv_triplegreenshell,  90},
+	{IT_STRING | IT_CVAR, NULL, "Triple Red Shells",	&cv_tripleredshell,    98},
+	{IT_STRING | IT_CVAR, NULL, "Bob-ombs",			&cv_bobomb,           106},
+	{IT_STRING | IT_CVAR, NULL, "Fire Flowers",		&cv_fireflower,       114},
+	{IT_STRING | IT_CVAR, NULL, "Magnets",				&cv_magnet,           122},
+	{IT_STRING | IT_CVAR, NULL, "Boos",				&cv_boo,              130},
+	{IT_STRING | IT_CVAR, NULL, "Lightning",			&cv_lightning,        138},
+	{IT_STRING | IT_CVAR, NULL, "Blue Lightning",		&cv_blueshell,        146},
+	{IT_STRING | IT_CVAR, NULL, "Feathers",			&cv_feather,          154},
 };
 
 // ==========================================================================
@@ -1834,7 +1831,8 @@ menu_t OP_ServerOptionsDef = DEFAULTMENUSTYLE("M_SERVER", OP_ServerOptionsMenu,
 
 menu_t OP_NetgameOptionsDef = DEFAULTMENUSTYLE("M_SERVER", OP_NetgameOptionsMenu, &OP_ServerOptionsDef, 30, 30);
 menu_t OP_GametypeOptionsDef = DEFAULTMENUSTYLE("M_SERVER", OP_GametypeOptionsMenu, &OP_ServerOptionsDef, 30, 30);
-menu_t OP_MonitorToggleDef =
+menu_t OP_MonitorToggleDef = DEFAULTMENUSTYLE("M_SERVER", OP_MonitorToggleMenu, &OP_ServerOptionsDef, 30, 30);
+/*menu_t OP_MonitorToggleDef =
 {
 	"M_SERVER",
 	sizeof (OP_MonitorToggleMenu)/sizeof (menuitem_t),
@@ -1844,7 +1842,7 @@ menu_t OP_MonitorToggleDef =
 	30, 30,
 	0,
 	NULL
-};
+};*/
 
 #ifdef HWRENDER
 menu_t OP_OpenGLOptionsDef = DEFAULTMENUSTYLE("M_VIDEO", OP_OpenGLOptionsMenu, &OP_VideoOptionsDef, 30, 30);
@@ -4515,8 +4513,8 @@ static void M_SinglePlayerMenu(INT32 choice)
 	(void)choice;
 	SP_MainMenu[sprecordattack].status =
 		(M_SecretUnlocked(SECRET_RECORDATTACK)) ? IT_CALL|IT_STRING : IT_SECRET;
-	SP_MainMenu[spnightsmode].status =
-		(M_SecretUnlocked(SECRET_NIGHTSMODE)) ? IT_CALL|IT_STRING : IT_SECRET;
+	/*SP_MainMenu[spnightsmode].status =
+		(M_SecretUnlocked(SECRET_NIGHTSMODE)) ? IT_CALL|IT_STRING : IT_SECRET;*/
 
 	M_SetupNextMenu(&SP_MainDef);
 }
@@ -4941,13 +4939,13 @@ static void M_HandleLoadSave(INT32 choice)
 //
 // Selected from SRB2 menu
 //
-static void M_LoadGame(INT32 choice)
+/*static void M_LoadGame(INT32 choice)
 {
 	(void)choice;
 
 	M_ReadSaveStrings();
 	M_SetupNextMenu(&SP_LoadDef);
-}
+}*/
 
 //
 // Used by cheats to force the save menu to a specific spot.
@@ -5346,6 +5344,9 @@ static void M_DrawGameStats(void)
 	                         G_TicsToMinutes(totalplaytime, false),
 	                         G_TicsToSeconds(totalplaytime)));
 
+	V_DrawString(32, 90, V_YELLOWMAP, "Total Matches Played:");
+	V_DrawRightAlignedString(BASEVIDWIDTH-32, 100, 0, va("%i", matchesplayed));
+
 	for (i = 0; i < NUMMAPS; i++)
 	{
 		if (!mapheaderinfo[i] || !(mapheaderinfo[i]->menuflags & LF2_RECORDATTACK))
@@ -5376,7 +5377,7 @@ static void M_DrawGameStats(void)
 
 	}
 
-	V_DrawCenteredString(BASEVIDWIDTH/2, 90, 0, "* COMBINED RECORDS *");
+	V_DrawCenteredString(BASEVIDWIDTH/2, 120, 0, "* COMBINED RECORDS *");
 
 	/*sprintf(beststr, "%u", bestscore);
 	V_DrawString(32, 100, V_YELLOWMAP, "SCORE:");
@@ -5385,10 +5386,10 @@ static void M_DrawGameStats(void)
 		V_DrawRightAlignedString(BASEVIDWIDTH-32, 108, V_REDMAP, va("(%d unfinished)", mapsunfinished[0]));*/
 
 	sprintf(beststr, "%i:%02i:%02i.%02i", G_TicsToHours(besttime), G_TicsToMinutes(besttime, false), G_TicsToSeconds(besttime), G_TicsToCentiseconds(besttime));
-	V_DrawString(32, 100, V_YELLOWMAP, "TIME:");
-	V_DrawRightAlignedString(BASEVIDWIDTH-32, 100, 0, beststr);
+	V_DrawString(32, 140, V_YELLOWMAP, "TIME:");
+	V_DrawRightAlignedString(BASEVIDWIDTH-32, 140, 0, beststr);
 	if (mapsunfinished[1])
-		V_DrawRightAlignedString(BASEVIDWIDTH-32, 108, V_REDMAP, va("(%d unfinished)", mapsunfinished[1]));
+		V_DrawRightAlignedString(BASEVIDWIDTH-32, 148, V_REDMAP, va("(%d unfinished)", mapsunfinished[1]));
 
 	/*sprintf(beststr, "%u", bestrings);
 	V_DrawString(32, 140, V_YELLOWMAP, "RINGS:");
@@ -5706,7 +5707,7 @@ void M_DrawNightsAttackMenu(void)
 }
 
 // Going to Nights Attack menu...
-static void M_NightsAttack(INT32 choice)
+/*static void M_NightsAttack(INT32 choice)
 {
 	(void)choice;
 
@@ -5731,7 +5732,7 @@ static void M_NightsAttack(INT32 choice)
 
 	G_SetGamestate(GS_TIMEATTACK);
 	S_ChangeMusicInternal("racent", true);
-}
+}*/
 
 // Player has selected the "START" from the nights attack screen
 static void M_ChooseNightsAttack(INT32 choice)
@@ -7099,6 +7100,7 @@ static void M_EraseDataResponse(INT32 ch)
 	if (erasecontext == 2)
 	{
 		totalplaytime = 0;
+		matchesplayed = 0;
 		F_StartIntro();
 	}
 	M_ClearMenus(true);
@@ -7780,7 +7782,7 @@ static void M_HandleVideoMode(INT32 ch)
 // ===============
 // Monitor Toggles
 // ===============
-static void M_DrawMonitorToggles(void)
+/*static void M_DrawMonitorToggles(void)
 {
 	INT32 i, y;
 	INT32 sum = 0;
@@ -7814,7 +7816,7 @@ static void M_DrawMonitorToggles(void)
 
 	if (cheating)
 		V_DrawCenteredString(BASEVIDWIDTH/2, currentMenu->y, V_REDMAP, "* MODIFIED, CHEATS ENABLED *");
-}
+}*/
 
 // =========
 // Quit Game
diff --git a/src/p_inter.c b/src/p_inter.c
index fb036b99ab5a31c6fd96763ba4976680d3c14775..5b3addd5ae18547bffa84f76f889cbba7c089f5a 100644
--- a/src/p_inter.c
+++ b/src/p_inter.c
@@ -439,7 +439,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
 
 				special->tracer->player->kartstuff[k_comebackpoints]++;
 
-				if (netgame)
+				if (netgame && cv_hazardlog.value)
 					CONS_Printf(M_GetText("%s gave an item to %s.\n"), player_names[special->tracer->player-players], player_names[player-players]);
 
 				if (special->tracer->player->kartstuff[k_comebackpoints] >= 3)
diff --git a/src/p_mobj.c b/src/p_mobj.c
index 286fa292e7b47e2cb553fe73445b08ec2ad604d7..9fbf9166ad06f0040395d5f42f21fcb2fa309a74 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -3603,7 +3603,7 @@ boolean P_CameraThinker(player_t *player, camera_t *thiscam, boolean resetcalled
 		|| (thiscam == &camera4 && players[fourthdisplayplayer].mo && (players[fourthdisplayplayer].mo->flags2 & MF2_TWOD)))
 		itsatwodlevel = true;
 
-	if (cv_kartmirror.value)
+	if (mirrormode)
 		postimg = postimg_mirror;
 	else if (player->pflags & PF_FLIPCAM && !(player->pflags & PF_NIGHTSMODE) && player->mo->eflags & MFE_VERTICALFLIP)
 		postimg = postimg_flip;
@@ -7728,14 +7728,10 @@ void P_MobjThinker(mobj_t *mobj)
 
 			P_SpawnGhostMobj(mobj);
 
-			if (K_GetKartCC() == 50)
-			{
+			if (gamespeed == 0)
 				finalspeed = FixedMul(finalspeed, FRACUNIT-FRACUNIT/4);
-			}
-			else if (K_GetKartCC() == 150)
-			{
+			else if (gamespeed == 2)
 				finalspeed = FixedMul(finalspeed, FRACUNIT+FRACUNIT/4);
-			}
 
 			mobj->angle = R_PointToAngle2(mobj->x, mobj->y, mobj->x+mobj->momx, mobj->y+mobj->momy);
 			if (mobj->health <= 5)
@@ -7779,12 +7775,12 @@ void P_MobjThinker(mobj_t *mobj)
 			if (leveltime % 7 == 0)
 				S_StartSound(mobj, mobj->info->activesound);
 
-			if (K_GetKartCC() == 50)
+			if (gamespeed == 0)
 			{
 				topspeed = FixedMul(topspeed, FRACUNIT-FRACUNIT/4);
 				distbarrier = FixedMul(distbarrier, FRACUNIT-FRACUNIT/4);
 			}
-			else if (K_GetKartCC() == 150)
+			else if (gamespeed == 2)
 			{
 				topspeed = FixedMul(topspeed, FRACUNIT+FRACUNIT/4);
 				distbarrier = FixedMul(distbarrier, FRACUNIT+FRACUNIT/4);
diff --git a/src/p_setup.c b/src/p_setup.c
index 608f308d06c3c6bfe252c8397407bdb11fcf6d31..b047258a8fb73fff1daedff6785f3f94b9b3e5b6 100644
--- a/src/p_setup.c
+++ b/src/p_setup.c
@@ -2987,6 +2987,17 @@ boolean P_SetupLevel(boolean skipprecip)
 		CV_SetValue(&cv_analog, false);
 	}
 
+	// SRB2Kart: map load variables
+	if (modeattacking)
+		gamespeed = 2;
+	else if (gametype == GT_MATCH)
+		gamespeed = 0;
+	else
+		gamespeed = cv_kartspeed.value;
+	franticitems = cv_kartfrantic.value;
+	mirrormode = cv_kartmirror.value;
+	comeback = cv_kartcomeback.value;
+
 	// clear special respawning que
 	iquehead = iquetail = 0;
 
diff --git a/src/p_user.c b/src/p_user.c
index 467a505761f34e6af5c3a186f4c015a1b20c29a2..4f4907a46251ccdfa56b07296f52eabb2a3d3c67 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -43,6 +43,7 @@
 // Objectplace
 #include "m_cheat.h"
 // SRB2kart
+#include "m_cond.h" // M_UpdateUnlockablesAndExtraEmblems
 #include "k_kart.h"
 
 #ifdef HW3SOUND
@@ -1644,6 +1645,19 @@ void P_DoPlayerExit(player_t *player)
 	if (player->exiting)
 		return;
 
+	// SRB2kart: Increment the "matches played" counter.
+	// Why here of all places instead of the intermission screen?!?
+	// To prevent someone from using "exitlevel" to unlock everything!
+	if (player == &players[consoleplayer] && ((!modifiedgame || savemoddata) && !demoplayback)) // SRB2kart: Unlock stuff in MP
+	{
+		matchesplayed++;
+		if (M_UpdateUnlockablesAndExtraEmblems())
+		{
+			S_StartSound(NULL, sfx_ncitem);
+			G_SaveGameData(); // only save if unlocked something
+		}
+	}
+
 	if (gametype == GT_RACE || gametype == GT_COMPETITION) // If in Race Mode, allow
 	{
 		// SRB2kart 120217
@@ -8020,7 +8034,7 @@ static void P_DeathThink(player_t *player)
 		//player->kartstuff[k_lakitu] = 48; // See G_PlayerReborn in g_game.c
 
 		// SRB2kart - spawn automatically after 1 second
-		if (player->deadtimer > TICRATE)
+		if (player->deadtimer > cv_respawntime.value*TICRATE)
 			player->playerstate = PST_REBORN;
 
 		// Single player auto respawn
@@ -9129,7 +9143,7 @@ static void P_CalcPostImg(player_t *player)
 	}
 #endif
 	
-	if (cv_kartmirror.value) // srb2kart
+	if (mirrormode) // srb2kart
 		*type = postimg_mirror;
 }