diff --git a/std/player/base.c b/std/player/base.c
index 71591e2..e39f33a 100644
--- a/std/player/base.c
+++ b/std/player/base.c
@@ -3554,6 +3554,7 @@
 static string _set_tty(string str) {
   if(str != "dumb" && str != "vt100" && str != "ansi")
     return Query(P_TTY);
+  comm::set_colourmap(str);
   return Set(P_TTY, str);
 }
 
diff --git a/std/player/comm.c b/std/player/comm.c
index 0d5471d..7025a86 100644
--- a/std/player/comm.c
+++ b/std/player/comm.c
@@ -37,6 +37,8 @@
 #include <strings.h>
 #include <regexp.h>
 #include <interactive_info.h>
+#include <ansi.h>
+#include <assert.h>
 
 #define TELLHIST_DISABLED   0
 #define TELLHIST_NO_MESSAGE 1
@@ -68,6 +70,11 @@
                                              index: -1,);
 #define MAX_KOBOLD_LIMIT 256
 
+// Colourmap
+// TODO: spaeter konfigurierbar machen
+private mapping build_colourmap(string ttype="ansi");
+private nosave mapping colourmap = build_colourmap();
+
 varargs string name(int casus, int demonst);
 
 //local property prototypes
@@ -101,6 +108,46 @@
   set_next_reset(-1);
 }
 
+private mapping build_colourmap(string ttype)
+{
+  mapping res = ([0:""]);
+  switch(ttype)
+  {
+    case "dumb":
+      return res;
+    case "ansi":
+      res = ([ 0:ANSI_NORMAL, "normal": ANSI_NORMAL,
+               "bold": ANSI_BOLD, "underlined": ANSI_UNDERL,
+               "blink": ANSI_BLINK, "invers": ANSI_INVERS,
+               "black": ANSI_BLACK, "red": ANSI_RED,
+               "green": ANSI_GREEN, "yellow": ANSI_YELLOW,
+               "blue": ANSI_BLUE, "purple": ANSI_PURPLE,
+               "cyan": ANSI_CYAN, "white": ANSI_WHITE,
+               "bg_black": ANSI_BG_BLACK, "bg_red": ANSI_BG_RED,
+               "bg_green": ANSI_BG_GREEN, "bg_yellow": ANSI_BG_YELLOW,
+               "bg_blue": ANSI_BG_BLUE, "bg_purple": ANSI_BG_PURPLE,
+               "bg_cyan": ANSI_BG_CYAN, "bg_white": ANSI_BG_WHITE,
+               "mention": ANSI_BOLD+ANSI_BG_BLUE,
+             ]);
+      break;
+    case "vt100":
+      res += ([0:ANSI_NORMAL, "normal": ANSI_NORMAL,
+               "bold": ANSI_BOLD, "underlined": ANSI_UNDERL,
+               "blink": ANSI_BLINK, "invers": ANSI_INVERS,
+               "mention": ANSI_BOLD,
+              ]);
+      break;
+    default:
+       assert(1, "Ungueltiger Terminaltyp in build_colourmap");
+  }
+  return res;
+}
+
+protected void set_colourmap(string ttype="ansi")
+{
+  colourmap = build_colourmap(ttype);
+}
+
 // called from base.c in Reconnect()
 protected void reconnect() {
   // Cache fuer den report zuruecksetzen, der koennte veraltet sein (insb.
@@ -109,6 +156,9 @@
 }
 
 protected void updates_after_restore(int newflag) {
+  // Colourmap aktualisieren nach Restore
+  colourmap = build_colourmap(QueryProp(P_TTY));
+
   // Altes Ignoriere loeschen...
   mixed ign = Query(P_IGNORE,F_VALUE);
   if (!mappingp(ign))
@@ -469,8 +519,9 @@
       // worden, aber einige Nachrichten sind schon geloescht.
       if (!structp(msg)) continue;
       // Ausgabe via efun::tell_object(), weil die Arbeit von ReceiveMsg()
-      // schon getan wurde. Allerdings muessen wir uns noch um den UMbruch
-      // kuemmern.
+      // schon getan wurde. Allerdings muessen wir uns noch um den Umbruch
+      // und Farben kuemmern.
+      msg->msg = terminal_colour(msg->msg, colourmap);
       if ((msg->type) & MSG_DONT_WRAP)
         msg->msg = (msg->prefix ? msg->prefix : "") + msg->msg;
       else
@@ -532,7 +583,12 @@
      (name == ignore[0] && member(ignore[1..], verb) != -1));
 }
 
