diff -Nru grep/lib/error.c grep.changed/lib/error.c
--- grep/lib/error.c	2007-06-28 21:10:44.000000000 +0200
+++ grep.changed/lib/error.c	2007-07-29 21:55:37.000000000 +0200
@@ -141,6 +141,8 @@
 #ifdef VA_START
   va_list args;
 #endif
+  if (color_option_error && *(error_color))
+    printf("\33[%sm\33[K", error_color); 
 
   if (error_print_progname)
     (*error_print_progname) ();
@@ -180,6 +182,10 @@
 #endif
     }
   putc ('\n', stderr);
+
+  if (color_option_error)
+    printf("\33[m\33[K"); 
+
   fflush (stderr);
   if (status)
     exit (status);
@@ -206,6 +212,8 @@
 #ifdef VA_START
   va_list args;
 #endif
+  if (color_option_error && *(error_color))
+    printf("\33[%sm\33[K", error_color); 
 
   if (error_one_per_line)
     {
@@ -262,6 +270,10 @@
 #endif
     }
   putc ('\n', stderr);
+
+  if (color_option_error)
+    printf("\33[m\33[K"); 
+
   fflush (stderr);
   if (status)
     exit (status);
diff -Nru grep/lib/error.h grep.changed/lib/error.h
--- grep/lib/error.h	2007-06-28 21:10:44.000000000 +0200
+++ grep.changed/lib/error.h	2007-07-29 21:55:37.000000000 +0200
@@ -70,6 +70,9 @@
 /* Sometimes we want to have at most one error per line.  This
    variable controls whether this mode is selected or not.  */
 extern int error_one_per_line;
+/* colorized error messages */
+extern const char *error_color;
+extern int color_option_error;
 
 #ifdef	__cplusplus
 }
diff -Nru grep/src/grep.c grep.changed/src/grep.c
--- grep/src/grep.c	2007-06-28 21:10:45.000000000 +0200
+++ grep.changed/src/grep.c	2007-07-29 21:55:50.000000000 +0200
@@ -78,6 +78,7 @@
 
 /* If nonzero, use color markers.  */
 static int color_option;
+int color_option_error;
 
 /* If nonzero, show only the part of a line matching the expression. */
 static int only_matching;
@@ -138,8 +139,10 @@
 static const char *line_num_color = "32";	/* green */
 static const char *byte_num_color = "32";	/* green */
 static const char *sep_color      = "36";	/* cyan */
+static const char *bin_color      = "01;34";/* bold blue */
 static const char *selected_line_color = "";	/* default color pair */
 static const char *context_line_color  = "";	/* default color pair */
+const char *error_color    = "01;31";/* bold red */
 
 /* Select Graphic Rendition (SGR, "\33[...m") strings.  */
 /* Also Erase in Line (EL) to Right ("\33[K") by default.  */
@@ -258,6 +261,8 @@
     { "se", &sep_color,            NULL }, /* separator */
     { "sl", &selected_line_color,  NULL }, /* selected lines */
     { "cx", &context_line_color,   NULL }, /* context lines */
+    { "bi", &bin_color,            NULL }, /* binary match */
+    { "er", &error_color,          NULL }, /* error output */
     { "rv", NULL,                  color_cap_rv_fct }, /* -v reverses sl/cx */
     { "ne", NULL,                  color_cap_ne_fct }, /* no EL on SGR_* */
     { NULL, NULL,                  NULL }
@@ -1206,7 +1211,11 @@
   done_on_match -= not_text;
   out_quiet -= not_text;
   if ((not_text & ~out_quiet) && nlines != 0)
-    printf (_("Binary file %s matches\n"), filename);
+    {
+      PR_SGR_START_IF(bin_color);
+      printf (_("Binary file %s matches\n"), filename);
+      PR_SGR_END_IF(bin_color);
+    }
   return nlines;
 }
 
@@ -2082,23 +2091,28 @@
         if(optarg) {
           if(!strcasecmp(optarg, "always") || !strcasecmp(optarg, "yes") ||
              !strcasecmp(optarg, "force"))
-            color_option = 1;
+            color_option = color_option_error = 1;
           else if(!strcasecmp(optarg, "never") || !strcasecmp(optarg, "no") ||
                   !strcasecmp(optarg, "none"))
-            color_option = 0;
+            color_option = color_option_error = 0;
           else if(!strcasecmp(optarg, "auto") || !strcasecmp(optarg, "tty") ||
                   !strcasecmp(optarg, "if-tty"))
-            color_option = 2;
+            color_option = color_option_error = 2;
           else
             show_help = 1;
         } else
-          color_option = 2;
+          color_option = color_option_error = 2;
         if(color_option == 2) {
           if(isatty(STDOUT_FILENO) && getenv("TERM") &&
 	     strcmp(getenv("TERM"), "dumb"))
                   color_option = 1;
           else
             color_option = 0;
+          if(isatty(STDERR_FILENO) && getenv("TERM") &&
+	     strcmp(getenv("TERM"), "dumb"))
+                  color_option_error = 1;
+          else
+            color_option_error = 0;
         }
 	break;
 
