diff -u --recursive src-original/channel.c src/channel.c
--- src-original/channel.c	Wed Feb 14 11:42:18 2001
+++ src/channel.c	Wed Feb 14 13:10:15 2001
@@ -942,6 +942,12 @@
 	ADDSTACK("<ignoring>\n");
     }
 
+    ADDSTACK("Coloured names               ");
+    if (p2->misc_flags & NO_CNAME)
+      ADDSTACK("<ignoring>\n");
+    else
+      ADDSTACK("<seeing>\n");
+
     ENDSTACK("\n" LINE);
     tell_player(p, oldstack);
     stack = oldstack;
@@ -963,6 +969,8 @@
     toggle_yes_dynatext(p, "");
   else if (strstr(str, "deb") && p->residency & DEBUG)
     toggle_debug_channel(p, "");
+  else if (strstr(str, "cna") || strstr(str, "col"))
+    toggle_cname(p);
   else
   {
     tell_player(p, " Format: muffle <section>\n"
@@ -971,7 +979,7 @@
       tell_player(p, ", spod");
     if (p->residency & DEBUG)
       tell_player(p, ", debug");
-    tell_player(p, ", session, clock, dynatext\n");
+    tell_player(p, ", session, clock, dynatext, cname\n");
   }
 }
 
diff -u --recursive src-original/commands.c src/commands.c
--- src-original/commands.c	Wed Feb 14 11:42:18 2001
+++ src/commands.c	Wed Feb 14 13:17:01 2001
@@ -512,10 +512,10 @@
     {
       if (emote_no_break(*p->idle_msg))
 	TELLPLAYER(p, " Idle message set to ....\n%s%s\nuntil you type a"
-		   " new command.\n", full_name(p), p->idle_msg);
+		   " new command.\n", full_name(p,p), p->idle_msg);
       else
 	TELLPLAYER(p, " Idle message set to ....\n%s %s\nuntil you type a"
-		   " new command.\n", full_name(p), p->idle_msg);
+		   " new command.\n", full_name(p,p), p->idle_msg);
     }
   }
   else
diff -u --recursive src-original/dynatext.c src/dynatext.c
--- src-original/dynatext.c	Wed Feb 14 11:42:18 2001
+++ src/dynatext.c	Wed Feb 14 14:23:43 2001
@@ -120,7 +120,7 @@
 	switch (*(scan + 4))
 	{
 	  case 'n':
-	    strcpy(stack, target->name);
+	    strcpy(stack, get_cname(target,p));
 	    break;
 	  case 'f':
 	    strcpy(stack, time_diff(target->jetlag));
@@ -188,7 +188,7 @@
 	scan += 3;
       }
       else if (target)		/* well, let them get just name if alone */
-	strcpy(stack, target->name);
+	strcpy(stack, get_cname(target,p));
       scan += 2;
       stack = strchr(stack, 0);
       if (z)
diff -u --recursive src-original/examine.c src/examine.c
--- src-original/examine.c	Wed Feb 14 11:42:18 2001
+++ src/examine.c	Wed Feb 14 13:17:22 2001
@@ -688,7 +688,7 @@
   if (p2 != &dummy)
   {
     sprintf(stack, "%s has been logged in for %s since\n%s.\n",
-	    full_name(p2), word_time(time(0) - (p2->on_since)),
+	    full_name(p2,p), word_time(time(0) - (p2->on_since)),
 	    convert_time(p2->on_since));
   }
   else if (p2->saved)
