diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index b513d964ac072ccd437d91a0c854f2e4f5bd5b1e..a27c5681a993cbbd20264c065f3db803c000f59a 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -236,11 +236,6 @@
     </declare-styleable>
 
     <declare-styleable name="Keyboard_Key">
-        <!-- TODO: Remove code attribute and consolidate with keySpec. -->
-        <!-- The unicode value that this key outputs.
-             Code value represented in hexadecimal prefixed with "0x" or code value reference using
-             "!code/<code_name>" notation. -->
-        <attr name="code" format="string" />
         <!-- The alternate unicode value that this key outputs while typing.
              Code value represented in hexadecimal prefixed with "0x" or code value reference using
              "!code/<code_name>" notation. -->
@@ -314,9 +309,6 @@
             <!-- If true, disable additionalMoreKeys. -->
             <flag name="disableAdditionalMoreKeys" value="0x80000000" />
         </attr>
-        <!-- TODO: Remove keyIcon attribute and consolidate with keySpec. -->
-        <!-- The icon to display on the key instead of the label. -->
-        <attr name="keyIcon" format="string" />
         <!-- The icon for disabled key -->
         <attr name="keyIconDisabled" format="string" />
         <!-- The icon to show in the popup preview. -->
diff --git a/java/res/xml-sw600dp/key_styles_common.xml b/java/res/xml-sw600dp/key_styles_common.xml
index 4e4579b4fc1ae70a257db84e5914ec1a93779a4f..4dbc23ed06630fe3d1e092ba38a4231a00eee3eb 100644
--- a/java/res/xml-sw600dp/key_styles_common.xml
+++ b/java/res/xml-sw600dp/key_styles_common.xml
@@ -39,7 +39,6 @@
     <!-- Base style for shift key. A single space is used for dummy label in moreKeys. -->
     <key-style
         latin:styleName="baseForShiftKeyStyle"
-        latin:code="!code/key_shift"
         latin:keyActionFlags="noKeyPreview"
         latin:keyLabelFlags="preserveCase"
         latin:moreKeys="!noPanelAutoMoreKey!, |!code/key_capslock" />
@@ -49,7 +48,7 @@
         >
             <key-style
                 latin:styleName="shiftKeyStyle"
-                latin:keyIcon="!icon/shift_key_shifted"
+                latin:keyLabel="!icon/shift_key_shifted|!code/key_shift"
                 latin:backgroundType="stickyOff"
                 latin:parentStyle="baseForShiftKeyStyle" />
         </case>
@@ -58,71 +57,56 @@
         >
             <key-style
                 latin:styleName="shiftKeyStyle"
-                latin:keyIcon="!icon/shift_key_shifted"
+                latin:keyLabel="!icon/shift_key_shifted|!code/key_shift"
                 latin:backgroundType="stickyOn"
                 latin:parentStyle="baseForShiftKeyStyle" />
         </case>
         <default>
             <key-style
                 latin:styleName="shiftKeyStyle"
-                latin:keyIcon="!icon/shift_key"
+                latin:keyLabel="!icon/shift_key|!code/key_shift"
                 latin:backgroundType="stickyOff"
                 latin:parentStyle="baseForShiftKeyStyle" />
         </default>
     </switch>
     <key-style
         latin:styleName="deleteKeyStyle"
-        latin:code="!code/key_delete"
-        latin:keyIcon="!icon/delete_key"
+        latin:keyLabel="!icon/delete_key|!code/key_delete"
         latin:keyActionFlags="isRepeatable|noKeyPreview"
         latin:backgroundType="functional" />
     <include
         latin:keyboardLayout="@xml/key_styles_enter" />
-    <!-- Override defaultEnterKeyStyle in key_styles_enter.xml -->
-    <key-style
-        latin:styleName="defaultEnterKeyStyle"
-        latin:code="!code/key_enter"
-        latin:keyIcon="!icon/enter_key"
-        latin:keyLabelFlags="preserveCase|autoXScale|followKeyLargeLabelRatio"
-        latin:keyActionFlags="noKeyPreview"
-        latin:backgroundType="functional"
-        latin:parentStyle="navigateMoreKeysStyle" />
     <key-style
         latin:styleName="spaceKeyStyle"
-        latin:code="!code/key_space"
+        latin:keyLabel=" |!code/key_space"
         latin:keyActionFlags="noKeyPreview|enableLongPress" />
     <!-- U+200C: ZERO WIDTH NON-JOINER
          U+200D: ZERO WIDTH JOINER -->
     <key-style
         latin:styleName="zwnjKeyStyle"
-        latin:code="0x200C"
-        latin:keyIcon="!icon/zwnj_key"
+        latin:keyLabel="!icon/zwnj_key|&#x200C;"
         latin:moreKeys="!icon/zwj_key|&#x200D;"
         latin:keyLabelFlags="hasPopupHint"
         latin:keyActionFlags="noKeyPreview" />
     <key-style
         latin:styleName="shortcutKeyStyle"
-        latin:code="!code/key_shortcut"
-        latin:keyIcon="!icon/shortcut_key"
+        latin:keyLabel="!icon/shortcut_key|!code/key_shortcut"
         latin:keyIconDisabled="!icon/shortcut_key_disabled"
         latin:keyActionFlags="noKeyPreview"
         latin:backgroundType="functional" />
     <key-style
         latin:styleName="languageSwitchKeyStyle"
-        latin:code="!code/key_language_switch"
-        latin:keyIcon="!icon/language_switch_key"
+        latin:keyLabel="!icon/language_switch_key|!code/key_language_switch"
         latin:keyActionFlags="noKeyPreview|altCodeWhileTyping|enableLongPress"
         latin:altCode="!code/key_space" />
     <key-style
         latin:styleName="emojiKeyStyle"
-        latin:code="!code/key_emoji"
-        latin:keyIcon="!icon/emoji_key"
+        latin:keyLabel="!icon/emoji_key|!code/key_emoji"
         latin:keyActionFlags="noKeyPreview"
         latin:backgroundType="functional" />
     <key-style
         latin:styleName="settingsKeyStyle"
-        latin:code="!code/key_settings"
-        latin:keyIcon="!icon/settings_key"
+        latin:keyLabel="!icon/settings_key|!code/key_settings"
         latin:keyActionFlags="noKeyPreview"
         latin:backgroundType="functional" />
     <switch>
@@ -132,8 +116,7 @@
         >
             <key-style
                 latin:styleName="tabKeyStyle"
-                latin:code="!code/key_action_previous"
-                latin:keyIcon="!icon/tab_key"
+                latin:keyLabel="!icon/tab_key|!code/key_action_previous"
                 latin:keyIconPreview="!icon/tab_key_preview"
                 latin:backgroundType="functional" />
         </case>
@@ -143,16 +126,14 @@
         >
             <key-style
                 latin:styleName="tabKeyStyle"
-                latin:code="!code/key_action_next"
-                latin:keyIcon="!icon/tab_key"
+                latin:keyLabel="!icon/tab_key|!code/key_action_next"
                 latin:keyIconPreview="!icon/tab_key_preview"
                 latin:backgroundType="functional" />
         </case>
         <default>
             <key-style
                 latin:styleName="tabKeyStyle"
