Index: code/freespace2/freespace.cpp
===================================================================
--- code/freespace2/freespace.cpp	(revision 5709)
+++ code/freespace2/freespace.cpp	(working copy)
@@ -6552,9 +6552,6 @@
 			}			
 			player_restore_target_and_weapon_link_prefs();
 
-			//Set the current hud
-			set_current_hud(Player_ship->ship_info_index);
-
 			Game_mode |= GM_IN_MISSION;
 
 #ifndef NDEBUG
Index: code/hud/hud.cpp
===================================================================
--- code/hud/hud.cpp	(revision 5709)
+++ code/hud/hud.cpp	(working copy)
@@ -72,6 +72,8 @@
 // Externals not related to the HUD code itself
 extern float View_zoom;
 
+extern bool Custom_gauge_images_loaded;
+
 // This is used to prevent drawing of hud (and pause popup)
 
 // globals that will control the color of the HUD gauges
@@ -637,6 +639,7 @@
 //
 void HUD_init()
 {
+	set_current_hud(Player_ship->ship_info_index);	
 	HUD_init_colors();
 	hud_init_msg_window();
 	hud_init_targeting();
@@ -1269,9 +1272,8 @@
 	if (!(Viewer_mode & (VM_EXTERNAL | VM_DEAD_VIEW | VM_WARP_CHASE | VM_PADLOCK_ANY ))) {
 		//Custom hud stuff
 		int i;
-		static bool image_ids_set = false;
 		static hud_frames image_ids[MAX_CUSTOM_HUD_GAUGES];
-		if(!image_ids_set)
+		if(!Custom_gauge_images_loaded)
 		{
 			for(i = 0; i < Num_custom_gauges; i++)
 			{
@@ -1292,7 +1294,7 @@
 					image_ids[i].first_frame = -1;
 				}
 			}
-			image_ids_set = true;
+			Custom_gauge_images_loaded = true;
 		}
 
 		//Display the gauges
Index: code/hud/hudescort.cpp
===================================================================
--- code/hud/hudescort.cpp	(revision 5709)
+++ code/hud/hudescort.cpp	(working copy)
@@ -52,7 +52,6 @@
 
 
 hud_frames Escort_gauges[NUM_ESCORT_FRAMES];
-int Escort_gauges_loaded = 0;
 
 //int Escort_gauge_y[MAX_ESCORT_SHIPS] = { 219, 230, 241 };
 
@@ -152,22 +151,18 @@
 void hud_escort_init()
 {
 	int i;
-
-	if ( !Escort_gauges_loaded ) {
-		for ( i = 0; i < NUM_ESCORT_FRAMES; i++ ) {
-			if ( strlen(current_hud->Escort_filename[i]) ) {
-				Escort_gauges[i].first_frame = bm_load_animation(current_hud->Escort_filename[i], &Escort_gauges[i].num_frames);
-
-				if (Escort_gauges[i].first_frame == -1) {
-					Warning(LOCATION, "Could not load in ani: %s\n", current_hud->Escort_filename[i]);
-					return;
-				}
-			} else {
-				Escort_gauges[i].first_frame = -1;
+	
+	for ( i = 0; i < NUM_ESCORT_FRAMES; i++ ) {
+		if ( strlen(current_hud->Escort_filename[i]) ) {
+			Escort_gauges[i].first_frame = bm_load_animation(current_hud->Escort_filename[i], &Escort_gauges[i].num_frames);
+			
+			if (Escort_gauges[i].first_frame == -1) {
+				Warning(LOCATION, "Could not load in ani: %s\n", current_hud->Escort_filename[i]);
+				return;
 			}
+		} else {
+			Escort_gauges[i].first_frame = -1;
 		}
-
-		Escort_gauges_loaded = 1;
 	}
 
 	Last_target_index = -1;
Index: code/hud/hudparse.cpp
===================================================================
--- code/hud/hudparse.cpp	(revision 5709)
+++ code/hud/hudparse.cpp	(working copy)
@@ -22,6 +22,7 @@
 
 //Global stuffs
 hud_info *current_hud = NULL; //If not set, it's NULL. This should always be null outside of a mission.
+bool Custom_gauge_images_loaded = false;
 hud_info default_hud;
 hud_info ship_huds[MAX_SHIP_CLASSES];
 extern int ships_inited; //Need this
@@ -68,7 +69,6 @@
 int Num_gauge_types = 17;
 int Num_custom_gauges = 0;
 
-
 static void load_hud_defaults(hud_info *hud)
 {
 	//X values
@@ -298,6 +298,8 @@
 			stuff_coords(dest_hud, cg);
 		}
 	}
+
+	dest_hud->loaded = true;
 }
 
 static void parse_resolution_gauges(hud_info* dest_hud)
@@ -579,9 +581,16 @@
 			{
 				if(dest_hud = parse_ship_start(), dest_hud)
 				{
-					while(rval = required_string_3("#End", "$Default:", "$Resolution:"), rval)
+					// Copy defaults
+					if(!dest_hud->loaded && default_hud.loaded)
 					{
-						if(parse_resolution_start(dest_hud, rval))
+						memcpy(dest_hud, &default_hud, sizeof(hud_info));
+						dest_hud->loaded = false;
+					}
+
+					while(rval = required_string_4("#End", "$Ship:", "$Default:", "$Resolution:"), rval > 1)
+					{
+						if(parse_resolution_start(dest_hud, rval - 1))
 						{
 							parse_resolution(dest_hud);
 						}
@@ -602,9 +611,16 @@
 			{
 				if(dest_hud = parse_ship_start(), dest_hud)
 				{
-					while(rval = required_string_3("#End", "$Default:", "$Resolution:"), rval)
+					// Copy defaults
+					if(!dest_hud->loaded && default_hud.loaded)
 					{
-						if(parse_resolution_start(dest_hud, rval))
+						memcpy(dest_hud, &default_hud, sizeof(hud_info));
+						dest_hud->loaded = false;
+					}
+
+					while(rval = required_string_4("#End", "$Ship:", "$Default:", "$Resolution:"), rval > 1)
+					{
+						if(parse_resolution_start(dest_hud, rval - 1))
 						{
 							parse_resolution_gauges(dest_hud);
 						}
@@ -667,9 +683,10 @@
 	else
 	{
 		memcpy(&real_current_hud, &default_hud, sizeof(hud_info));
-	}
+	}	
 
-	current_hud = &real_current_hud;
+	current_hud = &real_current_hud;	
+	Custom_gauge_images_loaded = false;
 }
 
 /* - not POD so GCC won't take it for offsetof - taylor
Index: code/hud/hudshield.cpp
===================================================================
--- code/hud/hudshield.cpp	(revision 5709)
+++ code/hud/hudshield.cpp	(working copy)
@@ -155,24 +155,21 @@
 
 	hud_shield_hit_reset(1);	// reset for the player
 
-	if ( Hud_shield_inited ) {
-		return;
-	}	
-
-	for ( i = 0; i < MAX_SHIELD_ICONS; i++ ) {
-		Shield_gauges[i].first_frame = -1;
-		Shield_gauges[i].num_frames  = 0;
-	}
-
-	Hud_shield_inited = 1;
-	if ( !Shield_mini_loaded ) {
-		Shield_mini_gauge.first_frame = bm_load_animation(current_hud->Shield_mini_fname, &Shield_mini_gauge.num_frames);
-		if ( Shield_mini_gauge.first_frame == -1 ) {
-			Warning(LOCATION, "Could not load in the HUD shield ani: Shield_mini_fname\n");
-			return;
+	if ( !Hud_shield_inited ) {
+		for ( i = 0; i < MAX_SHIELD_ICONS; i++ ) {
+			Shield_gauges[i].first_frame = -1;
+			Shield_gauges[i].num_frames  = 0;
 		}
-		Shield_mini_loaded = 1;
+		
+		Hud_shield_inited = 1;
 	}
+	
+	Shield_mini_gauge.first_frame = bm_load_animation(current_hud->Shield_mini_fname, &Shield_mini_gauge.num_frames);
+	if ( Shield_mini_gauge.first_frame == -1 ) {
+		Warning(LOCATION, "Could not load in the HUD shield ani: Shield_mini_fname\n");
+		return;
+	}
+	Shield_mini_loaded = 1;
 }
 
 int hud_shield_maybe_flash(int gauge, int target_index, int shield_offset)
Index: code/hud/hudtarget.cpp
===================================================================
--- code/hud/hudtarget.cpp	(revision 5709)
+++ code/hud/hudtarget.cpp	(working copy)
@@ -192,8 +192,6 @@
 //				3	=>		gun energy light
 hud_frames Aburn_bar_gauge;
 hud_frames Wenergy_bar_gauge;
-int Aburn_bar_gauge_loaded = 0;
-int Wenergy_bar_gauge_loaded = 0;
 /*int Weapon_energy_text_coords[GR_NUM_RESOLUTIONS][2] = {
 	{ // GR_640
 		439, 318
@@ -1180,21 +1178,17 @@
 		}
 		Lead_indicator_gauge_loaded = 1;
 	}
-	if (!Aburn_bar_gauge_loaded) {
-		Aburn_bar_gauge.first_frame = bm_load_animation(current_hud->Aburn_fname, &Aburn_bar_gauge.num_frames);
-		if ( Aburn_bar_gauge.first_frame < 0 ) {
-			Warning(LOCATION,"Cannot load hud ani: %s\n", current_hud->Aburn_fname);
-		}
-		Aburn_bar_gauge_loaded = 1;
+
+	Aburn_bar_gauge.first_frame = bm_load_animation(current_hud->Aburn_fname, &Aburn_bar_gauge.num_frames);
+	if ( Aburn_bar_gauge.first_frame < 0 ) {
+		Warning(LOCATION,"Cannot load hud ani: %s\n", current_hud->Aburn_fname);
 	}
 
-	if (!Wenergy_bar_gauge_loaded) {
-		Wenergy_bar_gauge.first_frame = bm_load_animation(current_hud->Wenergy_fname, &Wenergy_bar_gauge.num_frames);
-		if ( Wenergy_bar_gauge.first_frame < 0 ) {
-			Warning(LOCATION,"Cannot load hud ani: %s\n", current_hud->Wenergy_fname);
-		}
-		Wenergy_bar_gauge_loaded = 1;
+	Wenergy_bar_gauge.first_frame = bm_load_animation(current_hud->Wenergy_fname, &Wenergy_bar_gauge.num_frames);
+	if ( Wenergy_bar_gauge.first_frame < 0 ) {
+		Warning(LOCATION,"Cannot load hud ani: %s\n", current_hud->Wenergy_fname);
 	}
+
 	if (!Toggle_gauge_loaded) {
 		Toggle_gauge.first_frame = bm_load_animation(Toggle_fname[gr_screen.res], &Toggle_gauge.num_frames);
 		if ( Toggle_gauge.first_frame < 0 ) {