@@ -935,14 +935,14 @@
   {
     if (emote_no_break(*p2->title))
       ADDSTACK(LINE "%s %s%s^N \n"
-	       LINE, p2->pretitle, p2->name, p2->title);
+	       LINE, p2->pretitle, get_cname(p2, p), p2->title);
     else
       ADDSTACK(LINE "%s %s %s^N \n"
-	       LINE, p2->pretitle, p2->name, p2->title);
+	       LINE, p2->pretitle, get_cname(p2,p), p2->title);
   }
   else
     ADDSTACK(LINE "%s %s^N \n"
-	     LINE, p2->name, p2->title);
+	     LINE, get_cname(p2,p), p2->title);
 
   if (p->jetlag)
   {
@@ -1170,9 +1170,9 @@
     if (*p2->pretitle)
       ADDSTACK("%s ", p2->pretitle);
     if (emote_no_break(*p2->title))
-      ADDSTACK("%s%s^N \n", p2->name, p2->title);
+      ADDSTACK("%s%s^N \n", get_cname(p2, p), p2->title);
     else
-      ADDSTACK("%s %s^N \n", p2->name, p2->title);
+      ADDSTACK("%s %s^N \n", get_cname(p2, p), p2->title);
     pstack_mid("Description");
     ADDSTACK("%s^N \n"
 	     LINE, p2->description);
@@ -1181,10 +1181,10 @@
   {
     if (emote_no_break(*p2->title))
       ADDSTACK(LINE
-	       "%s %s%s^N \n" LINE, p2->pretitle, p2->name, p2->title);
+	       "%s %s%s^N \n" LINE, p2->pretitle, get_cname(p2, p), p2->title);
     else
       ADDSTACK(LINE
-	       "%s %s %s^N \n" LINE, p2->pretitle, p2->name, p2->title);
+	       "%s %s %s^N \n" LINE, p2->pretitle, get_cname(p2, p), p2->title);
   }
   if (p == p2 || p->residency & SU || p2->custom_flags & PUBLIC_SITE ||
       (l && l->flags & FRIEND && p2->custom_flags & FRIEND_SITE))
diff -u --recursive src-original/glue.c src/glue.c
--- src-original/glue.c	Wed Feb 14 11:42:18 2001
+++ src/glue.c	Wed Feb 14 13:18:07 2001
@@ -708,12 +708,12 @@
 
 /* returns the 'full' name of someone, that is their pretitle and name */
 
-char *full_name(player * p)
+char *full_name(player * p, player *t)
 {
-  static char fname[MAX_PRETITLE + MAX_NAME];
+  static char fname[(MAX_PRETITLE + MAX_NAME) * 4];
   if ((!(sys_flags & NO_PRETITLES)) && (p->residency & BASE) && p->pretitle[0])
   {
-    sprintf(fname, "%s %s", p->pretitle, p->name);
+    sprintf(fname, "%s %s", p->pretitle, get_cname(p, t));
     return fname;
   }
-  return p->name;
+  return get_cname(p, t);
diff -u --recursive src-original/include/clist.h src/include/clist.h
--- src-original/include/clist.h	Wed Feb 14 11:42:18 2001
+++ src/include/clist.h	Wed Feb 14 12:14:41 2001
@@ -217,6 +217,8 @@
 extern command_func list_channels, join_channel, leave_channel, hichan,
                     block_all_channels, iu, ie, is, it, i_who;
 
+extern command_func cname;
+
 /* dummy commands for stack checks */
 
 struct command  input_to = {"input_to fn", 0, 0, 0, 0, 0, 0};
@@ -625,6 +627,7 @@
 {"clist", clear_list, LIST, 0, 1, 0, LISTc},
 {"clog", show_logs, SU, 0, 1, 0, SUPERc},
 {"cls", clear_screen, 0, 0, 1, 0, MISCc},
+{"cname", cname, BASE, 0, 1, 0, DESCc},
 {"color", toggle_color, 0, 0, 1, 0, SYSc},
 {"colorize", customize_colors, 0, 0, 1, 0, SYSc},
 {"colour", toggle_color, 0, 0, 1, 0, INVISc},
diff -u --recursive src-original/include/player.h src/include/player.h
--- src-original/include/player.h	Wed Feb 14 11:42:18 2001
+++ src/include/player.h	Wed Feb 14 12:13:15 2001
@@ -356,6 +356,8 @@
 #define edPADBIT3 		(1<<28)
 #define edINSERT_BEFORE		(1<<29)		/* obvious really */
 
+#define NO_CNAME                (1<<30)  /* whether you see cname's */
+
 /* list flags */
 
 #define NOISY			(1<<0)
@@ -866,6 +868,7 @@
           finger_message[MAX_MQUIT + 2], /* mquit message, shown on finger */
           swarn_sender[MAX_NAME + 2],    /* su that made saved warn */
           swarn_message[MAX_SWARN + 2],  /* saved warn message */
+          cname[MAX_NAME + 1],   /* coloured names - ick! */
 
              /* non saved */
 
diff -u --recursive src-original/include/proto.h src/include/proto.h
--- src-original/include/proto.h	Wed Feb 14 11:42:18 2001
+++ src/include/proto.h	Wed Feb 14 14:19:04 2001
@@ -26,7 +26,7 @@
 extern char *do_pipe(player *, char *);
 extern char *end_string(char *);
 extern char *first_char(player *);
-extern char *full_name(player *);
+extern char *full_name(player *, player *);
 extern char *gender_raw(player *);
 /* EWE */
 extern void ewe_version(void);
@@ -564,6 +564,7 @@
 extern file     config_msg, admin_msg, shutdowns_msg, frogs_msg, plists_msg, 
                 pdefaults_msg, session_msg, deflog_msg, rooms_msg;
 
-
-
-
+extern char *get_cname(player *, player *);
+extern int valid_char_col(char);
+extern void toggle_cname(player *);
+extern void cname_version(void);
diff -u --recursive src-original/intercom_glue.c src/intercom_glue.c
--- src-original/intercom_glue.c	Wed Feb 14 11:42:18 2001
+++ src/intercom_glue.c	Thu Feb 15 11:02:45 2001
@@ -572,7 +572,7 @@
   dummy.residency = NON_RESIDENT;
 
   dummy.term_width = 79;  /* will cause probs for people with <79 widths */
-  dummy.misc_flags = NOCOLOR;  /* PG+ specific */
+  dummy.misc_flags = NOCOLOR|NO_CNAME;  /* PG+ specific */
 
   return (&dummy);
 }
