Index: src/orca/settings.py
===================================================================
--- src/orca/settings.py	(revision 4391)
+++ src/orca/settings.py	(working copy)
@@ -88,6 +88,7 @@
 #
 userCustomizableSettings = [
     "orcaModifierKeys",
+    "defaultModifierMask",
     "enableSpeech",
     "speechServerFactory",
     "speechServerInfo",
@@ -218,7 +219,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.
@@ -1163,7 +1164,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 4391)
+++ src/orca/orca-setup.glade	(working copy)
@@ -4789,7 +4789,7 @@
 			  <property name="single_line_mode">False</property>
 			  <property name="angle">0</property>
 			  <accessibility>
-			    <atkrelation target="orcaModKeyEntry" type="label-for"/>
+			    <atkrelation target="orcaModKeyTreeview" type="label-for"/>
 			  </accessibility>
 			</widget>
 			<packing>
@@ -4800,23 +4800,36 @@
 		      </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="GtkScrolledWindow" id="scrolledwindow1">
+  		          <property name="visible">True</property>
+		          <property name="can_focus">True</property>
+		          <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		          <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		          <property name="shadow_type">GTK_SHADOW_IN</property>
+		          <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+		          <child>
+			    <widget class="GtkTreeView" id="orcaModKeyTreeview">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="headers_visible">True</property>
+			      <property name="rules_hint">True</property>
+			      <property name="reorderable">True</property>
+			      <property name="enable_search">True</property>
+			      <property name="fixed_height_mode">False</property>
+			      <property name="hover_selection">False</property>
+			      <property name="hover_expand">False</property>
+			      <accessibility>
+			        <atkrelation target="orcaModKeyLabel" type="label-by"/>
+			      </accessibility>
+			    </widget>
+	                  </child>
+		        </widget>
+		        <packing>
+		          <property name="padding">0</property>
+		          <property name="expand">True</property>
+		          <property name="fill">True</property>
+		        </packing>
 		      </child>
 		    </widget>
 		    <packing>
Index: src/orca/orca_prefs.py
===================================================================
--- src/orca/orca_prefs.py	(revision 4391)
+++ src/orca/orca_prefs.py	(working copy)
@@ -226,13 +226,13 @@
         else:
             return "orca.settings.GENERAL_KEYBOARD_LAYOUT_LAPTOP"
 
-    def _getOrcaModifierKeysString(self, orcaModifierKeys):
+    def _getDefaultModifierMask(self, mask):
         """Returns a string that represents the Orca modifier keys passed in."""
 
-        if orcaModifierKeys == settings.DESKTOP_MODIFIER_KEYS:
-            return "orca.settings.DESKTOP_MODIFIER_KEYS"
+        if mask == settings.NON_LOCKING_BUT_META3_MODIFIER_MASK:
+            return "orca.settings.NON_LOCKING_BUT_META3_MODIFIER_MASK"
         else:
