Index: fs2_open/code/hud/hudets.cpp
===================================================================
--- fs2_open/code/hud/hudets.cpp    (revision 8816)
+++ fs2_open/code/hud/hudets.cpp    (working copy)
@@ -713,13 +713,13 @@ void HudGaugeEts::pageIn()
 	bm_page_in_aabitmap( Ets_bar.first_frame, Ets_bar.num_frames );
 }
 
+/**
+ * Draw one ETS bar to screen
+ */
 void HudGaugeEts::blitGauge(int index)
 {
 	int y_start, y_end, clip_h, w, h, x, y;
 
-	// draw the letters for the gauges first, before any clipping occurs
-	renderPrintf(position[0] + Letter_offsets[0], position[1] + Letter_offsets[1], NOX("%c"), Letter); 
-
 	clip_h = fl2i( (1 - Energy_levels[index]) * ETS_bar_h );
 
 	bm_get_info(Ets_bar.first_frame,&w,&h);
@@ -772,6 +772,97 @@ void HudGaugeEts::blitGauge(int index)
 	}
 }
 
+/**
+ * Default ctor for retail ETS gauge
+ * 2nd arg (0) is not used
+ */
+HudGaugeEtsRetail::HudGaugeEtsRetail():
+HudGaugeEts(HUD_OBJECT_ETS_RETAIL, 0)
+{
+}
+
+/**
+ * Render the ETS retail gauge to the screen (weapon+shield+engine)
+ */
+void HudGaugeEtsRetail::render(float frametime)
+{
+	int i;
+	int initial_position;
+
+	ship* ship_p = &Ships[Player_obj->instance];
+
+	if ( Ets_bar.first_frame < 0 ) {
+		return;
+	}
+
+	// if at least two gauges are not shown, don't show any
+	i = 0;
+	if (!ship_has_energy_weapons(ship_p)) i++;
+	if (Player_obj->flags & OF_NO_SHIELDS) i++;
+	if (!ship_has_engine_power(ship_p)) i++;
+	if (i >= 2) return;
+
+	setGaugeColor();
+
+	// draw the letters for the gauges first, before any clipping occurs
+	// skip letter for any missing gauges (max one, see check above)
+	initial_position = 0;
+	if (ship_has_energy_weapons(ship_p)) {
+		Letter = Letters[0];
+		position[0] = Gauge_positions[initial_position++];
+		renderPrintf(position[0] + Letter_offsets[0], position[1] + Letter_offsets[1], NOX("%c"), Letter);
+	}
+	if (!(Player_obj->flags & OF_NO_SHIELDS)) {
+		Letter = Letters[1];
+		position[0] = Gauge_positions[initial_position++];
+		renderPrintf(position[0] + Letter_offsets[0], position[1] + Letter_offsets[1], NOX("%c"), Letter);
+	}
+	if (ship_has_engine_power(ship_p)) {
+		Letter = Letters[2];
+		position[0] = Gauge_positions[initial_position++];
+		renderPrintf(position[0] + Letter_offsets[0], position[1] + Letter_offsets[1], NOX("%c"), Letter);
+	}
+
+	// draw gauges, skipping any gauge that is missing
+	initial_position = 0;
+	if (ship_has_energy_weapons(ship_p)) {
+		Letter = Letters[0];
+		position[0] = Gauge_positions[initial_position++];
+		blitGauge(ship_p->weapon_recharge_index);
+	}
+	if (!(Player_obj->flags & OF_NO_SHIELDS)) {
+		Letter = Letters[1];
+		position[0] = Gauge_positions[initial_position++];
+		blitGauge(ship_p->shield_recharge_index);
+	}
+	if (ship_has_engine_power(ship_p)) {
+		Letter = Letters[2];
+		position[0] = Gauge_positions[initial_position++];
+		blitGauge(ship_p->engine_recharge_index);
+	}
+}
+
+/**
+ * Set ETS letters for retail ETS gauge
+ * Allows for different languages to be used in the hud
+ */
+void HudGaugeEtsRetail::initLetters(char *_letters)
+{
+	int i;
+	for ( i = 0; i < num_retail_ets_gauges; ++i)
+		Letters[i] = _letters[i];
+}
+
+/**
+ * Set the three possible positions for ETS bars
+ */
+void HudGaugeEtsRetail::initGaugePositions(int *_gauge_positions)
+{
+	int i;
+	for ( i = 0; i < num_retail_ets_gauges; ++i)
+		Gauge_positions[i] = _gauge_positions[i];
+}
+
 HudGaugeEtsWeapons::HudGaugeEtsWeapons():
 HudGaugeEts(HUD_OBJECT_ETS_WEAPONS, (int)WEAPONS)
 {
@@ -794,7 +885,7 @@ void HudGaugeEtsWeapons::render(float frametime)
 	if (!ship_has_engine_power(ship_p)) i++;
 	if (i >= 2) return;
 
-	// now actually check if this 
+	// no weapon energy, no weapon gauge
 	if (!ship_has_energy_weapons(ship_p))
 	{
 		return;
@@ -802,6 +893,9 @@ void HudGaugeEtsWeapons::render(float frametime)
 
 	setGaugeColor();
 
+	// draw the letters for the gauge first, before any clipping occurs
+	renderPrintf(position[0] + Letter_offsets[0], position[1] + Letter_offsets[1], NOX("%c"), Letter);
+
 	// draw the gauges for the weapon system
 	blitGauge(ship_p->weapon_recharge_index);
 }
@@ -828,14 +922,17 @@ void HudGaugeEtsShields::render(float frametime)
 	if (!ship_has_engine_power(ship_p)) i++;
 	if (i >= 2) return;
 
-	setGaugeColor();
-
-	// draw the letters for the gauges first, before any clipping occurs
+	// no shields, no shields gauge
 	if (Player_obj->flags & OF_NO_SHIELDS) {
 		return;
 	}
 
-	// draw the gauges for the weapon system
+	setGaugeColor();
+
+	// draw the letters for the gauge first, before any clipping occurs
+	renderPrintf(position[0] + Letter_offsets[0], position[1] + Letter_offsets[1], NOX("%c"), Letter);
+
+	// draw the gauge for the shield system
 	blitGauge(ship_p->shield_recharge_index);
 }
 
