Merge "Remove unused keyPreviewIcon attributes"
diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml
index e71d951..550e71a 100644
--- a/java/res/xml/prefs.xml
+++ b/java/res/xml/prefs.xml
@@ -103,6 +103,13 @@
             android:title="@string/gesture_preview_trail"
             android:defaultValue="true"
             android:persistent="true" />
+        <CheckBoxPreference
+            android:key="pref_gesture_space_aware"
+            android:dependency="gesture_input"
+            android:title="@string/gesture_space_aware"
+            android:summary="@string/gesture_space_aware_summary"
+            android:defaultValue="true"
+            android:persistent="true" />
     </PreferenceScreen>
     <PreferenceScreen
         android:title="@string/settings_screen_correction"
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
index 6afc621..6edc56c 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java
@@ -160,29 +160,29 @@
         /*  74: 3 */ "keyspec_right_double_angle_quote",
         /*  75: 3 */ "keyspec_left_single_angle_quote",
         /*  76: 3 */ "keyspec_right_single_angle_quote",
-        /*  77: 3 */ "morekeys_tablet_comma",
-        /*  78: 3 */ "keyhintlabel_period",
-        /*  79: 3 */ "morekeys_tablet_period",
-        /*  80: 3 */ "morekeys_question",
-        /*  81: 2 */ "morekeys_h",
-        /*  82: 2 */ "morekeys_w",
-        /*  83: 2 */ "morekeys_east_slavic_row2_2",
-        /*  84: 2 */ "morekeys_cyrillic_u",
-        /*  85: 2 */ "morekeys_cyrillic_en",
-        /*  86: 2 */ "morekeys_cyrillic_ghe",
-        /*  87: 2 */ "morekeys_cyrillic_o",
-        /*  88: 2 */ "morekeys_cyrillic_i",
-        /*  89: 2 */ "keyspec_south_slavic_row1_6",
-        /*  90: 2 */ "keyspec_south_slavic_row2_11",
-        /*  91: 2 */ "keyspec_south_slavic_row3_1",
-        /*  92: 2 */ "keyspec_south_slavic_row3_8",
-        /*  93: 2 */ "morekeys_tablet_punctuation",
-        /*  94: 2 */ "keyspec_spanish_row2_10",
-        /*  95: 2 */ "morekeys_bullet",
-        /*  96: 2 */ "morekeys_left_parenthesis",
-        /*  97: 2 */ "morekeys_right_parenthesis",
-        /*  98: 2 */ "morekeys_arabic_diacritics",
-        /*  99: 2 */ "keyspec_comma",
+        /*  77: 3 */ "keyspec_comma",
+        /*  78: 3 */ "morekeys_tablet_comma",
+        /*  79: 3 */ "keyhintlabel_period",
+        /*  80: 3 */ "morekeys_tablet_period",
+        /*  81: 3 */ "morekeys_question",
+        /*  82: 2 */ "morekeys_h",
+        /*  83: 2 */ "morekeys_w",
+        /*  84: 2 */ "morekeys_east_slavic_row2_2",
+        /*  85: 2 */ "morekeys_cyrillic_u",
+        /*  86: 2 */ "morekeys_cyrillic_en",
+        /*  87: 2 */ "morekeys_cyrillic_ghe",
+        /*  88: 2 */ "morekeys_cyrillic_o",
+        /*  89: 2 */ "morekeys_cyrillic_i",
+        /*  90: 2 */ "keyspec_south_slavic_row1_6",
+        /*  91: 2 */ "keyspec_south_slavic_row2_11",
+        /*  92: 2 */ "keyspec_south_slavic_row3_1",
+        /*  93: 2 */ "keyspec_south_slavic_row3_8",
+        /*  94: 2 */ "morekeys_tablet_punctuation",
+        /*  95: 2 */ "keyspec_spanish_row2_10",
+        /*  96: 2 */ "morekeys_bullet",
+        /*  97: 2 */ "morekeys_left_parenthesis",
+        /*  98: 2 */ "morekeys_right_parenthesis",
+        /*  99: 2 */ "morekeys_arabic_diacritics",
         /* 100: 2 */ "keyhintlabel_tablet_comma",
         /* 101: 2 */ "keyspec_period",
         /* 102: 2 */ "morekeys_period",
@@ -324,6 +324,8 @@
         /* keyspec_right_double_angle_quote */ "\u00BB",
         /* keyspec_left_single_angle_quote */ "\u2039",
         /* keyspec_right_single_angle_quote */ "\u203A",
+        // Comma key
+        /* keyspec_comma */ ",",
         /* morekeys_tablet_comma */ EMPTY,
         /* keyhintlabel_period */ EMPTY,
         /* morekeys_tablet_period */ "!text/morekeys_tablet_punctuation",
@@ -344,8 +346,6 @@
         /* morekeys_left_parenthesis */ "!fixedColumnOrder!3,!text/keyspecs_left_parenthesis_more_keys",
         /* morekeys_right_parenthesis */ "!fixedColumnOrder!3,!text/keyspecs_right_parenthesis_more_keys",
         /* morekeys_arabic_diacritics */ EMPTY,
-        // Comma key
-        /* keyspec_comma */ ",",
         /* keyhintlabel_tablet_comma */ EMPTY,
         // Period key
         /* keyspec_period */ ".",
@@ -605,6 +605,8 @@
         /* keyspec_right_double_angle_quote */ "\u00BB|\u00AB",
         /* keyspec_left_single_angle_quote */ "\u2039|\u203A",
         /* keyspec_right_single_angle_quote */ "\u203A|\u2039",
+        // U+060C: "،" ARABIC COMMA
+        /* keyspec_comma */ "\u060C",
         /* morekeys_tablet_comma */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,\",\'",
         // U+0651: "ّ" ARABIC SHADDA
         /* keyhintlabel_period */ "\u0651",
@@ -639,8 +641,6 @@
         // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label.
         // Note: The space character is needed as a preceding letter to draw Arabic diacritics characters correctly.
         /* morekeys_arabic_diacritics */ "!fixedColumnOrder!7, \u0655|\u0655, \u0654|\u0654, \u0652|\u0652, \u064D|\u064D, \u064C|\u064C, \u064B|\u064B, \u0651|\u0651, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u0650|\u0650, \u064F|\u064F, \u064E|\u064E,\u0640\u0640\u0640|\u0640",
-        // U+060C: "،" ARABIC COMMA
-        /* keyspec_comma */ "\u060C",
         /* keyhintlabel_tablet_comma */ "\u061F",
         /* keyspec_period */ null,
         /* morekeys_period */ "!text/morekeys_arabic_diacritics",
@@ -839,7 +839,7 @@
         /* keyspec_tablet_comma ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null,
         /* ~ keyspec_south_slavic_row3_8 */
         /* morekeys_tablet_punctuation */ "!autoColumnOrder!8,\\,,',\u00B7,#,),(,/,;,@,:,-,\",+,\\%,&",
         // U+00E7: "ç" LATIN SMALL LETTER C WITH CEDILLA
@@ -1242,7 +1242,7 @@
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         /* ~ morekeys_question */
         // U+0125: "ĥ" LATIN SMALL LETTER H WITH CIRCUMFLEX
         // U+0127: "ħ" LATIN SMALL LETTER H WITH STROKE
@@ -1255,7 +1255,7 @@
         // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX
         /* keyspec_spanish_row2_10 */ "\u0135",
         /* morekeys_bullet ~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         /* ~ morekeys_symbols_percent */
         // U+0175: "ŵ" LATIN SMALL LETTER W WITH CIRCUMFLEX
         /* morekeys_v */ "w,\u0175",
@@ -1576,6 +1576,8 @@
         /* keyspec_right_double_angle_quote */ "\u00BB|\u00AB",
         /* keyspec_left_single_angle_quote */ "\u2039|\u203A",
         /* keyspec_right_single_angle_quote */ "\u203A|\u2039",
