diff --git a/java/res/values-fa/donottranslate-more-keys.xml b/java/res/values-fa/donottranslate-more-keys.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3e13c795a4c7e718fe5522ab31697ab3234da366
--- /dev/null
+++ b/java/res/values-fa/donottranslate-more-keys.xml
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** 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.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- U+061F: "ØŸ" ARABIC QUESTION MARK
+         U+060C: "،" ARABIC COMMA
+         U+061B: "Ø›" ARABIC SEMICOLON -->
+    <!-- U+0650: "ِ" ARABIC KASRA
+         U+064E: "ÙŽ" ARABIC FATHA
+         U+064D: "ٍ" ARABIC KASRATAN
+         U+064B: "Ù‹" ARABIC FATHATAN
+         U+0656: "Ù–" ARABIC SUBSCRIPT ALEF
+         U+0670: "Ù°" ARABIC LETTER SUPERSCRIPT ALEF
+         U+0655: "Ù•" ARABIC HAMZA BELOW
+         U+0654: "Ù”" ARABIC HAMZA ABOVE -->
+    <!-- U+064F: "ُ" ARABIC DAMMA
+         U+064C: "ٌ" ARABIC DAMMATAN
+         U+0651: "Ù‘" ARABIC SHADDA
+         U+0652: "Ù’" ARABIC SUKUN
+         U+0653: "Ù“" ARABIC MADDAH ABOVE
+         U+0640: "Ù€" ARABIC TATWEEL -->
+    <!-- In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label. -->
+    <string name="more_keys_for_punctuation">"!fixedColumnOrder!8,\",\',-,:,!,&#x061F;,&#x060C;,&#x061B;,&#x0650;,&#x064E;,&#x064D;,&#x064B;,&#x0656;,&#x0670;,&#x0655;,&#x0654;,&#x064F;,&#x064C;,&#x0651;,&#x0652;,&#x0653;,&#x0640;&#x0640;&#x0640;|&#x0640;,/"</string>
+    <string name="keyhintlabel_for_punctuation">&#x064B;</string>
+    <!-- U+0661: "Ù¡" ARABIC-INDIC DIGIT ONE -->
+    <string name="keylabel_for_symbols_1">&#x0661;</string>
+    <!-- U+0662: "Ù¢" ARABIC-INDIC DIGIT TWO -->
+    <string name="keylabel_for_symbols_2">&#x0662;</string>
+    <!-- U+0663: "Ù£" ARABIC-INDIC DIGIT THREE -->
+    <string name="keylabel_for_symbols_3">&#x0663;</string>
+    <!-- U+0664: "Ù¤" ARABIC-INDIC DIGIT FOUR -->
+    <string name="keylabel_for_symbols_4">&#x0664;</string>
+    <!-- U+0665: "Ù¥" ARABIC-INDIC DIGIT FIVE -->
+    <string name="keylabel_for_symbols_5">&#x0665;</string>
+    <!-- U+0666: "Ù¦" ARABIC-INDIC DIGIT SIX -->
+    <string name="keylabel_for_symbols_6">&#x0666;</string>
+    <!-- U+0667: "Ù§" ARABIC-INDIC DIGIT SEVEN -->
+    <string name="keylabel_for_symbols_7">&#x0667;</string>
+    <!-- U+0668: "Ù¨" ARABIC-INDIC DIGIT EIGHT -->
+    <string name="keylabel_for_symbols_8">&#x0668;</string>
+    <!-- U+0669: "Ù©" ARABIC-INDIC DIGIT NINE -->
+    <string name="keylabel_for_symbols_9">&#x0669;</string>
+    <!-- U+0660: "Ù " ARABIC-INDIC DIGIT ZERO -->
+    <string name="keylabel_for_symbols_0">&#x0660;</string>
+    <string name="additional_more_keys_for_symbols_1">1</string>
+    <string name="additional_more_keys_for_symbols_2">2</string>
+    <string name="additional_more_keys_for_symbols_3">3</string>
+    <string name="additional_more_keys_for_symbols_4">4</string>
+    <string name="additional_more_keys_for_symbols_5">5</string>
+    <string name="additional_more_keys_for_symbols_6">6</string>
+    <string name="additional_more_keys_for_symbols_7">7</string>
+    <string name="additional_more_keys_for_symbols_8">8</string>
+    <string name="additional_more_keys_for_symbols_9">9</string>
+    <!-- U+066B: "Ù«" ARABIC DECIMAL SEPARATOR
+         U+066C: "Ù¬" ARABIC THOUSANDS SEPARATOR -->
+    <string name="additional_more_keys_for_symbols_0">0,&#x066B;,&#x066C;</string>
+    <!-- U+060C: "،" ARABIC COMMA -->
+    <string name="keylabel_for_comma">&#x060C;</string>
+    <string name="more_keys_for_comma">"\\,"</string>
+    <string name="keylabel_for_symbols_question">&#x061F;</string>
+    <string name="keylabel_for_symbols_semicolon">&#x061B;</string>
+    <!-- U+066A: "Ùª" ARABIC PERCENT SIGN -->
+    <string name="keylabel_for_symbols_percent">&#x066A;</string>
+    <string name="more_keys_for_symbols_question">\?</string>
+    <string name="more_keys_for_symbols_semicolon">;</string>
+    <!-- U+2030: "‰" PER MILLE SIGN -->
+    <string name="more_keys_for_symbols_percent">%,&#x2030;</string>
+    <!-- U+060C: "،" ARABIC COMMA
+         U+061B: "Ø›" ARABIC SEMICOLON
+         U+061F: "ØŸ" ARABIC QUESTION MARK -->
+    <string name="keylabel_for_apostrophe">&#x060C;</string>
+    <string name="keylabel_for_dash">"."</string>
+    <string name="keyhintlabel_for_apostrophe">&#x061F;</string>
+    <string name="keyhintlabel_for_dash">&#x064B;</string>
+    <string name="more_keys_for_apostrophe">"&#x061F;,&#x061B;,!,:,-,/,\',\""</string>
+    <!-- U+0651: "Ù‘" ARABIC SHADDA
+         U+0652: "Ù’" ARABIC SUKUN
+         U+064C: "ٌ" ARABIC DAMMATAN
+         U+0653: "Ù“" ARABIC MADDAH ABOVE
+         U+064F: "ُ" ARABIC DAMMA -->
+    <!-- U+0650: "ِ" ARABIC KASRA
+         U+064E: "ÙŽ" ARABIC FATHA
+         U+064B: "Ù‹" ARABIC FATHATAN
+         U+0640: "Ù€" ARABIC TATWEEL
+         U+064D: "ٍ" ARABIC KASRATAN -->
+    <!-- U+0670: "Ù°" ARABIC LETTER SUPERSCRIPT ALEF
+         U+0656: "Ù–" ARABIC SUBSCRIPT ALEF
+         U+0654: "Ù”" ARABIC HAMZA ABOVE
+         U+0655: "Ù•" ARABIC HAMZA BELOW -->
+    <!-- In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label. -->
+    <string name="more_keys_for_dash">"&#x0651;,&#x0652;,&#x064C;,&#x0653;,&#x064F;,&#x0650;,&#x064E;,&#x064B;,&#x0640;&#x0640;&#x0640;|&#x0640;,&#x064D;,&#x0654;,&#x0656;,&#x0655;,&#x0670;"</string>
+    <!-- U+266A: "♪" EIGHTH NOTE -->
+    <string name="more_keys_for_bullet">&#x266A;</string>
+    <!-- U+2605: "★" BLACK STAR
+         U+066D: "Ù­" ARABIC FIVE POINTED STAR -->
+    <string name="more_keys_for_star">&#x2605;,&#x066D;</string>
+    <!-- The all letters need to be mirrored are found at
+         http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt -->
+    <!-- U+0029: ")" RIGHT PARENTHESIS -->
+    <integer name="keycode_for_left_parenthesis">0x0029</integer>
+    <!-- U+0028: "(" LEFT PARENTHESIS -->
+    <integer name="keycode_for_right_parenthesis">0x0028</integer>
+    <!-- U+FD3E: "ï´¾" ORNATE LEFT PARENTHESIS
+         U+FD3F: "ï´¿" ORNATE RIGHT PARENTHESIS -->
+    <!-- TODO: DroidSansArabic lacks the glyph of U+FD3E ORNATE LEFT PARENTHESIS -->
+    <!-- TODO: DroidSansArabic lacks the glyph of U+FD3F ORNATE RIGHT PARENTHESIS -->
+    <string name="more_keys_for_left_parenthesis">!fixedColumnOrder!4,&#xFD3E;|&#xFD3F;,&lt;|&gt;,{|},[|]</string>
+    <string name="more_keys_for_right_parenthesis">!fixedColumnOrder!4,&#xFD3F;|&#xFD3E;,&gt;|&lt;,}|{,]|[</string>
+    <!-- U+003E: ">" GREATER-THAN SIGN -->
+    <integer name="keycode_for_less_than">0x003E</integer>
+    <!-- U+003C: "<" LESS-THAN SIGN -->
+    <integer name="keycode_for_greater_than">0x003C</integer>
+    <!-- U+2264: "≤" LESS-THAN OR EQUAL TO
+         U+2265: "≥" GREATER-THAN EQUAL TO
+         U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+         U+00BB: "»" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+         U+2039: "‹" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+         U+203A: "›" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+         The following characters don't need BIDI mirroring.
+         U+2018: "‘" LEFT SINGLE QUOTATION MARK
+         U+2019: "’" RIGHT SINGLE QUOTATION MARK
+         U+201A: "‚" SINGLE LOW-9 QUOTATION MARK
+         U+201B: "‛" SINGLE HIGH-REVERSED-9 QUOTATION MARK
+         U+201C: "“" LEFT DOUBLE QUOTATION MARK
+         U+201D: "”" RIGHT DOUBLE QUOTATION MARK
+         U+201E: "„" DOUBLE LOW-9 QUOTATION MARK
+         U+201F: "‟" DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
+    <string name="more_keys_for_less_than">!fixedColumnOrder!3,&#x2039;|&#x203A;,&#x2264;|&#x2265;,&#x00AB;|&#x00BB;</string>
+    <string name="more_keys_for_greater_than">!fixedColumnOrder!3,&#x203A;|&#x2039;,&#x2265;|&#x2264;,&#x00BB;|&#x00AB;</string>
+    <!-- U+005D: "]" RIGHT SQUARE BRACKET -->
+    <integer name="keycode_for_left_square_bracket">0x005D</integer>
+    <!-- U+005B: "[" LEFT SQUARE BRACKET -->
+    <integer name="keycode_for_right_square_bracket">0x005B</integer>
+    <!-- U+007D: "}" RIGHT CURLY BRACKET -->
+    <integer name="keycode_for_left_curly_bracket">0x007D</integer>
+    <!-- U+007B: "{" LEFT CURLY BRACKET -->
+    <integer name="keycode_for_right_curly_bracket">0x007B</integer>
+    <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
+    <!-- <string name="more_keys_for_double_quote">&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;</string> -->
+    <string name="more_keys_for_double_quote">!fixedColumnOrder!4,&#x201C;,&#x201D;,&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;</string>
+    <!-- TODO: Neither DroidSans nor Roboto have the glyph for U+201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK -->
+    <!-- <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!6,&#x201C;,&#x201D;,&#x201E;,&#x201F;,&#x00AB;|&#x00BB;,&#x00BB|&#x00AB;;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string> -->
+    <string name="more_keys_for_tablet_double_quote">!fixedColumnOrder!4,&#x201C;,&#x201D;,&#x00AB;|&#x00BB;,&#x00BB;|&#x00AB;,&#x2018;,&#x2019;,&#x201A;,&#x201B;</string>
+</resources>
diff --git a/java/res/values-fa/donottranslate.xml b/java/res/values-fa/donottranslate.xml
new file mode 100644
index 0000000000000000000000000000000000000000..57de2538bf8fb5cf305a414d8843cdd6507c7271
--- /dev/null
+++ b/java/res/values-fa/donottranslate.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** 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.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<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.1.0/ucd/BidiMirroring.txt -->
+    <!-- Symbols that are suggested between words -->
+    <string name="suggested_punctuations">!,?,\\,,:,;,\",(|),)|(,\',-,/,@,_</string>
+</resources>
diff --git a/java/res/xml-fa/keyboard_set.xml b/java/res/xml-fa/keyboard_set.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9bd105093884c6682756243906c4de5067c82425
--- /dev/null
+++ b/java/res/xml-fa/keyboard_set.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** 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.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<KeyboardSet
+    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
+    latin:keyboardLocale="fa" >
+    <Element
+        latin:elementName="alphabet"
+        latin:elementKeyboard="@xml/kbd_arabic" />
+    <Element
+        latin:elementName="symbols"
+        latin:elementKeyboard="@xml/kbd_symbols" />
+    <Element
+        latin:elementName="symbolsShifted"
+        latin:elementKeyboard="@xml/kbd_symbols_shift" />
+    <Element
+        latin:elementName="phone"
+        latin:elementKeyboard="@xml/kbd_phone" />
+    <Element
+        latin:elementName="phoneSymbols"
+        latin:elementKeyboard="@xml/kbd_phone_symbols" />
+    <Element
+        latin:elementName="number"
+        latin:elementKeyboard="@xml/kbd_number" />
+</KeyboardSet>
diff --git a/java/res/xml-sw600dp/key_styles_common.xml b/java/res/xml-sw600dp/key_styles_common.xml
index 2fa8b3812f740c0bc3cd6a3080f24ec82d62e53d..b206f0e549b565ef4ff9d5abc0afb1540174f74f 100644
--- a/java/res/xml-sw600dp/key_styles_common.xml
+++ b/java/res/xml-sw600dp/key_styles_common.xml
@@ -79,9 +79,12 @@
         latin:code="@integer/key_space"
         latin:keyActionFlags="noKeyPreview" />
     <key-style
