diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index feb955e860829d43019d57708f2e3ff96306349f..7473b42ec0e81ee5e9045ded82a6eeffc88fb4f5 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -94,8 +94,16 @@
         <!-- Minimum keyboard height represented in pixels, percentage of display height if fraction
              is positive, or percentage of display width if fraction is negative. -->
         <attr name="minKeyboardHeight" format="dimension|fraction" />
-        <!-- Default width of a key, in pixels or percentage of display width. -->
-        <attr name="keyWidth" format="dimension|fraction" />
+        <!-- Default width of a key, in pixels or percentage of display width.
+             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="keyWidth" format="dimension|fraction|enum">
+            <enum name="fillRight" value="0" />
+            <enum name="fillBoth" value="-1" />
+        </attr>
         <!-- Default height of a row (key height + vertical gap), in pixels or percentage of
              keyboard height. -->
         <attr name="rowHeight" format="dimension|fraction" />
@@ -161,6 +169,9 @@
         <!-- Visual insets -->
         <attr name="visualInsetsLeft" format="dimension|fraction" />
         <attr name="visualInsetsRight" format="dimension|fraction" />
+        <!-- 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-sw768dp/kbd_ar_rows.xml b/java/res/xml-sw768dp/kbd_ar_rows.xml
index e84aae6b5906c70dd83a011af3e049af9678f23d..daaa38e4d904a7106441972f12db19e05a144775 100644
--- a/java/res/xml-sw768dp/kbd_ar_rows.xml
+++ b/java/res/xml-sw768dp/kbd_ar_rows.xml
@@ -27,12 +27,12 @@
     <include
         latin:keyboardLayout="@xml/kbd_key_styles" />
     <Row
-        latin:keyWidth="7.49%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="ض" />
@@ -61,16 +61,17 @@
             latin:popupCharacters="ج,چ" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-9.219%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="7.49%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="Ø´" />
@@ -100,15 +101,19 @@
             latin:keyLabel="Ø·" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="8.593%p"
+            latin:keyXPos="-15.704%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="8.042%p"
+        latin:keyWidth="7.500%p"
     >
         <Key
-            latin:keyLabel="ئ"
+            latin:keyStyle="shiftKeyStyle"
+            latin:keyWidth="9.219%p"
             latin:keyEdgeFlags="left" />
+        <Key
+            latin:keyLabel="ئ" />
         <Key
             latin:keyLabel="Ø¡" />
         <Key
@@ -132,7 +137,8 @@
             latin:keyLabel="د" />
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="11.736%p"
+            latin:keyXPos="-13.750%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <include latin:keyboardLayout="@xml/kbd_qwerty_row4" />
diff --git a/java/res/xml-sw768dp/kbd_azerty_rows.xml b/java/res/xml-sw768dp/kbd_azerty_rows.xml
index 564f7762901d9b002d2fab71408783534e16c2b0..5288ccf91d30242db296b8e40111cb2ba1f60237 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="fillBoth"
             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="fillBoth"
             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="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
diff --git a/java/res/xml-sw768dp/kbd_iw_rows.xml b/java/res/xml-sw768dp/kbd_iw_rows.xml
index a3a239dbf66f082cc4da668b8c0289ab01ff5d47..33263f576c716ea3adebd79dd14d78223253f14b 100644
--- a/java/res/xml-sw768dp/kbd_iw_rows.xml
+++ b/java/res/xml-sw768dp/kbd_iw_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="," />
@@ -53,11 +53,12 @@
             latin:keyLabel="פ" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-9.219%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
-        latin:keyWidth="8.157%p"
+        latin:keyWidth="8.125%p"
     >
         <Key
             latin:keyStyle="toSymbolKeyStyle"
@@ -89,15 +90,16 @@
             latin:keyLabel="×£" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="8.593%p"
+            latin:keyXPos="-15.704%p"
+            latin:keyWidth="fillBoth"
             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="×–"
@@ -123,7 +125,8 @@
             latin:popupCharacters="ץ,ץ׳" />
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="12.530%p"
+            latin:keyXPos="-13.750%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <include latin:keyboardLayout="@xml/kbd_qwerty_row4" />
diff --git a/java/res/xml-sw768dp/kbd_number.xml b/java/res/xml-sw768dp/kbd_number.xml
index 7cb77ea001b80571bdc572690d3c0bd648ef4e88..01c41a50c7202037a69d46950051891e13388a99 100644
--- a/java/res/xml-sw768dp/kbd_number.xml
+++ b/java/res/xml-sw768dp/kbd_number.xml
@@ -24,7 +24,7 @@
     latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
     latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     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"
@@ -40,42 +40,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="fillRight"
                     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="fillRight"
                     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
@@ -87,7 +87,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
@@ -102,79 +102,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.000%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="fillRight"
                     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.000%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="fillRight"
                     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.000%p" />
                 <Key
                     latin:keyLabel="8" />
                 <Key
@@ -185,29 +178,20 @@
             </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" />
-                    </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.140%p" />
                 <Key
-                    latin:keyLabel="*" />
+                    latin:keyLabel="*"
+                    latin:keyXPos="45.000%p" />
                 <Key
                     latin:keyLabel="0" />
                 <Key
@@ -218,12 +202,10 @@
                     >
                         <Key
                             latin:keyStyle="micKeyStyle"
-                            latin:keyWidth="8.042%p" />
+                            latin:keyXPos="-8.047%p"
+                            latin:keyWidth="fillRight" />
                     </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 60edcf2bdf82d00dd18f78c7ad6694106b49a5ad..583239afb0685878ff068e782b2bed385c9f7cf0 100644
--- a/java/res/xml-sw768dp/kbd_phone.xml
+++ b/java/res/xml-sw768dp/kbd_phone.xml
@@ -24,7 +24,7 @@
     latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
     latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     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,115 +39,101 @@
         <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.400%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.000%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="fillRight"
             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.400%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.000%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="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
         <!-- To match one character label size with "More", I placed spaces around the char '('
              and ')'. -->
