diff -u libwnck/libwnck/tasklist.c libwnck-new/libwnck/tasklist.c
--- libwnck/libwnck/tasklist.c	2003-07-11 15:37:33.000000000 -0400
+++ libwnck-new/libwnck/tasklist.c	2003-08-22 17:28:39.000000000 -0400
@@ -55,6 +55,7 @@
 
 typedef struct _WnckTask        WnckTask;
 typedef struct _WnckTaskClass   WnckTaskClass;
+typedef struct _WnckTaskWindow  WnckTaskWindow;
 
 #define MINI_ICON_SIZE 16
 #define DEFAULT_GROUPING_LIMIT 80
@@ -119,6 +120,12 @@
   GObjectClass parent_class;
 };
 
+struct _WnckTaskWindow
+{
+ WnckTasklist *tasklist;
+ WnckWindow  *window;
+};
+
 struct _WnckTasklistPrivate
 {
   WnckScreen *screen;
@@ -182,7 +189,7 @@
 static WnckTask *wnck_task_new_from_startup_sequence (WnckTasklist      *tasklist,
                                                       SnStartupSequence *sequence);
 #endif
-
+static gboolean  urgent_timeout_callback(gpointer data);
 static char      *wnck_task_get_text (WnckTask *task);
 static GdkPixbuf *wnck_task_get_icon (WnckTask *task);
 static gint       wnck_task_compare  (gconstpointer  a,
@@ -2128,7 +2135,7 @@
 			 gpointer        data)
 {
   WnckTasklist *tasklist = WNCK_TASKLIST (data);
-
+  GtkRcStyle *style; 
   if (changed_mask & WNCK_WINDOW_STATE_SKIP_TASKLIST)
     {
       wnck_tasklist_update_lists  (tasklist);
@@ -2153,7 +2160,35 @@
 	    wnck_task_update_visible_state (app_task);
 	}
     }
-    
+   if (changed_mask & WNCK_WINDOW_STATE_URGENT)
+     {
+       WnckTask *win_task;
+       WnckTaskWindow *taskwin;
+       
+       win_task = g_hash_table_lookup (tasklist->priv->win_hash,
+       						   window);
+	if (win_task)
+	{
+	    if(new_state & WNCK_WINDOW_STATE_URGENT)
+	    {
+	     taskwin = g_new0 (WnckTaskWindow, 1);
+	     taskwin->tasklist = tasklist;
+	     taskwin->window = window;
+	     
+	     g_timeout_add (1000, urgent_timeout_callback, taskwin);
+	    }
+	    else 
+	    {
+	    style = gtk_widget_get_modifier_style (win_task->button);
+	    style->color_flags[GTK_STATE_NORMAL] = 0;
+	    gtk_widget_modify_style (win_task->button, style);
+	    style = gtk_widget_get_modifier_style (win_task->label);
+	    style->color_flags[GTK_STATE_NORMAL] = 0;
+	    gtk_widget_modify_style (win_task->label, style);
+	    }
+	}
+      }
+	
 }
 
 static void
@@ -2581,9 +2616,9 @@
 #define STARTUP_TIMEOUT 15000
 
 static gboolean
-sequence_timeout_callback (void *user_data)
+sequence_timeout_callback (gpointer data)
 {
-  WnckTasklist *tasklist = user_data;
+  WnckTasklist *tasklist = (WnckTasklist *) data;
   GList *tmp;
   GTimeVal now;
   long tv_sec, tv_usec;
@@ -2626,7 +2661,64 @@
   else
     return TRUE;
 }
