Index: src/orca/settings.py
===================================================================
--- src/orca/settings.py	(revision 4599)
+++ src/orca/settings.py	(working copy)
@@ -88,6 +88,7 @@
 #
 userCustomizableSettings = [
     "orcaModifierKeys",
+    "defaultModifierMask",
     "enableSpeech",
     "speechServerFactory",
     "speechServerInfo",
@@ -220,8 +221,20 @@
 #
 DESKTOP_MODIFIER_KEYS = ["Insert", "KP_Insert"]
 LAPTOP_MODIFIER_KEYS  = ["Caps_Lock"]
-orcaModifierKeys      = DESKTOP_MODIFIER_KEYS
+orcaModifierKeys      = ["Insert", "KP_Insert"]
 
+# The keys that can potentially act as
+# the orca modifier key.
+# These keys and names will appear in the preferences.
+#
+POSSIBLE_ORCA_KEYS = ( ["Insert", _("Insert")],
+                       ["KP_Insert", _("Keypad Insert")],
+                       ["Caps_Lock", _("Caps Lock")],
+                       ["ISO_Level3_Shift", _("Alt Gr")],
+                       ["Super_L", _("Left Windows")],
+                       ["Super_R", _("Right Windows")] )
+
+
 # A new modifier to use (set by the press of any key in the
 # orcaModifierKeys list) to represent the Orca modifier.
 #
@@ -1194,7 +1207,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 4599)
+++ src/orca/orca-setup.glade	(working copy)
@@ -697,11 +697,13 @@
 					  <property name="right_padding">0</property>
 
 					  <child>
-			                    <widget class="GtkTable" id="radioButtonTable">
-			                      <property name="visible">True</property>
-			                      <property name="n_rows">2</property>
-			                      <property name="n_columns">2</property>
-			                      <property name="homogeneous">False</property>
+					    <widget class="GtkTable" id="radioButtonTable">
+					      <property name="visible">True</property>
+					      <property name="n_rows">2</property>
+					      <property name="n_columns">2</property>
+					      <property name="homogeneous">False</property>
+					      <property name="row_spacing">0</property>
+					      <property name="column_spacing">0</property>
 
 					      <child>
 						<widget class="GtkRadioButton" id="noneButton">
@@ -717,10 +719,10 @@
 						  <signal name="toggled" handler="punctuationLevelChanged" last_modification_time="Thu, 27 Apr 2006 14:59:34 GMT"/>
 						</widget>
 						<packing>
-			                          <property name="left_attach">0</property>
-			                          <property name="right_attach">1</property>
-			                          <property name="top_attach">0</property>
-			                          <property name="bottom_attach">1</property>
+						  <property name="left_attach">0</property>
+						  <property name="right_attach">1</property>
+						  <property name="top_attach">0</property>
+						  <property name="bottom_attach">1</property>
 						</packing>
 					      </child>
 
@@ -739,10 +741,10 @@
 						  <signal name="toggled" handler="punctuationLevelChanged" last_modification_time="Thu, 27 Apr 2006 14:59:42 GMT"/>
 						</widget>
 						<packing>
-			                          <property name="left_attach">0</property>
-			                          <property name="right_attach">1</property>
-			                          <property name="top_attach">1</property>
-			                          <property name="bottom_attach">2</property>
+						  <property name="left_attach">0</property>
+						  <property name="right_attach">1</property>
+						  <property name="top_attach">1</property>
+						  <property name="bottom_attach">2</property>
 						</packing>
 					      </child>
 
@@ -761,10 +763,10 @@
 						  <signal name="toggled" handler="punctuationLevelChanged" last_modification_time="Thu, 22 Jun 2006 14:15:29 GMT"/>
 						</widget>
 						<packing>
-			                          <property name="left_attach">1</property>
-			                          <property name="right_attach">2</property>
-			                          <property name="top_attach">0</property>
-			                          <property name="bottom_attach">1</property>
+						  <property name="left_attach">1</property>
+						  <property name="right_attach">2</property>
+						  <property name="top_attach">0</property>
+						  <property name="bottom_attach">1</property>
 						</packing>
 					      </child>
 
@@ -783,10 +785,10 @@
 						  <signal name="toggled" handler="punctuationLevelChanged" last_modification_time="Thu, 27 Apr 2006 14:59:51 GMT"/>
 						</widget>
 						<packing>
