diff -ur metacity-2.8.8-old/src/bell.c metacity-2.8.8/src/bell.c
--- metacity-2.8.8-old/src/bell.c	2004-09-16 19:18:24.000000000 -0400
+++ metacity-2.8.8/src/bell.c	2005-01-06 15:42:54.068425795 -0500
@@ -127,6 +127,23 @@
       meta_bell_unflash_frame, window->frame, NULL);
 }
 
+gboolean
+meta_bell_flash_window_frame_multiple (MetaWindow *window)
+{
+  g_assert (window->frame != NULL);
+  window->frame->is_flashing = (window->is_urgent ? 
+      ! (window->frame->is_flashing) : 0);
+  meta_frame_queue_draw (window->frame);
+
+  if (! window->is_urgent)
+    {
+	  window->flash_timer = 0;
+      return FALSE;
+    }
+
+  return TRUE;
+}
+  
 static void
 meta_bell_flash_frame (MetaDisplay *display, 
 		       XkbAnyEvent *xkb_ev)
diff -ur metacity-2.8.8-old/src/bell.h metacity-2.8.8/src/bell.h
--- metacity-2.8.8-old/src/bell.h	2003-04-29 18:07:47.000000000 -0400
+++ metacity-2.8.8/src/bell.h	2005-01-06 15:30:44.112019353 -0500
@@ -33,3 +33,4 @@
 gboolean meta_bell_init (MetaDisplay *display);
 void meta_bell_shutdown (MetaDisplay *display);
 void meta_bell_notify_frame_destroy (MetaFrame *frame);
+gboolean meta_bell_flash_window_frame_multiple (MetaWindow *window);
diff -ur metacity-2.8.8-old/src/window-props.c metacity-2.8.8/src/window-props.c
--- metacity-2.8.8-old/src/window-props.c	2004-12-06 13:31:16.000000000 -0500
+++ metacity-2.8.8/src/window-props.c	2005-01-06 15:38:13.940997070 -0500
@@ -23,6 +23,7 @@
 #include "window-props.h"
 #include "xprops.h"
 #include "frame.h"
+#include "bell.h"
 #include "group.h"
 #include <X11/Xatom.h>
 
@@ -784,12 +785,15 @@
                  MetaPropValue *value)
 {
   Window old_group_leader;
+  guint old_is_urgent;
   
   old_group_leader = window->xgroup_leader;
-  
+  old_is_urgent = window->is_urgent;
+
   /* Fill in defaults */
   window->input = TRUE;
   window->initially_iconic = FALSE;
+  window->is_urgent = FALSE;
   window->xgroup_leader = None;
   window->wm_hints_pixmap = None;
   window->wm_hints_mask = None;
@@ -813,11 +817,15 @@
       if (hints->flags & IconMaskHint)
         window->wm_hints_mask = hints->icon_mask;
       
-      meta_verbose ("Read WM_HINTS input: %d iconic: %d group leader: 0x%lx pixmap: 0x%lx mask: 0x%lx\n",
+      if (hints->flags & XUrgencyHint)
+        window->is_urgent = TRUE;
+     
+      meta_verbose ("Read WM_HINTS input: %d iconic: %d group leader: 0x%lx pixmap: 0x%lx mask: 0x%lx urgent: %d\n",
                     window->input, window->initially_iconic,
                     window->xgroup_leader,
                     window->wm_hints_pixmap,
-                    window->wm_hints_mask);
+                    window->wm_hints_mask,
+                    window->is_urgent);
     }
 
   if (window->xgroup_leader != old_group_leader)
@@ -828,6 +836,23 @@
       meta_window_group_leader_changed (window);
     }
 
+  if ((window->is_urgent != old_is_urgent) && (window->frame))
+    {
+      meta_verbose ("Window %s changes its urgent'ness to %u\n",
+                    window->desc, window->is_urgent);
+
+      if (window->is_urgent)
+      	window->flash_timer = 
+                 g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE, 1000,
+                                     meta_bell_flash_window_frame_multiple,
+                                     window, NULL);
+      else
+        {
+          window->frame->is_flashing = 0;
+          meta_frame_queue_draw (window->frame);
+        }
+    }
+
   meta_icon_cache_property_changed (&window->icon_cache,
                                     window->display,
                                     XA_WM_HINTS);
diff -ur metacity-2.8.8-old/src/window.c metacity-2.8.8/src/window.c
--- metacity-2.8.8-old/src/window.c	2004-12-06 13:31:16.000000000 -0500
+++ metacity-2.8.8/src/window.c	2005-01-06 15:39:49.629113202 -0500
@@ -368,6 +368,8 @@
   window->display = display;
   window->workspaces = NULL;
 
+  window->flash_timer = 0;
+
 #ifdef HAVE_XSYNC
   window->sync_request_counter = None;
   window->sync_request_serial = 0;
@@ -1007,7 +1009,10 @@
   meta_stack_remove (window->screen->stack, window);
   
   /* FIXME restore original size if window has maximized */
-  
+
+  if (window->flash_timer)
+    g_source_remove (window->flash_timer);
+ 
   if (window->frame)
     meta_window_destroy_frame (window);
   
diff -ur metacity-2.8.8-old/src/window.h metacity-2.8.8/src/window.h
--- metacity-2.8.8-old/src/window.h	2004-12-06 13:04:34.000000000 -0500
+++ metacity-2.8.8/src/window.h	2005-01-06 15:34:29.896859345 -0500
@@ -256,6 +256,12 @@
   /* if TRUE we have a grab on the focus click buttons */
   guint have_focus_click_grab : 1;
 
+  /* window is marked urgent */
+  guint is_urgent : 1;
+
+  /* window flash timer */
+  guint flash_timer;
+
   /* if TRUE, application is buggy and SYNC resizing is turned off */
   guint disable_sync : 1;
 