+        // U+060C: "،" ARABIC COMMA
+        /* keyspec_comma */ "\u060C",
         /* morekeys_tablet_comma */ "!fixedColumnOrder!4,:,!,\u061F,\u061B,-,!text/keyspec_left_double_angle_quote,!text/keyspec_right_double_angle_quote",
         // U+064B: "ً" ARABIC FATHATAN
         /* keyhintlabel_period */ "\u064B",
@@ -1610,8 +1612,6 @@
         // In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label.
         // Note: The space character is needed as a preceding letter to draw Arabic diacritics characters correctly.
         /* morekeys_arabic_diacritics */ "!fixedColumnOrder!7, \u0655|\u0655, \u0652|\u0652, \u0651|\u0651, \u064C|\u064C, \u064D|\u064D, \u064B|\u064B, \u0654|\u0654, \u0656|\u0656, \u0670|\u0670, \u0653|\u0653, \u064F|\u064F, \u0650|\u0650, \u064E|\u064E,\u0640\u0640\u0640|\u0640",
-        // U+060C: "،" ARABIC COMMA
-        /* keyspec_comma */ "\u060C",
         /* keyhintlabel_tablet_comma */ "\u061F",
         /* keyspec_period */ null,
         /* morekeys_period */ "!text/morekeys_arabic_diacritics",
@@ -1982,23 +1982,26 @@
         // U+00AB: "«" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
         // U+055F: "՟" ARMENIAN ABBREVIATION MARK
         /* morekeys_punctuation */ "!autoColumnOrder!8,\\,,\u055E,\u055C,.,\u055A,\u0559,?,!,\u055D,\u055B,\u058A,\u00BB,\u00AB,\u055F,;,:",
+        /* keyspec_tablet_comma */ "\u055D",
+        /* keyspec_swiss_row1_11 ~ */
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null,
+        /* ~ keyspec_right_single_angle_quote */
         // U+058F: "֏" ARMENIAN DRAM SIGN
         // TODO: Enable this when we have glyph for the following letter
         // <string name="keyspec_currency">&#x058F;</string>
         // 
         // U+055D: "՝" ARMENIAN COMMA
-        /* keyspec_tablet_comma */ "\u055D",
-        /* keyspec_swiss_row1_11 ~ */
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null,
-        /* ~ keyhintlabel_period */
+        /* keyspec_comma */ "\u055D",
+        /* morekeys_tablet_comma */ null,
+        /* keyhintlabel_period */ null,
         /* morekeys_tablet_period */ "!text/morekeys_punctuation",
         // U+055E: "՞" ARMENIAN QUESTION MARK
         // U+00BF: "¿" INVERTED QUESTION MARK
         /* morekeys_question */ "\u055E,\u00BF",
         /* morekeys_h ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null,
+        null, null, null, null,
         /* ~ keyhintlabel_tablet_comma */
         // U+0589: "։" ARMENIAN FULL STOP
         /* keyspec_period */ "\u0589",
@@ -2183,7 +2186,7 @@
         /* keyspec_right_double_angle_quote */ "\u00BB|\u00AB",
         /* keyspec_left_single_angle_quote */ "\u2039|\u203A",
         /* keyspec_right_single_angle_quote */ "\u203A|\u2039",
-        /* morekeys_tablet_comma ~ */
+        /* keyspec_comma ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
@@ -2242,7 +2245,7 @@
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
+        null, null, null, null, null, null, null,
         /* ~ morekeys_w */
         // U+0456: "і" CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
         /* morekeys_east_slavic_row2_2 */ "\u0456",
@@ -2257,7 +2260,7 @@
         /* morekeys_cyrillic_o */ "\u04E9",
         /* morekeys_cyrillic_i ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         /* ~ keyspec_x */
         // U+04BB: "һ" CYRILLIC SMALL LETTER SHHA
         /* morekeys_east_slavic_row2_11 */ "\u04BB",
@@ -2324,7 +2327,7 @@
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null,
         /* ~ morekeys_east_slavic_row2_2 */
         // U+04AF: "ү" CYRILLIC SMALL LETTER STRAIGHT U
         /* morekeys_cyrillic_u */ "\u04AF",
@@ -2565,7 +2568,7 @@
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null,
+        null, null, null, null, null, null,
         /* ~ morekeys_cyrillic_o */
         // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE
         /* morekeys_cyrillic_i */ "\u045D",
@@ -2671,8 +2674,8 @@
         /* keyspec_tablet_comma */ "\u104A",
         /* keyspec_swiss_row1_11 ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
-        /* ~ keyspec_right_single_angle_quote */
+        null, null, null, null, null, null, null,
+        /* ~ keyspec_comma */
         /* morekeys_tablet_comma */ "\\,",
         /* keyhintlabel_period */ "\u104A",
         /* morekeys_tablet_period ~ */
@@ -2680,7 +2683,7 @@
         /* ~ keyspec_south_slavic_row3_8 */
         /* morekeys_tablet_punctuation */ "!autoColumnOrder!8,.,',#,),(,/,;,@,...,:,-,\",+,\\%,&",
         /* keyspec_spanish_row2_10 ~ */
-        null, null, null, null, null, null, null,
+        null, null, null, null, null, null,
         /* ~ keyhintlabel_tablet_comma */
         /* keyspec_period */ "\u104B",
         /* morekeys_period */ null,
@@ -3202,7 +3205,7 @@
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null,
+        null, null, null, null, null, null,
         /* ~ morekeys_cyrillic_o */
         // U+045D: "ѝ" CYRILLIC SMALL LETTER I WITH GRAVE
         /* morekeys_cyrillic_i */ "\u045D",
@@ -3531,7 +3534,7 @@
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null,
+        null, null, null, null, null, null, null,
         /* ~ morekeys_w */
         // U+0457: "ї" CYRILLIC SMALL LETTER YI
         /* morekeys_east_slavic_row2_2 */ "\u0457",
@@ -3799,7 +3802,7 @@
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
         /* ~ morekeys_question */
         // U+0125: "ĥ" LATIN SMALL LETTER H WITH CIRCUMFLEX
         /* morekeys_h */ "\u0125",
@@ -3807,7 +3810,7 @@
         /* morekeys_w */ "\u0175",
         /* morekeys_east_slavic_row2_2 ~ */
         null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-        null, null, null, null, null, null, null, null, null, null, null, null, null,
+        null, null, null, null, null, null, null, null, null, null, null, null,
         /* ~ morekeys_v */
         // U+0135: "ĵ" LATIN SMALL LETTER J WITH CIRCUMFLEX
         /* morekeys_j */ "\u0135",
@@ -3822,7 +3825,7 @@
         "be_BY"  , TEXTS_be_BY, /*   9/ 32 Belarusian (Belarus) */
         "bg"     , TEXTS_bg,    /*   2/  8 Bulgarian */
         "bn"     , TEXTS_bn,    /*   2/ 15 Bengali */
-        "ca"     , TEXTS_ca,    /*  11/ 95 Catalan */
+        "ca"     , TEXTS_ca,    /*  11/ 96 Catalan */
         "cs"     , TEXTS_cs,    /*  17/ 21 Czech */
         "da"     , TEXTS_da,    /*  19/ 54 Danish */
         "de"     , TEXTS_de,    /*  16/ 62 German */
@@ -3839,18 +3842,18 @@
         "hi"     , TEXTS_hi,    /*  23/ 53 Hindi */
         "hr"     , TEXTS_hr,    /*   9/ 20 Croatian */
         "hu"     , TEXTS_hu,    /*   9/ 20 Hungarian */