-			                          <property name="left_attach">1</property>
-			                          <property name="right_attach">2</property>
-			                          <property name="top_attach">1</property>
-			                          <property name="bottom_attach">2</property>
+						  <property name="left_attach">1</property>
+						  <property name="right_attach">2</property>
+						  <property name="top_attach">1</property>
+						  <property name="bottom_attach">2</property>
 						</packing>
 					      </child>
 					    </widget>
@@ -1228,39 +1230,42 @@
 			  <property name="n_rows">3</property>
 			  <property name="n_columns">2</property>
 			  <property name="homogeneous">False</property>
+			  <property name="row_spacing">0</property>
+			  <property name="column_spacing">0</property>
 
-		      	<child>
+			  <child>
 			    <widget class="GtkHBox" id="hbox43">
 			      <property name="visible">True</property>
 			      <property name="homogeneous">False</property>
+			      <property name="spacing">0</property>
 
 			      <child>
-			        <widget class="GtkCheckButton" id="speechProgressBarCheckbutton">
-			          <property name="visible">True</property>
-			          <property name="can_focus">True</property>
-			          <property name="label" translatable="yes">Speak progress bar _updates</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="speechProgressBarChecked" last_modification_time="Mon, 18 Jun 2007 16:59:36 GMT"/>
-			        </widget>
-			        <packing>
-			          <property name="padding">0</property>
-			          <property name="expand">False</property>
-			          <property name="fill">False</property>
-			        </packing>
+				<widget class="GtkCheckButton" id="speechProgressBarCheckbutton">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="label" translatable="yes">Speak progress bar _updates</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="speechProgressBarChecked" last_modification_time="Mon, 18 Jun 2007 16:59:36 GMT"/>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
 			      </child>
 
 			      <child>
-			        <widget class="GtkHBox" id="speakUpdateIntervalHBox">
-			          <property name="visible">True</property>
-			          <property name="homogeneous">False</property>
-			          <property name="spacing">3</property>
+				<widget class="GtkHBox" id="speakUpdateIntervalHBox">
+				  <property name="visible">True</property>
+				  <property name="homogeneous">False</property>
+				  <property name="spacing">3</property>
 
-			          <child>
+				  <child>
 				    <widget class="GtkLabel" id="speakProgressBarLabel">
 				      <property name="visible">True</property>
 				      <property name="label" translatable="yes" comments="Translators: Here 'every' labels a spin button through which a user can customize the frequency in seconds an announcement should be made. (The spin button is followed by the label 'seconds'.) Thus if a user chooses 5 in the spin button, the complete phrase would be 'every 5 seconds'.">every</property>
@@ -1279,7 +1284,7 @@
 				      <property name="single_line_mode">False</property>
 				      <property name="angle">0</property>
 				      <accessibility>
-				        <atkrelation target="speakProgressBarSpinButton" type="label-for"/>
+					<atkrelation target="speakProgressBarSpinButton" type="label-for"/>
 				      </accessibility>
 				    </widget>
 				    <packing>
@@ -1287,9 +1292,9 @@
 				      <property name="expand">False</property>
 				      <property name="fill">False</property>
 				    </packing>
-			          </child>
+				  </child>
 
-			          <child>
+				  <child>
 				    <widget class="GtkSpinButton" id="speakProgressBarSpinButton">
 				      <property name="visible">True</property>
 				      <property name="can_focus">True</property>
@@ -1301,8 +1306,8 @@
 				      <property name="wrap">False</property>
 				      <property name="adjustment">10 1 9999 1 10 0</property>
 				      <accessibility>
-				        <atkrelation target="speakProgressBarUnitsLabel" type="labelled-by"/>
-				        <atkrelation target="speakProgressBarLabel" type="labelled-by"/>
+					<atkrelation target="speakProgressBarLabel" type="labelled-by"/>
+					<atkrelation target="speakProgressBarUnitsLabel" type="labelled-by"/>
 				      </accessibility>
 				      <signal name="value_changed" handler="speakProgressBarValueChanged" last_modification_time="Thu, 14 Jun 2007 15:09:00 GMT"/>
 				    </widget>
@@ -1311,9 +1316,9 @@
 				      <property name="expand">False</property>
 				      <property name="fill">True</property>
 				    </packing>
-			          </child>
+				  </child>
 
-			          <child>
+				  <child>
 				    <widget class="GtkLabel" id="speakProgressBarUnitsLabel">
 				      <property name="visible">True</property>
 				      <property name="label" translatable="yes">seconds</property>
