Index: src/orca/settings.py
===================================================================
--- src/orca/settings.py	(revision 4072)
+++ src/orca/settings.py	(working copy)
@@ -91,6 +91,7 @@
 #
 userCustomizableSettings = [
     "orcaModifierKeys",
+    "defaultModifierMask",
     "enableSpeech",
     "speechServerFactory",
     "speechServerInfo",
@@ -219,7 +220,7 @@
 #
 DESKTOP_MODIFIER_KEYS = ["Insert", "KP_Insert"]
 LAPTOP_MODIFIER_KEYS  = ["Caps_Lock"]
-orcaModifierKeys      = DESKTOP_MODIFIER_KEYS
+orcaModifierKeys      = ["Insert", "KP_Insert"]
 
 # A new modifier to use (set by the press of any key in the
 # orcaModifierKeys list) to represent the Orca modifier.
@@ -1126,7 +1127,12 @@
                                  1 << pyatspi.MODIFIER_ALT |
                                  1 << pyatspi.MODIFIER_META2 |
                                  1 << pyatspi.MODIFIER_META3)
-
+NON_LOCKING_BUT_META3_MODIFIER_MASK = (1 << pyatspi.MODIFIER_SHIFT |
+                                       1 << pyatspi.MODIFIER_ALT |
+                                       1 << pyatspi.MODIFIER_CONTROL |
+                                       1 << pyatspi.MODIFIER_META2 |
+                                       1 << MODIFIER_ORCA)
+                                       
 # The 2nd parameter used when creating a keybinding refers to the
 # modifiers "we care about."  We typically care about all of the
 # modifiers which are not locking keys because we want to avoid
Index: src/orca/orca-setup.glade
===================================================================
--- src/orca/orca-setup.glade	(revision 4072)
+++ src/orca/orca-setup.glade	(working copy)
@@ -4763,13 +4763,13 @@
 			  <property name="yalign">0.5</property>
 			  <property name="xpad">0</property>
 			  <property name="ypad">0</property>
-			  <property name="mnemonic_widget">orcaModKeyEntry</property>
+			  <property name="mnemonic_widget">orcaModKeyInsertCheckButton</property>
 			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
 			  <property name="width_chars">-1</property>
 			  <property name="single_line_mode">False</property>
 			  <property name="angle">0</property>
 			  <accessibility>
-			    <atkrelation target="orcaModKeyEntry" type="label-for"/>
+			    <atkrelation target="orcaModKeyInsertCheckButton" type="label-for"/>
 			  </accessibility>
 			</widget>
 			<packing>
@@ -4780,24 +4780,127 @@
 		      </child>
 
 		      <child>
-			<widget class="GtkEntry" id="orcaModKeyEntry">
-			  <property name="visible">True</property>
-			  <property name="tooltip" translatable="yes">Orca Modifier Keys</property>
-			  <property name="can_focus">True</property>
-			  <property name="editable">False</property>
-			  <property name="visibility">True</property>
-			  <property name="max_length">0</property>
-			  <property name="text" translatable="yes"></property>
-			  <property name="has_frame">True</property>
-			  <property name="invisible_char">●</property>
-			  <property name="activates_default">False</property>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">True</property>
-			  <property name="fill">True</property>
-			</packing>
+		        <widget class="GtkCheckButton" id="orcaModKeyInsertCheckButton">
+		          <property name="visible">True</property>
+    		          <property name="can_focus">True</property>
+		          <property name="label" translatable="yes">Insert</property>
+		          <property name="use_underline">True</property>
+    		          <property name="relief">GTK_RELIEF_NORMAL</property>
+		          <property name="focus_on_click">True</property>
+    		          <property name="active">True</property>
+		          <property name="inconsistent">False</property>
+    		          <property name="draw_indicator">True</property>
+                          <accessibility>
+                            <atkrelation target="orcaModKeyLabel" type="label-by"/>
+			  </accessibility>
+		          <signal name="toggled" handler="orcaModKeysChanged" last_modification_time="Mon, 02 Oct 2006 18:23:03 GMT"/>
+		        </widget>
+    		        <packing>
+		          <property name="padding">0</property>
+    		          <property name="expand">False</property>
+		          <property name="fill">False</property>
+		        </packing>
 		      </child>
