diff --git a/cgame/cg_event.c b/cgame/cg_event.c
index 62472e3..65bb0c4 100644
--- a/cgame/cg_event.c
+++ b/cgame/cg_event.c
@@ -4809,12 +4809,6 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) {
 				centity_t *vChatEnt = &cg_entities[es->groundEntityNum];
 				char* descr = bg_siegeChatMessages[es->eventParm];
 
-				if (!sfx)
-				{
-					// Shouldn't ever happen
-					break;
-				}
-
 				if (cg.playerCent && clientNum != cg.playerCent->currentState.clientNum
 					&& ci->team == cgs.clientinfo[cg.playerCent->currentState.clientNum].team) {
 					//don't hear it if this person is on the other team, but they can still
diff --git a/cgame/cg_players.c b/cgame/cg_players.c
index fb1b1fd..db3a8d2 100644
--- a/cgame/cg_players.c
+++ b/cgame/cg_players.c
@@ -20777,39 +20777,22 @@ void CG_LoadConfigDataBreath(clientInfo_t* ci, char *fileBuffer)
 
 void CG_LoadConfigDataSounds(clientInfo_t *ci, char *fileBuffer, qboolean modelloaded)
 {
-	//	fileHandle_t f;
 	qboolean	isFemale = qfalse;
 	int			i = 0;
+	int			j;
 	char		*index = NULL;
+	char		*nextIndex = NULL;
+	char		*flagIndex = NULL;
 	int			len = 0;
-	//	int			fLen = 0;
 	const char	*dir;
 	char		soundpath[MAX_QPATH];
 	char		soundName[1024];
 	const char	*s;
 
-	char* soundFile=0;
-	fileHandle_t tmpFile;
+	qboolean	useSimpleSiegeSounds = qfalse;
 
 	dir = ci->modelName;
-/*
-	if ( !ci->skinName || !Q_stricmp( "default", ci->skinName ) )
-	{//try default sounds.cfg first
-		fLen = trap_FS_FOpenFile(va("models/players/%s/sounds.cfg", dir), &f, FS_READ);
-		if ( !f ) 
-		{//no?  Look for _default sounds.cfg
-			fLen = trap_FS_FOpenFile(va("models/players/%s/sounds_default.cfg", dir), &f, FS_READ);
-		}
-	}
-	else
-	{//use the .skin associated with this skin
-		fLen = trap_FS_FOpenFile(va("models/players/%s/sounds_%s.cfg", dir, ci->skinName), &f, FS_READ);
-		if ( !f ) 
-		{//fall back to default sounds
-			fLen = trap_FS_FOpenFile(va("models/players/%s/sounds.cfg", dir), &f, FS_READ);
-		}
-	}
-*/
+
 	//go to sound_<name> else sound_default
 	//take the sound path and gender
 	soundpath[0] = 0;
@@ -20848,6 +20831,26 @@ void CG_LoadConfigDataSounds(clientInfo_t *ci, char *fileBuffer, qboolean modell
 		isFemale = qtrue;
 	}
 
+	nextIndex = strstr(index, "sounds_");
+
+	/*
+	 * Parse simple siege sounds --eez
+	 * To add a new optional modelconfig flag, use code that looks like the below segment
+	 *
+	 * flagIndex = strstr(index, "flag_example");
+	 * if(flagIndex != NULL && nextIndex == NULL || flagIndex < nextIndex)
+	 * {
+	 *		// Logic goes here
+	 * }
+	 */
+
+	flagIndex = strstr(index, "flag_simpleSiegeSounds");
+	if (flagIndex != NULL && nextIndex == NULL || flagIndex < nextIndex)
+	{
+		useSimpleSiegeSounds = qtrue;
+	}
+
+
 	if (isFemale)
 	{
 		ci->gender = GENDER_FEMALE;
@@ -20867,6 +20870,9 @@ void CG_LoadConfigDataSounds(clientInfo_t *ci, char *fileBuffer, qboolean modell
 
 	trap_S_ShutUp(qtrue);
 
+	/*
+	 * Load custom sounds
+	 */
 	for ( i = 0 ; i < MAX_CUSTOM_SOUNDS ; i++ )
 	{
 		s = cg_customSoundNames[i];
@@ -20905,43 +20911,117 @@ void CG_LoadConfigDataSounds(clientInfo_t *ci, char *fileBuffer, qboolean modell
 		}
 	}
 
+
+	/*
+	 * Load custom siege sounds
+	 */
 	if (cgs.gametype >= GT_TEAM || cg_buildScript.integer)
-	{ //load the siege sounds then
-		for ( i = 0 ; i < MAX_CUSTOM_SIEGE_SOUNDS_INTERNAL; i++ )
+	{
+		// Simple siege sounds pull from bg_customSiegeSounds and fills the other array entries based on it.
+		// Non-simple siege sounds simply pull from bg_customSiegeSounds
+		if (!useSimpleSiegeSounds)
 		{
-			s = bg_customSiegeSoundNamesInternal[i];
-			if ( !s )
+			for (i = 0; i < MAX_CUSTOM_SIEGE_SOUNDS_INTERNAL; i++)
 			{
-				break;
-			}
+				s = bg_customSiegeSoundNamesInternal[i];
+				if (!s)
+				{
+					break;
+				}
 
-			Com_sprintf(soundName, sizeof(soundName), "%s", s+1);
-			COM_StripExtensionSafe(soundName, soundName, sizeof(soundName));
-			//strip the extension because we might want .mp3's
+				Com_sprintf(soundName, sizeof(soundName), "%s", s + 1);
+				COM_StripExtensionSafe(soundName, soundName, sizeof(soundName));
+				//strip the extension because we might want .mp3's
 
-			ci->siegeSounds[i] = 0;
-			// if the model didn't load use the sounds of the default model
-			if (soundpath[0])
-			{
-				ci->siegeSounds[i] = trap_S_RegisterSound(va("sound/%s/%s", soundpath, soundName));
+				ci->siegeSounds[i] = 0;
+				// if the model didn't load use the sounds of the default model
+				if (soundpath[0])
+				{
+					ci->siegeSounds[i] = trap_S_RegisterSound(va("sound/%s/%s", soundpath, soundName));
+				}
+				else
+				{
+					if (modelloaded)
+					{
+						ci->siegeSounds[i] = trap_S_RegisterSound(va("sound/chars/%s/misc/%s", dir, soundName));
+					}
+				}
+
+				if (!ci->siegeSounds[i])
+				{ //failed the load, try one out of the generic path
+					if (isFemale)
+					{
+						ci->siegeSounds[i] = trap_S_RegisterSound(va("sound/%s/%s", DEFAULT_FEMALE_SOUNDPATH, soundName));
+					}
+					else
+					{
+						ci->siegeSounds[i] = trap_S_RegisterSound(va("sound/%s/%s", DEFAULT_MALE_SOUNDPATH, soundName));
+					}
+				}
 			}
-			else
+		}
+		else
+		{
+			for (i = 0; i < MAX_CUSTOM_SIEGE_SOUNDS; i++)
 			{
-				if (modelloaded)
+				sfxHandle_t sfx = NULL_HANDLE;
+				qboolean startFound = qfalse;
+
+				s = bg_customSiegeSoundNames[i];
+				if (!s)
 				{
-					ci->siegeSounds[i] = trap_S_RegisterSound(va("sound/chars/%s/misc/%s", dir, soundName));
+					break;
 				}
-			}
 
-			if (!ci->siegeSounds[i])
-			{ //failed the load, try one out of the generic path
-				if (isFemale)
+				Com_sprintf(soundName, sizeof(soundName), "%s", s + 1);
+				COM_StripExtensionSafe(soundName, soundName, sizeof(soundName));
+				//strip the extension because we might want .mp3's
+
+				sfx = trap_S_RegisterSound(va("sound/chars/%s/misc/%s", soundpath, soundName));
+
+				// Apply it to every other sound index that starts with the same thing
+				for (j = 0; j < MAX_CUSTOM_SIEGE_SOUNDS_INTERNAL; j++)
 				{
-					ci->siegeSounds[i] = trap_S_RegisterSound(va("sound/%s/%s", DEFAULT_FEMALE_SOUNDPATH, soundName));
+					if (!Q_stricmpn(bg_customSiegeSoundNames[i], bg_customSiegeSoundNamesInternal[j], strlen(bg_customSiegeSoundNames[i])))
+					{
+						// Start copying sounds
+						if (!startFound)
+						{
+							startFound = qtrue;
+						}
+
+						ci->siegeSounds[j] = sfx;
+					}
+					else if (startFound)
+					{
+						// We've reached the end. No need to keep going and waste time.
+						break;
+					}
 				}
-				else
+			}
+
+			// Second pass - fill in any that are missing
+			for (i = 0; i < MAX_CUSTOM_SIEGE_SOUNDS_INTERNAL; i++)
+			{
+				if (ci->siegeSounds[i] == NULL_HANDLE)
 				{
-					ci->siegeSounds[i] = trap_S_RegisterSound(va("sound/%s/%s", DEFAULT_MALE_SOUNDPATH, soundName));
+					s = bg_customSiegeSoundNamesInternal[i];
+					if (!s)
+					{
+						break;
+					}
+
+					Com_sprintf(soundName, sizeof(soundName), "%s", s + 1);
+					COM_StripExtensionSafe(soundName, soundName, sizeof(soundName));
+
+					if (isFemale)
+					{
+						ci->siegeSounds[i] = trap_S_RegisterSound(va("sound/%s/%s", DEFAULT_FEMALE_SOUNDPATH, soundName));
+					}
+					else
+					{
+						ci->siegeSounds[i] = trap_S_RegisterSound(va("sound/%s/%s", DEFAULT_MALE_SOUNDPATH, soundName));
+					}
 				}
 			}
 		}
diff --git a/cgame/cg_voicechat.c b/cgame/cg_voicechat.c
index b9676c8..7e53fc9 100644
--- a/cgame/cg_voicechat.c
+++ b/cgame/cg_voicechat.c
@@ -104,57 +104,6 @@ static char menus[9][VOICECHAT_MAX_MENU][64] =
 	},
 };
 
-// FIXME: delete this
-const char	*cg_organizedSiegeSoundNames[MAX_CUSTOM_SIEGE_SOUNDS] =
-{
-	"*att_primary", //
-	"*att_second", //
-	"*att_attack", //
-	"*def_primary", //
-	"*def_second", //
-	"*def_position", //
-	"*req_assist", //
-	"*req_medic", //
-	"*req_sup", //CHANGE TO SUPRESSING IN UI
-	"*req_hvy", //
-	"*req_ammo",
-	"*req_take",
-	"*reply_yes", //
-	"*reply_no", //
-	"*reply_coming", //
-	"*reply_go", //
-	"*reply_stay", //
-	"*reply_def",
-	"*spot_defenses", //
-	"*spot_troops", //
-	"*spot_sniper", //
-	"*spot_clear",
-	"*spot_flank",
-	"*spot_gren",
-	"*spot_trap",
-	"*spot_weap",
-	"*spot_mt",
-	"*tac_cover", //
-	"*tac_follow", //
-	"*tac_fallback", //
-	"*tac_together", //
-	"*tac_split", //
-	"*tac_flank",
-	"*cls_arc",
-	"*cls_clone",
-	"*cls_hero",
-	"*cls_jedi",
-	"*cls_sold",
-	"*cls_wook",
-	"*cls_bh",
-	"*cls_deka",
-	"*cls_mando",
-	"*cls_sbd",
-	"*cls_sith",
-	"*cls_sold",
-	NULL
-};
-
 const char *cg_organizedGestures[MAX_CUSTOM_SIEGE_GESTURES] =
 {
 	"advance",
@@ -295,7 +244,7 @@ int CG_NewVoicechat( void )
 
 found:			if(index < MAX_CUSTOM_SIEGE_SOUNDS) 
 				{
-					sprintf(command, "voice_cmd %s", cg_organizedSiegeSoundNames[index]);
+					sprintf(command, "voice_cmd %s", bg_customSiegeSoundNames[index]);
 					trap_SendClientCommand( command );
 					trap_Cvar_Set("cg_drawVoicechat", "0");
 					level = 0;
diff --git a/game/bg_misc.c b/game/bg_misc.c
index 6379d7f..f6ac021 100644
--- a/game/bg_misc.c
+++ b/game/bg_misc.c
@@ -115,33 +115,37 @@ const int bgToggleableSurfaceDebris[BG_NUM_TOGGLEABLE_SURFACES] =
 	-1
 };
 
-//Modified by Defiant 21/10/2011
+
+/*
+ * These three arrays are responsible for the "guts" of vchat.
+ * bg_customSiegeSoundNames corresponds to a "category" and bg_customSiegeSoundNamesInternal corresponds to a specific sound.
+ * The fields in bg_customSiegeSoundNamesInternal *must* be successive in numbering. Don't go shuffling them around!
+ * Also, the fields in bg_customSiegeSoundNames are ordered in a specific way that corresponds to cg_voicechat.c
+ * --eezstreet
+ */
 const char	*bg_customSiegeSoundNames[MAX_CUSTOM_SIEGE_SOUNDS] =
 {
-	"*att_attack", //
 	"*att_primary", //
 	"*att_second", //
-	"*def_guns", //?
-	"*def_position", //
+	"*att_attack", //
 	"*def_primary", //
 	"*def_second", //
-	"*reply_coming", //
-	"*reply_go", //
-	"*reply_no", //
-	"*reply_stay", //
-	"*reply_yes", //
-	"*reply_def",
+	"*def_position", //
 	"*req_assist", //
-	"*req_hvy", //
 	"*req_medic", //
-	"*req_sup", //
+	"*req_sup", //CHANGE TO SUPRESSING IN UI
+	"*req_hvy", //
 	"*req_ammo",
 	"*req_take",
-	//	"*spot_air",
+	"*reply_yes", //
+	"*reply_no", //
+	"*reply_coming", //
+	"*reply_go", //
+	"*reply_stay", //
+	"*reply_def",
 	"*spot_defenses", //
-	"*spot_emplaced", //?
-	"*spot_sniper", //
 	"*spot_troops", //
+	"*spot_sniper", //
 	"*spot_clear",
 	"*spot_flank",
 	"*spot_gren",
@@ -149,31 +153,26 @@ const char	*bg_customSiegeSoundNames[MAX_CUSTOM_SIEGE_SOUNDS] =
 	"*spot_weap",
 	"*spot_mt",
 	"*tac_cover", //
-	"*tac_fallback", //
 	"*tac_follow", //
-	"*tac_split", //
+	"*tac_fallback", //
 	"*tac_together", //
+	"*tac_split", //
 	"*tac_flank",
 	"*cls_arc",
-	"*cls_bh",
 	"*cls_clone",
-	"*cls_deka",
 	"*cls_hero",
-	"*cls_sold",
 	"*cls_jedi",
+	"*cls_sold",
+	"*cls_wook",
+	"*cls_bh",
+	"*cls_deka",
 	"*cls_mando",
 	"*cls_sbd",
 	"*cls_sith",
-	"*cls_wookiee",
-	"*bns_air",
-	"*bns_chrg",
-	"*bns_spotair",
-	"*bns_emplaced",
-	"*bns_tmy",
+	"*cls_sold",
 	NULL
 };
-//Defiant 21/10/2011
-//Work around to avoid putting all variations of voice commands into the config string
+
 const char	*bg_customSiegeSoundNamesInternal[MAX_CUSTOM_SIEGE_SOUNDS_INTERNAL] =
 {
 	"*att_attack1",
diff --git a/game/bg_public.h b/game/bg_public.h
index 20e4c3b..e4ec67b 100644
--- a/game/bg_public.h
+++ b/game/bg_public.h
@@ -872,6 +872,7 @@ typedef enum {
 
 extern const char *bg_customSiegeSoundNames[MAX_CUSTOM_SIEGE_SOUNDS];
 extern const char *bg_customSiegeSoundNamesInternal[MAX_CUSTOM_SIEGE_SOUNDS_INTERNAL];
+extern const char *bg_siegeChatMessages[MAX_CUSTOM_SIEGE_SOUNDS_INTERNAL];
 
 extern const char *bgToggleableSurfaces[BG_NUM_TOGGLEABLE_SURFACES];
 extern const int bgToggleableSurfaceDebris[BG_NUM_TOGGLEABLE_SURFACES];
diff --git a/game/g_cmds.c b/game/g_cmds.c
index 3c685cb..5b6a5d1 100644
--- a/game/g_cmds.c
+++ b/game/g_cmds.c
@@ -3595,7 +3595,7 @@ static const char* FindValidVoiceCommand(char* command, int* cmdNum)
 		if (!Q_stricmpn(bg_customSiegeSoundNamesInternal[i], command, length))
 		{
 			// We found a valid one. Cool. Continue until we find one that doesn't match.
-			while (!Q_stricmpn(bg_customSiegeSoundNamesInternal[i + matchCount], command, length))
+			while (!Q_stricmpn(bg_customSiegeSoundNamesInternal[i + matchCount + 1], command, length))
 			{
 				matchCount++;
 			}
@@ -3650,6 +3650,11 @@ static void Cmd_VoiceCommand_f(gentity_t *ent)
 
 	trap_Argv(1, arg, sizeof(arg));
 
+	if (arg[0] != '*')
+	{
+		Com_sprintf(arg, sizeof(arg), "*%s", arg); // retain old binds compatibility --eez
+	}
+
 	//now, make sure it's a valid sound to be playing like this.. so people can't go around
 	//screaming out death sounds or whatever.
 	while (bg_customSiegeSoundNames[i] != NULL)
@@ -3663,11 +3668,22 @@ static void Cmd_VoiceCommand_f(gentity_t *ent)
 
 	if (bg_customSiegeSoundNames[i] == NULL)
 	{
-		// Not valid
-		return;
+		// It *might* still be valid because we could be using a bind that references bg_customSiegeSoundNamesInternal instead
+		i = 0;
+		while (bg_customSiegeSoundNamesInternal[i] != NULL)
+		{
+			if (!Q_stricmp(bg_customSiegeSoundNamesInternal[i], arg))
+			{
+				rndSound = i;
+				break;
+			}
+			i++;
+		}
+	}
+	else
+	{
+		FindValidVoiceCommand(bg_customSiegeSoundNames[i], &rndSound);
 	}
-
-	FindValidVoiceCommand(bg_customSiegeSoundNames[i], &rndSound);
 
 	if(ent->client->nVoiceChatFloodProtect >= 10000/*g_VoiceChatFloodProtect.integer*/ + level.time)
 	{