-        <!-- There is an empty area bellow the "More" key and left of the "(" key.  To ignore
+        <!-- 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.400%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.000%p" />
         <Key
             latin:keyStyle="num8KeyStyle" />
         <Key
             latin:keyStyle="num9KeyStyle" />
-        <!-- There is an empty area bellow the "Enter" key and right of the "9" key.  To ignore
+        <!-- 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>
-        <!-- There is an empty area bellow 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" />
-            </default>
         </switch>
         <Key
             latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
+            latin:keyXPos="20.400%p"
             latin:keyWidth="16.084%p" />
-        <Spacer
-            latin:horizontalGap="8.479%p" />
         <Key
-            latin:keyStyle="numStarKeyStyle" />
+            latin:keyStyle="numStarKeyStyle"
+            latin:keyXPos="45.000%p" />
         <Key
             latin:keyStyle="num0KeyStyle" />
         <Key
@@ -158,10 +144,9 @@
             >
                 <Key
                     latin:keyStyle="micKeyStyle"
-                    latin:keyWidth="8.042%p" />
+                    latin:keyXPos="-8.047%p"
+                    latin:keyWidth="fillRight" />
             </case>
         </switch>
-        <!-- There is an empty area bellow 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 c388a466722477a4d30c8e6435f1760801c5ece3..714e5e5f36e07d36eb8a346e609d09f848c6a9ad 100644
--- a/java/res/xml-sw768dp/kbd_phone_symbols.xml
+++ b/java/res/xml-sw768dp/kbd_phone_symbols.xml
@@ -24,7 +24,7 @@
     latin:maxKeyboardHeight="@fraction/maxKeyboardHeight"
     latin:minKeyboardHeight="@fraction/minKeyboardHeight"
     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,127 +39,113 @@
         <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.000%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="fillRight"
             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.000%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="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
         <!-- To match one character label size with "More" and etc., I placed spaces around the
              char 'N', '(' and ')'. -->
-        <!-- There is an empty area bellow the "More" key and left of the "(" key.  To ignore
+        <!-- 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.000%p" />
         <Key
             latin:keyStyle="num8KeyStyle" />
         <Key
             latin:keyStyle="num9KeyStyle" />
-        <!-- There is an empty area bellow the "Enter" key and right of the "9" key.  To ignore
+        <!-- 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>
-        <!-- There is an empty area bellow 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" />
-            </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.140%p" />
         <Key
-            latin:keyStyle="numStarKeyStyle" />
+            latin:keyStyle="numStarKeyStyle"
+            latin:keyXPos="45.000%p" />
         <Key
             latin:keyStyle="num0KeyStyle" />
         <Key
@@ -170,10 +156,9 @@
             >
                 <Key
                     latin:keyStyle="micKeyStyle"
-                    latin:keyWidth="8.042%p" />
+                    latin:keyXPos="-8.047%p"
+                    latin:keyWidth="fillRight" />
             </case>
         </switch>
-        <!-- There is an empty area bellow 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..3727cf34eacfafdf3ab068384e7a55363dc41da8 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="fillBoth"
             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..45af120e237b380621501d82c335f9bc56091e22 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="fillBoth"
             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..7d59dfb9eb8f5bbdfceea58b79610bb0e5dc6900 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="fillBoth"
             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..b24ea5e43015b23b726b530f8aafb0e47681b7c2 100644
--- a/java/res/xml-sw768dp/kbd_qwerty_row4.xml
+++ b/java/res/xml-sw768dp/kbd_qwerty_row4.xml
@@ -23,20 +23,18 @@
 >
     <!-- 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" />
-            </default>
         </switch>
+        <Spacer
+            latin:keyXPos="15.157%p"
+            latin:keyWidth="fillRight" />
         <switch>
             <case
                 latin:languageCode="ru"
@@ -152,7 +150,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 +250,9 @@
                 latin:voiceKeyEnabled="true"
             >
                 <Key
-                    latin:keyStyle="micKeyStyle" />
+                    latin:keyStyle="micKeyStyle"
+                    latin:keyXPos="-8.047%p"
+                    latin:keyWidth="fillRight" />
             </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..b8875282cef8536f113d9ad6df1a14c5a0356898 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="fillBoth"
             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,7 +109,8 @@
             latin:popupCharacters="@string/alternates_for_scandinavia_row2_11" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-15.704%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
diff --git a/java/res/xml-sw768dp/kbd_qwertz_rows.xml b/java/res/xml-sw768dp/kbd_qwertz_rows.xml
index 3e99f05113f92e9233daf7cc70f51360fa53ac70..4e937acdaa4eadfec6b1df856d5c7282794bb2d1 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="fillBoth"
             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="fillBoth"
             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..3849141e45692497f4c00969191ae3a517660960 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="fillBoth"
             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="fillBoth"
             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="fillBoth"
             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..fbf1e9b84269b6cd268be3229f8872591f6666d1 100644
--- a/java/res/xml-sw768dp/kbd_sr_rows.xml
+++ b/java/res/xml-sw768dp/kbd_sr_rows.xml
@@ -25,57 +25,48 @@
         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="Ñ™"
-            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="5" />
+            latin:keyLabel="Ñ‚" />
         <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="8.640%p"
+            latin:keyXPos="-9.219%p"
+            latin:keyWidth="fillBoth"
             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 +92,16 @@
             latin:keyLabel="Ñ›" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="8.640%p"
+            latin:keyXPos="-15.704%p"
+            latin:keyWidth="fillBoth"
             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 +135,8 @@
             latin:popupCharacters="\?" />
         <Key
             latin:keyStyle="shiftKeyStyle"
