diff --git a/src/ui/interface.cpp b/src/ui/interface.cpp
index c2a956eda..65dc4a65b 100644
--- a/src/ui/interface.cpp
+++ b/src/ui/interface.cpp
@@ -69,7 +69,7 @@ local int SavedMapPositionX[4];	/// Saved map position X
 local int SavedMapPositionY[4];	/// Saved map position Y
 local char Input[80];		/// line input for messages/long commands
 local int InputIndex;		/// current index into input
-local char InputStatusLine[80];	/// Last input status line
+local char InputStatusLine[99];	/// Last input status line
 global char GameRunning;	/// Current running state
 global char GamePaused;		/// Current pause state
 global char OrdersDuringPause;	/// Allow giving orders in pause mode.
@@ -864,6 +864,8 @@ local int CommandKey(int key)
 */
 local int InputKey(int key)
 {
+    char ChatMessage[sizeof(Input)+40];
+
     switch (key) {
 	case '\r':
 	    if (Input[0] == '(') {
@@ -953,7 +955,8 @@ local int InputKey(int key)
 		    // FIXME: only to selected players ...
 		}
 	    }
-	    NetworkChatMessage(Input);
+	    sprintf(ChatMessage, "<%s> %s", ThisPlayer->Name, Input);
+	    NetworkChatMessage(ChatMessage);
 
 	case '\033':
 	    ClearStatusLine();
diff --git a/src/ui/mainscr.cpp b/src/ui/mainscr.cpp
index ec40c5dc6..786a1024d 100644
--- a/src/ui/mainscr.cpp
+++ b/src/ui/mainscr.cpp
@@ -708,12 +708,28 @@ global void DrawMessage(void)
 */
 local void AddMessage(const char *msg)
 {
+    char *ptr;
+    char *message;
+
     if (MessagesCount == MESSAGES_MAX) {
 	ShiftMessages();
     }
-    DebugCheck(strlen(msg) >= sizeof(Messages[0]));
-    strcpy(Messages[MessagesCount], msg);
+
+    message = Messages[MessagesCount];
+    strncpy(message, msg, sizeof(Messages[0])-1);
+    message[sizeof(Messages[0])-1] = '\0';
+
+    ptr = message + strlen(message);
+
+    while (VideoTextLength(GameFont, message) >= 440+(VideoWidth-640)/2 ) {
+	*--ptr = '\0';
+    }
+
     MessagesCount++;
+
+    if (strlen(msg) != ptr-message) {
+	AddMessage(msg+(ptr-message));
+    }
 }
 
 /**