-        latin:styleName="nonSpecialBackgroundSpaceKeyStyle"
-        latin:code="@integer/key_space"
-        latin:keyActionFlags="noKeyPreview" />
+        latin:styleName="zwnjKeyStyle"
+        latin:keyLabel="&#x200C;"
+        latin:moreKeys="&#x200D;"
+        latin:keyLabelFlags="hasPopupHint"
+        latin:altCode="@integer/key_space"
+        latin:keyActionFlags="altCodeWhileTyping" />
     <key-style
         latin:styleName="smileyKeyStyle"
         latin:keyLabel=":-)"
diff --git a/java/res/xml-sw600dp/row_qwerty4.xml b/java/res/xml-sw600dp/row_qwerty4.xml
index 3c2f06d02de0b593bb36e31a20370de06e2b1fca..eec35b0780aac716bbef294431310d7ddd520c4c 100644
--- a/java/res/xml-sw600dp/row_qwerty4.xml
+++ b/java/res/xml-sw600dp/row_qwerty4.xml
@@ -50,10 +50,24 @@
                     latin:keyStyle="hasShiftedLetterHintStyle" />
             </default>
         </switch>
-        <Key
-            latin:keyStyle="spaceKeyStyle"
-            latin:keyXPos="30.750%p"
-            latin:keyWidth="39.750%p" />
+        <switch>
+            <case
+                latin:languageCode="fa"
+            >
+                <Key
+                    latin:keyStyle="spaceKeyStyle"
+                    latin:keyXPos="30.750%p"
+                    latin:keyWidth="30.850%p" />
+                <Key
+                    latin:keyStyle="zwnjKeyStyle" />
+            </case>
+            <default>
+                <Key
+                    latin:keyStyle="spaceKeyStyle"
+                    latin:keyXPos="30.750%p"
+                    latin:keyWidth="39.750%p" />
+            </default>
+        </switch>
         <switch>
             <case
                 latin:languageCode="iw"