-                latin:code="!code/key_tab"
-                latin:keyIcon="!icon/tab_key"
+                latin:keyLabel="!icon/tab_key|!code/key_tab"
                 latin:keyIconPreview="!icon/tab_key_preview"
                 latin:backgroundType="functional" />
         </default>
@@ -164,23 +145,19 @@
         latin:backgroundType="functional" />
     <key-style
         latin:styleName="toSymbolKeyStyle"
-        latin:code="!code/key_switch_alpha_symbol"
-        latin:keyLabel="!text/label_to_symbol_key"
+        latin:keyLabel="!text/label_to_symbol_key|!code/key_switch_alpha_symbol"
         latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
         latin:styleName="toAlphaKeyStyle"
-        latin:code="!code/key_switch_alpha_symbol"
-        latin:keyLabel="!text/label_to_alpha_key"
+        latin:keyLabel="!text/label_to_alpha_key|!code/key_switch_alpha_symbol"
         latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
         latin:styleName="toMoreSymbolKeyStyle"
-        latin:code="!code/key_shift"
-        latin:keyLabel="!text/label_to_more_symbol_for_tablet_key"
+        latin:keyLabel="!text/label_to_more_symbol_for_tablet_key|!code/key_shift"
         latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
         latin:styleName="backFromMoreSymbolKeyStyle"
-        latin:code="!code/key_shift"
-        latin:keyLabel="!text/label_to_symbol_key"
+        latin:keyLabel="!text/label_to_symbol_key|!code/key_shift"
         latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
         latin:styleName="comKeyStyle"
diff --git a/java/res/xml-sw600dp/key_styles_enter.xml b/java/res/xml-sw600dp/key_styles_enter.xml
index 1d8ccfae391b4e06adec48f6030a5193d935050f..39c5380b431e6cbc373804d2da428d3ab2a057b8 100644
--- a/java/res/xml-sw600dp/key_styles_enter.xml
+++ b/java/res/xml-sw600dp/key_styles_enter.xml
@@ -99,22 +99,11 @@
     <!-- Enter key style -->
     <key-style
         latin:styleName="defaultEnterKeyStyle"
-        latin:code="!code/key_enter"
-        latin:keyIcon="!icon/enter_key"
+        latin:keyLabel="!icon/enter_key|!code/key_enter"
         latin:keyLabelFlags="preserveCase|autoXScale|followKeyLabelRatio"
         latin:keyActionFlags="noKeyPreview"
         latin:backgroundType="functional"
         latin:parentStyle="navigateMoreKeysStyle" />
-    <key-style
-        latin:styleName="shiftEnterKeyStyle"
-        latin:code="!code/key_shift_enter"
-        latin:parentStyle="defaultEnterKeyStyle" />
-    <key-style
-        latin:styleName="defaultActionEnterKeyStyle"
-        latin:code="!code/key_enter"
-        latin:keyIcon="!icon/undefined"
-        latin:backgroundType="action"
-        latin:parentStyle="defaultEnterKeyStyle" />
     <switch>
         <!-- Shift + Enter in textMultiLine field. -->
         <case
@@ -123,63 +112,72 @@
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:parentStyle="shiftEnterKeyStyle" />
+                latin:keyLabel="!text/label_go_key|!code/key_shift_enter"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionGo"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:keyLabel="!text/label_go_key"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:keyLabel="!text/label_go_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionNext"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:keyLabel="!text/label_next_key"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:keyLabel="!text/label_next_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionPrevious"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:keyLabel="!text/label_previous_key"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:keyLabel="!text/label_previous_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionDone"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:keyLabel="!text/label_done_key"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:keyLabel="!text/label_done_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionSend"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:keyLabel="!text/label_send_key"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:keyLabel="!text/label_send_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionSearch"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:keyIcon="!icon/search_key"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:keyLabel="!icon/search_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionCustomLabel"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
+                latin:keyLabel="dummy_label|!code/key_enter"
                 latin:keyLabelFlags="fromCustomActionLabel"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <!-- imeAction is either actionNone or actionUnspecified. -->
         <default>
diff --git a/java/res/xml/key_devanagari_sign_anusvara.xml b/java/res/xml/key_devanagari_sign_anusvara.xml
index 0acd3bcd432600a45ca1a21dd49aee269a198dbc..ed9cfbba1202f2820db523b2c57377a6f4758aa0 100644
--- a/java/res/xml/key_devanagari_sign_anusvara.xml
+++ b/java/res/xml/key_devanagari_sign_anusvara.xml
@@ -28,7 +28,6 @@
     <!-- U+25CC: "◌" DOTTED CIRCLE
          U+0902: "ं" DEVANAGARI SIGN ANUSVARA -->
     <Key
-        latin:keyLabel="&#x25CC;&#x0902;"
-        latin:code="0x0902"
+        latin:keyLabel="&#x25CC;&#x0902;|&#x0902;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/key_devanagari_sign_candrabindu.xml b/java/res/xml/key_devanagari_sign_candrabindu.xml
index df0c4e0542980d9ed0bd9f213aef2f538fdb56be..225d2a6e6a073fe3cc7e07b0f8b1b9de82fc267d 100644
--- a/java/res/xml/key_devanagari_sign_candrabindu.xml
+++ b/java/res/xml/key_devanagari_sign_candrabindu.xml
@@ -44,7 +44,6 @@
          U+0901: "ँ" DEVANAGARI SIGN CANDRABINDU -->
     <Key
         latin:keyStyle="moreKeysDevanagariSignCandrabindu"
-        latin:keyLabel="&#x25CC;&#x0901;"
-        latin:code="0x0901"
+        latin:keyLabel="&#x25CC;&#x0901;|&#x0901;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/key_devanagari_sign_nukta.xml b/java/res/xml/key_devanagari_sign_nukta.xml
index f7a03ee9022298c3eb1097eb74cdd0bb749f9935..8f8da27092fd140fabfd27a2cd238ecf0fc13262 100644
--- a/java/res/xml/key_devanagari_sign_nukta.xml
+++ b/java/res/xml/key_devanagari_sign_nukta.xml
@@ -46,7 +46,6 @@
          U+093C: "़" DEVANAGARI SIGN NUKTA -->
     <Key
         latin:keyStyle="moreKeysDevanagariSignNukta"
-        latin:keyLabel="&#x25CC;&#x093C;"
-        latin:code="0x093C"
+        latin:keyLabel="&#x25CC;&#x093C;|&#x093C;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/key_devanagari_vowel_sign_candra_o.xml b/java/res/xml/key_devanagari_vowel_sign_candra_o.xml
index 370fc5405db0299fb0b1004c325e841fa26bf245..8d5368c46ab1279c176fdc2e63cb90e5c4881e20 100644
--- a/java/res/xml/key_devanagari_vowel_sign_candra_o.xml
+++ b/java/res/xml/key_devanagari_vowel_sign_candra_o.xml
@@ -28,7 +28,6 @@
     <!-- U+25CC: "◌" DOTTED CIRCLE
          U+0949: "ॉ" DEVANAGARI VOWEL SIGN CANDRA O -->
     <Key