-            latin:keyWidth="8.640%p"
+            latin:keyXPos="-13.750%p"
+            latin:keyWidth="fillBoth"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
diff --git a/java/res/xml-sw768dp/kbd_symbols.xml b/java/res/xml-sw768dp/kbd_symbols.xml
index 41e8522dc0bd6cb223088a22ec0a7d667810a1c6..26cf1ac7052ee97bc7999063fa9d0b619da3f1ae 100644
--- a/java/res/xml-sw768dp/kbd_symbols.xml
+++ b/java/res/xml-sw768dp/kbd_symbols.xml
@@ -35,12 +35,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"
@@ -71,16 +71,17 @@
             latin:popupCharacters="ⁿ,∅" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-9.219%p"
+            latin:keyWidth="fillBoth"
             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="#" />
@@ -108,15 +109,16 @@
             latin:popupCharacters="],},&gt;" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="15.750%p"
+            latin:keyXPos="-15.704%p"
+            latin:keyWidth="fillBoth"
             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;"
@@ -180,32 +182,30 @@
         </switch>
         <Key
             latin:keyStyle="moreKeyStyle"
-            latin:keyWidth="12.530%p"
+            latin:keyXPos="-13.750%p"
+            latin:keyWidth="fillBoth"
             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" />
-            </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"
@@ -230,7 +230,9 @@
                 latin:voiceKeyEnabled="true"
             >
                 <Key
-                    latin:keyStyle="micKeyStyle" />
+                    latin:keyStyle="micKeyStyle"
+                    latin:keyXPos="-8.047%p"
+                    latin:keyWidth="fillRight" />
             </case>
         </switch>
     </Row>
diff --git a/java/res/xml-sw768dp/kbd_symbols_shift.xml b/java/res/xml-sw768dp/kbd_symbols_shift.xml
index d7f5958b7f0dacc6fd50e06dd7d23c9ba0895591..94bd761ba918dfaf383436314b4ccf11208fff95 100644
--- a/java/res/xml-sw768dp/kbd_symbols_shift.xml
+++ b/java/res/xml-sw768dp/kbd_symbols_shift.xml
@@ -33,12 +33,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="~" />
@@ -72,16 +72,17 @@
             latin:keyLabel="Δ" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="9.331%p"
+            latin:keyXPos="-9.219%p"
+            latin:keyWidth="fillBoth"
             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"
@@ -112,15 +113,16 @@
             latin:keyLabel="}" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="15.750%p"
+            latin:keyXPos="-15.704%p"
+            latin:keyWidth="fillBoth"
             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="\\" />
@@ -148,34 +150,33 @@
             latin:keyLabel="¿" />
         <Key
             latin:keyStyle="moreKeyStyle"
-            latin:keyWidth="12.530%p"
+            latin:keyXPos="-13.750%p"
+            latin:keyWidth="fillBoth"
             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" />
-            </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="fillRight" />
             </case>
         </switch>
     </Row>
diff --git a/java/res/xml/kbd_ar_rows.xml b/java/res/xml/kbd_ar_rows.xml
index b2ea45701c137862f80268a9b9f5b555126ee758..a548775a4d41ba6b91aece37118d3dfb17257657 100644
--- a/java/res/xml/kbd_ar_rows.xml
+++ b/java/res/xml/kbd_ar_rows.xml
@@ -53,6 +53,7 @@
         <Key
             latin:keyLabel="ج"
             latin:popupCharacters="Ú†"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -84,6 +85,7 @@
         <Key
             latin:keyLabel="Ùƒ"
             latin:popupCharacters="Ú¯"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -112,7 +114,8 @@
             latin:keyLabel="Ø«" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="12%p"
+            latin:keyWidth="fillRight"
+            latin:visualInsetsLeft="1%p"
             latin:keyEdgeFlags="right" />
     </Row>
     <include latin:keyboardLayout="@xml/kbd_qwerty_row4" />
diff --git a/java/res/xml/kbd_azerty_rows.xml b/java/res/xml/kbd_azerty_rows.xml
index 2f2b05495723dde8cb73a7b0467583720f0d4869..9c81aad71940f4a72e3caf398cd4d28a1de49f0b 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="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -100,6 +101,7 @@
             latin:popupCharacters="@string/alternates_for_l" />
         <Key
             latin:keyLabel="m"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -132,7 +134,7 @@
             latin:popupCharacters="‘,’,‚,‛" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="15%p"
+            latin:keyWidth="fillRight"
             latin:visualInsetsLeft="1%p"
             latin:keyEdgeFlags="right" />
     </Row>
diff --git a/java/res/xml/kbd_iw_rows.xml b/java/res/xml/kbd_iw_rows.xml
index fb0c2a91581931e7c8fa250bf38ec34986130efd..af017ad6f1a3ac2c8c7ad9dff38d02f0b242b52d 100644
--- a/java/res/xml/kbd_iw_rows.xml
+++ b/java/res/xml/kbd_iw_rows.xml
@@ -29,10 +29,9 @@
     <Row
         latin:rowEdgeFlags="top"
     >
-        <Spacer
-            latin:horizontalGap="5%p" />
         <Key
             latin:keyLabel="ק"
+            latin:keyXPos="5%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="ר" />
@@ -50,7 +49,7 @@
             latin:keyLabel="פ" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="15%p"
+            latin:keyWidth="fillRight"
             latin:visualInsetsLeft="1%p"
             latin:keyEdgeFlags="right" />
     </Row>
@@ -76,13 +75,13 @@
             latin:keyLabel="ך" />
         <Key
             latin:keyLabel="×£"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
-        <Spacer
-            latin:horizontalGap="5%p" />
         <Key
             latin:keyLabel="×–"
+            latin:keyXPos="5%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="ס" />
@@ -101,6 +100,7 @@
         <Key
             latin:keyLabel="×¥"
             latin:keyEdgeFlags="right" />
+        <!-- Here is 5%p space -->
     </Row>
     <include latin:keyboardLayout="@xml/kbd_qwerty_row4" />
 </merge>
