Index: code/bmpman/bmpman.cpp
===================================================================
--- code/bmpman/bmpman.cpp	(revision 10911)
+++ code/bmpman/bmpman.cpp	(working copy)
@@ -48,7 +48,15 @@
 #define BMPMAN_NDEBUG
 #endif
 
+// Extension type lists
+const ubyte bm_type_list[] = { BM_TYPE_DDS, BM_TYPE_TGA, BM_TYPE_PNG, BM_TYPE_JPG, BM_TYPE_PCX };
+const char *bm_ext_list[] = { ".dds", ".tga", ".png", ".jpg", ".pcx" };
+const int BM_NUM_TYPES = sizeof(bm_type_list) / sizeof(ubyte);
 
+const ubyte bm_ani_type_list[] = {BM_TYPE_EFF, BM_TYPE_ANI};
+const char *bm_ani_ext_list[] = {".eff", ".ani"};
+const int BM_ANI_NUM_TYPES = sizeof(bm_ani_type_list) / sizeof(ubyte);
+
 // globals
 int GLOWMAP = -1;
 int SPECMAP = -1;
@@ -530,22 +538,18 @@
 
 	// Lets find out what type it is
 	{
-		const int NUM_TYPES	= 5;
-		const ubyte type_list[NUM_TYPES] = { BM_TYPE_DDS, BM_TYPE_TGA, BM_TYPE_PNG, BM_TYPE_JPG, BM_TYPE_PCX };
-		const char *ext_list[NUM_TYPES] = { ".dds", ".tga", ".png", ".jpg", ".pcx" };
-
 		// see if it's already loaded (checks for any type with filename)
 		if ( bm_load_sub_fast(filename, &handle) )
 			return handle;
 
 		// if we are still here then we need to fall back to a file-based search
-		int rval = bm_load_sub_slow(filename, NUM_TYPES, ext_list, &img_cfp);
+		int rval = bm_load_sub_slow(filename, BM_NUM_TYPES, bm_ext_list, &img_cfp);
 
 		if (rval < 0)
 			return -1;
 
-		strcat_s(filename, ext_list[rval]);
-		type = type_list[rval];
+		strcat_s(filename, bm_ext_list[rval]);
+		type = bm_type_list[rval];
 	}
 
 	Assert(type != BM_TYPE_NONE);
@@ -845,9 +849,6 @@
 	ubyte type = BM_TYPE_NONE, eff_type = BM_TYPE_NONE, c_type = BM_TYPE_NONE;
 	int bpp = 0, mm_lvl = 0, img_size = 0;
 	char clean_name[MAX_FILENAME_LEN];
-	const int NUM_TYPES	= 2;
-	const ubyte type_list[NUM_TYPES] = {BM_TYPE_EFF, BM_TYPE_ANI};
-	const char *ext_list[NUM_TYPES] = {".eff", ".ani"};
 
 	if ( !bm_inited )
 		bm_init();
@@ -909,13 +910,13 @@
 		}
 
 		// if we are still here then we need to fall back to a file-based search
-		int rval = bm_load_sub_slow(filename, NUM_TYPES, ext_list, &img_cfp, dir_type);
+		int rval = bm_load_sub_slow(filename, BM_ANI_NUM_TYPES, bm_ani_ext_list, &img_cfp, dir_type);
 
 		if (rval < 0)
 			return -1;
 
-		strcat_s(filename, ext_list[rval]);
-		type = type_list[rval];
+		strcat_s(filename, bm_ani_ext_list[rval]);
+		type = bm_ani_type_list[rval];
 	}
 
 	// If we found an animation then there is an extra 5 char size limit to adhere to. We don't do this check earlier since it's only needed if we found an anim
Index: code/bmpman/bmpman.h
===================================================================
--- code/bmpman/bmpman.h	(revision 10911)
+++ code/bmpman/bmpman.h	(working copy)
@@ -68,6 +68,12 @@
 
 
 extern int Bm_paging;
