diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index 3bd6619d81821f47aa5c6aa25cd3266c8b4e68cf..c63ecbe1a6146f0c7ad3043abb03ebdf50e23026 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -83,7 +83,12 @@
         <!-- Default width of a key, in pixels or percentage of display width. -->
         <attr name="keyWidth" format="dimension|fraction" />
         <!-- Default height of a row (key height + vertical gap), in pixels or percentage of
-             keyboard height. -->
+             keyboard height.
+             If the value is zero, the actual key width will be determined to fill out the area up
+             to the right edge of the keyboard.
+             If the value is negative, the actual key width will be determined to fill out the
+             area between the nearest key on the left hand side and the right edge of the keyboard.
+             -->
         <attr name="rowHeight" format="dimension|fraction" />
         <!-- Default horizontal gap between keys. -->
         <attr name="horizontalGap" format="dimension|fraction" />
@@ -142,6 +147,9 @@
         <attr name="shiftedIcon" format="reference" />
         <!-- The key is enabled and responds on press. -->
         <attr name="enabled" format="boolean" />
+        <!-- The X-coordinate of upper right corner of this key including horizontal gap.
+             If the value is negative, the origin is the right edge of the keyboard. -->
+        <attr name="keyXPos" format="dimension|fraction" />
     </declare-styleable>
 
     <declare-styleable name="Keyboard_Row">
diff --git a/java/res/xml-iw/kbd_qwerty.xml b/java/res/xml-iw/kbd_qwerty.xml
index 98bfd7e0b2d09d68be179fe025a3eb061de57f9d..6c2504e657b7ee9ce71cdd77ce4cccfead03b005 100644
--- a/java/res/xml-iw/kbd_qwerty.xml
+++ b/java/res/xml-iw/kbd_qwerty.xml
@@ -35,7 +35,7 @@
         latin:rowEdgeFlags="top"
     >
         <Spacer
-            latin:horizontalGap="5%p" />
+            latin:keyWidth="5%p" />
         <Key
             latin:keyLabel="ק"
             latin:keyEdgeFlags="left" />
@@ -54,7 +54,7 @@
         <Key
             latin:keyLabel="פ" />
         <Spacer
-            latin:horizontalGap="1.25%p" />
+            latin:keyWidth="1.25%p" />
         <Key
             latin:keyStyle="deleteKeyStyle"
             latin:keyWidth="13.75%p"
@@ -86,7 +86,7 @@
     </Row>
     <Row>
         <Spacer
-            latin:horizontalGap="5%p" />
+            latin:keyWidth="5%p" />
         <Key
             latin:keyLabel="×–"
             latin:keyEdgeFlags="left" />
diff --git a/java/res/xml-sw600dp/kbd_azerty_rows.xml b/java/res/xml-sw600dp/kbd_azerty_rows.xml
index 5ad11470e28dfe155ef45d99218d12e20789e989..3d57ae7155ad9d13ac72c8549921a0a2838c8bb7 100644
--- a/java/res/xml-sw600dp/kbd_azerty_rows.xml
+++ b/java/res/xml-sw600dp/kbd_azerty_rows.xml
@@ -24,7 +24,7 @@
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <Row
-        latin:keyWidth="10%p"
+        latin:keyWidth="9.0%p"
         latin:rowEdgeFlags="top"
     >
         <Key
@@ -67,11 +67,15 @@
         <Key
             latin:keyLabel="p"
             latin:keyHintIcon="@drawable/key_hint_num0_holo"
-            latin:popupCharacters="@string/alternates_for_p"
+            latin:popupCharacters="@string/alternates_for_p" />
+        <Key
+            latin:keyStyle="deleteKeyStyle"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="-10.0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="10%p"
+        latin:keyWidth="9.0%p"
     >
         <Key
             latin:keyLabel="q"
@@ -99,15 +103,19 @@
             latin:keyLabel="l"
             latin:popupCharacters="@string/alternates_for_l" />
         <Key
-            latin:keyLabel="m"
+            latin:keyLabel="m" />
+        <Key
+            latin:keyStyle="returnKeyStyle"
+            latin:keyXPos="-14.6%p"
+            latin:keyWidth="-14.6%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="10%p"
+        latin:keyWidth="8.9%p"
     >
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="15%p"
+            latin:keyWidth="11.1%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="w"
@@ -116,7 +124,6 @@
             latin:keyLabel="x" />
         <Key
             latin:keyLabel="c"
-
             latin:popupCharacters="@string/alternates_for_c" />
         <Key
             latin:keyLabel="v"
@@ -128,11 +135,33 @@
             latin:popupCharacters="@string/alternates_for_n" />
         <Key
             latin:keyLabel="\'" />
-        <Key
-            latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="15%p"
-            latin:keyEdgeFlags="right" />
-    </Row>
+        <switch>
+            <case
+                latin:mode="email"
+            >
+                <Key
+                    latin:keyLabel="," />
+                <Key
+                    latin:keyLabel="." />
+            </case>
+            <default>
+                <Key
+                    latin:keyLabel=","
+                    latin:manualTemporaryUpperCaseCode="33"
+                    latin:keyHintIcon="@drawable/key_hint_exclamation_holo"
+                    latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_exclamation_large_holo"
+                    latin:popupCharacters="!" />
+                <Key
+                    latin:keyLabel="."
+                    latin:manualTemporaryUpperCaseCode="63"
+                    latin:keyHintIcon="@drawable/key_hint_question_holo"
+                    latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_question_large_holo"
+                    latin:popupCharacters="\?" />
+            </default>
+        </switch>
+        <include
+            latin:keyboardLayout="@xml/kbd_row3_right" />
+   </Row>
     <include
         latin:keyboardLayout="@xml/kbd_qwerty_row4" />
 </merge>
diff --git a/java/res/xml-sw600dp/kbd_key_styles.xml b/java/res/xml-sw600dp/kbd_key_styles.xml
index 6be6a2c300f7525c2a223cfb8154a556081442d7..0612cfd62de9530db3c2d1faf57260a90a0b1f94 100644
--- a/java/res/xml-sw600dp/kbd_key_styles.xml
+++ b/java/res/xml-sw600dp/kbd_key_styles.xml
@@ -23,7 +23,7 @@
 >
     <!-- Base key style for the functional key -->
     <switch>
-       <case
+        <case
             latin:colorScheme="white"
         >
             <key-style
@@ -37,38 +37,6 @@
                 latin:styleName="functionalKeyStyle" />
         </case>
     </switch>
-    <!-- Base key style for the key which may have settings key as popup key -->
-    <switch>
-        <case
-            latin:hasSettingsKey="true"
-        >
-            <key-style
-                latin:styleName="settingsPopupStyle"
-                latin:parentStyle="functionalKeyStyle" />
-            <key-style
-                latin:styleName="webTabKeyStyle"
-                latin:code="@integer/key_tab"
-                latin:keyIcon="@drawable/sym_keyboard_tab_holo"
-                latin:iconPreview="@drawable/sym_keyboard_tab_holo"
-                latin:keyHintIcon="@drawable/hint_popup_holo"
-                latin:popupCharacters="\@drawable/sym_keyboard_settings|\@integer/key_settings"
-                latin:parentStyle="functionalKeyStyle" />
-          </case>
-        <!-- latin:hasSettingsKey="false" -->
-        <default>
-            <key-style
-                latin:styleName="settingsPopupStyle"
-                latin:keyHintIcon="@drawable/hint_popup_holo"
-                latin:popupCharacters="\@drawable/sym_keyboard_settings|\@integer/key_settings"
-                latin:parentStyle="functionalKeyStyle" />
-            <key-style
-                latin:styleName="webTabKeyStyle"
-                latin:code="@integer/key_tab"
-                latin:keyIcon="@drawable/sym_keyboard_tab_holo"
-                latin:iconPreview="@drawable/sym_keyboard_tab_holo"
-                latin:parentStyle="functionalKeyStyle" />
-        </default>
-    </switch>
     <!-- Functional key styles -->
     <switch>
         <case
@@ -110,18 +78,28 @@
                 latin:keyHintIcon="@drawable/hint_popup_holo"
                 latin:popupCharacters="@string/alternates_for_smiley"
                 latin:maxPopupKeyboardColumn="5" />
-            <key-style
-                latin:styleName="settingsKeyStyle"
-                latin:code="@integer/key_settings"
-                latin:keyIcon="@drawable/sym_keyboard_settings_holo"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_settings"
-                latin:parentStyle="functionalKeyStyle" />
-            <key-style
-                latin:styleName="micKeyStyle"
-                latin:code="@integer/key_voice"
-                latin:keyIcon="@drawable/sym_keyboard_voice_holo"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
-                latin:parentStyle="settingsPopupStyle" />
+            <switch>
+                <case
+                    latin:voiceKeyEnabled="true"
+                >
+                    <key-style
+                        latin:styleName="micOrSettingsKeyStyle"
+                        latin:code="@integer/key_voice"
+                        latin:keyIcon="@drawable/sym_keyboard_voice_holo"
+                        latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
+                        latin:keyHintIcon="@drawable/hint_popup_holo"
+                        latin:popupCharacters="\@drawable/sym_keyboard_settings|\@integer/key_settings"
+                        latin:parentStyle="functionalKeyStyle" />
+                </case>
+                <default>
+                    <key-style
+                        latin:styleName="micOrSettingsKeyStyle"
+                        latin:code="@integer/key_settings"
+                        latin:keyIcon="@drawable/sym_keyboard_settings_holo"
+                        latin:iconPreview="@drawable/sym_keyboard_feedback_settings"
+                        latin:parentStyle="functionalKeyStyle" />
+                </default>
+            </switch>
         </case>
         <case
             latin:colorScheme="black"
@@ -162,20 +140,36 @@
                 latin:keyHintIcon="@drawable/hint_popup_holo"
                 latin:popupCharacters="@string/alternates_for_smiley"
                 latin:maxPopupKeyboardColumn="5" />
-            <key-style
-                latin:styleName="settingsKeyStyle"
-                latin:code="@integer/key_settings"
-                latin:keyIcon="@drawable/sym_bkeyboard_settings"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_settings"
-                latin:parentStyle="functionalKeyStyle" />
-            <key-style
-                latin:styleName="micKeyStyle"
-                latin:code="@integer/key_voice"
-                latin:keyIcon="@drawable/sym_bkeyboard_mic"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
-                latin:parentStyle="settingsPopupStyle" />
+            <switch>
+                <case
+                    latin:voiceKeyEnabled="true"
+                >
+                    <key-style
+                        latin:styleName="micOrSettingsKeyStyle"
+                        latin:code="@integer/key_voice"
+                        latin:keyIcon="@drawable/sym_bkeyboard_mic"
+                        latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
+                        latin:keyHintIcon="@drawable/hint_popup_holo"
+                        latin:popupCharacters="\@drawable/sym_keyboard_settings|\@integer/key_settings"
+                        latin:parentStyle="functionalKeyStyle" />
+                </case>
+                <default>
+                    <key-style
+                        latin:styleName="micOrSettingsKeyStyle"
+                        latin:code="@integer/key_settings"
+                        latin:keyIcon="@drawable/sym_bkeyboard_settings"
+                        latin:iconPreview="@drawable/sym_keyboard_feedback_settings"
+                        latin:parentStyle="functionalKeyStyle" />
+                </default>
+            </switch>
         </case>
     </switch>
+    <key-style
+        latin:styleName="tabKeyStyle"
+        latin:code="@integer/key_tab"
+        latin:keyLabel="@string/label_tab_key"
+        latin:keyLabelOption="fontNormal"
+        latin:parentStyle="functionalKeyStyle" />
     <key-style
         latin:styleName="toSymbolKeyStyle"
         latin:code="@integer/key_switch_alpha_symbol"
diff --git a/java/res/xml-sw600dp/kbd_number.xml b/java/res/xml-sw600dp/kbd_number.xml
index 4af621d8614a4aeb732abe898a68ea27f4bad01c..80391ed033749e75fdcb5ef97cd5f803966c41c4 100644
--- a/java/res/xml-sw600dp/kbd_number.xml
+++ b/java/res/xml-sw600dp/kbd_number.xml
@@ -23,7 +23,7 @@
     latin:keyboardHeight="@dimen/keyboardHeight"
     latin:maxKeyboardHeight="50%p"
     latin:rowHeight="25%p"
-    latin:keyWidth="13.7%p"
+    latin:keyWidth="12.7%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
     latin:popupKeyboardTemplate="@xml/kbd_popup_template"
@@ -39,71 +39,68 @@
         >
             <!-- This row is intentionally not marked as a top row -->
             <Row>
-                <Spacer
-                    latin:horizontalGap="29.5%p" />
                 <Key
-                    latin:keyStyle="num1KeyStyle" />
+                    latin:keyStyle="num1KeyStyle"
+                    latin:keyXPos="29.5%p" />
                 <Key
                     latin:keyStyle="num2KeyStyle" />
                 <Key
                     latin:keyStyle="num3KeyStyle" />
-                <Spacer
-                    latin:horizontalGap="20.3%p" />
                 <Key
                     latin:keyStyle="deleteKeyStyle"
-                    latin:keyWidth="9.2%p"
+                    latin:keyXPos="-10.0%p"
+                    latin:keyWidth="0%p"
                     latin:keyEdgeFlags="right" />
             </Row>
             <Row>
-                <Spacer
-                    latin:horizontalGap="29.5%p" />
                 <Key
-                    latin:keyStyle="num4KeyStyle" />
+                    latin:keyStyle="num4KeyStyle"
+                    latin:keyXPos="29.5%p" />
                 <Key
                     latin:keyStyle="num5KeyStyle" />
                 <Key
                     latin:keyStyle="num6KeyStyle" />
-                <Spacer
-                    latin:horizontalGap="14.8%p" />
                 <Key
                     latin:keyStyle="returnKeyStyle"
-                    latin:keyWidth="14.6%p"
+                    latin:keyXPos="-14.6%p"
+                    latin:keyWidth="0%p"
                     latin:keyEdgeFlags="right" />
             </Row>
             <Row>
-                <Spacer
-                    latin:horizontalGap="29.5%p" />
                 <Key
-                    latin:keyStyle="num7KeyStyle" />
+                    latin:keyStyle="num7KeyStyle"
+                    latin:keyXPos="29.5%p" />
                 <Key
                     latin:keyStyle="num8KeyStyle" />
                 <Key
                     latin:keyStyle="num9KeyStyle" />
-                <!-- There is an empty area below the "Enter" key and right of the "9" key. To
-                     ignore the touch event on the area, "9" is intentionally not marked as a right
-                     edge key. -->
             </Row>
             <!-- This row is intentionally not marked as a bottom row -->
             <Row>
+                <Key
+                    latin:keyStyle="tabKeyStyle"
+                    latin:keyWidth="10.0%p"
+                    latin:keyEdgeFlags="left" />
                 <Spacer
-                    latin:horizontalGap="43.2%p" />
+                    latin:keyXPos="29.5%p" />
                 <Key
                     latin:keyStyle="num0KeyStyle" />
-                <Spacer
-                    latin:horizontalGap="30.2%p" />
-                <include
-                    latin:keyboardLayout="@xml/kbd_settings" />
+                <Spacer />
+                <Key
+                    latin:keyStyle="micOrSettingsKeyStyle"
+                    latin:keyXPos="-10.0%p"
+                    latin:keyWidth="0.0%p"
+                    latin:keyEdgeFlags="right" />
             </Row>
         </case>
         <!-- latin:passwordInput="false" -->
         <default>
             <!-- This row is intentionally not marked as a top row -->
             <Row>
-                <Spacer
-                    latin:horizontalGap="10.0%p" />
                 <Key
                     latin:code="45"
                     latin:keyLabel="-"
+                    latin:keyXPos="14.5%p"
                     latin:keyWidth="9.1%p" />
                 <Key
                     latin:code="43"
@@ -113,27 +110,24 @@
                     latin:code="44"
                     latin:keyLabel="."
                     latin:keyWidth="9.1%p" />
-                <Spacer
-                    latin:horizontalGap="4.5%p" />
                 <Key
-                    latin:keyLabel="1" />
+                    latin:keyLabel="1"
+                    latin:keyXPos="43.3%p" />
                 <Key
                     latin:keyLabel="2" />
                 <Key
                     latin:keyLabel="3" />