-        "hy_AM"  , TEXTS_hy_AM, /*   8/126 Armenian (Armenia) */
+        "hy_AM"  , TEXTS_hy_AM, /*   9/126 Armenian (Armenia) */
         "is"     , TEXTS_is,    /*  10/ 16 Icelandic */
         "it"     , TEXTS_it,    /*  11/ 62 Italian */
         "iw"     , TEXTS_iw,    /*  20/123 Hebrew */
         "ka_GE"  , TEXTS_ka_GE, /*   3/ 10 Georgian (Georgia) */
         "kk"     , TEXTS_kk,    /*  15/121 Kazakh */
         "km_KH"  , TEXTS_km_KH, /*   2/122 Khmer (Cambodia) */
-        "ky"     , TEXTS_ky,    /*  10/ 88 Kirghiz */
+        "ky"     , TEXTS_ky,    /*  10/ 89 Kirghiz */
         "lo_LA"  , TEXTS_lo_LA, /*   2/ 15 Lao (Laos) */
         "lt"     , TEXTS_lt,    /*  18/ 22 Lithuanian */
         "lv"     , TEXTS_lv,    /*  18/ 22 Latvian */
-        "mk"     , TEXTS_mk,    /*   9/ 93 Macedonian */
+        "mk"     , TEXTS_mk,    /*   9/ 94 Macedonian */
         "mn_MN"  , TEXTS_mn_MN, /*   2/ 15 Mongolian (Mongolia) */
         "mr_IN"  , TEXTS_mr_IN, /*  23/ 53 Marathi (India) */
         "my_MM"  , TEXTS_my_MM, /*   8/104 Burmese (Myanmar) */
@@ -3865,13 +3868,13 @@
         "si_LK"  , TEXTS_si_LK, /*   1/  6 Sinhalese (Sri Lanka) */
         "sk"     , TEXTS_sk,    /*  20/ 22 Slovak */
         "sl"     , TEXTS_sl,    /*   8/ 20 Slovenian */
-        "sr"     , TEXTS_sr,    /*  11/ 93 Serbian */
+        "sr"     , TEXTS_sr,    /*  11/ 94 Serbian */
         "sv"     , TEXTS_sv,    /*  21/ 54 Swedish */
         "sw"     , TEXTS_sw,    /*   9/ 18 Swahili */
         "th"     , TEXTS_th,    /*   2/ 15 Thai */
         "tl"     , TEXTS_tl,    /*   7/  9 Tagalog */
         "tr"     , TEXTS_tr,    /*   7/ 18 Turkish */
-        "uk"     , TEXTS_uk,    /*  11/ 87 Ukrainian */
+        "uk"     , TEXTS_uk,    /*  11/ 88 Ukrainian */
         "vi"     , TEXTS_vi,    /*   8/ 15 Vietnamese */
         "zu"     , TEXTS_zu,    /*   8/ 11 Zulu */
         "zz"     , TEXTS_zz,    /*  19/112 Alphabet */
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
index 1b57918..c799ac7 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
@@ -28,6 +28,7 @@
 import com.android.inputmethod.latin.makedict.FormatSpec.DictionaryOptions;
 import com.android.inputmethod.latin.makedict.UnsupportedFormatException;
 import com.android.inputmethod.latin.makedict.WordProperty;
+import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
 import com.android.inputmethod.latin.utils.BinaryDictionaryUtils;
 import com.android.inputmethod.latin.utils.FileUtils;
 import com.android.inputmethod.latin.utils.JniUtils;
@@ -256,7 +257,7 @@
     @Override
     public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer,
             final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo,
