1diff --git a/gdk/quartz/gdkevents-quartz.c b/gdk/quartz/gdkevents-quartz.c
2index a8800f7..ec6a893 100644
3--- a/gdk/quartz/gdkevents-quartz.c
4+++ b/gdk/quartz/gdkevents-quartz.c
5@@ -292,10 +292,19 @@ get_keyboard_modifiers_from_ns_flags (NSUInteger nsflags)
6     modifiers |= GDK_SHIFT_MASK;
7   if (nsflags & NSControlKeyMask)
8     modifiers |= GDK_CONTROL_MASK;
9-  if (nsflags & NSAlternateKeyMask)
10-    modifiers |= GDK_MOD1_MASK;
11-  if (nsflags & NSCommandKeyMask)
12-    modifiers |= GDK_MOD2_MASK;
13+
14+  if (gdk_quartz_get_fix_modifiers ())
15+    {
16+      if (nsflags & NSAlternateKeyMask)
17+        modifiers |= GDK_MOD1_MASK;
18+      if (nsflags & NSCommandKeyMask)
19+        modifiers |= GDK_MOD2_MASK;
20+    }
21+  else
22+    {
23+      if (nsflags & NSCommandKeyMask)
24+        modifiers |= GDK_MOD1_MASK;
25+    }
26
27   return modifiers;
28 }
29@@ -930,7 +939,7 @@ fill_key_event (GdkWindow    *window,
30         {
31         case GDK_Meta_R:
32         case GDK_Meta_L:
33-          mask = GDK_MOD2_MASK;
34+          mask = gdk_quartz_get_fix_modifiers () ? GDK_MOD2_MASK : GDK_MOD1_MASK;
35           break;
36         case GDK_Shift_R:
37         case GDK_Shift_L:
38@@ -941,7 +950,7 @@ fill_key_event (GdkWindow    *window,
39           break;
40         case GDK_Alt_R:
41         case GDK_Alt_L:
42-          mask = GDK_MOD1_MASK;
43+          mask = gdk_quartz_get_fix_modifiers () ? GDK_MOD1_MASK : GDK_MOD2_MASK;
44           break;
45         case GDK_Control_R:
46         case GDK_Control_L:
47@@ -1089,9 +1098,9 @@ _gdk_quartz_events_get_current_keyboard_modifiers (void)
48       if (carbon_modifiers & controlKey)
49         modifiers |= GDK_CONTROL_MASK;
50       if (carbon_modifiers & optionKey)
51-        modifiers |= GDK_MOD1_MASK;
52+        modifiers |= (gdk_quartz_get_fix_modifiers () ? GDK_MOD1_MASK : GDK_MOD2_MASK);
53       if (carbon_modifiers & cmdKey)
54-        modifiers |= GDK_MOD2_MASK;
55+        modifiers |= (gdk_quartz_get_fix_modifiers () ? GDK_MOD2_MASK : GDK_MOD1_MASK);
56
57       return modifiers;
58     }
59diff --git a/gdk/quartz/gdkglobals-quartz.c b/gdk/quartz/gdkglobals-quartz.c
60index 53c6d5e..31dbab1 100644
61--- a/gdk/quartz/gdkglobals-quartz.c
62+++ b/gdk/quartz/gdkglobals-quartz.c
63@@ -41,3 +41,17 @@ gdk_quartz_osx_version (void)
64   else
65     return minor;
66 }
67+
68+static gboolean fix_modifiers = FALSE;
69+
70+void
71+gdk_quartz_set_fix_modifiers (gboolean fix)
72+{
73+  fix_modifiers = fix;
74+}
75+
76+gboolean
77+gdk_quartz_get_fix_modifiers (void)
78+{
79+  return fix_modifiers;
80+}
81diff --git a/gdk/quartz/gdkkeys-quartz.c b/gdk/quartz/gdkkeys-quartz.c
82index 19a20f5..c7ceec6 100644
83--- a/gdk/quartz/gdkkeys-quartz.c
84+++ b/gdk/quartz/gdkkeys-quartz.c
85@@ -693,11 +693,11 @@ gdk_keymap_translate_keyboard_state (GdkKeymap       *keymap,
86   for (bit = GDK_SHIFT_MASK; bit < GDK_BUTTON1_MASK; bit <<= 1)
87     {
88       if (translate_keysym (hardware_keycode,
89-                            (bit == GDK_MOD1_MASK) ? 0 : group,
90+                            (bit == (gdk_quartz_get_fix_modifiers () ? GDK_MOD1_MASK : GDK_MOD2_MASK)) ? 0 : group,
91                             state & ~bit,
92                             NULL, NULL) !=
93	  translate_keysym (hardware_keycode,
94-                            (bit == GDK_MOD1_MASK) ? 1 : group,
95+                            (bit == (gdk_quartz_get_fix_modifiers () ? GDK_MOD1_MASK : GDK_MOD2_MASK)) ? 1 : group,
96                             state | bit,
97                             NULL, NULL))
98	tmp_modifiers |= bit;
99@@ -718,16 +718,32 @@ void
100 gdk_keymap_add_virtual_modifiers (GdkKeymap       *keymap,
101                                   GdkModifierType *state)
102 {
103-  if (*state & GDK_MOD2_MASK)
104-    *state |= GDK_META_MASK;
105+  if (gdk_quartz_get_fix_modifiers ())
106+    {
107+      if (*state & GDK_MOD2_MASK)
108+        *state |= GDK_META_MASK;
109+    }
110+  else
111+    {
112+      if (*state & GDK_MOD1_MASK)
113+        *state |= GDK_META_MASK;
114+    }
115 }
116
117 gboolean
118 gdk_keymap_map_virtual_modifiers (GdkKeymap       *keymap,
119                                   GdkModifierType *state)
120 {
121-  if (*state & GDK_META_MASK)
122-    *state |= GDK_MOD2_MASK;
123+  if (gdk_quartz_get_fix_modifiers ())
124+    {
125+      if (*state & GDK_META_MASK)
126+        *state |= GDK_MOD2_MASK;
127+    }
128+  else
129+    {
130+      if (*state & GDK_META_MASK)
131+        *state |= GDK_MOD1_MASK;
132+    }
133
134   return TRUE;
135 }
136diff --git a/gdk/quartz/gdkquartz.h b/gdk/quartz/gdkquartz.h
137index 742d651..ed0ba35 100644
138--- a/gdk/quartz/gdkquartz.h
139+++ b/gdk/quartz/gdkquartz.h
140@@ -58,6 +58,9 @@ id        gdk_quartz_drag_context_get_dragging_info_libgtk_only (GdkDragContext
141 NSEvent  *gdk_quartz_event_get_nsevent                          (GdkEvent       *event);
142 GdkOSXVersion gdk_quartz_osx_version                            (void);
143
144+void      gdk_quartz_set_fix_modifiers (gboolean fix);
145+gboolean  gdk_quartz_get_fix_modifiers (void);
146+
147 G_END_DECLS
148
149 #endif /* __GDK_QUARTZ_H__ */
150diff --git a/gtk/gtkprivate.h b/gtk/gtkprivate.h
151index 6386c32..aa1cc74 100644
152--- a/gtk/gtkprivate.h
153+++ b/gtk/gtkprivate.h
154@@ -122,7 +122,7 @@ gboolean _gtk_fnmatch (const char *pattern,
155 #ifndef GDK_WINDOWING_QUARTZ
156 #define GTK_NO_TEXT_INPUT_MOD_MASK (GDK_MOD1_MASK | GDK_CONTROL_MASK)
157 #else
158-#define GTK_NO_TEXT_INPUT_MOD_MASK (GDK_MOD2_MASK | GDK_CONTROL_MASK)
159+#define GTK_NO_TEXT_INPUT_MOD_MASK (gdk_quartz_get_fix_modifiers () ? (GDK_MOD2_MASK | GDK_CONTROL_MASK) : (GDK_MOD1_MASK | GDK_CONTROL_MASK))
160 #endif
161
162 #ifndef GDK_WINDOWING_QUARTZ
163@@ -130,13 +130,13 @@ gboolean _gtk_fnmatch (const char *pattern,
164 #define GTK_MODIFY_SELECTION_MOD_MASK GDK_CONTROL_MASK
165 #else
166 #define GTK_EXTEND_SELECTION_MOD_MASK GDK_SHIFT_MASK
167-#define GTK_MODIFY_SELECTION_MOD_MASK GDK_MOD2_MASK
168+#define GTK_MODIFY_SELECTION_MOD_MASK (gdk_quartz_get_fix_modifiers () ? GDK_MOD2_MASK : GDK_MOD1_MASK)
169 #endif
170
171 #ifndef GDK_WINDOWING_QUARTZ
172 #define GTK_TOGGLE_GROUP_MOD_MASK 0
173 #else
174-#define GTK_TOGGLE_GROUP_MOD_MASK GDK_MOD1_MASK
175+#define GTK_TOGGLE_GROUP_MOD_MASK (gdk_quartz_get_fix_modifiers () ? GDK_MOD1_MASK : 0)
176 #endif
177
178 gboolean _gtk_button_event_triggers_context_menu (GdkEventButton *event);
179