diff --git a/java/res/xml/kbd_key_styles.xml b/java/res/xml/kbd_key_styles.xml
index d4d25d4a292aae4f04aba9c98a8059f8986b54af..f888b231e5ff23552119b680640fc78ea4b90af7 100644
--- a/java/res/xml/kbd_key_styles.xml
+++ b/java/res/xml/kbd_key_styles.xml
@@ -51,7 +51,7 @@
             <key-style
                 latin:styleName="settingsPopupStyle"
                 latin:keyHintIcon="@drawable/hint_popup"
-                latin:popupCharacters="\@drawable/sym_keyboard_settings|\@integer/key_settings"
+                latin:popupCharacters="\@drawable/sym_keyboard_settings_holo|\@integer/key_settings"
                 latin:parentStyle="functionalKeyStyle" />
         </default>
     </switch>
@@ -101,20 +101,20 @@
             <key-style
                 latin:styleName="settingsKeyStyle"
                 latin:code="@integer/key_settings"
-                latin:keyIcon="@drawable/sym_keyboard_settings"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_settings"
+                latin:keyIcon="@drawable/sym_keyboard_settings_holo"
+                latin:iconPreview="@drawable/sym_keyboard_settings_holo"
                 latin:parentStyle="functionalKeyStyle" />
             <key-style
                 latin:styleName="spaceKeyStyle"
                 latin:code="@integer/key_space"
                 latin:keyIcon="@drawable/sym_keyboard_space"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_space"
+                latin:iconPreview="@drawable/sym_keyboard_space"
                 latin:parentStyle="functionalKeyStyle" />
             <key-style
                 latin:styleName="tabKeyStyle"
                 latin:code="@integer/key_tab"
                 latin:keyIcon="@drawable/sym_keyboard_tab"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_tab"
+                latin:iconPreview="@drawable/sym_keyboard_tab"
                 latin:parentStyle="functionalKeyStyle" />
             <key-style
                 latin:styleName="micKeyStyle"
@@ -128,7 +128,7 @@
                 latin:styleName="nonSpecialBackgroundTabKeyStyle"
                 latin:code="@integer/key_tab"
                 latin:keyIcon="@drawable/sym_keyboard_tab"
-                latin:iconPreview="@drawable/sym_keyboard_feedback_tab" />
+                latin:iconPreview="@drawable/sym_keyboard_tab" />
         </case>
         <case
             latin:colorScheme="black"
@@ -277,7 +277,7 @@
                         latin:styleName="returnKeyStyle"
                         latin:code="@integer/key_return"
                         latin:keyIcon="@drawable/sym_keyboard_return"
-                        latin:iconPreview="@drawable/sym_keyboard_feedback_return"
+                        latin:iconPreview="@drawable/sym_keyboard_return"
                         latin:parentStyle="functionalKeyStyle" />
                 </case>
                 <case
diff --git a/java/res/xml/kbd_number.xml b/java/res/xml/kbd_number.xml
index c5e9d77f8aabdbfb2e3297263483c0565217e53e..23b88a5bdc3549dc411d2ba22937fbe36b28789d 100644
--- a/java/res/xml/kbd_number.xml
+++ b/java/res/xml/kbd_number.xml
@@ -68,21 +68,19 @@
                     latin:keyStyle="num9KeyStyle" />
                 <Key
                     latin:keyStyle="deleteKeyStyle"
-                    latin:keyWidth="20%p"
+                    latin:keyWidth="fillRight"
                     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="fillRight"
                     latin:keyEdgeFlags="right" />
             </Row>
         </case>
@@ -101,7 +99,7 @@
                 <Key
                     latin:keyLabel="-"
                     latin:keyStyle="functionalKeyStyle"
-                    latin:keyWidth="20%p"
+                    latin:keyWidth="fillRight"
                     latin:keyEdgeFlags="right" />
             </Row>
             <Row>
@@ -115,7 +113,7 @@
                 <Key
                     latin:keyLabel=","
                     latin:keyStyle="functionalKeyStyle"
-                    latin:keyWidth="20%p"
+                    latin:keyWidth="fillRight"
                     latin:keyEdgeFlags="right" />
             </Row>
             <Row>
@@ -128,7 +126,7 @@
                     latin:keyLabel="9" />
                 <Key
                     latin:keyStyle="deleteKeyStyle"
-                    latin:keyWidth="20%p"
+                    latin:keyWidth="fillRight"
                     latin:keyEdgeFlags="right" />
             </Row>
             <Row
@@ -143,7 +141,7 @@
                     latin:keyLabel="." />
                 <Key
                     latin:keyStyle="returnKeyStyle"
-                    latin:keyWidth="20%p"
+                    latin:keyWidth="fillRight"
                     latin:keyEdgeFlags="right" />
             </Row>
         </default>
diff --git a/java/res/xml/kbd_phone.xml b/java/res/xml/kbd_phone.xml
index ca591c72d37955c2f7af339edd532cf9b08d4fab..e1d1ee8d0d72856c50c19ea23b29cf350e1ad87f 100644
--- a/java/res/xml/kbd_phone.xml
+++ b/java/res/xml/kbd_phone.xml
@@ -47,7 +47,7 @@
         <Key
             latin:keyLabel="-"
             latin:keyStyle="functionalKeyStyle"
-            latin:keyWidth="20%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -61,7 +61,7 @@
         <Key
             latin:keyLabel="."
             latin:keyStyle="functionalKeyStyle"
-            latin:keyWidth="20%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -74,7 +74,7 @@
             latin:keyStyle="num9KeyStyle" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="20%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -89,7 +89,7 @@
             latin:keyStyle="numSpaceKeyStyle" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="20%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
 </Keyboard>
diff --git a/java/res/xml/kbd_phone_symbols.xml b/java/res/xml/kbd_phone_symbols.xml
index 99db23ef1bf2adec3258d11c032f3335eb7ff89d..2af218cfe24c272ec9ee0ea598e75440ec518519 100644
--- a/java/res/xml/kbd_phone_symbols.xml
+++ b/java/res/xml/kbd_phone_symbols.xml
@@ -47,7 +47,7 @@
         <Key
             latin:keyLabel="-"
             latin:keyStyle="functionalKeyStyle"