-            final boolean blockOffensiveWords, final int[] additionalFeaturesOptions,
+            final SettingsValuesForSuggestion settingsValuesForSuggestion,
             final int sessionId, final float[] inOutLanguageWeight) {
         if (!isValidDictionary()) {
             return null;
@@ -279,8 +280,12 @@
         }
         session.mNativeSuggestOptions.setUseFullEditDistance(mUseFullEditDistance);
         session.mNativeSuggestOptions.setIsGesture(isGesture);
-        session.mNativeSuggestOptions.setBlockOffensiveWords(blockOffensiveWords);
-        session.mNativeSuggestOptions.setAdditionalFeaturesOptions(additionalFeaturesOptions);
+        session.mNativeSuggestOptions.setBlockOffensiveWords(
+                settingsValuesForSuggestion.mBlockPotentiallyOffensive);
+        session.mNativeSuggestOptions.setSpaceAwareGestureEnabled(
+                settingsValuesForSuggestion.mSpaceAwareGestureEnabled);
+        session.mNativeSuggestOptions.setAdditionalFeaturesOptions(
+                settingsValuesForSuggestion.mAdditionalFeaturesSettingValues);
         if (inOutLanguageWeight != null) {
             session.mInputOutputLanguageWeight[0] = inOutLanguageWeight[0];
         } else {
diff --git a/java/src/com/android/inputmethod/latin/Dictionary.java b/java/src/com/android/inputmethod/latin/Dictionary.java
index b55ed12..560ced9 100644
--- a/java/src/com/android/inputmethod/latin/Dictionary.java
+++ b/java/src/com/android/inputmethod/latin/Dictionary.java
@@ -19,6 +19,7 @@
 import com.android.inputmethod.annotations.UsedForTesting;
 import com.android.inputmethod.keyboard.ProximityInfo;
 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
+import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
 
 import java.util.ArrayList;
 
@@ -72,8 +73,7 @@
      * @param composer the key sequence to match with coordinate info, as a WordComposer
      * @param prevWordsInfo the information of previous words.
      * @param proximityInfo the object for key proximity. May be ignored by some implementations.
-     * @param blockOffensiveWords whether to block potentially offensive words
-     * @param additionalFeaturesOptions options about additional features used for the suggestion.
+     * @param settingsValuesForSuggestion the settings values used for the suggestion.
      * @param sessionId the session id.
      * @param inOutLanguageWeight the language weight used for generating suggestions.
      * inOutLanguageWeight is a float array that has only one element. This can be updated when the
@@ -82,7 +82,7 @@
      */
     abstract public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer,
             final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo,
-            final boolean blockOffensiveWords, final int[] additionalFeaturesOptions,
+            final SettingsValuesForSuggestion settingsValuesForSuggestion,
             final int sessionId, final float[] inOutLanguageWeight);
 
     /**
@@ -168,7 +168,7 @@
         @Override
         public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer,
                 final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo,
-                final boolean blockOffensiveWords, final int[] additionalFeaturesOptions,
+                final SettingsValuesForSuggestion settingsValuesForSuggestion,
                 final int sessionId, final float[] inOutLanguageWeight) {
             return null;
         }
diff --git a/java/src/com/android/inputmethod/latin/DictionaryCollection.java b/java/src/com/android/inputmethod/latin/DictionaryCollection.java
index 89d61ce..2b4c54d 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryCollection.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryCollection.java
@@ -20,6 +20,7 @@
 
 import com.android.inputmethod.keyboard.ProximityInfo;
 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
+import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -57,21 +58,21 @@
     @Override
     public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer,
             final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo,
-            final boolean blockOffensiveWords, final int[] additionalFeaturesOptions,
+            final SettingsValuesForSuggestion settingsValuesForSuggestion,
             final int sessionId, final float[] inOutLanguageWeight) {
         final CopyOnWriteArrayList<Dictionary> dictionaries = mDictionaries;
         if (dictionaries.isEmpty()) return null;
         // To avoid creating unnecessary objects, we get the list out of the first
         // dictionary and add the rest to it if not null, hence the get(0)
         ArrayList<SuggestedWordInfo> suggestions = dictionaries.get(0).getSuggestions(composer,
-                prevWordsInfo, proximityInfo, blockOffensiveWords, additionalFeaturesOptions,
-                sessionId, inOutLanguageWeight);
+                prevWordsInfo, proximityInfo, settingsValuesForSuggestion, sessionId,
+                inOutLanguageWeight);
         if (null == suggestions) suggestions = new ArrayList<>();
         final int length = dictionaries.size();
         for (int i = 1; i < length; ++ i) {
             final ArrayList<SuggestedWordInfo> sugg = dictionaries.get(i).getSuggestions(composer,
-                    prevWordsInfo, proximityInfo, blockOffensiveWords, additionalFeaturesOptions,
-                    sessionId, inOutLanguageWeight);
+                    prevWordsInfo, proximityInfo, settingsValuesForSuggestion, sessionId,
+                    inOutLanguageWeight);
             if (null != sugg) suggestions.addAll(sugg);
         }
         return suggestions;
diff --git a/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
index b8feb22..d6e6656 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
@@ -29,6 +29,7 @@
 import com.android.inputmethod.latin.personalization.PersonalizationDataChunk;
 import com.android.inputmethod.latin.personalization.PersonalizationDictionary;
 import com.android.inputmethod.latin.personalization.UserHistoryDictionary;
+import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
 import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
 import com.android.inputmethod.latin.utils.DistracterFilter;
 import com.android.inputmethod.latin.utils.DistracterFilterCheckingIsInDictionary;
@@ -486,8 +487,7 @@
     // TODO: Revise the way to fusion suggestion results.
     public SuggestionResults getSuggestionResults(final WordComposer composer,
             final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo,
-            final boolean blockOffensiveWords, final int[] additionalFeaturesOptions,
-            final int sessionId) {
+            final SettingsValuesForSuggestion settingsValuesForSuggestion, final int sessionId) {
         final Dictionaries dictionaries = mDictionaries;
         final SuggestionResults suggestionResults =
                 new SuggestionResults(dictionaries.mLocale, SuggestedWords.MAX_SUGGESTIONS);
@@ -497,8 +497,7 @@
             if (null == dictionary) continue;
             final ArrayList<SuggestedWordInfo> dictionarySuggestions =
                     dictionary.getSuggestions(composer, prevWordsInfo, proximityInfo,
-                            blockOffensiveWords, additionalFeaturesOptions, sessionId,
-                            languageWeight);
+                            settingsValuesForSuggestion, sessionId, languageWeight);
             if (null == dictionarySuggestions) continue;
             suggestionResults.addAll(dictionarySuggestions);
             if (null != suggestionResults.mRawSuggestions) {
diff --git a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
index 37879cf..5808b9e 100644
--- a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
@@ -26,6 +26,7 @@
 import com.android.inputmethod.latin.makedict.UnsupportedFormatException;
 import com.android.inputmethod.latin.makedict.WordProperty;
 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
+import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
 import com.android.inputmethod.latin.utils.CombinedFormatUtils;
 import com.android.inputmethod.latin.utils.DistracterFilter;
 import com.android.inputmethod.latin.utils.ExecutorUtils;
@@ -409,8 +410,8 @@
     @Override
     public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer,
             final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo,
-            final boolean blockOffensiveWords, final int[] additionalFeaturesOptions,
-            final int sessionId, final float[] inOutLanguageWeight) {
+            final SettingsValuesForSuggestion settingsValuesForSuggestion, final int sessionId,
+            final float[] inOutLanguageWeight) {
         reloadDictionaryIfRequired();
         boolean lockAcquired = false;
         try {
@@ -422,8 +423,7 @@
                 }
                 final ArrayList<SuggestedWordInfo> suggestions =
                         mBinaryDictionary.getSuggestions(composer, prevWordsInfo, proximityInfo,
-                                blockOffensiveWords, additionalFeaturesOptions, sessionId,
-                                inOutLanguageWeight);
+                                settingsValuesForSuggestion, sessionId, inOutLanguageWeight);
                 if (mBinaryDictionary.isCorrupted()) {
                     Log.i(TAG, "Dictionary (" + mDictName +") is corrupted. "
                             + "Remove and regenerate it.");
diff --git a/java/src/com/android/inputmethod/latin/ReadOnlyBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ReadOnlyBinaryDictionary.java
index e59ef75..5d4fc58 100644
--- a/java/src/com/android/inputmethod/latin/ReadOnlyBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ReadOnlyBinaryDictionary.java
@@ -18,6 +18,7 @@
 
 import com.android.inputmethod.keyboard.ProximityInfo;
 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
+import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
 
 import java.util.ArrayList;
 import java.util.Locale;
@@ -51,13 +52,12 @@
     @Override
     public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer,
             final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo,
-            final boolean blockOffensiveWords, final int[] additionalFeaturesOptions,
+            final SettingsValuesForSuggestion settingsValuesForSuggestion,
             final int sessionId, final float[] inOutLanguageWeight) {
         if (mLock.readLock().tryLock()) {
             try {
                 return mBinaryDictionary.getSuggestions(composer, prevWordsInfo, proximityInfo,
-                        blockOffensiveWords, additionalFeaturesOptions, sessionId,
-                        inOutLanguageWeight);
+                        settingsValuesForSuggestion, sessionId, inOutLanguageWeight);
             } finally {
                 mLock.readLock().unlock();
             }
diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index c347f69..838e34f 100644
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -20,7 +20,7 @@
 
 import com.android.inputmethod.keyboard.ProximityInfo;
 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
-import com.android.inputmethod.latin.define.ProductionFlag;
+import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
 import com.android.inputmethod.latin.utils.AutoCorrectionUtils;
 import com.android.inputmethod.latin.utils.BinaryDictionaryUtils;
 import com.android.inputmethod.latin.utils.StringUtils;
@@ -73,17 +73,15 @@
 
     public void getSuggestedWords(final WordComposer wordComposer,
             final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo,
-            final boolean blockOffensiveWords, final boolean isCorrectionEnabled,
-            final int[] additionalFeaturesOptions, final int sessionId, final int sequenceNumber,
+            final SettingsValuesForSuggestion settingsValuesForSuggestion,
+            final boolean isCorrectionEnabled, final int sessionId, final int sequenceNumber,
             final OnGetSuggestedWordsCallback callback) {
         if (wordComposer.isBatchMode()) {
             getSuggestedWordsForBatchInput(wordComposer, prevWordsInfo, proximityInfo,
-                    blockOffensiveWords, additionalFeaturesOptions, sessionId, sequenceNumber,
-                    callback);
+                    settingsValuesForSuggestion, sessionId, sequenceNumber, callback);
         } else {
             getSuggestedWordsForTypingInput(wordComposer, prevWordsInfo, proximityInfo,
-                    blockOffensiveWords, isCorrectionEnabled, additionalFeaturesOptions,
-                    sequenceNumber, callback);
+                    settingsValuesForSuggestion, isCorrectionEnabled, sequenceNumber, callback);
         }
     }
 
@@ -125,8 +123,8 @@
     // and calls the callback function with the suggestions.
     private void getSuggestedWordsForTypingInput(final WordComposer wordComposer,
             final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo,
-            final boolean blockOffensiveWords, final boolean isCorrectionEnabled,
-            final int[] additionalFeaturesOptions, final int sequenceNumber,
+            final SettingsValuesForSuggestion settingsValuesForSuggestion,
+            final boolean isCorrectionEnabled, final int sequenceNumber,
             final OnGetSuggestedWordsCallback callback) {
         final String typedWord = wordComposer.getTypedWord();
         final int trailingSingleQuotesCount = StringUtils.getTrailingSingleQuotesCount(typedWord);
@@ -135,8 +133,8 @@
                 : typedWord;
 
         final SuggestionResults suggestionResults = mDictionaryFacilitator.getSuggestionResults(
-                wordComposer, prevWordsInfo, proximityInfo, blockOffensiveWords,
-                additionalFeaturesOptions, SESSION_TYPING);
+                wordComposer, prevWordsInfo, proximityInfo, settingsValuesForSuggestion,
+                SESSION_TYPING);
         final ArrayList<SuggestedWordInfo> suggestionsContainer =
                 getTransformedSuggestedWordInfoList(wordComposer, suggestionResults,
                         trailingSingleQuotesCount);
@@ -205,12 +203,11 @@
     // and calls the callback function with the suggestions.
     private void getSuggestedWordsForBatchInput(final WordComposer wordComposer,
             final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo,
-            final boolean blockOffensiveWords, final int[] additionalFeaturesOptions,
+            final SettingsValuesForSuggestion settingsValuesForSuggestion,
             final int sessionId, final int sequenceNumber,
             final OnGetSuggestedWordsCallback callback) {
         final SuggestionResults suggestionResults = mDictionaryFacilitator.getSuggestionResults(
-                wordComposer, prevWordsInfo, proximityInfo, blockOffensiveWords,
-                additionalFeaturesOptions, sessionId);
+                wordComposer, prevWordsInfo, proximityInfo, settingsValuesForSuggestion, sessionId);
         final ArrayList<SuggestedWordInfo> suggestionsContainer =
                 new ArrayList<>(suggestionResults);
         final int suggestionsCount = suggestionsContainer.size();
diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
index 5ab7db8..929720b 100644
--- a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
+++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
@@ -46,6 +46,7 @@
 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
 import com.android.inputmethod.latin.WordComposer;
 import com.android.inputmethod.latin.settings.SettingsValues;
+import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
 import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
 import com.android.inputmethod.latin.suggestions.SuggestionStripViewAccessor;
 import com.android.inputmethod.latin.utils.AsyncResultHolder;
@@ -1998,9 +1999,11 @@
                         // a word, it's whatever is *before* the half-committed word in the buffer,
                         // hence 2; if we aren't, we should just skip whitespace if any, so 1.
                         mWordComposer.isComposingWord() ? 2 : 1),
-                proximityInfo, settingsValues.mBlockPotentiallyOffensive,
+                proximityInfo,
+                new SettingsValuesForSuggestion(settingsValues.mBlockPotentiallyOffensive,
+                        settingsValues.mPhraseGestureEnabled,
+                        settingsValues.mAdditionalFeaturesSettingValues),
                 settingsValues.mAutoCorrectionEnabled,
-                settingsValues.mAdditionalFeaturesSettingValues,
                 sessionId, sequenceNumber, callback);
     }
 }
diff --git a/java/src/com/android/inputmethod/latin/settings/NativeSuggestOptions.java b/java/src/com/android/inputmethod/latin/settings/NativeSuggestOptions.java
index 04a2ee3..31a20c4 100644
--- a/java/src/com/android/inputmethod/latin/settings/NativeSuggestOptions.java
+++ b/java/src/com/android/inputmethod/latin/settings/NativeSuggestOptions.java
@@ -21,7 +21,8 @@
     private static final int IS_GESTURE = 0;
     private static final int USE_FULL_EDIT_DISTANCE = 1;
     private static final int BLOCK_OFFENSIVE_WORDS = 2;
-    private static final int OPTIONS_SIZE = 3;
+    private static final int SPACE_AWARE_GESTURE_ENABLED = 3;
+    private static final int OPTIONS_SIZE = 4;
 
     private final int[] mOptions = new int[OPTIONS_SIZE
             + AdditionalFeaturesSettingUtils.ADDITIONAL_FEATURES_SETTINGS_SIZE];
@@ -38,6 +39,10 @@
         setBooleanOption(BLOCK_OFFENSIVE_WORDS, value);
     }
 
+    public void setSpaceAwareGestureEnabled(final boolean value) {
+        setBooleanOption(SPACE_AWARE_GESTURE_ENABLED, value);
+    }
+
     public void setAdditionalFeaturesOptions(final int[] additionalOptions) {
         if (additionalOptions == null) {
             return;
diff --git a/java/src/com/android/inputmethod/latin/settings/SettingsValuesForSuggestion.java b/java/src/com/android/inputmethod/latin/settings/SettingsValuesForSuggestion.java
new file mode 100644
index 0000000..d80af4b
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/settings/SettingsValuesForSuggestion.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
+package com.android.inputmethod.latin.settings;
+
+public class SettingsValuesForSuggestion {
+    public final boolean mBlockPotentiallyOffensive;
+    public final boolean mSpaceAwareGestureEnabled;
+    public final int[] mAdditionalFeaturesSettingValues;
+
+    public SettingsValuesForSuggestion(final boolean blockPotentiallyOffensive,
+            final boolean spaceAwareGestureEnabled, final int[] additionalFeaturesSettingValues) {
+        mBlockPotentiallyOffensive = blockPotentiallyOffensive;
+        mSpaceAwareGestureEnabled = spaceAwareGestureEnabled;
+        mAdditionalFeaturesSettingValues = additionalFeaturesSettingValues;
+    }
+}
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java
index 4825b9e..08adaf8 100644
--- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java
+++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java
@@ -33,6 +33,7 @@
 import com.android.inputmethod.latin.PrevWordsInfo;
 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
 import com.android.inputmethod.latin.WordComposer;
+import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
 import com.android.inputmethod.latin.spellcheck.AndroidSpellCheckerService.SuggestionsGatherer;
 import com.android.inputmethod.latin.utils.CoordinateUtils;
 import com.android.inputmethod.latin.utils.LocaleUtils;
@@ -308,8 +309,12 @@
                 // TODO: make a spell checker option to block offensive words or not
                 final ArrayList<SuggestedWordInfo> suggestions =
                         dictInfo.mDictionary.getSuggestions(composer, prevWordsInfo,
-                                dictInfo.getProximityInfo(), true /* blockOffensiveWords */,
-                                null /* additionalFeaturesOptions */, 0 /* sessionId */,
+                                dictInfo.getProximityInfo(),
+                                new SettingsValuesForSuggestion(
+                                        true /* blockPotentiallyOffensive */,
+                                        true /* spaceAwareGestureEnabled */,
+                                        null /* additionalFeaturesSettingValues */),
+                                0 /* sessionId */,
                                 null /* inOutLanguageWeight */);
                 if (suggestions != null) {
                     for (final SuggestedWordInfo suggestion : suggestions) {
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java b/java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java
index cc52a3e..eb85d49 100644
--- a/java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java
+++ b/java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java
@@ -22,6 +22,7 @@
 import com.android.inputmethod.latin.Dictionary;
 import com.android.inputmethod.latin.PrevWordsInfo;
 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
+import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
 import com.android.inputmethod.latin.WordComposer;
 
 import java.util.ArrayList;
@@ -53,7 +54,7 @@
                 @Override
                 public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer,
                         final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo,
-                        final boolean blockOffensiveWords, final int[] additionalFeaturesOptions,
+                        final SettingsValuesForSuggestion settingsValuesForSuggestion,
                         final int sessionId, final float[] inOutLanguageWeight) {
                     return noSuggestions;
                 }
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/SynchronouslyLoadedContactsBinaryDictionary.java b/java/src/com/android/inputmethod/latin/spellcheck/SynchronouslyLoadedContactsBinaryDictionary.java
index a6437ba..688b184 100644
--- a/java/src/com/android/inputmethod/latin/spellcheck/SynchronouslyLoadedContactsBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/spellcheck/SynchronouslyLoadedContactsBinaryDictionary.java
@@ -22,6 +22,7 @@
 import com.android.inputmethod.latin.ContactsBinaryDictionary;
 import com.android.inputmethod.latin.PrevWordsInfo;
 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
+import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
 import com.android.inputmethod.latin.WordComposer;
 
 import java.util.ArrayList;
@@ -38,11 +39,11 @@
     @Override
     public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer codes,
             final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo,
-            final boolean blockOffensiveWords, final int[] additionalFeaturesOptions,
+            final SettingsValuesForSuggestion settingsValuesForSuggestion,
             final int sessionId, final float[] inOutLanguageWeight) {
         synchronized (mLock) {
             return super.getSuggestions(codes, prevWordsInfo, proximityInfo,
-                    blockOffensiveWords, additionalFeaturesOptions, sessionId, inOutLanguageWeight);
+                    settingsValuesForSuggestion, sessionId, inOutLanguageWeight);
         }
     }
 
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/SynchronouslyLoadedUserBinaryDictionary.java b/java/src/com/android/inputmethod/latin/spellcheck/SynchronouslyLoadedUserBinaryDictionary.java
index 8c9d5d6..ff71f59 100644
--- a/java/src/com/android/inputmethod/latin/spellcheck/SynchronouslyLoadedUserBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/spellcheck/SynchronouslyLoadedUserBinaryDictionary.java
@@ -21,6 +21,7 @@
 import com.android.inputmethod.keyboard.ProximityInfo;
 import com.android.inputmethod.latin.PrevWordsInfo;
 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