+		  
+		      <child>
+		        <widget class="GtkCheckButton" id="orcaModKeyKPInsertCheckButton">
+		          <property name="visible">True</property>
+    		          <property name="can_focus">True</property>
+		          <property name="label" translatable="yes">Keypad Insert</property>
+    		          <property name="use_underline">True</property>
+		          <property name="relief">GTK_RELIEF_NORMAL</property>
+		          <property name="focus_on_click">True</property>
+		          <property name="active">True</property>
+    		          <property name="inconsistent">False</property>
+		          <property name="draw_indicator">True</property>
+		          <signal name="toggled" handler="orcaModKeysChanged" last_modification_time="Mon, 02 Oct 2006 18:23:03 GMT"/>
+		        </widget>
+		        <packing>
+		          <property name="padding">0</property>
+		          <property name="expand">False</property>
+		          <property name="fill">False</property>
+		        </packing>
+    		      </child>
+
+		      <child>
+		        <widget class="GtkCheckButton" id="orcaModKeyCapsLockCheckButton">
+		          <property name="visible">True</property>
+		          <property name="can_focus">True</property>
+		          <property name="label" translatable="yes">Caps Lock</property>
+		          <property name="use_underline">True</property>
+		          <property name="relief">GTK_RELIEF_NORMAL</property>
+		          <property name="focus_on_click">True</property>
+		          <property name="active">True</property>
+		          <property name="inconsistent">False</property>
+		          <property name="draw_indicator">True</property>
+		          <signal name="toggled" handler="orcaModKeysChanged" last_modification_time="Mon, 02 Oct 2006 18:23:03 GMT"/>
+		        </widget>
+		        <packing>
+		          <property name="padding">0</property>
+   		          <property name="expand">False</property>
+		          <property name="fill">False</property>
+		        </packing>
+		      </child>
+
+		      <child>
+		        <widget class="GtkCheckButton" id="orcaModKeyAltGrCheckButton">
+		          <property name="visible">True</property>
+		          <property name="can_focus">True</property>
+		          <property name="label" translatable="yes">Alt Gr</property>
+		          <property name="use_underline">True</property>
+		          <property name="relief">GTK_RELIEF_NORMAL</property>
+		          <property name="focus_on_click">True</property>
+		          <property name="active">True</property>
+		          <property name="inconsistent">False</property>
+		          <property name="draw_indicator">True</property>
+		          <signal name="toggled" handler="orcaModKeysChanged" last_modification_time="Mon, 02 Oct 2006 18:23:03 GMT"/>
+		        </widget>
+  		        <packing>
+		          <property name="padding">0</property>
+		          <property name="expand">False</property>
+		          <property name="fill">False</property>
+		        </packing>
+		      </child>
+		  
+		      <child>
+		        <widget class="GtkCheckButton" id="orcaModKeySuperLCheckButton">
+		          <property name="visible">True</property>
+		          <property name="can_focus">True</property>
+		          <property name="label" translatable="yes">Left Windows</property>
+		          <property name="use_underline">True</property>
+		          <property name="relief">GTK_RELIEF_NORMAL</property>
+		          <property name="focus_on_click">True</property>
+		          <property name="active">True</property>
+		          <property name="inconsistent">False</property>
+		          <property name="draw_indicator">True</property>
+		          <signal name="toggled" handler="orcaModKeysChanged" last_modification_time="Mon, 02 Oct 2006 18:23:03 GMT"/>
+		        </widget>
+		        <packing>
+		          <property name="padding">0</property>
+		          <property name="expand">False</property>
+		          <property name="fill">False</property>
+		        </packing>
+		      </child>
+
+		      <child>
+		        <widget class="GtkCheckButton" id="orcaModKeySuperRCheckButton">
+		          <property name="visible">True</property>
+		          <property name="can_focus">True</property>
+		          <property name="label" translatable="yes">Right Windows</property>
+		          <property name="use_underline">True</property>
+		          <property name="relief">GTK_RELIEF_NORMAL</property>
+		          <property name="focus_on_click">True</property>
+		          <property name="active">True</property>
+		          <property name="inconsistent">False</property>
+		          <property name="draw_indicator">True</property>
+		          <signal name="toggled" handler="orcaModKeysChanged" last_modification_time="Mon, 02 Oct 2006 18:23:03 GMT"/>
+		        </widget>
+		        <packing>
+		          <property name="padding">0</property>
+		          <property name="expand">False</property>
+		          <property name="fill">False</property>
+		        </packing>
+		      </child>
 		    </widget>
 		    <packing>
 		      <property name="padding">0</property>
Index: src/orca/orca_prefs.py
===================================================================
--- src/orca/orca_prefs.py	(revision 4072)
+++ src/orca/orca_prefs.py	(working copy)
@@ -226,14 +226,6 @@
         else:
             return "orca.settings.GENERAL_KEYBOARD_LAYOUT_LAPTOP"
 