-                <Spacer
-                    latin:horizontalGap="8.1%p" />
                 <Key
                     latin:keyStyle="deleteKeyStyle"
-                    latin:keyWidth="9.2%p"
+                    latin:keyXPos="-10.0%p"
+                    latin:keyWidth="0%p"
                     latin:keyEdgeFlags="right" />
             </Row>
             <Row>
-                <Spacer
-                    latin:horizontalGap="10.0%p" />
                 <Key
                     latin:code="44"
                     latin:keyLabel="*"
+                    latin:keyXPos="14.5%p"
                     latin:keyWidth="9.1%p" />
                 <Key
                     latin:code="46"
@@ -143,33 +137,27 @@
                     latin:code="59"
                     latin:keyLabel=","
                     latin:keyWidth="9.1%p" />
-                <Spacer
-                    latin:horizontalGap="4.5%p" />
                 <Key
                     latin:keyLabel="4"
-                    latin:keyWidth="13.7%p" />
+                    latin:keyXPos="43.3%p" />
                 <Key
                     latin:keyLabel="5" />
                 <Key
                     latin:keyLabel="6" />
-                <Spacer
-                    latin:horizontalGap="2.6%p" />
                 <Key
                     latin:keyStyle="returnKeyStyle"
-                    latin:keyWidth="14.6%p"
+                    latin:keyXPos="-14.6%p"
+                    latin:keyWidth="0%p"
                     latin:keyEdgeFlags="right" />
             </Row>
             <Row>
-                <Key
-                    latin:keyStyle="moreKeyStyle"
-                    latin:keyWidth="10.0%p"
-                    latin:keyEdgeFlags="left" />
                 <!-- There is an empty area below the "More" key and left of the "(" key. To
                      ignore the touch event on the area, "(" is intentionally not marked as a left
                      edge key. -->
                 <Key
                     latin:code="40"
                     latin:keyLabel="("
+                    latin:keyXPos="14.5%p"
                     latin:keyWidth="9.1%p" />
                 <Key
                     latin:code="41"
@@ -179,40 +167,36 @@
                     latin:code="78"
                     latin:keyLabel="="
                     latin:keyWidth="9.1%p" />
-                <Spacer
-                    latin:horizontalGap="4.5%p" />
                 <Key
-                    latin:keyLabel="7" />
+                    latin:keyLabel="7"
+                    latin:keyXPos="43.3%p" />
                 <Key
                     latin:keyLabel="8" />
                 <Key
                     latin:keyLabel="9" />
-                <!-- There is an empty area below the "Enter" key and right of the "9" key. To
-                     ignore the touch event on the area, "9" is intentionally not marked as a right
-                     edge key. -->
             </Row>
             <!-- This row is intentionally not marked as a bottom row -->
             <Row>
-                <Spacer
-                    latin:horizontalGap="10.0%p" />
-                <!-- There is an empty area below the "More" key and left of the "space" key. To
-                     ignore the touch event on the area, "space" is intentionally not marked as a
-                     left edge key. -->
+                <Key
+                    latin:keyStyle="tabKeyStyle"
+                    latin:keyWidth="10.0%p"
+                    latin:keyEdgeFlags="left" />
                 <Key
                     latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
+                    latin:keyXPos="14.5%p"
                     latin:keyWidth="27.2%p" />
-                <Spacer
-                    latin:horizontalGap="4.5%p" />
                 <Key
-                    latin:keyLabel="*" />
+                    latin:keyLabel="*"
+                    latin:keyXPos="43.3%p" />
                 <Key
                     latin:keyLabel="0" />
                 <Key
                     latin:keyLabel="#" />
-                <Spacer
-                    latin:horizontalGap="4.3%p" />
-                <include
-                    latin:keyboardLayout="@xml/kbd_settings" />
+                <Key
+                    latin:keyStyle="micOrSettingsKeyStyle"
+                    latin:keyXPos="-10.0%p"
+                    latin:keyWidth="0.0%p"
+                    latin:keyEdgeFlags="right" />
             </Row>
         </default>
     </switch>
diff --git a/java/res/xml-sw600dp/kbd_phone.xml b/java/res/xml-sw600dp/kbd_phone.xml
index f77fc7e43789073c437fd1052bd3333d5eac7f00..d13fa851ded46e6447243b69e2a114aaa28fea07 100644
--- a/java/res/xml-sw600dp/kbd_phone.xml
+++ b/java/res/xml-sw600dp/kbd_phone.xml
@@ -23,7 +23,7 @@
     latin:keyboardHeight="@dimen/keyboardHeight"
     latin:maxKeyboardHeight="50%p"
     latin:rowHeight="25%p"
-    latin:keyWidth="13.7%p"
+    latin:keyWidth="12.7%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
     latin:popupKeyboardTemplate="@xml/kbd_popup_template"
@@ -35,55 +35,49 @@
         latin:keyboardLayout="@xml/kbd_numkey_styles" />
     <!-- This row is intentionally not marked as a top row -->
     <Row>
-        <Spacer
-            latin:horizontalGap="14.5%p" />
         <Key
             latin:code="45"
             latin:keyLabel=" - "
+            latin:keyXPos="19.0%p"
             latin:keyWidth="9.1%p" />
         <Key
             latin:code="43"
             latin:keyLabel=" + "
             latin:keyWidth="9.1%p" />
-        <Spacer
-            latin:horizontalGap="9.1%p" />
         <Key
-            latin:keyStyle="num1KeyStyle" />
+            latin:keyStyle="num1KeyStyle"
+            latin:keyXPos="43.3%p" />
         <Key
             latin:keyStyle="num2KeyStyle" />
         <Key
             latin:keyStyle="num3KeyStyle" />
-        <Spacer
-            latin:horizontalGap="8.1%p" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.2%p"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
-        <Spacer
-            latin:horizontalGap="14.5%p" />
         <Key
             latin:code="44"
             latin:keyLabel=" , "
+            latin:keyXPos="19.0%p"
             latin:keyWidth="9.1%p" />
         <Key
             latin:code="46"
             latin:keyLabel=" . "
             latin:keyWidth="9.1%p" />
-        <Spacer
-            latin:horizontalGap="9.1%p" />
         <Key
-            latin:keyStyle="num4KeyStyle" />
+            latin:keyStyle="num4KeyStyle"
+            latin:keyXPos="43.3%p" />
         <Key
             latin:keyStyle="num5KeyStyle" />
         <Key
             latin:keyStyle="num6KeyStyle" />
-        <Spacer
-            latin:horizontalGap="2.6%p" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="14.6%p"
+            latin:keyXPos="-14.6%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -91,52 +85,46 @@
             latin:keyStyle="moreKeyStyle"
             latin:keyWidth="10.0%p"
             latin:keyEdgeFlags="left" />
-        <Spacer
-            latin:horizontalGap="4.5%p" />
         <!-- There is an empty area below the "More" key and left of the "(" key.  To ignore
              the touch event on the area, "(" is intentionally not marked as a left edge key. -->
         <Key
             latin:code="40"
             latin:keyLabel=" ( "
+            latin:keyXPos="19.0%p"
             latin:keyWidth="9.1%p" />
         <Key
             latin:code="41"
             latin:keyLabel=" ) "
             latin:keyWidth="9.1%p" />
-        <Spacer
-            latin:horizontalGap="9.1%p" />
         <Key
-            latin:keyStyle="num7KeyStyle" />
+            latin:keyStyle="num7KeyStyle"
+            latin:keyXPos="43.3%p" />
         <Key
             latin:keyStyle="num8KeyStyle" />
         <Key
             latin:keyStyle="num9KeyStyle" />
-        <!-- There is an empty area below the "Enter" key and right of the "9" key.  To ignore
-             the touch event on the area, "9" is intentionally not marked as a right edge key. -->
         </Row>
     <!-- This row is intentionally not marked as a bottom row -->
     <Row>
-        <Spacer
-            latin:horizontalGap="14.5%p" />
-        <!-- There is an empty area below the "More" key and left of the "space" key.  To ignore
-             the touch event on the area, "space" is intentionally not marked as a left edge key. -->
+        <Key
+            latin:keyStyle="tabKeyStyle"
+            latin:keyWidth="10.0%p"
+            latin:keyEdgeFlags="left" />
         <Key
             latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
+            latin:keyXPos="19.0%p"
             latin:keyWidth="18.2%p" />
-        <Spacer
-            latin:horizontalGap="9.1%p" />
         <Key
             latin:keyStyle="numStarKeyStyle"
-            latin:keyWidth="13.7%p" />
+            latin:keyXPos="43.3%p" />
         <Key
-            latin:keyStyle="num0KeyStyle"
-            latin:keyWidth="13.7%p" />>
+            latin:keyStyle="num0KeyStyle" />
         <Key
-            latin:keyStyle="numPoundKeyStyle"
-            latin:keyWidth="13.7%p" />
-        <Spacer
-            latin:horizontalGap="4.3%p" />
-        <include
-            latin:keyboardLayout="@xml/kbd_settings" />
+            latin:keyStyle="numPoundKeyStyle" />
+        <Key
+            latin:keyStyle="micOrSettingsKeyStyle"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="0.0%p"
+            latin:keyEdgeFlags="right" />
     </Row>
 </Keyboard>
diff --git a/java/res/xml-sw600dp/kbd_phone_symbols.xml b/java/res/xml-sw600dp/kbd_phone_symbols.xml
index 63ef4128fd4f7565865e255016aca258803175e6..895ca63fc05dbfb7ef80a3f330806208dd3c5300 100644
--- a/java/res/xml-sw600dp/kbd_phone_symbols.xml
+++ b/java/res/xml-sw600dp/kbd_phone_symbols.xml
@@ -23,7 +23,7 @@
     latin:keyboardHeight="@dimen/keyboardHeight"
     latin:maxKeyboardHeight="50%p"
     latin:rowHeight="25%p"
-    latin:keyWidth="13.7%p"
+    latin:keyWidth="12.7%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
     latin:popupKeyboardTemplate="@xml/kbd_popup_template"
@@ -35,11 +35,10 @@
         latin:keyboardLayout="@xml/kbd_numkey_styles" />
     <!-- This row is intentionally not marked as a top row -->
     <Row>
-        <Spacer
-            latin:horizontalGap="10.0%p" />
         <Key
             latin:code="45"
             latin:keyLabel=" - "
+            latin:keyXPos="14.5%p"
             latin:keyWidth="9.1%p" />
         <Key
             latin:code="43"
@@ -49,27 +48,24 @@
             latin:code="44"
             latin:keyLabel="@string/label_pause_key"
             latin:keyWidth="9.1%p" />
-        <Spacer
-            latin:horizontalGap="4.5%p" />
         <Key
-            latin:keyStyle="num1KeyStyle" />
+            latin:keyStyle="num1KeyStyle"
+            latin:keyXPos="43.3%p" />
         <Key
             latin:keyStyle="num2KeyStyle" />
         <Key
             latin:keyStyle="num3KeyStyle" />
-        <Spacer
-            latin:horizontalGap="8.1%p" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.2%p"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
-        <Spacer
-            latin:horizontalGap="10.0%p" />
         <Key
             latin:code="44"
             latin:keyLabel=" , "
+            latin:keyXPos="14.5%p"
             latin:keyWidth="9.1%p" />
         <Key
             latin:code="46"
@@ -79,19 +75,17 @@
             latin:code="59"
             latin:keyLabel="@string/label_wait_key"
             latin:keyWidth="9.1%p" />
-        <Spacer
-            latin:horizontalGap="4.5%p" />
         <Key
-            latin:keyStyle="num4KeyStyle" />
+            latin:keyStyle="num4KeyStyle"
+            latin:keyXPos="43.3%p" />
         <Key
             latin:keyStyle="num5KeyStyle" />
         <Key
             latin:keyStyle="num6KeyStyle" />
-        <Spacer
-            latin:horizontalGap="2.6%p" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="14.6%p"
+            latin:keyXPos="-14.6%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -104,6 +98,7 @@
         <Key
             latin:code="40"
             latin:keyLabel=" ( "
+            latin:keyXPos="14.5%p"
             latin:keyWidth="9.1%p" />
         <Key
             latin:code="41"
@@ -113,37 +108,35 @@
             latin:code="78"
             latin:keyLabel=" N "
             latin:keyWidth="9.1%p" />
-        <Spacer
-            latin:horizontalGap="4.5%p" />
         <Key
-            latin:keyStyle="num7KeyStyle" />
+            latin:keyStyle="num7KeyStyle"
+            latin:keyXPos="43.3%p" />
         <Key
             latin:keyStyle="num8KeyStyle" />
         <Key
             latin:keyStyle="num9KeyStyle" />
-        <!-- There is an empty area below the "Enter" key and right of the "9" key.  To ignore
-             the touch event on the area, "9" is intentionally not marked as a right edge key. -->
     </Row>
     <!-- This row is intentionally not marked as a bottom row -->
     <Row>
-        <Spacer
-            latin:horizontalGap="10.0%p" />
-        <!-- There is an empty area below the "More" key and left of the "space" key.  To ignore
-             the touch event on the area, "space" is intentionally not marked as a left edge key. -->
+        <Key
+            latin:keyStyle="tabKeyStyle"
+            latin:keyWidth="10.0%p"
+            latin:keyEdgeFlags="left" />
         <Key
             latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
+            latin:keyXPos="14.5%p"
             latin:keyWidth="27.2%p" />
-        <Spacer
-            latin:horizontalGap="4.5%p" />
         <Key
-            latin:keyStyle="numStarKeyStyle" />
+            latin:keyStyle="numStarKeyStyle"
+            latin:keyXPos="43.3%p" />
         <Key
             latin:keyStyle="num0KeyStyle" />
         <Key
             latin:keyStyle="numPoundKeyStyle" />
-        <Spacer
-            latin:horizontalGap="4.3%p" />
-        <include
-            latin:keyboardLayout="@xml/kbd_settings" />
+        <Key
+            latin:keyStyle="micOrSettingsKeyStyle"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="0.0%p"
+            latin:keyEdgeFlags="right" />
     </Row>
 </Keyboard>
diff --git a/java/res/xml-sw600dp/kbd_qwerty_row1.xml b/java/res/xml-sw600dp/kbd_qwerty_row1.xml
index d3d5b25e645593bc1768c870562cb8610be0f79f..af1bd5d508146360738cae4bfe9a4c004e8d5dab 100644
--- a/java/res/xml-sw600dp/kbd_qwerty_row1.xml
+++ b/java/res/xml-sw600dp/kbd_qwerty_row1.xml
@@ -22,7 +22,7 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Row
-        latin:keyWidth="9.1%p"
+        latin:keyWidth="9.0%p"
         latin:rowEdgeFlags="top"
     >
         <Key
@@ -68,7 +68,8 @@
             latin:popupCharacters="@string/alternates_for_p" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.2%p"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="-10.0%p"
             latin:keyEdgeFlags="right" />
     </Row>
 </merge>
diff --git a/java/res/xml-sw600dp/kbd_qwerty_row2.xml b/java/res/xml-sw600dp/kbd_qwerty_row2.xml
index aecb4f4a9745605487194e270bb699c8406e15e3..1e6011cde63e31ad077558b9e37aef92a6356c00 100644
--- a/java/res/xml-sw600dp/kbd_qwerty_row2.xml
+++ b/java/res/xml-sw600dp/kbd_qwerty_row2.xml
@@ -24,11 +24,10 @@
     <Row
         latin:keyWidth="9.0%p"
     >
-        <Spacer
-            latin:horizontalGap="4.5%p" />
         <Key
             latin:keyLabel="a"
             latin:popupCharacters="@string/alternates_for_a"
+            latin:keyXPos="4.5%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="s"
@@ -53,7 +52,8 @@
             latin:popupCharacters="@string/alternates_for_l" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="14.6%p"
+            latin:keyXPos="-14.6%p"
+            latin:keyWidth="-14.6%p"
             latin:keyEdgeFlags="right" />
     </Row>
 </merge>
