diff -Nur mutt.orig/color.c mutt.patched/color.c
--- mutt.orig/color.c	2005-02-03 18:01:42.000000000 +0100
+++ mutt.patched/color.c	2005-02-23 21:59:59.000000000 +0100
@@ -93,6 +93,12 @@
   { "bold",		MT_COLOR_BOLD },
   { "underline",	MT_COLOR_UNDERLINE },
   { "index",		MT_COLOR_INDEX },
+  { "author",		MT_COLOR_INDEX_AUTHOR },
+  { "subject",		MT_COLOR_INDEX_SUBJECT },
+  { "index_number",	MT_COLOR_INDEX_NUMBER },
+  { "flags",		MT_COLOR_INDEX_FLAGS },
+  { "date",		MT_COLOR_INDEX_DATE },
+  { "size",		MT_COLOR_INDEX_SIZE },
   { NULL,		0 }
 };
 
diff -Nur mutt.orig/curs_lib.c mutt.patched/curs_lib.c
--- mutt.orig/curs_lib.c	2005-02-03 18:01:43.000000000 +0100
+++ mutt.patched/curs_lib.c	2005-02-23 21:59:59.000000000 +0100
@@ -595,6 +595,7 @@
   size_t k, k2;
   char scratch[MB_LEN_MAX];
   mbstate_t mbstate1, mbstate2;
+  int escaped = 0;
 
   memset(&mbstate1, 0, sizeof (mbstate1));
   memset(&mbstate2, 0, sizeof (mbstate2));
@@ -607,7 +608,15 @@
       k = (k == (size_t)(-1)) ? 1 : n;
       wc = replacement_char ();
     }