-            latin:keyWidth="20%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -64,7 +64,7 @@
         <Key
             latin:keyLabel="."
             latin:keyStyle="functionalKeyStyle"
-            latin:keyWidth="20%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -79,7 +79,7 @@
             latin:keyStyle="numPoundKeyStyle" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="20%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -95,7 +95,7 @@
             latin:keyStyle="numSpaceKeyStyle" />
         <Key
             latin:keyStyle="returnKeyStyle"
-            latin:keyWidth="20%p"
+            latin:keyWidth="fillRight"
             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..ba804d321947167695f69986f8de4570d0465663 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="fillRight"
             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..57bbad75abd27fd26388f69e60be925fdcd74a56 100644
--- a/java/res/xml/kbd_qwerty_row2.xml
+++ b/java/res/xml/kbd_qwerty_row2.xml
@@ -24,11 +24,10 @@
     <Row
         latin:keyWidth="10%p"
     >
-        <Spacer
-            latin:horizontalGap="5%p" />
         <Key
             latin:keyLabel="a"
             latin:popupCharacters="@string/alternates_for_a"
+            latin:keyXPos="5%p"
             latin:keyEdgeFlags="left" />
         <Key
             latin:keyLabel="s"
@@ -52,5 +51,6 @@
             latin:keyLabel="l"
             latin:popupCharacters="@string/alternates_for_l"
             latin:keyEdgeFlags="right" />
+        <!-- Here is 5%p space -->
     </Row>
 </merge>
diff --git a/java/res/xml/kbd_qwerty_row3.xml b/java/res/xml/kbd_qwerty_row3.xml
index 3d106e615a840a276a6a2fc8c879888451334f42..98f0404c007ac67e89a99b38652e8239044b9834 100644
--- a/java/res/xml/kbd_qwerty_row3.xml
+++ b/java/res/xml/kbd_qwerty_row3.xml
@@ -49,7 +49,7 @@
             latin:keyLabel="m" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="15%p"
+            latin:keyWidth="fillBoth"
             latin:visualInsetsLeft="1%p"
             latin:keyEdgeFlags="right" />
     </Row>
diff --git a/java/res/xml/kbd_qwerty_row4.xml b/java/res/xml/kbd_qwerty_row4.xml
index a8d150e4bfa757bbdea9ea96bf6bac85ace98d93..21d80eb0b31329e95ec5977480bd2934860ce2ae 100644
--- a/java/res/xml/kbd_qwerty_row4.xml
+++ b/java/res/xml/kbd_qwerty_row4.xml
@@ -27,103 +27,67 @@
     >
         <switch>
             <case
-                latin:hasSettingsKey="false"
+                latin:hasSettingsKey="true"
             >
                 <Key
                     latin:keyStyle="toSymbolKeyStyle"
-                    latin:keyWidth="20%p"
+                    latin:keyWidth="15%p"
                     latin:keyEdgeFlags="left" />
+                <Key
+                    latin:keyStyle="settingsKeyStyle" />
                 <include
                     latin:keyboardLayout="@xml/kbd_qwerty_f1" />
                 <Key
                     latin:keyStyle="spaceKeyStyle"
-                    latin:keyWidth="40%p" />
-                <switch>
-                    <case
-                        latin:webInput="true"
-                    >
-                         <Key
-                            latin:keyHintIcon="@drawable/hint_popup"
-                            latin:popupCharacters="@string/alternates_for_web_tab_punctuation"
-                            latin:maxPopupKeyboardColumn="8"
-                            latin:keyStyle="tabKeyStyle" />
-                    </case>
-                    <default>
-                        <Key
-                            latin:keyLabel="."
-                            latin:keyHintIcon="@drawable/hint_popup"
-                            latin:popupCharacters="@string/alternates_for_punctuation"
-                            latin:maxPopupKeyboardColumn="7"
-                            latin:keyStyle="functionalKeyStyle" />
-                    </default>
-                </switch>
-                <switch>
-                    <case
-                        latin:mode="im"
-                    >
-                        <Key
-                            latin:keyStyle="smileyKeyStyle"
-                            latin:keyWidth="20%p"
-                            latin:keyEdgeFlags="right" />
-                    </case>
-                    <default>
-                        <Key
-                            latin:keyStyle="returnKeyStyle"
-                            latin:keyWidth="20%p"
-                            latin:keyEdgeFlags="right" />
-                    </default>
-                </switch>
+                    latin:keyWidth="30%p" />
             </case>
-            <case
-                latin:hasSettingsKey="true"
-            >
+            <!-- latin:hasSettingsKey="false" -->
+            <default>
                 <Key
                     latin:keyStyle="toSymbolKeyStyle"
-                    latin:keyWidth="15%p"
+                    latin:keyWidth="20%p"
                     latin:keyEdgeFlags="left" />
-                <Key
-                    latin:keyStyle="settingsKeyStyle" />
                 <include
                     latin:keyboardLayout="@xml/kbd_qwerty_f1" />
                 <Key
                     latin:keyStyle="spaceKeyStyle"
