Index: gtk/gtkmenubar.c
===================================================================
--- gtk/gtkmenubar.c	(revision 19393)
+++ gtk/gtkmenubar.c	(working copy)
@@ -77,6 +77,8 @@
 					    GdkRectangle    *area);
 static gint gtk_menu_bar_expose            (GtkWidget       *widget,
 					    GdkEventExpose  *event);
+static gboolean  gtk_menu_bar_button_press (GtkWidget       *widget,
+					    GdkEventButton  *event);
 static void gtk_menu_bar_hierarchy_changed (GtkWidget       *widget,
 					    GtkWidget       *old_toplevel);
 static gint gtk_menu_bar_get_popup_delay   (GtkMenuShell    *menu_shell);
@@ -107,6 +109,7 @@
   widget_class->size_allocate = gtk_menu_bar_size_allocate;
   widget_class->expose_event = gtk_menu_bar_expose;
   widget_class->hierarchy_changed = gtk_menu_bar_hierarchy_changed;
+  widget_class->button_press_event = gtk_menu_bar_button_press;
   
   menu_shell_class->submenu_placement = GTK_TOP_BOTTOM;
   menu_shell_class->get_popup_delay = gtk_menu_bar_get_popup_delay;
@@ -543,6 +546,43 @@
   return FALSE;
 }
 
+static gboolean
+gtk_menu_bar_button_press (GtkWidget      *widget,
+                           GdkEventButton *event)
+{
+  gboolean parent_response;
+  
+  g_return_val_if_fail (GTK_IS_MENU_BAR(widget), FALSE);
+  
+  if (event->type != GDK_BUTTON_PRESS)
+    return FALSE;
+
+  /* See if the GtkMenuShell handles the event */
+  parent_response = GTK_WIDGET_CLASS (gtk_menu_bar_parent_class)->button_press_event (widget, event);
+  if (parent_response)
+    return TRUE;
+  
+  /* The shell did not handle the event */
+  
+  GtkWidget *toplevel_widget = gtk_widget_get_toplevel (widget);
+  if (GTK_WIDGET_TOPLEVEL (toplevel_widget))
+   {
+     GdkWindow *toplevel = toplevel_widget->window;
+     toplevel = gdk_window_get_toplevel(toplevel);
+     
+     g_return_val_if_fail (toplevel != NULL, FALSE);
+     
+     gdk_window_begin_move_drag (toplevel, event->button, event->x_root, event->y_root, event->time);
+     return TRUE;
+   }
+  else
+    {
+      g_warning ("Root window of GtkMenuBar is not a top level window");
+      return FALSE;
+    } 
+  
+}
+
 static GList *
 get_menu_bars (GtkWindow *window)
 {
Index: gtk/gtkmenushell.c
===================================================================
--- gtk/gtkmenushell.c	(revision 19393)
+++ gtk/gtkmenushell.c	(working copy)
@@ -556,7 +556,11 @@
     return gtk_widget_event (menu_shell->parent_menu_shell, (GdkEvent*) event);
 
   menu_item = gtk_menu_shell_get_item (menu_shell, (GdkEvent *)event);
-
+  
+  /* If we don't have a menu item, we have no business here */
+  if (!menu_item)
+    return FALSE;
+  
   if (menu_item && _gtk_menu_item_is_selectable (menu_item) &&
       menu_item != GTK_MENU_SHELL (menu_item->parent)->active_menu_item)
     {