@@ -861,13 +958,16 @@ void HudGaugeEtsEngines::render(float frametime)
 	if (!ship_has_engine_power(ship_p)) i++;
 	if (i >= 2) return;
 
-	setGaugeColor();
-
-	// draw the letters for the gauges first, before any clipping occurs
+	// no engines, no engine gauge
 	if (!ship_has_engine_power(ship_p)) {
 		return;
 	}
 
-	// draw the gauges for the weapon system
+	setGaugeColor();
+
+	// draw the letters for the gauge first, before any clipping occurs
+	renderPrintf(position[0] + Letter_offsets[0], position[1] + Letter_offsets[1], NOX("%c"), Letter);
+
+	// draw the gauge for the engine system
 	blitGauge(ship_p->engine_recharge_index);
 }
Index: fs2_open/code/hud/hudets.h
===================================================================
--- fs2_open/code/hud/hudets.h    (revision 8816)
+++ fs2_open/code/hud/hudets.h    (working copy)
@@ -18,6 +18,8 @@ struct object;
 
 #define	ETS_RECHARGE_RATE	4.0f			//	Recharge this percent of total shields/second
 
+const int num_retail_ets_gauges = 3;
+
 extern float Energy_levels[];
 extern int Weapon_energy_cheat;
 
@@ -81,4 +83,16 @@ public:
 	void render(float frametime);
 };
 
+class HudGaugeEtsRetail: public HudGaugeEts
+{
+protected:
+	char Letters[num_retail_ets_gauges];
+	int Gauge_positions[num_retail_ets_gauges];
+public:
+	HudGaugeEtsRetail();
+	void render(float frametime);
+	void initLetters(char *_letters);
+	void initGaugePositions(int *_gauge_positions);
+};
+
 #endif
Index: fs2_open/code/hud/hudparse.cpp
===================================================================
--- fs2_open/code/hud/hudparse.cpp    (revision 8816)
+++ fs2_open/code/hud/hudparse.cpp    (working copy)
@@ -49,7 +49,7 @@ bool Hud_retail = true;
 int Hud_font = -1;
 
 //WARNING: If you add gauges to this array, make sure to bump num_default_gauges!
