Index: gtk/gtkaccellabel.c
===================================================================
--- gtk/gtkaccellabel.c	(revision 17214)
+++ gtk/gtkaccellabel.c	(working copy)
@@ -664,6 +664,8 @@ _gtk_accel_label_class_get_accelerator_l
 gboolean
 gtk_accel_label_refetch (GtkAccelLabel *accel_label)
 {
+  gboolean enable_accelerators;
+
   g_return_val_if_fail (GTK_IS_ACCEL_LABEL (accel_label), FALSE);
 
   if (accel_label->accel_string)
@@ -672,7 +674,11 @@ gtk_accel_label_refetch (GtkAccelLabel *
       accel_label->accel_string = NULL;
     }
 
-  if (accel_label->accel_closure)
+  g_object_get (gtk_widget_get_settings (GTK_WIDGET (accel_label)),
+                "gtk-enable-accelerators", &enable_accelerators,
+                NULL);
+
+  if (enable_accelerators && accel_label->accel_closure)
     {
       GtkAccelKey *key = gtk_accel_group_find (accel_label->accel_group, find_accel, accel_label->accel_closure);
 
Index: gtk/gtkwindow.c
===================================================================
--- gtk/gtkwindow.c	(revision 17214)
+++ gtk/gtkwindow.c	(working copy)
@@ -7698,13 +7698,29 @@ gtk_window_activate_key (GtkWindow   *wi
 
   if (found_entry)
     {
+      gboolean enable_mnemonics;
+      gboolean enable_accelerators;
+
+      g_object_get (gtk_widget_get_settings (GTK_WIDGET (window)),
+                    "gtk-enable-mnemonics", &enable_mnemonics,
+                    "gtk-enable-acceleratore", &enable_accelerators,
+                    NULL);
+
       if (found_entry->is_mnemonic)
-	return gtk_window_mnemonic_activate (window, found_entry->keyval, found_entry->modifiers);
+        {
+          if (enable_mnemonics)
+            return gtk_window_mnemonic_activate (window, found_entry->keyval,
+                                                 found_entry->modifiers);
+        }
       else
-	return gtk_accel_groups_activate (G_OBJECT (window), found_entry->keyval, found_entry->modifiers);
+        {
+          if (enable_accelerators)
+            return gtk_accel_groups_activate (G_OBJECT (window), found_entry->keyval,
+                                              found_entry->modifiers);
+        }
     }
-  else
-    return FALSE;
+
+  return FALSE;
 }
 
 static void
Index: gtk/gtksettings.c
===================================================================
--- gtk/gtksettings.c	(revision 17214)
+++ gtk/gtksettings.c	(working copy)
@@ -100,7 +100,9 @@ enum {
   PROP_COLOR_HASH,
   PROP_FILE_CHOOSER_BACKEND,
   PROP_PRINT_BACKENDS,
-  PROP_PRINT_PREVIEW_COMMAND
+  PROP_PRINT_PREVIEW_COMMAND,
+  PROP_ENABLE_MNEMONICS,
+  PROP_ENABLE_ACCELERATORS
 };
 
 
@@ -676,6 +678,24 @@ gtk_settings_class_init (GtkSettingsClas
                                                                   GTK_PARAM_READWRITE),
                                              NULL); 
   g_assert (result == PROP_PRINT_PREVIEW_COMMAND);
+
+  result = settings_install_property_parser (class,
+                                             g_param_spec_boolean ("gtk-enable-mnemonics",
+                                                                   P_("Enable Mnemonics"),
+                                                                   P_("Whether labels should have mnemonics"),
+                                                                   TRUE,
+                                                                   GTK_PARAM_READWRITE),
+                                             NULL);
+  g_assert (result == PROP_ENABLE_MNEMONICS);
+
+  result = settings_install_property_parser (class,
+                                             g_param_spec_boolean ("gtk-enable-accelerators",
+                                                                   P_("Enable Accelerators"),
+                                                                   P_("Whether menu items should have accelerators"),
+                                                                   TRUE,
+                                                                   GTK_PARAM_READWRITE),
+                                             NULL);
+  g_assert (result == PROP_ENABLE_ACCELERATORS);
 }
 
 static void
Index: gtk/gtklabel.c
===================================================================
--- gtk/gtklabel.c	(revision 17214)
+++ gtk/gtklabel.c	(working copy)
@@ -27,6 +27,7 @@
 #include <math.h>
 #include <string.h>
 #include "gtklabel.h"