-        latin:keyLabel="&#x25CC;&#x0949;"
-        latin:code="0x0949"
+        latin:keyLabel="&#x25CC;&#x0949;|&#x0949;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/key_devanagari_vowel_sign_vocalic_r.xml b/java/res/xml/key_devanagari_vowel_sign_vocalic_r.xml
index f150d7ed9fcfa31c77304b85cbd5f887830b49f7..fb912253d069696abc3eac026b0430fdf32aff4d 100644
--- a/java/res/xml/key_devanagari_vowel_sign_vocalic_r.xml
+++ b/java/res/xml/key_devanagari_vowel_sign_vocalic_r.xml
@@ -52,7 +52,6 @@
          U+0943: "ृ" DEVANAGARI VOWEL SIGN VOCALIC R -->
     <Key
         latin:keyStyle="moreKeysDevanagariVowelSignVocalicR"
-        latin:keyLabel="&#x25CC;&#x0943;"
-        latin:code="0x0943"
+        latin:keyLabel="&#x25CC;&#x0943;|&#x0943;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/key_styles_common.xml b/java/res/xml/key_styles_common.xml
index 9c40d627af72ca7fc3f41c8990c09aa613e16d00..2e59cedbd69ccf97ce037935159f634a621ce112 100644
--- a/java/res/xml/key_styles_common.xml
+++ b/java/res/xml/key_styles_common.xml
@@ -42,7 +42,6 @@
     <!-- Base style for shift key. A single space is used for dummy label in moreKeys. -->
     <key-style
         latin:styleName="baseForShiftKeyStyle"
-        latin:code="!code/key_shift"
         latin:keyActionFlags="noKeyPreview"
         latin:keyLabelFlags="preserveCase"
         latin:moreKeys="!noPanelAutoMoreKey!, |!code/key_capslock" />
@@ -52,7 +51,7 @@
         >
             <key-style
                 latin:styleName="shiftKeyStyle"
-                latin:keyIcon="!icon/shift_key_shifted"
+                latin:keyLabel="!icon/shift_key_shifted|!code/key_shift"
                 latin:backgroundType="stickyOff"
                 latin:parentStyle="baseForShiftKeyStyle" />
         </case>
@@ -61,127 +60,92 @@
         >
             <key-style
                 latin:styleName="shiftKeyStyle"
-                latin:keyIcon="!icon/shift_key_shifted"
+                latin:keyLabel="!icon/shift_key_shifted|!code/key_shift"
                 latin:backgroundType="stickyOn"
                 latin:parentStyle="baseForShiftKeyStyle" />
         </case>
         <default>
             <key-style
                 latin:styleName="shiftKeyStyle"
-                latin:keyIcon="!icon/shift_key"
+                latin:keyLabel="!icon/shift_key|!code/key_shift"
                 latin:backgroundType="stickyOff"
                 latin:parentStyle="baseForShiftKeyStyle" />
         </default>
     </switch>
     <key-style
         latin:styleName="deleteKeyStyle"
-        latin:code="!code/key_delete"
-        latin:keyIcon="!icon/delete_key"
+        latin:keyLabel="!icon/delete_key|!code/key_delete"
         latin:keyActionFlags="isRepeatable|noKeyPreview"
         latin:backgroundType="functional" />
     <include
         latin:keyboardLayout="@xml/key_styles_enter" />
     <key-style
         latin:styleName="spaceKeyStyle"
-        latin:code="!code/key_space"
+        latin:keyLabel=" |!code/key_space"
         latin:keyActionFlags="noKeyPreview|enableLongPress" />
     <!-- U+200C: ZERO WIDTH NON-JOINER
          U+200D: ZERO WIDTH JOINER -->
     <key-style
         latin:styleName="zwnjKeyStyle"
-        latin:code="0x200C"
-        latin:keyIcon="!icon/zwnj_key"
+        latin:keyLabel="!icon/zwnj_key|&#x200C;"
         latin:moreKeys="!icon/zwj_key|&#x200D;"
         latin:keyLabelFlags="hasPopupHint"
         latin:keyActionFlags="noKeyPreview" />
     <key-style
         latin:styleName="shortcutKeyStyle"
-        latin:code="!code/key_shortcut"
-        latin:keyIcon="!icon/shortcut_key"
+        latin:keyLabel="!icon/shortcut_key|!code/key_shortcut"
         latin:keyIconDisabled="!icon/shortcut_key_disabled"
         latin:keyActionFlags="noKeyPreview|altCodeWhileTyping"
         latin:altCode="!code/key_space"
         latin:parentStyle="f1MoreKeysStyle" />
     <key-style
         latin:styleName="settingsKeyStyle"
-        latin:code="!code/key_settings"
-        latin:keyIcon="!icon/settings_key"
+        latin:keyLabel="!icon/settings_key|!code/key_settings"
         latin:keyActionFlags="noKeyPreview|altCodeWhileTyping"
         latin:altCode="!code/key_space"
         latin:backgroundType="functional" />
     <key-style
         latin:styleName="languageSwitchKeyStyle"
-        latin:code="!code/key_language_switch"
-        latin:keyIcon="!icon/language_switch_key"
+        latin:keyLabel="!icon/language_switch_key|!code/key_language_switch"
         latin:keyActionFlags="noKeyPreview|altCodeWhileTyping|enableLongPress"
         latin:altCode="!code/key_space" />
     <key-style
         latin:styleName="emojiKeyStyle"
-        latin:code="!code/key_emoji"
-        latin:keyIcon="!icon/emoji_key"
+        latin:keyLabel="!icon/emoji_key|!code/key_emoji"
         latin:keyActionFlags="noKeyPreview"
         latin:backgroundType="functional" />
-    <!-- Overriding EnterKeyStyle here -->
-    <switch>
-        <!-- Shift + Enter in textMultiLine field. -->
-        <case
-            latin:isMultiLine="true"
-            latin:keyboardLayoutSetElement="alphabetManualShifted|alphabetShiftLockShifted"
-        >
-            <key-style
-                latin:styleName="enterKeyStyle"
-                latin:parentStyle="shiftEnterKeyStyle" />
-        </case>
-        <!-- Smiley in textShortMessage field.
-             Overrides common enter key style. -->
-        <case
-            latin:mode="im"
-        >
-            <key-style
-                latin:styleName="enterKeyStyle"
-                latin:parentStyle="emojiKeyStyle" />
-        </case>
-    </switch>
     <key-style
         latin:styleName="tabKeyStyle"
-        latin:code="!code/key_tab"
-        latin:keyIcon="!icon/tab_key"
+        latin:keyLabel="!icon/tab_key|!code/key_tab"
         latin:keyIconPreview="!icon/tab_key_preview"
         latin:backgroundType="functional" />
     <!-- Note: This key style is not for functional tab key. This is used for the tab key which is
          laid out as normal letter key. -->
     <key-style
         latin:styleName="nonSpecialBackgroundTabKeyStyle"