-                    latin:keyWidth="30%p" />
-                <switch>
-                    <case
-                        latin:webInput="true"
-                    >
-                         <Key
-                            latin:keyHintIcon="@drawable/hint_popup"
-                            latin:popupCharacters="@string/alternates_for_web_tab_punctuation"
-                            latin:maxPopupKeyboardColumn="8"
-                            latin:keyStyle="tabKeyStyle" />
-                    </case>
-                    <default>
-                        <Key
-                            latin:keyLabel="."
-                            latin:keyHintIcon="@drawable/hint_popup"
-                            latin:popupCharacters="@string/alternates_for_punctuation"
-                            latin:maxPopupKeyboardColumn="7"
-                            latin:keyStyle="functionalKeyStyle" />
-                    </default>
-                </switch>
-                <switch>
-                    <case
-                        latin:mode="im"
-                    >
-                        <Key
-                            latin:keyStyle="smileyKeyStyle"
-                            latin:keyWidth="25%p"
-                            latin:keyEdgeFlags="right" />
-                    </case>
-                    <default>
-                        <Key
-                            latin:keyStyle="returnKeyStyle"
-                            latin:keyWidth="25%p"
-                            latin:keyEdgeFlags="right" />
-                    </default>
-                </switch>
+                    latin:keyWidth="40%p" />
+            </default>
+        </switch>
+        <switch>
+            <case
+                latin:webInput="true"
+            >
+                <Key
+                    latin:keyHintIcon="@drawable/hint_popup"
+                    latin:popupCharacters="@string/alternates_for_web_tab_punctuation"
+                    latin:maxPopupKeyboardColumn="8"
+                    latin:keyStyle="tabKeyStyle" />
+            </case>
+            <default>
+                <Key
+                    latin:keyLabel="."
+                    latin:keyHintIcon="@drawable/hint_popup"
+                    latin:popupCharacters="@string/alternates_for_punctuation"
+                    latin:maxPopupKeyboardColumn="7"
+                    latin:keyStyle="functionalKeyStyle" />
+            </default>
+        </switch>
+        <switch>
+            <case
+                latin:mode="im"
+            >
+                <Key
+                    latin:keyStyle="smileyKeyStyle"
+                    latin:keyWidth="fillRight"
+                    latin:keyEdgeFlags="right" />
             </case>
+            <default>
+                <Key
+                    latin:keyStyle="returnKeyStyle"
+                    latin:keyWidth="fillRight"
+                    latin:keyEdgeFlags="right" />
+            </default>
         </switch>
     </Row>
 </merge>
diff --git a/java/res/xml/kbd_qwerty_rows_scandinavia.xml b/java/res/xml/kbd_qwerty_rows_scandinavia.xml
index 06bb286a2db9513b1f68dc618ff6880a43c8210a..8cb0640e57d21929ff7a6a159e1a74e1989c052e 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="fillRight"
             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="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
diff --git a/java/res/xml/kbd_qwertz_rows.xml b/java/res/xml/kbd_qwertz_rows.xml
index 7e8f90e32948c84803b13a8f8c7728bf394baf05..603cf351cb397cbb7e7e6ef1861cb9f97322a431 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="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
@@ -100,7 +101,7 @@
             latin:keyLabel="m" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="15%p"
+            latin:keyWidth="fillRight"
             latin:visualInsetsLeft="1%p"
             latin:keyEdgeFlags="right" />
     </Row>
diff --git a/java/res/xml/kbd_ru_rows.xml b/java/res/xml/kbd_ru_rows.xml
index b992599385b5ac7354bbd1b5584f734f145a2405..76250a303afb7125180ea868546852cdf375f7eb 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="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -101,7 +101,7 @@
             latin:keyLabel="ж" />
         <Key
             latin:keyLabel="э"
-            latin:keyWidth="8.75%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -132,7 +132,7 @@
             latin:keyLabel="ÑŽ" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="11.75%p"
+            latin:keyWidth="fillRight"
             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..139af80f59396293ef8c31764c1160fbdb4ab6fb 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="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -98,6 +99,7 @@
             latin:keyLabel="ч" />
         <Key
             latin:keyLabel="Ñ›"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row
@@ -126,7 +128,7 @@
             latin:keyLabel="ж" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="11.00%p"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <include
diff --git a/java/res/xml/kbd_symbols.xml b/java/res/xml/kbd_symbols.xml
index 0a80689912ec11fcd9a03f7a66e74f9aa6d94979..a58a51874ef3489b247819417be81f6d85995916 100644
--- a/java/res/xml/kbd_symbols.xml
+++ b/java/res/xml/kbd_symbols.xml
@@ -65,6 +65,7 @@
         <Key
             latin:keyLabel="0"
             latin:popupCharacters="ⁿ,∅"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -95,6 +96,7 @@
         <Key
             latin:keyLabel=")"
             latin:popupCharacters="],},&gt;"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -126,7 +128,7 @@
             latin:popupCharacters="¿" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="15%p"
+            latin:keyWidth="fillRight"
             latin:visualInsetsLeft="1%p"
             latin:keyEdgeFlags="right" />
     </Row>
diff --git a/java/res/xml/kbd_symbols_row4.xml b/java/res/xml/kbd_symbols_row4.xml
index b330095af594bcf45729026a13d1e394622b29e5..e701b9cddaf4d5a327c362ed7ef4432d268b76ea 100644
--- a/java/res/xml/kbd_symbols_row4.xml
+++ b/java/res/xml/kbd_symbols_row4.xml
@@ -22,81 +22,72 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Row
+        latin:keyWidth="10%p"
         latin:rowEdgeFlags="bottom"
     >
         <switch>
             <case
-                latin:hasSettingsKey="false"
+                latin:hasSettingsKey="true"
             >
                 <Key
                     latin:keyStyle="toAlphaKeyStyle"
-                    latin:keyWidth="20%p"
+                    latin:keyWidth="15%p"
                     latin:keyEdgeFlags="left" />
+                <Key
+                    latin:keyStyle="settingsKeyStyle" />
                 <include
-                    latin:keyboardLayout="@xml/kbd_symbols_f1" />
+                    latin:keyboardLayout="@xml/kbd_qwerty_f1" />
                 <Key
                     latin:keyStyle="spaceKeyStyle"