+static gboolean
+urgent_timeout_callback	(gpointer data)
+{
+ WnckTaskWindow *taskwin = (WnckTaskWindow *) data;
+ WnckTask *task; 
+ GtkStyle *style;
+ GtkRcStyle *mod;
+ GdkColor c;
+ WnckWindowState state;
+
+ task = (g_hash_table_lookup (taskwin->tasklist->priv->win_hash,
+ 				taskwin->window));
+ if(task == NULL)
+ {
+   g_free(taskwin);
+   return FALSE;
+ }
 
+ state = wnck_window_get_state (task->window);
+ 
+ if(state & WNCK_WINDOW_STATE_URGENT)
+ {
+ style = gtk_widget_get_style (task->button);
+ mod = gtk_widget_get_modifier_style (task->button);
+ c = style->bg[GTK_STATE_PRELIGHT];
+ if(mod->color_flags[GTK_STATE_NORMAL] & GTK_RC_BG)
+ {
+  mod->color_flags[GTK_STATE_NORMAL] &= ~(GTK_RC_BG);
+  gtk_widget_modify_style(task->button, mod);
+ }
+ else
+ {
+  mod->color_flags[GTK_STATE_NORMAL] |= GTK_RC_BG;
+  mod->bg[GTK_STATE_NORMAL] = c;
+  gtk_widget_modify_style(task->button, mod);
+ }
+
+ style = gtk_widget_get_style (task->label);
+ mod = gtk_widget_get_modifier_style (task->label);
+ c = style->fg[GTK_STATE_PRELIGHT];
+
+if(mod->color_flags[GTK_STATE_NORMAL] & GTK_RC_FG)
+{
+ mod->color_flags[GTK_STATE_NORMAL] &= ~(GTK_RC_FG);
+ gtk_widget_modify_style(task->label, mod);
+}
+else
+{
+ mod->color_flags[GTK_STATE_NORMAL] |= GTK_RC_FG;
+ mod->fg[GTK_STATE_NORMAL] = c;
+ gtk_widget_modify_style(task->label, mod);
+}
+ 
+ 
+}
+return (state & WNCK_WINDOW_STATE_URGENT);
+}
+ 
 static void
 wnck_tasklist_sn_event (SnMonitorEvent *event,
                         void           *user_data)
@@ -2650,7 +2742,6 @@
         tasklist->priv->startup_sequences =
           g_list_prepend (tasklist->priv->startup_sequences,
                           task);
-
         if (tasklist->priv->startup_sequence_timeout == 0)
           {
             tasklist->priv->startup_sequence_timeout =
diff -u libwnck/libwnck/window.c libwnck-new/libwnck/window.c
--- libwnck/libwnck/window.c	2003-07-20 19:43:15.000000000 -0400
+++ libwnck-new/libwnck/window.c	2003-08-22 17:30:04.000000000 -0400
@@ -21,6 +21,7 @@
  * Boston, MA 02111-1307, USA.
  */
 
+ /* #include <stdio.h> */
 #include <string.h>
 #include "window.h"
 #include "xutils.h"
@@ -45,7 +46,8 @@
     ((window)->priv->skip_taskbar        << 5) |        \
     ((window)->priv->is_sticky           << 6) |        \
     ((window)->priv->is_hidden           << 7) |        \
-    ((window)->priv->is_fullscreen       << 8) )
+    ((window)->priv->is_fullscreen       << 8) |        \
+    ((window)->priv->is_urgent           << 9) )
 
 struct _WnckWindowPrivate
 {
@@ -95,6 +97,7 @@
   guint is_sticky : 1;
   guint is_hidden : 1;
   guint is_fullscreen : 1;
+  guint is_urgent : 1;
 
   /* _NET_WM_STATE_HIDDEN doesn't map directly into an
    * externally-visible state (it determines the WM_STATE
@@ -120,6 +123,7 @@
   guint need_update_transient_for : 1;
   guint need_update_startup_id : 1;
   guint need_update_wmclass : 1;
+  guint need_update_wmhints : 1;
 };
 
 enum {
@@ -393,6 +397,7 @@
   window->priv->need_update_transient_for = TRUE;
   window->priv->need_update_startup_id = TRUE;
   window->priv->need_update_wmclass = TRUE;
+  window->priv->need_update_wmhints = TRUE;
   force_update_now (window);
 
   return window;
@@ -1365,6 +1370,7 @@
 _wnck_window_process_property_notify (WnckWindow *window,
                                       XEvent     *xevent)
 {
+  /* fprintf(stderr, "Processing property notify\n"); */
   if (xevent->xproperty.atom ==
       _wnck_atom_get ("_NET_WM_STATE"))
     {
@@ -1436,14 +1442,20 @@
   else if (xevent->xproperty.atom ==
            _wnck_atom_get ("_NET_WM_ICON") ||
            xevent->xproperty.atom ==
-           _wnck_atom_get ("KWM_WIN_ICON") ||
-           xevent->xproperty.atom ==
-           _wnck_atom_get ("WM_HINTS"))
+           _wnck_atom_get ("KWM_WIN_ICON"))
     {
       _wnck_icon_cache_property_changed (window->priv->icon_cache,
                                          xevent->xproperty.atom);
       queue_update (window);
     }
+  else if (xevent->xproperty.atom ==
+  	   _wnck_atom_get ("WM_HINTS"))
+   {
+       /* fprintf(stderr, " WM HINT!!!\n"); */
+       window->priv->need_update_wmhints = TRUE;
+       queue_update (window);
+   }
+
 }
 
 void
@@ -1899,6 +1911,22 @@
 }
 
 static void