-        latin:code="!code/key_tab"
-        latin:keyIcon="!icon/tab_key"
+        latin:keyLabel="!icon/tab_key|!code/key_tab"
         latin:keyIconPreview="!icon/tab_key_preview" />
     <key-style
         latin:styleName="baseForLayoutSwitchKeyStyle"
         latin:keyLabelFlags="preserveCase"
         latin:keyActionFlags="noKeyPreview"
         latin:backgroundType="functional" />
-    <key-style
-        latin:styleName="baseForToSymbolKeyStyle"
-        latin:keyLabel="!text/label_to_symbol_key"
-        latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
         latin:styleName="toSymbolKeyStyle"
-        latin:code="!code/key_switch_alpha_symbol"
-        latin:parentStyle="baseForToSymbolKeyStyle" />
+        latin:keyLabel="!text/label_to_symbol_key|!code/key_switch_alpha_symbol"
+        latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
         latin:styleName="toAlphaKeyStyle"
-        latin:code="!code/key_switch_alpha_symbol"
-        latin:keyLabel="!text/label_to_alpha_key"
+        latin:keyLabel="!text/label_to_alpha_key|!code/key_switch_alpha_symbol"
         latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
         latin:styleName="toMoreSymbolKeyStyle"
-        latin:code="!code/key_shift"
-        latin:keyLabel="!text/label_to_more_symbol_key"
+        latin:keyLabel="!text/label_to_more_symbol_key|!code/key_shift"
         latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
         latin:styleName="backFromMoreSymbolKeyStyle"
-        latin:code="!code/key_shift"
-        latin:parentStyle="baseForToSymbolKeyStyle" />
+        latin:keyLabel="!text/label_to_symbol_key|!code/key_shift"
+        latin:parentStyle="baseForLayoutSwitchKeyStyle" />
     <key-style
         latin:styleName="comKeyStyle"
         latin:keyLabel="!text/keylabel_for_popular_domain|!text/keylabel_for_popular_domain"
diff --git a/java/res/xml/key_styles_enter.xml b/java/res/xml/key_styles_enter.xml
index 083e6a67d63056c7f1c7fba2d2598f181e50dc68..b3def1fb4bf0998fa866c51c164b2f94be3662f0 100644
--- a/java/res/xml/key_styles_enter.xml
+++ b/java/res/xml/key_styles_enter.xml
@@ -255,21 +255,13 @@
     <!-- Enter key style -->
     <key-style
         latin:styleName="defaultEnterKeyStyle"
-        latin:code="!code/key_enter"
-        latin:keyIcon="!icon/enter_key"
         latin:keyLabelFlags="preserveCase|autoXScale|followKeyLabelRatio"
         latin:keyActionFlags="noKeyPreview"
         latin:backgroundType="functional"
         latin:parentStyle="navigateMoreKeysStyle" />
     <key-style
         latin:styleName="shiftEnterKeyStyle"
-        latin:code="!code/key_shift_enter"
-        latin:parentStyle="defaultEnterKeyStyle" />
-    <key-style
-        latin:styleName="defaultActionEnterKeyStyle"
-        latin:code="!code/key_enter"
-        latin:keyIcon="!icon/undefined"
-        latin:backgroundType="action"
+        latin:keyLabel="!icon/enter_key|!code/key_shift_enter"
         latin:parentStyle="defaultEnterKeyStyle" />
     <switch>
         <!-- Shift + Enter in textMultiLine field. -->
@@ -281,66 +273,84 @@
                 latin:styleName="enterKeyStyle"
                 latin:parentStyle="shiftEnterKeyStyle" />
         </case>
+        <!-- Smiley in textShortMessage field.
+             This <case> should be after Shift + Enter <case> and before any of action <case>. -->
+        <case
+            latin:mode="im"
+        >
+            <key-style
+                latin:styleName="enterKeyStyle"
+                latin:parentStyle="emojiKeyStyle" />
+        </case>
         <case
             latin:imeAction="actionGo"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:keyLabel="!text/label_go_key"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:keyLabel="!text/label_go_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionNext"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:keyLabel="!text/label_next_key"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:keyLabel="!text/label_next_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionPrevious"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:keyLabel="!text/label_previous_key"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:keyLabel="!text/label_previous_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionDone"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:keyLabel="!text/label_done_key"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:keyLabel="!text/label_done_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionSend"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:keyLabel="!text/label_send_key"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:keyLabel="!text/label_send_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionSearch"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
-                latin:keyIcon="!icon/search_key"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:keyLabel="!icon/search_key|!code/key_enter"
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <case
             latin:imeAction="actionCustomLabel"
         >
             <key-style
                 latin:styleName="enterKeyStyle"
+                latin:keyLabel="dummy_label|!code/key_enter"
                 latin:keyLabelFlags="fromCustomActionLabel"
-                latin:parentStyle="defaultActionEnterKeyStyle" />
+                latin:backgroundType="action"
+                latin:parentStyle="defaultEnterKeyStyle" />
         </case>
         <!-- imeAction is either actionNone or actionUnspecified. -->
         <default>
             <key-style
                 latin:styleName="enterKeyStyle"
+                latin:keyLabel="!icon/enter_key|!code/key_enter"
                 latin:parentStyle="defaultEnterKeyStyle" />
         </default>
     </switch>
diff --git a/java/res/xml/key_styles_number.xml b/java/res/xml/key_styles_number.xml
index 2e5a601b048c78c006a3fd3667cf953853783aef..3c0cf720ee5bc0fe075111e8fcf81db2a10456c2 100644
--- a/java/res/xml/key_styles_number.xml
+++ b/java/res/xml/key_styles_number.xml
@@ -89,36 +89,28 @@
         latin:keyLabel="9"
         latin:keyHintLabel="WXYZ"
         latin:parentStyle="numberKeyStyle" />
-    <!-- U+002A: "*" ASTERISK
-         U+FF0A: "*" FULLWIDTH ASTERISK -->
+    <!-- U+FF0A: "*" FULLWIDTH ASTERISK -->
     <key-style
         latin:styleName="numStarKeyStyle"
-        latin:code="0x002A"
-        latin:keyLabel="&#xFF0A;"
+        latin:keyLabel="&#xFF0A;|*"
         latin:parentStyle="numKeyStyle" />
     <!-- Only for non-tablet device -->
     <key-style
         latin:styleName="numPhoneToSymbolKeyStyle"
-        latin:code="!code/key_switch_alpha_symbol"
-        latin:keyLabel="!text/label_to_phone_symbols_key"
+        latin:keyLabel="!text/label_to_phone_symbols_key|!code/key_switch_alpha_symbol"
         latin:parentStyle="numModeKeyStyle" />
     <key-style
         latin:styleName="numPhoneToNumericKeyStyle"