diff -u --recursive src-original/plists.c src/plists.c
--- src-original/plists.c	Wed Feb 14 11:42:18 2001
+++ src/plists.c	Wed Feb 14 12:21:02 2001
@@ -771,6 +771,8 @@
     stack = store_string(stack, p->channels[i]);
   stack = store_int(stack, p->dsc_flags);
 
+  stack = store_string(stack, p->cname);
+
 /* end of my spooning... (well, not the end of me spooning, but the end of this mega-batch) */
   d.length = (int) stack - (int) d.where;
   stack = d.where;
@@ -1073,6 +1075,7 @@
     r = get_string_safe(p->channels[i], r, sp->data);
   r = get_int_safe(&p->dsc_flags, r, sp->data);
 
+  r = get_string_safe(p->cname, r, sp->data);
 
   if (((p->term_width) >> 1) <= (p->word_wrap))
     p->word_wrap = (p->term_width) >> 1;
diff -u --recursive src-original/room.c src/room.c
--- src-original/room.c	Wed Feb 14 11:42:18 2001
+++ src/room.c	Wed Feb 14 13:29:01 2001
@@ -1440,9 +1440,9 @@
       for (i = count; i; i--, list++)
       {
 	if (emote_no_break(*(*list)->title))
-	  sprintf(stack, "%s%s^N\n", (*list)->name, (*list)->title);
+	  sprintf(stack, "%s%s^N\n", get_cname(*list, p), (*list)->title);
 	else
-	  sprintf(stack, "%s %s^N\n", (*list)->name, (*list)->title);
+	  sprintf(stack, "%s %s^N\n", get_cname(*list, p), (*list)->title);
 	stack = strchr(stack, 0);
       }
   }
@@ -3074,7 +3074,7 @@
       (!l || (l && !(l->flags & FIND))))
   {
     sprintf(stack, " %s is in hiding, so you don't know where %s is.\n",
-	    full_name(p2), gstring(p2));
+	    full_name(p2,p), gstring(p2));
     stack = end_string(stack);
     tell_player(p, oldstack);
     stack = oldstack;
