Index: code/fred2/fred.rc
===================================================================
--- code/fred2/fred.rc	(revision 4839)
+++ code/fred2/fred.rc	(working copy)
@@ -2245,8 +2245,10 @@
                     WS_TABSTOP,166,114,97,10
     CONTROL         "AutoNav Needs Link",IDC_NAV_NEEDSLINK,"Button",
                     BS_3STATE | WS_TABSTOP,166,124,97,10
-    CONTROL         "Hide Ship Name",IDC_HIDE_SHIP_NAME,"Button",BS_3STATE | 
-                    WS_TABSTOP,166,135,99,10
+    CONTROL         "Hide Ship Name And Callsign",IDC_HIDE_SHIP_NAME,"Button",BS_3STATE | 
+                    WS_TABSTOP,166,134,110,10
+    CONTROL         "Hide Ship Name Only",IDC_HIDE_SHIP_NAME_ONLY,"Button",BS_3STATE | 
+                    WS_TABSTOP,166,144,100,10
 END
 
 IDD_ADD_VARIABLE DIALOG DISCARDABLE  0, 0, 422, 102
Index: code/fred2/missionsave.cpp
===================================================================
--- code/fred2/missionsave.cpp	(revision 4839)
+++ code/fred2/missionsave.cpp	(working copy)
@@ -1874,6 +1874,8 @@
 				fout(" \"nav-needslink\"");
 			if (Ships[i].flags2 & SF2_HIDE_SHIP_NAME)
 				fout(" \"hide-ship-name\"");
+			if (Ships[i].flags2 & SF2_HIDE_SHIP_NAME_ONLY)
+				fout(" \"hide-ship-name-only\"");
 			fout(" )");
 		}
 		// -----------------------------------------------------------
Index: code/fred2/resource.h
===================================================================
--- code/fred2/resource.h	(revision 4839)
+++ code/fred2/resource.h	(working copy)
@@ -1082,7 +1082,7 @@
 #define IDC_ENTRY_FORMAT                1590
 #define IDC_NO_REPLACE                  1591
 #define IDC_SKYBOX_MODEL                1592
-#define IDC_ALT_AS_CALLSIGN             1593
+#define IDC_HIDE_SHIP_NAME_ONLY         1593
 #define IDC_DEACTIVATE_AUTOPILOT        1594
 #define IDC_HIDE_SHIP_NAME              1594
 #define ID_FILE_MISSIONNOTES            32771
Index: code/fred2/shipflagsdlg.cpp
===================================================================
--- code/fred2/shipflagsdlg.cpp	(revision 4839)
+++ code/fred2/shipflagsdlg.cpp	(working copy)
@@ -69,6 +69,7 @@
 	DDX_Control(pDX, IDC_NAV_CARRY, m_nav_carry);
 	DDX_Control(pDX, IDC_NAV_NEEDSLINK, m_nav_needslink);
 	DDX_Control(pDX, IDC_HIDE_SHIP_NAME, m_hide_ship_name);