-        latin:code="!code/key_switch_alpha_symbol"
-        latin:keyLabel="!text/label_to_phone_numeric_key"
+        latin:keyLabel="!text/label_to_phone_numeric_key|!code/key_switch_alpha_symbol"
         latin:parentStyle="numModeKeyStyle" />
-    <!-- U+002C: "," COMMA -->
     <key-style
         latin:styleName="numPauseKeyStyle"
-        latin:code="0x002C"
-        latin:keyLabel="!text/label_pause_key"
+        latin:keyLabel="!text/label_pause_key|,"
         latin:keyLabelFlags="followKeyHintLabelRatio|autoXScale"
         latin:parentStyle="numKeyBaseStyle" />
-    <!-- U+003B: ";" SEMICOLON -->
     <key-style
         latin:styleName="numWaitKeyStyle"
-        latin:code="0x003B"
-        latin:keyLabel="!text/label_wait_key"
+        latin:keyLabel="!text/label_wait_key|;"
         latin:keyLabelFlags="followKeyHintLabelRatio|autoXScale"
         latin:parentStyle="numKeyBaseStyle" />
     <key-style
@@ -127,15 +119,13 @@
         latin:parentStyle="tabKeyStyle" />
     <key-style
         latin:styleName="numSpaceKeyStyle"
-        latin:code="!code/key_space"
-        latin:keyIcon="!icon/space_key_for_number_layout"
+        latin:keyLabel="!icon/space_key_for_number_layout|!code/key_space"
         latin:keyActionFlags="enableLongPress"
         latin:parentStyle="numKeyBaseStyle" />
     <!-- Override defaultEnterKeyStyle in key_styles_enter.xml -->
     <key-style
         latin:styleName="defaultEnterKeyStyle"
-        latin:code="!code/key_enter"
-        latin:keyIcon="!icon/enter_key"
+        latin:keyLabel="!icon/enter_key|!code/key_enter"
         latin:keyLabelFlags="preserveCase|autoXScale|followKeyLargeLabelRatio"
         latin:keyActionFlags="noKeyPreview"
         latin:backgroundType="functional"
diff --git a/java/res/xml/keys_curly_brackets.xml b/java/res/xml/keys_curly_brackets.xml
index 6a4b1a945505752349dfe885fbb7b0fca6d6f00a..fd736c07dc1b3932e7d0d2a6194f870304a65836 100644
--- a/java/res/xml/keys_curly_brackets.xml
+++ b/java/res/xml/keys_curly_brackets.xml
@@ -22,9 +22,7 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="{"
-        latin:code="!code/key_left_curly_bracket" />
+        latin:keyLabel="{|!code/key_left_curly_bracket" />
     <Key
-        latin:keyLabel="}"
-        latin:code="!code/key_right_curly_bracket" />
+        latin:keyLabel="}|!code/key_right_curly_bracket" />
 </merge>
diff --git a/java/res/xml/keys_less_greater.xml b/java/res/xml/keys_less_greater.xml
index 56d0727ddd6c9246c9e72502283727b6be3ccc5b..98dcef6b5f7fd3b86f529359e17cecc424cf2952 100644
--- a/java/res/xml/keys_less_greater.xml
+++ b/java/res/xml/keys_less_greater.xml
@@ -25,28 +25,25 @@
         <case
             latin:languageCode="fa"
         >
+            <!-- TODO: Introduce !code/key_{left,right}_angle_quotation. -->
             <!-- U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
                  U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -->
             <Key
-                latin:keyLabel="&#x00AB;"
-                latin:code="0x00BB"
+                latin:keyLabel="&#x00AB;|&#x00BB;"
                 latin:backgroundType="functional"
                 latin:moreKeys="!text/more_keys_for_less_than" />
             <Key
-                latin:keyLabel="&#x00BB;"
-                latin:code="0x00AB"
+                latin:keyLabel="&#x00BB;|&#x00AB;"
                 latin:backgroundType="functional"
                 latin:moreKeys="!text/more_keys_for_greater_than" />
         </case>
         <default>
             <Key
-                latin:keyLabel="&lt;"
-                latin:code="!code/key_less_than"
+                latin:keyLabel="&lt;|!code/key_less_than"
                 latin:backgroundType="functional"
                 latin:moreKeys="!text/more_keys_for_less_than" />
             <Key
-                latin:keyLabel="&gt;"
-                latin:code="!code/key_greater_than"
+                latin:keyLabel="&gt;|!code/key_greater_than"
                 latin:backgroundType="functional"
                 latin:moreKeys="!text/more_keys_for_greater_than" />
         </default>
diff --git a/java/res/xml/keys_parentheses.xml b/java/res/xml/keys_parentheses.xml
index 25e89c930732901c7c6c917f090873ec4be5d5d7..fe4e5de8487efc247c620f51cdf444bda52ed06c 100644
--- a/java/res/xml/keys_parentheses.xml
+++ b/java/res/xml/keys_parentheses.xml
@@ -22,11 +22,9 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="("
-        latin:code="!code/key_left_parenthesis"
+        latin:keyLabel="(|!code/key_left_parenthesis"
         latin:moreKeys="!text/more_keys_for_left_parenthesis" />
     <Key
-        latin:keyLabel=")"
-        latin:code="!code/key_right_parenthesis"
+        latin:keyLabel=")|!code/key_right_parenthesis"
         latin:moreKeys="!text/more_keys_for_right_parenthesis" />
 </merge>
diff --git a/java/res/xml/keys_square_brackets.xml b/java/res/xml/keys_square_brackets.xml
index 5c128fd0c27c0bcd11b8cf0f00ed8c8a8e185859..a9cf6a6db367193a295631813edf2028ae99d4b4 100644
--- a/java/res/xml/keys_square_brackets.xml
+++ b/java/res/xml/keys_square_brackets.xml
@@ -22,9 +22,7 @@
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
 >
     <Key
-        latin:keyLabel="["
-        latin:code="!code/key_left_square_bracket" />
+        latin:keyLabel="[|!code/key_left_square_bracket" />
     <Key
-        latin:keyLabel="]"
-        latin:code="!code/key_right_square_bracket" />
+        latin:keyLabel="]|!code/key_right_square_bracket" />
 </merge>
diff --git a/java/res/xml/keystyle_devanagari_sign_virama.xml b/java/res/xml/keystyle_devanagari_sign_virama.xml
index b22fbe842f4b01bd47372281dd4ac5124afa578f..9d007919d331b953f97e8bc51c054d0301dfaa0b 100644
--- a/java/res/xml/keystyle_devanagari_sign_virama.xml
+++ b/java/res/xml/keystyle_devanagari_sign_virama.xml
@@ -29,7 +29,6 @@
          U+094D: "्" DEVANAGARI SIGN VIRAMA -->
     <key-style
         latin:styleName="baseKeyDevanagariSignVirama"
-        latin:keyLabel="&#x25CC;&#x094D;"
-        latin:code="0x094D"
+        latin:keyLabel="&#x25CC;&#x094D;|&#x094D;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
  </merge>