diff --git a/java/res/xml-sw600dp/kbd_qwerty_row3.xml b/java/res/xml-sw600dp/kbd_qwerty_row3.xml
index e50f9079c1ae0b385738cd0c6156708d7006c75d..700bcf0058ed58ab9463d5fa94e6a1c698c02826 100644
--- a/java/res/xml-sw600dp/kbd_qwerty_row3.xml
+++ b/java/res/xml-sw600dp/kbd_qwerty_row3.xml
@@ -26,7 +26,7 @@
     >
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="10.0%p"
+            latin:keyWidth="11.1%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="z"
@@ -70,9 +70,7 @@
                     latin:popupCharacters="\?" />
             </default>
         </switch>
-        <Key
-            latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="10.1%p"
-            latin:keyEdgeFlags="right" />
+        <include
+            latin:keyboardLayout="@xml/kbd_row3_right" />
     </Row>
 </merge>
diff --git a/java/res/xml-sw600dp/kbd_qwerty_row4.xml b/java/res/xml-sw600dp/kbd_qwerty_row4.xml
index 57367462a8d843ab8efd3a62eecfe85c2b0b843c..648775c97d328d8ef7d7f220d07b8e412f42faff 100644
--- a/java/res/xml-sw600dp/kbd_qwerty_row4.xml
+++ b/java/res/xml-sw600dp/kbd_qwerty_row4.xml
@@ -23,129 +23,45 @@
 >
     <!-- This row is intentionally not marked as a bottom row -->
     <Row
-        latin:keyWidth="8.9%p"
+        latin:keyWidth="9.1%p"
     >
         <Key
             latin:keyStyle="toSymbolKeyStyle"
             latin:keyLabelOption="alignLeft"
             latin:keyWidth="13.0%p"
             latin:keyEdgeFlags="left" />
+        <Key
+            latin:keyStyle="tabKeyStyle"
+            latin:keyWidth="8.9%p" />
         <switch>
             <case
-                latin:languageCode="ru"
+                latin:mode="email"
             >
-                <switch>
-                    <!-- TODO: implement logical OR for <case> attribute -->
-                    <case
-                        latin:mode="email"
-                    >
-                        <Key
-                            latin:keyStyle="comKeyStyle" />
-                    </case>
-                    <case
-                        latin:mode="url"
-                    >
-                        <Key
-                            latin:keyStyle="comKeyStyle" />
-                    </case>
-                    <case
-                        latin:imeAction="actionSearch"
-                    >
-                        <Key
-                            latin:keyLabel=":"
-                            latin:manualTemporaryUpperCaseCode="43"
-                            latin:keyHintIcon="@drawable/key_hint_plus_holo"
-                            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_plus_large_holo"
-                            latin:popupCharacters="+" />
-                    </case>
-                    <default>
-                        <Key
-                            latin:keyStyle="smileyKeyStyle" />
-                    </default>
-                </switch>
-                <switch>
-                    <case
-                        latin:mode="email"
-                    >
-                        <Key
-                            latin:keyLabel="\@" />
-                    </case>
-                    <case
-                        latin:mode="url"
-                    >
-                        <Key
-                            latin:keyLabel="-"
-                            latin:manualTemporaryUpperCaseCode="95"
-                            latin:keyHintIcon="@drawable/key_hint_underline_holo"
-                            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_underline_large_holo"
-                            latin:popupCharacters="_" />
-                    </case>
-                    <default>
-                        <Key
-                            latin:keyLabel="/"
-                            latin:manualTemporaryUpperCaseCode="64"
-                            latin:keyHintIcon="@drawable/key_hint_at_holo"
-                            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_at_large_holo"
-                            latin:popupCharacters="\@" />
-                    </default>
-                </switch>
+                <Key
+                    latin:keyStyle="comKeyStyle"
+                    latin:keyWidth="8.9%p" />
+            </case>
+            <case
+                latin:mode="url"
+            >
+                <Key
+                    latin:keyStyle="comKeyStyle"
+                    latin:keyWidth="8.9%p" />
             </case>
-            <!-- not languageCode="ru" -->
             <default>
-                <switch>
-                    <case
-                        latin:mode="url"
-                    >
-                        <Key
-                            latin:keyStyle="comKeyStyle"
-                            latin:keyWidth="17.8%p" />
-                    </case>
-                    <default>
-                        <switch>
-                            <case
-                                latin:mode="email"
-                            >
-                                <Key
-                                    latin:keyStyle="comKeyStyle" />
-                            </case>
-                            <case
-                                latin:imeAction="actionSearch"
-                            >
-                                <Key
-                                    latin:keyLabel=":"
-                                    latin:manualTemporaryUpperCaseCode="43"
-                                    latin:keyHintIcon="@drawable/key_hint_plus_holo"
-                                    latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_plus_large_holo"
-                                    latin:popupCharacters="+" />
-                            </case>
-                            <default>
-                                <Key
-                                    latin:keyStyle="smileyKeyStyle" />
-                            </default>
-                        </switch>
-                        <switch>
-                            <case
-                                latin:mode="email"
-                            >
-                                <Key
-                                    latin:keyLabel="\@" />
-                            </case>
-                            <default>
-                                <Key
-                                    latin:keyLabel="/"
-                                    latin:manualTemporaryUpperCaseCode="64"
-                                    latin:keyHintIcon="@drawable/key_hint_at_holo"
-                                    latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_at_large_holo"
-                                    latin:popupCharacters="\@" />
-                            </default>
-                        </switch>
-                    </default>
-                </switch>
+                <Key
+                    latin:keyLabel="/"
+                    latin:manualTemporaryUpperCaseCode="64"
+                    latin:keyHintIcon="@drawable/key_hint_at_holo"
+                    latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_at_large_holo"
+                    latin:popupCharacters="\@"
+                    latin:keyWidth="8.9%p" />
             </default>
         </switch>
         <Key
             latin:keyStyle="spaceKeyStyle"
-            latin:keyWidth="38.5%p" />
+            latin:keyXPos="30.8%p"
+            latin:keyWidth="41.0%p" />
         <switch>
             <case
                 latin:languageCode="ru"
@@ -239,7 +155,10 @@
                 </switch>
             </default>
         </switch>
-        <include
-            latin:keyboardLayout="@xml/kbd_settings" />
+        <Key
+            latin:keyStyle="micOrSettingsKeyStyle"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="-10.0%p"
+            latin:keyEdgeFlags="right" />
     </Row>
 </merge>
diff --git a/java/res/xml-sw600dp/kbd_qwerty_rows_scandinavia.xml b/java/res/xml-sw600dp/kbd_qwerty_rows_scandinavia.xml
index 7e4635b8cfebe30f45f724d6fdc55e755c2e1bff..0974a9d7ca8400e0db304125d96ce7af075be58b 100644
--- a/java/res/xml-sw600dp/kbd_qwerty_rows_scandinavia.xml
+++ b/java/res/xml-sw600dp/kbd_qwerty_rows_scandinavia.xml
@@ -24,14 +24,14 @@
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <Row
-        latin:keyWidth="9.09%p"
+        latin:keyWidth="8.0%p"
         latin:rowEdgeFlags="top"
     >
         <Key
             latin:keyLabel="q"
             latin:keyHintIcon="@drawable/key_hint_num1_holo"
             latin:popupCharacters="@string/alternates_for_q"
-            latin:keyWidth="8.75%p"
+            latin:keyXPos="2.15%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="w"
@@ -70,17 +70,19 @@
             latin:keyHintIcon="@drawable/key_hint_num0_holo"
             latin:popupCharacters="@string/alternates_for_p" />
         <Key
-            latin:keyLabel="Ã¥"
-            latin:keyWidth="8.75%p"
+            latin:keyLabel="Ã¥" />
+        <Key
+            latin:keyStyle="deleteKeyStyle"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="-10.0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="9.09%p"
+        latin:keyWidth="8.0%p"
     >
         <Key
             latin:keyLabel="a"
             latin:popupCharacters="@string/alternates_for_a"
-            latin:keyWidth="8.75%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="s"
@@ -108,8 +110,11 @@
             latin:popupCharacters="@string/alternates_for_scandinavia_row2_10" />
         <Key
             latin:keyLabel="@string/keylabel_for_scandinavia_row2_11"
-            latin:popupCharacters="@string/alternates_for_scandinavia_row2_11"
-            latin:keyWidth="8.75%p"
+            latin:popupCharacters="@string/alternates_for_scandinavia_row2_11" />
+        <Key
+            latin:keyStyle="returnKeyStyle"
+            latin:keyXPos="-14.6%p"
+            latin:keyWidth="-14.6%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
diff --git a/java/res/xml-sw600dp/kbd_qwertz_rows.xml b/java/res/xml-sw600dp/kbd_qwertz_rows.xml
index 534276ccb0cc9109997b12aa6434839f7195320d..3490cc7fdcc8d99a212b7e16372ec9b054b5c907 100644
--- a/java/res/xml-sw600dp/kbd_qwertz_rows.xml
+++ b/java/res/xml-sw600dp/kbd_qwertz_rows.xml
@@ -24,7 +24,7 @@
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <Row
-        latin:keyWidth="10%p"
+        latin:keyWidth="9.0%p"
         latin:rowEdgeFlags="top"
     >
         <Key
@@ -67,17 +67,21 @@
         <Key
             latin:keyLabel="p"
             latin:keyHintIcon="@drawable/key_hint_num0_holo"
-            latin:popupCharacters="@string/alternates_for_p"
+            latin:popupCharacters="@string/alternates_for_p" />
+        <Key
+            latin:keyStyle="deleteKeyStyle"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="-10.0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
         latin:keyboardLayout="@xml/kbd_qwerty_row2" />
     <Row
-        latin:keyWidth="10%p"
+        latin:keyWidth="8.9%p"
     >
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="15%p"
+            latin:keyWidth="11.1%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="y"
@@ -97,11 +101,33 @@
             latin:popupCharacters="@string/alternates_for_n" />
         <Key
             latin:keyLabel="m" />
-        <Key
-            latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="15%p"
-            latin:keyEdgeFlags="right" />
+        <switch>
+            <case
+                latin:mode="email"
+            >
+                <Key
+                    latin:keyLabel="," />
+                <Key
+                    latin:keyLabel="." />
+            </case>
+            <default>
+                <Key
+                    latin:keyLabel=","
+                    latin:manualTemporaryUpperCaseCode="33"
+                    latin:keyHintIcon="@drawable/key_hint_exclamation_holo"
+                    latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_exclamation_large_holo"
+                    latin:popupCharacters="!" />
+                <Key
+                    latin:keyLabel="."
+                    latin:manualTemporaryUpperCaseCode="63"
+                    latin:keyHintIcon="@drawable/key_hint_question_holo"
+                    latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_question_large_holo"
+                    latin:popupCharacters="\?" />
+            </default>
+        </switch>
+        <include
+            latin:keyboardLayout="@xml/kbd_row3_right" />
     </Row>
-   <include
+    <include
         latin:keyboardLayout="@xml/kbd_qwerty_row4" />
 </merge>
diff --git a/java/res/xml-sw600dp/kbd_row3_right.xml b/java/res/xml-sw600dp/kbd_row3_right.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7867e175a0bdaabc6a66f93a0c0bdd60fca31658
--- /dev/null
+++ b/java/res/xml-sw600dp/kbd_row3_right.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2011, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<merge
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+>
+    <switch>
+        <case
+            latin:mode="email"
+        >
+            <Key
+                latin:keyLabel="\@"
+                latin:keyXPos="-8.9%p"
+                latin:keyWidth="-8.9%p"
+                latin:keyEdgeFlags="right" />
+        </case>
+        <case
+            latin:mode="url"
+        >
+            <Key
+                latin:keyLabel="-"
+                latin:manualTemporaryUpperCaseCode="95"
+                latin:keyHintIcon="@drawable/key_hint_underline_holo"
+                latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_underline_large_holo"
+                latin:popupCharacters="_"
+                latin:keyXPos="-8.9%p"
+                latin:keyWidth="-8.9%p"
+                latin:keyEdgeFlags="right" />
+        </case>
+        <case
+            latin:imeAction="actionSearch"
+        >
+            <Key
+                latin:keyLabel=":"
+                latin:manualTemporaryUpperCaseCode="43"
+                latin:keyHintIcon="@drawable/key_hint_plus_holo"
+                latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_plus_large_holo"
+                latin:popupCharacters="+"
+                latin:keyXPos="-8.9%p"
+                latin:keyWidth="-8.9%p"
+                latin:keyEdgeFlags="right" />
+        </case>
+        <default>
+            <Key
+                latin:keyStyle="smileyKeyStyle"
+                latin:keyXPos="-8.9%p"
+                latin:keyWidth="-8.9%p"
+                latin:keyEdgeFlags="right" />
+        </default>
+    </switch>
+</merge>
diff --git a/java/res/xml-sw600dp/kbd_ru_rows.xml b/java/res/xml-sw600dp/kbd_ru_rows.xml
index 0c7a997a6be1bc63e78b8c78c169f44e474fe9a5..95f297dd143900e1011e72d59655ec7450d0d41f 100644
--- a/java/res/xml-sw600dp/kbd_ru_rows.xml
+++ b/java/res/xml-sw600dp/kbd_ru_rows.xml
@@ -24,14 +24,14 @@
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <Row
-        latin:keyWidth="9.091%p"
+        latin:keyWidth="8.0%p"
         latin:rowEdgeFlags="top"
     >
         <Key
             latin:keyLabel="й"
             latin:keyHintIcon="@drawable/key_hint_num1_holo"
             latin:popupCharacters="1"
-            latin:keyWidth="8.75%p"
+            latin:keyXPos="2.15%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="ц"
@@ -70,16 +70,18 @@
             latin:keyHintIcon="@drawable/key_hint_num0_holo"
             latin:popupCharacters="0" />
         <Key
-            latin:keyLabel="Ñ…"
-            latin:keyWidth="8.75%p"
+            latin:keyLabel="Ñ…" />
+        <Key
+            latin:keyStyle="deleteKeyStyle"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="-10.0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-            latin:keyWidth="9.091%p"
+            latin:keyWidth="8.0%p"
     >
         <Key
             latin:keyLabel="Ñ„"
-            latin:keyWidth="8.75%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="Ñ‹" />
@@ -100,16 +102,19 @@
         <Key
             latin:keyLabel="ж" />
         <Key
-            latin:keyLabel="э"
-            latin:keyWidth="8.75%p"
+            latin:keyLabel="э" />
+        <Key
+            latin:keyStyle="returnKeyStyle"
+            latin:keyXPos="-14.6%p"
+            latin:keyWidth="-14.6%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="8.5%p"
+        latin:keyWidth="8.0%p"
     >
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="11.75%p"
+            latin:keyWidth="11.1%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="я" />
@@ -131,9 +136,13 @@
         <Key
             latin:keyLabel="ÑŽ" />
         <Key
-            latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="11.75%p"
-            latin:keyEdgeFlags="right" />
+            latin:keyLabel="."
+            latin:manualTemporaryUpperCaseCode="44"
+            latin:keyHintIcon="@drawable/key_hint_comma_holo"
+            latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_comma_large_holo"
+            latin:popupCharacters="," />
+        <include
+            latin:keyboardLayout="@xml/kbd_row3_right" />
     </Row>
     <include
         latin:keyboardLayout="@xml/kbd_qwerty_row4" />