diff --git a/java/res/xml-sw600dp/rows_number_normal.xml b/java/res/xml-sw600dp/rows_number_normal.xml
index 3704c5284a3937795b29403eb8c44a6e203f4d31..be5776b20c628025cb324c62e09ba1198906e1f1 100644
--- a/java/res/xml-sw600dp/rows_number_normal.xml
+++ b/java/res/xml-sw600dp/rows_number_normal.xml
@@ -143,7 +143,7 @@
             latin:keyStyle="numTabKeyStyle"
             latin:keyWidth="11.00%p" />
         <Key
-            latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
+            latin:keyStyle="spaceKeyStyle"
             latin:keyWidth="27.75%p"
             latin:keyXPos="12.75%p" />
         <Key
diff --git a/java/res/xml-sw600dp/rows_phone.xml b/java/res/xml-sw600dp/rows_phone.xml
index 4c896e962fea44c33e78d625c43e9e79de30a835..e8926936f56e8865a739467f21f3e86f23ddc03a 100644
--- a/java/res/xml-sw600dp/rows_phone.xml
+++ b/java/res/xml-sw600dp/rows_phone.xml
@@ -112,7 +112,7 @@
             latin:keyStyle="numTabKeyStyle"
             latin:keyWidth="11.00%p" />
         <Key