@@ -1331,7 +1336,7 @@
 				      <property name="single_line_mode">False</property>
 				      <property name="angle">0</property>
 				      <accessibility>
-				        <atkrelation target="speakProgressBarSpinButton" type="label-for"/>
+					<atkrelation target="speakProgressBarSpinButton" type="label-for"/>
 				      </accessibility>
 				    </widget>
 				    <packing>
@@ -1339,13 +1344,13 @@
 				      <property name="expand">False</property>
 				      <property name="fill">False</property>
 				    </packing>
-			          </child>
-			        </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>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
 			      </child>
 			    </widget>
 			    <packing>
@@ -1354,9 +1359,9 @@
 			      <property name="top_attach">0</property>
 			      <property name="bottom_attach">1</property>
 			    </packing>
-		          </child>
+			  </child>
 
-		          <child>
+			  <child>
 			    <widget class="GtkCheckButton" id="speechIndentationCheckbutton">
 			      <property name="visible">True</property>
 			      <property name="can_focus">True</property>
@@ -1375,9 +1380,9 @@
 			      <property name="top_attach">0</property>
 			      <property name="bottom_attach">1</property>
 			    </packing>
-		          </child>
+			  </child>
 
-		          <child>
+			  <child>
 			    <widget class="GtkCheckButton" id="speakBlankLinesCheckButton">
 			      <property name="visible">True</property>
 			      <property name="can_focus">True</property>
@@ -1396,9 +1401,9 @@
 			      <property name="top_attach">1</property>
 			      <property name="bottom_attach">2</property>
 			    </packing>
-		          </child>
+			  </child>
 
-		          <child>
+			  <child>
 			    <widget class="GtkCheckButton" id="speakMultiCaseAsWordsCheckButton">
 			      <property name="visible">True</property>
 			      <property name="can_focus">True</property>
@@ -1417,9 +1422,9 @@
 			      <property name="top_attach">1</property>
 			      <property name="bottom_attach">2</property>
 			    </packing>
-		          </child>
+			  </child>
 
-		          <child>
+			  <child>
 			    <widget class="GtkCheckButton" id="speakTutorialMessagesCheckButton">
 			      <property name="visible">True</property>
 			      <property name="can_focus">True</property>
@@ -1438,9 +1443,9 @@
 			      <property name="top_attach">2</property>
 			      <property name="bottom_attach">3</property>
 			    </packing>
-		          </child>
+			  </child>
 
-		          <child>
+			  <child>
 			    <widget class="GtkCheckButton" id="speakMnemonicsCheckButton">
 			      <property name="visible">True</property>
 			      <property name="can_focus">True</property>
@@ -1459,8 +1464,7 @@
 			      <property name="top_attach">2</property>
 			      <property name="bottom_attach">3</property>
 			    </packing>
-		          </child>
-
+			  </child>
 			</widget>
 			<packing>
 			  <property name="padding">0</property>
@@ -1469,8 +1473,6 @@
 			</packing>
 		      </child>
 
-
-
 		      <child>
 			<widget class="GtkHBox" id="hbox39">
 			  <property name="visible">True</property>
@@ -1652,7 +1654,7 @@
 			  <property name="active">False</property>
 			  <property name="inconsistent">False</property>
 			  <property name="draw_indicator">True</property>
-			  <signal name="toggled" handler="disableBrailleEOLChecked" last_modification_time="Thu, 21 May 2008 14:39:01 GMT"/>
+			  <signal name="toggled" handler="disableBrailleEOLChecked" last_modification_time="Wed, 21 May 2008 14:39:01 GMT"/>
 			</widget>
 			<packing>
 			  <property name="padding">0</property>
@@ -3812,8 +3814,8 @@
 							  <property name="wrap">False</property>
 							  <property name="adjustment">1 24 256 1 10 0</property>
 							  <accessibility>
+							    <atkrelation target="magCursorSizeUnitsLabel" type="labelled-by"/>
 							    <atkrelation target="magCursorSizeLabel" type="labelled-by"/>
-							    <atkrelation target="magCursorSizeUnitsLabel" type="labelled-by"/>
 							  </accessibility>
 							  <signal name="value_changed" handler="magCursorSizeValueChanged" last_modification_time="Wed, 03 May 2006 15:31:48 GMT"/>
 							</widget>