+import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
 import com.android.inputmethod.latin.UserBinaryDictionary;
 import com.android.inputmethod.latin.WordComposer;
 
@@ -43,11 +44,11 @@
     @Override
     public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer codes,
             final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo,
-            final boolean blockOffensiveWords, final int[] additionalFeaturesOptions,
+            final SettingsValuesForSuggestion settingsValuesForSuggestion,
             final int sessionId, final float[] inOutLanguageWeight) {
         synchronized (mLock) {
             return super.getSuggestions(codes, prevWordsInfo, proximityInfo,
-                    blockOffensiveWords, additionalFeaturesOptions, sessionId, inOutLanguageWeight);
+                    settingsValuesForSuggestion, sessionId, inOutLanguageWeight);
         }
     }
 
diff --git a/native/jni/src/suggest/core/dictionary/binary_dictionary_bigrams_iterator.h b/native/jni/src/suggest/core/dictionary/binary_dictionary_bigrams_iterator.h
index bc9d576..178b065 100644
--- a/native/jni/src/suggest/core/dictionary/binary_dictionary_bigrams_iterator.h
+++ b/native/jni/src/suggest/core/dictionary/binary_dictionary_bigrams_iterator.h
@@ -24,6 +24,11 @@
 
 class BinaryDictionaryBigramsIterator {
  public:
+    // Empty iterator.
+    BinaryDictionaryBigramsIterator()
+           : mBigramsStructurePolicy(nullptr), mPos(NOT_A_DICT_POS),
+             mBigramPos(NOT_A_DICT_POS), mProbability(NOT_A_PROBABILITY), mHasNext(false) {}
+
     BinaryDictionaryBigramsIterator(
             const DictionaryBigramsStructurePolicy *const bigramsStructurePolicy, const int pos)
             : mBigramsStructurePolicy(bigramsStructurePolicy), mPos(pos),
diff --git a/native/jni/src/suggest/core/dictionary/multi_bigram_map.cpp b/native/jni/src/suggest/core/dictionary/multi_bigram_map.cpp
index 1052241..012e4dc 100644
--- a/native/jni/src/suggest/core/dictionary/multi_bigram_map.cpp
+++ b/native/jni/src/suggest/core/dictionary/multi_bigram_map.cpp
@@ -53,9 +53,8 @@
 
 void MultiBigramMap::BigramMap::init(
         const DictionaryStructureWithBufferPolicy *const structurePolicy, const int nodePos) {
-    const int bigramsListPos = structurePolicy->getBigramsPositionOfPtNode(nodePos);
-    BinaryDictionaryBigramsIterator bigramsIt(structurePolicy->getBigramsStructurePolicy(),
-            bigramsListPos);
+    BinaryDictionaryBigramsIterator bigramsIt =
+            structurePolicy->getBigramsIteratorOfPtNode(nodePos);
     while (bigramsIt.hasNext()) {
         bigramsIt.next();
         if (bigramsIt.getBigramPos() == NOT_A_DICT_POS) {
@@ -89,9 +88,8 @@
         const DictionaryStructureWithBufferPolicy *const structurePolicy, const int nodePos,
         const int nextWordPosition, const int unigramProbability) {
     int bigramProbability = NOT_A_PROBABILITY;
-    const int bigramsListPos = structurePolicy->getBigramsPositionOfPtNode(nodePos);
-    BinaryDictionaryBigramsIterator bigramsIt(structurePolicy->getBigramsStructurePolicy(),
-            bigramsListPos);
+    BinaryDictionaryBigramsIterator bigramsIt =
+            structurePolicy->getBigramsIteratorOfPtNode(nodePos);
     while (bigramsIt.hasNext()) {
         bigramsIt.next();
         if (bigramsIt.getBigramPos() == nextWordPosition) {
diff --git a/native/jni/src/suggest/core/policy/dictionary_structure_with_buffer_policy.h b/native/jni/src/suggest/core/policy/dictionary_structure_with_buffer_policy.h
index b726011..a48d644 100644
--- a/native/jni/src/suggest/core/policy/dictionary_structure_with_buffer_policy.h
+++ b/native/jni/src/suggest/core/policy/dictionary_structure_with_buffer_policy.h
@@ -20,6 +20,7 @@
 #include <memory>
 
 #include "defines.h"
+#include "suggest/core/dictionary/binary_dictionary_bigrams_iterator.h"
 #include "suggest/core/dictionary/property/word_property.h"
 
 namespace latinime {
@@ -61,12 +62,10 @@
 
     virtual int getShortcutPositionOfPtNode(const int nodePos) const = 0;
 
-    virtual int getBigramsPositionOfPtNode(const int nodePos) const = 0;
+    virtual BinaryDictionaryBigramsIterator getBigramsIteratorOfPtNode(const int nodePos) const = 0;
 
     virtual const DictionaryHeaderStructurePolicy *getHeaderStructurePolicy() const = 0;
 
-    virtual const DictionaryBigramsStructurePolicy *getBigramsStructurePolicy() const = 0;
-
     virtual const DictionaryShortcutsStructurePolicy *getShortcutsStructurePolicy() const = 0;
 
     // Returns whether the update was success or not.
diff --git a/native/jni/src/suggest/core/session/prev_words_info.h b/native/jni/src/suggest/core/session/prev_words_info.h
index e350c69..76276f5 100644
--- a/native/jni/src/suggest/core/session/prev_words_info.h
+++ b/native/jni/src/suggest/core/session/prev_words_info.h
@@ -92,11 +92,9 @@
 
     BinaryDictionaryBigramsIterator getBigramsIteratorForPrediction(
             const DictionaryStructureWithBufferPolicy *const dictStructurePolicy) const {
-        const int bigramListPos = getBigramListPositionForWordWithTryingLowerCaseSearch(
+        return getBigramsIteratorForWordWithTryingLowerCaseSearch(
                 dictStructurePolicy, mPrevWordCodePoints[0], mPrevWordCodePointCount[0],
                 mIsBeginningOfSentence[0]);
-        return BinaryDictionaryBigramsIterator(dictStructurePolicy->getBigramsStructurePolicy(),
-                bigramListPos);
     }
 
     // n is 1-indexed.
@@ -156,12 +154,12 @@
                 codePoints, codePointCount, true /* forceLowerCaseSearch */);
     }
 
-    static int getBigramListPositionForWordWithTryingLowerCaseSearch(
+    static BinaryDictionaryBigramsIterator getBigramsIteratorForWordWithTryingLowerCaseSearch(
             const DictionaryStructureWithBufferPolicy *const dictStructurePolicy,
             const int *const wordCodePoints, const int wordCodePointCount,
             const bool isBeginningOfSentence) {
         if (!dictStructurePolicy || !wordCodePoints || wordCodePointCount > MAX_WORD_LENGTH) {
-            return NOT_A_DICT_POS;
+            return BinaryDictionaryBigramsIterator();
         }
         int codePoints[MAX_WORD_LENGTH];
         int codePointCount = wordCodePointCount;
@@ -170,30 +168,30 @@
             codePointCount = CharUtils::attachBeginningOfSentenceMarker(codePoints,
                     codePointCount, MAX_WORD_LENGTH);
             if (codePointCount <= 0) {
-                return NOT_A_DICT_POS;
+                return BinaryDictionaryBigramsIterator();
             }
         }
-        int pos = getBigramListPositionForWord(dictStructurePolicy, codePoints,
-                codePointCount, false /* forceLowerCaseSearch */);
-        // getBigramListPositionForWord returns NOT_A_DICT_POS if this word isn't in the
-        // dictionary or has no bigrams
-        if (NOT_A_DICT_POS == pos) {
-            // If no bigrams for this exact word, search again in lower case.
-            pos = getBigramListPositionForWord(dictStructurePolicy, codePoints,
-                    codePointCount, true /* forceLowerCaseSearch */);
+        BinaryDictionaryBigramsIterator bigramsIt = getBigramsIteratorForWord(dictStructurePolicy,
+                codePoints, codePointCount, false /* forceLowerCaseSearch */);
+        // getBigramsIteratorForWord returns an empty iterator if this word isn't in the dictionary
+        // or has no bigrams.
+        if (bigramsIt.hasNext()) {
+            return bigramsIt;
         }
-        return pos;
+        // If no bigrams for this exact word, search again in lower case.
+        return getBigramsIteratorForWord(dictStructurePolicy, codePoints,
+                codePointCount, true /* forceLowerCaseSearch */);
     }
 
-    static int getBigramListPositionForWord(
+    static BinaryDictionaryBigramsIterator getBigramsIteratorForWord(
             const DictionaryStructureWithBufferPolicy *const dictStructurePolicy,
             const int *wordCodePoints, const int wordCodePointCount,
             const bool forceLowerCaseSearch) {
-        if (!wordCodePoints || wordCodePointCount <= 0) return NOT_A_DICT_POS;
+        if (!wordCodePoints || wordCodePointCount <= 0) return BinaryDictionaryBigramsIterator();
         const int terminalPtNodePos = dictStructurePolicy->getTerminalPtNodePositionOfWord(
                 wordCodePoints, wordCodePointCount, forceLowerCaseSearch);
-        if (NOT_A_DICT_POS == terminalPtNodePos) return NOT_A_DICT_POS;
-        return dictStructurePolicy->getBigramsPositionOfPtNode(terminalPtNodePos);
+        if (NOT_A_DICT_POS == terminalPtNodePos) return BinaryDictionaryBigramsIterator();
+        return dictStructurePolicy->getBigramsIteratorOfPtNode(terminalPtNodePos);
     }
 
     void clear() {
diff --git a/native/jni/src/suggest/core/suggest_options.h b/native/jni/src/suggest/core/suggest_options.h
index 2e22a7a..d456680 100644
--- a/native/jni/src/suggest/core/suggest_options.h
+++ b/native/jni/src/suggest/core/suggest_options.h
@@ -38,6 +38,10 @@
         return getBoolOption(BLOCK_OFFENSIVE_WORDS);
     }
 
+    AK_FORCE_INLINE bool enableSpaceAwareGesture() const {
+        return getBoolOption(SPACE_AWARE_GESTURE_ENABLED);
+    }
+
     AK_FORCE_INLINE bool getAdditionalFeaturesBoolOption(const int key) const {
         return getBoolOption(key + ADDITIONAL_FEATURES_OPTIONS);
     }
@@ -50,9 +54,10 @@
     static const int IS_GESTURE = 0;
     static const int USE_FULL_EDIT_DISTANCE = 1;
     static const int BLOCK_OFFENSIVE_WORDS = 2;
+    static const int SPACE_AWARE_GESTURE_ENABLED = 3;
     // Additional features options are stored after the other options and used as setting values of
     // experimental features.
-    static const int ADDITIONAL_FEATURES_OPTIONS = 3;
+    static const int ADDITIONAL_FEATURES_OPTIONS = 4;
 
     const int *const mOptions;
     const int mLength;
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.cpp
index 9780ae0..f478d9b 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.cpp
@@ -154,6 +154,12 @@
             ptNodeParams.getTerminalId());
 }
 
+BinaryDictionaryBigramsIterator Ver4PatriciaTriePolicy::getBigramsIteratorOfPtNode(
+        const int ptNodePos) const {
+    const int bigramsPosition = getBigramsPositionOfPtNode(ptNodePos);
+    return BinaryDictionaryBigramsIterator(&mBigramPolicy, bigramsPosition);
+}
+
 int Ver4PatriciaTriePolicy::getBigramsPositionOfPtNode(const int ptNodePos) const {
     if (ptNodePos == NOT_A_DICT_POS) {
         return NOT_A_DICT_POS;
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.h b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.h
index 16b1bd2..6d97c7c 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.h
@@ -94,16 +94,12 @@
 
     int getShortcutPositionOfPtNode(const int ptNodePos) const;
 
-    int getBigramsPositionOfPtNode(const int ptNodePos) const;
+    BinaryDictionaryBigramsIterator getBigramsIteratorOfPtNode(const int ptNodePos) const;
 
     const DictionaryHeaderStructurePolicy *getHeaderStructurePolicy() const {
         return mHeaderPolicy;
     }
 
-    const DictionaryBigramsStructurePolicy *getBigramsStructurePolicy() const {
-        return &mBigramPolicy;
-    }
-
     const DictionaryShortcutsStructurePolicy *getShortcutsStructurePolicy() const {
         return &mShortcutPolicy;
     }
@@ -167,6 +163,8 @@
     int mBigramCount;
     std::vector<int> mTerminalPtNodePositionsForIteratingWords;
     mutable bool mIsCorrupted;
+
+    int getBigramsPositionOfPtNode(const int ptNodePos) const;
 };
 } // namespace v402
 } // namespace backward
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp
index 002593c..91d7604 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.cpp
@@ -304,6 +304,12 @@
     return mPtNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos).getShortcutPos();
 }
 
+BinaryDictionaryBigramsIterator PatriciaTriePolicy::getBigramsIteratorOfPtNode(
+        const int ptNodePos) const {
+    const int bigramsPosition = getBigramsPositionOfPtNode(ptNodePos);
+    return BinaryDictionaryBigramsIterator(&mBigramListPolicy, bigramsPosition);
+}
+
 int PatriciaTriePolicy::getBigramsPositionOfPtNode(const int ptNodePos) const {
     if (ptNodePos == NOT_A_DICT_POS) {
         return NOT_A_DICT_POS;
@@ -322,7 +328,7 @@
     int bigramPos = NOT_A_DICT_POS;
     int siblingPos = NOT_A_DICT_POS;
     PatriciaTrieReadingUtils::readPtNodeInfo(mDictRoot, ptNodePos, getShortcutsStructurePolicy(),
-            getBigramsStructurePolicy(), &flags, &mergedNodeCodePointCount, mergedNodeCodePoints,
+            &mBigramListPolicy, &flags, &mergedNodeCodePointCount, mergedNodeCodePoints,
             &probability, &childrenPos, &shortcutPos, &bigramPos, &siblingPos);
     // Skip PtNodes don't start with Unicode code point because they represent non-word information.
     if (CharUtils::isInUnicodeSpace(mergedNodeCodePoints[0])) {
@@ -352,7 +358,7 @@
     std::vector<BigramProperty> bigrams;
     const int bigramListPos = getBigramsPositionOfPtNode(ptNodePos);
     int bigramWord1CodePoints[MAX_WORD_LENGTH];
-    BinaryDictionaryBigramsIterator bigramsIt(getBigramsStructurePolicy(), bigramListPos);
+    BinaryDictionaryBigramsIterator bigramsIt(&mBigramListPolicy, bigramListPos);
     while (bigramsIt.hasNext()) {
         // Fetch the next bigram information and forward the iterator.
         bigramsIt.next();
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.h
index ec84074..7c0b9d3 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.h
@@ -67,16 +67,12 @@
 
     int getShortcutPositionOfPtNode(const int ptNodePos) const;
 
-    int getBigramsPositionOfPtNode(const int ptNodePos) const;
+    BinaryDictionaryBigramsIterator getBigramsIteratorOfPtNode(const int ptNodePos) const;
 
     const DictionaryHeaderStructurePolicy *getHeaderStructurePolicy() const {
         return &mHeaderPolicy;
     }
 
-    const DictionaryBigramsStructurePolicy *getBigramsStructurePolicy() const {
-        return &mBigramListPolicy;
-    }
-
     const DictionaryShortcutsStructurePolicy *getShortcutsStructurePolicy() const {
         return &mShortcutListPolicy;
     }
@@ -158,6 +154,7 @@
     std::vector<int> mTerminalPtNodePositionsForIteratingWords;
     mutable bool mIsCorrupted;
 
+    int getBigramsPositionOfPtNode(const int ptNodePos) const;
     int createAndGetLeavingChildNode(const DicNode *const dicNode, const int ptNodePos,
             DicNodeVector *const childDicNodes) const;
 };
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp
index 46107d9..0b5764a 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp
@@ -144,6 +144,12 @@
             ptNodeParams.getTerminalId());
 }
 
+BinaryDictionaryBigramsIterator Ver4PatriciaTriePolicy::getBigramsIteratorOfPtNode(
+        const int ptNodePos) const {
+    const int bigramsPosition = getBigramsPositionOfPtNode(ptNodePos);
+    return BinaryDictionaryBigramsIterator(&mBigramPolicy, bigramsPosition);
+}
+
 int Ver4PatriciaTriePolicy::getBigramsPositionOfPtNode(const int ptNodePos) const {
     if (ptNodePos == NOT_A_DICT_POS) {
         return NOT_A_DICT_POS;
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h
index 5d66a2c..85929b7 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h
@@ -76,16 +76,12 @@
 
     int getShortcutPositionOfPtNode(const int ptNodePos) const;
 
-    int getBigramsPositionOfPtNode(const int ptNodePos) const;
+    BinaryDictionaryBigramsIterator getBigramsIteratorOfPtNode(const int ptNodePos) const;
 
     const DictionaryHeaderStructurePolicy *getHeaderStructurePolicy() const {
         return mHeaderPolicy;
     }
 
-    const DictionaryBigramsStructurePolicy *getBigramsStructurePolicy() const {
-        return &mBigramPolicy;
-    }
-
     const DictionaryShortcutsStructurePolicy *getShortcutsStructurePolicy() const {
         return &mShortcutPolicy;
     }
@@ -146,6 +142,8 @@
     int mBigramCount;
     std::vector<int> mTerminalPtNodePositionsForIteratingWords;
     mutable bool mIsCorrupted;
+
+    int getBigramsPositionOfPtNode(const int ptNodePos) const;
 };
 } // namespace latinime
 #endif // LATINIME_VER4_PATRICIA_TRIE_POLICY_H
diff --git a/tests/src/com/android/inputmethod/keyboard/layout/ArmenianPhonetic.java b/tests/src/com/android/inputmethod/keyboard/layout/ArmenianPhonetic.java
index eb64b83..42ce0c1 100644
--- a/tests/src/com/android/inputmethod/keyboard/layout/ArmenianPhonetic.java
+++ b/tests/src/com/android/inputmethod/keyboard/layout/ArmenianPhonetic.java
@@ -29,7 +29,7 @@
     private static final String LAYOUT_NAME = "armenian_phonetic";
 
     public ArmenianPhonetic(final LayoutCustomizer customizer) {
-        super(customizer, ArmenianSymbols.class, SymbolsShifted.class);
+        super(customizer, ArmenianSymbols.class, ArmenianSymbolsShifted.class);
     }
 
     @Override
@@ -57,16 +57,14 @@
 
         @Override
         public ExpectedKey[] getKeysLeftToSpacebar(final boolean isPhone) {
-            // U+002C: "," COMMA
             // U+055D: "՝" ARMENIAN COMMA
-            return isPhone ? joinKeys(key("\u002C", SETTINGS_KEY))
+            return isPhone ? joinKeys(key("\u055D", SETTINGS_KEY))
                     : joinKeys(key("\u055D", SETTINGS_KEY), "_");
         }
 
         @Override
         public ExpectedKey[] getKeysRightToSpacebar(final boolean isPhone) {
             // U+0589: "։" ARMENIAN FULL STOP
-            // U+055D: "՝" ARMENIAN COMMA
             final ExpectedKey fullStopKey = key("\u0589", getPunctuationMoreKeys(isPhone));
             return isPhone ? joinKeys(fullStopKey) : joinKeys("/", fullStopKey);
         }
@@ -204,6 +202,8 @@
         public ExpectedKey[][] getLayout(final boolean isPhone) {
             final ExpectedKeyboardBuilder builder = new ExpectedKeyboardBuilder(
                     super.getLayout(isPhone));
+            // U+055D: "՝" ARMENIAN COMMA
+            builder.replaceKeyOfLabel(",", "\u055D");
             // U+055C: "՜" ARMENIAN EXCLAMATION MARK
             // U+00A1: "¡" INVERTED EXCLAMATION MARK
             // U+055E: "՞" ARMENIAN QUESTION MARK
@@ -213,4 +213,17 @@
             return builder.build();
         }
     }
+
+    private static final class ArmenianSymbolsShifted extends SymbolsShifted {
+        public ArmenianSymbolsShifted(final LayoutCustomizer customizer) { super(customizer); }
+
+        @Override
+        public ExpectedKey[][] getLayout(final boolean isPhone) {
+            final ExpectedKeyboardBuilder builder = new ExpectedKeyboardBuilder(
+                    super.getLayout(isPhone));
+            // U+055D: "՝" ARMENIAN COMMA
+            builder.replaceKeyOfLabel(",", "\u055D");
+            return builder.build();
+        }
+    }
 }
diff --git a/tools/dicttool/Android.mk b/tools/dicttool/Android.mk
index ce51df1..22ed7b7 100644
--- a/tools/dicttool/Android.mk
+++ b/tools/dicttool/Android.mk
@@ -50,6 +50,7 @@
         latin/SuggestedWords.java \
         latin/WordComposer.java \
         latin/settings/NativeSuggestOptions.java \
+        latin/settings/SettingsValuesForSuggestion.java \
         latin/utils/BinaryDictionaryUtils.java \
         latin/utils/CombinedFormatUtils.java \
         latin/utils/CoordinateUtils.java \
diff --git a/tools/make-keyboard-text/res/values-hy-rAM/donottranslate-more-keys.xml b/tools/make-keyboard-text/res/values-hy-rAM/donottranslate-more-keys.xml
index 1e05119..08d88e5 100644
--- a/tools/make-keyboard-text/res/values-hy-rAM/donottranslate-more-keys.xml
+++ b/tools/make-keyboard-text/res/values-hy-rAM/donottranslate-more-keys.xml
@@ -45,6 +45,7 @@
          <string name="keyspec_currency">&#x058F;</string>
     -->
     <!-- U+055D: "՝" ARMENIAN COMMA -->
+    <string name="keyspec_comma">&#x055D;</string>
     <string name="keyspec_tablet_comma">&#x055D;</string>
     <!-- U+0589: "։" ARMENIAN FULL STOP -->
     <string name="keyspec_period">&#x0589;</string>