-            return "orca.settings.LAPTOP_MODIFIER_KEYS"
+            return "orca.settings.NON_LOCKING_MODIFIER_MASK"
 
     def _getSpokenTextAttributesString(self, enabledSpokenTextAttributes):
         """ Returns a string that represents the enabled spoken text attributes 
@@ -710,7 +710,9 @@
             elif key == "keyboardLayout":
                 value = self._getKeyboardLayoutString(prefsDict[key])
             elif key == "orcaModifierKeys":
-                value = self._getOrcaModifierKeysString(prefsDict[key])
+                value = str(prefsDict[key])
+            elif key == "defaultModifierMask":
+                value = self._getDefaultModifierMask(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 4391)
+++ src/orca/orca_gui_prefs.py	(working copy)
@@ -63,6 +63,8 @@
 
 (NAME, IS_SPOKEN, IS_BRAILLED, VALUE) = range(4)
 
+(KEY, DESCRIP, ISUSED) = range(3)
+
 (ACTUAL, REPLACEMENT) = range(2)
 
 class OrcaSetupGUI(orca_glade.GladeWrapper):
@@ -124,7 +126,6 @@
         self.keyBindingsModel = None
         self.keyBindView = None
         self.newBinding = None
-        self.orcaModKeyEntry = None
         self.pendingKeyBindings = None
         self.pronunciationModel = None
         self.pronunciationView = None
@@ -391,6 +392,8 @@
         #
         self._populateKeyBindings()
 
+        self._createOrcaModKeyView()
+
         self.window = self.widgets.get_widget("orcaSetupWindow")
         self.window.resize(790, 580)
 
@@ -1072,6 +1075,127 @@
                     self.getTextAttributesView.set_search_column(i)
                     break
 
+    def _createOrcaModKeyView(self):
+        """Create the orca modifiers list view. The view is the
+        orcaModKeyTreeview GtkTreeView widget. The view will consist
+        of a list containing three columns:
+          key - the internal key name as returned by xev
+          Key Name      - the name as we know it.
+          is Orca key     - checkbox to indicate if the key is currently being used.
+        """
+
+        self.orcaModKeyView = self.widgets.get_widget("orcaModKeyTreeview")
+
+        model = gtk.ListStore(
+            gobject.TYPE_STRING,  # key name i.e. (KP_Insert)
+            gobject.TYPE_STRING,  # Human Readable Description
+            gobject.TYPE_BOOLEAN) # if given key is currently a modifier.
+
+        # Key name i.e. (KP_Insert,Insert)
+        #
+        column = gtk.TreeViewColumn("Key",
+                                    gtk.CellRendererText(),
+                                    text=KEY)
+        column.set_resizable(True)
+        column.set_visible(False)
+        column.set_sort_column_id(KEY)
+        self.orcaModKeyView.insert_column(column,KEY)
+
+        # DESCRIP
+        #
+        rendererText = gtk.CellRendererText()
+        rendererText.set_property("ellipsize", pango.ELLIPSIZE_END)
+
+        # Translators: key name is a table column header where the
+        # cells in the column are a name that is commonly refered for a particular key
+        # such as Alt Gr, or Left windows key.
+        #
+        column = gtk.TreeViewColumn(_("Key Name"), rendererText, text=DESCRIP)
+        column.set_resizable(True)
+        column.set_sort_column_id(DESCRIP)
+        self.orcaModKeyView.insert_column(column,DESCRIP)
+
+        # ISUSED
+        #
+        rendererToggle = gtk.CellRendererToggle()
+        rendererToggle.connect('toggled',
+                               self.orcaModKeyToggle,
+                               model,
+                               ISUSED)
+
+        # Translators: "is orca key" is a table column header where the
+        # cells represent whether a given key is to be used as an orca key.
+        #
+        column = gtk.TreeViewColumn(_("is orca key"),
+                                    rendererToggle,
+                                    active=ISUSED,
+                                    activatable=EDITABLE)
+        column.set_resizable(True)
+        column.set_sort_column_id(ISUSED)
+        self.orcaModKeyView.insert_column(column,ISUSED)
+
+        keys = settings.orcaModifierKeys
+
+        keyName = "Insert"
+        # the translation of the Insert key
+        humanKeyName = _("Insert")
+        model.append([keyName, humanKeyName, keyName in keys])
+
+        keyName = "KP_Insert"
+        # the translation of the keypad Insert key
+        humanKeyName = _("Keypad Insert")
+        model.append([keyName, humanKeyName, keyName in keys])
+
+        keyName = "Caps_Lock"
+        # the translation of the caps lock key
+        humanKeyName = _("Caps Lock")
+        model.append([keyName, humanKeyName, keyName in keys])
+
+        keyName = "ISO_Level3_Shift"
+        # the translation of the caps lock key
+        humanKeyName = _("Alt Gr")
+        model.append([keyName, humanKeyName, keyName in keys])
+
+        keyName = "Super_L"
+        # the translation of the left Windows key
+        humanKeyName = _("Left Windows")
+        model.append([keyName, humanKeyName, keyName in keys])
+
+        keyName = "Super_R"
+        # the translation of the right Windows key
+        humanKeyName = _("Right Windows")
+        model.append([keyName, humanKeyName, keyName in keys])
+
+        self.orcaModKeyView.set_model(model)
+
+    def orcaModKeyToggle(self, cell, path, model, col):
+        """When the user changes a checkbox field (boolean field)
+        indicating their choice whether the given key should be used as an orca key
+        """
+
+        value = not model[path][col]
+        model[path][col] = value
+        key = model[path][KEY] 
+        
+        # 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" in self.prefsDict["orcaModifierKeys"]) or \
+          ("Super_R" in self.prefsDict["orcaModifierKeys"]):
+            defaultModifierMask = \
+            settings.NON_LOCKING_BUT_META3_MODIFIER_MASK             
+        self.prefsDict["defaultModifierMask"] = defaultModifierMask
+
+        return
+
     def _createTextAttributesTreeView(self):
         """Create the text attributes tree view. The view is the
         textAttributesTreeView GtkTreeView widget. The view will consist
@@ -2257,11 +2381,7 @@
 
         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("'",""))
-
+        
         self._markModified()
 
         # Translators: an external braille device has buttons on it that
@@ -3778,14 +3898,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