diff --git a/java/res/xml/keystyle_devanagari_sign_visarga.xml b/java/res/xml/keystyle_devanagari_sign_visarga.xml
index cb294951f97bde1857b50ad938724730cf2df11c..42facd7faee52e5dd2c3151107732241bd543dba 100644
--- a/java/res/xml/keystyle_devanagari_sign_visarga.xml
+++ b/java/res/xml/keystyle_devanagari_sign_visarga.xml
@@ -29,7 +29,6 @@
          U+0903: "ः" DEVANAGARI SIGN VISARGA -->
     <key-style
         latin:styleName="baseKeyDevanagariSignVisarga"
-        latin:keyLabel="&#x25CC;&#x0903;"
-        latin:code="0x0903"
+        latin:keyLabel="&#x25CC;&#x0903;|&#x0903;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_aa.xml b/java/res/xml/keystyle_devanagari_vowel_sign_aa.xml
index 2e78c53ec76e78197265ca8c96fc7136564a4920..8013b0d7283c1ba2674d93c2dfd93f960d332036 100644
--- a/java/res/xml/keystyle_devanagari_vowel_sign_aa.xml
+++ b/java/res/xml/keystyle_devanagari_vowel_sign_aa.xml
@@ -46,7 +46,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignAa"
         latin:parentStyle="moreKeysDevanagariVowelSignAa"
-        latin:keyLabel="&#x25CC;&#x093E;"
-        latin:code="0x093E"
+        latin:keyLabel="&#x25CC;&#x093E;|&#x093E;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_ai.xml b/java/res/xml/keystyle_devanagari_vowel_sign_ai.xml
index 0554c0e15feba985ba1bd61b00b4851f57787f20..fd74ab52b9a6490d36fa605c2318051fd95472f8 100644
--- a/java/res/xml/keystyle_devanagari_vowel_sign_ai.xml
+++ b/java/res/xml/keystyle_devanagari_vowel_sign_ai.xml
@@ -53,7 +53,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignAi"
         latin:parentStyle="moreKeysDevanagariVowelSignAi"
-        latin:keyLabel="&#x25CC;&#x0948;"
-        latin:code="0x0948"
+        latin:keyLabel="&#x25CC;&#x0948;|&#x0948;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_au.xml b/java/res/xml/keystyle_devanagari_vowel_sign_au.xml
index 29a11a82e0b42ddaace2d82ffefe72a1da69c7d1..15d4f901bc4dfaaaea4cc5f2a6dfbcffeb504406 100644
--- a/java/res/xml/keystyle_devanagari_vowel_sign_au.xml
+++ b/java/res/xml/keystyle_devanagari_vowel_sign_au.xml
@@ -44,7 +44,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignAu"
         latin:parentStyle="moreKeysDevanagariVowelSignAu"
-        latin:keyLabel="&#x25CC;&#x094C;"
-        latin:code="0x094C"
+        latin:keyLabel="&#x25CC;&#x094C;|&#x094C;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_e.xml b/java/res/xml/keystyle_devanagari_vowel_sign_e.xml
index edd29c79131e4d83fa5d6bf8997a5ab65d38e155..89d8fc7c85f4b8f494f30c9eff418ee560c010b6 100644
--- a/java/res/xml/keystyle_devanagari_vowel_sign_e.xml
+++ b/java/res/xml/keystyle_devanagari_vowel_sign_e.xml
@@ -53,7 +53,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignE"
         latin:parentStyle="moreKeysDevanagariVowelSignE"
-        latin:keyLabel="&#x25CC;&#x0947;"
-        latin:code="0x0947"
+        latin:keyLabel="&#x25CC;&#x0947;|&#x0947;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_i.xml b/java/res/xml/keystyle_devanagari_vowel_sign_i.xml
index 200fed29fa43743bc2cbf37b020333308c2028e6..9e3c6ed768fd004bf5a03238a786d294783225a3 100644
--- a/java/res/xml/keystyle_devanagari_vowel_sign_i.xml
+++ b/java/res/xml/keystyle_devanagari_vowel_sign_i.xml
@@ -45,7 +45,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignI"
         latin:parentStyle="moreKeysDevanagariVowelSignI"
-        latin:keyLabel="&#x25CC;&#x093F;"
-        latin:code="0x093F"
+        latin:keyLabel="&#x25CC;&#x093F;|&#x093F;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_ii.xml b/java/res/xml/keystyle_devanagari_vowel_sign_ii.xml
index 6dc9951df1a0e98935aa6b0f42ba979edf4d303d..3d064b5954ac29094b4ebadc06e765c76229d0e0 100644
--- a/java/res/xml/keystyle_devanagari_vowel_sign_ii.xml
+++ b/java/res/xml/keystyle_devanagari_vowel_sign_ii.xml
@@ -45,7 +45,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignIi"
         latin:parentStyle="moreKeysDevanagariVowelSignIi"
-        latin:keyLabel="&#x25CC;&#x0940;"
-        latin:code="0x0940"
+        latin:keyLabel="&#x25CC;&#x0940;|&#x0940;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_o.xml b/java/res/xml/keystyle_devanagari_vowel_sign_o.xml
index 233ac8609e6d1bd1d05d6316d52f78532b790d2d..3eddbe5e05cc5c92683b7e98593735fc35ded73d 100644
--- a/java/res/xml/keystyle_devanagari_vowel_sign_o.xml
+++ b/java/res/xml/keystyle_devanagari_vowel_sign_o.xml
@@ -47,7 +47,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignO"
         latin:parentStyle="moreKeysDevanagariVowelSignO"
-        latin:keyLabel="&#x25CC;&#x094B;"
-        latin:code="0x094B"
+        latin:keyLabel="&#x25CC;&#x094B;|&#x094B;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_u.xml b/java/res/xml/keystyle_devanagari_vowel_sign_u.xml
index 7291b7099aaa1eec089f2d4e77c9f26fa4d65eb7..9a00adebc44e7c59d0bb3f8d056a3fc75adb188c 100644
--- a/java/res/xml/keystyle_devanagari_vowel_sign_u.xml
+++ b/java/res/xml/keystyle_devanagari_vowel_sign_u.xml
@@ -46,7 +46,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignU"
         latin:parentStyle="moreKeysDevanagariVowelSignU"
-        latin:keyLabel="&#x25CC;&#x0941;"
-        latin:code="0x0941"
+        latin:keyLabel="&#x25CC;&#x0941;|&#x0941;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/keystyle_devanagari_vowel_sign_uu.xml b/java/res/xml/keystyle_devanagari_vowel_sign_uu.xml
index a95ab822dc9e42e1cf28f4c1e441955b4d9ff5ca..06b51eb72854d4b993108dff00dfdc6568661cee 100644
--- a/java/res/xml/keystyle_devanagari_vowel_sign_uu.xml
+++ b/java/res/xml/keystyle_devanagari_vowel_sign_uu.xml
@@ -46,7 +46,6 @@
     <key-style
         latin:styleName="baseKeyDevanagariVowelSignUu"
         latin:parentStyle="moreKeysDevanagariVowelSignUu"