+	DDX_Control(pDX, IDC_HIDE_SHIP_NAME_ONLY, m_hide_ship_name_only);
 	//}}AFX_DATA_MAP
 
 	if (pDX->m_bSaveAndValidate) {  // get dialog control values
@@ -125,6 +126,7 @@
 	ON_BN_CLICKED(IDC_NAV_CARRY, OnNavCarry)
 	ON_BN_CLICKED(IDC_NAV_NEEDSLINK, OnNavNeedslink)
 	ON_BN_CLICKED(IDC_HIDE_SHIP_NAME, OnHideShipName)
+	ON_BN_CLICKED(IDC_HIDE_SHIP_NAME_ONLY, OnHideShipNameOnly)
 	//}}AFX_MSG_MAP
 END_MESSAGE_MAP()
 
@@ -145,7 +147,7 @@
 	int toggle_subsystem_scanning = 0, scannable = 0, kamikaze = 0, no_dynamic = 0, red_alert_carry = 0;
 	int special_warp = 0, disable_messages = 0, guardian = 0, vaporize = 0, stealth = 0, friendly_stealth_invisible = 0;
 	int no_death_scream = 0, always_death_scream = 0;
-	int nav_carry = 0, nav_needslink = 0, hide_ship_name = 0;
+	int nav_carry = 0, nav_needslink = 0, hide_ship_name = 0, hide_ship_name_only = 0;
 	object *objp;
 	ship *shipp;
 	bool ship_in_wing = false;
@@ -185,6 +187,7 @@
 					nav_carry = (shipp->flags2 & SF2_NAVPOINT_CARRY) ? 1 : 0; 
 					nav_needslink = (shipp->flags2 & SF2_NAVPOINT_NEEDSLINK) ? 1 : 0;
 					hide_ship_name = (shipp->flags2 & SF2_HIDE_SHIP_NAME) ? 1 : 0;
+					hide_ship_name_only = (shipp->flags2 & SF2_HIDE_SHIP_NAME_ONLY) ? 1 : 0;
 
 					destroy_before_mission = (shipp->flags & SF_KILL_BEFORE_MISSION) ? 1 : 0;
 					m_destroy_value.init(shipp->final_death_time);
@@ -237,6 +240,7 @@
 					nav_carry = tristate_set(shipp->flags2 & SF2_NAVPOINT_CARRY, nav_carry);
 					nav_needslink = tristate_set(shipp->flags2 & SF2_NAVPOINT_NEEDSLINK, nav_needslink);
 					hide_ship_name = tristate_set(shipp->flags2 & SF2_HIDE_SHIP_NAME, hide_ship_name);
+					hide_ship_name_only = tristate_set(shipp->flags2 & SF2_HIDE_SHIP_NAME_ONLY, hide_ship_name_only);
 
 					// check the final death time and set the internal variable according to whether or not
 					// the final_death_time is set.  Also, the value in the edit box must be set if all the
@@ -303,6 +307,7 @@
 	m_nav_carry.SetCheck(nav_carry);
 	m_nav_needslink.SetCheck(nav_needslink);
 	m_hide_ship_name.SetCheck(hide_ship_name);
+	m_hide_ship_name_only.SetCheck(hide_ship_name_only);
 		
 	m_kdamage.setup(IDC_KDAMAGE, this);
 	m_destroy_value.setup(IDC_DESTROY_VALUE, this);
@@ -795,6 +800,22 @@
 			break;
 	}
 
+	switch (m_hide_ship_name_only.GetCheck()) {
+		case 1:
+			if ( !(shipp->flags2 & SF2_HIDE_SHIP_NAME_ONLY) )
+				set_modified();
+
+			shipp->flags2 |= SF2_HIDE_SHIP_NAME_ONLY;
+			break;
+
+		case 0:
+			if ( shipp->flags2 & SF2_HIDE_SHIP_NAME_ONLY )
+				set_modified();
+
+			shipp->flags2 &= ~SF2_HIDE_SHIP_NAME_ONLY;
+			break;
+	}
+
 	switch (m_guardian.GetCheck()) {
 		case 1:
 			if ( !(shipp->ship_guardian_threshold) )
@@ -1155,4 +1176,13 @@
 	} else {
 		m_hide_ship_name.SetCheck(1);
 	}
+}
+
+void ship_flags_dlg::OnHideShipNameOnly()
+{
+	if (m_hide_ship_name_only.GetCheck() == 1) {
+ 		m_hide_ship_name_only.SetCheck(0);
+	} else {
+		m_hide_ship_name_only.SetCheck(1);
+	}
 }
\ No newline at end of file
Index: code/fred2/shipflagsdlg.h
===================================================================
--- code/fred2/shipflagsdlg.h	(revision 4839)
+++ code/fred2/shipflagsdlg.h	(working copy)
@@ -59,6 +59,7 @@
 	CButton m_nav_carry;
 	CButton m_nav_needslink;
 	CButton m_hide_ship_name;
+	CButton m_hide_ship_name_only;
 	CSpinButtonCtrl	m_destroy_spin;
 	numeric_edit_control m_kdamage;
 	numeric_edit_control m_destroy_value;
@@ -110,6 +111,7 @@
 	afx_msg void OnNavNeedslink();
 	afx_msg void OnAltAsCallsign();
 	afx_msg void OnHideShipName();
+	afx_msg void OnHideShipNameOnly();
 	//}}AFX_MSG
 	DECLARE_MESSAGE_MAP()
 public:
