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)