+extern const ubyte bm_type_list[];
+extern const char *bm_ext_list[];
+extern const int BM_NUM_TYPES;
+extern const ubyte bm_ani_type_list[];
+extern const char *bm_ani_ext_list[];
+extern const int BM_ANI_NUM_TYPES;
 
 void bm_init();
 
Index: code/graphics/generic.cpp
===================================================================
--- code/graphics/generic.cpp	(revision 10911)
+++ code/graphics/generic.cpp	(working copy)
@@ -20,6 +20,11 @@
 //we check background type to avoid messed up colours for ANI
 #define ANI_BPP_CHECK		(ga->ani.bg_type == BM_TYPE_PCX) ? 16 : 32
 
+bool generic_anim_exists(const char *filename)
+{
+	return cf_exists_full_ext(filename, CF_TYPE_ANY, BM_ANI_NUM_TYPES, bm_ani_ext_list);
+}
+
 // Goober5000
 int generic_anim_init_and_stream(generic_anim *anim, const char *anim_filename, ubyte bg_type, bool attempt_hi_res)
 {
Index: code/graphics/generic.h
===================================================================
--- code/graphics/generic.h	(revision 10911)
+++ code/graphics/generic.h	(working copy)
@@ -52,6 +52,7 @@
 	int bitmap_id;
 } generic_bitmap;
 
+bool generic_anim_exists(const char *filename);
 int generic_anim_init_and_stream(generic_anim *anim, const char *anim_filename, ubyte bg_type, bool attempt_hi_res);
 void generic_anim_init(generic_anim *ga);
 void generic_anim_init(generic_anim *ga, const char *filename);
Index: code/mission/missionmessage.cpp
===================================================================
--- code/mission/missionmessage.cpp	(revision 10911)
+++ code/mission/missionmessage.cpp	(working copy)
@@ -194,6 +194,7 @@
 static int Message_wave_muted;
 static int Message_wave_duration;
 static int Next_mute_time;
+static bool No_suffix_head_anis;
 
 #define MAX_DISTORT_PATTERNS	2
 #define MAX_DISTORT_LEVELS		6
@@ -650,6 +651,7 @@
 {
 	int rval, i;
 	static int table_read = 0;
+	char prefixless_name[MAX_FILENAME_LEN], with_prefix_name[MAX_FILENAME_LEN];
 
 	if ( !table_read ) {
 		Default_command_persona = -1;
@@ -714,6 +716,15 @@
 		Personas[i].flags &= ~PERSONA_FLAG_USED;
 	}
 
+	// If an anim with name HEAD_PREFIX_STRING minus the hyphen exists, and not
+	// HEAD_PREFIX_STRING + 'a', then enable 'No_suffix_head_anis'.
+	No_suffix_head_anis = false;
+	strncpy(prefixless_name, HEAD_PREFIX_STRING, strlen(HEAD_PREFIX_STRING) - 1);
+	sprintf(with_prefix_name, "%s%c", HEAD_PREFIX_STRING, 'a');
+	if(generic_anim_exists(prefixless_name) && !generic_anim_exists(with_prefix_name)){
+		No_suffix_head_anis = true;
+	}
+
 	Message_wave_muted = 0;
 	Next_mute_time = 1;
 
@@ -1169,8 +1180,9 @@
 
 	// support ships use a wingman head.
 	// terran command uses its own set of heads.
+	// Added option to always use the actual file for mods that don't have a,b & c, versions by enabling No_suffix_head_anis - FUBAR
 	int subhead_selected = FALSE;
-	if ( (q->message_num < Num_builtin_messages) || !(_strnicmp(HEAD_PREFIX_STRING, ani_name, strlen(HEAD_PREFIX_STRING)-1)) ) {
+	if (!No_suffix_head_anis && ( (q->message_num < Num_builtin_messages) || !(_strnicmp(HEAD_PREFIX_STRING, ani_name, strlen(HEAD_PREFIX_STRING)-1)) )) {
 		persona_index = m->persona_index;
 		
 		// if this ani should be converted to a terran command, set the persona to the command persona