-            latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
+            latin:keyStyle="spaceKeyStyle"
             latin:keyWidth="27.75%p"
             latin:keyXPos="12.75%p" />
         <Key
diff --git a/java/res/xml-sw768dp/key_styles_common.xml b/java/res/xml-sw768dp/key_styles_common.xml
index 5c35f1cfb73a2aad3ccf899a619a1085cd9ee0b9..069fc63b96ec5cb7717dbaa9d1ae0e49ca3cbe8e 100644
--- a/java/res/xml-sw768dp/key_styles_common.xml
+++ b/java/res/xml-sw768dp/key_styles_common.xml
@@ -78,9 +78,12 @@
         latin:code="@integer/key_space"
         latin:keyActionFlags="noKeyPreview" />
     <key-style
-        latin:styleName="nonSpecialBackgroundSpaceKeyStyle"
-        latin:code="@integer/key_space"
-        latin:keyActionFlags="noKeyPreview" />
+        latin:styleName="zwnjKeyStyle"
+        latin:keyLabel="&#x200C;"
+        latin:moreKeys="&#x200D;"
+        latin:keyLabelFlags="hasPopupHint"
+        latin:altCode="@integer/key_space"
+        latin:keyActionFlags="altCodeWhileTyping" />
     <key-style
         latin:styleName="smileyKeyStyle"
         latin:keyLabel=":-)"