diff --git a/java/res/xml-sw600dp/kbd_settings.xml b/java/res/xml-sw600dp/kbd_settings.xml
deleted file mode 100644
index 4f679ca931f36732a505138613ea2ebf87fa8a4d..0000000000000000000000000000000000000000
--- a/java/res/xml-sw600dp/kbd_settings.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2011, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<merge
-    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
->
-    <switch>
-        <case
-            latin:webInput="true"
-        >
-            <switch>
-                <case
-                    latin:voiceKeyEnabled="true"
-                    latin:passwordInput="false"
-                >
-                    <Key
-                        latin:keyStyle="webTabKeyStyle"
-                        latin:keyWidth="6.4%p" />
-                    <Key
-                        latin:keyStyle="micKeyStyle"
-                        latin:keyWidth="6.5%p" />
-                </case>
-                <default>
-                    <Spacer
-                        latin:horizontalGap="4.15%p" />
-                    <Key
-                        latin:keyStyle="webTabKeyStyle"
-                        latin:keyWidth="8.9%p" />
-                </default>
-            </switch>
-        </case>
-        <default>
-            <switch>
-                <case
-                    latin:hasSettingsKey="true"
-                    latin:voiceKeyEnabled="true"
-                >
-                    <Key
-                        latin:keyStyle="settingsKeyStyle"
-                        latin:keyWidth="6.4%p" />
-                    <Key
-                        latin:keyStyle="micKeyStyle"
-                        latin:keyWidth="6.5%p" />
-                </case>
-                <case
-                    latin:hasSettingsKey="true"
-                    latin:voiceKeyEnabled="false"
-                >
-                    <Spacer
-                        latin:horizontalGap="4.15%p" />
-                    <Key
-                        latin:keyStyle="settingsKeyStyle"
-                        latin:keyWidth="8.9%p" />
-                </case>
-                <case
-                    latin:hasSettingsKey="false"
-                    latin:voiceKeyEnabled="true"
-                >
-                    <Spacer
-                        latin:horizontalGap="4.15%p" />
-                    <Key
-                        latin:keyStyle="micKeyStyle"
-                        latin:keyWidth="8.9%p" />
-                </case>
-                <default>
-                    <Spacer
-                        latin:horizontalGap="13.0%p" />
-                </default>
-            </switch>
-        </default>
-    </switch>
-</merge>
diff --git a/java/res/xml-sw600dp/kbd_sr_rows.xml b/java/res/xml-sw600dp/kbd_sr_rows.xml
index 71d0e60f1463c0dbac18a6c83b1df8fd69434fd8..8c8539ec20cb5ca63506be0ba603ae34cdee8d32 100644
--- a/java/res/xml-sw600dp/kbd_sr_rows.xml
+++ b/java/res/xml-sw600dp/kbd_sr_rows.xml
@@ -24,13 +24,14 @@
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <Row
-        latin:keyWidth="9.09%p"
+        latin:keyWidth="8.0%p"
         latin:rowEdgeFlags="top"
     >
         <Key
             latin:keyLabel="Ñ™"
             latin:keyHintIcon="@drawable/key_hint_num1_holo"
             latin:popupCharacters="1"
+            latin:keyXPos="2.15%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="Ñš"
@@ -69,11 +70,15 @@
             latin:keyHintIcon="@drawable/key_hint_num0_holo"
             latin:popupCharacters="0" />
         <Key
-            latin:keyLabel="ш"
+            latin:keyLabel="ш" />
+        <Key
+            latin:keyStyle="deleteKeyStyle"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="-10.0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="9.09%p"
+        latin:keyWidth="7.9%p"
     >
         <Key
             latin:keyLabel="а"
@@ -97,14 +102,19 @@
         <Key
             latin:keyLabel="ч" />
         <Key
-            latin:keyLabel="Ñ›"
+            latin:keyLabel="Ñ›" />
+        <Key
+            latin:keyStyle="returnKeyStyle"
+            latin:keyXPos="-14.6%p"
+            latin:keyWidth="-14.6%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="8.90%p"
+        latin:keyWidth="7.5%p"
     >
         <Key
             latin:keyStyle="shiftKeyStyle"
+            latin:keyWidth="8.8%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="Ñ•" />
@@ -124,10 +134,32 @@
             latin:keyLabel="Ñ’" />
         <Key
             latin:keyLabel="ж" />
-        <Key
-            latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="11.00%p"
-            latin:keyEdgeFlags="right" />
+        <switch>
+            <case
+                latin:mode="email"
+            >
+                <Key
+                    latin:keyLabel="," />
+                <Key
+                    latin:keyLabel="." />
+            </case>
+            <default>
+                <Key
+                    latin:keyLabel=","
+                    latin:manualTemporaryUpperCaseCode="33"
+                    latin:keyHintIcon="@drawable/key_hint_exclamation_holo"
+                    latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_exclamation_large_holo"
+                    latin:popupCharacters="!" />
+                <Key
+                    latin:keyLabel="."
+                    latin:manualTemporaryUpperCaseCode="63"
+                    latin:keyHintIcon="@drawable/key_hint_question_holo"
+                    latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_question_large_holo"
+                    latin:popupCharacters="\?" />
+            </default>
+        </switch>
+        <include
+            latin:keyboardLayout="@xml/kbd_row3_right" />
     </Row>
     <include
         latin:keyboardLayout="@xml/kbd_qwerty_row4" />
diff --git a/java/res/xml-sw600dp/kbd_symbols.xml b/java/res/xml-sw600dp/kbd_symbols.xml
index c89cd2fba8faa0e093bf27732ff4ac56e907aff2..2daaadd02a68125d8bb7c1925bd42bc5149b740f 100644
--- a/java/res/xml-sw600dp/kbd_symbols.xml
+++ b/java/res/xml-sw600dp/kbd_symbols.xml
@@ -34,7 +34,7 @@
         latin:keyboardLayout="@xml/kbd_currency_key_styles" />
     <!-- This row is intentionally not marked as a top row -->
     <Row
-        latin:keyWidth="9.1%p"
+        latin:keyWidth="9.0%p"
     >
         <Key
             latin:keyLabel="1"
@@ -65,16 +65,16 @@
             latin:popupCharacters="ⁿ,∅" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.2%p"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="-10.0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
         latin:keyWidth="9.0%p"
     >
-        <Spacer
-            latin:horizontalGap="4.5%p" />
         <Key
-            latin:keyLabel="#" />
+            latin:keyLabel="#"
+            latin:keyXPos="4.5%p" />
         <Key
             latin:keyStyle="currencyKeyStyle" />
         <Key
@@ -99,7 +99,8 @@
             latin:popupCharacters="],},&gt;" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="14.6%p"
+            latin:keyXPos="-14.6%p"
+            latin:keyWidth="-14.6%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -107,7 +108,7 @@
     >
         <Key
             latin:keyStyle="moreKeyStyle"
-            latin:keyWidth="10.0%p"
+            latin:keyWidth="11.1%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="&lt;"
@@ -171,9 +172,8 @@
             </default>
         </switch>
         <Key
-            latin:keyStyle="moreKeyStyle"
-            latin:keyWidth="10.1%p"
-            latin:keyEdgeFlags="right" />
+            latin:keyLabel="/"
+            latin:keyWidth="0%p" />
     </Row>
     <!-- This row is intentionally not marked as a bottom row -->
     <Row
@@ -185,20 +185,23 @@
             latin:keyWidth="13.0%p"
             latin:keyEdgeFlags="left" />
         <Key
-            latin:keyLabel="/" />
+            latin:keyStyle="tabKeyStyle" />
         <Key
             latin:keyLabel="\@" />
         <Key
             latin:keyStyle="spaceKeyStyle"
-            latin:keyWidth="38.5%p" />
+            latin:keyXPos="30.8%p"
+            latin:keyWidth="41.0%p" />
         <switch>
             <case
                 latin:languageCode="ru"
             >
                 <Key
-                    latin:keyLabel="_" />
+                    latin:keyLabel="_"
+                    latin:keyWidth="9.1%p" />
                 <Key
-                    latin:keyLabel="-" />
+                    latin:keyLabel="-"
+                    latin:keyWidth="9.1%p" />
             </case>
             <default>
                 <!-- Note: DroidSans doesn't have double-high-reversed-quotation
@@ -206,12 +209,17 @@
                 <!-- latin:popupCharacters="“,”,„,‟,«,»,‘,’,‚,‛" -->
                 <Key
                     latin:keyLabel="&quot;"
-                    latin:popupCharacters="“,”,«,»,‘,’,‚,‛" />
+                    latin:popupCharacters="“,”,«,»,‘,’,‚,‛"
+                    latin:keyWidth="9.1%p" />
                 <Key
-                    latin:keyLabel="_" />
+                    latin:keyLabel="_"
+                    latin:keyWidth="9.1%p" />
             </default>
         </switch>
-        <include
-            latin:keyboardLayout="@xml/kbd_settings" />
+        <Key
+            latin:keyStyle="micOrSettingsKeyStyle"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="-10.0%p"
+            latin:keyEdgeFlags="right" />
     </Row>
 </Keyboard>
diff --git a/java/res/xml-sw600dp/kbd_symbols_shift.xml b/java/res/xml-sw600dp/kbd_symbols_shift.xml
index 7195f6a7e6f58d7f2c230b179eb2c4c36be18bd0..111718a4d83953d558cbb69b8b7167f57d5a3b5c 100644
--- a/java/res/xml-sw600dp/kbd_symbols_shift.xml
+++ b/java/res/xml-sw600dp/kbd_symbols_shift.xml
@@ -32,7 +32,7 @@
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <!-- This row is intentionally not marked as a top row -->
     <Row
-        latin:keyWidth="9.1%p"
+        latin:keyWidth="9.0%p"
     >
         <Key
             latin:keyLabel="~" />
@@ -66,17 +66,17 @@
             latin:keyLabel="Δ" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.2%p"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="-10.0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
         latin:keyWidth="9.0%p"
     >
-        <Spacer
-            latin:horizontalGap="4.5%p" />
         <Key
             latin:keyStyle="nonPasswordSymbolKeyStyle"
-            latin:keyLabel="£" />
+            latin:keyLabel="£"
+            latin:keyXPos="4.5%p" />
         <Key
             latin:keyStyle="nonPasswordSymbolKeyStyle"
             latin:keyLabel="¢" />
@@ -103,7 +103,8 @@
             latin:keyLabel="}" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="14.6%p"
+            latin:keyXPos="-14.6%p"
+            latin:keyWidth="-14.6%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -111,7 +112,7 @@
     >
         <Key
             latin:keyStyle="moreKeyStyle"
-            latin:keyWidth="10.0%p"
+            latin:keyWidth="11.1%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="\\" />
@@ -137,10 +138,6 @@
         <Key
             latin:keyStyle="nonPasswordSymbolKeyStyle"
             latin:keyLabel="¿" />
-        <Key
-            latin:keyStyle="moreKeyStyle"
-            latin:keyWidth="10.1%p"
-            latin:keyEdgeFlags="right" />
     </Row>
     <!-- This row is intentionally not marked as a bottom row -->
     <Row
@@ -151,14 +148,16 @@
             latin:keyLabelOption="alignLeft"
             latin:keyWidth="13.0%p"
             latin:keyEdgeFlags="left" />
-        <Spacer
-            latin:horizontalGap="17.8%p" />
+        <Key
+            latin:keyStyle="tabKeyStyle" />
         <Key
             latin:keyStyle="spaceKeyStyle"
-            latin:keyWidth="38.5%p" />
-        <Spacer
-            latin:horizontalGap="17.8%p" />
-        <include
-            latin:keyboardLayout="@xml/kbd_settings" />
+            latin:keyXPos="30.8%p"
+            latin:keyWidth="41.0%p" />
+        <Key
+            latin:keyStyle="micOrSettingsKeyStyle"
+            latin:keyXPos="-10.0%p"
+            latin:keyWidth="0.0%p"
+            latin:keyEdgeFlags="right" />
     </Row>
 </Keyboard>
diff --git a/java/res/xml-sw768dp/kbd_azerty_rows.xml b/java/res/xml-sw768dp/kbd_azerty_rows.xml
index 564f7762901d9b002d2fab71408783534e16c2b0..f6ebfe6121fad284c03c74ed158aac893a8bab05 100644
--- a/java/res/xml-sw768dp/kbd_azerty_rows.xml
+++ b/java/res/xml-sw768dp/kbd_azerty_rows.xml
@@ -24,12 +24,12 @@
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <Row
-        latin:keyWidth="8.272%p"
+        latin:keyWidth="8.282%p"
     >
         <Key
             latin:keyStyle="tabKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
+            latin:keyWidth="7.969%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="a"
@@ -63,11 +63,12 @@
             latin:popupCharacters="@string/alternates_for_p" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-9.219%p"
+            latin:keyWidth="-9.219%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="8.157%p"
+        latin:keyWidth="8.125%p"
     >
         <Key
             latin:keyStyle="toSymbolKeyStyle"
@@ -103,15 +104,16 @@
             latin:keyEdgeFlags="right" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="8.593%p"
+            latin:keyXPos="-15.704%p"
+            latin:keyWidth="-15.704%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="8.042%p"
+        latin:keyWidth="8.047%p"
     >
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="15.192%p"
+            latin:keyWidth="13.829%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="w"
@@ -161,7 +163,8 @@
         </switch>
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="12.530%p"
+            latin:keyXPos="-13.750%p"
+            latin:keyWidth="-13.750%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
diff --git a/java/res/xml-sw768dp/kbd_number.xml b/java/res/xml-sw768dp/kbd_number.xml
index 012b751159d09542677bcf6c120b81dd3d844263..c99ead42e8540b60c6580cd25daddafe76a0964c 100644
--- a/java/res/xml-sw768dp/kbd_number.xml
+++ b/java/res/xml-sw768dp/kbd_number.xml
@@ -23,7 +23,7 @@
     latin:keyboardHeight="@dimen/keyboardHeight"
     latin:maxKeyboardHeight="50%p"
     latin:rowHeight="25%p"
-    latin:keyWidth="11.949%p"
+    latin:keyWidth="11.954%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
     latin:popupKeyboardTemplate="@xml/kbd_popup_template"
@@ -39,42 +39,42 @@
         >
             <!-- This row is intentionally not marked as a top row -->
             <Row>
-                <Spacer
-                    latin:horizontalGap="32.076%p" />
                 <Key
-                    latin:keyStyle="num1KeyStyle" />
+                    latin:keyStyle="tabKeyStyle"
+                    latin:keyLabelOption="alignLeft"
+                    latin:keyWidth="7.969%p"
+                    latin:keyEdgeFlags="left" />
+                <Key
+                    latin:keyStyle="num1KeyStyle"
+                    latin:keyXPos="32.076%p" />
                 <Key
                     latin:keyStyle="num2KeyStyle" />
                 <Key
                     latin:keyStyle="num3KeyStyle" />
-                <Spacer
-                    latin:horizontalGap="22.272%p" />
                 <Key
                     latin:keyStyle="deleteKeyStyle"
-                    latin:keyWidth="9.804%p"
+                    latin:keyXPos="-9.219%p"
+                    latin:keyWidth="0%p"
                     latin:keyEdgeFlags="right" />
             </Row>
             <Row>
-                <Spacer
-                    latin:horizontalGap="32.076%p" />
                 <Key
-                    latin:keyStyle="num4KeyStyle" />
+                    latin:keyStyle="num4KeyStyle"
+                    latin:keyXPos="32.076%p" />
                 <Key
                     latin:keyStyle="num5KeyStyle" />
                 <Key
                     latin:keyStyle="num6KeyStyle" />
-                <Spacer
-                    latin:horizontalGap="17.371%p" />
                 <Key
                     latin:keyStyle="returnKeyStyle"
-                    latin:keyWidth="14.706%p"
+                    latin:keyXPos="-15.704%p"
+                    latin:keyWidth="0%p"
                     latin:keyEdgeFlags="right" />
             </Row>
             <Row>
-                <Spacer
-                    latin:horizontalGap="32.076%p" />
                 <Key
-                    latin:keyStyle="num7KeyStyle" />
+                    latin:keyStyle="num7KeyStyle"
+                    latin:keyXPos="32.076%p" />
                 <Key
                     latin:keyStyle="num8KeyStyle" />
                 <Key
@@ -86,7 +86,7 @@
             <!-- This row is intentionally not marked as a bottom row -->
             <Row>
                 <Spacer
-                    latin:horizontalGap="44.026%p" />
+                    latin:keyXPos="32.076%p" />
                 <Key
                     latin:keyStyle="num0KeyStyle" />
                 <!-- There is an empty area below the "Enter" key and right of the "#" key. To
@@ -101,79 +101,72 @@
                 <Key
                     latin:keyStyle="tabKeyStyle"
                     latin:keyLabelOption="alignLeft"
+                    latin:keyWidth="7.969%p"
                     latin:keyEdgeFlags="left" />
-                <Spacer
-                    latin:horizontalGap="4.458%p" />
                 <Key
                     latin:keyLabel="-"
-                    latin:keyWidth="8.042%p" />
+                    latin:keyXPos="13.829%p"
+                    latin:keyWidth="8.047%p" />
                 <Key
                     latin:keyLabel="+"