-    if (arboreal && wc < M_TREE_MAX)
+    if (escaped) {
+      escaped = 0;
+      w = 0;
+    }
+    else if (arboreal && wc == M_SPECIAL_INDEX) {
+      escaped = 1;
+      w = 0;
+    }
+    else if (arboreal && wc < M_TREE_MAX)
       w = 1; /* hack */
     else
     {
diff -Nur mutt.orig/hdrline.c mutt.patched/hdrline.c
--- mutt.orig/hdrline.c	2005-02-12 20:12:40.000000000 +0100
+++ mutt.patched/hdrline.c	2005-02-23 21:59:59.000000000 +0100
@@ -32,6 +32,8 @@
 #include <string.h>
 #include <locale.h>
 
+#define min(a,b)        (((a)<(b))?(a):(b))
+
 int mutt_is_mail_list (ADDRESS *addr)
 {
   if (!mutt_match_rx_list (addr->mailbox, UnMailLists))
@@ -99,6 +101,36 @@
   return 0;
 }
 
+/* Takes the color to embed, the buffer to manipulate and the buffer lenght as
+ * arguments.
+ * Returns the number of chars written. */
+static size_t add_color_on(char color, char *buf, size_t buflen) {
+  if (buflen>2) {
+    buf[0] = M_SPECIAL_INDEX;
+    buf[1] = color;
+    buf[2] = '\0';
+
+    return 2;
+  }
+
+  return 0;
+}
+
+static size_t add_color_off(char *buf, size_t buflen) {
+  size_t len = mutt_strlen(buf);
+  char *p = buf + min(len, buflen - 3);
+
+  if (p > buf) {
+    p[0] = M_SPECIAL_INDEX;
+    p[1] = MT_COLOR_INDEX;
+    p[2] = '\0';
+
+    return 2;
+  }
+
+  return 0;
+}
+
 static void make_from (ENVELOPE *hdr, char *buf, size_t len, int do_lists)
 {
   int me;
@@ -250,6 +282,7 @@
 #define THREAD_NEW (threads && hdr->collapsed && hdr->num_hidden > 1 && mutt_thread_contains_unread (ctx, hdr) == 1)
 #define THREAD_OLD (threads && hdr->collapsed && hdr->num_hidden > 1 && mutt_thread_contains_unread (ctx, hdr) == 2)
   size_t len;
+  size_t colorlen; 
 
   hdr = hfi->hdr;
   ctx = hfi->ctx;
@@ -302,11 +335,16 @@
     
     case 'c':
       mutt_pretty_size (buf2, sizeof (buf2), (long) hdr->content->length);
-      mutt_format_s (dest, destlen, prefix, buf2);
+      colorlen = add_color_on(MT_COLOR_INDEX_SIZE, dest, destlen);
+      mutt_format_s (dest+colorlen, destlen-colorlen, prefix, buf2);
+      add_color_off(dest+colorlen, destlen-colorlen);
       break;
 
     case 'C':
-      snprintf (fmt, sizeof (fmt), "%%%sd", prefix);
+      colorlen = add_color_on(MT_COLOR_INDEX_NUMBER, fmt, sizeof(fmt));
+      snprintf (fmt+colorlen, sizeof(fmt)-colorlen, "%%%sd", prefix);
+      add_color_off(fmt+colorlen, sizeof(fmt)-colorlen);
+
       snprintf (dest, destlen, fmt, hdr->msgno + 1);
       break;
 
@@ -405,7 +443,10 @@
 	if (do_locales)
 	  setlocale (LC_TIME, "C");
 
-	mutt_format_s (dest, destlen, prefix, buf2);
+	colorlen = add_color_on(MT_COLOR_INDEX_DATE, dest, destlen);
+	mutt_format_s (dest+colorlen, destlen-colorlen, prefix, buf2);
+	add_color_off(dest+colorlen, destlen-colorlen);
+
 	if (len > 0 && op != 'd' && op != 'D') /* Skip ending op */
 	  src = cp + 1;
       }
@@ -435,8 +476,10 @@
     case 'F':
       if (!optional)
       {
+	colorlen = add_color_on(MT_COLOR_INDEX_AUTHOR, dest, destlen);
         make_from (hdr->env, buf2, sizeof (buf2), 0);
-	mutt_format_s (dest, destlen, prefix, buf2);
+	mutt_format_s (dest+colorlen, destlen-colorlen, prefix, buf2);
+	add_color_off(dest+colorlen, destlen-colorlen);
       }
       else if (mutt_addr_is_user (hdr->env->from))
         optional = 0;
@@ -462,7 +505,9 @@
       if (!optional)
       {
 	snprintf (fmt, sizeof (fmt), "%%%sd", prefix);
-	snprintf (dest, destlen, fmt, (int) hdr->lines);
+	colorlen = add_color_on(MT_COLOR_INDEX_SIZE, dest, destlen);
+	snprintf (dest+colorlen, destlen-colorlen, fmt, (int) hdr->lines);
+	add_color_off(dest+colorlen, destlen-colorlen);
       }
       else if (hdr->lines <= 0)
         optional = 0;
@@ -471,8 +516,10 @@
     case 'L':
       if (!optional)
       {
+	colorlen = add_color_on(MT_COLOR_INDEX_AUTHOR, dest, destlen);
 	make_from (hdr->env, buf2, sizeof (buf2), 1);
-	mutt_format_s (dest, destlen, prefix, buf2);
+	mutt_format_s (dest+colorlen, destlen-colorlen, prefix, buf2);
+	add_color_off(dest+colorlen, destlen-colorlen);
       }
       else if (!check_for_mailing_list (hdr->env->to, NULL, NULL, 0) &&
 	       !check_for_mailing_list (hdr->env->cc, NULL, NULL, 0))
@@ -547,15 +594,23 @@
       {
 	if (flags & M_FORMAT_FORCESUBJ)
 	{
-	  mutt_format_s (dest, destlen, "", NONULL (hdr->env->subject));
+	  colorlen = add_color_on(MT_COLOR_INDEX_SUBJECT, dest, destlen);
+	  mutt_format_s (dest+colorlen, destlen-colorlen, "", 
+	      NONULL (hdr->env->subject));
+	  add_color_off(dest+colorlen, destlen-colorlen);
+
 	  snprintf (buf2, sizeof (buf2), "%s%s", hdr->tree, dest);
 	  mutt_format_s_tree (dest, destlen, prefix, buf2);
 	}
 	else
 	  mutt_format_s_tree (dest, destlen, prefix, hdr->tree);
       }
-      else
-	mutt_format_s (dest, destlen, prefix, NONULL (hdr->env->subject));
+      else {
+	colorlen = add_color_on(MT_COLOR_INDEX_SUBJECT, dest, destlen);
+	mutt_format_s (dest+colorlen, destlen-colorlen, prefix, 
+	    NONULL (hdr->env->subject));
+	add_color_off(dest+colorlen, destlen-colorlen);
+      }
       break;
 
     case 'S':
@@ -651,7 +706,11 @@
 		hdr->tagged ? '*' :
 		(hdr->flagged ? '!' :
 		 (Tochars && ((i = mutt_user_is_recipient (hdr)) < mutt_strlen (Tochars)) ? Tochars[i] : ' ')));