-                    latin:keyWidth="40%p" />
-                <Key
-                    latin:keyLabel="."
-                    latin:keyHintIcon="@drawable/hint_popup"
-                    latin:popupCharacters="@string/alternates_for_punctuation"
-                    latin:maxPopupKeyboardColumn="7"
-                    latin:keyStyle="functionalKeyStyle" />
-                <switch>
-                    <case
-                        latin:mode="im"
-                    >
-                        <Key
-                            latin:keyStyle="smileyKeyStyle"
-                            latin:keyWidth="20%p"
-                            latin:keyEdgeFlags="right" />
-                    </case>
-                    <default>
-                        <Key
-                            latin:keyStyle="returnKeyStyle"
-                            latin:keyWidth="20%p"
-                            latin:keyEdgeFlags="right" />
-                    </default>
-                </switch>
+                    latin:keyWidth="30%p" />
             </case>
-            <case
-                latin:hasSettingsKey="true"
-            >
+            <!-- latin:hasSettingsKey="false" -->
+            <default>
                 <Key
                     latin:keyStyle="toAlphaKeyStyle"
-                    latin:keyWidth="15%p"
+                    latin:keyWidth="20%p"
                     latin:keyEdgeFlags="left" />
-                <Key
-                    latin:keyStyle="settingsKeyStyle" />
                 <include
                     latin:keyboardLayout="@xml/kbd_symbols_f1" />
                 <Key
                     latin:keyStyle="spaceKeyStyle"
-                    latin:keyWidth="30%p" />
+                    latin:keyWidth="40%p" />
+            </default>
+        </switch>
+        <switch>
+            <case
+                latin:webInput="true"
+            >
+                <Key
+                    latin:keyHintIcon="@drawable/hint_popup"
+                    latin:popupCharacters="@string/alternates_for_web_tab_punctuation"
+                    latin:maxPopupKeyboardColumn="8"
+                    latin:keyStyle="tabKeyStyle" />
+            </case>
+            <default>
                 <Key
                     latin:keyLabel="."
                     latin:keyHintIcon="@drawable/hint_popup"
                     latin:popupCharacters="@string/alternates_for_punctuation"
                     latin:maxPopupKeyboardColumn="7"
                     latin:keyStyle="functionalKeyStyle" />
-                <switch>
-                    <case
-                        latin:mode="im"
-                    >
-                        <Key
-                            latin:keyStyle="smileyKeyStyle"
-                            latin:keyWidth="25%p"
-                            latin:keyEdgeFlags="right" />
-                    </case>
-                    <default>
-                        <Key
-                            latin:keyStyle="returnKeyStyle"
-                            latin:keyWidth="25%p"
-                            latin:keyEdgeFlags="right" />
-                    </default>
-                </switch>
+            </default>
+        </switch>
+        <switch>
+            <case
+                latin:mode="im"
+            >
+                <Key
+                    latin:keyStyle="smileyKeyStyle"
+                    latin:keyWidth="fillRight"
+                    latin:keyEdgeFlags="right" />
             </case>
+            <default>
+                <Key
+                    latin:keyStyle="returnKeyStyle"
+                    latin:keyWidth="fillRight"
+                    latin:keyEdgeFlags="right" />
+            </default>
         </switch>
     </Row>
 </merge>
diff --git a/java/res/xml/kbd_symbols_shift.xml b/java/res/xml/kbd_symbols_shift.xml
index cde07333b54a434c8cf3f87963dfb90c60840ab9..96e741bbc3b2f73c7331ef6e42901408d36d9acf 100644
--- a/java/res/xml/kbd_symbols_shift.xml
+++ b/java/res/xml/kbd_symbols_shift.xml
@@ -63,6 +63,7 @@
             latin:keyLabel="{" />
         <Key
             latin:keyLabel="}"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -94,6 +95,7 @@
             latin:keyLabel="[" />
         <Key
             latin:keyLabel="]"
+            latin:keyWidth="fillRight"
             latin:keyEdgeFlags="right" />
     </Row>
     <Row>
@@ -125,7 +127,7 @@
             latin:popupCharacters="≥,»,›" />
         <Key
             latin:keyStyle="deleteKeyStyle"
-            latin:keyWidth="15%p"
+            latin:keyWidth="fillRight"
             latin:visualInsetsLeft="1%p"
             latin:keyEdgeFlags="right" />
     </Row>
diff --git a/java/res/xml/kbd_symbols_shift_row4.xml b/java/res/xml/kbd_symbols_shift_row4.xml
index 4f8567d58a9b4b9b5f5382a523eb433da6763f21..7376bab1766f60a23197cac89e9e76c1b4b2d866 100644
--- a/java/res/xml/kbd_symbols_shift_row4.xml
+++ b/java/res/xml/kbd_symbols_shift_row4.xml
@@ -22,79 +22,70 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Row
+        latin:keyWidth="10%p"
         latin:rowEdgeFlags="bottom"
     >
         <switch>
             <case
-                latin:hasSettingsKey="false"
+                latin:hasSettingsKey="true"
             >
                 <Key
                     latin:keyStyle="toAlphaKeyStyle"
-                    latin:keyWidth="20%p"
+                    latin:keyWidth="15%p"
                     latin:keyEdgeFlags="left" />
+                <Key
+                    latin:keyStyle="settingsKeyStyle" />
                 <Key
                     latin:keyLabel="„"
                     latin:popupCharacters="“,”,„,‟,«,»,‘,’,‚,‛"
                     latin:keyStyle="nonPasswordFunctionalKeyStyle" />
                 <Key
                     latin:keyStyle="spaceKeyStyle"
-                    latin:keyWidth="40%p" />
-                <Key
-                    latin:keyLabel="…"
-                    latin:keyStyle="nonPasswordFunctionalKeyStyle" />
-                <switch>
-                    <case
-                        latin:mode="im"
-                    >
-                        <Key
-                            latin:keyStyle="smileyKeyStyle"
-                            latin:keyWidth="20%p"
-                            latin:keyEdgeFlags="right" />
-                    </case>
-                    <default>
-                        <Key
-                            latin:keyStyle="returnKeyStyle"
-                            latin:keyWidth="20%p"
-                            latin:keyEdgeFlags="right" />
-                    </default>
-                </switch>
+                    latin:keyWidth="30%p" />
             </case>