Index: code/fred2/voiceactingmanager.cpp
===================================================================
--- code/fred2/voiceactingmanager.cpp	(revision 4839)
+++ code/fred2/voiceactingmanager.cpp	(working copy)
@@ -421,22 +421,29 @@
 			strcpy(sender, get_message_sender(message->name));
 			int shipnum = ship_name_lookup(sender);
 
-			// we may have to use the callsign
-			if ((shipnum >= 0) && (*Fred_callsigns[shipnum]))
+			// we may have to use the alt name
+			if ((shipnum >= 0) && (Ships[shipnum].flags2 & SF2_HIDE_SHIP_NAME) && (*Fred_alt_names[shipnum]))
 			{
-				entry.Replace("$sender", Fred_callsigns[shipnum]);
+				strcpy(sender, Fred_alt_names[shipnum]);
 			}
-			// use the regular sender text
-			else
+			// we may have to use the class
+			else if ((shipnum >= 0) && (Ships[shipnum].flags2 & SF2_HIDE_SHIP_NAME) && !(*Fred_alt_names[shipnum]))
 			{
-				// skip past the first # when truncating a name,
-				// in case of something like #Command or #Alpha 1
-				end_string_at_first_hash_symbol(&sender[1]);
-
-				// replace sender
-				entry.Replace("$sender", sender);
+				strcpy(sender, Ship_info[Ships[shipnum].ship_info_index].name);
 			}
+			// we may have to use the callsign
+			else if ((shipnum >= 0) && (*Fred_callsigns[shipnum]))
+			{
+				strcpy(sender, Fred_callsigns[shipnum]);
+			}
+			
+			// skip past the first # when truncating a name,
+			// in case of something like #Command or #Alpha 1
+			end_string_at_first_hash_symbol(&sender[1]);
 
+			// replace sender
+			entry.Replace("$sender", sender);
+
 			fout("%s\n\n\n", (char *) (LPCTSTR) entry);
 		}
 	}
Index: code/hud/hudtarget.cpp
===================================================================
--- code/hud/hudtarget.cpp	(revision 4839)
+++ code/hud/hudtarget.cpp	(working copy)
@@ -6750,8 +6750,10 @@
 	// print ship name
 	if ( (Iff_info[shipp->team].flags & IFFF_WING_NAME_HIDDEN) && (shipp->wingnum != -1) ) {
 		*ship_name_text = 0;
-	} else if (shipp->flags2 & SF2_HIDE_SHIP_NAME) {
+	} else if (shipp->flags2 & SF2_HIDE_SHIP_NAME || shipp->flags2 & SF2_HIDE_SHIP_NAME_ONLY && !(*callsign)) {
 		*ship_name_text = 0;
+	} else if (shipp->flags2 & SF2_HIDE_SHIP_NAME_ONLY && (*callsign)) {
+		sprintf(ship_name_text, "%s", callsign);
 	} else if (*callsign) {
 		sprintf(ship_name_text, "%s (%s)", ship_name, callsign);
 	} else {
Index: code/mission/missionmessage.cpp
===================================================================
--- code/mission/missionmessage.cpp	(revision 4839)
+++ code/mission/missionmessage.cpp	(working copy)
@@ -1987,15 +1987,19 @@
 	
 	strncpy (who_from, q->who_from, NAME_LENGTH);
 
-	// if this is a ship do we use name or callsign or ship class?
+	// if this is a ship do we use name or callsign or alt name or ship class?
 	if ( Message_shipnum >= 0 ) {
-		if ( Ships[Message_shipnum].callsign_index >= 0 ) {
+		if ( Ships[Message_shipnum].flags2 & SF2_HIDE_SHIP_NAME ) {
+			if (Ships[Message_shipnum].alt_type_index >= 0) {
+				mission_parse_lookup_alt_index(Ships[Message_shipnum].alt_type_index, who_from);
+			} else {
+				hud_stuff_ship_class(&Ships[Message_shipnum], who_from);
+			}
+		} else if ( Ships[Message_shipnum].callsign_index >= 0 ) {
 			mission_parse_lookup_callsign_index(Ships[Message_shipnum].callsign_index, who_from);
-		} else if ( Ships[Message_shipnum].flags2 & SF2_HIDE_SHIP_NAME ) {
-			hud_stuff_ship_class(&Ships[Message_shipnum], who_from);
-		} else {
-			end_string_at_first_hash_symbol(who_from);
 		}
+
+		end_string_at_first_hash_symbol(who_from);
 	}
 
 	HUD_sourced_printf( q->source, NOX("%s: %s"), who_from, buf );
Index: code/mission/missionparse.cpp
===================================================================
--- code/mission/missionparse.cpp	(revision 4839)
+++ code/mission/missionparse.cpp	(working copy)
@@ -1492,6 +1492,7 @@
 	"always-death-scream",
 	"nav-needslink",
 	"hide-ship-name",
+	"hide-ship-name-only",
 };
 
 
@@ -3436,6 +3437,9 @@
 	
 	if (parse_flags2 & P2_SF2_HIDE_SHIP_NAME)
 		shipp->flags2 |= SF2_HIDE_SHIP_NAME;
+	
+	if (parse_flags2 & P2_SF2_HIDE_SHIP_NAME_ONLY)
+		shipp->flags2 |= SF2_HIDE_SHIP_NAME_ONLY;
 }
 
 //	Mp points at the text of an object, which begins with the "$Name:" field.