@@ -3083,7 +3083,7 @@
   r = p2->location;
   if (!r)
   {
-    sprintf(stack, " %s doesn't appear to be anywhere !\n", full_name(p2));
+    sprintf(stack, " %s doesn't appear to be anywhere !\n", full_name(p2,p));
     stack = end_string(stack);
     tell_player(p, oldstack);
     stack = oldstack;
@@ -3092,7 +3092,7 @@
   if (r == p->location)
   {
     sprintf(stack, " You are already in the same room as %s.\n",
-	    full_name(p2));
+	    full_name(p2,p));
     stack = end_string(stack);
     tell_player(p, oldstack);
     stack = oldstack;
@@ -3563,7 +3563,7 @@
       sprintf(stack, "  %s %s (%s idle)\n", inroom->name, inroom->title,
 	      word_time(inroom->idle));
     else
-      sprintf(stack, "  %s %s (%s idle)\n", full_name(inroom),
+      sprintf(stack, "  %s %s (%s idle)\n", full_name(inroom,p),
 	      inroom->title, word_time(inroom->idle));
     stack = strchr(stack, 0);
     inroom = inroom->room_next;
diff -u --recursive src-original/socials.c src/socials.c
--- src-original/socials.c	Wed Feb 14 11:42:18 2001
+++ src/socials.c	Wed Feb 14 13:19:36 2001
@@ -424,13 +424,13 @@
   strncpy(ret, replace(ret, "%himher", get_gender_string(p)), siz);
   strncpy(ret, replace(ret, "%heshe", gstring(p)), siz);
-  strncpy(ret, replace(ret, "%name", p->name), siz);
+  strncpy(ret, replace(ret, "%name", get_cname(p, current_player)), siz);
-  strncpy(ret, single_replace(ret, "%fullname", full_name(p)), siz);
+  strncpy(ret, single_replace(ret, "%fullname", full_name(p,current_player)), siz);
 
   strncpy(ret, replace(ret, "%t_hisher", gstring_possessive(targ)), siz);
   strncpy(ret, replace(ret, "%t_himher", get_gender_string(targ)), siz);
   strncpy(ret, replace(ret, "%t_heshe", gstring(targ)), siz);
-  strncpy(ret, replace(ret, "%t_name", targ->name), siz);
+  strncpy(ret, replace(ret, "%t_name", get_cname(targ, current_player)), siz);
-  strncpy(ret, single_replace(ret, "%t_fullname", full_name(targ)), siz);
+  strncpy(ret, single_replace(ret, "%t_fullname", full_name(targ, current_player)), siz);
 
   strncpy(ret, single_replace(ret, "%str", arg), siz);
 
diff -u --recursive src-original/tag.c src/tag.c
--- src-original/tag.c	Wed Feb 14 11:42:18 2001
+++ src/tag.c	Wed Feb 14 14:13:27 2001
@@ -31,7 +31,7 @@
     if (current_player->custom_flags & NOPREFIX)
       len = strlen((*scan)->name) + 1;
     else
-      len = strlen(full_name(*scan)) + 1;
+      len = (strlen((*scan)->name) + strlen((*scan)->pretitle)) + 1;
     if (len > max_length)
       max_length = len;
   }
@@ -44,10 +44,15 @@
   for (scan = list, n = count; n; n--, scan++)
   {
     if (current_player->custom_flags & NOPREFIX)
-      fname = (*scan)->name;
+    {
+      fname = get_cname(*scan, current_player);
+      len = strlen((*scan)->name);
+    }
     else
-      fname = full_name(*scan);
-    len = strlen(fname);
+    {
+      fname = full_name(*scan, current_player);
+      len = (strlen((*scan)->name) + strlen((*scan)->pretitle));
+    }
     for (m = (max_length - len); m; m--)
       *stack++ = ' ';
 
@@ -541,7 +546,7 @@
   }
   if (tagged == p)
     return "you";
-  return tagged->name;
+  return get_cname(tagged, p);
 }
 
 /* self string */