-        latin:keyLabel="&#x25CC;&#x0942;"
-        latin:code="0x0942"
+        latin:keyLabel="&#x25CC;&#x0942;|&#x0942;"
         latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
 </merge>
diff --git a/java/res/xml/rowkeys_symbols3.xml b/java/res/xml/rowkeys_symbols3.xml
index e525dc4808951cec11fc1e3c44da624183b8bdca..43fe1082c040c6eb2d1f4a897eb637d8a604e796 100644
--- a/java/res/xml/rowkeys_symbols3.xml
+++ b/java/res/xml/rowkeys_symbols3.xml
@@ -28,15 +28,14 @@
         <case
             latin:languageCode="fa"
         >
+            <!-- TODO: Introduce !code/key_{left,right}_angle_quotation. -->
             <!-- U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
                  U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -->
             <Key
-                latin:keyLabel="&#x00AB;"
-                latin:code="0x00BB"
+                latin:keyLabel="&#x00AB;|&#x00BB;"
                 latin:moreKeys="!text/more_keys_for_double_quote" />
             <Key
-                latin:keyLabel="&#x00BB;"
-                latin:code="0x00AB"
+                latin:keyLabel="&#x00BB;|&#x00AB;"
                 latin:moreKeys="!text/more_keys_for_single_quote" />
         </case>
         <default>
diff --git a/java/res/xml/rowkeys_thai1.xml b/java/res/xml/rowkeys_thai1.xml
index cd536656f791fcf7fda909290cd624bf615e9574..805822f06ab12fa081e92a9e3e415530e075ca4f 100644
--- a/java/res/xml/rowkeys_thai1.xml
+++ b/java/res/xml/rowkeys_thai1.xml
@@ -48,8 +48,7 @@
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E39;"
-                latin:code="0x0E39"
+                latin:keyLabel="&#x20;&#x0E39;|&#x0E39;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0E3F: "฿" THAI CURRENCY SYMBOL BAHT -->
             <Key
@@ -114,16 +113,14 @@
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E38;"
-                latin:code="0x0E38"
+                latin:keyLabel="&#x20;&#x0E38;|&#x0E38;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0020: " " SPACE
                  U+0E36: " ึ" THAI CHARACTER SARA UE -->
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E36;"
-                latin:code="0x0E36"
+                latin:keyLabel="&#x20;&#x0E36;|&#x0E36;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0E04: "ค" THAI CHARACTER KHO KHWAI
                  U+0E55: "๕" THAI DIGIT FIVE -->
diff --git a/java/res/xml/rowkeys_thai2.xml b/java/res/xml/rowkeys_thai2.xml
index 4bcbbbf8d13b9ce0fc4623cac8feb9d776721533..bc9d70c9ea5d7f6fed7a53a91c6f82b30b6540f3 100644
--- a/java/res/xml/rowkeys_thai2.xml
+++ b/java/res/xml/rowkeys_thai2.xml
@@ -48,16 +48,14 @@
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E4D;"
-                latin:code="0x0E4D"
+                latin:keyLabel="&#x20;&#x0E4D;|&#x0E4D;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0020: " " SPACE
                  U+0E4A: " ๊" THAI CHARACTER MAI TRI -->
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E4A;"
-                latin:code="0x0E4A"
+                latin:keyLabel="&#x20;&#x0E4A;|&#x0E4A;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0E13: "ณ" THAI CHARACTER NO NEN -->
             <Key
@@ -108,16 +106,14 @@
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E31;"
-                latin:code="0x0E31"
+                latin:keyLabel="&#x20;&#x0E31;|&#x0E31;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0020: " " SPACE
                  U+0E35: " ี" HAI CHARACTER SARA II -->
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E35;"
-                latin:code="0x0E35"
+                latin:keyLabel="&#x20;&#x0E35;|&#x0E35;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0E23: "ร" THAI CHARACTER RO RUA -->
             <Key
diff --git a/java/res/xml/rowkeys_thai3.xml b/java/res/xml/rowkeys_thai3.xml
index 7b6e6372eccf7f79f45bca977c171bdd1ea95c5c..e326f9f574223fca3351b817a0b89231d5d7612e 100644
--- a/java/res/xml/rowkeys_thai3.xml
+++ b/java/res/xml/rowkeys_thai3.xml
@@ -50,16 +50,14 @@
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E47;"
-                latin:code="0x0E47"
+                latin:keyLabel="&#x20;&#x0E47;|&#x0E47;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0020: " " SPACE
                  U+0E4B: " ๋" THAI CHARACTER MAI CHATTAWA -->
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E4B;"
-                latin:code="0x0E4B"
+                latin:keyLabel="&#x20;&#x0E4B;|&#x0E4B;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0E29: "ษ" THAI CHARACTER SO RUSI -->
             <Key
@@ -102,16 +100,14 @@
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E49;"
-                latin:code="0x0E49"
+                latin:keyLabel="&#x20;&#x0E49;|&#x0E49;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0020: " " SPACE
                  U+0E48: " ่" THAI CHARACTER MAI EK -->
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E48;"
-                latin:code="0x0E48"
+                latin:keyLabel="&#x20;&#x0E48;|&#x0E48;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0E32: "า" THAI CHARACTER SARA AA -->
             <Key
diff --git a/java/res/xml/rowkeys_thai4.xml b/java/res/xml/rowkeys_thai4.xml
index 8a784242c58f063eb9db564fe2797ea508bf722a..1564d9753c58e357f3dd3a52148d5b5b87c9aa18 100644
--- a/java/res/xml/rowkeys_thai4.xml
+++ b/java/res/xml/rowkeys_thai4.xml
@@ -42,16 +42,14 @@
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E3A;"
-                latin:code="0x0E3A"
+                latin:keyLabel="&#x20;&#x0E3A;|&#x0E3A;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0020: " " SPACE
                  U+0E4C: " ์" THAI CHARACTER THANTHAKHAT -->
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E4C;"
-                latin:code="0x0E4C"
+                latin:keyLabel="&#x20;&#x0E4C;|&#x0E4C;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <Key
                 latin:keyLabel="\?" />
@@ -90,16 +88,14 @@
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E34;"
-                latin:code="0x0E34"
+                latin:keyLabel="&#x20;&#x0E34;|&#x0E34;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0020: " " SPACE
                  U+0E37: " ื" THAI CHARACTER SARA UEE -->
             <!-- Note: The space character is needed as a preceding letter to draw some Thai
                  composing characters correctly. -->
             <Key
-                latin:keyLabel="&#x20;&#x0E37;"
-                latin:code="0x0E37"
+                latin:keyLabel="&#x20;&#x0E37;|&#x0E37;"
                 latin:keyLabelFlags="fontNormal|followKeyLetterRatio" />
             <!-- U+0E17: "ท" THAI CHARACTER THO THAHAN -->
             <Key