Index: code/mission/missionparse.h
===================================================================
--- code/mission/missionparse.h	(revision 4839)
+++ code/mission/missionparse.h	(working copy)
@@ -742,12 +742,12 @@
 #define	MAX_GOAL_TYPE_NAMES	3
 
 // alternate ship type names
-#define MAX_ALT_TYPE_NAMES				25
+#define MAX_ALT_TYPE_NAMES				100
 extern char Mission_alt_types[MAX_ALT_TYPE_NAMES][NAME_LENGTH];
 extern int Mission_alt_type_count;
 
 // callsign
-#define MAX_CALLSIGNS					25
+#define MAX_CALLSIGNS					100
 extern char Mission_callsigns[MAX_CALLSIGNS][NAME_LENGTH];
 extern int Mission_callsign_count;
 
@@ -958,7 +958,7 @@
 // same caveat: This list of bitfield indicators MUST correspond EXACTLY
 // (i.e., order and position must be the same) to its counterpart in MissionParse.cpp!!!!
 
-#define MAX_PARSE_OBJECT_FLAGS_2	13
+#define MAX_PARSE_OBJECT_FLAGS_2	14
 
 #define P2_SF2_PRIMITIVE_SENSORS			(1<<0)
 #define P2_SF2_NO_SUBSPACE_DRIVE			(1<<1)
@@ -973,6 +973,7 @@
 #define P2_SF2_ALWAYS_DEATH_SCREAM			(1<<10)
 #define P2_SF2_NAV_NEEDSLINK				(1<<11)
 #define P2_SF2_HIDE_SHIP_NAME				(1<<12)
+#define P2_SF2_HIDE_SHIP_NAME_ONLY			(1<<13)
 
 // and again: these flags do not appear in the array
 //#define blah							(1<<29)
Index: code/ship/ship.h
===================================================================
--- code/ship/ship.h	(revision 4839)
+++ code/ship/ship.h	(working copy)
@@ -1280,7 +1280,8 @@
 #define SF2_ALWAYS_DEATH_SCREAM				(1<<13)		// Goober5000 - for WCS
 #define SF2_NAVPOINT_NEEDSLINK				(1<<14)		// Kazan	- This ship requires "linking" for autopilot (when player ship gets within specified distance SF2_NAVPOINT_NEEDSLINK is replaced by SF2_NAVPOINT_CARRY)
 #define SF2_HIDE_SHIP_NAME					(1<<15)		// Karajorma - Hides the ships name (like the -wcsaga command line used to but for any selected ship)
-#define SF2_AFTERBURNER_LOCKED				(1<<16)		// KeldorKatarn - This ship can't use its afterburners
+#define SF2_HIDE_SHIP_NAME_ONLY				(1<<16)		// KeldorKatarn - Hides the ships name but keeps showing the callsign
+#define SF2_AFTERBURNER_LOCKED				(1<<17)		// KeldorKatarn - This ship can't use its afterburners
 
 
 // If any of these bits in the ship->flags are set, ignore this ship when targetting