-            <case
-                latin:hasSettingsKey="true"
-            >
+            <!-- latin:hasSettingsKey="false" -->
+            <default>
                 <Key
                     latin:keyStyle="toAlphaKeyStyle"
-                    latin:keyWidth="15%p"
+                    latin:keyWidth="20%p"
                     latin:keyEdgeFlags="left" />
-                <Key
-                    latin:keyStyle="settingsKeyStyle" />
                 <Key
                     latin:keyLabel="„"
                     latin:popupCharacters="“,”,„,‟,«,»,‘,’,‚,‛"
                     latin:keyStyle="nonPasswordFunctionalKeyStyle" />
                 <Key
                     latin:keyStyle="spaceKeyStyle"
-                    latin:keyWidth="30%p" />
+                    latin:keyWidth="40%p" />
+            </default>
+        </switch>
+        <switch>
+            <case
+                latin:webInput="true"
+            >
+                <Key
+                    latin:keyStyle="tabKeyStyle" />
+            </case>
+            <default>
                 <Key
                     latin:keyLabel="…"
                     latin:keyStyle="nonPasswordFunctionalKeyStyle" />
-                <switch>
-                    <case
-                        latin:mode="im"
-                    >
-                        <Key
-                            latin:keyStyle="smileyKeyStyle"
-                            latin:keyWidth="25%p"
-                            latin:keyEdgeFlags="right" />
-                    </case>
-                    <default>
-                        <Key
-                            latin:keyStyle="returnKeyStyle"
-                            latin:keyWidth="25%p"
-                            latin:keyEdgeFlags="right" />
-                    </default>
-                </switch>
+            </default>
+        </switch>
+        <switch>
+            <case
+                latin:mode="im"
+            >
+                <Key
+                    latin:keyStyle="smileyKeyStyle"
+                    latin:keyWidth="fillRight"
+                    latin:keyEdgeFlags="right" />
             </case>
+            <default>
+                <Key
+                    latin:keyStyle="returnKeyStyle"
+                    latin:keyWidth="fillRight"
+                    latin:keyEdgeFlags="right" />
+            </default>
         </switch>
     </Row>
 </merge>
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
index ef86d66adef706acd8a75eb5bf765423e5ff82cf..cb529461afbc733475f41c4e51b25bca46dc73f0 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -101,6 +101,10 @@ public class Key {
     /** Key is enabled and responds on press */
     public boolean mEnabled = true;
 
+    // keyWidth constants
+    private static final int KEYWIDTH_FILL_RIGHT = 0;
+    private static final int KEYWIDTH_FILL_BOTH = -1;
+
     private final static int[] KEY_STATE_NORMAL_ON = {
         android.R.attr.state_checkable,
         android.R.attr.state_checked
@@ -140,7 +144,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) {
@@ -178,6 +182,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) {
@@ -185,6 +190,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,
@@ -192,17 +198,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 {
@@ -216,6 +218,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 == KEYWIDTH_FILL_RIGHT) {
+                // 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 <= KEYWIDTH_FILL_BOTH) {
+                // 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 88d23985a9a11e02463673a8b9e5db8fbcd70f0f..7c03ec71e2b0afced553ce546ff688e9abb3fea7 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardId.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardId.java
@@ -159,7 +159,7 @@ public class KeyboardId {
 
     @Override
     public String toString() {
-        return String.format("[%s.xml %s %s%d %s %s %s %s%s%s%s%s%s]",
+        return String.format("[%s.xml %s %s%d %s %s %s%s%s%s%s%s%s]",
                 mXmlName,
                 mLocale,
                 (mOrientation == 1 ? "port" : "land"), mWidth,
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardParser.java b/java/src/com/android/inputmethod/keyboard/KeyboardParser.java
index 43d9f271f232d3ef46b2e8600b45d80eb56a9600..4ae01134732722c83e546be1be79e4d20dcc907e 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardParser.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardParser.java
@@ -280,7 +280,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)) {
@@ -327,19 +327,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);
         }
     }
 
@@ -566,14 +579,14 @@ public class KeyboardParser {
 
     private void startRow(Row row) {
         mCurrentX = 0;
-        setSpacer(mHorizontalEdgesPadding);
+        setSpacer(mCurrentX, mHorizontalEdgesPadding);
         mCurrentRow = row;
     }
 
     private void endRow() {
         if (mCurrentRow == null)
             throw new InflateException("orphant end row tag");
-        setSpacer(mHorizontalEdgesPadding);
+        setSpacer(mCurrentX, mHorizontalEdgesPadding);
         if (mCurrentX > mMaxRowWidth)
             mMaxRowWidth = mCurrentX;
         mCurrentY += mCurrentRow.mDefaultHeight;
@@ -581,7 +594,7 @@ public class KeyboardParser {
     }
 
     private void endKey(Key key) {
-        mCurrentX += key.mGap + key.mWidth;
+        mCurrentX = key.mX + key.mGap + key.mWidth;
     }
 
     private void endKeyboard(int defaultVerticalGap) {
@@ -589,19 +602,23 @@ 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) {
         final TypedValue value = a.peekValue(index);
         if (value == null)
             return defValue;
-        if (value.type == TypedValue.TYPE_DIMENSION) {
-            return a.getDimensionPixelOffset(index, defValue);
-        } else if (value.type == TypedValue.TYPE_FRACTION) {
+        if (value.type == TypedValue.TYPE_FRACTION) {
             // Round it to avoid values like 47.9999 from getting truncated
             return Math.round(a.getFraction(index, base, base, defValue));
+        } else if (value.type == TypedValue.TYPE_DIMENSION) {
+            return a.getDimensionPixelOffset(index, defValue);
+        } else if (value.type >= TypedValue.TYPE_FIRST_INT
+                && value.type <= TypedValue.TYPE_LAST_INT) {
+            // For enum value.
+            return a.getInt(index, defValue);
         }
         return defValue;
     }
@@ -627,6 +644,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) {