diff --git a/src/d_netcmd.c b/src/d_netcmd.c
index e1b5986a38e5ad1c4dbcadf18519e26efddd6a24..3bd9e6df7fe9eec356c5ca7c5fbb07c711196617 100644
--- a/src/d_netcmd.c
+++ b/src/d_netcmd.c
@@ -367,7 +367,8 @@ consvar_t cv_kartfrantic = {"kartfrantic", "Off", CV_NETVAR|CV_CHEAT|CV_CALL|CV_
 consvar_t cv_kartcomeback = {"kartcomeback", "On", CV_NETVAR|CV_CHEAT|CV_CALL|CV_NOINIT, CV_OnOff, KartComeback_OnChange, 0, NULL, NULL, 0, 0, NULL};
 consvar_t cv_kartencore = {"kartencore", "Off", CV_NETVAR|CV_CALL|CV_NOINIT, CV_OnOff, KartEncore_OnChange, 0, NULL, NULL, 0, 0, NULL};
 static CV_PossibleValue_t kartvoterulechanges_cons_t[] = {{0, "Never"}, {1, "Sometimes"}, {2, "Frequent"}, {3, "Always"}, {0, NULL}};
-consvar_t cv_kartvoterulechanges = {"kartvoterulechanges", "Frequent", CV_NETVAR, kartvoterulechanges_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
+consvar_t cv_kartgametypechanges = {"kartgametypechanges", "Frequent", CV_NETVAR, kartvoterulechanges_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
+consvar_t cv_kartencorechance = {"kartencorechance", "Frequent", CV_NETVAR, kartvoterulechanges_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
 static CV_PossibleValue_t kartspeedometer_cons_t[] = {{0, "Off"}, {1, "Kilometers"}, {2, "Miles"}, {3, "Fracunits"}, {0, NULL}};
 consvar_t cv_kartspeedometer = {"kartdisplayspeed", "Off", CV_SAVE, kartspeedometer_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; // use tics in display
 static CV_PossibleValue_t kartvoices_cons_t[] = {{0, "Never"}, {1, "Tasteful"}, {2, "Meme"}, {0, NULL}};
@@ -468,6 +469,9 @@ consvar_t cv_sleep = {"cpusleep", "1", CV_SAVE, sleeping_cons_t, NULL, -1, NULL,
 
 consvar_t cv_nodownloads = { "downloadnotice", "", CV_SAVE };
 
+consvar_t cv_lessbattlevotes = {"lessbattlevotes", "No", CV_SAVE, CV_YesNo};
+consvar_t cv_lessencorevotes = {"lessencorevotes", "No", CV_SAVE, CV_YesNo};
+
 INT16 gametype = GT_RACE; // SRB2kart
 boolean forceresetplayers = false;
 boolean deferencoremode = false;
@@ -723,6 +727,9 @@ void D_RegisterServerCommands(void)
 #endif
 
 	CV_RegisterVar(&cv_dummyconsvar);
+
+	CV_RegisterVar(&cv_lessbattlevotes);
+	CV_RegisterVar(&cv_lessencorevotes);
 }
 
 // =========================================================================
@@ -2365,14 +2372,33 @@ void D_SetupVote(void)
 	UINT8 buf[6*2]; // five UINT16 maps (at twice the width of a UINT8), and two gametypes
 	UINT8 *p = buf;
 	INT32 i;
-	UINT8 secondgt = G_SometimesGetDifferentGametype();
+	UINT8 gt;
+	UINT8 secondgt;
 	INT16 votebuffer[3] = {-1,-1,-1};
 
-	if (cv_kartencore.value && G_RaceGametype())
-		WRITEUINT8(p, (gametype|0x80));
+	if (cv_lessbattlevotes.value && G_BattleGametype())
+	{
+		gt = GT_RACE;
+		secondgt = GT_MATCH;
+	}
 	else
-		WRITEUINT8(p, gametype);
+	{
+		gt = gametype;
+		secondgt = G_SometimesGetDifferentGametype();
+		if (cv_lessencorevotes.value)
+		{
+			if (secondgt == GT_RACE)
+				secondgt |= 0x80;
+		}
+		else
+		{
+			if (cv_kartencore.value && G_RaceGametype())
+				gt |= 0x80;
+		}
+	}
+	WRITEUINT8(p, gt);
 	WRITEUINT8(p, secondgt);
+	gt       &= ~0x80;
 	secondgt &= ~0x80;
 
 	for (i = 0; i < 5; i++)
@@ -2381,9 +2407,9 @@ void D_SetupVote(void)
 		if (i == 2) // sometimes a different gametype
 			m = G_RandMap(G_TOLFlag(secondgt), prevmap, false, 0, true, votebuffer);
 		else if (i >= 3) // unknown-random and force-unknown MAP HELL
-			m = G_RandMap(G_TOLFlag(gametype), prevmap, false, (i-2), (i < 4), votebuffer);
+			m = G_RandMap(G_TOLFlag(gt), prevmap, false, (i-2), (i < 4), votebuffer);
 		else
-			m = G_RandMap(G_TOLFlag(gametype), prevmap, false, 0, true, votebuffer);
+			m = G_RandMap(G_TOLFlag(gt), prevmap, false, 0, true, votebuffer);
 		if (i < 3)
 			votebuffer[min(i, 2)] = m; // min() is a dumb workaround for gcc 4.4 array-bounds error
 		WRITEUINT16(p, m);
diff --git a/src/d_netcmd.h b/src/d_netcmd.h
index c8b306f4bda11e593a727bd317147cf9a5f5a0dc..68fd6a5902a2d3b81303d5696b780aea2836c888 100644
--- a/src/d_netcmd.h
+++ b/src/d_netcmd.h
@@ -117,7 +117,8 @@ extern consvar_t cv_kartbumpers;
 extern consvar_t cv_kartfrantic;
 extern consvar_t cv_kartcomeback;
 extern consvar_t cv_kartencore;
-extern consvar_t cv_kartvoterulechanges;
+extern consvar_t cv_kartgametypechanges;
+extern consvar_t cv_kartencorechance;;
 extern consvar_t cv_kartspeedometer;
 extern consvar_t cv_kartvoices;
 
@@ -153,6 +154,9 @@ extern consvar_t cv_sleep;
 
 extern consvar_t cv_nodownloads;
 
+extern consvar_t cv_lessbattlevotes;
+extern consvar_t cv_lessencorevotes;
+
 typedef enum
 {
 	XD_NAMEANDCOLOR = 1,
diff --git a/src/g_game.c b/src/g_game.c
index a1521981eb38a1ff854cd5ee9fa2ddc690755a83..e68bb8fcbcf435be7ed45ee137fa66cc56db1fca 100644
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -3408,26 +3408,29 @@ INT16 G_SometimesGetDifferentGametype(void)
 {
 	boolean encorepossible = (M_SecretUnlocked(SECRET_ENCORE) && G_RaceGametype());
 
-	if (!cv_kartvoterulechanges.value) // never
-		return gametype;
-
-	if (randmapbuffer[NUMMAPS] > 0 && (encorepossible || cv_kartvoterulechanges.value != 3))
+	if (( randmapbuffer[NUMMAPS] > 0 || cv_kartgametypechanges.value == 0 ) &&
+			encorepossible)
 	{
-		randmapbuffer[NUMMAPS]--;
+		if (cv_kartgametypechanges.value == 3)
+			randmapbuffer[NUMMAPS] = 0;/* may not be set from cvar change */
+		else
+			randmapbuffer[NUMMAPS]--;
+
 		if (encorepossible)
 		{
-			switch (cv_kartvoterulechanges.value)
+			switch (cv_kartencorechance.value)
 			{
 				case 3: // always
-					randmapbuffer[NUMMAPS] = 0; // gotta prep this in case it isn't already set
+					encorepossible = true;
 					break;
 				case 2: // frequent
 					encorepossible = M_RandomChance(FRACUNIT>>1);
 					break;
 				case 1: // sometimes
-				default:
 					encorepossible = M_RandomChance(FRACUNIT>>2);
 					break;
+				default:
+					encorepossible = false;
 			}
 			if (encorepossible != (boolean)cv_kartencore.value)
 				return (gametype|0x80);
@@ -3435,7 +3438,7 @@ INT16 G_SometimesGetDifferentGametype(void)
 		return gametype;
 	}
 
-	switch (cv_kartvoterulechanges.value) // okay, we're having a gametype change! when's the next one, luv?
+	switch (cv_kartgametypechanges.value) // okay, we're having a gametype change! when's the next one, luv?
 	{
 		case 3: // always
 			randmapbuffer[NUMMAPS] = 1; // every other vote (or always if !encorepossible)
@@ -3448,6 +3451,8 @@ INT16 G_SometimesGetDifferentGametype(void)
 		case 2: // frequent
 			randmapbuffer[NUMMAPS] = 2; // ...every 1/2th-ish cup?
 			break;
+		case 0: /* never */
+			return gametype;
 	}
 
 	if (gametype == GT_MATCH)
diff --git a/src/k_kart.c b/src/k_kart.c
index 76797a74e6740483b23ae7685e898c96a491c0c0..eff31eb827602e97d40e36a6e69163cb33056d13 100644
--- a/src/k_kart.c
+++ b/src/k_kart.c
@@ -574,7 +574,8 @@ void K_RegisterKartStuff(void)
 	CV_RegisterVar(&cv_kartfrantic);
 	CV_RegisterVar(&cv_kartcomeback);
 	CV_RegisterVar(&cv_kartencore);
-	CV_RegisterVar(&cv_kartvoterulechanges);
+	CV_RegisterVar(&cv_kartgametypechanges);
+	CV_RegisterVar(&cv_kartencorechance);
 	CV_RegisterVar(&cv_kartspeedometer);
 	CV_RegisterVar(&cv_kartvoices);
 	CV_RegisterVar(&cv_karteliminatelast);
diff --git a/src/m_menu.c b/src/m_menu.c
index 245c01485f71c89396f3e606fcf4c96bf279174b..c1d91c1671a62138a7d9e60cca1c590c3b1c53ce 100644
--- a/src/m_menu.c
+++ b/src/m_menu.c
@@ -1498,16 +1498,17 @@ static menuitem_t OP_ServerOptionsMenu[] =
 	{IT_STRING | IT_CVAR,    NULL, "Intermission Timer",			&cv_inttime,			 40},
 	{IT_STRING | IT_CVAR,    NULL, "Map Progression",				&cv_advancemap,			 50},
 	{IT_STRING | IT_CVAR,    NULL, "Voting Timer",					&cv_votetime,			 60},
-	{IT_STRING | IT_CVAR,    NULL, "Voting Rule Changes",			&cv_kartvoterulechanges, 70},
+	{IT_STRING | IT_CVAR,    NULL, "Voting Gametype Changes",	&cv_kartgametypechanges, 70},
+	{IT_STRING | IT_CVAR,    NULL, "Voting Encore Chance",      &cv_kartencorechance, 80},
 
 #ifndef NONET
-	{IT_STRING | IT_CVAR,    NULL, "Max. Player Count",				&cv_maxplayers,			 90},
-	{IT_STRING | IT_CVAR,    NULL, "Allow Players to Join",			&cv_allownewplayer,		100},
-	{IT_STRING | IT_CVAR,    NULL, "Allow Add-on Downloading",		&cv_downloading,		110},
-	{IT_STRING | IT_CVAR,    NULL, "Pause Permission",				&cv_pause,				120},
-	{IT_STRING | IT_CVAR,    NULL, "Mute All Chat",					&cv_mute,				130},
+	{IT_STRING | IT_CVAR,    NULL, "Max. Player Count",				&cv_maxplayers,			 100},
+	{IT_STRING | IT_CVAR,    NULL, "Allow Players to Join",			&cv_allownewplayer,		110},
+	{IT_STRING | IT_CVAR,    NULL, "Allow Add-on Downloading",		&cv_downloading,		120},
+	{IT_STRING | IT_CVAR,    NULL, "Pause Permission",				&cv_pause,				130},
+	{IT_STRING | IT_CVAR,    NULL, "Mute All Chat",					&cv_mute,				140},
 
-	{IT_SUBMENU|IT_STRING,   NULL, "Advanced Options...",			&OP_AdvServerOptionsDef,150},
+	{IT_SUBMENU|IT_STRING,   NULL, "Advanced Options...",			&OP_AdvServerOptionsDef,160},
 #endif
 };