+update_wmhints (WnckWindow *window)
+{
+  gboolean retval;
+/*  fprintf(stderr, "Updating window hints\n"); */
+  if (!window->priv->need_update_wmhints)
+    return;
+/*  fprintf(stderr, "is->urgent before: %s\n", (window->priv->is_urgent ? "TRUE" : "FALSE")); */
+  window->priv->need_update_wmhints = FALSE;
+  retval = _wnck_read_hints(window->priv->xwindow);
+  window->priv->is_urgent = (retval ? 1 : 0);
+/*  fprintf(stderr, "retval is: %s\n", (retval ? "TRUE" : "FALSE"));
+  fprintf(stderr, "is->urgent after: %s\n", (window->priv->is_urgent ? "TRUE" : "FALSE"));*/
+
+}
+
+static void
 force_update_now (WnckWindow *window)
 {
   WnckWindowState old_state;
@@ -1949,6 +1977,7 @@
 
   update_startup_id (window);    /* no side effects */
   update_wmclass (window);
+  update_wmhints (window);
   update_transient_for (window); /* wintype needs this to be first */
   update_wintype (window);
   update_wm_state (window);
@@ -1963,8 +1992,10 @@
   new_state = COMPRESS_STATE (window);
 
   if (old_state != new_state)
+  {
+    /* fprintf(stderr, "State changed.\n"); */
     emit_state_changed (window, old_state ^ new_state, new_state);
-
+}
   if (old_actions != window->priv->actions)
     emit_actions_changed (window, old_actions ^ window->priv->actions,
                           window->priv->actions);
diff -u libwnck/libwnck/window.h libwnck-new/libwnck/window.h
--- libwnck/libwnck/window.h	2003-05-06 12:05:51.000000000 -0400
+++ libwnck-new/libwnck/window.h	2003-08-22 17:29:24.000000000 -0400
@@ -42,7 +42,8 @@
   WNCK_WINDOW_STATE_SKIP_TASKLIST          = 1 << 5,
   WNCK_WINDOW_STATE_STICKY                 = 1 << 6,
   WNCK_WINDOW_STATE_HIDDEN                 = 1 << 7,
-  WNCK_WINDOW_STATE_FULLSCREEN             = 1 << 8
+  WNCK_WINDOW_STATE_FULLSCREEN             = 1 << 8,
+  WNCK_WINDOW_STATE_URGENT                 = 1 << 9
 } WnckWindowState;
 
 typedef enum
diff -u libwnck/libwnck/xutils.c libwnck-new/libwnck/xutils.c
--- libwnck/libwnck/xutils.c	2003-07-31 05:35:29.000000000 -0400
+++ libwnck-new/libwnck/xutils.c	2003-08-22 17:28:39.000000000 -0400
@@ -22,7 +22,7 @@
 #include <config.h>
 #include "xutils.h"
 #include <string.h>
-#include <stdio.h>
+#include <stdio.h> 
 #include "screen.h"
 #include "window.h"
 #include "private.h"
@@ -1970,6 +1970,27 @@
 }
 
 gboolean
+_wnck_read_hints (Window xwindow)
+{
+ XWMHints *hints;
+ gboolean retval;
+ retval = FALSE;
+ /*fprintf(stderr, "Reading WM_HINTS\n");*/
+ _wnck_error_trap_push ();
+ hints = XGetWMHints (gdk_display, xwindow);
+ _wnck_error_trap_pop ();
+ if (hints)
+        {
+	/*	 fprintf(stderr, "Success, XUrgency hint is"); */
+		 retval  = (hints->flags & XUrgencyHint);
+/*		 fprintf(stderr, "%s\n", (retval ? " SET" : " NOT SET"));*/
+      	 	 XFree (hints);
+       		 hints = NULL;
+	}
+return retval;
+}
+  
+gboolean
 _wnck_read_icons (Window         xwindow,
                   WnckIconCache *icon_cache,
                   GdkPixbuf    **iconp,
diff -u libwnck/libwnck/xutils.h libwnck-new/libwnck/xutils.h
--- libwnck/libwnck/xutils.h	2003-04-04 01:50:10.000000000 -0500
+++ libwnck-new/libwnck/xutils.h	2003-08-22 17:28:39.000000000 -0400
@@ -137,6 +137,7 @@
 void           _wnck_icon_cache_set_want_fallback    (WnckIconCache *icon_cache,
                                                       gboolean       setting);
 gboolean       _wnck_icon_cache_get_is_fallback      (WnckIconCache *icon_cache);
+gboolean _wnck_read_hints (Window xwindow);
 
 gboolean _wnck_read_icons         (Window          xwindow,
                                    WnckIconCache  *icon_cache,