-int num_default_gauges = 44;
+int num_default_gauges = 42;
 static int retail_gauges[] = {
 	HUD_OBJECT_MESSAGES,
 	HUD_OBJECT_TRAINING_MESSAGES,
@@ -70,9 +70,6 @@ static int retail_gauges[] = {
 	HUD_OBJECT_TARGET_SHIELD,
 	HUD_OBJECT_ESCORT,
 	HUD_OBJECT_MISSION_TIME,
-	HUD_OBJECT_ETS_WEAPONS,
-	HUD_OBJECT_ETS_SHIELDS,
-	HUD_OBJECT_ETS_ENGINES,
 	HUD_OBJECT_TARGET_MONITOR,
 	HUD_OBJECT_EXTRA_TARGET_DATA,
 	HUD_OBJECT_AFTERBURNER,
@@ -94,7 +91,8 @@ static int retail_gauges[] = {
 	HUD_OBJECT_TARGET_TRI,
 	HUD_OBJECT_MISSILE_TRI,
 	HUD_OBJECT_KILLS,
-	HUD_OBJECT_FIXED_MESSAGES
+	HUD_OBJECT_FIXED_MESSAGES,
+	HUD_OBJECT_ETS_RETAIL
 };
 
 flag_def_list Hud_gauge_types[] = {
@@ -146,7 +144,8 @@ flag_def_list Hud_gauge_types[] = {
 	{ "Target direction",	HUD_OBJECT_TARGET_TRI,			0},
 	{ "Missile indicator",	HUD_OBJECT_MISSILE_TRI,			0},
 	{ "Kills",				HUD_OBJECT_KILLS,				0},
-	{ "Fixed messages",		HUD_OBJECT_FIXED_MESSAGES,		0}
+	{ "Fixed messages",		HUD_OBJECT_FIXED_MESSAGES,		0},
+	{ "Ets retail",			HUD_OBJECT_ETS_RETAIL,			0}
 };
 
 int Num_hud_gauge_types = sizeof(Hud_gauge_types)/sizeof(flag_def_list);
@@ -446,6 +445,7 @@ void load_missing_retail_gauges()
 			for(int j = 0; j < num_loaded_gauges; j++) {
 				if(retail_gauges[i] == default_hud_gauges[j]->getObjectType()) {
 					retail_gauge_loaded = true;
+					break;
 				}
 			}
 
@@ -707,6 +707,9 @@ int parse_gauge_type()
 	if(optional_string("+ETS Engines:")) 
 		return HUD_OBJECT_ETS_ENGINES;
 
+	if(optional_string("+ETS Retail:"))
+		return HUD_OBJECT_ETS_RETAIL;
+
 	if(optional_string("+Target Monitor:")) 
 		return HUD_OBJECT_TARGET_MONITOR;
 
@@ -868,6 +871,9 @@ void load_gauge(int gauge, int base_w, int base_h, int font, int ship_idx, color
 	case HUD_OBJECT_ETS_ENGINES:
 		load_gauge_ets_engines(base_w, base_h, font, ship_idx, use_clr);
 		break;
+	case HUD_OBJECT_ETS_RETAIL:
+		load_gauge_ets_retail(base_w, base_h, font, ship_idx, use_clr);
+		break;
 	case HUD_OBJECT_TARGET_MONITOR:
 		load_gauge_target_monitor(base_w, base_h, font, ship_idx, use_clr);
 		break;
@@ -2312,6 +2318,139 @@ void load_gauge_throttle(int base_w, int base_h, int font, int ship_index, color
 	}
 }
 
+/**
+ * Load retail style ETS gauge
+ * i.e. treats weapons, shields & engines gauges as a single gauge
+ */
+void load_gauge_ets_retail(int base_w, int base_h, int hud_font, int ship_index, color *use_clr)
+{
+	int coords[2];
+	int base_res[2];
+	int bar_h;
+	int letter_offsets[2];
+	int top_offsets[2];
+	int bottom_offsets[2];
+	char ets_letters[num_retail_ets_gauges];
+	char fname[MAX_FILENAME_LEN] = "energy1";
+	bool slew = false;
+	int font_num = FONT1;
+	int colors[3] = {255, 255, 255};
+	bool lock_color = false;
+	int gauge_offset; // distance between micro gauges
+	int i;
+	int gauge_positions[num_retail_ets_gauges];
+
+	if (Lcl_gr) {
+		ets_letters[0] = 'G'; ets_letters[1] = 'S'; ets_letters[2] = 'A'; // German
+	} else if (Lcl_fr) {
+		ets_letters[0] = 'C'; ets_letters[1] = 'B'; ets_letters[2] = 'M'; // French
+	} else {
+		ets_letters[0] = 'G'; ets_letters[1] = 'S'; ets_letters[2] = 'E'; // English
+	}
+
+	// default values which may be overwritten by .tbl
+	if(gr_screen.res == GR_640) {
+		coords[0] = 523;
+		coords[1] = 380;
+
+		base_res[0] = 640;
+		base_res[1] = 480;
+	} else {
+		coords[0] = 880;
+		coords[1] = 648;
+
+		base_res[0] = 1024;
+		base_res[1] = 768;
+	}
+	bar_h = 41;
+	letter_offsets[0] = 2;
+	letter_offsets[1] = 42;
+	top_offsets[0] = 0;
+	top_offsets[1] = 0;
+	bottom_offsets[0] = 0;
+	bottom_offsets[1] = 50;
+	gauge_offset = 20;
+
+	// parse data from .tbl
+	if(check_base_res(base_w, base_h)) {
+		base_res[0] = base_w;
+		base_res[1] = base_h;
+
+		if(optional_string("Position:")) {
+			stuff_int_list(coords, 2);
+		}
+	}
+
+	if ( use_clr != NULL ) {
+		colors[0] = use_clr->red;
+		colors[1] = use_clr->green;
+		colors[2] = use_clr->blue;
+
+		lock_color = true;
+	} else if ( optional_string("Color:") ) {
+		stuff_int_list(colors, 3);
+
+		check_color(colors);
+
+		lock_color = true;
+	}
+
+	if ( optional_string("Font:") ) {
+		stuff_int(&font_num);
+	} else {
+		if ( hud_font >=0 ) {
+			font_num = hud_font;
+		}
+	}
+	if(optional_string("Slew:")) {
+		stuff_boolean(&slew);
+	}
+	if(optional_string("Filename:")) {
+		stuff_string(fname, F_NAME, MAX_FILENAME_LEN);
+	}
+	if(optional_string("Foreground Clip Height:")) {
+		stuff_int(&bar_h);
+	}
+	if(optional_string("Letter Offsets:")) {
+		stuff_int_list(letter_offsets, 2);
+	}
+	if(optional_string("Top Offsets:")) {
+		stuff_int_list(top_offsets, 2);
+	}
+	if(optional_string("Bottom Offsets:")) {
+		stuff_int_list(bottom_offsets, 2);
+	}
+	if(optional_string("Gauge Offset:")) {
+		stuff_int(&gauge_offset);
+	}
+
+	// calculate offsets for the three gauges
+	for (i = 0; i < num_retail_ets_gauges; ++i)
+		gauge_positions[i] = coords[0] + gauge_offset * i;
+
+	HudGaugeEtsRetail* hud_gauge = new HudGaugeEtsRetail();
+
+	hud_gauge->initPosition(coords[0], coords[1]);
+	hud_gauge->initLetters(ets_letters);
+	hud_gauge->initBaseResolution(base_res[0], base_res[1]);
+	hud_gauge->initLetterOffsets(letter_offsets[0], letter_offsets[1]);
+	hud_gauge->initTopOffsets(top_offsets[0], top_offsets[1]);
+	hud_gauge->initBottomOffsets(bottom_offsets[0], bottom_offsets[1]);
+	hud_gauge->initBarHeight(bar_h);
+	hud_gauge->initBitmaps(fname);
+	hud_gauge->initSlew(slew);
+	hud_gauge->initFont(font_num);
+	hud_gauge->updateColor(colors[0], colors[1], colors[2]);
+	hud_gauge->lockConfigColor(lock_color);
+	hud_gauge->initGaugePositions(gauge_positions);
+
+	if(ship_index >= 0) {
+		Ship_info[ship_index].hud_gauges.push_back(hud_gauge);
+	} else {
+		default_hud_gauges.push_back(hud_gauge);
+	}
+}
+
 void load_gauge_ets_weapons(int base_w, int base_h, int font, int ship_index, color *use_clr)
 {
 	int coords[2];
@@ -6249,4 +6388,4 @@ void load_gauge_kills(int base_w, int base_h, int font, int ship_index, color *u
 	} else {
 		default_hud_gauges.push_back(hud_gauge);
 	}
-}
\ No newline at end of file
+}
Index: fs2_open/code/hud/hudparse.h
===================================================================
--- fs2_open/code/hud/hudparse.h    (revision 8816)
+++ fs2_open/code/hud/hudparse.h    (working copy)
@@ -29,7 +29,7 @@ void init_hud();
 void load_missing_retail_gauges();
 void check_color(int *color);
 
-#define NUM_HUD_OBJECT_ENTRIES			54
+#define NUM_HUD_OBJECT_ENTRIES			54		// not used anywhere?
 int parse_gauge_type();
 void load_gauge(int gauge, int base_w = -1, int base_h = -1, int font = -1, int ship_idx = -1, color *use_clr = NULL);
 
@@ -183,4 +183,7 @@ void load_gauge_kills(int base_w, int base_h, int font, int ship_idx = -1, color
 #define HUD_OBJECT_FIXED_MESSAGES		49
 void load_gauge_fixed_messages(int base_w, int base_h, int font, int ship_idx = -1, color *use_clr = NULL);
 
+#define HUD_OBJECT_ETS_RETAIL			50
+void load_gauge_ets_retail(int base_w, int base_h, int hud_font, int ship_idx = -1, color *use_clr = NULL);
+
 #endif // _HUDPARSE_H