diff --git a/java/res/xml-sw768dp/row_qwerty4.xml b/java/res/xml-sw768dp/row_qwerty4.xml
index 24c081eb7a529a52090905be07ba34f1af3416ce..0aa04f8f76e4846917ceb18a56c497dceb40df75 100644
--- a/java/res/xml-sw768dp/row_qwerty4.xml
+++ b/java/res/xml-sw768dp/row_qwerty4.xml
@@ -76,10 +76,30 @@
                 </switch>
             </default>
         </switch>
-        <Key
-            latin:keyStyle="spaceKeyStyle"
-            latin:keyXPos="31.250%p"
-            latin:keyWidth="37.500%p" />
+        <switch>
+            <case
+                latin:languageCode="fa"
+            >
+                <Key
+                    latin:keyStyle="spaceKeyStyle"
+                    latin:keyXPos="31.250%p"
+                    latin:keyWidth="29.453%p" />
+                <!-- U+200C: "" ZERO WIDTH NON-JOINER
+                     U+200D: "" ZERO WIDTH JOINER -->
+                <Key
+                    latin:keyLabel="&#x200C;"
+                    latin:moreKeys="&#x200D;"
+                    latin:keyLabelFlags="hasPopupHint"
+                    latin:altCode="@integer/key_space"
+                    latin:keyActionFlags="altCodeWhileTyping" />
+            </case>
+            <default>
+                <Key
+                    latin:keyStyle="spaceKeyStyle"
+                    latin:keyXPos="31.250%p"
+                    latin:keyWidth="37.500%p" />
+            </default>
+        </switch>
         <switch>
             <case
                 latin:languageCode="iw"
diff --git a/java/res/xml-sw768dp/rows_number_normal.xml b/java/res/xml-sw768dp/rows_number_normal.xml
index 8bf1a173f49b8686803486e1767f7c92bc627a9e..2eeb6c9d4a8da012163d3f5b37505c46d80d3bba 100644
--- a/java/res/xml-sw768dp/rows_number_normal.xml
+++ b/java/res/xml-sw768dp/rows_number_normal.xml
@@ -145,7 +145,7 @@
             latin:keyboardLayout="@xml/key_settings"
             latin:keyWidth="8.047%p" />
         <Key
-            latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
+            latin:keyStyle="spaceKeyStyle"
             latin:keyXPos="13.829%p"
             latin:keyWidth="24.140%p" />
         <Key
diff --git a/java/res/xml-sw768dp/rows_phone.xml b/java/res/xml-sw768dp/rows_phone.xml
index 69c9e86ff04fe14465dc3fc9077a09e56cabcb7a..216fbedfb55cd8fca1de8ec98ed3b4ff93b3d9a9 100644
--- a/java/res/xml-sw768dp/rows_phone.xml
+++ b/java/res/xml-sw768dp/rows_phone.xml
@@ -114,7 +114,7 @@
             latin:keyboardLayout="@xml/key_settings"
             latin:keyWidth="8.047%p" />
         <Key