diff -u --recursive src-original/talking.c src/talking.c
--- src-original/talking.c	Wed Feb 14 11:42:18 2001
+++ src/talking.c	Wed Feb 14 14:10:43 2001
@@ -32,20 +32,20 @@
 void do_format(player * p, player * s, char *str, char *mid, char *pip, int type)
 {
 
-  char tname[MAX_PRETITLE + MAX_NAME + 3];
+  char tname[(MAX_PRETITLE + MAX_NAME + 3) * 4];
 
   if (s->custom_flags & (NOPREFIX | NOEPREFIX))
-    strcpy(tname, p->name);
+    strcpy(tname, get_cname(p, s));
   else
-    strcpy(tname, full_name(p));
+    strcpy(tname, full_name(p,s));
 
   switch (type)
   {
     case 0:			/* say */
       if (s->custom_flags & NOPREFIX)
-	sprintf(stack, "%s %s '%s^N'\n", p->name, mid, pip);
+	sprintf(stack, "%s %s '%s^N'\n", get_cname(p, s), mid, pip);
       else
-	sprintf(stack, "%s %s '%s^N'\n", full_name(p), mid, pip);
+	sprintf(stack, "%s %s '%s^N'\n", full_name(p,s), mid, pip);
       break;
     case 1:			/* emote, pemote, socials */
       if (emote_no_break(*str))
@@ -58,15 +58,15 @@
       break;
     case 3:			/* think */
       if (s->custom_flags & NOPREFIX)
-	sprintf(stack, "%s thinks . o O ( %s ^N)\n", p->name, pip);
+	sprintf(stack, "%s thinks . o O ( %s ^N)\n", get_cname(p, s), pip);
       else
-	sprintf(stack, "%s thinks . o O ( %s ^N)\n", full_name(p), pip);
+	sprintf(stack, "%s thinks . o O ( %s ^N)\n", full_name(p,s), pip);
       break;
     case 4:			/* sing */
       if (s->custom_flags & NOPREFIX)
-	sprintf(stack, "%s sings o/~ %s ^No/~\n", p->name, pip);
+	sprintf(stack, "%s sings o/~ %s ^No/~\n", get_cname(p, s), pip);
       else
-	sprintf(stack, "%s sings o/~ %s ^No/~\n", full_name(p), pip);
+	sprintf(stack, "%s sings o/~ %s ^No/~\n", full_name(p,s), pip);
       break;
     default:
       break;
@@ -680,7 +680,7 @@
 void emote(player * p, char *str)
 {
   char *oldstack, *text, *pip;
-  char tname[MAX_PRETITLE + MAX_NAME + 3];
+  char tname[(MAX_PRETITLE + MAX_NAME + 3) * 4];
   char *temp;
 
   temp = str;
@@ -728,9 +728,9 @@
   }
   text = stack;
   if (p->custom_flags & (NOPREFIX | NOEPREFIX))
-    strcpy(tname, p->name);
+    strcpy(tname, get_cname(p,p));
   else
-    strcpy(tname, full_name(p));
+    strcpy(tname, full_name(p,p));
   if (emote_no_break(*str))
     sprintf(stack, " You emote : %s%s\n", tname, pip);
   else
@@ -942,9 +942,9 @@
       pstring = tag_string(*step, list, n);
       final = stack;
       if ((*step)->custom_flags & NOPREFIX)
-	sprintf(stack, "%s %s %s '%s^N'\n", p->name, mid, pstring, msg);
+	sprintf(stack, "%s %s %s '%s^N'\n", get_cname(p, *step), mid, pstring, msg);
       else
-	sprintf(stack, "%s %s %s '%s^N'\n", full_name(p), mid, pstring, msg);
+	sprintf(stack, "%s %s %s '%s^N'\n", full_name(p, *step), mid, pstring, msg);
       stack = end_string(stack);
       tell_player(*step, final);
 #ifdef INTELLIBOTS
@@ -1017,7 +1017,7 @@
 	      "to you.\n", p->name);
     else
       sprintf(stack, "!!!!!!!!!! OI !!!!!!!!!!! WAKE UP, %s wants to speak "
-	      "to you.\n", full_name(p));
+	      "to you.\n", full_name(p, p2));
   }
   else
   {
@@ -1026,7 +1026,7 @@
 	      "to you.\007\n", p->name);
     else
       sprintf(stack, "!!!!!!!!!! OI !!!!!!!!!!! WAKE UP, %s wants to speak "
-	      "to you.\007\n", full_name(p));
+	      "to you.\007\n", full_name(p, p2));
   }
   stack = end_string(stack);
   sys_color_atm = TELsc;
@@ -1040,7 +1040,7 @@
   }
   stack = oldstack;
   sprintf(stack, " You scream loudly at %s in an attempt to wake %s up.\n",
-	  full_name(p2), get_gender_string(p2));
+	  full_name(p2, p), get_gender_string(p2));
   stack = strchr(stack, 0);
   if (p2->idle_msg[0] != 0)
     sprintf(stack, " Idling> %s %s\n", p2->name, p2->idle_msg);
@@ -1196,7 +1196,7 @@
     if ((*step)->custom_flags & (NOPREFIX | NOEPREFIX))
       strcpy(tname, p->name);
     else