-                    latin:keyWidth="8.042%p" />
+                    latin:keyWidth="8.047%p" />
                 <Key
                     latin:keyLabel="."
-                    latin:keyWidth="8.042%p" />
-                <Spacer
-                    latin:horizontalGap="4.458%p" />
+                    latin:keyWidth="8.047%p" />
                 <Key
-                    latin:keyLabel="1" />
+                    latin:keyLabel="1"
+                    latin:keyXPos="45.0%p" />
                 <Key
                     latin:keyLabel="2" />
                 <Key
                     latin:keyLabel="3" />
-                <Spacer
-                    latin:horizontalGap="9.360%p" />
                 <Key
                     latin:keyStyle="deleteKeyStyle"
-                    latin:keyWidth="9.804%p"
+                    latin:keyXPos="-9.219%p"
+                    latin:keyWidth="0%p"
                     latin:keyEdgeFlags="right" />
             </Row>
             <Row>
-                <Spacer
-                    latin:horizontalGap="16.406%p" />
                 <Key
                     latin:keyLabel="*"
-                    latin:keyWidth="8.042%p" />
+                    latin:keyXPos="13.829%p"
+                    latin:keyWidth="8.047%p" />
                 <Key
                     latin:keyLabel="/"
-                    latin:keyWidth="8.042%p" />
+                    latin:keyWidth="8.047%p" />
                 <Key
                     latin:keyLabel=","
-                    latin:keyWidth="8.042%p" />
-                <Spacer
-                    latin:horizontalGap="4.458%p" />
+                    latin:keyWidth="8.047%p" />
                 <Key
-                    latin:keyLabel="4" />
+                    latin:keyLabel="4"
+                    latin:keyXPos="45.0%p" />
                 <Key
                     latin:keyLabel="5" />
                 <Key
                     latin:keyLabel="6" />
-                <Spacer
-                    latin:horizontalGap="4.458%p" />
                 <Key
                     latin:keyStyle="returnKeyStyle"
-                    latin:keyWidth="14.706%p"
+                    latin:keyXPos="-15.704%p"
+                    latin:keyWidth="0%p"
                     latin:keyEdgeFlags="right" />
             </Row>
             <Row>
                 <!-- There is an empty area below the "More" key and left of the "(" key. To
                      ignore the touch event on the area, "(" is intentionally not marked as a left
                      edge key. -->
-                <Spacer
-                    latin:horizontalGap="16.406%p" />
                 <Key
                     latin:keyLabel="("
-                    latin:keyWidth="8.042%p" />
+                    latin:keyXPos="13.829%p"
+                    latin:keyWidth="8.047%p" />
                 <Key
                     latin:keyLabel=")"
-                    latin:keyWidth="8.042%p" />
+                    latin:keyWidth="8.047%p" />
                 <Key
                     latin:keyLabel="="
-                    latin:keyWidth="8.042%p" />
-                <Spacer
-                    latin:horizontalGap="4.458%p" />
+                    latin:keyWidth="8.047%p" />
                 <Key
-                    latin:keyLabel="7" />
+                    latin:keyLabel="7"
+                    latin:keyXPos="45.0%p" />
                 <Key
                     latin:keyLabel="8" />
                 <Key
@@ -184,29 +177,24 @@
             </Row>
             <!-- This row is intentionally not marked as a bottom row -->
             <Row>
-                <!-- There is an empty area below the "More" key and left of the "space" key. To
-                     ignore the touch event on the area, "space" is intentionally not marked as a
-                     left edge key. -->
-                <Spacer
-                    latin:horizontalGap="8.362%p" />
                 <switch>
                     <case latin:hasSettingsKey="true">
                         <Key
                             latin:keyStyle="settingsKeyStyle"
-                            latin:keyWidth="8.042%p" />
+                            latin:keyWidth="8.047%p" />
                     </case>
                     <default>
                         <Spacer
-                            latin:horizontalGap="8.042%p" />
+                            latin:keyWidth="8.047%p" />
                     </default>
                 </switch>
                 <Key
                     latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
-                    latin:keyWidth="24.127%p" />
-                <Spacer
-                    latin:horizontalGap="4.458%p" />
+                    latin:keyXPos="13.829%p"
+                    latin:keyWidth="24.14%p" />
                 <Key
-                    latin:keyLabel="*" />
+                    latin:keyLabel="*"
+                    latin:keyXPos="45.0%p" />
                 <Key
                     latin:keyLabel="0" />
                 <Key
@@ -217,12 +205,10 @@
                     >
                         <Key
                             latin:keyStyle="micKeyStyle"
-                            latin:keyWidth="8.042%p" />
+                            latin:keyXPos="-8.047%p"
+                            latin:keyWidth="0%p" />
                     </case>
                 </switch>
-                <!-- There is an empty area below the "Enter" key and right of the "#" key. To
-                     ignore the touch event on the area, "#" is intentionally not marked as a right
-                     edge key. -->
             </Row>
         </default>
     </switch>
diff --git a/java/res/xml-sw768dp/kbd_phone.xml b/java/res/xml-sw768dp/kbd_phone.xml
index 49e105d4ffbf4848c6842c622bf0a6bea713a697..a3dfec099cc73135e444ff3f9841d0cbe3daa454 100644
--- a/java/res/xml-sw768dp/kbd_phone.xml
+++ b/java/res/xml-sw768dp/kbd_phone.xml
@@ -23,7 +23,7 @@
     latin:keyboardHeight="@dimen/keyboardHeight"
     latin:maxKeyboardHeight="50%p"
     latin:rowHeight="25%p"
-    latin:keyWidth="11.949%p"
+    latin:keyWidth="11.954%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
     latin:popupKeyboardTemplate="@xml/kbd_popup_template"
@@ -38,63 +38,59 @@
         <Key
             latin:keyStyle="tabKeyStyle"
             latin:keyLabelOption="alignLeft"
+            latin:keyWidth="7.969%p"
             latin:keyEdgeFlags="left" />
         <!-- To match one character label size with "Tab", I placed spaces around the char '-'
              and '+'. -->
-        <Spacer
-            latin:horizontalGap="8.470%p" />
         <Key
             latin:code="45"
             latin:keyLabel=" - "
-            latin:keyWidth="8.042%p" />
+            latin:keyXPos="20.4%p"
+            latin:keyWidth="8.047%p" />
         <Key
             latin:code="43"
             latin:keyLabel=" + "
-            latin:keyWidth="8.042%p" />
-        <Spacer
-            latin:horizontalGap="8.479%p" />
+            latin:keyWidth="8.047%p" />
         <Key
-            latin:keyStyle="num1KeyStyle" />
+            latin:keyStyle="num1KeyStyle"
+            latin:keyXPos="45.0%p" />
         <Key
             latin:keyStyle="num2KeyStyle" />
         <Key
             latin:keyStyle="num3KeyStyle" />
-        <Spacer
-            latin:horizontalGap="9.360%p" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.804%p"
+            latin:keyXPos="-9.219%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
         <Key
             latin:keyStyle="moreKeyStyle"
+            latin:keyWidth="11.172%p"
             latin:keyEdgeFlags="left" />
         <!-- To match one character label size with "More", I placed spaces around the char ','
              and '.'. -->
-        <Spacer
-            latin:horizontalGap="8.470%p" />
         <Key
             latin:code="44"
             latin:keyLabel=" , "
-            latin:keyWidth="8.042%p" />
+            latin:keyXPos="20.4%p"
+            latin:keyWidth="8.047%p" />
         <Key
             latin:code="46"
             latin:keyLabel=" . "
-            latin:keyWidth="8.042%p" />
-        <Spacer
-            latin:horizontalGap="8.479%p" />
+            latin:keyWidth="8.047%p" />
         <Key
-            latin:keyStyle="num4KeyStyle" />
+            latin:keyStyle="num4KeyStyle"
+            latin:keyXPos="45.0%p" />
         <Key
             latin:keyStyle="num5KeyStyle" />
         <Key
             latin:keyStyle="num6KeyStyle" />
-        <Spacer
-            latin:horizontalGap="4.458%p" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="14.706%p"
+            latin:keyXPos="-15.704%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -102,20 +98,18 @@
              and ')'. -->
         <!-- There is an empty area below the "More" key and left of the "(" key.  To ignore
              the touch event on the area, "(" is intentionally not marked as a left edge key. -->
-        <Spacer
-            latin:horizontalGap="20.427%p" />
         <Key
             latin:code="40"
             latin:keyLabel=" ( "
-            latin:keyWidth="8.042%p" />
+            latin:keyXPos="20.4%p"
+            latin:keyWidth="8.047%p" />
         <Key
             latin:code="41"
             latin:keyLabel=" ) "
-            latin:keyWidth="8.042%p" />
-        <Spacer
-            latin:horizontalGap="8.479%p" />
+            latin:keyWidth="8.047%p" />
         <Key
-            latin:keyStyle="num7KeyStyle" />
+            latin:keyStyle="num7KeyStyle"
+            latin:keyXPos="45.0%p" />
         <Key
             latin:keyStyle="num8KeyStyle" />
         <Key
@@ -125,28 +119,24 @@
         </Row>
     <!-- This row is intentionally not marked as a bottom row -->
     <Row>
-        <!-- There is an empty area below the "More" key and left of the "space" key.  To ignore
-             the touch event on the area, "space" is intentionally not marked as a left edge key. -->
-        <Spacer
-            latin:horizontalGap="12.340%p" />
         <switch>
             <case latin:hasSettingsKey="true">
                 <Key
                     latin:keyStyle="settingsKeyStyle"
-                    latin:keyWidth="8.042%p" />
+                    latin:keyWidth="8.047%p" />
             </case>
             <default>
                 <Spacer
-                    latin:horizontalGap="8.042%p" />
+                    latin:keyWidth="8.047%p" />
             </default>
         </switch>
         <Key
             latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
+            latin:keyXPos="20.4%p"
             latin:keyWidth="16.084%p" />
-        <Spacer
-            latin:horizontalGap="8.479%p" />
         <Key
-            latin:keyStyle="numStarKeyStyle" />
+            latin:keyStyle="numStarKeyStyle"
+            latin:keyXPos="45.0%p" />
         <Key
             latin:keyStyle="num0KeyStyle" />
         <Key
@@ -157,10 +147,9 @@
             >
                 <Key
                     latin:keyStyle="micKeyStyle"
-                    latin:keyWidth="8.042%p" />
+                    latin:keyXPos="-8.047%p"
+                    latin:keyWidth="0%p" />
             </case>
         </switch>
-        <!-- There is an empty area below the "Enter" key and right of the "#" key.  To ignore
-             the touch event on the area, "#" is intentionally not marked as a right edge key. -->
     </Row>
 </Keyboard>
diff --git a/java/res/xml-sw768dp/kbd_phone_symbols.xml b/java/res/xml-sw768dp/kbd_phone_symbols.xml
index f73fb5dc8ea5abf50340c56c897cee556b30f347..931c3c934ee2c3278e81ef315e0f17f844ba9b1f 100644
--- a/java/res/xml-sw768dp/kbd_phone_symbols.xml
+++ b/java/res/xml-sw768dp/kbd_phone_symbols.xml
@@ -23,7 +23,7 @@
     latin:keyboardHeight="@dimen/keyboardHeight"
     latin:maxKeyboardHeight="50%p"
     latin:rowHeight="25%p"
-    latin:keyWidth="11.949%p"
+    latin:keyWidth="11.954%p"
     latin:horizontalGap="@dimen/key_horizontal_gap"
     latin:verticalGap="@dimen/key_bottom_gap"
     latin:popupKeyboardTemplate="@xml/kbd_popup_template"
@@ -38,71 +38,67 @@
         <Key
             latin:keyStyle="tabKeyStyle"
             latin:keyLabelOption="alignLeft"
+            latin:keyWidth="7.969%p"
             latin:keyEdgeFlags="left" />
-        <Spacer
-            latin:horizontalGap="4.458%p" />
         <Key
             latin:code="45"
             latin:keyLabel=" - "
-            latin:keyWidth="8.042%p" />
+            latin:keyXPos="13.829%p"
+            latin:keyWidth="8.047%p" />
         <Key
             latin:code="43"
             latin:keyLabel=" + "
-            latin:keyWidth="8.042%p" />
+            latin:keyWidth="8.047%p" />
         <Key
             latin:code="44"
             latin:keyLabel="@string/label_pause_key"
-            latin:keyWidth="8.042%p" />
+            latin:keyWidth="8.047%p" />
         <!-- To match one character label size with "Tab" and "Pause, I placed spaces around the
              char '-' and '+'. -->
-        <Spacer
-            latin:horizontalGap="4.458%p" />
         <Key
-            latin:keyStyle="num1KeyStyle" />
+            latin:keyStyle="num1KeyStyle"
+            latin:keyXPos="45.0%p" />
         <Key
             latin:keyStyle="num2KeyStyle" />
         <Key
             latin:keyStyle="num3KeyStyle" />
-        <Spacer
-            latin:horizontalGap="9.360%p" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.804%p"
+            latin:keyXPos="-9.219%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
         <Key
             latin:keyStyle="moreKeyStyle"
+            latin:keyWidth="11.172%p"
             latin:keyEdgeFlags="left" />
-        <Spacer
-            latin:horizontalGap="4.458%p" />
         <Key
             latin:code="44"
             latin:keyLabel=" , "
-            latin:keyWidth="8.042%p" />
+            latin:keyXPos="13.829%p"
+            latin:keyWidth="8.047%p" />
         <Key
             latin:code="46"
             latin:keyLabel=" . "
-            latin:keyWidth="8.042%p" />
+            latin:keyWidth="8.047%p" />
         <Key
             latin:code="59"
             latin:keyLabel="@string/label_wait_key"
-            latin:keyWidth="8.042%p" />
+            latin:keyWidth="8.047%p" />
         <!-- To match one character label size with "More" and "Wait", I placed spaces around the
              char ',' and '.'. -->
-        <Spacer
-            latin:horizontalGap="4.458%p" />
         <Key
-            latin:keyStyle="num4KeyStyle" />
+            latin:keyStyle="num4KeyStyle"
+            latin:keyXPos="45.0%p" />
         <Key
             latin:keyStyle="num5KeyStyle" />
         <Key
             latin:keyStyle="num6KeyStyle" />
-        <Spacer
-            latin:horizontalGap="4.458%p" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="14.706%p"
+            latin:keyXPos="-15.704%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -110,24 +106,22 @@
              char 'N', '(' and ')'. -->
         <!-- There is an empty area below the "More" key and left of the "(" key.  To ignore
              the touch event on the area, "(" is intentionally not marked as a left edge key. -->
-        <Spacer
-            latin:horizontalGap="16.406%p" />
         <Key
             latin:code="40"
             latin:keyLabel=" ( "
-            latin:keyWidth="8.042%p" />
+            latin:keyXPos="13.829%p"
+            latin:keyWidth="8.047%p" />
         <Key
             latin:code="41"
             latin:keyLabel=" ) "
-            latin:keyWidth="8.042%p" />
+            latin:keyWidth="8.047%p" />
         <Key
             latin:code="78"
             latin:keyLabel=" N "
-            latin:keyWidth="8.042%p" />
-        <Spacer
-            latin:horizontalGap="4.458%p" />
+            latin:keyWidth="8.047%p" />
         <Key
-            latin:keyStyle="num7KeyStyle" />
+            latin:keyStyle="num7KeyStyle"
+            latin:keyXPos="45.0%p" />
         <Key
             latin:keyStyle="num8KeyStyle" />
         <Key
@@ -137,28 +131,24 @@
     </Row>
     <!-- This row is intentionally not marked as a bottom row -->
     <Row>
-        <!-- There is an empty area below the "More" key and left of the "space" key.  To ignore
-             the touch event on the area, "space" is intentionally not marked as a left edge key. -->
-        <Spacer
-            latin:horizontalGap="8.362%p" />
         <switch>
             <case latin:hasSettingsKey="true">
                 <Key
                     latin:keyStyle="settingsKeyStyle"
-                    latin:keyWidth="8.042%p" />
+                    latin:keyWidth="8.047%p" />
             </case>
             <default>
                 <Spacer
