diff --git a/java/res/values-ar/donottranslate-more-keys.xml b/java/res/values-ar/donottranslate-more-keys.xml
index 6a14a3c55e5b82b2608e1b1dadc721d7617ec392..9a7a0267aca2794827ec7ec8f2921129104f6911 100644
--- a/java/res/values-ar/donottranslate-more-keys.xml
+++ b/java/res/values-ar/donottranslate-more-keys.xml
@@ -102,8 +102,43 @@
     <string name="more_keys_for_bullet">♪</string>
     <!-- \u066d: ARABIC FIVE POINTED STAR -->
     <string name="more_keys_for_star">★,\u066d</string>
-    <!-- \ufd3e: ORNATE LEFT PARENTHESIS -->
-    <string name="more_keys_for_left_parenthesis">[,{,&lt;,\ufd3e</string>
-    <!-- \ufd3f: ORNATE RIGHT PARENTHESIS -->
-    <string name="more_keys_for_right_parenthesis">],},&gt;,\ufd3f</string>
+    <!-- The all letters need to be mirrored are found at
+         http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt -->
+    <string name="output_text_for_left_parenthesis">)</string>
+    <string name="output_text_for_right_parenthesis">(</string>
+    <!-- \ufd3e: ORNATE LEFT PARENTHESIS
+         \ufd3f: ORNATE RIGHT PARENTHESIS -->
+    <string name="more_keys_for_left_parenthesis">[|],{|},&lt;|&gt;,\ufd3e|\ufd3f</string>
+    <string name="more_keys_for_right_parenthesis">]|[,}|{,&gt;|&lt;,\ufd3f|\ufd3e</string>
+    <string name="output_text_for_less_than">&gt;</string>
+    <string name="output_text_for_greater_than">&lt;</string>
+    <!-- \u2264: LESS-THAN OR EQUAL TO
+         \u2265: GREATER-THAN EQUAL TO
+         \u00ab: LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+         \u00bb: RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+         \u2039: SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+         \u203a: SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+         The following characters don't need BIDI mirroring.
+         \u2018: LEFT SINGLE QUOTATION MARK
+         \u2019: RIGHT SINGLE QUOTATION MARK
+         \u201a: SINGLE LOW-9 QUOTATION MARK
+         \u201b: SINGLE HIGH-REVERSED-9 QUOTATION MARK
+         \u201c: LEFT DOUBLE QUOTATION MARK
+         \u201d: RIGHT DOUBLE QUOTATION MARK
+         \u201e: DOUBLE LOW-9 QUOTATION MARK
+         \u201f: DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
+    <string name="more_keys_for_less_than">\u2264|\u2265,\u00ab|\u00bb,\u2039|\u203a</string>
+    <string name="more_keys_for_greater_than">\u2265|\u2264,\u00bb|\u00ab,\u203a|\u2039</string>
+    <string name="output_text_for_left_square_bracket">]</string>
+    <string name="output_text_for_right_square_bracket">[</string>
+    <string name="output_text_for_left_curly_bracket">}</string>
+    <string name="output_text_for_right_curly_bracket">{</string>
+    <!-- Note: Neither DroidSans nor Roboto have a glyph for DOUBLE HIGH-REVERSED-9 QUOTATION MARK. -->
+    <!-- <string name="more_keys_for_double_quote">\u201c,\u201d,\u201e,\u201f,\u00ab,\u00bb</string> -->
+    <!-- The 4-more keys will be displayed in order of "3,1,2,4". -->
+    <string name="more_keys_for_double_quote">\u201d,\u00ab|\u00bb,\u201c,\u00bb|\u00ab</string>
+    <!-- Note: Neither DroidSans nor Roboto have a glyph for DOUBLE HIGH-REVERSED-9 QUOTATION MARK. -->
+    <!-- <string name="more_keys_for_tablet_double_quote">\u201c,\u201d,\u201e,\u201f,\u00ab,\u00bb,\u2018,\u2019,\u201a,\u201b</string> -->
+    <!-- The 8-more keys with maxMoreKeysColumn=4 will be displayed in order of "3,1,2,4|7,5,6,8". -->
+    <string name="more_keys_for_tablet_double_quote">\u201d,\u00ab|\u00bb,\u201c,\u00bb|\u00ab,\u2019,\u201a,\u2018,\u201b</string>
 </resources>
diff --git a/java/res/values-ar/donottranslate.xml b/java/res/values-ar/donottranslate.xml
index c51ac502a13818e250e05cb22133c35fcb2773b5..a9aad4e3c24c36fd26119c7420e797394afb2077 100644
--- a/java/res/values-ar/donottranslate.xml
+++ b/java/res/values-ar/donottranslate.xml
@@ -19,7 +19,7 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <!-- The all letters need to be mirrored are found at
-         http://www.unicode.org/Public/6.0.0/ucd/extracted/DerivedBinaryProperties.txt -->
+         http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt -->
     <!-- Symbols that are suggested between words -->
     <string name="suggested_punctuations">!,?,\\,,:,;,\u0022,(|),)|(,\u0027,-,/,@,_</string>
 </resources>
diff --git a/java/res/values-iw/donottranslate-more-keys.xml b/java/res/values-iw/donottranslate-more-keys.xml
index 829486f7bcfe96404ebbaa3e1d8d9cd0e747263f..6fc3360027b4024e41997ed674c0c6c2dc3adeb7 100644
--- a/java/res/values-iw/donottranslate-more-keys.xml
+++ b/java/res/values-iw/donottranslate-more-keys.xml
@@ -20,4 +20,41 @@
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="more_keys_for_star">★</string>
     <string name="more_keys_for_plus">±,﬩</string>
+    <!-- The all letters need to be mirrored are found at
+         http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt -->
+    <string name="output_text_for_left_parenthesis">)</string>
+    <string name="output_text_for_right_parenthesis">(</string>
+    <string name="more_keys_for_left_parenthesis">[|],{|},&lt;|&gt;</string>
+    <string name="more_keys_for_right_parenthesis">]|[,}|{,&gt;|&lt;</string>
+    <string name="output_text_for_less_than">&gt;</string>
+    <string name="output_text_for_greater_than">&lt;</string>
+    <!-- \u2264: LESS-THAN OR EQUAL TO
+         \u2265: GREATER-THAN EQUAL TO
+         \u00ab: LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+         \u00bb: RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+         \u2039: SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+         \u203a: SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+         The following characters don't need BIDI mirroring.
+         \u2018: LEFT SINGLE QUOTATION MARK
+         \u2019: RIGHT SINGLE QUOTATION MARK
+         \u201a: SINGLE LOW-9 QUOTATION MARK
+         \u201b: SINGLE HIGH-REVERSED-9 QUOTATION MARK
+         \u201c: LEFT DOUBLE QUOTATION MARK
+         \u201d: RIGHT DOUBLE QUOTATION MARK
+         \u201e: DOUBLE LOW-9 QUOTATION MARK
+         \u201f: DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
+    <string name="more_keys_for_less_than">\u2264|\u2265,\u00ab|\u00bb,\u2039|\u203a</string>
+    <string name="more_keys_for_greater_than">\u2265|\u2264,\u00bb|\u00ab,\u203a|\u2039</string>
+    <string name="output_text_for_left_square_bracket">]</string>
+    <string name="output_text_for_right_square_bracket">[</string>
+    <string name="output_text_for_left_curly_bracket">}</string>
+    <string name="output_text_for_right_curly_bracket">{</string>
+    <!-- Note: Neither DroidSans nor Roboto have a glyph for DOUBLE HIGH-REVERSED-9 QUOTATION MARK. -->
+    <!-- <string name="more_keys_for_double_quote">\u201c,\u201d,\u201e,\u201f,\u00ab,\u00bb</string> -->
+    <!-- The 4-more keys will be displayed in order of "3,1,2,4". -->
+    <string name="more_keys_for_double_quote">\u201d,\u00ab|\u00bb,\u201c,\u00bb|\u00ab</string>
+    <!-- Note: Neither DroidSans nor Roboto have a glyph for DOUBLE HIGH-REVERSED-9 QUOTATION MARK. -->
+    <!-- <string name="more_keys_for_tablet_double_quote">\u201c,\u201d,\u201e,\u201f,\u00ab,\u00bb,\u2018,\u2019,\u201a,\u201b</string> -->
+    <!-- The 8-more keys with maxMoreKeysColumn=4 will be displayed in order of "3,1,2,4|7,5,6,8". -->
+    <string name="more_keys_for_tablet_double_quote">\u201d,\u00ab|\u00bb,\u201c,\u00bb|\u00ab,\u2019,\u201a,\u2018,\u201b</string>
 </resources>
diff --git a/java/res/values-iw/donottranslate.xml b/java/res/values-iw/donottranslate.xml
index c51ac502a13818e250e05cb22133c35fcb2773b5..a9aad4e3c24c36fd26119c7420e797394afb2077 100644
--- a/java/res/values-iw/donottranslate.xml
+++ b/java/res/values-iw/donottranslate.xml
@@ -19,7 +19,7 @@
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <!-- The all letters need to be mirrored are found at
-         http://www.unicode.org/Public/6.0.0/ucd/extracted/DerivedBinaryProperties.txt -->
+         http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt -->
     <!-- Symbols that are suggested between words -->
     <string name="suggested_punctuations">!,?,\\,,:,;,\u0022,(|),)|(,\u0027,-,/,@,_</string>
 </resources>
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index d859ae3ea6955b788cab6af0379e68d5cb40db90..dd2206da81a4bdd9a3fdf416b887f4e7db85c51c 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -202,8 +202,6 @@
         <attr name="verticalGap" format="dimension|fraction" />
         <!-- More keys keyboard layout template -->
         <attr name="moreKeysTemplate" format="reference" />
-        <!-- True if the keyboard is Right-To-Left -->
-        <attr name="isRtlKeyboard" format="boolean" />
         <!-- Icon set for key top and key preview. -->
         <attr name="iconShiftKey" format="reference" />
         <attr name="iconDeleteKey" format="reference" />
diff --git a/java/res/values/donottranslate-more-keys.xml b/java/res/values/donottranslate-more-keys.xml
index 07f4bf38b22f81580cbbfac9b919662155073795..07e711a02bedacdf141c4cbea3a242dd11a9b807 100644
--- a/java/res/values/donottranslate-more-keys.xml
+++ b/java/res/values/donottranslate-more-keys.xml
@@ -112,6 +112,43 @@
     <string name="more_keys_for_bullet">♪,♥,♠,♦,♣</string>
     <string name="more_keys_for_star">†,‡,★</string>
     <string name="more_keys_for_plus">±</string>
+    <!-- The all letters need to be mirrored are found at
+         http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt -->
+    <string name="output_text_for_left_parenthesis">(</string>
+    <string name="output_text_for_right_parenthesis">)</string>
     <string name="more_keys_for_left_parenthesis">[,{,&lt;</string>
     <string name="more_keys_for_right_parenthesis">],},&gt;</string>
+    <string name="output_text_for_less_than">&lt;</string>
+    <string name="output_text_for_greater_than">&gt;</string>
+    <!-- \u2264: LESS-THAN OR EQUAL TO
+         \u2265: GREATER-THAN EQUAL TO
+         \u00ab: LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+         \u00bb: RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+         \u2039: SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+         \u203a: SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+         The following characters don't need BIDI mirroring.
+         \u2018: LEFT SINGLE QUOTATION MARK
+         \u2019: RIGHT SINGLE QUOTATION MARK
+         \u201a: SINGLE LOW-9 QUOTATION MARK
+         \u201b: SINGLE HIGH-REVERSED-9 QUOTATION MARK
+         \u201c: LEFT DOUBLE QUOTATION MARK
+         \u201d: RIGHT DOUBLE QUOTATION MARK
+         \u201e: DOUBLE LOW-9 QUOTATION MARK
+         \u201f: DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
+    <string name="more_keys_for_less_than">\u2264,\u00ab,\u2039</string>
+    <string name="more_keys_for_greater_than">\u2265,\u00bb,\u203a</string>
+    <string name="output_text_for_left_square_bracket">[</string>
+    <string name="output_text_for_right_square_bracket">]</string>
+    <string name="output_text_for_left_curly_bracket">{</string>
+    <string name="output_text_for_right_curly_bracket">}</string>
+    <!-- The 4-more keys will be displayed in order of "3,1,2,4". -->
+    <string name="more_keys_for_single_quote">\u2019,\u201a,\u2018,\u201b</string>
+    <!-- Note: Neither DroidSans nor Roboto have a glyph for DOUBLE HIGH-REVERSED-9 QUOTATION MARK. -->
+    <!-- <string name="more_keys_for_double_quote">\u201c,\u201d,\u201e,\u201f,\u00ab,\u00bb</string> -->
+    <!-- The 4-more keys will be displayed in order of "3,1,2,4". -->
+    <string name="more_keys_for_double_quote">\u201d,\u00ab,\u201c,\u00bb</string>
+    <!-- Note: Neither DroidSans nor Roboto have a glyph for DOUBLE HIGH-REVERSED-9 QUOTATION MARK. -->
+    <!-- <string name="more_keys_for_tablet_double_quote">\u201c,\u201d,\u201e,\u201f,\u00ab,\u00bb,\u2018,\u2019,\u201a,\u201b</string> -->
+    <!-- The 8-more keys with maxMoreKeysColumn=4 will be displayed in order of "3,1,2,4|7,5,6,8". -->
+    <string name="more_keys_for_tablet_double_quote">\u201d,\u00ab,\u201c,\u00bb,\u2019,\u201a,\u2018,\u201b</string>
 </resources>
diff --git a/java/res/xml-sw600dp/rows_azerty.xml b/java/res/xml-sw600dp/rows_azerty.xml
index c29d291ea2cc4d7e11aa423f5a7c938558081697..aabe6b0e8de88ab1526b1aa2dc72c03491712ef3 100644
--- a/java/res/xml-sw600dp/rows_azerty.xml
+++ b/java/res/xml-sw600dp/rows_azerty.xml
@@ -116,7 +116,10 @@
             latin:keyLabel="n"
             latin:moreKeys="@string/more_keys_for_n" />
         <Key
-            latin:keyLabel="\'" />
+            latin:keyLabel="\'"
+            latin:keyHintLabel=":"
+            latin:moreKeys=":"
+            latin:keyStyle="hasShiftedLetterHintStyle" />
         <include
             latin:keyboardLayout="@xml/keys_comma_period" />
         <include
diff --git a/java/res/xml-sw600dp/rows_symbols.xml b/java/res/xml-sw600dp/rows_symbols.xml
index 701c35470f0bc4a7107be5547ccea6eebd983d50..c2dfe2f82b42f184105ebe47c6875c10a69b438f 100644
--- a/java/res/xml-sw600dp/rows_symbols.xml
+++ b/java/res/xml-sw600dp/rows_symbols.xml
@@ -95,12 +95,8 @@
         <Key
             latin:keyLabel="+"
             latin:moreKeys="@string/more_keys_for_plus" />
-        <Key
-            latin:keyLabel="("
-            latin:moreKeys="[,{,&lt;" />
-        <Key
-            latin:keyLabel=")"
-            latin:moreKeys="],},&gt;" />
+        <include
+            latin:keyboardLayout="@xml/keys_parentheses" />
         <Key
             latin:keyStyle="returnKeyStyle"
             latin:keyXPos="-14.6%p"
@@ -112,12 +108,8 @@
         <Key
             latin:keyStyle="toMoreSymbolKeyStyle"
             latin:keyWidth="10.0%p" />
-        <Key
-            latin:keyLabel="&lt;"
-            latin:moreKeys="≤,«,‹" />
-        <Key
-            latin:keyLabel="&gt;"
-            latin:moreKeys="≥,»,›" />
+        <include
+            latin:keyboardLayout="@xml/keys_less_greater" />
         <Key
             latin:keyLabel="="
             latin:moreKeys="≠,≈" />
@@ -126,8 +118,7 @@
                 latin:mode="url"
             >
                 <Key
-                    latin:keyLabel="\'"
-                    latin:moreKeys="‘,’,‚,‛" />
+                    latin:keyLabel="\'" />
             </case>
             <default>
                 <Key
@@ -166,11 +157,10 @@
             latin:keyStyle="spaceKeyStyle"
             latin:keyXPos="30.750%p"
             latin:keyWidth="39.750%p" />
-        <!-- Note: DroidSans doesn't have double-high-reversed-quotation '\u201f' glyph. -->
-        <!-- latin:moreKeys="“,”,„,‟,«,»,‘,’,‚,‛" -->
         <Key
             latin:keyLabel="&quot;"
-            latin:moreKeys="“,”,«,»,‘,’,‚,‛" />
+            latin:moreKeys="@string/more_keys_for_tablet_double_quote"
+            latin:maxMoreKeysColumn="4" />
         <Key
             latin:keyLabel="_" />
         <Spacer
diff --git a/java/res/xml-sw600dp/rows_symbols_shift.xml b/java/res/xml-sw600dp/rows_symbols_shift.xml
index d3531dd39ac56d2e6fe97c399ec1db6604fc0401..6a640c06b4564d9777b05d1920308b63c79b6ab7 100644
--- a/java/res/xml-sw600dp/rows_symbols_shift.xml
+++ b/java/res/xml-sw600dp/rows_symbols_shift.xml
@@ -77,10 +77,8 @@
         <Key
             latin:keyLabel="±"
             latin:moreKeys="∞" />
-        <Key
-            latin:keyLabel="{" />
-        <Key
-            latin:keyLabel="}" />
+        <include
+            latin:keyboardLayout="@xml/keys_curly_brackets" />
         <Key
             latin:keyStyle="returnKeyStyle"
             latin:keyXPos="-14.6%p"
@@ -102,10 +100,8 @@
             latin:keyLabel="â„¢" />
         <Key
             latin:keyLabel="â„…" />
-        <Key
-            latin:keyLabel="[" />
-        <Key
-            latin:keyLabel="]" />
+        <include
+            latin:keyboardLayout="@xml/keys_square_brackets" />
         <Key
             latin:keyLabel="¡" />
         <Key
diff --git a/java/res/xml-sw768dp/rows_azerty.xml b/java/res/xml-sw768dp/rows_azerty.xml
index 886ebecaa7dae4ada6262dd94b4918d671ac6384..b9ef89822b59d421e944dc3b29676b616a0194bf 100644
--- a/java/res/xml-sw768dp/rows_azerty.xml
+++ b/java/res/xml-sw768dp/rows_azerty.xml
@@ -124,9 +124,9 @@
             latin:moreKeys="@string/more_keys_for_n" />
         <Key
             latin:keyLabel="\'"
-            latin:keyLabelFlags="hasShiftedLetterHint"
             latin:keyHintLabel=":"
-            latin:moreKeys=":" />
+            latin:moreKeys=":"
+            latin:keyStyle="hasShiftedLetterHintStyle" />
         <include
             latin:keyboardLayout="@xml/keys_comma_period" />
         <Key
diff --git a/java/res/xml-sw768dp/rows_symbols.xml b/java/res/xml-sw768dp/rows_symbols.xml
index 7458b366a158996ca09c3a0414deae569c8d46d6..2ba935724a5ca2f1ada5376884fc7688261d6bea 100644
--- a/java/res/xml-sw768dp/rows_symbols.xml
+++ b/java/res/xml-sw768dp/rows_symbols.xml
@@ -102,12 +102,8 @@
         <Key
             latin:keyLabel="+"
             latin:moreKeys="@string/more_keys_for_plus" />
-        <Key
-            latin:keyLabel="("
-            latin:moreKeys="[,{,&lt;" />
-        <Key
-            latin:keyLabel=")"
-            latin:moreKeys="],},&gt;" />
+        <include
+            latin:keyboardLayout="@xml/keys_parentheses" />
         <Key
             latin:keyStyle="returnKeyStyle"
             latin:keyXPos="-15.704%p"
@@ -119,12 +115,8 @@
         <Key
             latin:keyStyle="toMoreSymbolKeyStyle"
             latin:keyWidth="13.829%p" />
-        <Key
-            latin:keyLabel="&lt;"
-            latin:moreKeys="≤,«,‹" />
-        <Key
-            latin:keyLabel="&gt;"
-            latin:moreKeys="≥,»,›" />
+        <include
+            latin:keyboardLayout="@xml/keys_less_greater" />
         <Key
             latin:keyLabel="="
             latin:moreKeys="≠,≈" />
@@ -133,8 +125,7 @@
                 latin:mode="url"
             >
                 <Key
-                    latin:keyLabel="\'"
-                    latin:moreKeys="‘,’,‚,‛" />
+                    latin:keyLabel="\'" />
             </case>
             <default>
                 <Key
@@ -181,11 +172,10 @@
             latin:keyStyle="spaceKeyStyle"
             latin:keyXPos="31.250%p"
             latin:keyWidth="37.500%p" />
-        <!-- Note: DroidSans doesn't have double-high-reversed-quotation '\u201f' glyph. -->
-        <!-- latin:moreKeys="“,”,„,‟,«,»,‘,’,‚,‛" -->
         <Key
             latin:keyLabel="&quot;"
-            latin:moreKeys="“,”,«,»,‘,’,‚,‛" />
+            latin:moreKeys="@string/more_keys_for_tablet_double_quote"
+            latin:maxMoreKeysColumn="4" />
         <Key
             latin:keyLabel="_" />
         <switch>
diff --git a/java/res/xml-sw768dp/rows_symbols_shift.xml b/java/res/xml-sw768dp/rows_symbols_shift.xml
index 80735b697ee20fef8367beef2ea96fa33be1a5d6..aba9c236d09ba45fc17c973021ea27338c2bdfc6 100644
--- a/java/res/xml-sw768dp/rows_symbols_shift.xml
+++ b/java/res/xml-sw768dp/rows_symbols_shift.xml
@@ -84,10 +84,8 @@
         <Key
             latin:keyLabel="±"
             latin:moreKeys="∞" />
-        <Key
-            latin:keyLabel="{" />
-        <Key
-            latin:keyLabel="}" />
+        <include
+            latin:keyboardLayout="@xml/keys_curly_brackets" />
         <Key
             latin:keyStyle="returnKeyStyle"
             latin:keyXPos="-15.704%p"
@@ -109,10 +107,8 @@
             latin:keyLabel="â„¢" />
         <Key
             latin:keyLabel="â„…" />
-        <Key
-            latin:keyLabel="[" />
-        <Key
-            latin:keyLabel="]" />
+        <include
+            latin:keyboardLayout="@xml/keys_square_brackets" />
         <Key
             latin:keyLabel="¡" />
         <Key
diff --git a/java/res/xml/kbd_arabic.xml b/java/res/xml/kbd_arabic.xml
index d7f77cc3a0ae20157ae789d16e0256ba97f5a908..ce5f30b2fff9c0008e820250121830127d32911b 100644
--- a/java/res/xml/kbd_arabic.xml
+++ b/java/res/xml/kbd_arabic.xml
@@ -20,7 +20,6 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
-    latin:isRtlKeyboard="true"
 >
     <include
         latin:keyboardLayout="@xml/rows_arabic" />
diff --git a/java/res/xml/kbd_hebrew.xml b/java/res/xml/kbd_hebrew.xml
index 3d574db598f0fd0d3424bbe60339ec25f0eac1f9..74836f342c018a4f698737a4c4772376ed24d11e 100644
--- a/java/res/xml/kbd_hebrew.xml
+++ b/java/res/xml/kbd_hebrew.xml
@@ -20,7 +20,6 @@
 
 <Keyboard
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
-    latin:isRtlKeyboard="true"
 >
     <include
         latin:keyboardLayout="@xml/rows_hebrew" />
diff --git a/java/res/xml-ar/kbd_symbols.xml b/java/res/xml/keys_curly_brackets.xml
similarity index 70%
rename from java/res/xml-ar/kbd_symbols.xml
rename to java/res/xml/keys_curly_brackets.xml
index c1905b87566ecf30d859839d377628cddb0c9159..b43fbb1fe3f9962f45d483bd63543111d869684e 100644
--- a/java/res/xml-ar/kbd_symbols.xml
+++ b/java/res/xml/keys_curly_brackets.xml
@@ -2,7 +2,7 @@
 <!--
 /*
 **
-** Copyright 2011, The Android Open Source Project
+** Copyright 2012, The Android Open Source Project
 **
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
@@ -18,10 +18,13 @@
 */
 -->
 
-<Keyboard
+<merge
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
-    latin:isRtlKeyboard="true"
 >
-    <include
-        latin:keyboardLayout="@xml/rows_symbols" />
-</Keyboard>
+    <Key
+        latin:keyLabel="{"
+        latin:keyOutputText="@string/output_text_for_left_curly_bracket" />
+    <Key
+        latin:keyLabel="}"
+        latin:keyOutputText="@string/output_text_for_right_curly_bracket" />
+</merge>
diff --git a/java/res/xml-iw/kbd_symbols.xml b/java/res/xml/keys_less_greater.xml
similarity index 63%
rename from java/res/xml-iw/kbd_symbols.xml
rename to java/res/xml/keys_less_greater.xml
index c1905b87566ecf30d859839d377628cddb0c9159..8e90199feaff0332732f65fc2dc1bfb676be7683 100644
--- a/java/res/xml-iw/kbd_symbols.xml
+++ b/java/res/xml/keys_less_greater.xml
@@ -2,7 +2,7 @@
 <!--
 /*
 **
-** Copyright 2011, The Android Open Source Project
+** Copyright 2012, The Android Open Source Project
 **
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
@@ -18,10 +18,15 @@
 */
 -->
 
-<Keyboard
+<merge
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
-    latin:isRtlKeyboard="true"
 >
-    <include
-        latin:keyboardLayout="@xml/rows_symbols" />
-</Keyboard>
+    <Key
+        latin:keyLabel="&lt;"
+        latin:keyOutputText="@string/output_text_for_less_than"
+        latin:moreKeys="@string/more_keys_for_less_than" />
+    <Key
+        latin:keyLabel="&gt;"
+        latin:keyOutputText="@string/output_text_for_greater_than"
+        latin:moreKeys="@string/more_keys_for_greater_than" />
+</merge>
diff --git a/java/res/xml-iw/kbd_symbols_shift.xml b/java/res/xml/keys_parentheses.xml
similarity index 62%
rename from java/res/xml-iw/kbd_symbols_shift.xml
rename to java/res/xml/keys_parentheses.xml
index 820b425ea469d3950a56a222cb133f012d0bfd24..bacb26d2f497f88f27e26cbb0740d0b9120766ee 100644
--- a/java/res/xml-iw/kbd_symbols_shift.xml
+++ b/java/res/xml/keys_parentheses.xml
@@ -2,7 +2,7 @@
 <!--
 /*
 **
-** Copyright 2011, The Android Open Source Project
+** Copyright 2012, The Android Open Source Project
 **
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
@@ -18,10 +18,15 @@
 */
 -->
 
-<Keyboard
+<merge
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
-    latin:isRtlKeyboard="true"
 >
-    <include
-        latin:keyboardLayout="@xml/rows_symbols_shift" />
-</Keyboard>
+    <Key
+        latin:keyLabel="("
+        latin:keyOutputText="@string/output_text_for_left_parenthesis"
+        latin:moreKeys="@string/more_keys_for_left_parenthesis" />
+    <Key
+        latin:keyLabel=")"
+        latin:keyOutputText="@string/output_text_for_right_parenthesis"
+        latin:moreKeys="@string/more_keys_for_right_parenthesis" />
+</merge>
diff --git a/java/res/xml-ar/kbd_symbols_shift.xml b/java/res/xml/keys_square_brackets.xml
similarity index 70%
rename from java/res/xml-ar/kbd_symbols_shift.xml
rename to java/res/xml/keys_square_brackets.xml
index 820b425ea469d3950a56a222cb133f012d0bfd24..3525f4d5a9d1da6bb71b49c9f89222c78fcec0ce 100644
--- a/java/res/xml-ar/kbd_symbols_shift.xml
+++ b/java/res/xml/keys_square_brackets.xml
@@ -2,7 +2,7 @@
 <!--
 /*
 **
-** Copyright 2011, The Android Open Source Project
+** Copyright 2012, The Android Open Source Project
 **
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
@@ -18,10 +18,13 @@
 */
 -->
 
-<Keyboard
+<merge
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
-    latin:isRtlKeyboard="true"
 >
-    <include
-        latin:keyboardLayout="@xml/rows_symbols_shift" />
-</Keyboard>
+    <Key
+        latin:keyLabel="["
+        latin:keyOutputText="@string/output_text_for_left_square_bracket" />
+    <Key
+        latin:keyLabel="]"
+        latin:keyOutputText="@string/output_text_for_right_square_bracket" />
+</merge>
diff --git a/java/res/xml/rows_azerty.xml b/java/res/xml/rows_azerty.xml
index 142ebc0a699fcb334a2596fe2f8182b9cce80a45..533c683d6daf0db8084436fab6cd0041daa601df 100644
--- a/java/res/xml/rows_azerty.xml
+++ b/java/res/xml/rows_azerty.xml
@@ -130,9 +130,13 @@
         <Key
             latin:keyLabel="n"
             latin:moreKeys="@string/more_keys_for_n" />
+        <!-- TODO: Introduce a flag, such as strinctMoreKeysOrder, to control moreKeys display
+             order more precisely. -->
+        <!-- This key is close enough to right edge, so that the 4-more keys will be displayed in
+             order of "4,3,1,2". See @string/more_keys_for_single_quote -->
         <Key
             latin:keyLabel="\'"
-            latin:moreKeys="‘,’,‚,‛" />
+            latin:moreKeys="\u2018,\u2019,\u201b,\u201a" />
         <Key
             latin:keyStyle="deleteKeyStyle"
             latin:keyWidth="fillRight"
diff --git a/java/res/xml/rows_symbols.xml b/java/res/xml/rows_symbols.xml
index d0d0edbc85f86f41441ddede57a054ec224b90a9..81a9a46021abb74008606a8a1b576e96c1c1bcda 100644
--- a/java/res/xml/rows_symbols.xml
+++ b/java/res/xml/rows_symbols.xml
@@ -93,13 +93,8 @@
         <Key
             latin:keyLabel="+"
             latin:moreKeys="@string/more_keys_for_plus" />
-        <Key
-            latin:keyLabel="("
-            latin:moreKeys="@string/more_keys_for_left_parenthesis" />
-        <Key
-            latin:keyLabel=")"
-            latin:moreKeys="@string/more_keys_for_right_parenthesis"
-            latin:keyWidth="fillRight" />
+        <include
+            latin:keyboardLayout="@xml/keys_parentheses" />
     </Row>
     <Row
         latin:keyWidth="10%p"
@@ -111,15 +106,13 @@
         <Key
             latin:keyLabel="!"
             latin:moreKeys="¡" />
-        <!-- Note: Neither DroidSans nor Roboto have a glyph for ‟ Double high-reversed-9 quotation mark U+201F. -->
-            <!-- latin:moreKeys="“,”,„,‟,«,»" -->
         <Key
             latin:keyLabel="&quot;"
-            latin:moreKeys="“,”,«,»"
-            latin:maxMoreKeysColumn="6" />
+            latin:moreKeys="@string/more_keys_for_double_quote"
+            latin:maxMoreKeysColumn="4" />
         <Key
             latin:keyLabel="\'"
-            latin:moreKeys="‘,’,‚,‛" />
+            latin:moreKeys="@string/more_keys_for_single_quote" />
         <Key
             latin:keyLabel=":" />
         <Key
diff --git a/java/res/xml/rows_symbols_shift.xml b/java/res/xml/rows_symbols_shift.xml
index 6d1838c7b5cdc800876e13ba1b0ddfa803bacc98..828bd0624cf6c8d260ac018da266b2646cae8bae 100644
--- a/java/res/xml/rows_symbols_shift.xml
+++ b/java/res/xml/rows_symbols_shift.xml
@@ -46,11 +46,8 @@
             latin:keyLabel="÷" />
         <Key
             latin:keyLabel="×" />
-        <Key
-            latin:keyLabel="{" />
-        <Key
-            latin:keyLabel="}"
-            latin:keyWidth="fillRight" />
+        <include
+            latin:keyboardLayout="@xml/keys_curly_brackets" />
     </Row>
     <Row
         latin:keyWidth="10%p"
@@ -74,11 +71,8 @@
         <Key
             latin:keyLabel="="
             latin:moreKeys="≠,≈,∞" />
-        <Key
-            latin:keyLabel="[" />
-        <Key
-            latin:keyLabel="]"
-            latin:keyWidth="fillRight" />
+        <include
+            latin:keyboardLayout="@xml/keys_square_brackets" />
     </Row>
     <Row
         latin:keyWidth="10%p"
@@ -98,12 +92,8 @@
             latin:moreKeys="§" />
         <Key
             latin:keyLabel="\\" />
-        <Key
-            latin:keyLabel="&lt;"
-            latin:moreKeys="≤,«,‹" />
-        <Key
-            latin:keyLabel="&gt;"
-            latin:moreKeys="≥,»,›" />
+        <include
+            latin:keyboardLayout="@xml/keys_less_greater" />
         <Key
             latin:keyStyle="deleteKeyStyle"
             latin:keyWidth="fillRight"
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
index 3cfecf5effb38e198f302eb960dd8d0e168e371d..5e58821d099bab9bc59019c981a1c7396749ed77 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -36,8 +36,6 @@ import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
 import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
 
 /**
  * Class for describing the position and characteristics of a single key in the keyboard.
@@ -129,45 +127,6 @@ public class Key {
     /** Key is enabled and responds on press */
     private boolean mEnabled = true;
 
-    // RTL parenthesis character swapping map.
-    private static final Map<Integer, Integer> sRtlParenthesisMap = new HashMap<Integer, Integer>();
-
-    static {
-        // The all letters need to be mirrored are found at
-        // http://www.unicode.org/Public/6.0.0/ucd/extracted/DerivedBinaryProperties.txt
-        addRtlParenthesisPair('(', ')');
-        addRtlParenthesisPair('[', ']');
-        addRtlParenthesisPair('{', '}');
-        addRtlParenthesisPair('<', '>');
-        // \u00ab: LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-        // \u00bb: RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-        addRtlParenthesisPair('\u00ab', '\u00bb');
-        // \u2039: SINGLE LEFT-POINTING ANGLE QUOTATION MARK
-        // \u203a: SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
-        addRtlParenthesisPair('\u2039', '\u203a');
-        // \u2264: LESS-THAN OR EQUAL TO
-        // \u2265: GREATER-THAN OR EQUAL TO
-        addRtlParenthesisPair('\u2264', '\u2265');
-    }
-
-    private static void addRtlParenthesisPair(int left, int right) {
-        sRtlParenthesisMap.put(left, right);
-        sRtlParenthesisMap.put(right, left);
-    }
-
-    public static int getRtlParenthesisCode(int code, boolean isRtl) {
-        if (isRtl && sRtlParenthesisMap.containsKey(code)) {
-            return sRtlParenthesisMap.get(code);
-        } else {
-            return code;
-        }
-    }
-
-    private static int getCode(Resources res, Keyboard.Params params, String moreKeySpec) {
-        return getRtlParenthesisCode(
-                MoreKeySpecParser.getCode(res, moreKeySpec), params.mIsRtlKeyboard);
-    }
-
     private static Drawable getIcon(Keyboard.Params params, String moreKeySpec) {
         final int iconAttrId = MoreKeySpecParser.getIconAttrId(moreKeySpec);
         if (iconAttrId == KeyboardIconsSet.ICON_UNDEFINED) {
@@ -183,7 +142,8 @@ public class Key {
     public Key(Resources res, Keyboard.Params params, String moreKeySpec,
             int x, int y, int width, int height) {
         this(params, MoreKeySpecParser.getLabel(moreKeySpec), null, getIcon(params, moreKeySpec),
-                getCode(res, params, moreKeySpec), MoreKeySpecParser.getOutputText(moreKeySpec),
+                MoreKeySpecParser.getCode(res, moreKeySpec),
+                MoreKeySpecParser.getOutputText(moreKeySpec),
                 x, y, width, height);
     }
 
@@ -311,16 +271,14 @@ public class Key {
         if (code == Keyboard.CODE_UNSPECIFIED && TextUtils.isEmpty(outputText)
                 && !TextUtils.isEmpty(mLabel)) {
             if (mLabel.codePointCount(0, mLabel.length()) == 1) {
-                final int activatedCode;
                 // Use the first letter of the hint label if shiftedLetterActivated flag is
                 // specified.
                 if (hasShiftedLetterHint() && isShiftedLetterActivated()
                         && !TextUtils.isEmpty(mHintLabel)) {
-                    activatedCode = mHintLabel.codePointAt(0);
+                    mCode = mHintLabel.codePointAt(0);
                 } else {
-                    activatedCode = mLabel.codePointAt(0);
+                    mCode = mLabel.codePointAt(0);
                 }
-                mCode = getRtlParenthesisCode(activatedCode, params.mIsRtlKeyboard);
             } else {
                 // In some locale and case, the character might be represented by multiple code
                 // points, such as upper case Eszett of German alphabet.
diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java
index 1e1f439d4d84de54ff14c819f4a8a4f4c6272459..6653dec4b4c7580c6a829bcf7e1d6da57ff3b1b5 100644
--- a/java/src/com/android/inputmethod/keyboard/Keyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java
@@ -121,9 +121,6 @@ public class Keyboard {
     /** Maximum column for mini keyboard */
     public final int mMaxMiniKeyboardColumn;
 
-    /** True if Right-To-Left keyboard */
-    public final boolean mIsRtlKeyboard;
-
     /** List of keys and icons in this keyboard */
     public final Set<Key> mKeys;
     public final Set<Key> mShiftKeys;
@@ -140,7 +137,6 @@ public class Keyboard {
         mOccupiedWidth = params.mOccupiedWidth;
         mMostCommonKeyHeight = params.mMostCommonKeyHeight;
         mMostCommonKeyWidth = params.mMostCommonKeyWidth;
-        mIsRtlKeyboard = params.mIsRtlKeyboard;
         mMoreKeysTemplate = params.mMoreKeysTemplate;
         mMaxMiniKeyboardColumn = params.mMaxMiniKeyboardColumn;
 
@@ -222,7 +218,6 @@ public class Keyboard {
         public int mHorizontalGap;
         public int mVerticalGap;
 
-        public boolean mIsRtlKeyboard;
         public int mMoreKeysTemplate;
         public int mMaxMiniKeyboardColumn;
 
@@ -739,8 +734,6 @@ public class Keyboard {
                         R.styleable.Keyboard_rowHeight, params.mBaseHeight,
                         params.mBaseHeight / DEFAULT_KEYBOARD_ROWS);
 
-                params.mIsRtlKeyboard = keyboardAttr.getBoolean(
-                        R.styleable.Keyboard_isRtlKeyboard, false);
                 params.mMoreKeysTemplate = keyboardAttr.getResourceId(
                         R.styleable.Keyboard_moreKeysTemplate, 0);
                 params.mMaxMiniKeyboardColumn = keyAttr.getInt(
diff --git a/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java
index 974291373dad0376e193f85de750caec079bcf39..433bd0d753a4793cba98c916204d9b7fabd9345b 100644
--- a/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java
@@ -210,7 +210,6 @@ public class MiniKeyboard extends Keyboard {
             // TODO: Mini keyboard's vertical gap is currently calculated heuristically.
             // Should revise the algorithm.
             mParams.mVerticalGap = parentKeyboard.mVerticalGap / 2;
-            mParams.mIsRtlKeyboard = parentKeyboard.mIsRtlKeyboard;
             mMoreKeys = parentKey.mMoreKeys;
 
             final int previewWidth = view.mKeyPreviewDrawParams.mPreviewBackgroundWidth;