-      strcpy(tname, full_name(p));
+      strcpy(tname, full_name(p, *step));
     if (*step != p)
     {
       final = stack;
@@ -1225,7 +1225,7 @@
       if (p->custom_flags & (NOPREFIX | NOEPREFIX))
 	strcpy(tname, p->name);
       else
-	strcpy(tname, full_name(p));
+	strcpy(tname, full_name(p, p));
       if (emote_no_break(*msg))
 	sprintf(stack, " You emote '%s%s^N' to %s.\n", tname, msg, pstring);
       else
@@ -1442,7 +1442,7 @@
 	if (scan->custom_flags & NOPREFIX)
 	  sprintf(stack, "%s %s '%s^N' to %s.\n", p->name, mid, msg, pstring);
 	else
-	  sprintf(stack, "%s %s '%s^N' to %s.\n", full_name(p), mid, msg,
+	  sprintf(stack, "%s %s '%s^N' to %s.\n", full_name(p,scan), mid, msg,
 		  pstring);
 	stack = end_string(stack);
 	sys_color_atm = TELsc;
@@ -1537,7 +1537,7 @@
 	pstring = tag_string(scan, list, n);
 	text = stack;
 	sprintf(stack, "%s tells everyone something about %s\n",
-		full_name(p), pstring);
+		full_name(p,scan), pstring);
 	stack = end_string(stack);
 	tell_player(scan, text);
 	stack = pstring;
@@ -1546,7 +1546,7 @@
       {
 	text = stack;
 	sprintf(stack, "%s %s everyone but %s '%s^N'\n",
-		full_name(p), mid, everyone, msg);
+		full_name(p,scan), mid, everyone, msg);
 	stack = end_string(stack);
 	tell_player(scan, text);
 #ifdef INTELLIBOTS
@@ -1858,9 +1858,9 @@
   else
   {
     if (emote_no_break(*str))
-      sprintf(stack, " You yemote: %s%s\n", full_name(p), pip);
+      sprintf(stack, " You yemote: %s%s\n", full_name(p,p), pip);
     else
-      sprintf(stack, " You yemote: %s %s\n", full_name(p), pip);
+      sprintf(stack, " You yemote: %s %s\n", full_name(p,p), pip);
   }
   stack = end_string(stack);
   tell_player(p, text);
@@ -2255,7 +2255,7 @@
       if ((*step)->custom_flags & NOPREFIX)
 	sprintf(stack, "%s %s o/~ %s ^No/~ to %s.\n", p->name, mid, msg, pstring);
       else
-	sprintf(stack, "%s %s o/~ %s ^No/~ to %s.\n", full_name(p), mid, msg, pstring);
+	sprintf(stack, "%s %s o/~ %s ^No/~ to %s.\n", full_name(p, *step), mid, msg, pstring);
       stack = end_string(stack);
       tell_player(*step, final);
 #ifdef INTELLIBOTS
@@ -2499,7 +2499,7 @@
 	if ((*step)->custom_flags & NOPREFIX)
 	  sprintf(stack, "%s %s %s -> %s ^N<-\n", p->name, mid, pstring, msg);
 	else
-	  sprintf(stack, "%s %s %s -> %s ^N<-\n", full_name(p), mid, pstring,
+	  sprintf(stack, "%s %s %s -> %s ^N<-\n", full_name(p, *step), mid, pstring,
 		  msg);
       }
       else
@@ -2508,7 +2508,7 @@
 	  sprintf(stack, "%s %s %s -> %s ^N<-\007\n", p->name, mid, pstring,
 		  msg);
 	else
-	  sprintf(stack, "%s %s %s -> %s ^N<-\007\n", full_name(p), mid,
+	  sprintf(stack, "%s %s %s -> %s ^N<-\007\n", full_name(p, *step), mid,
 		  pstring, msg);
       }
       stack = end_string(stack);
diff -u --recursive src-original/version.c src/version.c
--- src-original/version.c	Wed Feb 14 11:42:18 2001
+++ src/version.c	Wed Feb 14 14:18:51 2001
@@ -166,6 +166,8 @@
 /* EWE */
   ewe_version();
 
+  cname_version();
+
 /* A warning that people are using debugging mode. This means sysops can
    slap silly people who use this mode in live usage -- Silver */