-private void comm_beep(string msg_action)
+// Die Nachricht kommt mit einem Alert oder Mention. comm_beep() prueft, ob
+// ein Piepston ausgegeben werden soll (langfristig andere Benachrichtigungen
+// geplant!).
+// Ueblicherweise werden nur alle <P_MESSAGE_BEEP> Sekunden Toene
+// uebermittelt.
+private void comm_beep(string msg_action, int mention=0)
 {
   // Wenn Alerts komplett abgeschaltet sind, gibts nix.
   int alert_config = ({int})QueryProp(P_ALERT);
@@ -563,6 +619,9 @@
         required |= MB_MISC;
         break;
   }
+  if (mention)
+      required |= MB_MENTION;
+
   // wenn in alert min. ein notwendiges Flag drin ist darf gepiepst werden
   if (required & alert_config)
   {
@@ -1031,6 +1090,7 @@
         "sag": MB_SAY, "sage": MB_SAY,
         "ebene": MB_CHANNEL, "ebenen": MB_CHANNEL,
         "ruf": MB_SHOUT, "rufe": MB_SHOUT,
+        "erwaehnung": MB_MENTION, "erwaehnungen": MB_MENTION,
         "sonstige": MB_MISC, "sonstiges": MB_MISC,
         "alle": MB_ALL, "alles": MB_ALL,
         ]);
@@ -1064,6 +1124,7 @@
     MB_SAY: "sage",
     MB_TELL: "teile mit",
     MB_CHANNEL: "Ebenenmeldungen",
+    MB_MENTION: "Erwaehnungen",
     MB_SHOUT: "rufe",
     MB_MISC: "sonstige",]);
   string types = CountUp(map(filter(m_indices(text), #'_alert_filter_flags), text));
@@ -1702,7 +1763,8 @@
                               data[0..ptr-1],
          function string (struct stored_msg_s msg) {
              if (!structp(msg)) return "";
-               return break_string( msg->msg + " <"
+               return break_string(terminal_colour(msg->msg, colourmap)
+                 + " <"
                  + strftime("%H:%M:%S",msg->timestamp) + ">", 78,
                  msg->prefix || "", msg->prefix ? BS_LEAVE_MY_LFS : 0);
          } ) ) );
@@ -1982,6 +2044,34 @@
     if (res) return res;
   }
 
+  // Mentions in der Form @Charname werden in Kommunikation oder beim Hoeren
+  // von Rufen und Sagen markiert und gegebenfalls gibt es ein Pieps dafuer
+  int mention;
+  if ((type & MT_COMM)
+      || ((type & MT_LISTEN) && msg_action in ({MA_SAY, MA_SHOUT}))
+      )
+  {
+    // Um den Charnamen Tags fuer terminal_colour() einfuegen.
+    // Lookahead und Lookbehind assertions um die Whitespaces um das Wort
+    // nicht in den Match einzuschliessen (und zu ersetzen).
+    string tmp = regreplace(msg,
+                    sprintf("(?<=\\s)@%s(?=\\s*)",getuid(ME)),
+                    sprintf("%%^mention%%^@%s%%^normal%%^",
+                            capitalize(getuid(ME))),
+                    RE_PCRE|RE_GLOBAL|RE_CASELESS);
+    send_debug(ME, tmp);
+    // Der Vergleich ist weniger schlimm als es aussieht, weil die Strings
+    // unterschiedlich gross sein werden und daher nicht zeichenweise
+    // verglichen werden muessen. Es ist dann jedenfalls schneller als
+    // getrennt mit regmatch oder strstr zu schauen, ob @charname
+    // vorkommt.
+    if (tmp != msg)
+    {
+        msg = tmp;
+        mention = 1;
+    }
+  }
+
   // Fuer MT_COMM gibt es ein paar Sonderdinge zu machen.
   if ((type & MT_COMM))
   {
@@ -2032,8 +2122,12 @@
     }
   }
 
-  if ((msg_type & MSG_ALERT))
-    comm_beep(msg_action);
+  // Farbtags ersetzen
+  msg = terminal_colour(msg, colourmap);
+
+  // Alertton senden?
+  if ((msg_type & MSG_ALERT) || mention)
+    comm_beep(msg_action, mention);
 
   // Ausgabenachricht bauen und an den Spieler senden.
   if (flags & MSG_DONT_WRAP)
