diff -ur src.old/display.c src/display.c
--- src.old/display.c	2005-04-07 21:07:29.915291104 +0100
+++ src/display.c	2005-04-07 21:08:11.235009552 +0100
@@ -1437,10 +1437,6 @@
   
   if (event->type == ButtonPress)
     {
-      /* filter out scrollwheel */
-      if (event->xbutton.button == 4 ||
-	  event->xbutton.button == 5)
-	return FALSE;
 
       /* mark double click events, kind of a hack, oh well. */
       if (((int)event->xbutton.button) ==  display->last_button_num &&
diff -ur src.old/frames.c src/frames.c
--- src.old/frames.c	2005-04-07 21:07:29.936287912 +0100
+++ src/frames.c	2005-04-07 21:17:19.893600768 +0100
@@ -58,6 +58,9 @@
                                                    GdkEventCrossing    *event);
 static gboolean meta_frames_leave_notify_event    (GtkWidget           *widget,
                                                    GdkEventCrossing    *event);
+static gboolean meta_frames_scroll_event          (GtkWidget           *widget,
+                                                   GdkEventScroll      *event);
+
 
 static void meta_frames_paint_to_drawable (MetaFrames   *frames,
                                            MetaUIFrame  *frame,
@@ -144,6 +147,7 @@
   widget_class->motion_notify_event = meta_frames_motion_notify_event;
   widget_class->enter_notify_event = meta_frames_enter_notify_event;
   widget_class->leave_notify_event = meta_frames_leave_notify_event;
+  widget_class->scroll_event = meta_frames_scroll_event;
 }
 
 static gint
@@ -2176,3 +2180,53 @@
                             frames);
     }
 }
+
+static gboolean
+meta_frames_scroll_event (GtkWidget       *widget,
+                          GdkEventScroll  *event)
+{
+
+  MetaUIFrame *frame;
+  MetaFrames *frames;
+  MetaFrameControl control;
+
+  frames = META_FRAMES (widget);
+
+  frame = meta_frames_lookup_window (frames, GDK_WINDOW_XID (event->window));
+  if (frame == NULL)
+    return FALSE;
+
+  control = get_control (frames, frame, event->x, event->y);
+
+  if (control == META_FRAME_CONTROL_TITLE &&
+      event->direction == GDK_SCROLL_UP)
+    {
+      /* scroll up in title bar, shades window if not shaded */
+      MetaFrameFlags flags =
+        meta_core_get_frame_flags(gdk_display, frame->xwindow);
+
+      if ((flags & META_FRAME_ALLOWS_SHADE) &&
+          (!(flags & META_FRAME_SHADED)))
+        {
+          meta_core_shade(gdk_display,frame->xwindow);
+          return TRUE;
+        }
+    }
+  else if (control == META_FRAME_CONTROL_TITLE &&
+            event->direction == GDK_SCROLL_DOWN)
+    {
+      /* scroll down in title bar, unshades window if shaded */
+      MetaFrameFlags flags;
+      flags = meta_core_get_frame_flags(gdk_display, frame->xwindow);
+
+      if ((flags && META_FRAME_ALLOWS_SHADE) &&
+          (flags & META_FRAME_SHADED))
+        {
+          meta_core_unshade(gdk_display, frame->xwindow);
+          return TRUE;
+        }
+    }
+
+  return FALSE;
+                                                              
+}