-      mutt_format_s (dest, destlen, prefix, buf2);
+
+      colorlen = add_color_on(MT_COLOR_INDEX_FLAGS, dest, destlen);
+      mutt_format_s (dest+colorlen, destlen-colorlen, prefix, buf2);
+      add_color_off(dest+colorlen, destlen-colorlen);
+
       break;
 
      case 'y':
diff -Nur mutt.orig/menu.c mutt.patched/menu.c
--- mutt.orig/menu.c	2005-02-12 21:08:19.000000000 +0100
+++ mutt.patched/menu.c	2005-02-23 21:59:59.000000000 +0100
@@ -133,6 +133,18 @@
       }
       if (do_color) attrset(attr);
     }
+    else if(*s == M_SPECIAL_INDEX)
+    {
+      s++;
+      if (do_color) {
+	if (*s == MT_COLOR_INDEX)
+	  attrset(attr);
+	else
+	  ADDCOLOR(*s);
+      }
+      s++; 
+      n -= 2;
+    }
     else if ((k = mbrtowc (&wc, (char *)s, n, &mbstate)) > 0)
     {
       addnstr ((char *)s, k);
diff -Nur mutt.orig/mutt_curses.h mutt.patched/mutt_curses.h
--- mutt.orig/mutt_curses.h	2004-06-17 22:36:13.000000000 +0200
+++ mutt.patched/mutt_curses.h	2005-02-23 21:59:59.000000000 +0100
@@ -121,6 +121,12 @@
   MT_COLOR_BOLD,
   MT_COLOR_UNDERLINE,
   MT_COLOR_INDEX,
+  MT_COLOR_INDEX_AUTHOR,
+  MT_COLOR_INDEX_SUBJECT,
+  MT_COLOR_INDEX_NUMBER,
+  MT_COLOR_INDEX_FLAGS,
+  MT_COLOR_INDEX_DATE,
+  MT_COLOR_INDEX_SIZE,
   MT_COLOR_MAX
 };
 
diff -Nur mutt.orig/mutt.h mutt.patched/mutt.h
--- mutt.orig/mutt.h	2005-02-12 20:19:25.000000000 +0100
+++ mutt.patched/mutt.h	2005-02-23 21:59:59.000000000 +0100
@@ -176,6 +176,9 @@
 #define M_TREE_MISSING		13
 #define M_TREE_MAX		14
 
+#define M_SPECIAL_INDEX		M_TREE_MAX
+#define M_SPECIAL_MAX		(M_TREE_MAX+1)
+
 #define M_THREAD_COLLAPSE	(1<<0)
 #define M_THREAD_UNCOLLAPSE	(1<<1)
 #define M_THREAD_GET_HIDDEN	(1<<2)