-            latin:keyStyle="nonSpecialBackgroundSpaceKeyStyle"
+            latin:keyStyle="spaceKeyStyle"
             latin:keyXPos="13.829%p"
             latin:keyWidth="24.140%p" />
         <Key
diff --git a/java/res/xml/key_styles_common.xml b/java/res/xml/key_styles_common.xml
index f153a7d96b6183a04e4bcdc8bac5f6122db89b40..7b526c07f166e98e21f3a7b3527e2418e2e42d94 100644
--- a/java/res/xml/key_styles_common.xml
+++ b/java/res/xml/key_styles_common.xml
@@ -107,6 +107,14 @@
         latin:code="@integer/key_space"
         latin:keyActionFlags="noKeyPreview|enableLongPress"
         latin:backgroundType="functional" />
+    <key-style
+        latin:styleName="zwnjKeyStyle"
+        latin:keyLabel="&#x200C;"
+        latin:moreKeys="&#x200D;"
+        latin:keyLabelFlags="hasPopupHint"
+        latin:altCode="@integer/key_space"
+        latin:keyActionFlags="altCodeWhileTyping"
+        latin:backgroundType="functional" />
     <key-style
         latin:styleName="shortcutKeyStyle"
         latin:code="@integer/key_shortcut"
@@ -123,6 +131,8 @@
         latin:keyActionFlags="noKeyPreview|altCodeWhileTyping|enableLongPress"
         latin:altCode="@integer/key_space"
         latin:backgroundType="functional" />
+    <!-- U+200C: "" ZERO WIDTH NON-JOINER
+         U+200D: "" ZERO WIDTH JOINER -->
     <key-style
         latin:styleName="tabKeyStyle"
         latin:code="@integer/key_tab"
diff --git a/java/res/xml/method.xml b/java/res/xml/method.xml
index f330b268e8c31b88b8ccaa57b5657226ae0ba5c8..cdcea0ed00d6ceca08dfd075559dcf420708feb0 100644
--- a/java/res/xml/method.xml
+++ b/java/res/xml/method.xml
@@ -33,6 +33,7 @@
     en_GB: English Great Britain/qwerty
     es: Spanish/spanish
     et: Estonian/nordic
+    fa: Persian/arabic
     fi: Finnish/nordic
     fr: French/azerty
     fr_CA: French Canada/qwerty
@@ -138,6 +139,12 @@
             android:imeSubtypeMode="keyboard"
             android:imeSubtypeExtraValue="AsciiCapable,SupportTouchPositionCorrection"
     />
+    <subtype android:icon="@drawable/ic_subtype_keyboard"
+            android:label="@string/subtype_generic"
+            android:imeSubtypeLocale="fa"
+            android:imeSubtypeMode="keyboard"
+            android:imeSubtypeExtraValue="SupportTouchPositionCorrection"
+    />
     <subtype android:icon="@drawable/ic_subtype_keyboard"
             android:label="@string/subtype_generic"
             android:imeSubtypeLocale="fi"
diff --git a/java/res/xml/row_qwerty4.xml b/java/res/xml/row_qwerty4.xml
index 0dd2177e82d2927e3d1d1660d9c4ac569c8cdff0..b2b47e9b5322dadc47d2c8978b3112ee0beea72a 100644
--- a/java/res/xml/row_qwerty4.xml
+++ b/java/res/xml/row_qwerty4.xml
@@ -58,6 +58,28 @@
             </default>
         </switch>
         <switch>
+            <case
+                latin:languageCode="fa"
+                latin:languageSwitchKeyEnabled="true"
+            >
+                <Key
+                    latin:keyStyle="languageSwitchKeyStyle" />
+                <Key
+                    latin:keyStyle="spaceKeyStyle"
+                    latin:keyWidth="30%p" />
+                <Key
+                    latin:keyStyle="zwnjKeyStyle" />
+            </case>
+            <case
+                latin:languageCode="fa"
+                latin:languageSwitchKeyEnabled="false"
+            >
+                <Key
+                    latin:keyStyle="spaceKeyStyle"
+                    latin:keyWidth="40%p" />
+                <Key
+                    latin:keyStyle="zwnjKeyStyle" />
+            </case>
             <case
                 latin:languageSwitchKeyEnabled="true"
             >