-    def _getOrcaModifierKeysString(self, orcaModifierKeys):
-        """Returns a string that represents the Orca modifier keys passed in."""
-
-        if orcaModifierKeys == settings.DESKTOP_MODIFIER_KEYS:
-            return "orca.settings.DESKTOP_MODIFIER_KEYS"
-        else:
-            return "orca.settings.LAPTOP_MODIFIER_KEYS"
-
     def _getSpokenTextAttributesString(self, enabledSpokenTextAttributes):
         """ Returns a string that represents the enabled spoken text attributes 
         passed in.
@@ -710,7 +702,7 @@
             elif key == "keyboardLayout":
                 value = self._getKeyboardLayoutString(prefsDict[key])
             elif key == "orcaModifierKeys":
-                value = self._getOrcaModifierKeysString(prefsDict[key])
+                value = str(prefsDict[key])
             elif key == "enabledSpokenTextAttributes":
                 value = self._getSpokenTextAttributesString(prefsDict[key])
             elif key == "enabledBrailledTextAttributes":
Index: src/orca/orca_gui_prefs.py
===================================================================
--- src/orca/orca_gui_prefs.py	(revision 4072)
+++ src/orca/orca_gui_prefs.py	(working copy)
@@ -124,7 +124,6 @@
         self.keyBindingsModel = None
         self.keyBindView = None
         self.newBinding = None
-        self.orcaModKeyEntry = None
         self.pendingKeyBindings = None
         self.pronunciationModel = None
         self.pronunciationView = None
@@ -2235,10 +2234,21 @@
         if not self.keyBindingsModel.iter_has_child(iterUnbound):
             self.keyBindingsModel.remove(iterUnbound)
 
-        self.orcaModKeyEntry = self.widgets.get_widget("orcaModKeyEntry")
-        self.orcaModKeyEntry.set_text(
-            str(settings.orcaModifierKeys)[1:-1].replace("'",""))
-
+        # Enable those checkboxes for the keys that are present in the orcaModifierKeys list.
+        keys = settings.orcaModifierKeys
+        self.get_widget("orcaModKeyInsertCheckButton").set_active(
+            "Insert" in keys)
+        self.get_widget("orcaModKeyKPInsertCheckButton").set_active(
+            "KP_Insert" in keys)
+        self.get_widget("orcaModKeyCapsLockCheckButton").set_active(
+            "Caps_Lock" in keys)
+        self.get_widget("orcaModKeyAltGrCheckButton").set_active(
+            "ISO_Level3_Shift" in keys)
+        self.get_widget("orcaModKeySuperLCheckButton").set_active(
+            "Super_L" in keys)
+        self.get_widget("orcaModKeySuperRCheckButton").set_active(
+            "Super_R" in keys)
+        
         self._markModified()
 
         # Translators: an external braille device has buttons on it that
@@ -3540,6 +3550,53 @@
             mag.setZoomerColorInversion(value)
         self.prefsDict["enableMagZoomerColorInversion"] = value
 
+    def orcaModKeysChanged(self, widget):
+        """Signal handler for the "toggled" signal for the
+           orcaModKey*CheckButton GtkCheckButton widget.
+
+           Set the 'orcaModifierKeys' preference to the new value.
+
+        Arguments:
+        - widget: the component that generated the signal.
+        """
+
+        value = widget.get_active()
+        name = widget.get_name()
+        key = ""
+        
+        # Check which orcaModKey checkButton called us
+        # and switch on that.
+        if name == "orcaModKeyInsertCheckButton":
+            key = "Insert"
+        elif name == "orcaModKeyKPInsertCheckButton":
+            key = "KP_Insert"
+        elif name == "orcaModKeyCapsLockCheckButton":        
+            key = "Caps_Lock"
+        elif name == "orcaModKeyAltGrCheckButton":
+            key = "ISO_Level3_Shift"
+        elif name == "orcaModKeySuperLCheckButton":
+            key = "Super_L"
+        elif name == "orcaModKeySuperRCheckButton":
+            key = "Super_R"
+
+        # If the list of modifiers already contain the key
+        # then we dont need to add it.
+        if value and key not in self.prefsDict["orcaModifierKeys"]:
+            self.prefsDict["orcaModifierKeys"].append(key)
+        # We dont wish to have the key in the list of modifiers,
+        # so remove it if it is present.
+        elif not value and key in self.prefsDict["orcaModifierKeys"]:
+            self.prefsDict["orcaModifierKeys"].remove(key)
+            
+        # Ensuring that we have the right modifier mask.
+        defaultModifierMask = settings.NON_LOCKING_MODIFIER_MASK
+        #if ("Super_L" or "Super_R) in self.prefsDict["orcaModifierKeys"]:
+        if ("Super_L" in self.prefsDict["orcaModifierKeys"]) or \
+            ("Super_R" in self.prefsDict["orcaModifierKeys"]):
+            defaultModifierMask = \
+            settings.NON_LOCKING_BUT_META3_MODIFIER_MASK             
+        self.prefsDict["defaultModifierMask"] = defaultModifierMask
+
     def keyModifiedToggle(self, cell, path, model, col):
         """When the user changes a checkbox field (boolean field)"""
 
@@ -3741,14 +3798,11 @@
             if widget.get_label() == _("_Desktop"):
                 self.prefsDict["keyboardLayout"] = \
                     settings.GENERAL_KEYBOARD_LAYOUT_DESKTOP
-                self.prefsDict["orcaModifierKeys"] = \
-                    settings.DESKTOP_MODIFIER_KEYS
             else:
                 self.prefsDict["keyboardLayout"] = \
                     settings.GENERAL_KEYBOARD_LAYOUT_LAPTOP
-                self.prefsDict["orcaModifierKeys"] = \
-                    settings.LAPTOP_MODIFIER_KEYS
 
+
     def pronunciationAddButtonClicked(self, widget):
         """Signal handler for the "clicked" signal for the
         pronunciationAddButton GtkButton widget. The user has clicked