@@ -4165,8 +4167,8 @@
 							  <property name="wrap">False</property>
 							  <property name="adjustment">1 1 256 1 10 0</property>
 							  <accessibility>
+							    <atkrelation target="magCrossHairSizeUnitsLabel" type="labelled-by"/>
 							    <atkrelation target="magCrossHairSizeLabel" type="labelled-by"/>
-							    <atkrelation target="magCrossHairSizeUnitsLabel" type="labelled-by"/>
 							  </accessibility>
 							  <signal name="value_changed" handler="magCrossHairSizeValueChanged" last_modification_time="Wed, 03 May 2006 15:39:23 GMT"/>
 							</widget>
@@ -4603,8 +4605,8 @@
 						  <property name="wrap">False</property>
 						  <property name="adjustment">0 0 100 1 10 0</property>
 						  <accessibility>
+						    <atkrelation target="magEdgeMarginLabel" type="labelled-by"/>
 						    <atkrelation target="magEdgeMarginUnitsLabel" type="labelled-by"/>
-						    <atkrelation target="magEdgeMarginLabel" type="labelled-by"/>
 						  </accessibility>
 						  <signal name="value_changed" handler="magEdgeMarginValueChanged" last_modification_time="Thu, 06 Dec 2007 22:57:50 GMT"/>
 						</widget>
@@ -4830,17 +4832,57 @@
 		  <property name="spacing">6</property>
 
 		  <child>
-		    <widget class="GtkHBox" id="hbox36">
+		    <widget class="GtkFrame" id="OrcaModifierKeysFrame">
 		      <property name="visible">True</property>
-		      <property name="homogeneous">False</property>
-		      <property name="spacing">3</property>
+		      <property name="label_xalign">0</property>
+		      <property name="label_yalign">0.5</property>
+		      <property name="shadow_type">GTK_SHADOW_NONE</property>
 
 		      <child>
+			<widget class="GtkAlignment" id="alignment87">
+			  <property name="visible">True</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xscale">1</property>
+			  <property name="yscale">1</property>
+			  <property name="top_padding">0</property>
+			  <property name="bottom_padding">0</property>
+			  <property name="left_padding">12</property>
+			  <property name="right_padding">0</property>
+
+			  <child>
+			    <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>
+				</widget>
+			      </child>
+			    </widget>
+			  </child>
+			</widget>
+		      </child>
+
+		      <child>
 			<widget class="GtkLabel" id="orcaModKeyLabel">
 			  <property name="visible">True</property>
-			  <property name="label" translatable="yes">Orca _Modifier Key(s):</property>
+			  <property name="label" translatable="yes">&lt;b&gt;Orca _Modifier Key(s):&lt;/b&gt;</property>
 			  <property name="use_underline">True</property>
-			  <property name="use_markup">False</property>
+			  <property name="use_markup">True</property>
 			  <property name="justify">GTK_JUSTIFY_LEFT</property>
 			  <property name="wrap">False</property>
 			  <property name="selectable">False</property>
@@ -4848,71 +4890,91 @@
 			  <property name="yalign">0.5</property>
 			  <property name="xpad">0</property>
 			  <property name="ypad">0</property>
-			  <property name="mnemonic_widget">orcaModKeyEntry</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"/>
-			  </accessibility>
 			</widget>
 			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">False</property>
+			  <property name="type">label_item</property>
 			</packing>
 		      </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>
-		      </child>
 		    </widget>
 		    <packing>
 		      <property name="padding">0</property>
-		      <property name="expand">False</property>
+		      <property name="expand">True</property>
 		      <property name="fill">True</property>
 		    </packing>
 		  </child>
 
 		  <child>
-		    <widget class="GtkScrolledWindow" id="scrolledwindow1">
+		    <widget class="GtkFrame" id="keyBindingsFrame">
 		      <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>
+		      <property name="label_xalign">0</property>
+		      <property name="label_yalign">0.5</property>
+		      <property name="shadow_type">GTK_SHADOW_NONE</property>
 
 		      <child>
-			<widget class="GtkTreeView" id="keyBindingsTreeview">
+			<widget class="GtkAlignment" id="alignment87">
 			  <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>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xscale">1</property>
+			  <property name="yscale">1</property>
+			  <property name="top_padding">0</property>
+			  <property name="bottom_padding">0</property>
+			  <property name="left_padding">12</property>
+			  <property name="right_padding">0</property>
+
+			  <child>
+			    <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="keyBindingsTreeview">
+				  <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>
+				</widget>
+			      </child>
+			    </widget>
+			  </child>
 			</widget>
 		      </child>