-                    latin:horizontalGap="8.042%p" />
+                    latin:keyWidth="8.047%p" />
             </default>
         </switch>
         <Key
             latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
-            latin:keyWidth="24.127%p" />
-        <Spacer
-            latin:horizontalGap="4.458%p" />
+            latin:keyXPos="13.829%p"
+            latin:keyWidth="24.14%p" />
         <Key
-            latin:keyStyle="numStarKeyStyle" />
+            latin:keyStyle="numStarKeyStyle"
+            latin:keyXPos="45.0%p" />
         <Key
             latin:keyStyle="num0KeyStyle" />
         <Key
@@ -169,10 +159,9 @@
             >
                 <Key
                     latin:keyStyle="micKeyStyle"
-                    latin:keyWidth="8.042%p" />
+                    latin:keyXPos="-8.047%p"
+                    latin:keyWidth="0%p" />
             </case>
         </switch>
-        <!-- There is an empty area below the "Enter" key and right of the "#" key.  To ignore
-             the touch event on the area, "#" is intentionally not marked as a right edge key. -->
     </Row>
 </Keyboard>
diff --git a/java/res/xml-sw768dp/kbd_qwerty_row1.xml b/java/res/xml-sw768dp/kbd_qwerty_row1.xml
index f5135591c3deb53b627f47243619b29ea309a8d6..0a793028eaa390b827aa9daaf807f62ad78ce60d 100644
--- a/java/res/xml-sw768dp/kbd_qwerty_row1.xml
+++ b/java/res/xml-sw768dp/kbd_qwerty_row1.xml
@@ -23,12 +23,12 @@
 >
     <!-- This row is intentionally not marked as a top row -->
     <Row
-        latin:keyWidth="8.272%p"
+        latin:keyWidth="8.282%p"
     >
         <Key
             latin:keyStyle="tabKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
+            latin:keyWidth="7.969%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="q"
@@ -62,7 +62,8 @@
             latin:popupCharacters="@string/alternates_for_p" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-9.219%p"
+            latin:keyWidth="-9.219%p"
             latin:keyEdgeFlags="right" />
     </Row>
 </merge>
diff --git a/java/res/xml-sw768dp/kbd_qwerty_row2.xml b/java/res/xml-sw768dp/kbd_qwerty_row2.xml
index 02bd0a6c99289cd7c6e419691d94b4b62f6f7114..aeeab235e41d9e13c76245a4ee014a8b43b1cd3e 100644
--- a/java/res/xml-sw768dp/kbd_qwerty_row2.xml
+++ b/java/res/xml-sw768dp/kbd_qwerty_row2.xml
@@ -22,12 +22,12 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Row
-        latin:keyWidth="8.157%p"
+        latin:keyWidth="8.125%p"
     >
         <Key
             latin:keyStyle="toSymbolKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="11.167%p"
+            latin:keyWidth="11.172%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="a"
@@ -55,7 +55,8 @@
             latin:popupCharacters="@string/alternates_for_l" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="15.750%p"
+            latin:keyXPos="-15.704%p"
+            latin:keyWidth="-15.704%p"
             latin:keyEdgeFlags="right" />
     </Row>
 </merge>
diff --git a/java/res/xml-sw768dp/kbd_qwerty_row3.xml b/java/res/xml-sw768dp/kbd_qwerty_row3.xml
index b7e9bcff9a41a820126d1b2597db2c80722a77ef..e488cf32d21ea10914fbcc395a9d3d78f30791e7 100644
--- a/java/res/xml-sw768dp/kbd_qwerty_row3.xml
+++ b/java/res/xml-sw768dp/kbd_qwerty_row3.xml
@@ -22,11 +22,11 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Row
-        latin:keyWidth="8.042%p"
+        latin:keyWidth="8.047%p"
     >
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="15.192%p"
+            latin:keyWidth="13.829%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="z"
@@ -72,7 +72,8 @@
         </switch>
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="12.530%p"
+            latin:keyXPos="-13.750%p"
+            latin:keyWidth="-13.750%p"
             latin:keyEdgeFlags="right" />
     </Row>
 </merge>
diff --git a/java/res/xml-sw768dp/kbd_qwerty_row4.xml b/java/res/xml-sw768dp/kbd_qwerty_row4.xml
index e5bc342ae8d02958dd44b2b9650169c06017211d..44e8e10e14da52e5ffaf82a5f1a6257a4d1f1aa5 100644
--- a/java/res/xml-sw768dp/kbd_qwerty_row4.xml
+++ b/java/res/xml-sw768dp/kbd_qwerty_row4.xml
@@ -23,18 +23,17 @@
 >
     <!-- This row is intentionally not marked as a bottom row -->
     <Row
-        latin:keyWidth="8.042%p"
+        latin:keyWidth="8.047%p"
     >
-        <Spacer
-            latin:horizontalGap="8.362%p" />
         <switch>
             <case latin:hasSettingsKey="true">
                 <Key
-                    latin:keyStyle="settingsKeyStyle" />
+                    latin:keyStyle="settingsKeyStyle"
+                    latin:keyWidth="8.047%p" />
             </case>
             <default>
                 <Spacer
-                    latin:horizontalGap="8.042%p" />
+                    latin:keyWidth="8.047%p" />
             </default>
         </switch>
         <switch>
@@ -47,13 +46,15 @@
                         latin:mode="email"
                     >
                         <Key
-                            latin:keyStyle="comKeyStyle" />
+                            latin:keyStyle="comKeyStyle"
+                            latin:keyXPos="15.157%p" />
                     </case>
                     <case
                         latin:mode="url"
                     >
                         <Key
-                            latin:keyStyle="comKeyStyle" />
+                            latin:keyStyle="comKeyStyle"
+                            latin:keyXPos="15.157%p" />
                     </case>
                     <case
                         latin:imeAction="actionSearch"
@@ -63,11 +64,13 @@
                             latin:manualTemporaryUpperCaseCode="43"
                             latin:keyHintIcon="@drawable/key_hint_plus_holo"
                             latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_plus_large_holo"
-                            latin:popupCharacters="+" />
+                            latin:popupCharacters="+"
+                            latin:keyXPos="15.157%p" />
                     </case>
                     <default>
                         <Key
-                            latin:keyStyle="smileyKeyStyle" />
+                            latin:keyStyle="smileyKeyStyle"
+                            latin:keyXPos="15.157%p" />
                     </default>
                 </switch>
                 <switch>
@@ -105,6 +108,7 @@
                     >
                         <Key
                             latin:keyStyle="comKeyStyle"
+                            latin:keyXPos="15.157%p"
                             latin:keyWidth="16.084%p" />
                     </case>
                     <default>
@@ -113,7 +117,8 @@
                                 latin:mode="email"
                             >
                                 <Key
-                                    latin:keyStyle="comKeyStyle" />
+                                    latin:keyStyle="comKeyStyle"
+                                    latin:keyXPos="15.157%p" />
                             </case>
                             <case
                                 latin:imeAction="actionSearch"
@@ -123,11 +128,13 @@
                                     latin:manualTemporaryUpperCaseCode="43"
                                     latin:keyHintIcon="@drawable/key_hint_plus_holo"
                                     latin:manualTemporaryUpperCaseHintIcon="@drawable/key_hint_plus_large_holo"
-                                    latin:popupCharacters="+" />
+                                    latin:popupCharacters="+"
+                                    latin:keyXPos="15.157%p" />
                             </case>
                             <default>
                                 <Key
-                                    latin:keyStyle="smileyKeyStyle" />
+                                    latin:keyStyle="smileyKeyStyle"
+                                    latin:keyXPos="15.157%p" />
                             </default>
                         </switch>
                         <switch>
@@ -152,7 +159,8 @@
         </switch>
         <Key
             latin:keyStyle="spaceKeyStyle"
-            latin:keyWidth="37.454%p" />
+            latin:keyXPos="31.250%p"
+            latin:keyWidth="37.500%p" />
         <switch>
             <case
                 latin:languageCode="ru"
@@ -251,7 +259,9 @@
                 latin:voiceKeyEnabled="true"
             >
                 <Key
-                    latin:keyStyle="micKeyStyle" />
+                    latin:keyStyle="micKeyStyle"
+                    latin:keyXPos="-8.047%p"
+                    latin:keyWidth="0%p" />
             </case>
         </switch>
     </Row>
diff --git a/java/res/xml-sw768dp/kbd_qwerty_rows_scandinavia.xml b/java/res/xml-sw768dp/kbd_qwerty_rows_scandinavia.xml
index fb2034fb75735743d98ee7e2297106ec8c1e772e..363de4b8c8b276de589c8adf1d9d1f4ac04263bb 100644
--- a/java/res/xml-sw768dp/kbd_qwerty_rows_scandinavia.xml
+++ b/java/res/xml-sw768dp/kbd_qwerty_rows_scandinavia.xml
@@ -24,12 +24,12 @@
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <Row
-        latin:keyWidth="7.520%p"
+        latin:keyWidth="7.579%p"
     >
         <Key
             latin:keyStyle="tabKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
+            latin:keyWidth="7.969%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="q"
@@ -65,16 +65,17 @@
             latin:keyLabel="Ã¥" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-9.219%p"
+            latin:keyWidth="-9.219%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="7.520%p"
+        latin:keyWidth="7.500%p"
     >
         <Key
             latin:keyStyle="toSymbolKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
+            latin:keyWidth="7.969%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="a"
@@ -108,8 +109,10 @@
             latin:popupCharacters="@string/alternates_for_scandinavia_row2_11" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-15.704%p"
+            latin:keyWidth="-15.704%p"
             latin:keyEdgeFlags="right" />
+
     </Row>
     <include
         latin:keyboardLayout="@xml/kbd_qwerty_row3" />
diff --git a/java/res/xml-sw768dp/kbd_qwertz_rows.xml b/java/res/xml-sw768dp/kbd_qwertz_rows.xml
index 3e99f05113f92e9233daf7cc70f51360fa53ac70..9a8b661776833a8b2f02b61a6f7703ae0c4beb40 100644
--- a/java/res/xml-sw768dp/kbd_qwertz_rows.xml
+++ b/java/res/xml-sw768dp/kbd_qwertz_rows.xml
@@ -24,12 +24,12 @@
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <Row
-        latin:keyWidth="8.272%p"
+        latin:keyWidth="8.282%p"
     >
         <Key
             latin:keyStyle="tabKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
+            latin:keyWidth="7.969%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="q"
@@ -63,17 +63,18 @@
             latin:popupCharacters="@string/alternates_for_p" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-9.219%p"
+            latin:keyWidth="-9.219%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
         latin:keyboardLayout="@xml/kbd_qwerty_row2" />
     <Row
-        latin:keyWidth="8.042%p"
+        latin:keyWidth="8.047%p"
     >
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="15.192%p"
+            latin:keyWidth="13.829%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="y"
@@ -119,7 +120,8 @@
         </switch>
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="12.530%p"
+            latin:keyXPos="-13.750%p"
+            latin:keyWidth="-13.750%p"
             latin:keyEdgeFlags="right" />
     </Row>
    <include
diff --git a/java/res/xml-sw768dp/kbd_ru_rows.xml b/java/res/xml-sw768dp/kbd_ru_rows.xml
index c5cd043712e0763b12997c44ced00cfb587ef683..22e7d562c460889f43d3b442a4fae619fcdecb22 100644
--- a/java/res/xml-sw768dp/kbd_ru_rows.xml
+++ b/java/res/xml-sw768dp/kbd_ru_rows.xml
@@ -25,57 +25,49 @@
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <!-- This row is intentionally not marked as a top row -->
     <Row
-        latin:keyWidth="7.520%p"
+        latin:keyWidth="7.579%p"
     >
         <Key
             latin:keyStyle="tabKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
+            latin:keyWidth="7.969%p"
             latin:keyEdgeFlags="left" />
         <Key
-            latin:keyLabel="й"
-            latin:popupCharacters="1" />
+            latin:keyLabel="й" />
         <Key
-            latin:keyLabel="ц"
-            latin:popupCharacters="2" />
+            latin:keyLabel="ц" />
         <Key
-            latin:keyLabel="у"
-            latin:popupCharacters="3" />
+            latin:keyLabel="у" />
         <Key
-            latin:keyLabel="к"
-            latin:popupCharacters="4" />
+            latin:keyLabel="к" />
         <Key
             latin:keyLabel="е"
             latin:popupCharacters="@string/alternates_for_cyrillic_e" />
         <Key
-            latin:keyLabel="н"
-            latin:popupCharacters="6" />
+            latin:keyLabel="н" />
         <Key
-            latin:keyLabel="г"
-            latin:popupCharacters="7" />
+            latin:keyLabel="г" />
         <Key
-            latin:keyLabel="ш"
-            latin:popupCharacters="8" />
+            latin:keyLabel="ш" />
         <Key
-            latin:keyLabel="щ"
-            latin:popupCharacters="9" />
+            latin:keyLabel="щ" />
         <Key
-            latin:keyLabel="з"
-            latin:popupCharacters="0" />
+            latin:keyLabel="з" />
         <Key
             latin:keyLabel="Ñ…" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-9.219%p"
+            latin:keyWidth="-9.219%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="7.520%p"
+        latin:keyWidth="7.500%p"
     >
         <Key
             latin:keyStyle="toSymbolKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
+            latin:keyWidth="9.219%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="Ñ„" />
@@ -101,11 +93,12 @@
             latin:keyLabel="э" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-15.704%p"
+            latin:keyWidth="-15.704%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="7.520%p"
+        latin:keyWidth="7.500%p"
     >
         <Key
             latin:keyStyle="shiftKeyStyle"
@@ -138,7 +131,8 @@
             latin:popupCharacters="," />
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="12.400%p"
+            latin:keyXPos="-13.750%p"
+            latin:keyWidth="-13.750%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
diff --git a/java/res/xml-sw768dp/kbd_sr_rows.xml b/java/res/xml-sw768dp/kbd_sr_rows.xml
index be00585051983b67c626515af2f66f0f2929d98a..693658d09796a4512dd27900f9c3d681c75c2005 100644
--- a/java/res/xml-sw768dp/kbd_sr_rows.xml
+++ b/java/res/xml-sw768dp/kbd_sr_rows.xml
@@ -25,12 +25,12 @@
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <!-- This row is intentionally not marked as a top row -->
     <Row
-        latin:keyWidth="7.520%p"
+        latin:keyWidth="7.579%p"
     >
         <Key
             latin:keyStyle="tabKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="8.640%p"
+            latin:keyWidth="7.969%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="Ñ™"
@@ -66,16 +66,17 @@
             latin:keyLabel="ш" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="8.640%p"
+            latin:keyXPos="-9.219%p"
+            latin:keyWidth="-9.219%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="7.520%p"
+        latin:keyWidth="7.500%p"
     >
         <Key
             latin:keyStyle="toSymbolKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="8.640%p"
+            latin:keyWidth="9.219%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="а" />
@@ -101,15 +102,16 @@
             latin:keyLabel="Ñ›" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="8.640%p"
+            latin:keyXPos="-15.704%p"
+            latin:keyWidth="-15.704%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="7.520%p"
+        latin:keyWidth="7.500%p"
     >
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="8.640%p"
+            latin:keyWidth="9.219%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="Ñ•" />
@@ -143,7 +145,8 @@
             latin:popupCharacters="\?" />
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="8.640%p"
+            latin:keyXPos="-13.750%p"
+            latin:keyWidth="-13.750%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
diff --git a/java/res/xml-sw768dp/kbd_symbols.xml b/java/res/xml-sw768dp/kbd_symbols.xml
index 16722a04bc680fcf5830c16e3caf7621c04851a8..15c75cacc37b77c038c01f0af146ae916af28e4b 100644
--- a/java/res/xml-sw768dp/kbd_symbols.xml
+++ b/java/res/xml-sw768dp/kbd_symbols.xml
@@ -34,12 +34,12 @@
         latin:keyboardLayout="@xml/kbd_currency_key_styles" />
     <!-- This row is intentionally not marked as a top row -->
     <Row
-        latin:keyWidth="8.272%p"
+        latin:keyWidth="8.282%p"
     >
         <Key
             latin:keyStyle="tabKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