diff --git a/java/res/xml/rows_number_normal.xml b/java/res/xml/rows_number_normal.xml
index 291018a14542ffcb7e8e951401710d2f538da774..c461eb009f542d4ad9847965771f27728550038a 100644
--- a/java/res/xml/rows_number_normal.xml
+++ b/java/res/xml/rows_number_normal.xml
@@ -113,10 +113,8 @@
             <case
                 latin:mode="datetime"
             >
-                <!-- U+002F: "/" SOLIDUS -->
                 <Key
-                    latin:code="0x002F"
-                    latin:keyLabel="/ :"
+                    latin:keyLabel="/ :|/"
                     latin:moreKeys="!noPanelAutoMoreKey!,:"
                     latin:keyStyle="numKeyStyle" />
             </case>
diff --git a/java/res/xml/rows_phone.xml b/java/res/xml/rows_phone.xml
index d8dcfbd62e9db3dcd153c93fa72fb690ae68cf31..6f05e51beb253fdeeaa908258438c3c614180761 100644
--- a/java/res/xml/rows_phone.xml
+++ b/java/res/xml/rows_phone.xml
@@ -68,8 +68,7 @@
         <!-- U+0030: "0" DIGIT ZERO -->
         <Key
             latin:keyStyle="num0KeyStyle"
-            latin:code="0x0030"
-            latin:keyLabel="0 +"
+            latin:keyLabel="0 +|0"
             latin:moreKeys="!noPanelAutoMoreKey!,+" />
         <Key
             latin:keyStyle="numSpaceKeyStyle" />
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
index 1b9007da2745cc69126e94260b101e2d3e122948..ed691f8747b4cd45fb9eb065868d9de837559ec3 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -316,20 +316,17 @@ public class Key implements Comparable<Key> {
         mActionFlags = actionFlags;
 
         final String keySpec = style.getString(keyAttr, R.styleable.Keyboard_Key_keyLabel);
+        if (TextUtils.isEmpty(keySpec)) {
+            throw new RuntimeException("Empty keySpec");
+        }
 
-        final int iconIdInAttr = KeySpecParser.getIconId(style.getString(keyAttr,
-                R.styleable.Keyboard_Key_keyIcon));
-        mIconId = (iconIdInAttr != ICON_UNDEFINED) ? iconIdInAttr
-                : KeySpecParser.getIconId(keySpec);
+        mIconId = KeySpecParser.getIconId(keySpec);
         final int disabledIconId = KeySpecParser.getIconId(style.getString(keyAttr,
                 R.styleable.Keyboard_Key_keyIconDisabled));
         final int previewIconId = KeySpecParser.getIconId(style.getString(keyAttr,
                 R.styleable.Keyboard_Key_keyIconPreview));
 
-        final int codeInAttr = KeySpecParser.parseCode(style.getString(keyAttr,
-                R.styleable.Keyboard_Key_code), params.mCodesSet, CODE_UNSPECIFIED);
-        final int code = (codeInAttr != CODE_UNSPECIFIED) ? codeInAttr
-                : KeySpecParser.getCode(keySpec, params.mCodesSet);
+        final int code = KeySpecParser.getCode(keySpec, params.mCodesSet);
         if ((mLabelFlags & LABEL_FLAGS_FROM_CUSTOM_ACTION_LABEL) != 0) {
             mLabel = params.mId.mCustomActionLabel;
         } else if (code >= Character.MIN_SUPPLEMENTARY_CODE_POINT) {
@@ -376,10 +373,10 @@ public class Key implements Comparable<Key> {
         } else {
             mCode = StringUtils.toUpperCaseOfCodeForLocale(code, needsToUpperCase, locale);
         }
+        final int altCodeInAttr = KeySpecParser.parseCode(style.getString(keyAttr,
+                R.styleable.Keyboard_Key_altCode), params.mCodesSet, CODE_UNSPECIFIED);
         final int altCode = StringUtils.toUpperCaseOfCodeForLocale(
-                KeySpecParser.parseCode(style.getString(keyAttr,
-                R.styleable.Keyboard_Key_altCode), params.mCodesSet, CODE_UNSPECIFIED),
-                needsToUpperCase, locale);
+                altCodeInAttr, needsToUpperCase, locale);
         mOptionalAttributes = OptionalAttributes.newInstance(outputText, altCode,
                 disabledIconId, previewIconId, visualInsetsLeft, visualInsetsRight);
         mKeyVisualAttributes = KeyVisualAttributes.newInstance(keyAttr);
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyStylesSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyStylesSet.java
index a64f23501a5d08ad7d77238f5daeeb16dadb791d..f6180e32aa6994224cfc4243025e675ad6b6d37d 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyStylesSet.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyStylesSet.java
@@ -135,14 +135,12 @@ public final class KeyStylesSet {
 
         public void readKeyAttributes(final TypedArray keyAttr) {
             // TODO: Currently not all Key attributes can be declared as style.
-            readString(keyAttr, R.styleable.Keyboard_Key_code);
             readString(keyAttr, R.styleable.Keyboard_Key_altCode);
             readString(keyAttr, R.styleable.Keyboard_Key_keyLabel);
             readString(keyAttr, R.styleable.Keyboard_Key_keyHintLabel);
             readStringArray(keyAttr, R.styleable.Keyboard_Key_moreKeys);
             readStringArray(keyAttr, R.styleable.Keyboard_Key_additionalMoreKeys);
             readFlags(keyAttr, R.styleable.Keyboard_Key_keyLabelFlags);
-            readString(keyAttr, R.styleable.Keyboard_Key_keyIcon);
             readString(keyAttr, R.styleable.Keyboard_Key_keyIconDisabled);
             readString(keyAttr, R.styleable.Keyboard_Key_keyIconPreview);
             readInt(keyAttr, R.styleable.Keyboard_Key_maxMoreKeysColumn);
diff --git a/tools/make-keyboard-text/res/values/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values/donottranslate-more-keys.xml
index 2b7ef7ccc16be7bcb1a9b87c9ee9a56bac9fd48b..46eab571a793d7ddf77de916a4fac2783e21759b 100644
--- a/tools/make-keyboard-text/res/values/donottranslate-more-keys.xml
+++ b/tools/make-keyboard-text/res/values/donottranslate-more-keys.xml
@@ -196,8 +196,8 @@
     <string name="shortcut_as_more_key">!icon/shortcut_key|!code/key_shortcut</string>
     <string name="action_next_as_more_key">!hasLabels!,\@string/label_next_key|!code/key_action_next</string>
     <string name="action_previous_as_more_key">!hasLabels!,\@string/label_previous_key|!code/key_action_previous</string>
-    <!-- Label for "switch to more symbol" modifier key.  Must be short to fit on key! -->
-    <string name="label_to_more_symbol_key">= \\ &lt;</string>
+    <!-- Label for "switch to more symbol" modifier key ("= \ <"). Must be short to fit on key! -->
+    <string name="label_to_more_symbol_key">= \\\\ &lt;</string>
     <!-- Label for "switch to more symbol" modifier key on tablets.  Must be short to fit on key! -->
     <string name="label_to_more_symbol_for_tablet_key">~ [ &lt;</string>
     <!-- Label for "Tab" key.  Must be short to fit on key! -->