+
+		      <child>
+			<widget class="GtkLabel" id="keyBindingsTreeviewLabel">
+			  <property name="visible">True</property>
+			  <property name="label" translatable="yes">&lt;b&gt;Key Bindings:&lt;/b&gt;</property>
+			  <property name="use_underline">True</property>
+			  <property name="use_markup">True</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">False</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</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>
+			</widget>
+			<packing>
+			  <property name="type">label_item</property>
+			</packing>
+		      </child>
 		    </widget>
 		    <packing>
 		      <property name="padding">0</property>
Index: src/orca/orca_prefs.py
===================================================================
--- src/orca/orca_prefs.py	(revision 4599)
+++ 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 4599)
+++ src/orca/orca_gui_prefs.py	(working copy)
@@ -63,6 +63,8 @@
 
 (NAME, IS_SPOKEN, IS_BRAILLED, VALUE) = range(4)
 
+(XEV_KEY, HUMAN_NAME, IS_USED) = range(3)
+
 (ACTUAL, REPLACEMENT) = range(2)
 
 # Must match the order of voice types in the glade file.
@@ -129,7 +131,6 @@
         self.keyBindingsModel = None
         self.keyBindView = None
         self.newBinding = None
-        self.orcaModKeyEntry = None
         self.pendingKeyBindings = None
         self.planeCellRendererText = None
         self.pronunciationModel = None
@@ -425,6 +426,8 @@
         #
         self._populateKeyBindings()
 
+        self._createOrcaModKeyView()
+
         self.window = self.widgets.get_widget("orcaSetupWindow")
         self.window.resize(790, 580)
 
@@ -678,7 +681,7 @@
 
         if not valueSet:
             debug.println(debug.LEVEL_FINEST,
-                          "Could not find speech family match for %s" \
+                          "Could not find speech family match For %s" \
                           % familyName)
             self.get_widget("speechFamilies").set_active(0)
             self.speechFamiliesChoice = self.speechFamiliesChoices[0]
@@ -1088,6 +1091,105 @@
                     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.
+
+        # xev Key name i.e. (KP_Insert,Insert)
+        #
+        #column = gtk.TreeViewColumn("Key",
+        #                            gtk.CellRendererText(),
+        #                            text=XEV_KEY)
+        #column.set_resizable(True)
+        #column.set_visible(False)
+        #column.set_min_width(200)
+        #column.set_sort_column_id(XEV_KEY)
+        #self.orcaModKeyView.insert_column(column, XEV_KEY)
+
+        # HUMAN_NAME
+        #
+        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=HUMAN_NAME)
+        column.set_resizable(True)
+        column.set_min_width(200)
+        column.set_sort_column_id(HUMAN_NAME)
+        self.orcaModKeyView.insert_column(column,HUMAN_NAME)
+
+        # IS_USED
+        #
+        rendererToggle = gtk.CellRendererToggle()
+        rendererToggle.connect('toggled',
+                               self.orcaModKeyToggle,
+                               model,
+                               IS_USED)
+
+        # 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(_("Use as Orca Key"),
+                                    rendererToggle,
+                                    active=IS_USED,
+                                    activatable=EDITABLE)
+        column.set_resizable(False)
+        column.set_sort_column_id(IS_USED)
+        column.set_max_width(180)
+        self.orcaModKeyView.insert_column(column,IS_USED)
+
+        keys = settings.orcaModifierKeys
+        possibleOrcaKeys = settings.POSSIBLE_ORCA_KEYS 
+        for [xevKey, humanName] in possibleOrcaKeys:
+            thisIter = model.append()
+            model.set(thisIter, XEV_KEY, xevKey, HUMAN_NAME, humanName, IS_USED, xevKey in keys)
+
+        self.orcaModKeyView.set_model(model)
+
+    def orcaModKeyToggle(self, cell, path, model):
+        """When the user changes a checkbox field (boolean field)
+        indicating their choice whether the given key should be used as an orca key
+        """
+
+        thisIter = model.get_iter(path)
+        value = not model[path][IS_USED]
+        model.set(thisIter, IS_BRAILLED, value)
+        key = model[path][XEV_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
@@ -2278,11 +2380,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
@@ -3825,14 +3923,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