+#include "gtkaccellabel.h"
 #include "gtkdnd.h"
 #include "gtkmain.h"
 #include "gtkmarshalers.h"
@@ -969,12 +970,76 @@ gtk_label_hierarchy_changed (GtkWidget *
 }
 
 static void
+label_shortcut_setting_apply (GtkLabel *label)
+{
+  gtk_label_recalculate (label);
+  if (GTK_IS_ACCEL_LABEL (label))
+    gtk_accel_label_refetch (GTK_ACCEL_LABEL (label));
+}
+
+static void
+label_shortcut_setting_traverse_container (GtkWidget *widget,
+                                           gpointer   data)
+{
+  if (GTK_IS_LABEL (widget))
+    label_shortcut_setting_apply (GTK_LABEL (widget));
+  else if (GTK_IS_CONTAINER (widget))
+    gtk_container_forall (GTK_CONTAINER (widget),
+                          label_shortcut_setting_traverse_container, data);
+}
+
+static void
+label_shortcut_setting_changed (GtkSettings *settings)
+{
+  GList *list, *l;
+
+  list = gtk_window_list_toplevels ();
+
+  for (l = list; l ; l = l->next)
+    {
+      GtkWidget *widget = l->data;
+
+      if (gtk_widget_get_settings (widget) == settings)
+        gtk_container_forall (GTK_CONTAINER (widget),
+                              label_shortcut_setting_traverse_container, NULL);
+    }
+
+  g_list_free (list);
+}
+
+static void
 gtk_label_screen_changed (GtkWidget *widget,
 			  GdkScreen *old_screen)
 {
-  gtk_label_clear_layout (GTK_LABEL (widget));
+  GtkSettings *settings;
+  gboolean shortcuts_connected;
+
+  if (!gtk_widget_has_screen (widget))
+    return;
+
+  settings = gtk_widget_get_settings (widget);
+
+  shortcuts_connected =
+    GPOINTER_TO_INT (g_object_get_data (G_OBJECT (settings),
+                                        "gtk-label-shortcuts-connected"));
+
+  if (! shortcuts_connected)
+    {
+      g_signal_connect (settings, "notify::gtk-enable-mnemonics",
+                        G_CALLBACK (label_shortcut_setting_changed),
+                        NULL);
+      g_signal_connect (settings, "notify::gtk-enable-accelerators",
+                        G_CALLBACK (label_shortcut_setting_changed),
+                        NULL);
+
+      g_object_set_data (G_OBJECT (settings), "gtk-label-shortcuts-connected",
+                         GINT_TO_POINTER (TRUE));
+    }
+
+  label_shortcut_setting_apply (GTK_LABEL (widget));
 }
 
+
 static void
 label_mnemonic_widget_weak_notify (gpointer      data,
 				   GObject      *where_the_object_was)
@@ -1461,9 +1526,15 @@ gtk_label_set_pattern_internal (GtkLabel
 				const gchar *pattern)
 {
   PangoAttrList *attrs;
+  gboolean enable_mnemonics;
+
   g_return_if_fail (GTK_IS_LABEL (label));
-  
-  if (pattern)
+
+  g_object_get (gtk_widget_get_settings (GTK_WIDGET (label)),
+		"gtk-enable-mnemonics", &enable_mnemonics,
+		NULL);
+
+  if (enable_mnemonics && pattern)
     attrs = gtk_label_pattern_to_attrs (label, pattern);
   else
     attrs = NULL;
Index: gtk/gtkmenushell.c
===================================================================
--- gtk/gtkmenushell.c	(revision 17214)
+++ gtk/gtkmenushell.c	(working copy)
@@ -685,6 +685,7 @@ gtk_menu_shell_key_press (GtkWidget   *w
 			  GdkEventKey *event)
 {
   GtkMenuShell *menu_shell;
+  gboolean enable_mnemonics;
   
   g_return_val_if_fail (GTK_IS_MENU_SHELL (widget), FALSE);
   g_return_val_if_fail (event != NULL, FALSE);
@@ -697,7 +698,14 @@ gtk_menu_shell_key_press (GtkWidget   *w
   if (gtk_bindings_activate_event (GTK_OBJECT (widget), event))
     return TRUE;
 
-  return gtk_menu_shell_activate_mnemonic (menu_shell, event);
+  g_object_get (gtk_widget_get_settings (widget),
+		"gtk-enable-mnemonics", &enable_mnemonics,
+		NULL);
+
+  if (enable_mnemonics)
+    return gtk_menu_shell_activate_mnemonic (menu_shell, event);
+
+  return FALSE;
 }
 
 static gint