+            latin:keyWidth="7.969%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="1"
@@ -70,16 +70,17 @@
             latin:popupCharacters="ⁿ,∅" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-9.219%p"
+            latin:keyWidth="-9.219%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="8.157%p"
+        latin:keyWidth="8.125%p"
     >
         <Key
             latin:keyStyle="toAlphaKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="11.167%p"
+            latin:keyWidth="11.172%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="#" />
@@ -107,15 +108,16 @@
             latin:popupCharacters="],},&gt;" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="15.750%p"
+            latin:keyXPos="-15.704%p"
+            latin:keyWidth="-15.704%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="8.042%p"
+        latin:keyWidth="8.047%p"
     >
         <Key
             latin:keyStyle="moreKeyStyle"
-            latin:keyWidth="15.192%p"
+            latin:keyWidth="13.829%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="&lt;"
@@ -179,32 +181,34 @@
         </switch>
         <Key
             latin:keyStyle="moreKeyStyle"
-            latin:keyWidth="12.530%p"
+            latin:keyXPos="-13.750%p"
+            latin:keyWidth="-13.750%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <!-- This row is intentionally not marked as a bottom row -->
     <Row
-        latin:keyWidth="8.042%p"
+        latin:keyWidth="8.047%p"
     >
-        <Spacer
-            latin:horizontalGap="8.362%p" />
         <switch>
             <case latin:hasSettingsKey="true">
                 <Key
-                    latin:keyStyle="settingsKeyStyle" />
+                    latin:keyStyle="settingsKeyStyle"
+                    latin:keyWidth="8.047%p" />
             </case>
             <default>
                 <Spacer
-                    latin:horizontalGap="8.042%p" />
+                    latin:keyWidth="8.047%p" />
             </default>
         </switch>
         <Key
-            latin:keyLabel="/" />
+            latin:keyLabel="/"
+            latin:keyXPos="15.157%p" />
         <Key
             latin:keyLabel="\@" />
         <Key
             latin:keyStyle="spaceKeyStyle"
-            latin:keyWidth="37.454%p" />
+            latin:keyXPos="31.250%p"
+            latin:keyWidth="37.500%p" />
         <switch>
             <case
                 latin:languageCode="ru"
@@ -229,7 +233,9 @@
                 latin:voiceKeyEnabled="true"
             >
                 <Key
-                    latin:keyStyle="micKeyStyle" />
+                    latin:keyStyle="micKeyStyle"
+                    latin:keyXPos="-8.047%p"
+                    latin:keyWidth="0%p" />
             </case>
         </switch>
     </Row>
diff --git a/java/res/xml-sw768dp/kbd_symbols_shift.xml b/java/res/xml-sw768dp/kbd_symbols_shift.xml
index cc23358a52b670bf15587d2997e9cac92ab7d62b..44340ab817a011ea3c15c8314cfdb8d55a9a57f4 100644
--- a/java/res/xml-sw768dp/kbd_symbols_shift.xml
+++ b/java/res/xml-sw768dp/kbd_symbols_shift.xml
@@ -32,12 +32,12 @@
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <!-- This row is intentionally not marked as a top row -->
     <Row
-        latin:keyWidth="8.272%p"
+        latin:keyWidth="8.282%p"
     >
         <Key
             latin:keyStyle="tabKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="7.949%p"
+            latin:keyWidth="7.969%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="~" />
@@ -71,16 +71,17 @@
             latin:keyLabel="Δ" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-9.219%p"
+            latin:keyWidth="-9.219%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="8.157%p"
+        latin:keyWidth="8.125%p"
     >
         <Key
             latin:keyStyle="toAlphaKeyStyle"
             latin:keyLabelOption="alignLeft"
-            latin:keyWidth="11.167%p"
+            latin:keyWidth="11.172%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyStyle="nonPasswordSymbolKeyStyle"
@@ -111,15 +112,16 @@
             latin:keyLabel="}" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="15.750%p"
+            latin:keyXPos="-15.704%p"
+            latin:keyWidth="-15.704%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="8.042%p"
+        latin:keyWidth="8.047%p"
     >
         <Key
             latin:keyStyle="moreKeyStyle"
-            latin:keyWidth="15.192%p"
+            latin:keyWidth="13.829%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="\\" />
@@ -147,34 +149,37 @@
             latin:keyLabel="¿" />
         <Key
             latin:keyStyle="moreKeyStyle"
-            latin:keyWidth="12.530%p"
+            latin:keyXPos="-13.750%p"
+            latin:keyWidth="-13.750%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <!-- This row is intentionally not marked as a bottom row -->
     <Row
-        latin:keyWidth="8.042%p"
+        latin:keyWidth="8.047%p"
     >
-        <Spacer
-            latin:horizontalGap="24.446%p" />
         <switch>
             <case latin:hasSettingsKey="true">
                 <Key
-                    latin:keyStyle="settingsKeyStyle" />
+                    latin:keyStyle="settingsKeyStyle"
+                    latin:keyWidth="8.047%p" />
             </case>
             <default>
                 <Spacer
-                    latin:horizontalGap="8.042%p" />
+                    latin:keyWidth="8.047%p" />
             </default>
         </switch>
         <Key
             latin:keyStyle="spaceKeyStyle"
-            latin:keyWidth="37.454%p" />
+            latin:keyXPos="31.250%p"
+            latin:keyWidth="37.500%p" />
         <switch>
             <case
                 latin:voiceKeyEnabled="true"
             >
                 <Key
-                    latin:keyStyle="micKeyStyle" />
+                    latin:keyStyle="micKeyStyle"
+                    latin:keyXPos="-8.047%p"
+                    latin:keyWidth="0%p" />
             </case>
         </switch>
     </Row>
diff --git a/java/res/xml/kbd_azerty_rows.xml b/java/res/xml/kbd_azerty_rows.xml
index cc5fb57203d0934d829e7ba18261efecfd24a9d0..4a766987df2c4dd3c4aad2e35c78a49bb052c4b8 100644
--- a/java/res/xml/kbd_azerty_rows.xml
+++ b/java/res/xml/kbd_azerty_rows.xml
@@ -68,6 +68,7 @@
             latin:keyLabel="p"
             latin:keyHintIcon="@drawable/key_hint_num0"
             latin:popupCharacters="@string/alternates_for_p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -100,6 +101,7 @@
             latin:popupCharacters="@string/alternates_for_l" />
         <Key
             latin:keyLabel="m"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -130,7 +132,7 @@
             latin:keyLabel="\'" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="15%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
diff --git a/java/res/xml/kbd_number.xml b/java/res/xml/kbd_number.xml
index 033f802b7e0ac419df0129a665d09ba753558a7a..3c8384604e441a1519a95e76fd827b8ad9d0f9f9 100644
--- a/java/res/xml/kbd_number.xml
+++ b/java/res/xml/kbd_number.xml
@@ -47,8 +47,6 @@
                     latin:keyStyle="num2KeyStyle" />
                 <Key
                     latin:keyStyle="num3KeyStyle" />
-                <Spacer
-                    latin:horizontalGap="20%p" />
             </Row>
             <Row>
                 <Key
@@ -58,8 +56,6 @@
                     latin:keyStyle="num5KeyStyle" />
                 <Key
                     latin:keyStyle="num6KeyStyle" />
-                <Spacer
-                    latin:horizontalGap="20%p" />
             </Row>
             <Row>
                 <Key
@@ -71,21 +67,19 @@
                     latin:keyStyle="num9KeyStyle" />
                 <Key
                     latin:keyStyle="deleteKeyStyle"
-                    latin:keyWidth="20%p"
+                    latin:keyWidth="0%p"
                     latin:keyEdgeFlags="right" />
             </Row>
             <Row
                 latin:rowEdgeFlags="bottom"
             >
-                <Spacer
-                    latin:horizontalGap="26.67%p" />
+                <Spacer />
                 <Key
                     latin:keyStyle="num0KeyStyle" />
-                <Spacer
-                    latin:horizontalGap="26.67%p" />
+                <Spacer />
                 <Key
                     latin:keyStyle="returnKeyStyle"
-                    latin:keyWidth="20%p"
+                    latin:keyWidth="0%p"
                     latin:keyEdgeFlags="right" />
             </Row>
         </case>
@@ -103,7 +97,7 @@
                 <Key
                     latin:keyLabel="-"
                     latin:keyStyle="functionalKeyStyle"
-                    latin:keyWidth="20%p"
+                    latin:keyWidth="0%p"
                     latin:keyEdgeFlags="right" />
             </Row>
             <Row>
@@ -117,7 +111,7 @@
                 <Key
                     latin:keyLabel=","
                     latin:keyStyle="functionalKeyStyle"
-                    latin:keyWidth="20%p"
+                    latin:keyWidth="0%p"
                     latin:keyEdgeFlags="right" />
             </Row>
             <Row>
@@ -130,7 +124,7 @@
                     latin:keyLabel="9" />
                 <Key
                     latin:keyStyle="deleteKeyStyle"
-                    latin:keyWidth="20%p"
+                    latin:keyWidth="0%p"
                     latin:keyEdgeFlags="right" />
             </Row>
             <Row
@@ -145,7 +139,7 @@
                     latin:keyLabel="." />
                 <Key
                     latin:keyStyle="returnKeyStyle"
-                    latin:keyWidth="20%p"
+                    latin:keyWidth="0%p"
                     latin:keyEdgeFlags="right" />
             </Row>
         </default>
diff --git a/java/res/xml/kbd_phone.xml b/java/res/xml/kbd_phone.xml
index 62fbdeeec84235ff0eae3657bacad068559cacd6..7af8d07b4f3cc820ca06038af0b8151b60ca380e 100644
--- a/java/res/xml/kbd_phone.xml
+++ b/java/res/xml/kbd_phone.xml
@@ -46,7 +46,7 @@
         <Key
             latin:keyLabel="-"
             latin:keyStyle="functionalKeyStyle"
-            latin:keyWidth="20%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -60,7 +60,7 @@
         <Key
             latin:keyLabel="."
             latin:keyStyle="functionalKeyStyle"
-            latin:keyWidth="20%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -73,7 +73,7 @@
             latin:keyStyle="num9KeyStyle" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="20%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -88,7 +88,7 @@
             latin:keyStyle="numSpaceKeyStyle" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="20%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
 </Keyboard>
diff --git a/java/res/xml/kbd_phone_symbols.xml b/java/res/xml/kbd_phone_symbols.xml
index 67cd330e779b87e5cbc2ec9eada90e919376400b..4b6319ef7c4735a6f0c76a2eb15d046359f9548c 100644
--- a/java/res/xml/kbd_phone_symbols.xml
+++ b/java/res/xml/kbd_phone_symbols.xml
@@ -46,7 +46,7 @@
         <Key
             latin:keyLabel="-"
             latin:keyStyle="functionalKeyStyle"
-            latin:keyWidth="20%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -63,7 +63,7 @@
         <Key
             latin:keyLabel="."
             latin:keyStyle="functionalKeyStyle"
-            latin:keyWidth="20%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -78,7 +78,7 @@
             latin:keyStyle="numPoundKeyStyle" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="20%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -94,7 +94,7 @@
             latin:keyStyle="numSpaceKeyStyle" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="20%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
 </Keyboard>
diff --git a/java/res/xml/kbd_qwerty_row1.xml b/java/res/xml/kbd_qwerty_row1.xml
index 3964d3c3e6647a26e4ca9cc5ea3700ab255aed66..9ee1643137b07321e720bf9bd83a5da27a805111 100644
--- a/java/res/xml/kbd_qwerty_row1.xml
+++ b/java/res/xml/kbd_qwerty_row1.xml
@@ -66,6 +66,7 @@
             latin:keyLabel="p"
             latin:keyHintIcon="@drawable/key_hint_num0"
             latin:popupCharacters="@string/alternates_for_p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
 </merge>
diff --git a/java/res/xml/kbd_qwerty_row2.xml b/java/res/xml/kbd_qwerty_row2.xml
index 9ed4553c45bf0dbddc3b8f6ac77e0868fb470702..cf9b3049b3497ebd8862fd4dee9f2f95e9e6eb96 100644
--- a/java/res/xml/kbd_qwerty_row2.xml
+++ b/java/res/xml/kbd_qwerty_row2.xml
@@ -24,10 +24,9 @@
     <Row
         latin:keyWidth="10%p"
     >
-        <Spacer
-            latin:horizontalGap="5%p" />
         <Key
             latin:keyLabel="a"
+            latin:keyXPos="5%p"
             latin:popupCharacters="@string/alternates_for_a"
             latin:keyEdgeFlags="left" />
         <Key
@@ -51,6 +50,7 @@
         <Key
             latin:keyLabel="l"
             latin:popupCharacters="@string/alternates_for_l"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
 </merge>
diff --git a/java/res/xml/kbd_qwerty_row3.xml b/java/res/xml/kbd_qwerty_row3.xml
index 26608fd716732567ae0d4e1c35b322b33cb81e36..ffbf0613338dbab46512ae174312993d2644a41f 100644
--- a/java/res/xml/kbd_qwerty_row3.xml
+++ b/java/res/xml/kbd_qwerty_row3.xml
@@ -48,7 +48,7 @@
             latin:keyLabel="m" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="15%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
 </merge>
diff --git a/java/res/xml/kbd_qwerty_row4.xml b/java/res/xml/kbd_qwerty_row4.xml
index 1e7a3fc5b1c77915c3f5883a17cd596635828c23..67a1a76a1d8af26e9c4e86520145693495d467bc 100644
--- a/java/res/xml/kbd_qwerty_row4.xml
+++ b/java/res/xml/kbd_qwerty_row4.xml
@@ -64,13 +64,13 @@
                     >
                         <Key
                             latin:keyStyle="smileyKeyStyle"
-                            latin:keyWidth="20%p"
+                            latin:keyWidth="0%p"
                             latin:keyEdgeFlags="right" />
                     </case>
                     <default>
                         <Key
                             latin:keyStyle="returnKeyStyle"
-                            latin:keyWidth="20%p"
+                            latin:keyWidth="0%p"
                             latin:keyEdgeFlags="right" />
                     </default>
                 </switch>
@@ -114,21 +114,13 @@
                     >
                         <Key
                             latin:keyStyle="smileyKeyStyle"
-                            latin:keyWidth="25%p"
-                            latin:keyEdgeFlags="right" />
-                    </case>
-                    <case
-                        latin:webInput="true"
-                    >
-                        <Key
-                            latin:keyStyle="returnKeyStyle"
-                            latin:keyWidth="15%p"
+                            latin:keyWidth="0%p"
                             latin:keyEdgeFlags="right" />
                     </case>
                     <default>
                         <Key
                             latin:keyStyle="returnKeyStyle"
-                            latin:keyWidth="25%p"
+                            latin:keyWidth="0%p"
                             latin:keyEdgeFlags="right" />
                     </default>
                 </switch>
diff --git a/java/res/xml/kbd_qwerty_rows_scandinavia.xml b/java/res/xml/kbd_qwerty_rows_scandinavia.xml
index 06bb286a2db9513b1f68dc618ff6880a43c8210a..be841dccdc1c5646b4b66a4d3bfb656c7c2ae913 100644
--- a/java/res/xml/kbd_qwerty_rows_scandinavia.xml
+++ b/java/res/xml/kbd_qwerty_rows_scandinavia.xml
@@ -71,7 +71,7 @@
             latin:popupCharacters="@string/alternates_for_p" />
         <Key
             latin:keyLabel="Ã¥"
-            latin:keyWidth="8.75%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -109,7 +109,7 @@
         <Key
             latin:keyLabel="@string/keylabel_for_scandinavia_row2_11"
             latin:popupCharacters="@string/alternates_for_scandinavia_row2_11"
-            latin:keyWidth="8.75%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
diff --git a/java/res/xml/kbd_qwertz_rows.xml b/java/res/xml/kbd_qwertz_rows.xml
index df532637d097c40c9ea36bb9b97808e2e9a8ee4d..960b9f5ae92da07fe45426d37666d52b070cdc84 100644
--- a/java/res/xml/kbd_qwertz_rows.xml
+++ b/java/res/xml/kbd_qwertz_rows.xml
@@ -68,6 +68,7 @@
             latin:keyLabel="p"
             latin:keyHintIcon="@drawable/key_hint_num0"
             latin:popupCharacters="@string/alternates_for_p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
