Index: code/fred2/fred.rc
===================================================================
--- code/fred2/fred.rc	(revision 4838)
+++ code/fred2/fred.rc	(working copy)
@@ -2246,7 +2246,9 @@
     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
+                    WS_TABSTOP,166,134,99,10
+    CONTROL         "Use Alt Name For Messages",IDC_ALTNAME_FOR_MESSAGES,"Button",BS_3STATE | 
+                    WS_TABSTOP,166,144,110,10
 END
 
 IDD_ADD_VARIABLE DIALOG DISCARDABLE  0, 0, 422, 102
Index: code/fred2/missionsave.cpp
===================================================================
--- code/fred2/missionsave.cpp	(revision 4838)
+++ 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_USE_ALTNAME_FOR_MESSAGES)
+				fout(" \"use-altname-for-messages\"");
 			fout(" )");
 		}
 		// -----------------------------------------------------------
Index: code/fred2/resource.h
===================================================================
--- code/fred2/resource.h	(revision 4838)
+++ 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_ALTNAME_FOR_MESSAGES        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 4838)
+++ 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_ALTNAME_FOR_MESSAGES, m_alt_for_messages);
 	//}}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_ALTNAME_FOR_MESSAGES, OnAltNameForMessages)
 	//}}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, alt_for_messages = 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;
+					alt_for_messages = (shipp->flags2 & SF2_USE_ALTNAME_FOR_MESSAGES) ? 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);
+					alt_for_messages = tristate_set(shipp->flags2 & SF2_USE_ALTNAME_FOR_MESSAGES, alt_for_messages);
 
 					// 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_alt_for_messages.SetCheck(alt_for_messages);
 		
 	m_kdamage.setup(IDC_KDAMAGE, this);
 	m_destroy_value.setup(IDC_DESTROY_VALUE, this);
@@ -795,6 +800,22 @@
 			break;
 	}
 
+	switch (m_alt_for_messages.GetCheck()) {
+		case 1:
+			if ( !(shipp->flags2 & SF2_USE_ALTNAME_FOR_MESSAGES) )
+				set_modified();
+
+			shipp->flags2 |= SF2_USE_ALTNAME_FOR_MESSAGES;
+			break;
+
+		case 0:
+			if ( shipp->flags2 & SF2_USE_ALTNAME_FOR_MESSAGES )
+				set_modified();
+
+			shipp->flags2 &= ~SF2_USE_ALTNAME_FOR_MESSAGES;
+			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::OnAltNameForMessages()
+{
+	if (m_alt_for_messages.GetCheck() == 1) {
+ 		m_alt_for_messages.SetCheck(0);
+	} else {
+		m_alt_for_messages.SetCheck(1);
+	}
 }
\ No newline at end of file
Index: code/fred2/shipflagsdlg.h
===================================================================
--- code/fred2/shipflagsdlg.h	(revision 4838)
+++ 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_alt_for_messages;
 	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 OnAltNameForMessages();
 	//}}AFX_MSG
 	DECLARE_MESSAGE_MAP()
 public:
Index: code/fred2/voiceactingmanager.cpp
===================================================================
--- code/fred2/voiceactingmanager.cpp	(revision 4838)
+++ code/fred2/voiceactingmanager.cpp	(working copy)
@@ -421,8 +421,13 @@
 			strcpy(sender, get_message_sender(message->name));
 			int shipnum = ship_name_lookup(sender);
 
+			// we may have to use the alt-name
+			if ((shipnum >= 0) && (Ships[shipnum].flags2 & SF2_USE_ALTNAME_FOR_MESSAGES) && (*Fred_alt_names[shipnum]))
+			{
+				entry.Replace("$sender", Fred_alt_names[shipnum]);
+			}
 			// we may have to use the callsign
-			if ((shipnum >= 0) && (*Fred_callsigns[shipnum]))
+			else if ((shipnum >= 0) && (*Fred_callsigns[shipnum]))
 			{
 				entry.Replace("$sender", Fred_callsigns[shipnum]);
 			}
Index: code/mission/missionmessage.cpp
===================================================================
--- code/mission/missionmessage.cpp	(revision 4838)
+++ code/mission/missionmessage.cpp	(working copy)
@@ -1988,7 +1988,9 @@
 	strncpy (who_from, q->who_from, NAME_LENGTH);
 
 	// if this is a ship do we use name or callsign?
-	if ( Message_shipnum >= 0 && Ships[Message_shipnum].callsign_index >= 0 ) {
+	if ( Message_shipnum >= 0 && Ships[Message_shipnum].flags2 & SF2_USE_ALTNAME_FOR_MESSAGES && Ships[Message_shipnum].alt_type_index >= 0 ) {
+		mission_parse_lookup_alt_index(Ships[Message_shipnum].alt_type_index, who_from); 
+	} else if ( Message_shipnum >= 0 && Ships[Message_shipnum].callsign_index >= 0 ) {
 		mission_parse_lookup_callsign_index(Ships[Message_shipnum].callsign_index, who_from); 
 	}
 
Index: code/mission/missionparse.cpp
===================================================================
--- code/mission/missionparse.cpp	(revision 4838)
+++ code/mission/missionparse.cpp	(working copy)
@@ -1492,6 +1492,7 @@
 	"always-death-scream",
 	"nav-needslink",
 	"hide-ship-name",
+	"use-altname-for-messages",
 };
 
 
@@ -3436,6 +3437,9 @@
 	
 	if (parse_flags2 & P2_SF2_HIDE_SHIP_NAME)
 		shipp->flags2 |= SF2_HIDE_SHIP_NAME;
+	
+	if (parse_flags2 & P2_SF2_USE_ALTNAME_FOR_MESSAGES)
+		shipp->flags2 |= SF2_USE_ALTNAME_FOR_MESSAGES;
 }
 
 //	Mp points at the text of an object, which begins with the "$Name:" field.
Index: code/mission/missionparse.h
===================================================================
--- code/mission/missionparse.h	(revision 4838)
+++ 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_USE_ALTNAME_FOR_MESSAGES		(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 4838)
+++ code/ship/ship.h	(working copy)
@@ -1281,6 +1281,7 @@
 #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_USE_ALTNAME_FOR_MESSAGES		(1<<17)		// KeldorKatarn - This ship uses its alt-name as message prefix (if no alt-name is specified, this does nothing)
 
 
 // If any of these bits in the ship->flags are set, ignore this ship when targetting