@@ -99,7 +100,7 @@
             latin:keyLabel="m" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="15%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
    <include
diff --git a/java/res/xml/kbd_ru_rows.xml b/java/res/xml/kbd_ru_rows.xml
index b992599385b5ac7354bbd1b5584f734f145a2405..5d30221d9b073ecdcee47d5daa2f1b43e766e1fd 100644
--- a/java/res/xml/kbd_ru_rows.xml
+++ b/java/res/xml/kbd_ru_rows.xml
@@ -71,7 +71,7 @@
             latin:popupCharacters="0" />
         <Key
             latin:keyLabel="Ñ…"
-            latin:keyWidth="8.75%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -101,7 +101,7 @@
             latin:keyLabel="ж" />
         <Key
             latin:keyLabel="э"
-            latin:keyWidth="8.75%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -132,7 +132,7 @@
             latin:keyLabel="ÑŽ" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="11.75%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
diff --git a/java/res/xml/kbd_sr_rows.xml b/java/res/xml/kbd_sr_rows.xml
index 0aa17d5e4c1e25c1da3c6303f29e27662ef9622a..8239f24cb6c7b77e423a252415e04b4bbddf2411 100644
--- a/java/res/xml/kbd_sr_rows.xml
+++ b/java/res/xml/kbd_sr_rows.xml
@@ -70,6 +70,7 @@
             latin:popupCharacters="0" />
         <Key
             latin:keyLabel="ш"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -98,6 +99,7 @@
             latin:keyLabel="ч" />
         <Key
             latin:keyLabel="Ñ›"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -126,7 +128,7 @@
             latin:keyLabel="ж" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="11.00%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
diff --git a/java/res/xml/kbd_symbols.xml b/java/res/xml/kbd_symbols.xml
index bd3917bb2ceee86292bc23eea84e52a08ccec4be..3c9098da7d52d7be098049c5858501b81c10a27c 100644
--- a/java/res/xml/kbd_symbols.xml
+++ b/java/res/xml/kbd_symbols.xml
@@ -64,6 +64,7 @@
         <Key
             latin:keyLabel="0"
             latin:popupCharacters="ⁿ,∅"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -94,6 +95,7 @@
         <Key
             latin:keyLabel=")"
             latin:popupCharacters="],},&gt;"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -124,7 +126,7 @@
             latin:popupCharacters="¿" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="15%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <include latin:keyboardLayout="@xml/kbd_symbols_row4" />
diff --git a/java/res/xml/kbd_symbols_row4.xml b/java/res/xml/kbd_symbols_row4.xml
index a5981bfbccd47c27b4c9dc092291ec4922ba5d7e..e92e58bcbf502c5e84302de5b69c641793596043 100644
--- a/java/res/xml/kbd_symbols_row4.xml
+++ b/java/res/xml/kbd_symbols_row4.xml
@@ -22,6 +22,7 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Row
+        latin:keyWidth="10%p"
         latin:rowEdgeFlags="bottom"
     >
         <switch>
@@ -49,13 +50,13 @@
                     >
                         <Key
                             latin:keyStyle="smileyKeyStyle"
-                            latin:keyWidth="20%p"
+                            latin:keyWidth="0%p"
                             latin:keyEdgeFlags="right" />
                     </case>
                     <default>
                         <Key
                             latin:keyStyle="returnKeyStyle"
-                            latin:keyWidth="20%p"
+                            latin:keyWidth="0%p"
                             latin:keyEdgeFlags="right" />
                     </default>
                 </switch>
@@ -86,13 +87,13 @@
                     >
                         <Key
                             latin:keyStyle="smileyKeyStyle"
-                            latin:keyWidth="25%p"
+                            latin:keyWidth="0%p"
                             latin:keyEdgeFlags="right" />
                     </case>
                     <default>
                         <Key
                             latin:keyStyle="returnKeyStyle"
-                            latin:keyWidth="25%p"
+                            latin:keyWidth="0%p"
                             latin:keyEdgeFlags="right" />
                     </default>
                 </switch>
diff --git a/java/res/xml/kbd_symbols_shift.xml b/java/res/xml/kbd_symbols_shift.xml
index b99d9708425fb444b7e3a4b6c7a9f9d46587ca6c..0f9ea3b77b17c1759048288a33a108b8e0d8929f 100644
--- a/java/res/xml/kbd_symbols_shift.xml
+++ b/java/res/xml/kbd_symbols_shift.xml
@@ -62,6 +62,7 @@
             latin:keyLabel="{" />
         <Key
             latin:keyLabel="}"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -93,6 +94,7 @@
             latin:keyLabel="[" />
         <Key
             latin:keyLabel="]"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -123,7 +125,7 @@
             latin:popupCharacters="≥,»,›" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="15%p"
+            latin:keyWidth="0%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <include latin:keyboardLayout="@xml/kbd_symbols_shift_row4" />
diff --git a/java/res/xml/kbd_symbols_shift_row4.xml b/java/res/xml/kbd_symbols_shift_row4.xml
index e4b5403b5de84af05703c814c89db076e33b8683..3ed76ea581055b7ef01f44cf2b4f171ed6972c85 100644
--- a/java/res/xml/kbd_symbols_shift_row4.xml
+++ b/java/res/xml/kbd_symbols_shift_row4.xml
@@ -22,6 +22,7 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Row
+        latin:keyWidth="10%p"
         latin:rowEdgeFlags="bottom"
     >
         <switch>
@@ -47,13 +48,13 @@
                     >
                         <Key
                             latin:keyStyle="smileyKeyStyle"
-                            latin:keyWidth="20%p"
+                            latin:keyWidth="0%p"
                             latin:keyEdgeFlags="right" />
                     </case>
                     <default>
                         <Key
                             latin:keyStyle="returnKeyStyle"
-                            latin:keyWidth="20%p"
+                            latin:keyWidth="0%p"
                             latin:keyEdgeFlags="right" />
                     </default>
                 </switch>
@@ -82,13 +83,13 @@
                     >
                         <Key
                             latin:keyStyle="smileyKeyStyle"
-                            latin:keyWidth="25%p"
+                            latin:keyWidth="0%p"
                             latin:keyEdgeFlags="right" />
                     </case>
                     <default>
                         <Key
                             latin:keyStyle="returnKeyStyle"
-                            latin:keyWidth="25%p"
+                            latin:keyWidth="0%p"
                             latin:keyEdgeFlags="right" />
                     </default>
                 </switch>
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
index 8eadf4ba431316e69768ca88f6a5e757d578935f..eccd0c822b2971ae6acd1beac1ae5c9bfdfe1335 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -16,10 +16,6 @@
 
 package com.android.inputmethod.keyboard;
 
-import com.android.inputmethod.keyboard.KeyStyles.KeyStyle;
-import com.android.inputmethod.keyboard.KeyboardParser.ParseException;
-import com.android.inputmethod.latin.R;
-
 import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.content.res.XmlResourceParser;
@@ -27,6 +23,10 @@ import android.graphics.drawable.Drawable;
 import android.text.TextUtils;
 import android.util.Xml;
 
+import com.android.inputmethod.keyboard.KeyStyles.KeyStyle;
+import com.android.inputmethod.keyboard.KeyboardParser.ParseException;
+import com.android.inputmethod.latin.R;
+
 import java.util.ArrayList;
 
 /**
@@ -137,7 +137,7 @@ public class Key {
     };
 
     /**
-     * This constructor is being used only for key in mini popup keyboard.
+     * This constructor is being used only for key in popup mini keyboard.
      */
     public Key(Resources res, Keyboard keyboard, CharSequence popupCharacter, int x, int y,
             int width, int height, int edgeFlags) {
@@ -174,6 +174,7 @@ public class Key {
      * @param x the x coordinate of the top-left
      * @param y the y coordinate of the top-left
      * @param parser the XML parser containing the attributes for this key
+     * @param keyStyles active key styles set
      */
     public Key(Resources res, Row row, int x, int y, XmlResourceParser parser,
             KeyStyles keyStyles) {
@@ -181,6 +182,7 @@ public class Key {
 
         final TypedArray keyboardAttr = res.obtainAttributes(Xml.asAttributeSet(parser),
                 R.styleable.Keyboard);
+        int keyWidth;
         try {
             mHeight = KeyboardParser.getDimensionOrFraction(keyboardAttr,
                     R.styleable.Keyboard_rowHeight,
@@ -188,17 +190,13 @@ public class Key {
             mGap = KeyboardParser.getDimensionOrFraction(keyboardAttr,
                     R.styleable.Keyboard_horizontalGap,
                     mKeyboard.getDisplayWidth(), row.mDefaultHorizontalGap);
-            mWidth = KeyboardParser.getDimensionOrFraction(keyboardAttr,
+            keyWidth = KeyboardParser.getDimensionOrFraction(keyboardAttr,
                     R.styleable.Keyboard_keyWidth,
-                    mKeyboard.getDisplayWidth(), row.mDefaultWidth) - mGap;
+                    mKeyboard.getDisplayWidth(), row.mDefaultWidth);
         } finally {
             keyboardAttr.recycle();
         }
 
-        // Horizontal gap is divided equally to both sides of the key.
-        mX = x + mGap / 2;
-        mY = y;
-
         final TypedArray keyAttr = res.obtainAttributes(Xml.asAttributeSet(parser),
                 R.styleable.Keyboard_Key);
         try {
@@ -212,6 +210,35 @@ public class Key {
                 style = keyStyles.getEmptyKeyStyle();
             }
 
+            final int keyboardWidth = mKeyboard.getDisplayWidth();
+            int keyXPos = KeyboardParser.getDimensionOrFraction(keyAttr,
+                    R.styleable.Keyboard_Key_keyXPos, keyboardWidth, x);
+            if (keyXPos < 0) {
+                // If keyXPos is negative, the actual x-coordinate will be k + keyXPos.
+                keyXPos += keyboardWidth;
+                if (keyXPos < x) {
+                    // keyXPos shouldn't be less than x because drawable area for this key starts
+                    // at x. Or, this key will overlaps the adjacent key on its left hand side.
+                    keyXPos = x;
+                }
+            }
+            if (keyWidth == 0) {
+                // If keyWidth is zero, the actual key width will be determined to fill out the
+                // area up to the right edge of the keyboard.
+                keyWidth = keyboardWidth - keyXPos;
+            } else if (keyWidth < 0) {
+                // If keyWidth is negative, the actual key width will be determined to fill out the
+                // area between the nearest key on the left hand side and the right edge of the
+                // keyboard.
+                keyXPos = x;
+                keyWidth = keyboardWidth - keyXPos;
+            }
+
+            // Horizontal gap is divided equally to both sides of the key.
+            mX = keyXPos + mGap / 2;
+            mY = y;
+            mWidth = keyWidth - mGap;
+
             final CharSequence[] popupCharacters = style.getTextArray(keyAttr,
                     R.styleable.Keyboard_Key_popupCharacters);
             if (res.getBoolean(R.bool.config_digit_popup_characters_enabled)) {
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardId.java b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
index bb2c0e3ba04202fb336a46bcb72b5bf4d7dad4c6..d0e8b32c3184ad2da014dcd0fa734a346b80e4fc 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardId.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
@@ -138,19 +138,19 @@ public class KeyboardId {
 
     @Override
     public String toString() {
-        return String.format("[%s.xml %s %s %s imeAction=%s %s%s%s%s%s%s%s]",
+        return String.format("[%s.xml %s %s %s %s %s%s%s%s%s%s%s]",
                 mXmlName,
                 mLocale,
                 (mOrientation == 1 ? "port" : "land"),
                 modeName(mMode),
                 imeOptionsName(mImeAction),
+                colorSchemeName(mColorScheme),
                 (mWebInput ? " webInput" : ""),
                 (mPasswordInput ? " passwordInput" : ""),
                 (mHasSettingsKey ? " hasSettingsKey" : ""),
                 (mVoiceKeyEnabled ? " voiceKeyEnabled" : ""),
                 (mHasVoiceKey ? " hasVoiceKey" : ""),
-                (mEnableShiftLock ? " enableShiftLock" : ""),
-                colorSchemeName(mColorScheme)
+                (mEnableShiftLock ? " enableShiftLock" : "")
         );
     }
 
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardParser.java b/java/src/com/android/inputmethod/keyboard/KeyboardParser.java
index bc9e8f0a01fef1e9aba82ef0d7f8382dc9136413..308651a9ebe91c5458268ff06b71baba11baa702 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardParser.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardParser.java
@@ -243,7 +243,7 @@ public class KeyboardParser {
                 if (TAG_KEY.equals(tag)) {
                     parseKey(parser, row, keys);
                 } else if (TAG_SPACER.equals(tag)) {
-                    parseSpacer(parser, keys);
+                    parseSpacer(parser, row, keys);
                 } else if (TAG_INCLUDE.equals(tag)) {
                     parseIncludeRowContent(parser, row, keys);
                 } else if (TAG_SWITCH.equals(tag)) {
@@ -290,19 +290,32 @@ public class KeyboardParser {
         }
     }
 
-    private void parseSpacer(XmlResourceParser parser, List<Key> keys)
+    private void parseSpacer(XmlResourceParser parser, Row row, List<Key> keys)
             throws XmlPullParserException, IOException {
         if (keys == null) {
             checkEndTag(TAG_SPACER, parser);
         } else {
             if (DEBUG) Log.d(TAG, String.format("<%s />", TAG_SPACER));
-            final TypedArray a = mResources.obtainAttributes(Xml.asAttributeSet(parser),
+            final TypedArray keyboardAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser),
                     R.styleable.Keyboard);
-            final int gap = getDimensionOrFraction(a, R.styleable.Keyboard_horizontalGap,
-                    mKeyboard.getDisplayWidth(), 0);
-            a.recycle();
+            if (keyboardAttr.hasValue(R.styleable.Keyboard_horizontalGap))
+                throw new IllegalAttribute(parser, "horizontalGap");
+            final int defaultWidth = (row != null) ? row.mDefaultWidth : 0;
+            final int keyWidth = getDimensionOrFraction(keyboardAttr, R.styleable.Keyboard_keyWidth,
+                    mKeyboard.getDisplayWidth(), defaultWidth);
+            keyboardAttr.recycle();
+
+            final TypedArray keyAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser),
+                    R.styleable.Keyboard_Key);
+            int keyXPos = KeyboardParser.getDimensionOrFraction(keyAttr,
+                    R.styleable.Keyboard_Key_keyXPos, mKeyboard.getDisplayWidth(), mCurrentX);
+            if (keyXPos < 0) {
+                // If keyXPos is negative, the actual x-coordinate will be display_width + keyXPos.
+                keyXPos += mKeyboard.getDisplayWidth();
+            }
+
             checkEndTag(TAG_SPACER, parser);
-            setSpacer(gap);
+            setSpacer(keyXPos, keyWidth);
         }
     }
 
@@ -536,7 +549,7 @@ public class KeyboardParser {
     }
 
     private void endKey(Key key) {
-        mCurrentX += key.mGap + key.mWidth;
+        mCurrentX = key.mX + key.mGap + key.mWidth;
         if (mCurrentX > mMaxRowWidth)
             mMaxRowWidth = mCurrentX;
     }
@@ -545,8 +558,8 @@ public class KeyboardParser {
         mTotalHeight = mCurrentY - defaultVerticalGap;
     }
 
-    private void setSpacer(int gap) {
-        mCurrentX += gap;
+    private void setSpacer(int keyXPos, int width) {
+        mCurrentX = keyXPos + width;
     }
 
     public static int getDimensionOrFraction(TypedArray a, int index, int base, int defValue) {
@@ -583,6 +596,13 @@ public class KeyboardParser {
         }
     }
 
+    @SuppressWarnings("serial")
+    private static class IllegalAttribute extends ParseException {
+        public IllegalAttribute(XmlResourceParser parser, String attribute) {
+            super("Tag " + parser.getName() + " has illegal attribute " + attribute, parser);
+        }
+    }
+
     @SuppressWarnings("serial")
     private static class NonEmptyTag extends ParseException {
         public NonEmptyTag(String tag, XmlResourceParser parser) {