Merge "Simplify a make file"
diff --git a/dictionaries/es_wordlist.combined.gz b/dictionaries/es_wordlist.combined.gz
index 181a958..c0a5264 100644
--- a/dictionaries/es_wordlist.combined.gz
+++ b/dictionaries/es_wordlist.combined.gz
Binary files differ
diff --git a/java/res/layout/dictionary_line.xml b/java/res/layout/dictionary_line.xml
index 7268cd4..bb1843d 100644
--- a/java/res/layout/dictionary_line.xml
+++ b/java/res/layout/dictionary_line.xml
@@ -42,7 +42,7 @@
       android:orientation="vertical">
 
     <TextView
-        android:id="@+android:id/title"
+        android:id="@android:id/title"
         android:layout_marginLeft="5dip"
         android:layout_marginStart="5dip"
         android:layout_width="wrap_content"
@@ -59,7 +59,7 @@
         android:layout_marginLeft="5dip">
 
       <TextView
-          android:id="@+android:id/summary"
+          android:id="@android:id/summary"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:textAppearance="?android:attr/textAppearanceSmall"
@@ -77,14 +77,14 @@
   </LinearLayout>
 
   <com.android.inputmethod.dictionarypack.ButtonSwitcher
-      android:id="@+android:id/wordlist_button_switcher"
+      android:id="@+id/wordlist_button_switcher"
       android:layout_weight="0"
       android:layout_marginStart="13dip"
       android:layout_marginLeft="13dip"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content">
     <Button
-        android:id="@+android:id/dict_install_button"
+        android:id="@+id/dict_install_button"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="right|center_vertical"
@@ -92,7 +92,7 @@
         android:textAppearance="?android:attr/textAppearanceMedium"
         android:text="@string/install_dict" />
     <Button
-        android:id="@+android:id/dict_cancel_button"
+        android:id="@+id/dict_cancel_button"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="right|center_vertical"
@@ -100,7 +100,7 @@
         android:textAppearance="?android:attr/textAppearanceMedium"
         android:text="@string/cancel_download_dict" />
     <Button
-        android:id="@+android:id/dict_delete_button"
+        android:id="@+id/dict_delete_button"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="right|center_vertical"
diff --git a/java/res/layout/key_preview.xml b/java/res/layout/key_preview.xml
deleted file mode 100644
index 16d4c72..0000000
--- a/java/res/layout/key_preview.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2013, 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.
-*/
--->
-
-<TextView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:minWidth="32dp"
-    android:gravity="center"
-    style="?attr/keyPreviewTextViewStyle"
-/>
diff --git a/java/res/raw/main_es.dict b/java/res/raw/main_es.dict
index 83eefe4..0911b70 100644
--- a/java/res/raw/main_es.dict
+++ b/java/res/raw/main_es.dict
Binary files differ
diff --git a/java/res/values-af/strings-action-keys.xml b/java/res/values-af/strings-action-keys.xml
index bef175b..c7ae3f7 100644
--- a/java/res/values-af/strings-action-keys.xml
+++ b/java/res/values-af/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"Vorige"</string>
     <string name="label_done_key" msgid="7564866296502630852">"Klaar"</string>
     <string name="label_send_key" msgid="482252074224462163">"Stuur"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"Soek"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"Laat wag"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"Wag"</string>
 </resources>
diff --git a/java/res/values-af/strings-letter-descriptions.xml b/java/res/values-af/strings-letter-descriptions.xml
new file mode 100644
index 0000000..1238a43
--- /dev/null
+++ b/java/res/values-af/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Vroulike rangtelwoordaanwyser"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Mikroteken"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Manlike rangtelwoordaanwyser"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Stemlose S"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, gravis"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, akuut"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, kappie"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, deelteken"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, sirkel bo"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, koppelletter"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cédille"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, gravis"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, akuut"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, kappie"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, deelteken"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, gravis"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, akuut"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, kappie"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, deelteken"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, gravis"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, akuut"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, kappie"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, deelteken"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, deurhaal"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, gravis"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, akuut"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, kappie"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, deelteken"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, akuut"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, deelteken"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, makron"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, brevis"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, akuut"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, kappie"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, kol bo"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, onderstebo kappie"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, onderstebo kappie"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, deurhaal"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, makron"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, brevis"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, kol bo"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, onderstebo kappie"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, kappie"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, brevis"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, kol bo"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cédille"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, kappie"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, deurhaal"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, makron"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, brevis"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Kollose I"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, koppelletter"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, kappie"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cédille"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, akuut"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cédille"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, onderstebo kappie"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, middelkol"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, deurhaal"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, akuut"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cédille"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, onderstebo kappie"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, voorafgegaan deur apostroof"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, makron"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, brevis"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, dubbelakuut"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, koppelletter"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, akuut"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cédille"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, onderstebo kappie"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, akuut"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, kappie"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cédille"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, onderstebo kappie"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cédille"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, onderstebo kappie"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, deurhaal"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, makron"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, brevis"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, sirkel bo"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, dubbelakuut"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, kappie"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, kappie"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, akuut"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, kol bo"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, onderstebo kappie"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Lang S"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, horing"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, horing"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, komma onder"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, komma onder"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Sjwa"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, kol onder"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, haak bo"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, kappie en akuut"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, kappie en gravis"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, kappie en haak bo"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, kappie en tilde"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, kappie en kol onder"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, brevis en akuut"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, brevis en gravis"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, brevis en haak bo"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, brevis en tilde"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, brevis en kol onder"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, kol onder"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, haak bo"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, kappie en akuut"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, kappie en gravis"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, kappie en haak bo"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, kappie en tilde"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, kappie en kol onder"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, haak bo"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, kol onder"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, kol onder"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, haak bo"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, kappie en akuut"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, kappie en gravis"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, kappie en haak bo"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, kappie en tilde"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, kappie en kol onder"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, horing en akuut"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, horing en gravis"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, horing en haak bo"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, horing en tilde"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, horing en kol onder"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, kol onder"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, haak bo"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, horing en akuut"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, horing en gravis"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, horing en haak bo"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, horing en tilde"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, horing en kol onder"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, gravis"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, kol onder"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, haak bo"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Onderstebo uitroepteken"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Dubbele hoekaanhalingsteken na links"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Middelkol"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Boskrif-een"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Dubbele hoekaanhalingsteken na regs"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Onderstebo vraagteken"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Enkele linkeraanhalingsteken"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Enkele regteraanhalingsteken"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Enkele lae-9-aanhalingsteken"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Dubbele linkeraanhalingsteken"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Dubbele regteraanhalingsteken"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Kruisie"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Dubbelkruisie"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Per-duisend-teken"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Aksent"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Dubbelaksent"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Enkele hoekaanhalingsteken na links"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Enkele hoekaanhalingsteken na regs"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"Boskrif-vier"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"Klein Latynse boskrif-letter-n"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Peso-teken"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"Per adres"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"Pyl na regs"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Pyl na onder"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Leë versameling"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Vermeerdering"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"Minder as of gelyk aan"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"Meer as of gelyk aan"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"Swart ster"</string>
+</resources>
diff --git a/java/res/values-af/strings-talkback-descriptions.xml b/java/res/values-af/strings-talkback-descriptions.xml
index 09abb5f..3b6ba0a 100644
--- a/java/res/values-af/strings-talkback-descriptions.xml
+++ b/java/res/values-af/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"Geen teks is ingevoer nie"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> korrigeer <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> na <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> voer outokorrigering uit"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"Onbekende karakter"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Meer simbole"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Plekke"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Simbole"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emosiekone"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"Hoofletter-<xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"Hoofletter-I"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"Hoofletter-I, kol bo"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"Onbekende simbool"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Onbekende emosiekoon"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Alternatiewe karakters is beskikbaar"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Alternatiewe karakters is toegemaak"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Alternatiewe voorstelle is beskikbaar"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Alternatiewe voorstelle is toegemaak"</string>
 </resources>
diff --git a/java/res/values-af/strings.xml b/java/res/values-af/strings.xml
index 0367c47..295c855 100644
--- a/java/res/values-af/strings.xml
+++ b/java/res/values-af/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Stel kontakname voor"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Gebruik name van kontakte vir voorstelle en korreksies"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Gepersonaliseerde voorstelle"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"Verbeter <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Dubbelspasie-punt"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Dubbeltik op spasiebalk voeg \'n punt in, gevolg deur \'n spasie"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Outohoofletters"</string>
diff --git a/java/res/values-am/strings-action-keys.xml b/java/res/values-am/strings-action-keys.xml
index 26e4513..51c2538 100644
--- a/java/res/values-am/strings-action-keys.xml
+++ b/java/res/values-am/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"ቀዳሚ"</string>
     <string name="label_done_key" msgid="7564866296502630852">"ተደርጓል"</string>
     <string name="label_send_key" msgid="482252074224462163">"ላክ"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"ፈልግ"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"ቆም በል"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"ጠብቅ"</string>
 </resources>
diff --git a/java/res/values-am/strings-letter-descriptions.xml b/java/res/values-am/strings-letter-descriptions.xml
new file mode 100644
index 0000000..5c94869
--- /dev/null
+++ b/java/res/values-am/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"እንስት የደረጃ አመልካች"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"የማይክሮ ምልክት"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"ተባዕታይ የደረጃ አመልካች"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"ሻርፕ ኤስ"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"ኤ፣ ጭረት"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"ኤ፣ ይዘት"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"ኤ፣ ድፋት"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"ኤ፣ ድፋትቅናት"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"ኤ፣ ባለሁለት ነጥብ"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"ኤ፣ ቀለበት ከላይ"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"ኤ፣ ኢ፣ ማሰሪያ"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"ሲ፣ ጭራ"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"ኢ፣ ጭረት"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"ኢ፣ ይዘት"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"ኢ፣ ድፋት"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"ኢ፣ ባለሁለት ነጥብ"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"አይ፣ ጭረት"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"አይ፣ ይዘት"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"አይ፣ ድፋት"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"አይ፣ ባለሁለት ነጥብ"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"ኤት"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"ኤን፣ ድፋትቅናት"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"ኦ፣ ጭረት"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"ኦ፣ ይዘት"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"ኦ፣ ድፋት"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"ኦ፣ ድፋትቅናት"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"ኦ፣ ባለሁለት ነጥብ"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"ኦ፣ ሰያፍ ሰረዝ"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"ዩ፣ ጭረት"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"ዩ፣ ይዘት"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"ዩ፣ ድፋት"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"ዩ፣ ባለሁለት ነጥብ"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"ዋይ፣ ይዘት"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"ቶርን"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"ዋይ፣ ባለሁለት ነጥብ"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"ኤ፣ ማክሮን"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"ኤ፣ ቁንጽል"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"ኤ፣ ኦጎነክ"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"ሲ፣ ይዘት"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"ሲ፣ ድፋት"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"ሲ፣ ነጥብ ከላይ"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"ሲ፣ ካሮን"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"ዲ፣ ካሮን"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"ዲ፣ ሰያፍ ሰረዝ"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"ኢ፣ ማክሮን"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"ኢ፣ ቁንጽል"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"ኢ፣ ነጥብ ከላይ"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"ኢ፣ ኦጎነክ"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"ኢ፣ ካሮን"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"ጂ፣ ድፋት"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"ጂ፣ ቁንጽል"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"ጂ፣ ነጥብ ከላይ"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"ጂ፣ ጭራ"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"ኤች፣ ድፋት"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"ኤች፣ ሰያፍ ሰረዝ"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"አይ፣ ድፋትቅናት"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"አይ፣ ማክሮን"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"አይ፣ ቁንጽል"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"አይ፣ ኦጎነክ"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"ነጥብ አልባ አይ"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"አይ፣ ጄ፣ ማሰሪያ"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"ጄ፣ ድፋት"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"ኬ፣ ጭራ"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"ክራ"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"ኤል፣ ይዘት"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"ኤል፣ ጭራ"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"ኤል፣ ካሮን"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"ኤል፣ የመሃል ነጥብ"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"ኤል፣ ሰያፍ ሰረዝ"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"ኤን፣ ይዘት"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"ኤን፣ ጭራ"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"ኤን፣ ካሮን"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"ኤን፣ በትእምርተ ጭረት የተቀደመ"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"እንግ"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"ኦ፣ ማክሮን"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"ኦ፣ ቁንጽል"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"ኦ፣ ድርብ ይዘት"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"ኦ፣ ኢ፣ ማሰሪያ"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"አር፣ ይዘት"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"አር፣ ጭራ"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"አር፣ ካሮን"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"ኤስ፣ ይዘት"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"ኤስ፣ ድፋት"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"ኤስ፣ ጭራ"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"ኤስ፣ ካሮን"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"ቲ፣ ጭራ"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"ቲ፣ ካሮን"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"ቲ፣ ሰያፍ ሰረዝ"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"ዩ፣ ድፋትቅናት"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"ዩ፣ ማክሮን"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"ዩ፣ ቁንጽል"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"ዩ፣ ቀለበት ከላይ"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"ዩ፣ ድርብ ይዘት"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"ዩ፣ ኦጎነክ"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"ደብልዩ፣ ድፋት"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"ዋይ፣ ድፋት"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"ዜድ፣ ይዘት"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"ዜድ፣ ነጥብ ከላይ"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"ዜድ፣ ካሮን"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"ረጅም ኤስ"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"ኦ፣ ቀንድ"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"ዩ፣ ቀንድ"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"ኤስ፣ ኮማ ከታች"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"ቲ፣ ኮማ ከታች"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"ሽዋ"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"ኤ፣ ነጥብ ከታች"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"ኤ፣ መንጠቆ ከላይ"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"ኤ፣ ድፋት እና ይዘት"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"ኤ፣ ድፋት እና ጭረት"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"ኤ፣ ድፋት እና መንጠቆ ከላይ"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"ኤ፣ ድፋት እና ድፋትቅናት"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"ኤ፣ ድፋት እና ነጥብ ከታች"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"ኤ፣ ቁንጽል እና ይዘት"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"ኤ፣ ቁንጽል እና ጭረት"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"ኤ፣ ቁንጽል እና መንጠቆ ከላይ"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"ኤ፣ ቁንጽል እና ድፋትቅናት"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"ኤ፣ ቁንጽል እና ነጥብ ከታች"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"ኢ፣ ነጥብ ከታች"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"ኢ፣ መንጠቆ ከላይ"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"ኢ፣ ድፋትቅናት"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"ኢ፣ ድፋት እና ይዘት"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"ኢ፣ ድፋት እና ጭረት"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"ኢ፣ ድፋት እና መንጠቆ ከላይ"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"ኢ፣ ድፋት እና ድፋትቅናት"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"ኢ፣ ድፋት እና ነጥብ ከታች"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"አይ፣ መንጠቆ ከላይ"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"አይ፣ ነጥብ ከታች"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"ኦ፣ ነጥብ ከታች"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"ኦ፣ መንጠቆ ከላይ"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"ኦ፣ ድፋት እና ይዘት"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"ኦ፣ ድፋት እና ጭረት"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"ኦ፣ ድፋት እና መንጠቆ ከላይ"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"ኦ፣ ድፋት እና ድፋትቅናት"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"ኦ፣ ድፋት እና ነጥብ ከታች"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"ኦ፣ ቀንድ እና ይዘት"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"ኦ፣ ቀንድ እና ጭረት"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"ኦ፣ ቀንድ እና መንጠቆ ከላይ"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"ኦ፣ ቀንድ እና ድፋትቅናት"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"ኦ፣ ቀንድ እና ነጥብ ከታች"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"ዩ፣ ነጥብ ከታች"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"ዩ፣ መንጠቆ ከላይ"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"ዩ፣ ቀንድ እና ይዘት"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"ዩ፣ ቀንድ እና ጭረት"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"ዩ፣ ቀንድ እና መንጠቆ ከላይ"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"ዩ፣ ቀንድ እና ድፋትቅናት"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"ዩ፣ ቀንድ እና ነጥብ ከታች"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"ዋይ፣ ጭረት"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"ዋይ፣ ነጥብ ከታች"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"ዋይ፣ መንጠቆ ከላይ"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"ዋይ፣ ድፋትቅናት"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"የተገለበጠ ቃለ አጋኖ"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"ግራ ጠቋሚ ድርብ የማዕዘን ትዕምርተ ጥቅስ"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"የመሃል ነጥብ"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"ራስጌ አደር አንድ"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"ቀኝ ጠቋሚ ድርብ የማዕዘን ትዕምርተ ጥቅስ"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"የተገለበጠ የጥያቄ ምልክት"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"የግራ  ነጠላ ትዕምርተ ጥቅስ"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"የቀኝ ነጠላ ትዕምርተ ጥቅስ"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"ነጠላ ዝቅተኛ-9 ትዕምርተ ጥቅስ"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"የግራ ድርብ ትዕምርተ ጥቅስ"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"የቀኝ ድርብ ትዕምርተ ጥቅስ"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"ሾተል"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"ድርብ ሾተል"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"የሺኛ ምልክት"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"ፕራይም"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"ድርብ ፕራይም"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"ነጠላ ግራ ጠቋሚ የማዕዘን ትዕምርተ ጥቅስ"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"ነጠላ ቀኝ ጠቋሚ የማዕዘን ትዕምርተ ጥቅስ"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"ራስጌ አደር አራት"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"የራስጌ አደር ላቲን ንዑስ ሆሄ ኤን"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"የፔሶ ምልክት"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"ባለአደራ"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"የቀኝ ቀስት"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"የታች ቀስት"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"ባዶ ስብስብ"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"ጨምር"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"ያንሳል ወይም እክሉ ነው ከ"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"ይበልጣል ወይም እክሉ ነው ከ"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"ጥቁር ኮከብ"</string>
+</resources>
diff --git a/java/res/values-am/strings-talkback-descriptions.xml b/java/res/values-am/strings-talkback-descriptions.xml
index 1b1da01..84c3cb0 100644
--- a/java/res/values-am/strings-talkback-descriptions.xml
+++ b/java/res/values-am/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"ምንም ፅሁፍ አልገባም"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>ን ወደ <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> ያርመዋል"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> የራስ ሰር እርማት ያከናውናል"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"ያልታወቀ ቁምፊ"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"ቀይር"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"ተጨማሪ ምልክቶች"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"ቦታዎች"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"ምልክቶች"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"ስሜት ገላጭ አዶዎች"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"አቢይ ሆሄ <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"አቢይ ሆሄ አይ"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"አቢይ ሆሄ አይ፣ ነጥብ ከላይ"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"ያልታወቀ ምልክት"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"ያልታወቀ ስሜት ገላጭ ምስል"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"ተለዋጭ ቁምፊዎች ይገኛሉ"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"ተለዋጭ ቁምፊዎች ተሰናብተዋል"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"ተለዋጭ የአስተያየት ጥቆማዎች ይገኛሉ"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"ተለዋጭ የአስተያየት ጥቆማዎች ተሰናብተዋል"</string>
 </resources>
diff --git a/java/res/values-am/strings.xml b/java/res/values-am/strings.xml
index b201757..35eb17c 100644
--- a/java/res/values-am/strings.xml
+++ b/java/res/values-am/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"የዕውቂያ ስም ጠቁም"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"ከዕውቂያዎች ለጥቆማዎች እና ማስተካከያዎች ስሞች ተጠቀም"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"ግላዊ የጥቆማ አስተያየቶች"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>ን አሻሽል"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"የድርብ-ክፍተት ነጥብ"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"የክፍተት አሞሌው ላይ ሁለቴ መታ ማድረግ አንድ ነጥብ እና ክፍተት አስከትሎ ያስገባል"</string>
     <string name="auto_cap" msgid="1719746674854628252">"ራስ-ሰር አቢይ ማድረግ"</string>
diff --git a/java/res/values-ca/strings-action-keys.xml b/java/res/values-ca/strings-action-keys.xml
index 5dcf4a3..2760fb0 100644
--- a/java/res/values-ca/strings-action-keys.xml
+++ b/java/res/values-ca/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"Ant."</string>
     <string name="label_done_key" msgid="7564866296502630852">"Fet"</string>
     <string name="label_send_key" msgid="482252074224462163">"Envia"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"Cerca"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"Atura"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"Esp."</string>
 </resources>
diff --git a/java/res/values-ca/strings-letter-descriptions.xml b/java/res/values-ca/strings-letter-descriptions.xml
new file mode 100644
index 0000000..a6569ec
--- /dev/null
+++ b/java/res/values-ca/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Indicador ordinal femení"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Signe de micro"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Indicador ordinal masculí"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"S sonora"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, accent obert"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, accent tancat"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circumflex"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, titlla"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, dièresi"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, anell"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, lligadura"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, ce trencada"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, accent obert"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, accent tancat"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circumflex"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, dièresi"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, accent obert"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, accent tancat"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circumflex"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, dièresi"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, titlla"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, accent obert"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, accent tancat"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circumflex"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, titlla"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, dièresi"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, conjunt buit"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, accent obert"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, accent tancat"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circumflex"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"O, dièresi"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, accent tancat"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, dièresi"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, màcron"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breu"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, croc polonès"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, accent tancat"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circumflex"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, punt superior"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, anticircumflex"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, anticircumflex"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, barra"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, anticircumflex"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breu"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, punt superior"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, croc polonès"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, anticircumflex"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circumflex"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breu"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, punt superior"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, vírgula"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circumflex"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, barra"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, titlla"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, màcron"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breu"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, croc polonès"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I sense punt"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, lligadura"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circumflex"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, vírgula"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, accent tancat"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, vírgula"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, anticircumflex"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, punt volat"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, barra"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, accent tancat"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, vírgula"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, anticircumflex"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, precedida d\'apòstrof"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, màcron"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breu"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, accent tancat doble"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, lligadura"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, accent tancat"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, vírgula"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, anticircumflex"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, accent tancat"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circumflex"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, vírgula"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, anticircumflex"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, vírgula"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, anticircumflex"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, barra"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, titlla"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, màcron"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breu"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, anell"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, accent tancat doble"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, croc polonès"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circumflex"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circumflex"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, accent tancat"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, punt superior"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, anticircumflex"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S llarga"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, banya"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, banya"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, coma inferior"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, coma inferior"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Neutra"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, punt inferior"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, vírgula superior"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circumflex i accent tancat"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circumflex i accent obert"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circumflex i vírgula superior"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circumflex i titlla"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circumflex i punt inferior"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breu i accent tancat"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breu i accent obert"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breu i vírgula superior"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breu i titlla"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breu i punt inferior"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, punt inferior"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, vírgula superior"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, titlla"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circumflex i accent tancat"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circumflex i accent obert"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circumflex i vírgula superior"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circumflex i titlla"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circumflex i punt inferior"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, vírgula superior"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, punt inferior"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, punt inferior"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, vírgula superior"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circumflex i accent tancat"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circumflex i accent obert"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circumflex i vírgula superior"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circumflex i titlla"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circumflex i punt inferior"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, banya i accent tancat"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, banya i accent obert"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, banya i vírgula superior"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, banya i titlla"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, banya i punt inferior"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, punt inferior"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, vírgula superior"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, banya i accent tancat"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, banya i accent obert"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, banya i vírgula superior"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, banya i titlla"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, banya i punt inferior"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, accent obert"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, punt inferior"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, vírgula superior"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, titlla"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Signe d\'exclamació invertit"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Doble cometa angular d\'obertura"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"punt volat"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Superíndex d\'u"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Doble cometa angular de tancament"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Signe d\'interrogació invertit"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Cometes simples d\'obertura"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Cometes simples de tancament"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Cometes alemanyes simples d\'obertura"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Cometes dobles d\'obertura"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Cometes dobles de tancament"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Obelisc"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Doble obelisc"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Signe per mil"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Cometa"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Cometa doble"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Cometes angulars simples d\'obertura"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Cometes angulars simples de tancament"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"Superíndex de quatre"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"Superíndex de lletra minúscula llatina n"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Signe del peso"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"Percentatge"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"Fletxa cap a la dreta"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Fletxa cap avall"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Conjunt buit"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Increment"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"Més petit o igual que"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"Més gran o igual que"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"Estrella negra"</string>
+</resources>
diff --git a/java/res/values-ca/strings-talkback-descriptions.xml b/java/res/values-ca/strings-talkback-descriptions.xml
index 5bbf655..9b01c75 100644
--- a/java/res/values-ca/strings-talkback-descriptions.xml
+++ b/java/res/values-ca/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"No s\'ha introduït cap text."</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corregeix <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> per <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>."</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> executa la correcció automàtica."</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"Caràcter desconegut"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Maj"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Més símbols"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Maj"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Llocs"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Símbols"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emoticones"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> majúscula"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"I majúscula"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"I majúscula, punt superior"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"Símbol desconegut"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Emoji desconegut"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Hi ha caràcters alternatius disponibles."</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Els caràcters alternatius s\'ignoren."</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Hi ha suggeriments alternatius disponibles."</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Els suggeriments alternatius s\'ignoren."</string>
 </resources>
diff --git a/java/res/values-ca/strings.xml b/java/res/values-ca/strings.xml
index cd5e1d4..7f0782d 100644
--- a/java/res/values-ca/strings.xml
+++ b/java/res/values-ca/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Suggereix noms de contactes"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Utilitza els noms de contactes per fer suggeriments i correccions"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Suggeriments personalitz."</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"Millora <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Punt amb doble espai"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Picar dues vegades la barra d\'espai insereix punt i espai blanc"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Majúscules automàtiques"</string>
diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml
index fe51c79..abbdcbe 100644
--- a/java/res/values-cs/strings.xml
+++ b/java/res/values-cs/strings.xml
@@ -52,7 +52,7 @@
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Dvojím klepnutím na mezerník vložíte tečku následovanou mezerou."</string>
     <string name="auto_cap" msgid="1719746674854628252">"Velká písmena automaticky"</string>
     <string name="auto_cap_summary" msgid="7934452761022946874">"Kapitalizace prvního slova každé věty"</string>
-    <string name="edit_personal_dictionary" msgid="3996910038952940420">"Osobní slovník"</string>
+    <string name="edit_personal_dictionary" msgid="3996910038952940420">"Vlastní slovník"</string>
     <string name="configure_dictionaries_title" msgid="4238652338556902049">"Doplňkové slovníky"</string>
     <string name="main_dictionary" msgid="4798763781818361168">"Hlavní slovník"</string>
     <string name="prefs_show_suggestions" msgid="8026799663445531637">"Zobrazit návrhy oprav"</string>
diff --git a/java/res/values-en-rGB/strings-action-keys.xml b/java/res/values-en-rGB/strings-action-keys.xml
index b8b02e1..6514e85 100644
--- a/java/res/values-en-rGB/strings-action-keys.xml
+++ b/java/res/values-en-rGB/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"Prev"</string>
     <string name="label_done_key" msgid="7564866296502630852">"Finished"</string>
     <string name="label_send_key" msgid="482252074224462163">"Send"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"Search"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"Pause"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"Wait"</string>
 </resources>
diff --git a/java/res/values-en-rGB/strings-letter-descriptions.xml b/java/res/values-en-rGB/strings-letter-descriptions.xml
new file mode 100644
index 0000000..514bc6c
--- /dev/null
+++ b/java/res/values-en-rGB/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Feminine ordinal indicator"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Micro sign"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Masculine ordinal indicator"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Sharp S"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grave"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, acute"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circumflex"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diaeresis"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ring above"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligature"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilla"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grave"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, acute"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circumflex"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diaeresis"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grave"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, acute"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circumflex"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diaeresis"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grave"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, acute"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circumflex"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diaeresis"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, stroke"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grave"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, acute"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circumflex"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diaeresis"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, acute"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diaeresis"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macron"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breve"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, acute"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circumflex"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, dot above"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, stroke"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macron"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, dot above"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circumflex"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, dot above"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilla"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circumflex"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, stroke"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macron"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Dotless I"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligature"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circumflex"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilla"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, acute"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilla"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, middle dot"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, stroke"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, acute"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilla"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, preceded by apostrophe"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macron"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, double acute"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligature"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, acute"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilla"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, acute"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circumflex"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilla"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilla"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, stroke"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macron"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, ring above"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, double acute"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circumflex"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circumflex"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, acute"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, dot above"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Long S"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, horn"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, horn"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, comma below"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, comma below"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, dot below"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, hook above"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circumflex and acute"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circumflex and grave"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circumflex and hook above"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circumflex and tilde"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circumflex and dot below"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breve and acute"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breve and grave"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breve and hook above"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breve and tilde"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breve and dot below"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, dot below"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, hook above"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circumflex and acute"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circumflex and grave"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circumflex and hook above"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circumflex and tilde"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circumflex and dot below"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, hook above"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, dot below"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, dot below"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, hook above"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circumflex and acute"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circumflex and grave"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circumflex and hook above"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circumflex and tilde"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circumflex and dot below"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, horn and acute"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, horn and grave"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, horn and hook above"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, horn and tilde"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, horn and dot below"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, dot below"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, hook above"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, horn and acute"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, horn and grave"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, horn and hook above"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, horn and tilde"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, horn and dot below"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grave"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, dot below"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, hook above"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Inverted exclamation mark"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Left-pointing double angle quotation mark"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Middle dot"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Superscript one"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Right-pointing double angle quotation mark"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Inverted question mark"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Left single quotation mark"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Right single quotation mark"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Single low-9 quotation mark"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Left double quotation mark"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Right double quotation mark"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Dagger"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Double dagger"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Per mille sign"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prime"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Double prime"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Single left-pointing angle quotation mark"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Single right-pointing angle quotation mark"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"Superscript four"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"Superscript latin small letter n"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Peso sign"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"Care of"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"Rightwards arrow"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Downwards arrow"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Empty set"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Increment"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"Less than or equal to"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"Greater than or equal to"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"Black star"</string>
+</resources>
diff --git a/java/res/values-en-rGB/strings-talkback-descriptions.xml b/java/res/values-en-rGB/strings-talkback-descriptions.xml
index 3956777..e209b54 100644
--- a/java/res/values-en-rGB/strings-talkback-descriptions.xml
+++ b/java/res/values-en-rGB/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"No text entered"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corrects <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> to <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> performs auto-correction"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"Unknown character"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"More symbols"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Places"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Symbols"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emoticons"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"Capital <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"Capital I"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"Capital I, dot above"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"Unknown symbol"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Unknown emoji"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Alternative characters are available"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Alternative characters are dismissed"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Alternative suggestions are available"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Alternative suggestions are dismissed"</string>
 </resources>
diff --git a/java/res/values-en-rGB/strings.xml b/java/res/values-en-rGB/strings.xml
index 0375ad2..75697ad 100644
--- a/java/res/values-en-rGB/strings.xml
+++ b/java/res/values-en-rGB/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Suggest Contact names"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Use names from Contacts for suggestions and corrections"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Personalised suggestions"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"Improve <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Double-space full stop"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Double tap on spacebar inserts a full stop followed by a space"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Auto-capitalisation"</string>
diff --git a/java/res/values-en-rIN/strings-action-keys.xml b/java/res/values-en-rIN/strings-action-keys.xml
index b8b02e1..6514e85 100644
--- a/java/res/values-en-rIN/strings-action-keys.xml
+++ b/java/res/values-en-rIN/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"Prev"</string>
     <string name="label_done_key" msgid="7564866296502630852">"Finished"</string>
     <string name="label_send_key" msgid="482252074224462163">"Send"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"Search"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"Pause"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"Wait"</string>
 </resources>
diff --git a/java/res/values-en-rIN/strings-letter-descriptions.xml b/java/res/values-en-rIN/strings-letter-descriptions.xml
new file mode 100644
index 0000000..514bc6c
--- /dev/null
+++ b/java/res/values-en-rIN/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Feminine ordinal indicator"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Micro sign"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Masculine ordinal indicator"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Sharp S"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grave"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, acute"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circumflex"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diaeresis"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ring above"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligature"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilla"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grave"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, acute"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circumflex"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diaeresis"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grave"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, acute"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circumflex"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diaeresis"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grave"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, acute"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circumflex"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diaeresis"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, stroke"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grave"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, acute"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circumflex"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diaeresis"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, acute"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diaeresis"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macron"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breve"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, acute"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circumflex"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, dot above"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, stroke"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macron"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, dot above"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circumflex"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, dot above"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilla"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circumflex"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, stroke"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macron"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Dotless I"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligature"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circumflex"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilla"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, acute"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilla"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, middle dot"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, stroke"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, acute"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilla"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, preceded by apostrophe"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macron"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, double acute"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligature"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, acute"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilla"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, acute"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circumflex"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilla"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilla"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, stroke"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macron"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, ring above"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, double acute"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circumflex"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circumflex"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, acute"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, dot above"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Long S"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, horn"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, horn"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, comma below"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, comma below"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, dot below"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, hook above"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circumflex and acute"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circumflex and grave"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circumflex and hook above"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circumflex and tilde"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circumflex and dot below"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breve and acute"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breve and grave"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breve and hook above"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breve and tilde"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breve and dot below"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, dot below"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, hook above"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circumflex and acute"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circumflex and grave"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circumflex and hook above"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circumflex and tilde"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circumflex and dot below"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, hook above"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, dot below"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, dot below"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, hook above"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circumflex and acute"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circumflex and grave"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circumflex and hook above"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circumflex and tilde"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circumflex and dot below"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, horn and acute"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, horn and grave"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, horn and hook above"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, horn and tilde"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, horn and dot below"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, dot below"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, hook above"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, horn and acute"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, horn and grave"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, horn and hook above"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, horn and tilde"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, horn and dot below"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grave"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, dot below"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, hook above"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Inverted exclamation mark"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Left-pointing double angle quotation mark"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Middle dot"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Superscript one"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Right-pointing double angle quotation mark"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Inverted question mark"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Left single quotation mark"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Right single quotation mark"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Single low-9 quotation mark"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Left double quotation mark"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Right double quotation mark"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Dagger"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Double dagger"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Per mille sign"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prime"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Double prime"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Single left-pointing angle quotation mark"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Single right-pointing angle quotation mark"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"Superscript four"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"Superscript latin small letter n"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Peso sign"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"Care of"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"Rightwards arrow"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Downwards arrow"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Empty set"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Increment"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"Less than or equal to"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"Greater than or equal to"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"Black star"</string>
+</resources>
diff --git a/java/res/values-en-rIN/strings-talkback-descriptions.xml b/java/res/values-en-rIN/strings-talkback-descriptions.xml
index 3956777..e209b54 100644
--- a/java/res/values-en-rIN/strings-talkback-descriptions.xml
+++ b/java/res/values-en-rIN/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"No text entered"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corrects <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> to <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> performs auto-correction"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"Unknown character"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"More symbols"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Places"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Symbols"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emoticons"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"Capital <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"Capital I"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"Capital I, dot above"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"Unknown symbol"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Unknown emoji"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Alternative characters are available"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Alternative characters are dismissed"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Alternative suggestions are available"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Alternative suggestions are dismissed"</string>
 </resources>
diff --git a/java/res/values-en-rIN/strings.xml b/java/res/values-en-rIN/strings.xml
index 0375ad2..75697ad 100644
--- a/java/res/values-en-rIN/strings.xml
+++ b/java/res/values-en-rIN/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Suggest Contact names"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Use names from Contacts for suggestions and corrections"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Personalised suggestions"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"Improve <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Double-space full stop"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Double tap on spacebar inserts a full stop followed by a space"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Auto-capitalisation"</string>
diff --git a/java/res/values-fa/strings-action-keys.xml b/java/res/values-fa/strings-action-keys.xml
index ae393bb..859877c 100644
--- a/java/res/values-fa/strings-action-keys.xml
+++ b/java/res/values-fa/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"قبلی"</string>
     <string name="label_done_key" msgid="7564866296502630852">"اتمام"</string>
     <string name="label_send_key" msgid="482252074224462163">"ارسال"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"جستجو"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"مکث"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"انتظار"</string>
 </resources>
diff --git a/java/res/values-fa/strings-letter-descriptions.xml b/java/res/values-fa/strings-letter-descriptions.xml
new file mode 100644
index 0000000..4687f1b
--- /dev/null
+++ b/java/res/values-fa/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"نشانگر ترتیبی زنانه"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"علامت میکرو"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"نشانگر ترتیبی مردانه"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"‏شارپ S"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"‏A با اکسان گراو"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"‏A با اکسان اگو"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"‏A با هشتک"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"‏A با مدک"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"‏A با دو نقطه"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"‏A با حلقه"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"‏A، ‏E متصل به هم"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"‏C با سدیلا"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"‏E با اکسان گراو"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"‏E با اکسان اگو"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"‏E با هشتک"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"‏E با دو نقطه"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"‏I با اکسان گراو"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"‏I با اکسان اگو"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"‏I با هشتک"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"‏I با دونقطه"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"‏N با مدک"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"‏O با اکسان گراو"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"‏O با اکسان اگو"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"‏O با هشتک"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"‏O با مدک"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"‏O با دونقطه"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"‏O با خط مورب"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"‏U با اکسان گراو"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"‏U با اکسان اگو"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"‏U با هشتک"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"‏U با دو نقطه"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"‏Y با اکسان اگو"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"‏Y با دو نقطه"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"‏A با ماکرون"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"‏A کوتاه"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"‏A با اگنک"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"‏C با اکسان اگو"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"‏C با هشتک"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"‏C با نقطه"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"‏C با هفتک"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"‏D با هفتک"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"‏D با خط مورب"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"‏E با ماکرون"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"‏E کوتاه"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"‏E با نقطه"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"‏E با اگنک"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"‏E با هفتک"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"‏G با هشتک"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"‏G کوتاه"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"‏G با نقطه"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"‏G با سدیلا"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"‏H با هشتک"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"‏H با خط مورب"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"‏I با مدک"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"‏I با ماکرون"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"‏I کوتاه"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"‏I با اگنک"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"‏I بی‌نقطه"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"‏I، ‏J متصل به هم"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"‏I با هشتک"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"‏K با سدیلا"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"‏L با اکسان اگو"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"‏L با سدیلا"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"‏L با هفتک"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"‏L با نقطه وسط"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"‏L با خط مورب"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"‏N با اکسان اگو"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"‏N با سدیلا"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"‏N با هفتک"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"‏N بعد از آپاستراف"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"‏O با ماکرون"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"‏O کوتاه"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"‏O با اکسان اگوی دوتایی"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"‏O، ‏E متصل به هم"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"‏R با اکسان اگو"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"‏R با سدیلا"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"‏R با هفتک"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"‏S با اکسان اگو"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"‏S با هشتک"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"‏S با سدیلا"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"‏S با هفتک"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"‏T با سدیلا"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"‏T با کارون"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"‏T با خط مورب"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"‏U با مدک"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"‏U با ماکرون"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"‏U کوتاه"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"‏U با حلقه"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"‏U با اکسان اگو دوتایی"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"‏U با اگنک"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"‏W با هشتک"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"‏Y با هشتک"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"‏Z با اکسان اگو"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"‏Z با دو نقطه"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"‏Z با هفتک"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"‏S طولانی"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"‏O با شاخ"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"‏U با شاخ"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"‏S با کامای زیرین"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"‏T با کامای زیرین"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"واکه بی‌رنگ"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"‏A با نقطه زیرین"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"‏A با کروشه بالایی"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"‏A با هشتک و اکسان اگو"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"‏A با هشتک و اکسان گراو"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"‏A با هشتک و کروشه بالایی"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"‏A با هشتک و مدک"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"‏A با هشتک و نقطه زیرین"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"‏A کوتاه با اکسان اگو"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"‏A کوتاه با اکسان گراو"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"‏A کوتاه با کروشه بالایی"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"‏A کوتاه با مدک"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"‏A کوتاه با نقطه زیرین"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"‏E با نقطه زیرین"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"‏E با کروشه بالایی"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"‏E با مدک"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"‏E با هشتک و اکسان اگو"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"‏E با هشتک و اکسان گراو"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"‏E با هشتک و کروشه بالایی"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"‏E با هشتک و مدک"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"‏E با هشتک و نقطه زیرین"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"‏I با کروشه بالایی"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"‏I با نقطه زیرین"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"‏O با نقطه زیرین"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"‏O با کروشه بالایی"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"‏O با هشتک و اکسان اگو"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"‏O با هشتک و اکسان گراو"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"‏O با هشتک و کروشه بالایی"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"‏O با هشتک و مدک"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"‏O با هشتک و نقطه زیرین"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"‏O با شاخ و اکسان اگو"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"‏O با شاخ و اکسان گراو"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"‏O با شاخ و کروشه بالایی"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"‏O با شاخ و مدک"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"‏O با شاخ و نقطه زیرین"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"‏U با نقطه زیرین"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"‏U با کروشه بالایی"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"‏U با شاخ و اکسان اگو"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"‏U با شاخ و اکسان گراو"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"‏U با شاخ و کروشه بالایی"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"‏U با شاخ و مدک"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"‏U با شاخ و نقطه زیرین"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"‏Y اکسان گراو"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"‏Y با نقطه زیرین"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"‏Y با کروشه بالایی"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"‏Y با مدک"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"علامت تعجب وارونه"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"گیومه رو به چپ"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"نقطه وسط"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"بالانویس یک"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"گیومه رو به راست"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"علامت سؤال وارونه"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"علامت نقل قول تکی سمت چپ"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"علامت نقل قول تکی سمت راست"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"علامت نقل قول تکی ۹ پایین"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"علامت نقل قول دوتایی سمت چپ"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"علامت نقل قول دوتایی سمت راست"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"نماد خنجر"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"نماد خنجر دوتایی"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"علامت در هزار"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"پریم"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"پریم دوتایی"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"گیومه تکی رو به چپ"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"گیومه تکی رو به راست"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"بالانویس چهار"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"‏بالانویس حرف n کوچک لاتین"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"علامت پسو"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"توسط"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"پیکان سمت راست"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"پیکان رو به پایین"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"مجموعه تهی"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"افزایش"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"کمتر یا مساوی"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"بزرگتر یا مساوی"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"ستاره سیاه"</string>
+</resources>
diff --git a/java/res/values-fa/strings-talkback-descriptions.xml b/java/res/values-fa/strings-talkback-descriptions.xml
index c70040f..988dd5c 100644
--- a/java/res/values-fa/strings-talkback-descriptions.xml
+++ b/java/res/values-fa/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"نوشتاری وارد نشده است"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g>، ‏<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> را به <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> تصحیح می‌کند"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> تصحیح خودکار را انجام می‌دهد"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"نویسه نامشخص"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"نمادهای بیشتر"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"تبدیل"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"مکان‌ها"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"نمادها"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"شکلک‌ها"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"حرف بزرگ <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"‏I بزرگ"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"‏I بزرگ با نقطه بالایی"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"نماد نامشخص"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"‏شکلک emoji نامشخص"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"نویسه‌های جایگزین در دسترس هستند"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"از نویسه‌های جایگزین صرفنظر می‌شود"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"پیشنهادهای جایگزین در دسترس هستند"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"از پیشنهادهای جایگزین صرفنظر می‌شود"</string>
 </resources>
diff --git a/java/res/values-fa/strings.xml b/java/res/values-fa/strings.xml
index 0c466c2..bda2756 100644
--- a/java/res/values-fa/strings.xml
+++ b/java/res/values-fa/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"پیشنهاد نام‌های مخاطب"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"برای پیشنهاد و تصحیح از نام مخاطبین استفاده شود"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"پیشنهادات شخصی شده"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"بهبود <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"نقطه با دو فاصله"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"با دوبار ضربه روی دکمه فاصله نقطه با یک فاصله بعد آن درج می‌شود"</string>
     <string name="auto_cap" msgid="1719746674854628252">"بزرگ‌کردن خودکار حروف"</string>
diff --git a/java/res/values-in/strings-action-keys.xml b/java/res/values-in/strings-action-keys.xml
index 052798d..7f1a28e 100644
--- a/java/res/values-in/strings-action-keys.xml
+++ b/java/res/values-in/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"Balik"</string>
     <string name="label_done_key" msgid="7564866296502630852">"Beres"</string>
     <string name="label_send_key" msgid="482252074224462163">"Kirim"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"Telusur"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"Jeda"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"Tunggu"</string>
 </resources>
diff --git a/java/res/values-in/strings-letter-descriptions.xml b/java/res/values-in/strings-letter-descriptions.xml
new file mode 100644
index 0000000..711f689
--- /dev/null
+++ b/java/res/values-in/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Indikator ordinal feminin"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Simbol mikro"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Indikator ordinal maskulin"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Eszett"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A dengan aksen nontirus (tanda coret miring ke arah kiri di bagian atas)"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A dengan aksen tirus (tanda coret miring ke arah kanan di bagian atas)"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A dengan aksen sirkumfleks (tanda aksen di bagian atas)"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A dengan aksen tilda (tanda gelombang di bagian atas)"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A dengan aksen diaeresis (titik dua di bagian atas)"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A dengan aksen lingkaran di bagian atas"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A E ligatur (Karakter A dan E yang digabungkan menjadi satu kesatuan unit)"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C dengan aksen cedilla (tanda kait di bagian bawah)"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E dengan aksen nontirus"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E dengan aksen tirus"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E dengan aksen sirkumfleks"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E dengan aksen diaeresis"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I dengan aksen nontirus"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I dengan aksen tirus"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I dengan aksen sirkumfleks"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I dengan aksen diaeresis"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N dengan aksen tilda"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O dengan aksen nontirus"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O dengan aksen tirus"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O dengan aksen sirkumfleks"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O dengan aksen tilda"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O dengan aksen diaeresis"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O coret"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U dengan aksen nontirus"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U dengan aksen tirus"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U dengan aksen sirkumfleks"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U dengan aksen diaeresis"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y dengan aksen tirus"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn (sekarang diganti dengan huruf th)"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y dengan aksen diaeresis"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A dengan aksen makron (tanda pengulur/makron di bagian atas)"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A dengan aksen breve (tanda breve di bagian atas)"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A dengan aksen ogonek (tanda ekor di sebelah kanan bawah untuk menunjukkan bunyi sengau)"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C dengan aksen tirus"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C dengan aksen sirkumfleks"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C dengan titik di bagian atas"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C dengan aksen caron (tanda caron di bagian atas)"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D dengan aksen caron"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D coret"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E dengan aksen makron"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E dengan aksen breve"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E dengan titik di bagian atas"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E dengan aksen ogonek"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E dengan aksen caron"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G dengan aksen sirkumfleks"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G dengan aksen breve"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G dengan aksen titik di bagian atas"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G dengan aksen cedilla"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H dengan aksen sirkumfleks"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H coret"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I dengan aksen tilda"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I dengan aksen makron"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I dengan aksen breve"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I dengan aksen ogonek"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I tanpa titik"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I dan J ligatur"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J dengan aksen sirkumfleks"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K dengan aksen cedilla"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L dengan aksen tirus"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L dengan aksen cedilla"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L dengan aksen caron"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L dengan titik di tengah"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L coret"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N dengan aksen tirus"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N dengan aksen cedilla"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N dengan aksen caron"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N yang didahului tanda apostrof"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O dengan aksen makron"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O dengan aksen breve"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O dengan aksen tirus ganda"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O dan E ligatur"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R dengan aksen tirus"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R dengan aksen cedilla"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R dengan aksen caron"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S dengan aksen tirus"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S dengan aksen sirkumfleks"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S dengan aksen cedilla"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S dengan aksen caron"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T dengan aksen cedilla"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T dengan aksen caron"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T coret"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U dengan aksen tilda"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U dengan aksen makron"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U dengan aksen breve"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U dengan aksen lingkaran di bagian atas"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U dengan aksen tirus ganda"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U dengan aksen ogonek"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W dengan aksen sirkumfleks"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y dengan aksen sirkumfleks"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z dengan aksen tirus"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z dengan titik di bagian atas"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z dengan aksen caron"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S Panjang"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O dengan aksen tanduk"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U dengan aksen tanduk"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S dengan aksen koma di bagian bawah"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T dengan aksen koma di bagian bawah"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa (aksen pepet)"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A dengan aksen titik di bagian bawah"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A dengan aksen kait di bagian atas"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A dengan aksen sirkumfleks dan tirus"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A dengan aksen sirkumfleks dan nontirus"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A dengan aksen sirkumfleks dan kait di bagian atas"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A dengan aksen sirkumfleks dan tilda"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A dengan aksen sirkumfleks dan titik di bagian bawah"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A dengan aksen breve dan tirus"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A dengan aksen breve dan nontirus"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A dengan aksen breve dan kait di bagian atas"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A dengan aksen breve dan tilda"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A dengan aksen breve dan titik di bagian bawah"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E dengan aksen titik di bagian bawah"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E dengan aksen kait di bagian atas"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E dengan aksen tilda"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E dengan aksen sirkumfleks dan tirus"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E dengan aksen sirkumfleks dan nontirus"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E dengan aksen sirkumfleks dan kait di bagian atas"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E dengan aksen sirkumfleks dan tilda"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E dengan aksen sirkumfleks dan titik di bagian bawah"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I dengan aksen kait di bagian atas"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I dengan aksen titik di bagian bawah"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O dengan aksen titik di bagian bawah"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O dengan aksen kait di bagian atas"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O dengan aksen sirkumfleks dan tirus"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O dengan aksen sirkumfleks dan nontirus"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O dengan aksen sirkumfleks dan kait di bagian atas"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O dengan aksen sirkumfleks dan tilda"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O dengan aksen sirkumfleks dan titik di bagian bawah"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O dengan aksen tanduk dan tirus"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O dengan aksen tanduk dan nontirus"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O dengan aksen tanduk dan kait di bagian atas"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O dengan aksen tanduk dan tilda"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O dengan aksen tanduk dan titik di bagian bawah"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U dengan aksen titik di bagian bawah"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U dengan aksen kait di bagian atas"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U dengan aksen tanduk dan tirus"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U dengan aksen tanduk dan nontirus"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U dengan aksen tanduk dan kait di bagian atas"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U dengan aksen tanduk dan tilda"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U dengan aksen tanduk dan titik di bagian bawah"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y dengan aksen nontirus"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y dengan aksen titik di bagian bawah"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y dengan aksen kait di bagian atas"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y dengan aksen tilda"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Tanda seru terbalik"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Dua tanda kurung sudut kiri"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Titik tengah"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Superscript satu"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Dua tanda kurung sudut kanan"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Tanda tanya terbalik"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Tanda petik tunggal kiri"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Tanda petik tunggal kanan"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Tanda petik tunggal di bagian bawah"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Tanda petik ganda kiri"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Tanda petik ganda kanan"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Dagger (Tanda belati)"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Dagger ganda"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Simbol per mil"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Tanda petik"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Tanda petik ganda"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Tanda kurung sudut kiri tunggal"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Tanda kurung sudut kanan tunggal"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"Superscript empat"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"Superscript huruf latin kecil n"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Simbol peso"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"Dengan alamat"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"Panah ke kanan"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Panah ke bawah"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Himpunan kosong"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Penambahan"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"Kurang dari atau sama dengan"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"Lebih dari atau sama dengan"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"Bintang hitam"</string>
+</resources>
diff --git a/java/res/values-in/strings-talkback-descriptions.xml b/java/res/values-in/strings-talkback-descriptions.xml
index 6f29707..f7334d9 100644
--- a/java/res/values-in/strings-talkback-descriptions.xml
+++ b/java/res/values-in/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"Tidak ada teks yang dimasukkan"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> mengoreksi <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> menjadi <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> melakukan koreksi otomatis"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"Karakter tak dikenal"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Simbol lainnya"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Tempat"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Simbol"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emotikon"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"Huruf kapital <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"Huruf kapital I"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"Huruf kapital I dengan aksen titik di bagian atas"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"Simbol tak dikenal"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Emoji tak dikenal"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Karakter alternatif tersedia"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Karakter alternatif ditolak"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Saran alternatif tersedia"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Saran alternatif ditolak"</string>
 </resources>
diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml
index 160b2ee..a5babcd 100644
--- a/java/res/values-in/strings.xml
+++ b/java/res/values-in/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Sarankan nama Kontak"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Menggunakan nama dari Kontak untuk saran dan koreksi"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Saran hasil personalisasi"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"Tingkatkan <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Titik spasi ganda"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Mengetuk tombol spasi dua kali akan memasukkan titik diikuti satu spasi"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Kapitalisasi otomatis"</string>
diff --git a/java/res/values-iw/strings-action-keys.xml b/java/res/values-iw/strings-action-keys.xml
index 398c081..f72a6fe 100644
--- a/java/res/values-iw/strings-action-keys.xml
+++ b/java/res/values-iw/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"הקודם"</string>
     <string name="label_done_key" msgid="7564866296502630852">"בוצע"</string>
     <string name="label_send_key" msgid="482252074224462163">"שלח"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"חפש"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"השהה"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"המתן"</string>
 </resources>
diff --git a/java/res/values-iw/strings-letter-descriptions.xml b/java/res/values-iw/strings-letter-descriptions.xml
new file mode 100644
index 0000000..1b0e72f
--- /dev/null
+++ b/java/res/values-iw/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"סימן סידורי נקבי"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"סימן מיקרו"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"סימן סידורי זכרי"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"‏S חדה"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"‏A‏, הטעמה משנית"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"‏A, הטעמה עלית"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"‏A, גג"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"‏A, טילדה"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"‏A, עלית כפולה"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"‏A, טבעת מעל"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"‏A‏, E, ליגטורה"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"‏C, סדיליה"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"‏E, הטעמה משנית"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"‏E, הטעמה עלית"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"‏E, גג"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"‏E, הטעמה עלית כפולה"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"‏I, הטעמה משנית"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"‏I, הטעמה עלית"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"‏I, גג"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"‏I, הטעמה עלית כפולה"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"‏N, טילדה"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"‏O, הטעמה משנית"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"‏O, הטעמה עלית"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"‏O, גג"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"‏O, טילדה"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"‏O, הטעמה עלית כפולה"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"‏O, קו חוצה"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"‏U, הטעמה משנית"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"‏U, הטעמה עלית"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"‏U, גג"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"‏U, הטעמה עלית כפולה"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"‏Y, הטעמה עלית"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"‏Y, הטעמה עלית כפולה"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"‏A, קו עלי"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"‏A, ברווה"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"‏A, זנבון"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"‏C, הטעמה עלית"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"‏C, גג"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"‏C, נקודה מעל"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"‏C, וי קטן"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"‏D, וי קטן"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"‏D, קו חוצה"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"‏E, קו עלי"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"‏E, ברווה"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"‏E, נקודה מעל"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"‏E, זנבון"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"‏E, וי קטן"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"‏G, גג"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"‏G, ברווה"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"‏G, נקודה מעל"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"‏G, סדיליה"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"‏H, גג"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"‏H, קו חוצה"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"‏I, טילדה"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"‏I, קו עלי"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"‏I, ברווה"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"‏I, זנבון"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"‏I ללא נקודות"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"‏I‏, J, ליגטורה"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"‏J, גג"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"‏K, סדיליה"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"‏L, הטעמה עלית"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"‏L, סדיליה"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"‏L, וי קטן"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"‏L, נקודה אמצעית"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"‏L, קו חוצה"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"‏N, הטעמה עלית"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"‏N, סדיליה"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"‏N, וי קטן"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"‏N, עם גרש לפני"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"‏O, קו עלי"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"‏O, ברווה"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"‏O, הטעמה עלית כפולה"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"‏O‏, E, ליגטורה"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"‏R, הטעמה עלית"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"‏R, סדיליה"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"‏R, וי קטן"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"‏S, הטעמה עלית"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"‏S, גג"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"‏S, סדיליה"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"‏S, וי קטן"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"‏T, סדיליה"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"‏T, וי קטן"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"‏T, קו חוצה"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"‏U, טילדה"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"‏U, קו עלי"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"‏U, ברווה"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"‏U, טבעת מעל"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"‏U, הטעמה עלית כפולה"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"‏U, זנבון"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"‏W, גג"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"‏Y, גג"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"‏Z, הטעמה עלית"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"‏Z, נקודה מעל"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"‏Z, וי קטן"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"‏S ארוכה"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"‏O, קרן"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"‏U, קרן"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"‏S, פסיק מתחת"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"‏T, פסיק מתחת"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"‏A, נקודה מתחת"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"‏A, קרס מעל"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"‏A, גג והטעמה עלית"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"‏A, גג והטעמה משנית"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"‏A, גג וקרס מעל"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"‏A, גג וטילדה"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"‏A, גג ונקודה מתחת"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"‏A, ברווה והטעמה עלית"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"‏A, ברווה והטעמה משנית"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"‏A, ברווה וקרס מעל"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"‏A, ברווה וטילדה"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"‏A, ברווה ונקודה מתחת"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"‏E, נקודה מתחת"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"‏E, קרס מעל"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"‏E, טילדה"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"‏E, גג והטעמה עלית"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"‏E, גג והטעמה משנית"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"‏E, גג וקרס מעל"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"‏E, גג וטילדה"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"‏E, גג ונקודה מתחת"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"‏I, קרס מעל"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"‏I, נקודה מתחת"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"‏O, נקודה מתחת"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"‏O, קרס מעל"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"‏O, גג והטעמה עלית"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"‏O, גג והטעמה משנית"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"‏O, גג וקרס מעל"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"‏O, גג וטילדה"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"‏O, גג ונקודה מתחת"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"‏O, קרן והטעמה עלית"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"‏O, קרן והטעמה משנית"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"‏O, קרן וקרס מעל"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"‏O, קרן וטילדה"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"‏O, קרן ונקודה מתחת"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"‏U, נקודה מתחת"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"‏U, קרס מעל"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"‏U, קרן והטעמה עלית"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"‏U, קרן והטעמה משנית"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"‏U, קרן וקרס מעל"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"‏U, קרן וטילדה"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"‏U, קרן ונקודה מתחת"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"‏Y, הטעמה משנית"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"‏Y, נקודה מתחת"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"‏Y, קרס מעל"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"‏Y, טילדה"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"סימן קריאה הפוך"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"סימן ציטוט זוויתי כפול הפונה שמאלה"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"נקודה אמצעית"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"אחד בכתב עלי"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"סימן ציטוט זוויתי כפול הפונה ימינה"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"סימן שאלה הפוך"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"גרש שמאלי יחיד"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"גרש ימני יחיד"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"גרש יחיד תחתון"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"מירכאות כפולות שמאליות"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"מירכאות כפולות ימניות"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"צלבון"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"צלבון כפול"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"סימן פרומיל"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prime"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"‏Prime כפול"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"סימן ציטוט זוויתי יחיד הפונה שמאלה"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"סימן ציטוט זוויתי יחיד הפונה ימינה"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"ארבע בכתב עלי"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"‏n לטינית קטנה בכתב עלי"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"סימן פזו"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"סימן \"לכבוד\""</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"חץ ימינה"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"חץ מטה"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Empty Set"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"הגדל"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"קטן מ- או שווה ל-"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"גדול מ- או שווה ל-"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"כוכב שחור"</string>
+</resources>
diff --git a/java/res/values-iw/strings-talkback-descriptions.xml b/java/res/values-iw/strings-talkback-descriptions.xml
index 435aaba..a43b64e 100644
--- a/java/res/values-iw/strings-talkback-descriptions.xml
+++ b/java/res/values-iw/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"לא הוזן טקסט"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> מתקן את <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> ל-<xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> מבצע תיקון אוטומטי"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"תו לא מוכר"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"סמלים נוספים"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"מקומות"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"סמלים"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"רגשונים"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> גדולה"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"‏I גדולה"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"‏I גדולה, נקודה מעל"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"סמל לא מוכר"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"‏Emoji לא מוכר"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"תווים חלופיים זמינים"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"תווים חלופיים נדחים"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"הצעות חלופיות זמינות"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"הצעות חלופיות נדחות"</string>
 </resources>
diff --git a/java/res/values-iw/strings.xml b/java/res/values-iw/strings.xml
index 297048c..705121e 100644
--- a/java/res/values-iw/strings.xml
+++ b/java/res/values-iw/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"הצע שמות של אנשי קשר"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"השתמש בשמות מרשימת אנשי הקשר עבור הצעות ותיקונים"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"הצעות מותאמות אישית"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"שפר את <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"רווח כפול לנקודה"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"הקשה פעמיים על מקש הרווח מזינה נקודה ואחריה רווח"</string>
     <string name="auto_cap" msgid="1719746674854628252">"הפיכת אותיות לרישיות באופן אוטומטי"</string>
diff --git a/java/res/values-ka-rGE/strings-action-keys.xml b/java/res/values-ka-rGE/strings-action-keys.xml
index 3ad6c33..5fa9235 100644
--- a/java/res/values-ka-rGE/strings-action-keys.xml
+++ b/java/res/values-ka-rGE/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"წინა"</string>
     <string name="label_done_key" msgid="7564866296502630852">"დასრ."</string>
     <string name="label_send_key" msgid="482252074224462163">"გაგზ."</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"ძიება"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"პაუზა"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"მოცდა"</string>
 </resources>
diff --git a/java/res/values-ka-rGE/strings-letter-descriptions.xml b/java/res/values-ka-rGE/strings-letter-descriptions.xml
new file mode 100644
index 0000000..ae3ddab
--- /dev/null
+++ b/java/res/values-ka-rGE/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Feminine ordinal indicator"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"ნიშანი მიკრო"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Masculine ordinal indicator"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Sharp S"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grave"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, acute"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circumflex"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diaeresis"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ring above"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligature"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilla"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grave"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, acute"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circumflex"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diaeresis"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grave"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, acute"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circumflex"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diaeresis"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grave"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, acute"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circumflex"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diaeresis"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, stroke"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grave"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, acute"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circumflex"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diaeresis"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, acute"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diaeresis"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macron"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breve"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, acute"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circumflex"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, dot above"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, stroke"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macron"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, dot above"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circumflex"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, dot above"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilla"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circumflex"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, stroke"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macron"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Dotless I"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligature"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circumflex"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilla"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, acute"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilla"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, middle dot"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, stroke"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, acute"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilla"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, preceded by apostrophe"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macron"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, double acute"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligature"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, acute"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilla"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, acute"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circumflex"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilla"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilla"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, stroke"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macron"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, ring above"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, double acute"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circumflex"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circumflex"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, acute"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, dot above"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Long S"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, horn"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, horn"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, comma below"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, comma below"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, dot below"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, hook above"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circumflex and acute"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circumflex and grave"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circumflex and hook above"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circumflex and tilde"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circumflex and dot below"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breve and acute"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breve and grave"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breve and hook above"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breve and tilde"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breve and dot below"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, dot below"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, hook above"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circumflex and acute"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circumflex and grave"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circumflex and hook above"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circumflex and tilde"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circumflex and dot below"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, hook above"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, dot below"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, dot below"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, hook above"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circumflex and acute"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circumflex and grave"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circumflex and hook above"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circumflex and tilde"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circumflex and dot below"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, horn and acute"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, horn and grave"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, horn and hook above"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, horn and tilde"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, horn and dot below"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, dot below"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, hook above"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, horn and acute"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, horn and grave"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, horn and hook above"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, horn and tilde"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, horn and dot below"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grave"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, dot below"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, hook above"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Inverted exclamation mark"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Left-pointing double angle quotation mark"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Middle dot"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"ერთიანი ზედა ინდექსში"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Right-pointing double angle quotation mark"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Inverted question mark"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Left single quotation mark"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Right single quotation mark"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Single low-9 quotation mark"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Left double quotation mark"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Right double quotation mark"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Dagger"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Double dagger"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Per mille sign"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prime"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Double prime"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"მარცხნივ მიმართლი კუთხოვანი ერთმაგი ბრჭყალი"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"მარჯვნივ მიმართლი კუთხოვანი ერთმაგი ბრჭყალი"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"ოთხიანი ზედა ინდექსში"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"ლათინური ასო n ზედა ინდექსში"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"პესოს ნიშანი"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"Care of"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"მარჯვნივ მიმართული ისარი"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"ქვევით მიმართლი ისარი"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Empty set"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Increment"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"ნაკლებობა ან ტოლობა"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"მეტობა ან ტოლობა"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"შავი ვარსკვლავი"</string>
+</resources>
diff --git a/java/res/values-ka-rGE/strings-talkback-descriptions.xml b/java/res/values-ka-rGE/strings-talkback-descriptions.xml
index 0cf7e7c..5d23b09 100644
--- a/java/res/values-ka-rGE/strings-talkback-descriptions.xml
+++ b/java/res/values-ka-rGE/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"ტექსტი შეყვანილი არ არის"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> შეასწორებს <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>-ს <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>-ად"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> ასრულებს ავტოკორექციას"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"უცნობი სიმბოლო"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"დამატებითი სიმბოლოები"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"ადგილები"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"სიმბოლოები"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"სიცილაკები"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"დიდი <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"დიდი I"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"Capital I, dot above"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"უცნობი სიმბოლო"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"უცნობი emoji"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"ალტერნატიული სიმბოლოები ხელმისაწვდომია"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"ალტერნატიული სიმბოლოები გამოტოვებულია"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"ალტერნატიული შეთავაზებები ხელმისაწვდომია"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"ალტერნატიული შეთავაზებები გამოტოვებულია"</string>
 </resources>
diff --git a/java/res/values-ka-rGE/strings.xml b/java/res/values-ka-rGE/strings.xml
index 7c0026e..43dcc63 100644
--- a/java/res/values-ka-rGE/strings.xml
+++ b/java/res/values-ka-rGE/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"კონტაქტის სახელების შეთავაზება"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"კონტაქტებიდან სახელების გამოყენება შეთავაზებებისთვის და კორექციისთვის"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"პერსონალიზებული შეთავაზებები"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>-ის გაუმჯობესება"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"წერტილი ორმაგი შორისით"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"შორისზე ორჯერ შეხება დაწერს წერტილს და შორისის სიმბოლოს"</string>
     <string name="auto_cap" msgid="1719746674854628252">"ავტო-კაპიტალიზაცია"</string>
diff --git a/java/res/values-km-rKH/strings-action-keys.xml b/java/res/values-km-rKH/strings-action-keys.xml
index d6b11b7..3ff6d49 100644
--- a/java/res/values-km-rKH/strings-action-keys.xml
+++ b/java/res/values-km-rKH/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"មុន"</string>
     <string name="label_done_key" msgid="7564866296502630852">"រួចរាល់"</string>
     <string name="label_send_key" msgid="482252074224462163">"ផ្ញើ"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"ស្វែងរក"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"ផ្អាក"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"រង់ចាំ"</string>
 </resources>
diff --git a/java/res/values-km-rKH/strings-letter-descriptions.xml b/java/res/values-km-rKH/strings-letter-descriptions.xml
new file mode 100644
index 0000000..f58eff4
--- /dev/null
+++ b/java/res/values-km-rKH/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"សញ្ញា ª"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"សញ្ញា µ"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"សញ្ញា º"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"សញ្ញា ß"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"សញ្ញា à"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"សញ្ញា á"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"សញ្ញា â"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"សញ្ញា ã"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"សញ្ញា ä"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"សញ្ញា å"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"សញ្ញា æ"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"សញ្ញា ç"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"សញ្ញា è"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"សញ្ញា é"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"សញ្ញា ê"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"សញ្ញា ë"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"សញ្ញា ì"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"សញ្ញា í"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"សញ្ញា î"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"សញ្ញា ï"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"សញ្ញា ð"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"សញ្ញា ñ"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"សញ្ញា ò"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"សញ្ញា ó"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"សញ្ញា ô"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"សញ្ញា õ"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"សញ្ញា ö"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"សញ្ញា ø"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"សញ្ញា ù"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"សញ្ញា ú"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"សញ្ញា û"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"សញ្ញា ü"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"សញ្ញា ý"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"សញ្ញា þ"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"សញ្ញា ÿ"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"សញ្ញា ā"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"សញ្ញា ă"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"សញ្ញា ą"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"សញ្ញា ć"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"សញ្ញា ĉ"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"សញ្ញា ċ"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"សញ្ញា č"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"សញ្ញា ď"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"សញ្ញា đ"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"សញ្ញា ē"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"សញ្ញា ĕ"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"សញ្ញា ė"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"សញ្ញា ę"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"សញ្ញា ě"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"សញ្ញា ĝ"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"សញ្ញា ğ"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"សញ្ញា ġ"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"សញ្ញា ģ"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"សញ្ញា ĥ"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"សញ្ញា ħ"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"សញ្ញា ĩ"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"សញ្ញា ī"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"សញ្ញា ĭ"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"សញ្ញា į"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"សញ្ញា ı"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"សញ្ញា ij"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"សញ្ញា ĵ"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"សញ្ញា ķ"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"សញ្ញា ĸ"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"សញ្ញា ĺ"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"សញ្ញា ļ"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"សញ្ញា ľ"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"សញ្ញា ŀ"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"សញ្ញា ł"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"សញ្ញា ń"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"សញ្ញា ņ"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"សញ្ញា ň"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"សញ្ញា ʼn"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"សញ្ញា ŋ"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"សញ្ញា ō"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"សញ្ញា ŏ"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"សញ្ញា ő"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"សញ្ញា œ"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"សញ្ញា ŕ"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"សញ្ញា ŗ"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"សញ្ញា ř"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"សញ្ញា ś"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"សញ្ញា ŝ"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"សញ្ញា ş"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"សញ្ញា š"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"សញ្ញា ţ"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"សញ្ញា ť"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"សញ្ញា ŧ"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"សញ្ញា ũ"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"សញ្ញា ū"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"សញ្ញា ŭ"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"សញ្ញា ů"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"សញ្ញា ű"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"សញ្ញា ų"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"សញ្ញា ŵ"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"សញ្ញា ŷ"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"សញ្ញា ź"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"សញ្ញា ż"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"សញ្ញា ž"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"សញ្ញា ſ"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"សញ្ញា ơ"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"សញ្ញា ư"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"សញ្ញា ș"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"សញ្ញា ț"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"សញ្ញា ə"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"សញ្ញា ạ"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"សញ្ញា ả"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"សញ្ញា ấ"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"សញ្ញា ầ"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"សញ្ញា ẩ"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"សញ្ញា ẫ"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"សញ្ញា ậ"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"សញ្ញា ắ"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"សញ្ញា ằ"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"សញ្ញា ẳ"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"សញ្ញា ẵ"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"សញ្ញា ặ"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"សញ្ញា ẹ"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"សញ្ញា ẻ"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"សញ្ញា ẽ"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"សញ្ញា ế"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"សញ្ញា ề"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"សញ្ញា ể"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"សញ្ញា ễ"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"សញ្ញា ệ"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"សញ្ញា ỉ"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"សញ្ញា ị"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"សញ្ញា ọ"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"សញ្ញា ỏ"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"សញ្ញា ố"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"សញ្ញា ồ"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"សញ្ញា ổ"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"សញ្ញា ỗ"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"សញ្ញា ộ"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"សញ្ញា ớ"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"សញ្ញា ờ"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"សញ្ញា ở"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"សញ្ញា ỡ"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"សញ្ញា ợ"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"សញ្ញា ụ"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"សញ្ញា ủ"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"សញ្ញា ứ"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"សញ្ញា ừ"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"សញ្ញា ử"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"សញ្ញា ữ"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"សញ្ញា ự"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"សញ្ញា ỳ"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"សញ្ញា ỵ"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"សញ្ញា ỷ"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"សញ្ញា ỹ"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"សញ្ញា ¡"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"សញ្ញា «"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"សញ្ញា ·"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"សញ្ញា ¹"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"សញ្ញា »"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"សញ្ញា ¿"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"សញ្ញា ‘"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"សញ្ញា ’"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"សញ្ញា ‚"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"សញ្ញា “"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"សញ្ញា ”"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"សញ្ញា †"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"សញ្ញា ‡"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"សញ្ញា ‰"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"សញ្ញា ′"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"សញ្ញា ″"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"សញ្ញា ‹"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"សញ្ញា ›"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"សញ្ញា ⁴"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"សញ្ញា ⁿ"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"សញ្ញា ₱"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"សញ្ញា ℅"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"សញ្ញា →"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"សញ្ញា ↓"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"សញ្ញា ∅"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"សញ្ញា ∆"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"សញ្ញា ≤"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"សញ្ញា ≥"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"សញ្ញា ★"</string>
+</resources>
diff --git a/java/res/values-km-rKH/strings-talkback-descriptions.xml b/java/res/values-km-rKH/strings-talkback-descriptions.xml
index 0f0ac56..e5b7860 100644
--- a/java/res/values-km-rKH/strings-talkback-descriptions.xml
+++ b/java/res/values-km-rKH/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"គ្មាន​អត្ថបទ​​​បាន​បញ្ចូល"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> កែ <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> ទៅ​ជា <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> អនុវត្ត​ការ​កែ​ស្វ័យ​ប្រវត្តិ"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"មិន​ស្គាល់​តួអក្សរ"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"និមិត្ត​សញ្ញា​​ច្រើន​ទៀត"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"ទីកន្លែង"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"និមិត្តសញ្ញា"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"សញ្ញា​អារម្មណ៍"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"អក្សរ​ធំ <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"សញ្ញា I"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"សញ្ញា İ"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"មិន​ស្គាល់​និមិត្តសញ្ញា"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"មិន​ស្គាល់​សញ្ញា​អារម្មណ៍"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"តួអក្សរ​ជំនួស​អាច​ប្រើ​បាន"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"បាន​បដិសេធ​តួអក្សរ​ជំនួស"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"ការ​ស្នើ​ជំនួស​អាច​ប្រើ​បាន"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"បាន​បដិសេធ​ការ​ស្នើ​ជំនួស"</string>
 </resources>
diff --git a/java/res/values-km-rKH/strings.xml b/java/res/values-km-rKH/strings.xml
index 91ba5b9..c55c036 100644
--- a/java/res/values-km-rKH/strings.xml
+++ b/java/res/values-km-rKH/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"ស្នើ​ឈ្មោះ​ទំនាក់ទំនង"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"ប្រើ​ឈ្មោះ​ពី​ទំនាក់ទំនង​សម្រាប់​ការ​​ស្នើ និង​​​កែ"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"ការ​ស្នើ​ផ្ទាល់​ខ្លួន"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"ធ្វើឲ្យ <xliff:g id="APPLICATION_NAME">%s</xliff:g> ប្រសើរ​ឡើង"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"រយៈ​ពេល​ចុច​ដកឃ្លា​ពីរដង"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"ប៉ះ​ដកឃ្លា​ពីរ​​ដង​បញ្ចូល​​​រយៈ​ពេល​ដែល​អនុវត្ត​តាម​ដកឃ្លា"</string>
     <string name="auto_cap" msgid="1719746674854628252">"ការ​សរសេរ​ជា​អក្សរ​ធំ​​ស្វ័យប្រវត្តិ​"</string>
diff --git a/java/res/values-lo-rLA/strings-action-keys.xml b/java/res/values-lo-rLA/strings-action-keys.xml
index 2399305..e1cd913 100644
--- a/java/res/values-lo-rLA/strings-action-keys.xml
+++ b/java/res/values-lo-rLA/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"ກ່ອນໜ້າ"</string>
     <string name="label_done_key" msgid="7564866296502630852">"Done"</string>
     <string name="label_send_key" msgid="482252074224462163">"ສົ່ງ"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"ຊອກຫາ"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"ຢຸດຊົ່ວຄາວ"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"ລໍຖ້າ"</string>
 </resources>
diff --git a/java/res/values-lo-rLA/strings-letter-descriptions.xml b/java/res/values-lo-rLA/strings-letter-descriptions.xml
new file mode 100644
index 0000000..ecc0b7a
--- /dev/null
+++ b/java/res/values-lo-rLA/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"ໂຕ​ບົ່ງ​ຊີ້​ລຳ​ດັບ​ເພດ​ຍິງ"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"ສັນຍາລັກໄມໂຄຣ"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"​ໂຕ​ບົ່ງ​ຊີ້​ລຳ​ດັບ​ເພດ​ຊາຍ"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Sharp S"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grave"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, acute"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circumflex"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diaeresis"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ring above"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligature"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilla"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grave"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, acute"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circumflex"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diaeresis"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grave"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, acute"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circumflex"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diaeresis"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grave"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, acute"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circumflex"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diaeresis"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, stroke"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grave"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, acute"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circumflex"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diaeresis"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, acute"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diaeresis"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macron"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breve"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, acute"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circumflex"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, dot above"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, stroke"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macron"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, dot above"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circumflex"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, dot above"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilla"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circumflex"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, stroke"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macron"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Dotless I"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligature"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circumflex"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilla"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, acute"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilla"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, middle dot"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, stroke"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, acute"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilla"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, preceded by apostrophe"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macron"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, double acute"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligature"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, acute"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilla"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, acute"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circumflex"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilla"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilla"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, stroke"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macron"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, ring above"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, double acute"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circumflex"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circumflex"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, acute"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, dot above"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Long S"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, horn"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, horn"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, comma below"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, comma below"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, dot below"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, hook above"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circumflex and acute"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circumflex and grave"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circumflex and hook above"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circumflex and tilde"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circumflex and dot below"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breve and acute"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breve and grave"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breve and hook above"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breve and tilde"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breve and dot below"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, dot below"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, hook above"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circumflex and acute"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circumflex and grave"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circumflex and hook above"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circumflex and tilde"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circumflex and dot below"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, hook above"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, dot below"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, dot below"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, hook above"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circumflex and acute"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circumflex and grave"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circumflex and hook above"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circumflex and tilde"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circumflex and dot below"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, horn and acute"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, horn and grave"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, horn and hook above"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, horn and tilde"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, horn and dot below"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, dot below"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, hook above"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, horn and acute"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, horn and grave"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, horn and hook above"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, horn and tilde"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, horn and dot below"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grave"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, dot below"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, hook above"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Inverted exclamation mark"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Left-pointing double angle quotation mark"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"​​ຈ້ຳ​ເມັດ​ທາງ​ກາງ"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Superscript one"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Right-pointing double angle quotation mark"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Inverted question mark"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Left single quotation mark"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Right single quotation mark"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Single low-9 quotation mark"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"​ເຄື່ອງ​ໝາຍ​ວົງ​ຢືມ​ຊ້າຍ"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"​ເຄື່ອງ​ໝາຍ​ວົງ​ຢືມ​ຂວາ​"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Dagger"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Double dagger"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"​ເຄື່ອງ​ໝາຍ​ຕໍ່​ໄມລ໌"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prime"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Double prime"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Single left-pointing angle quotation mark"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Single right-pointing angle quotation mark"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"ໂຕ​ຍົກ​ເລກ​ສີ່"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"ໂຕ​ຍົກ​ n ໂຕ​ນ້ອຍ"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"ເຄື່ອງ​ໝາຍເປ​ໂຊ"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"CARE OF"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"​ລູກ​ສອນ​ຊີ້​ໄປ​ຂວາ"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"ລູກ​ສອນ​ຊີ້​ລົງ"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"​ຊຸດ​ຫວ່າງ​ເປົ່າ"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"ເພີ່ມ"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"​ໜ້ອຍກວ່າ ຫຼື​ເທົ່າ​ກັບ"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"ຫຼາຍກວ່າ ຫຼື​ເທົ່າ​ກັບ"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"​ດາວ​ດຳ"</string>
+</resources>
diff --git a/java/res/values-lo-rLA/strings-talkback-descriptions.xml b/java/res/values-lo-rLA/strings-talkback-descriptions.xml
index c6140fd..187b63a 100644
--- a/java/res/values-lo-rLA/strings-talkback-descriptions.xml
+++ b/java/res/values-lo-rLA/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"ບໍ່ມີ​ການໃສ່​ຂໍ້ຄວາມ"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> ແກ້​ໄຂ​ <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> ເປັນ <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> ດຳ​ເນີນ​ການ​ແກ້​ໄຂ​ອັດ​ຕະ​ໂນ​ມັດ"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"​ໂຕ​ອັກ​ສອນ​ທີ່ບໍ່​ຮູ້​ຈັກ"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"​ສັນ​ຍາ​ລັກ​ເພີ່ມ​ເຕີມ"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"ສະຖານທີ່"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"ສັນຍາລັກ"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"​ອີ​ໂມ​ຕິ​ຄອນ"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"ໂຕ​ພິມ​ໃຫຍ່ <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"ໂຕ​ພິມ​ໃຫຍ່ I"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"​ໂຕພິມ​ໃຫຍ່ I ມີ​ຈ້ຳ​ເມັດ​ຢູ່​ເທິງ"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"ສັນ​ຍາ​ລັກ​ທີ່ບໍ່​ຮູ້​ຈັກ"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"ອີ​ໂມ​ຈິ​ທີ່ບໍ່​ຮູ້​ຈັກ"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"​ມີ​ໂຕ​ອັກ​ສອນ​ສຳ​ຮອງ​ໃຫ້​ເລືອກ"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"​ປິດ​ໂຕ​ອັກ​ສອນ​ສຳ​ຮອງ​ແລ້ວ"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"​ມີ​ຄຳ​ແນະ​ນຳ​ສຳ​ຮອງ​ໃຫ້​ເລືອກ"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"​ປິດ​ການ​ແນະ​ນຳ​ສຳ​ຮອງ​ແລ້ວ"</string>
 </resources>
diff --git a/java/res/values-lo-rLA/strings.xml b/java/res/values-lo-rLA/strings.xml
index c8ef7ac..8947a8b 100644
--- a/java/res/values-lo-rLA/strings.xml
+++ b/java/res/values-lo-rLA/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"ແນະນຳລາຍຊື່ຜູ່ຕິດຕໍ່"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"ໃຊ້ຊື່ຈາກລາຍຊື່ຜູ່ຕິດຕໍ່ສຳລັບການແນະນຳ ແລະ ການຊ່ວຍແກ້ຄຳ"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"ຄຳແນະນຳຕາມການນຳໃຊ້ຂອງທ່ານ"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"ປັບ​ປຸງ <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"ຍະຫວ່າງສອງເທື່ອເພື່ອໃສ່ຈ້ຳເມັດ"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"ກົດທີ່ປຸ່ມຍະຫວ່າງສອງເທື່ອເພື່ອໃສ່ຈ້ຳເມັດແລ້ວຕາມດ້ວຍການຍະຫວ່າງ"</string>
     <string name="auto_cap" msgid="1719746674854628252">"ເຮັດໂຕພິມໃຫຍ່ອັດຕະໂນມັດ"</string>
diff --git a/java/res/values-mn-rMN/strings-action-keys.xml b/java/res/values-mn-rMN/strings-action-keys.xml
index a855386..8ebb5bb 100644
--- a/java/res/values-mn-rMN/strings-action-keys.xml
+++ b/java/res/values-mn-rMN/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"Өмнөх"</string>
     <string name="label_done_key" msgid="7564866296502630852">"Дууссан"</string>
     <string name="label_send_key" msgid="482252074224462163">"Илгээх"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"Хайлт"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"Түр зогсоох"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"Хүлээх"</string>
 </resources>
diff --git a/java/res/values-mn-rMN/strings-letter-descriptions.xml b/java/res/values-mn-rMN/strings-letter-descriptions.xml
new file mode 100644
index 0000000..b8f8d85
--- /dev/null
+++ b/java/res/values-mn-rMN/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Эм хүйсийн дугаар заагч"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Микро тэмдэг"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Эр хүйсийн дугаар заагч"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Хурц S"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"А, зүүн малгайтай"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"А, баруун малгайтай"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"А, дээвэр малгайтай"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"А, долгионтой"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"А, хоёр цэгтэй"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, дээрээ цагирагтай"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, залгагдсан"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, дэвсгэртэй"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, зүүн малгайтай"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, баруун малгайтай"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, дээвэр малгайтай"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, хоёр цэгтэй"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, зүүн малгайтай"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, баруун малгайтай"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, дээвэр малгайтай"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, хоёр цэгтэй"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Зураастай ди"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, долгионтой"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, зүүн малгайтай"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, баруун малгайтай"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, дээвэр малгайтай"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, долгионтой"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, хоёр цэгтэй"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, хөндлөн зураастай"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, зүүн малгайтай"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, баруун малгайтай"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, дээвэр малгайтай"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, хоёр цэгтэй"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, баруун малгайтай"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Гэдэстэй багана"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, хоёр цэгтэй"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, хөндлөн малгайтай"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"А, тавган малгайтай"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"А, сүүлтэй"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, баруун малгайтай"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, дээвэр малгайтай"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"С, дээрээ цэгтэй"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, аяган малгайтай"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, аяган малгайтай"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, хөндлөн зураастай"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, хөндлөн малгайтай"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, тавган малгайтай"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, дээрээ цэгтэй"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, сүүлтэй"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, аяган малгайтай"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, дээвэр малгайтай"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, тавган малгайтай"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, дээрээ цэгтэй"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, дэвсгэртэй"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, дээвэр малгайтай"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, хөндлөн зураастай"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, долгионтой"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, хөндлөн малгайтай"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, тавган малгайтай"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, сүүлтэй"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Цэггүй I"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, залгагдсан"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, дээвэр малгайтай"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, дэвсгэртэй"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Кра"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, баруун малгайтай"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, дэвсгэртэй"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, аяган малгайтай"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, дунд цэгтэй"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, хөндлөн зураастай"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, баруун малгайтай"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, дэвсгэртэй"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, аяган малгайтай"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N,"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Инг"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, хөндлөн малгайтай"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, тавган малгайтай"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, давхар баруун малгайтай"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, залгагдсан"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, баруун малгайтай"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, дэвсгэртэй"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, аяган малгайтай"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, баруун малгайтай"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, дээвэр малгайтай"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, дэвсгэртэй"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, аяган малгайтай"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, дэвсгэртэй"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, аяган малгайтай"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, хөндлөн зураастай"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, долгионтой"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, хөндлөн малгайтай"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, тавган малгайтай"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, дээрээ цагирагтай"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, давхар баруун малгайтай"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, сүүлтэй"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, дээвэр малгайтай"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, дээвэр малгайтай"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, баруун малгайтай"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, дээрээ цэгтэй"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, аяган малгайтай"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Урт S"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, эвэртэй"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, эвэртэй"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, доор таслалтай"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, доор таслалтай"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Шва"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"А, доор цэгтэй"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"А, дээр дэгээтэй"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, дээвэр болон баруун малгайтай"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"А, дээвэр болон зүүн малгайтай"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"А, дээвэр болон дээр дэгээтэй"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"А, дээвэр болон долгионтой"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"А, дээвэр болон доор цэгтэй"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"А, тавган болон баруун малгайтай"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"А, тавган болон зүүн малгайтай"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"А, тавган болон дээр дэгээтэй"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"А, тавган болон долгионтой"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"А, тавган болон доор цэгтэй"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, доор цэгтэй"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, дээр дэгээтэй"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, долгионтой"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, дээвэр болон баруун малгайтай"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, дээвэр болон зүүн малгайтай"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, дээвэр болон дээр дэгээтэй"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, дээвэр болон долгионтой"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, дээвэр болон доор цэгтэй"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, дээр дэгээтэй"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, доор цэгтэй"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, доор цэгтэй"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, дээр дэгээтэй"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, дээвэр болон баруун малгайтай"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, дээвэр болон зүүн малгайтай"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, дээвэр болон дээр дэгээтэй"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, дээвэр болон долгионтой"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, дээвэр болон доор цэгтэй"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, эвэр болон баруун малгайтай"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, эвэр болон зүүн малгайтай"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, эвэр болон дээр дэгээтэй"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, эвэр болон долгионтой"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, эвэр болон доор цэгтэй"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, доор цэгтэй"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, дээр дэгээтэй"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, эвэр болон баруун малгайтай"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, эвэр болон зүүн малгайтай"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, эвэр болон дээр дэгээтэй"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, эвэр болон долгионтой"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, эвэр болон доор цэгтэй"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, зүүн малгайтай"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, доор цэгтэй"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, дээр дэгээтэй"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, долгионтой"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Урвуу анхаарлын тэмдэг"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Зүүн заасан давхар хашилт"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Дунд цэг"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Мөрний дээрх нэг"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Баруун заасан давхар хашилт"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Урвуу асуултын тэмдэг"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Зүүн дан хашилт"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Баруун дан хашилт"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Дан доогуур-9 хашилт"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Зүүн давхар хашилт"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Баруун давхар хашилт"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Чинжаал"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Давхар чинжаал"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Нэг мильд тэмдэг"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Штрих"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Давхар штрих"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Зүүн заасан дан хашилт"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Баруун заасан дан хашилт"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"Мөрний дээрх дөрөв"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"Мөрний дээрх жижиг латин n"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Песо тэмдэг"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"Анхааралд"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"Баруун сум"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Доош сум"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Хоосон олонлог"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Өсөлт"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"Бага буюу тэнцүү"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"Их буюу тэнцүү"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"Хар од"</string>
+</resources>
diff --git a/java/res/values-mn-rMN/strings-talkback-descriptions.xml b/java/res/values-mn-rMN/strings-talkback-descriptions.xml
index 1c1e6e7..d2c583e 100644
--- a/java/res/values-mn-rMN/strings-talkback-descriptions.xml
+++ b/java/res/values-mn-rMN/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"Текст оруулаагүй"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> нь <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>-г <xliff:g id="CORRECTED_WORD">%3$s</xliff:g> руу залруулна"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> авто-залруулалт хийдэг"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"Үл мэдэгдэх тэмдэгт"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Шифт"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Өөр тэмдэгтүүд"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Шифт"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Газар"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Симбол"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Эмотикон"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"Том <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"Том I"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"Том I, дээрээ цэгтэй"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"Үл мэдэгдэх симбол"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Үл мэдэгдэх эможи"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Бусад тэмдэгтүүд ашиглах боломжтой"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Бусад тэмдэгтүүдийг хаагдсан"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Бусад санал болголтууд ашиглах боломжтой"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Бусад санал болголтууд хаагдсан"</string>
 </resources>
diff --git a/java/res/values-mn-rMN/strings.xml b/java/res/values-mn-rMN/strings.xml
index bfce751..67e8b4e 100644
--- a/java/res/values-mn-rMN/strings.xml
+++ b/java/res/values-mn-rMN/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Харилцагчдын нэрс санал болгох"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Санал болгох, залруулахда Харилцагчдын нэрсээс ашиглах"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Хувийн тохиргоотой зөвлөмжүүд"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> сайжруулах"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Давхар зайтай цэг"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Ардаа зайтай цэг оруулахын тулд Зай авах дээр давхар товшино уу"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Автоматаар томруулах"</string>
diff --git a/java/res/values-pt-rPT/strings-action-keys.xml b/java/res/values-pt-rPT/strings-action-keys.xml
index 1b5921f..73a6c49 100644
--- a/java/res/values-pt-rPT/strings-action-keys.xml
+++ b/java/res/values-pt-rPT/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"Ant."</string>
     <string name="label_done_key" msgid="7564866296502630852">"Conc."</string>
     <string name="label_send_key" msgid="482252074224462163">"Env."</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"Pesquisar"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"Pausa"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"Esp."</string>
 </resources>
diff --git a/java/res/values-pt-rPT/strings-letter-descriptions.xml b/java/res/values-pt-rPT/strings-letter-descriptions.xml
new file mode 100644
index 0000000..377b157
--- /dev/null
+++ b/java/res/values-pt-rPT/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Indicador ordinal feminino"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Sinal de micro"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Indicador ordinal masculino"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"S curto"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grave"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, agudo"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circunflexo"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, til"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diérese"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, anel sobreposto"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligadura"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilha"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grave"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, agudo"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circunflexo"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diérese"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grave"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, agudo"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circunflexo"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diérese"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, til"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grave"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, agudo"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circunflexo"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, til"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diérese"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, traço"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grave"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, agudo"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circunflexo"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diérese"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, agudo"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diérese"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, mácron"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breve"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, agudo"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circunflexo"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, ponto sobreposto"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, traço"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, mácron"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, ponto sobreposto"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circunflexo"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, ponto sobreposto"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilha"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circunflexo"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, traço"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, til"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, mácron"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I sem ponto"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligadura"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circunflexo"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilha"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, agudo"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilha"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, ponto intermédio"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, traço"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, agudo"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilha"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, precedido de apóstrofe"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, mácron"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, duplo agudo"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligadura"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, agudo"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilha"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, agudo"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circunflexo"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilha"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilha"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, traço"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, til"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, mácron"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, anel sobreposto"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, duplo agudo"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circunflexo"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circunflexo"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, agudo"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, ponto sobreposto"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S longo"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, chifre"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, chifre"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, vírgula subposta"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, vírgula subposta"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, ponto subposto"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, gancho sobreposto"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circunflexo e agudo"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circunflexo e grave"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circunflexo e gancho sobreposto"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circunflexo e til"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circunflexo e ponto subposto"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breve e agudo"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breve e grave"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breve e gancho sobreposto"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breve e til"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breve e ponto subposto"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, ponto subposto"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, gancho sobreposto"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, til"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circunflexo e agudo"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circunflexo e grave"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circunflexo e gancho sobreposto"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circunflexo e til"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circunflexo e ponto subposto"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, gancho sobreposto"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, ponto subposto"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, ponto subposto"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, gancho sobreposto"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circunflexo e agudo"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circunflexo e grave"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circunflexo e gancho sobreposto"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circunflexo e til"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circunflexo e ponto subposto"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, chifre e agudo"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, chifre e grave"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, chifre e gancho sobreposto"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, chifre e til"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, chifre e ponto subposto"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, ponto subposto"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, gancho sobreposto"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, chifre e agudo"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, chifre e grave"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, chifre e gancho sobreposto"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, chifre e til"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, chifre e ponto subposto"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grave"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, ponto subposto"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, gancho sobreposto"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, til"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Ponto de exclamação invertido"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Aspas angulares duplas esquerdas"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Ponto intermédio"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Um sobrescrito"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Aspas angulares duplas direitas"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Ponto de interrogação invertido"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Aspa simples esquerda"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Aspa simples direita"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Aspa simples subposta"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Aspas duplas esquerdas"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Aspas duplas direitas"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Adaga"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Adaga dupla"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Sinal de permilagem"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Plica"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Plica dupla"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Aspa angular simples esquerda"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Aspa angular simples direita"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"Quatro sobrescrito"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"N latino minúsculo sobrescrito"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Sinal de peso"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"Ao cuidado de"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"Seta para a direita"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Seta para baixo"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Conjunto vazio"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Delta"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"Menor do que ou igual a"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"Maior do que ou igual a"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"Estrela negra"</string>
+</resources>
diff --git a/java/res/values-pt-rPT/strings-talkback-descriptions.xml b/java/res/values-pt-rPT/strings-talkback-descriptions.xml
index 91d187e..30bbd3f 100644
--- a/java/res/values-pt-rPT/strings-talkback-descriptions.xml
+++ b/java/res/values-pt-rPT/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"Nenhum texto digitado"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corrige <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> para <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> executa a correção automática"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"Caráter desconhecido"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Mais símbolos"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Locais"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Símbolos"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Ícones expressivos"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> maiúsculo"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"I maiúsculo"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"I maiúsculo, ponto sobreposto"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"Símbolo desconhecido"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Emoji desconhecido"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Os carateres alternativos estão disponíveis"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Os carateres alternativos são ignorados"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"As sugestões alternativas estão disponíveis"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"As sugestões alternativas são ignoradas"</string>
 </resources>
diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml
index 7db5ccf..2129588 100644
--- a/java/res/values-pt-rPT/strings.xml
+++ b/java/res/values-pt-rPT/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Sugerir nomes de Contactos"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Utilizar nomes dos Contactos para sugestões e correções"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Sugestões personalizadas"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"Melhorar <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Ponto de espaço duplo"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Tocar duas vezes na barra espaço insere ponto seguido de espaço"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Letras maiúsculas automáticas"</string>
diff --git a/java/res/values-ro/strings-action-keys.xml b/java/res/values-ro/strings-action-keys.xml
index bee4b12..1a15415 100644
--- a/java/res/values-ro/strings-action-keys.xml
+++ b/java/res/values-ro/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"Înap."</string>
     <string name="label_done_key" msgid="7564866296502630852">"Gata"</string>
     <string name="label_send_key" msgid="482252074224462163">"Trim."</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"Căutați"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"Pauză"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"Așt."</string>
 </resources>
diff --git a/java/res/values-ro/strings-letter-descriptions.xml b/java/res/values-ro/strings-letter-descriptions.xml
new file mode 100644
index 0000000..46cbd1a
--- /dev/null
+++ b/java/res/values-ro/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Indicator de ordine feminin"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Semnul miu"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Indicator de ordine masculin"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"S ascuțit"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, accent grav"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, accent ascuțit"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, accent circumflex"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tildă"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, semn diacritic"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, cerc deasupra"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligatură"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, sedilă"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, accent grav"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, accent ascuțit"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, accent circumflex"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, semn diacritic"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, accent grav"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, accent ascuțit"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, accent circumflex"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, semn diacritic"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tildă"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, accent grav"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, accent ascuțit"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, accent circumflex"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tildă"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, semn diacritic"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, tăiat cu linie"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, accent grav"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, accent ascuțit"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, accent circumflex"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, semn diacritic"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, accent ascuțit"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, semn diacritic"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macron"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, căciulă"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, accent ascuțit"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, accent circumflex"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, punct deasupra"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, tăiat cu linie"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macron"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, căciulă"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, punct deasupra"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, accent circumflex"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, căciulă"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, punct deasupra"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, sedilă"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, accent circumflex"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, tăiat cu linie"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tildă"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macron"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, căciulă"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I fără punct"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligatură"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, accent circumflex"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, sedilă"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, accent ascuțit"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, sedilă"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, punct la mijloc"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, tăiat cu linie"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, accent ascuțit"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, sedilă"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, precedat de apostrof"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macron"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, căciulă"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, accent ascuțit dublu"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligatură"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, accent ascuțit"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, sedilă"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, accent ascuțit"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, accent circumflex"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, sedilă"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, sedilă"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, tăiat cu linie"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tildă"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macron"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, căciulă"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, cerc deasupra"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, accent ascuțit dublu"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, accent circumflex"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, accent circumflex"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, accent ascuțit"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, punct deasupra"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S lung"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, corn"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, corn"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, virgulă dedesubt"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, virgulă dedesubt"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, punct dedesubt"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, cârlig deasupra"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, accent circumflex și ascuțit"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, accent circumflex și grav"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, accent circumflex și cârlig deasupra"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, accent circumflex și tildă"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, accent circumflex și punct dedesubt"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, căciulă și accent ascuțit"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, căciulă și accent grav"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, căciulă și cârlig deasupra"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, căciulă și tildă"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, căciulă și punct dedesubt"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, punct dedesubt"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, cârlig deasupra"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tildă"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, accent circumflex și ascuțit"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, accent circumflex și grav"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, accent circumflex și cârlig deasupra"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, accent circumflex și tildă"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, accent circumflex și punct dedesubt"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, cârlig deasupra"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, punct dedesubt"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, punct dedesubt"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, cârlig deasupra"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, accent circumflex și ascuțit"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, accent circumflex și grav"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, accent circumflex și cârlig deasupra"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, accent circumflex și tildă"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, accent circumflex și punct dedesubt"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, corn și accent ascuțit"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, corn și accent grav"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, corn și cârlig deasupra"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, corn și tildă"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, corn și punct dedesubt"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, punct dedesubt"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, cârlig deasupra"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, corn și accent ascuțit"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, corn și accent grav"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, corn și cârlig deasupra"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, corn și tildă"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, corn și punct dedesubt"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, accent grav"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, punct dedesubt"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, cârlig deasupra"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tildă"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Semnul exclamării inversat"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Ghilimele duble la stânga"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Punct la mijloc"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Unu exponent"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Ghilimele duble la dreapta"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Semnul întrebării inversat"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Ghilimele simple la stânga"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Ghilimele simple la dreapta"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Ghilimele simple jos"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Ghilimele duble la stânga"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Ghilimele duble la dreapta"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Cruce"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Cruce dublă"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Semnul la mie"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prim"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Prim dublu"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Ghilimele simple la stânga"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Ghilimele simple la dreapta"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"Patru exponent"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"n latin exponent"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Semnul peso"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"În atenția"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"Săgeată la dreapta"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Săgeată în jos"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Zero barat"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Increment"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"Mai mic sau egal cu"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"Mai mare sau egal cu"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"Stea neagră"</string>
+</resources>
diff --git a/java/res/values-ro/strings-talkback-descriptions.xml b/java/res/values-ro/strings-talkback-descriptions.xml
index 6e5db4d..52885c8 100644
--- a/java/res/values-ro/strings-talkback-descriptions.xml
+++ b/java/res/values-ro/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"Nu a fost introdus text"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> corectează <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> cu <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> efectuează corectare automată"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"Caracter necunoscut"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Mai multe simboluri"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Locații"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Simboluri"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emoticonuri"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> mare"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"I mare"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"I mare, punct deasupra"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"Simbol necunoscut"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Emoji necunoscut"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Sunt disponibile caracterele alternative"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"S-au închis caracterele alternative"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Sunt disponibile sugestiile alternative"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"S-au închis sugestiile alternative"</string>
 </resources>
diff --git a/java/res/values-ro/strings.xml b/java/res/values-ro/strings.xml
index 628b1a2..8e1bb1c 100644
--- a/java/res/values-ro/strings.xml
+++ b/java/res/values-ro/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Sugeraţi nume din Agendă"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Utilizaţi numele din Agendă pentru sugestii şi corecţii"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Sugestii personalizate"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"Îmbunătățiți <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Inserează punct spațiu"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Dubla atingere a barei de spațiu inserează punct urmat de spațiu"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Scriere automată cu majuscule"</string>
diff --git a/java/res/values-sk/strings-action-keys.xml b/java/res/values-sk/strings-action-keys.xml
index ffc5be2..84e1c31 100644
--- a/java/res/values-sk/strings-action-keys.xml
+++ b/java/res/values-sk/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"Pred."</string>
     <string name="label_done_key" msgid="7564866296502630852">"OK"</string>
     <string name="label_send_key" msgid="482252074224462163">"Posl."</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"Hľadať"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"Pauza"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"Čakať"</string>
 </resources>
diff --git a/java/res/values-sk/strings-letter-descriptions.xml b/java/res/values-sk/strings-letter-descriptions.xml
new file mode 100644
index 0000000..e6bba4a
--- /dev/null
+++ b/java/res/values-sk/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Indikátor radovej číslovky ženského rodu"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Znak mikro"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Indikátor radovej číslovky mužského rodu"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Ostré S"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A s opačným dĺžňom"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A s dĺžňom"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A s vokáňom"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A s vlnovkou"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A s dvoma bodkami"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A s krúžkom"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"Ligatúra písmen A, E"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C s háčikom pod písmenom"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E s opačným dĺžňom"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E s dĺžňom"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E s vokáňom"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E s dvoma bodkami"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I s opačným dĺžňom"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I s dĺžňom"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I s vokáňom"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I s dvoma bodkami"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N s vlnovkou"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O s opačným dĺžňom"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O s dĺžňom"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O s vokáňom"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O s vlnovkou"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O s dvoma bodkami"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"Prečiarknuté O"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U s opačným dĺžňom"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U s dĺžňom"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U s vokáňom"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U s dvoma bodkami"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y s dĺžňom"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y s dvoma bodkami"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A s vodorovnou čiarkou"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A s oblúčikom"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A s nožičkou"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C s dĺžňom"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C s vokáňom"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C s bodkou nad písmenom"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C s mäkčeňom"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D s mäkčeňom"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"Prečiarknuté D"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E s vodorovnou čiarkou"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E s oblúčikom"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E s bodkou nad písmenom"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E s nožičkou"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E s mäkčeňom"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G s vokáňom"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G s oblúčikom"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G s bodkou nad písmenom"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G s háčikom pod písmenom"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H s vokáňom"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"Prečiarknuté H"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I s vlnovkou"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I s vodorovnou čiarkou"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I s oblúčikom"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I s nožičkou"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I bez bodky"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"Ligatúra písmen I, J"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J s vokáňom"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K s háčikom pod písmenom"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L s dĺžňom"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L s háčikom pod písmenom"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L s mäkčeňom"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L s bodkou uprostred"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"Prečiarknuté L"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N s dĺžňom"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N s háčikom pod písmenom"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N s mäkčeňom"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N s apostrofom na začiatku"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O s vodorovnou čiarkou"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O s oblúčikom"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O s dvoma dĺžňami"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"Ligatúra písmen O, E"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R s dĺžňom"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R s háčikom pod písmenom"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R s mäkčeňom"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S s dĺžňom"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S s vokáňom"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S s háčikom pod písmenom"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S s mäkčeňom"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T s háčikom pod písmenom"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T s mäkčeňom"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"Prečiarknuté T"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U s vlnovkou"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U s vodorovnou čiarkou"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U s oblúčikom"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U s krúžkom"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U s dvoma dĺžňami"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U s nožičkou"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W s vokáňom"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y s vokáňom"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z s dĺžňom"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z s bokou nad písmenom"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z s mäkčeňom"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Dlhé S"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O s rohom"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U s rohom"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S s čiarkou pod písmenom"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T s čiarkou pod písmenom"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A s bodkou pod písmenom"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A s háčikom nad písmenom"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A s vokáňom aj dĺžňom"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A s vokáňom aj opačným dĺžňom"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A s vokáňom aj háčikom nad písmenom"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A s vokáňom aj vlnovkou"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A s vokáňom aj bodkou pod písmenom"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A s oblúčikom aj dĺžňom"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A s oblúčikom aj opačným dĺžňom"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A s oblúčikom aj háčikom nad písmenom"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A s oblúčikom aj vlnovkou"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A s oblúčikom aj bodkou pod písmenom"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E s bodkou pod písmenom"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E s háčikom nad písmenom"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E s vlnovkou"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E s vokáňom aj dĺžňom"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E s vokáňom aj opačným dĺžňom"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E s vokáňom aj háčikom nad písmenom"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E s vokáňom aj vlnovkou"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E s vokáňom aj bodkou pod písmenom"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I s háčikom nad písmenom"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I s bodkou pod písmenom"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O s bodkou pod písmenom"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O s háčikom nad písmenom"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O s vokáňom aj dĺžňom"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O s vokáňom aj opačným dĺžňom"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O s vokáňom aj háčikom nad písmenom"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O s vokáňom aj vlnovkou"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O s vokáňom aj bodkou pod písmenom"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O s rohom aj dĺžňom"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O s rohom aj opačným dĺžňom"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O s rohom aj háčikom nad písmenom"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O s rohom aj vlnovkou"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O s rohom aj bodkou pod písmenom"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U s bodkou pod písmenom"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U s háčikom nad písmenom"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U s rohom aj dĺžňom"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U s rohom aj opačným dĺžňom"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U s rohom aj háčikom nad písmenom"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U s rohom aj vlnovkou"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U s rohom aj bodkou pod písmenom"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y s opačným dĺžňom"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y s bodkou pod písmenom"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y s háčikom nad písmenom"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y s vlnovkou"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Obrátený výkričník"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Lomené ľavé dvojité úvodzovky"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Bodka uprostred"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Jednotka v hornom indexe"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Lomené pravé dvojité úvodzovky"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Obrátený otáznik"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Ľavé jednoduché úvodzovky"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Pravé jednoduché úvodzovky"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Dolné jednoduché úvodzovky"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Ľavé dvojité úvodzovky"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Pravé dvojité úvodzovky"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Krížik"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Dvojitý krížik"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Znak promile"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Indexová čiarka"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Dvojitá indexová čiarka"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Jednoduché ľavé úvodzovky"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Jednoduché pravé úvodzovky"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"Štvorka v hornom indexe"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"Latinka – malé písmeno n v hornom indexe"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Znak pesa"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"Malé písmená c a o oddelené lomkou"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"Šípka vpravo"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Šípka nadol"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Prázdna množina"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Prírastok"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"Menšie alebo rovné ako"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"Väčšie alebo rovné ako"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"Čierna hviezda"</string>
+</resources>
diff --git a/java/res/values-sk/strings-talkback-descriptions.xml b/java/res/values-sk/strings-talkback-descriptions.xml
index 9fde012..2cd094e 100644
--- a/java/res/values-sk/strings-talkback-descriptions.xml
+++ b/java/res/values-sk/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"Nie je zadaný žiadny text"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"Klávesom <xliff:g id="KEY_NAME">%1$s</xliff:g> opravíte slovo <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> na <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"Klávesom <xliff:g id="KEY_NAME">%1$s</xliff:g> spustíte automatické opravy"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"Neznámy znak"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Ďalšie symboly"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Miesta"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Symboly"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Emotikony"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"Veľké písmeno – <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"Veľké I"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"Veľké I s bodkou nad písmenom"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"Neznámy symbol"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Neznámy symbol Emodži"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Alternatívne znaky sú dostupné"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Alternatívne znaky boli zrušené"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Alternatívne návrhy sú dostupné"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Alternatívne návrhy boli zrušené"</string>
 </resources>
diff --git a/java/res/values-sk/strings.xml b/java/res/values-sk/strings.xml
index f439bd0..023193b 100644
--- a/java/res/values-sk/strings.xml
+++ b/java/res/values-sk/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Navrhnúť mená kontaktov"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Používať mená z Kontaktov na návrhy a opravy"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Prispôsobené návrhy"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"Zlepšiť aplikáciu <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Bodka s medzerou"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Dvojitým klepnutím na medzerník vložíte bodku a medzeru."</string>
     <string name="auto_cap" msgid="1719746674854628252">"Veľké písmená automaticky"</string>
diff --git a/java/res/values-uk/strings-action-keys.xml b/java/res/values-uk/strings-action-keys.xml
index 8b71498..206fcf0 100644
--- a/java/res/values-uk/strings-action-keys.xml
+++ b/java/res/values-uk/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"Назад"</string>
     <string name="label_done_key" msgid="7564866296502630852">"ОК"</string>
     <string name="label_send_key" msgid="482252074224462163">"Слати"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"Пошук"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"Пауза"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"Ждати"</string>
 </resources>
diff --git a/java/res/values-uk/strings-letter-descriptions.xml b/java/res/values-uk/strings-letter-descriptions.xml
new file mode 100644
index 0000000..1199771
--- /dev/null
+++ b/java/res/values-uk/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Індикатор порядкового числівника жіночого роду"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Знак мікро"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Індикатор порядкового числівника чоловічого роду"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Есцет"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, гравіс"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, акут"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, циркумфлекс"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, тильда"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, трема"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, кільце вгорі"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, лігатура"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, седиль"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, гравіс"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, акут"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, циркумфлекс"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, трема"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, гравіс"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, акут"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, циркумфлекс"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, трема"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Ет"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, тильда"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, гравіс"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, акут"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, циркумфлекс"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, тильда"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, трема"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, риска"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, гравіс"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, акут"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, циркумфлекс"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, трема"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, акут"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Торн"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, трема"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, макрон"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, бреве"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, хвостик"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, акут"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, циркумфлекс"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, крапка вгорі"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, гачек"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, гачек"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, риска"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, макрон"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, бреве"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, крапка вгорі"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, хвостик"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, гачек"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, циркумфлекс"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, бреве"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, крапка вгорі"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, седиль"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, циркумфлекс"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, риска"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, тильда"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, макрон"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, бреве"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, хвостик"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I без крапки"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, лігатура"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, циркумфлекс"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, седиль"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Кра"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, акут"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, седіль"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, гачек"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, інтерпункт"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, риска"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, акут"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, седиль"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, гачек"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, після апострофа"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Енг"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, макрон"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, бреве"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, подвійний акут"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, лігатура"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, акут"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, седиль"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, гачек"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, акут"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, циркумфлекс"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, седиль"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, гачек"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, седиль"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, гачек"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, риска"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, тильда"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, макрон"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, бреве"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, кільце вгорі"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, подвійний акут"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, хвостик"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, циркумфлекс"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, циркумфлекс"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, акут"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, крапка вгорі"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, гачек"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Довгий звук S"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, ріг"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, ріг"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, кома внизу"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, кома внизу"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Шва"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, крапка внизу"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, гачок угорі"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, циркумфлекс і акут"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, циркумфлекс і гравіс"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, циркумфлекс і гачок угорі"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, циркумфлекс і тильда"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, циркумфлекс і крапка внизу"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, бреве й акут"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, бреве та гравіс"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, бреве та гачок угорі"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, бреве та тильда"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, бреве та крапка внизу"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, крапка внизу"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, гачок угорі"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, тильда"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, циркумфлекс і акут"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, циркумфлекс і гравіс"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, циркумфлекс і гачок угорі"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, циркумфлекс і тильда"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, циркумфлекс і крапка внизу"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, гачок угорі"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, крапка внизу"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, крапка внизу"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, гачок угорі"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, циркумфлекс і акут"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, циркумфлекс і гравіс"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, циркумфлекс і гачок угорі"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, циркумфлекс і тильда"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, циркумфлекс і крапка внизу"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, ріг і акут"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, ріг і гравіс"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, ріг і гачок угорі"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, ріг і тильда"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, ріг і крапка внизу"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, крапка внизу"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, гачок угорі"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, ріг і акут"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, ріг і гравіс"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, ріг і гачок угорі"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, ріг і тильда"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, ріг і крапка внизу"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, гравіс"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, крапка внизу"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, гачок угорі"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, тильда"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Перевернутий знак оклику"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Ліві подвійні кутові лапки"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Інтерпункт"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Верхній індекс, один"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Праві подвійні кутові лапки"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Перевернутий знак запитання"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Ліві одинарні лапки"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Праві одинарні лапки"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Ліві нижні одинарні лапки"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Ліві подвійні лапки"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Праві подвійні лапки"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Хрестик"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Подвійний хрестик"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Знак проміле"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Штрих"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Подвійний штрих"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Ліві одинарні кутові лапки"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Праві одинарні кутові лапки"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"Верхній індекс, чотири"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"Верхній індекс, мала латинська літера n"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Знак песо"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"Через"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"Стрілка праворуч"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Стрілка вниз"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Порожня множина"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Крок"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"Менше або дорівнює"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"Більше або дорівнює"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"Чорна зірка"</string>
+</resources>
diff --git a/java/res/values-uk/strings-talkback-descriptions.xml b/java/res/values-uk/strings-talkback-descriptions.xml
index e4df115..80e4710 100644
--- a/java/res/values-uk/strings-talkback-descriptions.xml
+++ b/java/res/values-uk/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"Текст не введено"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> виправляє слово \"<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g>\" на \"<xliff:g id="CORRECTED_WORD">%3$s</xliff:g>\""</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> автоматично виправляє"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"Невідомий символ"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Більше символів"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Клавіша Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Місця"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Символи"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Смайли"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"Велика <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"Велика I"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"Велика I, крапка вгорі"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"Невідомий символ"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Невідомий смайл Emoji"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Доступні альтернативні символи"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Альтернативні символи відхилено"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Доступні альтернативні пропозиції"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Альтернативні пропозиції відхилено"</string>
 </resources>
diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml
index 1d146a5..a7fcfd4 100644
--- a/java/res/values-uk/strings.xml
+++ b/java/res/values-uk/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Пропон. імена контактів"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Використ. імена зі списку контактів для пропозицій і виправлень"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Персональні пропозиції"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"Покращувати додаток <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Крапка подвійним пробілом"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Подвійне натискання пробілу вставляє крапку з пробілом після неї"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Авто викор. вел. літер"</string>
diff --git a/java/res/values-vi/strings-action-keys.xml b/java/res/values-vi/strings-action-keys.xml
index 16b7c95..3c40608 100644
--- a/java/res/values-vi/strings-action-keys.xml
+++ b/java/res/values-vi/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"Trước"</string>
     <string name="label_done_key" msgid="7564866296502630852">"Xong"</string>
     <string name="label_send_key" msgid="482252074224462163">"Gửi"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"Tìm kiếm"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"Tdừng"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"Đợi"</string>
 </resources>
diff --git a/java/res/values-vi/strings-letter-descriptions.xml b/java/res/values-vi/strings-letter-descriptions.xml
new file mode 100644
index 0000000..74f199f
--- /dev/null
+++ b/java/res/values-vi/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Chỉ báo thứ tự giống cái"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Ký hiệu micrô"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Chỉ báo thứ tự giống đực"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Sharp S"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, dấu huyền"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, dấu sắc"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, dấu mũ"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, dấu ngã"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, dấu tách đôi"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, dấu nhẫn phía trên"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, dấu gạch nối"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, dấu móc dưới"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, dấu huyền"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, dấu sắc"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, dấu mũ"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, dấu tách đôi"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, dấu huyền"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, dấu sắc"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, dấu mũ"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, dấu tách đôi"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, dấu ngã"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, dấu huyền"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, dấu sắc"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, dấu mũ"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, dấu ngã"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, dấu tách đôi"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, nét gạch"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, dấu huyền"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, dấu sắc"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, dấu mũ"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, dấu tách đôi"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, dấu sắc"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Dấu móc"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, dấu tách đôi"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, sự làm dấu"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, dấu ngân"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, một cái đuôi nhỏ"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, dấu sắc"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, dấu mũ"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, dấu chấm phía trên"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, dấu mũ ngược"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, dấu mũ ngược"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, nét gạch"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, sự làm dấu"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, dấu ngân"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, dấu chấm phía trên"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, một cái đuôi nhỏ"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, dấu mũ ngược"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, dấu mũ"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, dấu ngân"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, dấu chấm phía trên"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, dấu móc dưới"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, dấu mũ"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, nét gạch"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, dấu ngã"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, sự làm dấu"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, dấu ngân"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, một cái đuôi nhỏ"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"I không dấu chấm"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, dấu gạch nối"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, dấu mũ"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, dấu móc dưới"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, dấu sắc"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, dấu móc dưới"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, dấu mũ ngược"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, chấm ở giữa"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, nét gạch"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, dấu sắc"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, dấu móc dưới"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, dấu mũ ngược"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, theo sau dấu móc lửng"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, sự làm dấu"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, dấu ngân"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, hai dấu sắc"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, dấu gạch nối"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, dấu sắc"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, dấu móc dưới"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, dấu mũ ngược"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, dấu sắc"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, dấu mũ"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, dấu móc dưới"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, dấu mũ ngược"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, dấu móc dưới"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, dấu mũ ngược"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, nét gạch"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, dấu ngã"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, sự làm dấu"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, dấu ngân"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, dấu nhẫn ở trên"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, hai dấu sắc"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, một cái đuôi nhỏ"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, dấu mũ"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, dấu mũ"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, dấu sắc"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, dấu chấm phía trên"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, dấu mũ ngược"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"S dài"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, dấu móc"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, dấu móc"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, dấu phẩy phía dưới"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, dấu phẩy phía dưới"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Âm Schwa"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, dấu chấm phía dưới"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, dấu móc phía trên"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, dấu mũ và dấu sắc"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, dấu mũ và dấu huyền"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, dấu mũ và móc phía trên"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, dấu mũ và dấu ngã"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, dấu mũ và dấu chấm phía dưới"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, dấu ngân và dấu sắc"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, dấu ngân và dấu huyền"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, dấu ngân và móc phía trên"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, dấu ngân và dấu ngã"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, dấu ngân và dấu chấm phía dưới"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, dấu chấm phía dưới"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, móc phía trên"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, dấu ngã"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, dấu mũ và dấu sắc"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, dấu mũ và dấu huyền"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, dấu mũ và móc phía trên"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, dấu mũ và dấu ngã"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, dấu mũ và dấu chấm phía dưới"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, móc phía trên"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, dấu chấm phía dưới"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, dấu chấm phía dưới"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, móc phía trên"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, dấu mũ và dấu sắc"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, dấu mũ và dấu huyền"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, dấu mũ và móc phía trên"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, dấu mũ và dấu ngã"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, dấu mũ và dấu chấm phía dưới"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, dấu móc và dấu sắc"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, dấu móc và dấu huyền"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, dấu móc và móc phía trên"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, dấu móc và dấu ngã"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, dấu móc và dấu chấm phía dưới"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, dấu chấm phía dưới"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, móc phía trên"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, dấu móc và dấu sắc"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, dấu móc và dấu huyền"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, dấu móc và móc phía trên"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, dấu móc và dấu ngã"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, dấu móc và dấu chấm phía dưới"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, dấu huyền"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, dấu chấm phía dưới"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, móc phía trên"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, dấu ngã"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Dấu cảm thán đảo ngược"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Dấu ngoặc kép mở"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Dấu chấm ở giữa"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"Chỉ số trên một"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Dấu ngoặc kép đóng"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Dấu hỏi đảo ngược"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Dấu ngoặc đơn mở"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Dấu ngoặc đơn đóng"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Dấu trích dẫn đơn"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Dấu ngoặc kép mở"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Dấu ngoặc kép đóng"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Dấu chữ thập"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Dấu chữ thập kép"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Dấu cho mỗi ngàn"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Dấu phẩy"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Hai phẩy"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Dấu ngoặc đơn mở"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Dấu ngoặc đơn đóng"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"Chỉ số trên bốn"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"Chỉ số trên của n thường"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Ký hiệu đồng Pêsô"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"Dấu phần trăm"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"Mũi tên về phía phải"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Mũi tên xuống dưới"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Tập rỗng"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Tăng dần"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"Nhỏ hơn hoặc bằng"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"Lớn hơn hoặc bằng"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"Sao đen"</string>
+</resources>
diff --git a/java/res/values-vi/strings-talkback-descriptions.xml b/java/res/values-vi/strings-talkback-descriptions.xml
index ad63fa5..659b1d3 100644
--- a/java/res/values-vi/strings-talkback-descriptions.xml
+++ b/java/res/values-vi/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"Không có ký tự nào được nhập"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"<xliff:g id="KEY_NAME">%1$s</xliff:g> sửa <xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> thành <xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"<xliff:g id="KEY_NAME">%1$s</xliff:g> tự động sửa"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"Ký tự không xác định"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Biểu tượng khác"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Địa điểm"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Biểu tượng"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Biểu tượng cảm xúc"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"<xliff:g id="LOWER_LETTER">%s</xliff:g> hoa"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"I hoa"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"I hoa, dấu chấm phía trên"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"Ký hiệu không xác định"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"Biểu tượng cảm xúc không xác định"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Có ký tự thay thế"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Ký tự thay thế đã bị loại bỏ"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Có đề xuất thay thế"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Đề xuất thay thế đã bị loại bỏ"</string>
 </resources>
diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml
index 100175f..d95ff61 100644
--- a/java/res/values-vi/strings.xml
+++ b/java/res/values-vi/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Đề xuất tên liên hệ"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Sử dụng tên từ Danh bạ cho các đề xuất và chỉnh sửa"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Đề xuất được cá nhân hóa"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"Cải thiện <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Dấu cách đôi"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Nhấn đúp vào phím cách sẽ chèn thêm một dấu sau dấu cách"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Tự động viết hoa"</string>
diff --git a/java/res/values-zu/strings-action-keys.xml b/java/res/values-zu/strings-action-keys.xml
index 5d60a6c..fe36678 100644
--- a/java/res/values-zu/strings-action-keys.xml
+++ b/java/res/values-zu/strings-action-keys.xml
@@ -25,8 +25,7 @@
     <string name="label_previous_key" msgid="1421141755779895275">"Okwedlule"</string>
     <string name="label_done_key" msgid="7564866296502630852">"Kwenziwe"</string>
     <string name="label_send_key" msgid="482252074224462163">"Thumela"</string>
-    <!-- no translation found for label_search_key (7965186050435796642) -->
-    <skip />
+    <string name="label_search_key" msgid="7965186050435796642">"Sesha"</string>
     <string name="label_pause_key" msgid="2225922926459730642">"Misa isikhashana"</string>
     <string name="label_wait_key" msgid="5891247853595466039">"Linda"</string>
 </resources>
diff --git a/java/res/values-zu/strings-letter-descriptions.xml b/java/res/values-zu/strings-letter-descriptions.xml
new file mode 100644
index 0000000..54eb6e5
--- /dev/null
+++ b/java/res/values-zu/strings-letter-descriptions.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+**
+** Copyright 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.
+*/
+ -->
+
+<!-- 
+    These accented letters (spoken_accented_letter_*) are unsupported by TTS.
+    These symbols (spoken_symbol_*) are also unsupported by TTS.
+    TODO: Remove these string resources when TTS/TalkBack support these letters.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="spoken_accented_letter_00AA" msgid="4374325261868451570">"Isikhombi sobesifazane"</string>
+    <string name="spoken_accented_letter_00B5" msgid="9031387673828823891">"Uphawu olukhulu"</string>
+    <string name="spoken_accented_letter_00BA" msgid="5045198452071207437">"Isikhombi sowesilisa"</string>
+    <string name="spoken_accented_letter_00DF" msgid="2260098367028134281">"Sharp S"</string>
+    <string name="spoken_accented_letter_00E0" msgid="2234515772182387086">"A, grave"</string>
+    <string name="spoken_accented_letter_00E1" msgid="7780174500802535063">"A, acute"</string>
+    <string name="spoken_accented_letter_00E2" msgid="7054108480488102631">"A, circumflex"</string>
+    <string name="spoken_accented_letter_00E3" msgid="8252569677935693343">"A, tilde"</string>
+    <string name="spoken_accented_letter_00E4" msgid="6610118430986969466">"A, diaeresis"</string>
+    <string name="spoken_accented_letter_00E5" msgid="7630449270070348394">"A, ring ngenhla"</string>
+    <string name="spoken_accented_letter_00E6" msgid="701838036007000032">"A, E, ligature"</string>
+    <string name="spoken_accented_letter_00E7" msgid="2991289211702135310">"C, cedilla"</string>
+    <string name="spoken_accented_letter_00E8" msgid="2080035251848179782">"E, grave"</string>
+    <string name="spoken_accented_letter_00E9" msgid="2708473976407506968">"E, acute"</string>
+    <string name="spoken_accented_letter_00EA" msgid="1898848081635119449">"E, circumflex"</string>
+    <string name="spoken_accented_letter_00EB" msgid="8318942663983499634">"E, diaeresis"</string>
+    <string name="spoken_accented_letter_00EC" msgid="7643810590358306098">"I, grave"</string>
+    <string name="spoken_accented_letter_00ED" msgid="8288035355103120759">"I, acute"</string>
+    <string name="spoken_accented_letter_00EE" msgid="1137417730211688894">"I, circumflex"</string>
+    <string name="spoken_accented_letter_00EF" msgid="8993714322731956785">"I, diaeresis"</string>
+    <string name="spoken_accented_letter_00F0" msgid="3427567511221967857">"Eth"</string>
+    <string name="spoken_accented_letter_00F1" msgid="6983294908255378605">"N, tilde"</string>
+    <string name="spoken_accented_letter_00F2" msgid="2623804069332183695">"O, grave"</string>
+    <string name="spoken_accented_letter_00F3" msgid="8945987631729216917">"O, acute"</string>
+    <string name="spoken_accented_letter_00F4" msgid="2415494299699717276">"O, circumflex"</string>
+    <string name="spoken_accented_letter_00F5" msgid="7320512716652765243">"O, tilde"</string>
+    <string name="spoken_accented_letter_00F6" msgid="9101179351242478555">"O, diaeresis"</string>
+    <string name="spoken_accented_letter_00F8" msgid="1488324280918884122">"O, stroke"</string>
+    <string name="spoken_accented_letter_00F9" msgid="2823570256527173278">"U, grave"</string>
+    <string name="spoken_accented_letter_00FA" msgid="6883092085077298608">"U, acute"</string>
+    <string name="spoken_accented_letter_00FB" msgid="4948239400399514418">"U, circumflex"</string>
+    <string name="spoken_accented_letter_00FC" msgid="2496066211694000442">"U, diaeresis"</string>
+    <string name="spoken_accented_letter_00FD" msgid="2400529610834233890">"Y, acute"</string>
+    <string name="spoken_accented_letter_00FE" msgid="8788160115017853040">"Thorn"</string>
+    <string name="spoken_accented_letter_00FF" msgid="5225610161025124830">"Y, diaeresis"</string>
+    <string name="spoken_accented_letter_0101" msgid="5573209280917268157">"A, macron"</string>
+    <string name="spoken_accented_letter_0103" msgid="2469151120095164730">"A, breve"</string>
+    <string name="spoken_accented_letter_0105" msgid="8312689789855786427">"A, ogonek"</string>
+    <string name="spoken_accented_letter_0107" msgid="5708507895287798642">"C, acute"</string>
+    <string name="spoken_accented_letter_0109" msgid="7008112603489583335">"C, circumflex"</string>
+    <string name="spoken_accented_letter_010B" msgid="5641359473019753216">"C, icashazi ngenhla"</string>
+    <string name="spoken_accented_letter_010D" msgid="1048661826408437168">"C, caron"</string>
+    <string name="spoken_accented_letter_010F" msgid="603374318657992205">"D, caron"</string>
+    <string name="spoken_accented_letter_0111" msgid="5517997642285938260">"D, stroke"</string>
+    <string name="spoken_accented_letter_0113" msgid="2326009009311798997">"E, macron"</string>
+    <string name="spoken_accented_letter_0115" msgid="3964545407091037747">"E, breve"</string>
+    <string name="spoken_accented_letter_0117" msgid="8799753183781089777">"E, icashazi ngenhla"</string>
+    <string name="spoken_accented_letter_0119" msgid="3772451226935709136">"E, ogonek"</string>
+    <string name="spoken_accented_letter_011B" msgid="7663481332351461288">"E, caron"</string>
+    <string name="spoken_accented_letter_011D" msgid="1181326600595482369">"G, circumflex"</string>
+    <string name="spoken_accented_letter_011F" msgid="6843415389823096647">"G, breve"</string>
+    <string name="spoken_accented_letter_0121" msgid="6205288708713306903">"G, icashazi ngenhla"</string>
+    <string name="spoken_accented_letter_0123" msgid="2394277128105386261">"G, cedilla"</string>
+    <string name="spoken_accented_letter_0125" msgid="6575866461277751345">"H, circumflex"</string>
+    <string name="spoken_accented_letter_0127" msgid="1316971762214091641">"H, stroke"</string>
+    <string name="spoken_accented_letter_0129" msgid="7824912405885325754">"I, tilde"</string>
+    <string name="spoken_accented_letter_012B" msgid="6772690258769905270">"I, macron"</string>
+    <string name="spoken_accented_letter_012D" msgid="2933871131556503448">"I, breve"</string>
+    <string name="spoken_accented_letter_012F" msgid="1340511254985181663">"I, ogonek"</string>
+    <string name="spoken_accented_letter_0131" msgid="5635600720566083969">"Dotless I"</string>
+    <string name="spoken_accented_letter_0133" msgid="7593704176516791941">"I, J, ligature"</string>
+    <string name="spoken_accented_letter_0135" msgid="4521109674238248436">"J, circumflex"</string>
+    <string name="spoken_accented_letter_0137" msgid="5886444641003852175">"K, cedilla"</string>
+    <string name="spoken_accented_letter_0138" msgid="4200294389170924853">"Kra"</string>
+    <string name="spoken_accented_letter_013A" msgid="3558015385412543517">"L, acute"</string>
+    <string name="spoken_accented_letter_013C" msgid="1853639924813858734">"L, cedilla"</string>
+    <string name="spoken_accented_letter_013E" msgid="7489345561739421886">"L, caron"</string>
+    <string name="spoken_accented_letter_0140" msgid="7946718707268270589">"L, icashazi eliphakathi"</string>
+    <string name="spoken_accented_letter_0142" msgid="752931798111122240">"L, stroke"</string>
+    <string name="spoken_accented_letter_0144" msgid="201843550323875352">"N, acute"</string>
+    <string name="spoken_accented_letter_0146" msgid="3403847152606051818">"N, cedilla"</string>
+    <string name="spoken_accented_letter_0148" msgid="9215300786722209338">"N, caron"</string>
+    <string name="spoken_accented_letter_0149" msgid="3191850286630154063">"N, kulandele i-apostrophe"</string>
+    <string name="spoken_accented_letter_014B" msgid="8503022408522837410">"Eng"</string>
+    <string name="spoken_accented_letter_014D" msgid="4452323602550610641">"O, macron"</string>
+    <string name="spoken_accented_letter_014F" msgid="2795957717094385336">"O, breve"</string>
+    <string name="spoken_accented_letter_0151" msgid="8013704745216410244">"O, double acute"</string>
+    <string name="spoken_accented_letter_0153" msgid="8410582495993285221">"O, E, ligature"</string>
+    <string name="spoken_accented_letter_0155" msgid="7601517174689798560">"R, acute"</string>
+    <string name="spoken_accented_letter_0157" msgid="9071455715455643810">"R, cedilla"</string>
+    <string name="spoken_accented_letter_0159" msgid="7726911392381543439">"R, caron"</string>
+    <string name="spoken_accented_letter_015B" msgid="1854129531164494117">"S, acute"</string>
+    <string name="spoken_accented_letter_015D" msgid="4743571603550582530">"S, circumflex"</string>
+    <string name="spoken_accented_letter_015F" msgid="1519945638631588761">"S, cedilla"</string>
+    <string name="spoken_accented_letter_0161" msgid="7493478552029144246">"S, caron"</string>
+    <string name="spoken_accented_letter_0163" msgid="9103547637928833069">"T, cedilla"</string>
+    <string name="spoken_accented_letter_0165" msgid="7306159398214872062">"T, caron"</string>
+    <string name="spoken_accented_letter_0167" msgid="5578767705098672443">"T, stroke"</string>
+    <string name="spoken_accented_letter_0169" msgid="413046581387735371">"U, tilde"</string>
+    <string name="spoken_accented_letter_016B" msgid="3209778874978859441">"U, macron"</string>
+    <string name="spoken_accented_letter_016D" msgid="2983326533258602840">"U, breve"</string>
+    <string name="spoken_accented_letter_016F" msgid="4416532499516387231">"U, indingilizi ngenhla"</string>
+    <string name="spoken_accented_letter_0171" msgid="3435171971353200807">"U, double acute"</string>
+    <string name="spoken_accented_letter_0173" msgid="4494154432483553480">"U, ogonek"</string>
+    <string name="spoken_accented_letter_0175" msgid="2154545579611918513">"W, circumflex"</string>
+    <string name="spoken_accented_letter_0177" msgid="4034463827306904781">"Y, circumflex"</string>
+    <string name="spoken_accented_letter_017A" msgid="3368292232292925369">"Z, acute"</string>
+    <string name="spoken_accented_letter_017C" msgid="2834484584505860430">"Z, icashazi ngenhla"</string>
+    <string name="spoken_accented_letter_017E" msgid="1209240442434887098">"Z, caron"</string>
+    <string name="spoken_accented_letter_017F" msgid="317501463253362415">"Long S"</string>
+    <string name="spoken_accented_letter_01A1" msgid="630186564859044196">"O, horn"</string>
+    <string name="spoken_accented_letter_01B0" msgid="8544012177684640443">"U, horn"</string>
+    <string name="spoken_accented_letter_0219" msgid="1960371842020076066">"S, ukhefana ngezansi"</string>
+    <string name="spoken_accented_letter_021B" msgid="1398418662032919032">"T, ukhefana ngezansi"</string>
+    <string name="spoken_accented_letter_0259" msgid="2464085263158415898">"Schwa"</string>
+    <string name="spoken_accented_letter_1EA1" msgid="688124877202887630">"A, icashazi ngenhla"</string>
+    <string name="spoken_accented_letter_1EA3" msgid="327960130366386256">"A, ihhuku ngenhla"</string>
+    <string name="spoken_accented_letter_1EA5" msgid="637406363453769610">"A, circumflex ne-acute"</string>
+    <string name="spoken_accented_letter_1EA7" msgid="1419591804181615409">"A, circumflex ne-grave"</string>
+    <string name="spoken_accented_letter_1EA9" msgid="6068887382734896756">"A, circumflex nehhuku ngenhla"</string>
+    <string name="spoken_accented_letter_1EAB" msgid="7236523151662538333">"A, circumflex ne-tilde"</string>
+    <string name="spoken_accented_letter_1EAD" msgid="2363364864106332076">"A, circumflex necashazi ngenhla"</string>
+    <string name="spoken_accented_letter_1EAF" msgid="1576329511464272935">"A, breve ne-acute"</string>
+    <string name="spoken_accented_letter_1EB1" msgid="4634735072816076592">"A, breve ne-grave"</string>
+    <string name="spoken_accented_letter_1EB3" msgid="2325245849038771534">"A, breve nehhuku ngenhla"</string>
+    <string name="spoken_accented_letter_1EB5" msgid="3720427596242746295">"A, breve ne-tilde"</string>
+    <string name="spoken_accented_letter_1EB7" msgid="700415535653646695">"A, breve necashazi ngezansi"</string>
+    <string name="spoken_accented_letter_1EB9" msgid="3901338692305890487">"E, icashazi ngezansi"</string>
+    <string name="spoken_accented_letter_1EBB" msgid="4028688699415417302">"E, ihhuku ngenhla"</string>
+    <string name="spoken_accented_letter_1EBD" msgid="181253633045931897">"E, tilde"</string>
+    <string name="spoken_accented_letter_1EBF" msgid="3309618845007944963">"E, circumflex ne-acute"</string>
+    <string name="spoken_accented_letter_1EC1" msgid="8139046749226332542">"E, circumflex ne-grave"</string>
+    <string name="spoken_accented_letter_1EC3" msgid="3239674223053133383">"E, circumflex nehhuku ngenhla"</string>
+    <string name="spoken_accented_letter_1EC5" msgid="2216559244705714587">"E, circumflex ne-tilde"</string>
+    <string name="spoken_accented_letter_1EC7" msgid="9012731468253986792">"E, circumflex necashazi ngezansi"</string>
+    <string name="spoken_accented_letter_1EC9" msgid="2901917620195717034">"I, ihhuku ngenhla"</string>
+    <string name="spoken_accented_letter_1ECB" msgid="5470387489820034621">"I, icashazi ngezansi"</string>
+    <string name="spoken_accented_letter_1ECD" msgid="1340122876914839806">"O, icashazi ngezansi"</string>
+    <string name="spoken_accented_letter_1ECF" msgid="2326921263882559755">"O, ihhuku ngenhla"</string>
+    <string name="spoken_accented_letter_1ED1" msgid="2885683296042774958">"O, circumflex ne-acute"</string>
+    <string name="spoken_accented_letter_1ED3" msgid="6857664926477376178">"O, circumflex ne-grave"</string>
+    <string name="spoken_accented_letter_1ED5" msgid="2015209467290624062">"O, circumflex nehhuku ngenhla"</string>
+    <string name="spoken_accented_letter_1ED7" msgid="7924481354960306389">"O, circumflex ne-tilde"</string>
+    <string name="spoken_accented_letter_1ED9" msgid="7023315590332365554">"O, circumflex necashazi ngezansi"</string>
+    <string name="spoken_accented_letter_1EDB" msgid="2379438944917634496">"O, horn ne-acute"</string>
+    <string name="spoken_accented_letter_1EDD" msgid="8107077534204404085">"O, horn ne-grave"</string>
+    <string name="spoken_accented_letter_1EDF" msgid="1846880105528347966">"O, horn nehhuku ngenhla"</string>
+    <string name="spoken_accented_letter_1EE1" msgid="1520037313389776718">"O, horn ne-tilde"</string>
+    <string name="spoken_accented_letter_1EE3" msgid="907964027171008963">"O, horn necashazi ngezansi"</string>
+    <string name="spoken_accented_letter_1EE5" msgid="1522024630360038700">"U, icashazi ngezansi"</string>
+    <string name="spoken_accented_letter_1EE7" msgid="7815412228302952637">"U, uhhuku ngehla"</string>
+    <string name="spoken_accented_letter_1EE9" msgid="4219119671251485651">"U, horn ne-acute"</string>
+    <string name="spoken_accented_letter_1EEB" msgid="4086009841269002231">"U, horn ne-grave"</string>
+    <string name="spoken_accented_letter_1EED" msgid="3528151733528719847">"U, horn nehhuku ngenhla"</string>
+    <string name="spoken_accented_letter_1EEF" msgid="3508548229409072119">"U, horn ne-tilde"</string>
+    <string name="spoken_accented_letter_1EF1" msgid="1912816350401931115">"U, horn necashazi ngezansi"</string>
+    <string name="spoken_accented_letter_1EF3" msgid="7211760439435946494">"Y, grave"</string>
+    <string name="spoken_accented_letter_1EF5" msgid="8998864482764007384">"Y, icashazi ngezansi"</string>
+    <string name="spoken_accented_letter_1EF7" msgid="922043627252869200">"Y, ihhuku ngenhla"</string>
+    <string name="spoken_accented_letter_1EF9" msgid="6213977100552260366">"Y, tilde"</string>
+    <string name="spoken_symbol_00A1" msgid="4281758332905123408">"Umbabazi okokushiwo"</string>
+    <string name="spoken_symbol_00AB" msgid="4093069643313064892">"Umaki wokukopisha onama-engeli amabili okhombe ngakwesokunxele"</string>
+    <string name="spoken_symbol_00B7" msgid="2447718728927874920">"Icashazi eliphakathi"</string>
+    <string name="spoken_symbol_00B9" msgid="8026257165451461231">"I-Superscript one"</string>
+    <string name="spoken_symbol_00BB" msgid="1102740075655373928">"Umaki wokukopisha onama-engeli amabili okhombe ngakwesokudla"</string>
+    <string name="spoken_symbol_00BF" msgid="6233794752573788098">"Umbuzi okokushiwo"</string>
+    <string name="spoken_symbol_2018" msgid="4886476295598930225">"Umaki wokukopisha oyedwa ongakwesokunxele"</string>
+    <string name="spoken_symbol_2019" msgid="8892530161598134083">"Umaki wokukopisha oyedwa ongakwesokudla"</string>
+    <string name="spoken_symbol_201A" msgid="2072987157683446644">"Umaki wokukopisha owodwa ophansi 9"</string>
+    <string name="spoken_symbol_201C" msgid="4588048378803665427">"Umaki wokukopisha ongakubili ongakwekunxele"</string>
+    <string name="spoken_symbol_201D" msgid="1642776849495925895">"Umaki wokukopisha ongakubili ongakwekudla"</string>
+    <string name="spoken_symbol_2020" msgid="9084628638189344431">"Dagger"</string>
+    <string name="spoken_symbol_2021" msgid="5081396468559426475">"Double dagger"</string>
+    <string name="spoken_symbol_2030" msgid="9068837172419431755">"Per mille sign"</string>
+    <string name="spoken_symbol_2032" msgid="3014506329156664396">"Prime"</string>
+    <string name="spoken_symbol_2033" msgid="1251022699713475088">"Double prime"</string>
+    <string name="spoken_symbol_2039" msgid="6989616457213775957">"Umaki wokukopisha oyedwa ngokhombe ngakwesokunxele"</string>
+    <string name="spoken_symbol_203A" msgid="31245095449823701">"Umaki wokukopisha oyedwa ngokhombe ngakwesokudla"</string>
+    <string name="spoken_symbol_2074" msgid="2116717717093306894">"Superscript four"</string>
+    <string name="spoken_symbol_207F" msgid="1706731172134246659">"I-Superscript latin uhlambu oluncane u-n"</string>
+    <string name="spoken_symbol_20B1" msgid="2159994270622444689">"Uphawu lwe-Peso"</string>
+    <string name="spoken_symbol_2105" msgid="7289404939366976829">"Ukunakekela ko"</string>
+    <string name="spoken_symbol_2192" msgid="827804523596125414">"Umcibisholo wangakwesokudla"</string>
+    <string name="spoken_symbol_2193" msgid="2659541693445985717">"Umcibisholo oyaphansi"</string>
+    <string name="spoken_symbol_2205" msgid="4457188084269117343">"Isethi engenalutho"</string>
+    <string name="spoken_symbol_2206" msgid="4856786565708380687">"Nciphisa"</string>
+    <string name="spoken_symbol_2264" msgid="5092061257745123554">"Okuncane noma okulinganayo"</string>
+    <string name="spoken_symbol_2265" msgid="1907966479878036357">"Okukhulu noma okulinganayo"</string>
+    <string name="spoken_symbol_2605" msgid="5202920479405857753">"Inkanyezi emnyama"</string>
+</resources>
diff --git a/java/res/values-zu/strings-talkback-descriptions.xml b/java/res/values-zu/strings-talkback-descriptions.xml
index 9f344d8..6d3de70 100644
--- a/java/res/values-zu/strings-talkback-descriptions.xml
+++ b/java/res/values-zu/strings-talkback-descriptions.xml
@@ -25,8 +25,7 @@
     <string name="spoken_no_text_entered" msgid="1711276837961785646">"Awukho umbhalo ofakiwe"</string>
     <string name="spoken_auto_correct" msgid="8989324692167993804">"I-<xliff:g id="KEY_NAME">%1$s</xliff:g> ilungisa i-<xliff:g id="ORIGINAL_WORD">%2$s</xliff:g> kube yi-<xliff:g id="CORRECTED_WORD">%3$s</xliff:g>"</string>
     <string name="spoken_auto_correct_obscured" msgid="7769449372355268412">"I-<xliff:g id="KEY_NAME">%1$s</xliff:g> yenza ukulungisa okuzenzakalelayo"</string>
-    <!-- no translation found for spoken_description_unknown (5139930082759824442) -->
-    <skip />
+    <string name="spoken_description_unknown" msgid="5139930082759824442">"Uhlamvu olungaziwa"</string>
     <string name="spoken_description_shift" msgid="7209798151676638728">"U-Shift"</string>
     <string name="spoken_description_symbols_shift" msgid="3483198879916435717">"Amasimbuli amaningi"</string>
     <string name="spoken_description_shift_shifted" msgid="3122704922642232605">"U-Shift"</string>
@@ -72,22 +71,13 @@
     <string name="spoken_descrption_emoji_category_places" msgid="1163315840948545317">"Izindawo"</string>
     <string name="spoken_descrption_emoji_category_symbols" msgid="474680659024880601">"Amasimbuli"</string>
     <string name="spoken_descrption_emoji_category_emoticons" msgid="456737544787823539">"Izithombe-mzwelo"</string>
-    <!-- no translation found for spoken_description_upper_case (4904835255229433916) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0049 (4743162182646977944) -->
-    <skip />
-    <!-- no translation found for spoken_letter_0130 (4766619646231612274) -->
-    <skip />
-    <!-- no translation found for spoken_symbol_unknown (717298227061173706) -->
-    <skip />
-    <!-- no translation found for spoken_emoji_unknown (5981009928135394306) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_keys_keyboard (6832897688371903747) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_keys_keyboard (3524914657934712026) -->
-    <skip />
-    <!-- no translation found for spoken_open_more_suggestions (4231720702882969760) -->
-    <skip />
-    <!-- no translation found for spoken_close_more_suggestions (9118455416075032839) -->
-    <skip />
+    <string name="spoken_description_upper_case" msgid="4904835255229433916">"Ufeleba <xliff:g id="LOWER_LETTER">%s</xliff:g>"</string>
+    <string name="spoken_letter_0049" msgid="4743162182646977944">"Ufeleba I"</string>
+    <string name="spoken_letter_0130" msgid="4766619646231612274">"Ufeleba I, icashazi ngenhla"</string>
+    <string name="spoken_symbol_unknown" msgid="717298227061173706">"Uphawu olungaziwa"</string>
+    <string name="spoken_emoji_unknown" msgid="5981009928135394306">"I-emoji engaziwa"</string>
+    <string name="spoken_open_more_keys_keyboard" msgid="6832897688371903747">"Ezinye izinhlamvu ziyatholakala"</string>
+    <string name="spoken_close_more_keys_keyboard" msgid="3524914657934712026">"Ezinye izinhlamvu ziyalahlwa"</string>
+    <string name="spoken_open_more_suggestions" msgid="4231720702882969760">"Ezinye iziphakamiso ziyatholakala"</string>
+    <string name="spoken_close_more_suggestions" msgid="9118455416075032839">"Ezinye iziphakamiso ziyalahlwa"</string>
 </resources>
diff --git a/java/res/values-zu/strings.xml b/java/res/values-zu/strings.xml
index 8e3942f..c72352d 100644
--- a/java/res/values-zu/strings.xml
+++ b/java/res/values-zu/strings.xml
@@ -46,8 +46,7 @@
     <string name="use_contacts_dict" msgid="4435317977804180815">"Sikisela amagama Othintana nabo"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Amagama abasebenzisi kusuka Kothintana nabo bokusikisela nokulungisa"</string>
     <string name="use_personalized_dicts" msgid="5167396352105467626">"Iziphakamiso ezenziwe okomuntu siqu"</string>
-    <!-- no translation found for enable_metrics_logging (5506372337118822837) -->
-    <skip />
+    <string name="enable_metrics_logging" msgid="5506372337118822837">"Thuthukisa i-<xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="use_double_space_period" msgid="8781529969425082860">"Isikhathi se-Double-space"</string>
     <string name="use_double_space_period_summary" msgid="6532892187247952799">"Ukuthepha kabili kubha yesikhala kufaka isikhathi esilandelwa yisikhala"</string>
     <string name="auto_cap" msgid="1719746674854628252">"Ukwenza ofeleba okuzenzakalelayo"</string>
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index a1f478b..fcb919d 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -26,8 +26,6 @@
         <attr name="keyboardViewStyle" format="reference" />
         <!-- MainKeyboardView style -->
         <attr name="mainKeyboardViewStyle" format="reference" />
-        <!-- Key preview text view style -->
-        <attr name="keyPreviewTextViewStyle" format="reference"/>
         <!-- EmojiPalettesView style -->
         <attr name="emojiPalettesViewStyle" format="reference" />
         <!-- MoreKeysKeyboard style -->
@@ -106,8 +104,8 @@
         <attr name="longPressShiftLockTimeout" format="integer" />
         <!-- Ignore special key timeout while typing in millisecond. -->
         <attr name="ignoreAltCodeKeyTimeout" format="integer" />
-        <!-- Layout resource for key press feedback.-->
-        <attr name="keyPreviewLayout" format="reference" />
+        <!-- Background resource for key press feedback.-->
+        <attr name="keyPreviewBackground" format="reference" />
         <!-- Vertical offset of the key press feedback from the key. -->
         <attr name="keyPreviewOffset" format="dimension" />
         <!-- Height of the key press feedback popup. -->
diff --git a/java/res/values/keyboard-themes.xml b/java/res/values/keyboard-themes.xml
index a06082c..28a34c3 100644
--- a/java/res/values/keyboard-themes.xml
+++ b/java/res/values/keyboard-themes.xml
@@ -20,13 +20,14 @@
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <!-- For keyboard color scheme option dialog. -->
     <string-array name="keyboard_theme_names" translatable="false">
-        <!-- TODO: Make this item as translatable string resource. -->
-        <item>Material</item>
-        <item>@string/keyboard_color_scheme_white</item>
-        <item>@string/keyboard_color_scheme_blue</item>
+        <!-- TODO: Implement Material Light theme. -->
+        <item>@string/keyboard_theme_material_dark</item>
+        <item>@string/keyboard_theme_holo_white</item>
+        <item>@string/keyboard_theme_holo_blue</item>
     </string-array>
     <!-- An element must be a keyboard theme id of {@link KeyboardTheme#THEME_ID_*}. -->
     <string-array name="keyboard_theme_ids" translatable="false">
+        <!-- TODO: Implement Material Light theme. -->
         <item>3</item>
         <item>2</item>
         <item>0</item>
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index 8849115..9ec3f46 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -36,22 +36,18 @@
     <!-- Option to control whether or not to show a popup with a larger font on each key press. -->
     <string name="popup_on_keypress">Popup on keypress</string>
 
-    <!-- Category title for general settings for Android keyboard -->
-    <string name="general_category">General</string>
-
-    <!-- Category title for text prediction -->
-    <string name="correction_category">Text correction</string>
-
-    <!-- Category title for gesture typing -->
-    <string name="gesture_typing_category">Gesture typing</string>
-
-    <!-- Category title for misc options  -->
-    <string name="misc_category">Other options</string>
-
-    <!-- Option name for advanced settings screen [CHAR LIMIT=25] -->
-    <string name="advanced_settings">Advanced settings</string>
-    <!-- Option summary for advanced settings screen [CHAR LIMIT=65 (two lines) or 30 (fits on one line, preferable)] -->
-    <string name="advanced_settings_summary">Options for experts</string>
+    <!-- Settings screen title for input preferences [CHAR LIMIT=25]-->
+    <string name="settings_screen_input">Input preferences</string>
+    <!-- Settings screen title for appearance preferences [CHAR LIMIT=25] -->
+    <string name="settings_screen_appearances">Appearance</string>
+    <!-- Settings screen title for multi lingual options [CHAR_LIMIT=25] -->
+    <string name="settings_screen_multi_lingual">Multi lingual options</string>
+    <!-- Settings screen title for gesture typing preferences [CHAR_LIMIT=25] -->
+    <string name="settings_screen_gesture">Gesture typing preferences</string>
+    <!-- Settings screen title for text correction options [CHAR_LIMIT=25] -->
+    <string name="settings_screen_correction">Text correction</string>
+    <!-- Settings screen title for advanced settings [CHAR LIMIT=25] -->
+    <string name="settings_screen_advanced">Advanced</string>
 
     <!-- Option name for including other IMEs in the language switch list [CHAR LIMIT=30] -->
     <string name="include_other_imes_in_language_switch_list">Switch to other input methods</string>
@@ -295,12 +291,16 @@
     <!-- Description for Emoji keyboard subtype [CHAR LIMIT=25] -->
     <string name="subtype_emoji">Emoji</string>
 
-    <!-- Title of the preference settings for switching keyboard color scheme [CHAR LIMIT=35] -->
-    <string name="keyboard_color_scheme">Color scheme</string>
-    <!-- The keyboard color scheme name, White [CHAR LIMIT=16] -->
-    <string name="keyboard_color_scheme_white">White</string>
-    <!-- The keyboard color scheme name, Blue [CHAR LIMIT=16] -->
-    <string name="keyboard_color_scheme_blue">Blue</string>
+    <!-- Title of the preference settings for switching keyboard theme [CHAR LIMIT=35] -->
+    <string name="keyboard_theme">Keyboard theme</string>
+    <!-- The keyboard theme name, Holo White [CHAR LIMIT=25] -->
+    <string name="keyboard_theme_holo_white">Holo White</string>
+    <!-- The keyboard theme name, Holo Blue [CHAR LIMIT=25] -->
+    <string name="keyboard_theme_holo_blue">Holo Blue</string>
+    <!-- The keyboard theme name, Material Dark [CHAR LIMIT=25] -->
+    <string name="keyboard_theme_material_dark">Material Dark</string>
+    <!-- The keyboard theme name, Material Light [CHAR LIMIT=25] -->
+    <string name="keyboard_theme_material_light">Material Light</string>
 
     <!-- Title of the preference settings for custom input styles (language and keyboard layout pairs) [CHAR LIMIT=35]-->
     <string name="custom_input_styles_title">Custom input styles</string>
diff --git a/java/res/values/themes-common.xml b/java/res/values/themes-common.xml
index 02a93ca..2b2a80a 100644
--- a/java/res/values/themes-common.xml
+++ b/java/res/values/themes-common.xml
@@ -75,7 +75,6 @@
         <item name="keyRepeatInterval">@integer/config_key_repeat_interval</item>
         <item name="longPressShiftLockTimeout">@integer/config_longpress_shift_lock_timeout</item>
         <item name="ignoreAltCodeKeyTimeout">@integer/config_ignore_alt_code_key_timeout</item>
-        <item name="keyPreviewLayout">@layout/key_preview</item>
         <item name="keyPreviewHeight">@dimen/config_key_preview_height</item>
         <!-- TODO: consolidate key preview linger timeout with the key preview animation parameters. -->
         <item name="keyPreviewLingerTimeout">@integer/config_key_preview_linger_timeout</item>
@@ -106,7 +105,6 @@
     <style
         name="MainKeyboardView"
         parent="KeyboardView" />
-    <style name="KeyPreviewTextView" />
     <!-- Though {@link EmojiPalettesView} doesn't extend {@link KeyboardView}, some views inside it,
          for instance delete button, need themed {@link KeyboardView} attributes. -->
     <style name="EmojiPalettesView" />
diff --git a/java/res/values/themes-ics.xml b/java/res/values/themes-ics.xml
index 319b4ae..073ae90 100644
--- a/java/res/values/themes-ics.xml
+++ b/java/res/values/themes-ics.xml
@@ -23,7 +23,6 @@
         <item name="keyboardStyle">@style/Keyboard.ICS</item>
         <item name="keyboardViewStyle">@style/KeyboardView.ICS</item>
         <item name="mainKeyboardViewStyle">@style/MainKeyboardView.ICS</item>
-        <item name="keyPreviewTextViewStyle">@style/KeyPreviewTextView.ICS</item>
         <item name="emojiPalettesViewStyle">@style/EmojiPalettesView.ICS</item>
         <item name="moreKeysKeyboardStyle">@style/MoreKeysKeyboard.ICS</item>
         <item name="moreKeysKeyboardViewStyle">@style/MoreKeysKeyboardView.ICS</item>
@@ -66,6 +65,7 @@
         name="MainKeyboardView.ICS"
         parent="KeyboardView.ICS"
     >
+        <item name="keyPreviewBackground">@drawable/keyboard_key_feedback_ics</item>
         <item name="keyPreviewOffset">@dimen/config_key_preview_offset_holo</item>
         <item name="gestureFloatingPreviewTextColor">@color/highlight_color_ics</item>
         <item name="gestureFloatingPreviewColor">@color/gesture_floating_preview_color_holo</item>
@@ -75,12 +75,6 @@
         <item name="languageOnSpacebarTextShadowRadius">1.0</item>
         <item name="languageOnSpacebarTextShadowColor">@color/spacebar_text_shadow_color_holo</item>
     </style>
-    <style
-        name="KeyPreviewTextView.ICS"
-        parent="KeyPreviewTextView"
-    >
-        <item name="android:background">@drawable/keyboard_key_feedback_ics</item>
-    </style>
     <!-- Though {@link EmojiPalettesView} doesn't extend {@link KeyboardView}, some views inside it,
          for instance delete button, need themed {@link KeyboardView} attributes. -->
     <style
diff --git a/java/res/values/themes-klp.xml b/java/res/values/themes-klp.xml
index 208723d..f895de5 100644
--- a/java/res/values/themes-klp.xml
+++ b/java/res/values/themes-klp.xml
@@ -23,7 +23,6 @@
         <item name="keyboardStyle">@style/Keyboard.KLP</item>
         <item name="keyboardViewStyle">@style/KeyboardView.KLP</item>
         <item name="mainKeyboardViewStyle">@style/MainKeyboardView.KLP</item>
-        <item name="keyPreviewTextViewStyle">@style/KeyPreviewTextView.KLP</item>
         <item name="emojiPalettesViewStyle">@style/EmojiPalettesView.KLP</item>
         <item name="moreKeysKeyboardStyle">@style/MoreKeysKeyboard.KLP</item>
         <item name="moreKeysKeyboardViewStyle">@style/MoreKeysKeyboardView.KLP</item>
@@ -66,6 +65,7 @@
         name="MainKeyboardView.KLP"
         parent="KeyboardView.KLP"
     >
+        <item name="keyPreviewBackground">@drawable/keyboard_key_feedback_klp</item>
         <item name="keyPreviewOffset">@dimen/config_key_preview_offset_holo</item>
         <item name="gestureFloatingPreviewTextColor">@color/highlight_color_klp</item>
         <item name="gestureFloatingPreviewColor">@color/gesture_floating_preview_color_holo</item>
@@ -75,12 +75,6 @@
         <item name="languageOnSpacebarTextShadowRadius">1.0</item>
         <item name="languageOnSpacebarTextShadowColor">@color/spacebar_text_shadow_color_holo</item>
     </style>
-    <style
-        name="KeyPreviewTextView.KLP"
-        parent="KeyPreviewTextView"
-    >
-        <item name="android:background">@drawable/keyboard_key_feedback_klp</item>
-    </style>
     <!-- Though {@link EmojiPalettesView} doesn't extend {@link KeyboardView}, some views inside it,
          for instance delete button, need themed {@link KeyboardView} attributes. -->
     <style
diff --git a/java/res/values/themes-lxx-dark.xml b/java/res/values/themes-lxx-dark.xml
index e9a295c..1db8f42 100644
--- a/java/res/values/themes-lxx-dark.xml
+++ b/java/res/values/themes-lxx-dark.xml
@@ -23,7 +23,6 @@
         <item name="keyboardStyle">@style/Keyboard.LXX_Dark</item>
         <item name="keyboardViewStyle">@style/KeyboardView.LXX_Dark</item>
         <item name="mainKeyboardViewStyle">@style/MainKeyboardView.LXX_Dark</item>
-        <item name="keyPreviewTextViewStyle">@style/KeyPreviewTextView.LXX_Dark</item>
         <item name="emojiPalettesViewStyle">@style/EmojiPalettesView.LXX_Dark</item>
         <item name="moreKeysKeyboardStyle">@style/MoreKeysKeyboard.LXX_Dark</item>
         <item name="moreKeysKeyboardViewStyle">@style/MoreKeysKeyboardView.LXX_Dark</item>
@@ -67,6 +66,7 @@
         name="MainKeyboardView.LXX_Dark"
         parent="KeyboardView.LXX_Dark"
     >
+        <item name="keyPreviewBackground">@drawable/keyboard_key_feedback_lxx_dark</item>
         <item name="keyPreviewOffset">@dimen/config_key_preview_offset_holo</item>
         <item name="gestureFloatingPreviewTextColor">@color/highlight_color_lxx_dark</item>
         <item name="gestureFloatingPreviewColor">@color/gesture_floating_preview_color_lxx_dark</item>
@@ -76,12 +76,6 @@
         <!-- A negative value to disable text shadow layer. -->
         <item name="languageOnSpacebarTextShadowRadius">-1.0</item>
     </style>
-    <style
-        name="KeyPreviewTextView.LXX_Dark"
-        parent="KeyPreviewTextView"
-    >
-        <item name="android:background">@drawable/keyboard_key_feedback_lxx_dark</item>
-    </style>
     <!-- Though {@link EmojiPalettesView} doesn't extend {@link KeyboardView}, some views inside it,
          for instance delete button, need themed {@link KeyboardView} attributes. -->
     <style
diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml
index 0e9c161..e71d951 100644
--- a/java/res/xml/prefs.xml
+++ b/java/res/xml/prefs.xml
@@ -18,15 +18,21 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     android:key="english_ime_settings">
-    <PreferenceCategory
-        android:title="@string/general_category"
-        android:key="general_settings">
+    <PreferenceScreen
+        android:title="@string/settings_screen_input"
+        android:key="screen_input">
         <CheckBoxPreference
             android:key="auto_cap"
             android:title="@string/auto_cap"
             android:summary="@string/auto_cap_summary"
-            android:persistent="true"
-            android:defaultValue="true" />
+            android:defaultValue="true"
+            android:persistent="true" />
+        <CheckBoxPreference
+            android:key="pref_key_use_double_space_period"
+            android:title="@string/use_double_space_period"
+            android:summary="@string/use_double_space_period_summary"
+            android:defaultValue="true"
+            android:persistent="true" />
         <CheckBoxPreference
             android:key="vibrate_on"
             android:title="@string/vibrate_on_keypress"
@@ -40,17 +46,67 @@
         <CheckBoxPreference
             android:key="popup_on"
             android:title="@string/popup_on_keypress"
-            android:persistent="true"
-            android:defaultValue="@bool/config_default_key_preview_popup" />
+            android:defaultValue="@bool/config_default_key_preview_popup"
+            android:persistent="true" />
         <CheckBoxPreference
             android:key="pref_voice_input_key"
             android:title="@string/voice_input"
-            android:persistent="true"
-            android:defaultValue="true" />
-    </PreferenceCategory>
-    <PreferenceCategory
-        android:title="@string/correction_category"
-        android:key="correction_settings">
+            android:defaultValue="true"
+            android:persistent="true" />
+    </PreferenceScreen>
+    <ListPreference
+        android:key="pref_keyboard_theme"
+        android:title="@string/keyboard_theme"
+        android:entryValues="@array/keyboard_theme_ids"
+        android:entries="@array/keyboard_theme_names"
+        android:persistent="true" />
+    <PreferenceScreen
+        android:title="@string/settings_screen_multi_lingual"
+        android:key="screen_multi_lingual">
+        <CheckBoxPreference
+            android:key="pref_show_language_switch_key"
+            android:title="@string/show_language_switch_key"
+            android:summary="@string/show_language_switch_key_summary"
+            android:defaultValue="true"
+            android:persistent="true" />
+        <CheckBoxPreference
+            android:key="pref_include_other_imes_in_language_switch_list"
+            android:dependency="pref_show_language_switch_key"
+            android:title="@string/include_other_imes_in_language_switch_list"
+            android:summary="@string/include_other_imes_in_language_switch_list_summary"
+            android:defaultValue="false"
+            android:persistent="true" />
+        <PreferenceScreen
+            android:fragment="com.android.inputmethod.latin.settings.AdditionalSubtypeSettings"
+            android:key="custom_input_styles"
+            android:title="@string/custom_input_styles_title" />
+    </PreferenceScreen>
+    <PreferenceScreen
+        android:title="@string/settings_screen_gesture"
+        android:key="screen_gesture">
+        <CheckBoxPreference
+            android:key="gesture_input"
+            android:title="@string/gesture_input"
+            android:summary="@string/gesture_input_summary"
+            android:defaultValue="true"
+            android:persistent="true" />
+        <CheckBoxPreference
+            android:key="pref_gesture_floating_preview_text"
+            android:dependency="gesture_input"
+            android:title="@string/gesture_floating_preview_text"
+            android:summary="@string/gesture_floating_preview_text_summary"
+            android:defaultValue="true"
+            android:persistent="true" />
+        <CheckBoxPreference
+            android:key="pref_gesture_preview_trail"
+            android:dependency="gesture_input"
+            android:title="@string/gesture_preview_trail"
+            android:defaultValue="true"
+            android:persistent="true" />
+    </PreferenceScreen>
+    <PreferenceScreen
+        android:title="@string/settings_screen_correction"
+        android:key="screen_correction">
         <PreferenceScreen
             android:key="edit_personal_dictionary"
             android:title="@string/edit_personal_dictionary">
@@ -71,137 +127,74 @@
             android:key="pref_key_block_potentially_offensive"
             android:title="@string/prefs_block_potentially_offensive_title"
             android:summary="@string/prefs_block_potentially_offensive_summary"
-            android:persistent="true"
-            android:defaultValue="@bool/config_block_potentially_offensive" />
+            android:defaultValue="@bool/config_block_potentially_offensive"
+            android:persistent="true" />
         <ListPreference
             android:key="auto_correction_threshold"
             android:title="@string/auto_correction"
             android:summary="@string/auto_correction_summary"
-            android:persistent="true"
             android:entryValues="@array/auto_correction_threshold_mode_indexes"
             android:entries="@array/auto_correction_threshold_modes"
-            android:defaultValue="@string/auto_correction_threshold_mode_index_modest" />
+            android:defaultValue="@string/auto_correction_threshold_mode_index_modest"
+            android:persistent="true" />
         <ListPreference
             android:key="show_suggestions_setting"
             android:summary="@string/prefs_show_suggestions_summary"
             android:title="@string/prefs_show_suggestions"
-            android:persistent="true"
             android:entryValues="@array/prefs_suggestion_visibility_values"
             android:entries="@array/prefs_suggestion_visibilities"
-            android:defaultValue="@string/prefs_suggestion_visibility_default_value" />
+            android:defaultValue="@string/prefs_suggestion_visibility_default_value"
+            android:persistent="true" />
         <CheckBoxPreference
             android:key="pref_key_use_personalized_dicts"
             android:title="@string/use_personalized_dicts"
             android:summary="@string/use_personalized_dicts_summary"
-            android:persistent="true"
-            android:defaultValue="true" />
-        <!-- title will be set programmatically to embed application name -->
+            android:defaultValue="true"
+            android:persistent="true" />
         <CheckBoxPreference
-            android:key="pref_enable_metrics_logging"
-            android:summary="@string/enable_metrics_logging_summary"
-            android:persistent="true"
-            android:defaultValue="true" />
-    </PreferenceCategory>
-    <PreferenceCategory
-        android:title="@string/gesture_typing_category"
-        android:key="gesture_typing_settings">
-        <CheckBoxPreference
-            android:key="gesture_input"
-            android:title="@string/gesture_input"
-            android:summary="@string/gesture_input_summary"
-            android:persistent="true"
-            android:defaultValue="true" />
-        <!-- TODO: Move these two options to the advanced settings. -->
-        <CheckBoxPreference
-            android:key="pref_gesture_floating_preview_text"
-            android:dependency="gesture_input"
-            android:title="@string/gesture_floating_preview_text"
-            android:summary="@string/gesture_floating_preview_text_summary"
-            android:persistent="true"
-            android:defaultValue="true" />
-        <CheckBoxPreference
-            android:key="pref_gesture_preview_trail"
-            android:dependency="gesture_input"
-            android:title="@string/gesture_preview_trail"
-            android:persistent="true"
-            android:defaultValue="true" />
-    </PreferenceCategory>
-    <PreferenceCategory
-        android:title="@string/misc_category"
-        android:key="misc_settings">
+            android:key="pref_key_use_contacts_dict"
+            android:title="@string/use_contacts_dict"
+            android:summary="@string/use_contacts_dict_summary"
+            android:defaultValue="true"
+            android:persistent="true" />
         <CheckBoxPreference
             android:key="next_word_prediction"
             android:title="@string/bigram_prediction"
             android:summary="@string/bigram_prediction_summary"
-            android:persistent="true"
-            android:defaultValue="true" />
-        <PreferenceScreen
-            android:key="pref_advanced_settings"
-            android:title="@string/advanced_settings"
-            android:summary="@string/advanced_settings_summary">
-            <CheckBoxPreference
-                android:key="pref_key_use_contacts_dict"
-                android:title="@string/use_contacts_dict"
-                android:summary="@string/use_contacts_dict_summary"
-                android:persistent="true"
-                android:defaultValue="true" />
-            <CheckBoxPreference
-                android:key="pref_key_use_double_space_period"
-                android:title="@string/use_double_space_period"
-                android:summary="@string/use_double_space_period_summary"
-                android:persistent="true"
-                android:defaultValue="true" />
-            <CheckBoxPreference
-                android:key="pref_show_language_switch_key"
-                android:title="@string/show_language_switch_key"
-                android:summary="@string/show_language_switch_key_summary"
-                android:persistent="true"
-                android:defaultValue="true" />
-            <CheckBoxPreference
-                android:key="pref_include_other_imes_in_language_switch_list"
-                android:dependency="pref_show_language_switch_key"
-                android:title="@string/include_other_imes_in_language_switch_list"
-                android:summary="@string/include_other_imes_in_language_switch_list_summary"
-                android:persistent="true"
-                android:defaultValue="false" />
-            <ListPreference
-                android:key="pref_keyboard_theme"
-                android:title="@string/keyboard_color_scheme"
-                android:persistent="true"
-                android:entryValues="@array/keyboard_theme_ids"
-                android:entries="@array/keyboard_theme_names" />
-            <PreferenceScreen
-                android:fragment="com.android.inputmethod.latin.settings.AdditionalSubtypeSettings"
-                android:key="custom_input_styles"
-                android:title="@string/custom_input_styles_title" />
-            <!-- TODO: consolidate key preview dismiss delay with the key preview animation parameters. -->
-            <ListPreference
-                android:key="pref_key_preview_popup_dismiss_delay"
-                android:title="@string/key_preview_popup_dismiss_delay" />
-            <com.android.inputmethod.latin.settings.SeekBarDialogPreference
-                android:key="pref_vibration_duration_settings"
-                android:title="@string/prefs_keypress_vibration_duration_settings"
-                latin:maxValue="@integer/config_max_vibration_duration" />
-            <com.android.inputmethod.latin.settings.SeekBarDialogPreference
-                android:key="pref_keypress_sound_volume"
-                android:title="@string/prefs_keypress_sound_volume_settings"
-                latin:maxValue="100" /> <!-- percent -->
-            <!-- The settigs for showing setup wizard application icon shouldn't be persistent and
-                 the default value is added programmatically. -->
-            <CheckBoxPreference
-                android:key="pref_show_setup_wizard_icon"
-                android:title="@string/show_setup_wizard_icon"
-                android:summary="@string/show_setup_wizard_icon_summary" />
+            android:defaultValue="true"
+            android:persistent="true" />
         </PreferenceScreen>
+    <PreferenceScreen
+        android:title="@string/settings_screen_advanced"
+        android:key="screen_advanced">
+        <!-- TODO: consolidate key preview dismiss delay with the key preview animation parameters. -->
+        <ListPreference
+            android:key="pref_key_preview_popup_dismiss_delay"
+            android:title="@string/key_preview_popup_dismiss_delay" />
+        <com.android.inputmethod.latin.settings.SeekBarDialogPreference
+            android:key="pref_vibration_duration_settings"
+            android:title="@string/prefs_keypress_vibration_duration_settings"
+            latin:maxValue="@integer/config_max_vibration_duration" />
+        <com.android.inputmethod.latin.settings.SeekBarDialogPreference
+            android:key="pref_keypress_sound_volume"
+            android:title="@string/prefs_keypress_sound_volume_settings"
+            latin:maxValue="100" /> <!-- percent -->
+        <!-- The settigs for showing setup wizard application icon shouldn't be persistent and
+             the default value is added programmatically. -->
+        <CheckBoxPreference
+            android:key="pref_show_setup_wizard_icon"
+            android:title="@string/show_setup_wizard_icon"
+            android:summary="@string/show_setup_wizard_icon_summary" />
+        <!-- title will be set programmatically to embed application name -->
+        <CheckBoxPreference
+            android:key="pref_enable_metrics_logging"
+            android:summary="@string/enable_metrics_logging_summary"
+            android:defaultValue="true"
+            android:persistent="true" />
         <PreferenceScreen
-            android:key="send_feedback"
-            android:title="@string/send_feedback" />
-        <PreferenceScreen
-            android:key="about_keyboard" />
-        <PreferenceScreen
-            android:key="debug_settings"
+            android:key="screen_debug"
             android:title="Debug settings"
-            android:persistent="true"
-            android:defaultValue="false" />
-    </PreferenceCategory>
+            android:defaultValue="false"
+            android:persistent="true" />
+        </PreferenceScreen>
 </PreferenceScreen>
diff --git a/java/res/xml/prefs_for_debug.xml b/java/res/xml/prefs_for_debug.xml
index 0bcc5cb..ae29a8a 100644
--- a/java/res/xml/prefs_for_debug.xml
+++ b/java/res/xml/prefs_for_debug.xml
@@ -23,19 +23,19 @@
     <CheckBoxPreference
         android:key="debug_mode"
         android:title="@string/prefs_debug_mode"
-        android:persistent="true"
-        android:defaultValue="false" />
+        android:defaultValue="false"
+        android:persistent="true" />
     <CheckBoxPreference
         android:key="force_non_distinct_multitouch"
         android:title="@string/prefs_force_non_distinct_multitouch"
-        android:persistent="true"
-        android:defaultValue="false" />
+        android:defaultValue="false"
+        android:persistent="true" />
     <CheckBoxPreference
         android:key="pref_sliding_key_input_preview"
         android:title="@string/sliding_key_input_preview"
         android:summary="@string/sliding_key_input_preview_summary"
-        android:persistent="true"
-        android:defaultValue="true" />
+        android:defaultValue="true"
+        android:persistent="true" />
     <com.android.inputmethod.latin.settings.SeekBarDialogPreference
         android:key="pref_key_longpress_timeout"
         android:title="@string/prefs_key_longpress_timeout_settings"
diff --git a/java/res/xml/spell_checker_settings.xml b/java/res/xml/spell_checker_settings.xml
index de67e7f..3d95018 100644
--- a/java/res/xml/spell_checker_settings.xml
+++ b/java/res/xml/spell_checker_settings.xml
@@ -15,11 +15,12 @@
 -->
 
 <PreferenceScreen
-    xmlns:android="http://schemas.android.com/apk/res/android">
-  <CheckBoxPreference
-     android:key="pref_spellcheck_use_contacts"
-     android:title="@string/use_contacts_for_spellchecking_option_title"
-     android:summary="@string/use_contacts_for_spellchecking_option_summary"
-     android:persistent="true"
-     android:defaultValue="true" />
+    xmlns:android="http://schemas.android.com/apk/res/android"
+>
+    <CheckBoxPreference
+        android:key="pref_spellcheck_use_contacts"
+        android:title="@string/use_contacts_for_spellchecking_option_title"
+        android:summary="@string/use_contacts_for_spellchecking_option_summary"
+        android:defaultValue="true"
+        android:persistent="true" />
 </PreferenceScreen>
diff --git a/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityDelegate.java b/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityDelegate.java
index d67d9dc..3925fc6 100644
--- a/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityDelegate.java
+++ b/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityDelegate.java
@@ -305,7 +305,7 @@
         key.onPressed();
         mKeyboardView.invalidateKey(key);
         final KeyboardAccessibilityNodeProvider provider = getAccessibilityNodeProvider();
-        provider.sendAccessibilityEventForKey(key, AccessibilityEventCompat.TYPE_VIEW_HOVER_ENTER);
+        provider.onHoverEnterTo(key);
         provider.performActionForKey(key, AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS);
     }
 
@@ -328,6 +328,6 @@
         key.onReleased();
         mKeyboardView.invalidateKey(key);
         final KeyboardAccessibilityNodeProvider provider = getAccessibilityNodeProvider();
-        provider.sendAccessibilityEventForKey(key, AccessibilityEventCompat.TYPE_VIEW_HOVER_EXIT);
+        provider.onHoverExitFrom(key);
     }
 }
diff --git a/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityNodeProvider.java b/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityNodeProvider.java
index cb13483..61d066a 100644
--- a/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityNodeProvider.java
+++ b/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityNodeProvider.java
@@ -65,6 +65,9 @@
     /** The virtual view identifier for the focused node. */
     private int mAccessibilityFocusedView = UNDEFINED;
 
+    /** The virtual view identifier for the hovering node. */
+    private int mHoveringNodeId = UNDEFINED;
+
     /** The current keyboard view. */
     private final KeyboardView mKeyboardView;
 
@@ -76,7 +79,6 @@
         mKeyCodeDescriptionMapper = KeyCodeDescriptionMapper.getInstance();
         mAccessibilityUtils = AccessibilityUtils.getInstance();
         mKeyboardView = keyboardView;
-        updateParentLocation();
 
         // Since this class is constructed lazily, we might not get a subsequent
         // call to setKeyboard() and therefore need to call it now.
@@ -141,6 +143,28 @@
         return event;
     }
 
+    public void onHoverEnterTo(final Key key) {
+        final int id = getVirtualViewIdOf(key);
+        if (id == View.NO_ID) {
+            return;
+        }
+        // Start hovering on the key. Because our accessibility model is lift-to-type, we should
+        // report the node info without click and long click actions to avoid unnecessary
+        // announcements.
+        mHoveringNodeId = id;
+        // Invalidate the node info of the key.
+        sendAccessibilityEventForKey(key, AccessibilityEventCompat.TYPE_WINDOW_CONTENT_CHANGED);
+        sendAccessibilityEventForKey(key, AccessibilityEventCompat.TYPE_VIEW_HOVER_ENTER);
+    }
+
+    public void onHoverExitFrom(final Key key) {
+        mHoveringNodeId = UNDEFINED;
+        // Invalidate the node info of the key to be able to revert the change we have done
+        // in {@link #onHoverEnterTo(Key)}.
+        sendAccessibilityEventForKey(key, AccessibilityEventCompat.TYPE_WINDOW_CONTENT_CHANGED);
+        sendAccessibilityEventForKey(key, AccessibilityEventCompat.TYPE_VIEW_HOVER_EXIT);
+    }
+
     /**
      * Returns an {@link AccessibilityNodeInfoCompat} representing a virtual
      * view, i.e. a descendant of the host View, with the given <code>virtualViewId</code> or
@@ -169,10 +193,23 @@
         }
         if (virtualViewId == View.NO_ID) {
             // We are requested to create an AccessibilityNodeInfo describing
-            // this View. Returning an empty info is sufficient for a keyboard.
+            // this View, i.e. the root of the virtual sub-tree.
             final AccessibilityNodeInfoCompat rootInfo =
                     AccessibilityNodeInfoCompat.obtain(mKeyboardView);
             ViewCompat.onInitializeAccessibilityNodeInfo(mKeyboardView, rootInfo);
+            updateParentLocation();
+
+            // Add the virtual children of the root View.
+            final List<Key> sortedKeys = mKeyboard.getSortedKeys();
+            final int size = sortedKeys.size();
+            for (int index = 0; index < size; index++) {
+                final Key key = sortedKeys.get(index);
+                if (key.isSpacer()) {
+                    continue;
+                }
+                // Use an index of the sorted keys list as a virtual view id.
+                rootInfo.addChild(mKeyboardView, index);
+            }
             return rootInfo;
         }
 
@@ -200,9 +237,16 @@
         info.setBoundsInScreen(boundsInScreen);
         info.setParent(mKeyboardView);
         info.setSource(mKeyboardView, virtualViewId);
-        info.setBoundsInScreen(boundsInScreen);
-        info.setEnabled(true);
+        info.setEnabled(key.isEnabled());
         info.setVisibleToUser(true);
+        // Don't add ACTION_CLICK and ACTION_LONG_CLOCK actions while hovering on the key.
+        // See {@link #onHoverEnterTo(Key)} and {@link #onHoverExitFrom(Key)}.
+        if (virtualViewId != mHoveringNodeId) {
+            info.addAction(AccessibilityNodeInfoCompat.ACTION_CLICK);
+            if (key.isLongPressEnabled()) {
+                info.addAction(AccessibilityNodeInfoCompat.ACTION_LONG_CLICK);
+            }
+        }
 
         if (mAccessibilityFocusedView == virtualViewId) {
             info.addAction(AccessibilityNodeInfoCompat.ACTION_CLEAR_ACCESSIBILITY_FOCUS);
@@ -241,6 +285,12 @@
             sendAccessibilityEventForKey(
                     key, AccessibilityEventCompat.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED);
             return true;
+        case AccessibilityNodeInfoCompat.ACTION_CLICK:
+            sendAccessibilityEventForKey(key, AccessibilityEvent.TYPE_VIEW_CLICKED);
+            return true;
+        case AccessibilityNodeInfoCompat.ACTION_LONG_CLICK:
+            sendAccessibilityEventForKey(key, AccessibilityEvent.TYPE_VIEW_LONG_CLICKED);
+            return true;
         default:
             return false;
         }
diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
index 9a859bf..702efb3 100644
--- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
@@ -35,7 +35,6 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.inputmethod.InputMethodSubtype;
-import android.widget.TextView;
 
 import com.android.inputmethod.accessibility.AccessibilityUtils;
 import com.android.inputmethod.accessibility.MainKeyboardAccessibilityDelegate;
@@ -48,6 +47,7 @@
 import com.android.inputmethod.keyboard.internal.KeyPreviewChoreographer;
 import com.android.inputmethod.keyboard.internal.KeyPreviewDrawParams;
 import com.android.inputmethod.keyboard.internal.LanguageOnSpacebarHelper;
+import com.android.inputmethod.keyboard.internal.MoreKeySpec;
 import com.android.inputmethod.keyboard.internal.NonDistinctMultitouchHelper;
 import com.android.inputmethod.keyboard.internal.SlidingKeyInputDrawingPreview;
 import com.android.inputmethod.keyboard.internal.TimerHandler;
@@ -236,16 +236,14 @@
                 R.styleable.MainKeyboardView_gestureFloatingPreviewTextLingerTimeout, 0);
 
         mGestureFloatingTextDrawingPreview = new GestureFloatingTextDrawingPreview(
-                mDrawingPreviewPlacerView, mainKeyboardViewAttr);
-        mDrawingPreviewPlacerView.addPreview(mGestureFloatingTextDrawingPreview);
+                mainKeyboardViewAttr);
+        mGestureFloatingTextDrawingPreview.setDrawingView(mDrawingPreviewPlacerView);
 
-        mGestureTrailsDrawingPreview = new GestureTrailsDrawingPreview(
-                mDrawingPreviewPlacerView, mainKeyboardViewAttr);
-        mDrawingPreviewPlacerView.addPreview(mGestureTrailsDrawingPreview);
+        mGestureTrailsDrawingPreview = new GestureTrailsDrawingPreview(mainKeyboardViewAttr);
+        mGestureTrailsDrawingPreview.setDrawingView(mDrawingPreviewPlacerView);
 
-        mSlidingKeyInputDrawingPreview = new SlidingKeyInputDrawingPreview(
-                mDrawingPreviewPlacerView, mainKeyboardViewAttr);
-        mDrawingPreviewPlacerView.addPreview(mSlidingKeyInputDrawingPreview);
+        mSlidingKeyInputDrawingPreview = new SlidingKeyInputDrawingPreview(mainKeyboardViewAttr);
+        mSlidingKeyInputDrawingPreview.setDrawingView(mDrawingPreviewPlacerView);
         mainKeyboardViewAttr.recycle();
 
         mMoreKeysKeyboardContainer = LayoutInflater.from(getContext())
@@ -428,15 +426,6 @@
         windowContentView.addView(mDrawingPreviewPlacerView);
     }
 
-    /**
-     * Returns the enabled state of the key feedback preview
-     * @return whether or not the key feedback preview is enabled
-     * @see #setKeyPreviewPopupEnabled(boolean, int)
-     */
-    public boolean isKeyPreviewPopupEnabled() {
-        return mKeyPreviewDrawParams.isPopupEnabled();
-    }
-
     // Implements {@link DrawingHandler.Callbacks} method.
     @Override
     public void dismissAllKeyPreviews() {
@@ -461,12 +450,9 @@
         }
 
         locatePreviewPlacerView();
-        final TextView previewTextView = mKeyPreviewChoreographer.getKeyPreviewTextView(
-                key, mDrawingPreviewPlacerView);
         getLocationInWindow(mOriginCoords);
-        mKeyPreviewChoreographer.placeKeyPreview(key, previewTextView, keyboard.mIconsSet,
-                mKeyDrawParams, getWidth(), mOriginCoords);
-        mKeyPreviewChoreographer.showKeyPreview(key, previewTextView, isHardwareAccelerated());
+        mKeyPreviewChoreographer.placeAndShowKeyPreview(key, keyboard.mIconsSet, mKeyDrawParams,
+                getWidth(), mOriginCoords, mDrawingPreviewPlacerView, isHardwareAccelerated());
     }
 
     // Implements {@link TimerHandler.Callbacks} method.
@@ -557,13 +543,25 @@
     }
 
     private MoreKeysPanel onCreateMoreKeysPanel(final Key key, final Context context) {
-        if (key.getMoreKeys() == null) {
+        final MoreKeySpec[] moreKeys = key.getMoreKeys();
+        if (moreKeys == null) {
             return null;
         }
         Keyboard moreKeysKeyboard = mMoreKeysKeyboardCache.get(key);
         if (moreKeysKeyboard == null) {
-            moreKeysKeyboard = new MoreKeysKeyboard.Builder(
-                    context, key, this, mKeyPreviewDrawParams).build();
+            // {@link KeyPreviewDrawParams#mPreviewVisibleWidth} should have been set at
+            // {@link KeyPreviewChoreographer#placeKeyPreview(Key,TextView,KeyboardIconsSet,KeyDrawParams,int,int[]},
+            // though there may be some chances that the value is zero. <code>width == 0</code>
+            // will cause zero-division error at
+            // {@link MoreKeysKeyboardParams#setParameters(int,int,int,int,int,int,boolean,int)}.
+            final boolean isSingleMoreKeyWithPreview = mKeyPreviewDrawParams.isPopupEnabled()
+                    && !key.noKeyPreview() && moreKeys.length == 1
+                    && mKeyPreviewDrawParams.getVisibleWidth() > 0;
+            final MoreKeysKeyboard.Builder builder = new MoreKeysKeyboard.Builder(
+                    context, key, getKeyboard(), isSingleMoreKeyWithPreview,
+                    mKeyPreviewDrawParams.getVisibleWidth(),
+                    mKeyPreviewDrawParams.getVisibleHeight(), newLabelPaint(key));
+            moreKeysKeyboard = builder.build();
             mMoreKeysKeyboardCache.put(key, moreKeysKeyboard);
         }
 
@@ -619,7 +617,8 @@
 
         final int[] lastCoords = CoordinateUtils.newInstance();
         tracker.getLastCoordinates(lastCoords);
-        final boolean keyPreviewEnabled = isKeyPreviewPopupEnabled() && !key.noKeyPreview();
+        final boolean keyPreviewEnabled = mKeyPreviewDrawParams.isPopupEnabled()
+                && !key.noKeyPreview();
         // The more keys keyboard is usually horizontally aligned with the center of the parent key.
         // If showMoreKeysKeyboardAtTouchedPoint is true and the key preview is disabled, the more
         // keys keyboard is placed at the touch point of the parent key.
@@ -730,6 +729,7 @@
     }
 
     public void onHideWindow() {
+        onDismissMoreKeysPanel();
         final MainKeyboardAccessibilityDelegate accessibilityDelegate = mAccessibilityDelegate;
         if (accessibilityDelegate != null) {
             accessibilityDelegate.onHideWindow();
diff --git a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java
index a72f791..e0184d7 100644
--- a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java
@@ -21,7 +21,6 @@
 import android.graphics.drawable.Drawable;
 
 import com.android.inputmethod.annotations.UsedForTesting;
-import com.android.inputmethod.keyboard.internal.KeyPreviewDrawParams;
 import com.android.inputmethod.keyboard.internal.KeyboardBuilder;
 import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
 import com.android.inputmethod.keyboard.internal.KeyboardParams;
@@ -260,33 +259,27 @@
         /**
          * The builder of MoreKeysKeyboard.
          * @param context the context of {@link MoreKeysKeyboardView}.
-         * @param parentKey the {@link Key} that invokes more keys keyboard.
-         * @param parentKeyboardView the {@link KeyboardView} that contains the parentKey.
+         * @param key the {@link Key} that invokes more keys keyboard.
+         * @param keyboard the {@link Keyboard} that contains the parentKey.
+         * @param isSingleMoreKeyWithPreview true if the <code>key</code> has just a single
+         *        "more key" and its key popup preview is enabled.
          * @param keyPreviewDrawParams the parameter to place key preview.
+         * @param paintToMeasure the {@link Paint} object to measure a "more key" width
          */
-        public Builder(final Context context, final Key parentKey,
-                final MainKeyboardView parentKeyboardView,
-                final KeyPreviewDrawParams keyPreviewDrawParams) {
+        public Builder(final Context context, final Key key, final Keyboard keyboard,
+                final boolean isSingleMoreKeyWithPreview, final int keyPreviewVisibleWidth,
+                final int keyPreviewVisibleHeight, final Paint paintToMeasure) {
             super(context, new MoreKeysKeyboardParams());
-            final Keyboard parentKeyboard = parentKeyboardView.getKeyboard();
-            load(parentKeyboard.mMoreKeysTemplate, parentKeyboard.mId);
+            load(keyboard.mMoreKeysTemplate, keyboard.mId);
 
             // TODO: More keys keyboard's vertical gap is currently calculated heuristically.
             // Should revise the algorithm.
-            mParams.mVerticalGap = parentKeyboard.mVerticalGap / 2;
-            mParentKey = parentKey;
+            mParams.mVerticalGap = keyboard.mVerticalGap / 2;
+            // This {@link MoreKeysKeyboard} is invoked from the <code>key</code>.
+            mParentKey = key;
 
-            final MoreKeySpec[] moreKeys = parentKey.getMoreKeys();
-            final int width, height;
-            // {@link KeyPreviewDrawParams#mPreviewVisibleWidth} should have been set at
-            // {@link MainKeyboardView#showKeyPreview(PointerTracker}, though there may be
-            // some chances that the value is zero. <code>width == 0</code> will cause
-            // zero-division error at
-            // {@link MoreKeysKeyboardParams#setParameters(int,int,int,int,int,int,boolean,int)}.
-            final boolean singleMoreKeyWithPreview = parentKeyboardView.isKeyPreviewPopupEnabled()
-                    && !parentKey.noKeyPreview() && moreKeys.length == 1
-                    && keyPreviewDrawParams.getVisibleWidth() > 0;
-            if (singleMoreKeyWithPreview) {
+            final int keyWidth, rowHeight;
+            if (isSingleMoreKeyWithPreview) {
                 // Use pre-computed width and height if this more keys keyboard has only one key to
                 // mitigate visual flicker between key preview and more keys keyboard.
                 // Caveats for the visual assets: To achieve this effect, both the key preview
@@ -294,29 +287,28 @@
                 // left/right/top paddings. The bottom paddings of both backgrounds don't need to
                 // be considered because the vertical positions of both backgrounds were already
                 // adjusted with their bottom paddings deducted.
-                width = keyPreviewDrawParams.getVisibleWidth();
-                height = keyPreviewDrawParams.getVisibleHeight() + mParams.mVerticalGap;
+                keyWidth = keyPreviewVisibleWidth;
+                rowHeight = keyPreviewVisibleHeight + mParams.mVerticalGap;
             } else {
                 final float padding = context.getResources().getDimension(
                         R.dimen.config_more_keys_keyboard_key_horizontal_padding)
-                        + (parentKey.hasLabelsInMoreKeys()
+                        + (key.hasLabelsInMoreKeys()
                                 ? mParams.mDefaultKeyWidth * LABEL_PADDING_RATIO : 0.0f);
-                width = getMaxKeyWidth(parentKey, mParams.mDefaultKeyWidth, padding,
-                        parentKeyboardView.newLabelPaint(parentKey));
-                height = parentKeyboard.mMostCommonKeyHeight;
+                keyWidth = getMaxKeyWidth(key, mParams.mDefaultKeyWidth, padding, paintToMeasure);
+                rowHeight = keyboard.mMostCommonKeyHeight;
             }
             final int dividerWidth;
-            if (parentKey.needsDividersInMoreKeys()) {
+            if (key.needsDividersInMoreKeys()) {
                 mDivider = mResources.getDrawable(R.drawable.more_keys_divider);
-                dividerWidth = (int)(width * DIVIDER_RATIO);
+                dividerWidth = (int)(keyWidth * DIVIDER_RATIO);
             } else {
                 mDivider = null;
                 dividerWidth = 0;
             }
-            mParams.setParameters(moreKeys.length, parentKey.getMoreKeysColumn(),
-                    width, height, parentKey.getX() + parentKey.getWidth() / 2,
-                    parentKeyboard.mId.mWidth, parentKey.isFixedColumnOrderMoreKeys(),
-                    dividerWidth);
+            final MoreKeySpec[] moreKeys = key.getMoreKeys();
+            mParams.setParameters(moreKeys.length, key.getMoreKeysColumn(), keyWidth, rowHeight,
+                    key.getX() + key.getWidth() / 2, keyboard.mId.mWidth,
+                    key.isFixedColumnOrderMoreKeys(), dividerWidth);
         }
 
         private static int getMaxKeyWidth(final Key parentKey, final int minKeyWidth,
diff --git a/java/src/com/android/inputmethod/keyboard/emoji/EmojiPageKeyboardView.java b/java/src/com/android/inputmethod/keyboard/emoji/EmojiPageKeyboardView.java
index a34dbef..8010a3e 100644
--- a/java/src/com/android/inputmethod/keyboard/emoji/EmojiPageKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/emoji/EmojiPageKeyboardView.java
@@ -21,6 +21,7 @@
 import android.util.AttributeSet;
 import android.view.GestureDetector;
 import android.view.MotionEvent;
+import android.view.accessibility.AccessibilityEvent;
 
 import com.android.inputmethod.accessibility.AccessibilityUtils;
 import com.android.inputmethod.accessibility.KeyboardAccessibilityDelegate;
@@ -106,6 +107,12 @@
         }
     }
 
+    @Override
+    public boolean dispatchPopulateAccessibilityEvent(final AccessibilityEvent event) {
+        // Don't populate accessibility event with all Emoji keys.
+        return true;
+    }
+
     /**
      * {@inheritDoc}
      */
diff --git a/java/src/com/android/inputmethod/keyboard/internal/AbstractDrawingPreview.java b/java/src/com/android/inputmethod/keyboard/internal/AbstractDrawingPreview.java
index 3a72aed..a194f3d 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/AbstractDrawingPreview.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/AbstractDrawingPreview.java
@@ -27,16 +27,19 @@
  * SlidingKeyInputDrawingPreview.
  */
 public abstract class AbstractDrawingPreview {
-    private final View mDrawingView;
+    private View mDrawingView;
     private boolean mPreviewEnabled;
     private boolean mHasValidGeometry;
 
-    protected AbstractDrawingPreview(final View drawingView) {
+    public void setDrawingView(final DrawingPreviewPlacerView drawingView) {
         mDrawingView = drawingView;
+        drawingView.addPreview(this);
     }
 
-    protected final View getDrawingView() {
-        return mDrawingView;
+    protected void invalidateDrawingView() {
+        if (mDrawingView != null) {
+            mDrawingView.invalidate();
+        }
     }
 
     protected final boolean isPreviewEnabled() {
diff --git a/java/src/com/android/inputmethod/keyboard/internal/DrawingPreviewPlacerView.java b/java/src/com/android/inputmethod/keyboard/internal/DrawingPreviewPlacerView.java
index 3b4c434..a5d47ad 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/DrawingPreviewPlacerView.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/DrawingPreviewPlacerView.java
@@ -46,7 +46,9 @@
     }
 
     public void addPreview(final AbstractDrawingPreview preview) {
-        mPreviews.add(preview);
+        if (mPreviews.indexOf(preview) < 0) {
+            mPreviews.add(preview);
+        }
     }
 
     public void setKeyboardViewGeometry(final int[] originCoords, final int width,
diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureFloatingTextDrawingPreview.java b/java/src/com/android/inputmethod/keyboard/internal/GestureFloatingTextDrawingPreview.java
index 2fa7030..fd84856 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/GestureFloatingTextDrawingPreview.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/GestureFloatingTextDrawingPreview.java
@@ -23,7 +23,6 @@
 import android.graphics.Rect;
 import android.graphics.RectF;
 import android.text.TextUtils;
-import android.view.View;
 
 import com.android.inputmethod.keyboard.PointerTracker;
 import com.android.inputmethod.latin.R;
@@ -49,6 +48,7 @@
         public final float mGesturePreviewHorizontalPadding;
         public final float mGesturePreviewVerticalPadding;
         public final float mGesturePreviewRoundRadius;
+        public final int mDisplayWidth;
 
         private final int mGesturePreviewTextSize;
         private final int mGesturePreviewTextColor;
@@ -72,6 +72,7 @@
                     R.styleable.MainKeyboardView_gestureFloatingPreviewVerticalPadding, 0.0f);
             mGesturePreviewRoundRadius = mainKeyboardViewAttr.getDimension(
                     R.styleable.MainKeyboardView_gestureFloatingPreviewRoundRadius, 0.0f);
+            mDisplayWidth = mainKeyboardViewAttr.getResources().getDisplayMetrics().widthPixels;
 
             final Paint textPaint = getTextPaint();
             final Rect textRect = new Rect();
@@ -100,9 +101,8 @@
     private SuggestedWords mSuggestedWords = SuggestedWords.EMPTY;
     private final int[] mLastPointerCoords = CoordinateUtils.newInstance();
 
-    public GestureFloatingTextDrawingPreview(final View drawingView, final TypedArray typedArray) {
-        super(drawingView);
-        mParams = new GesturePreviewTextParams(typedArray);
+    public GestureFloatingTextDrawingPreview(final TypedArray mainKeyboardViewAttr) {
+        mParams = new GesturePreviewTextParams(mainKeyboardViewAttr);
     }
 
     @Override
@@ -149,7 +149,7 @@
      */
     protected void updatePreviewPosition() {
         if (mSuggestedWords.isEmpty() || TextUtils.isEmpty(mSuggestedWords.getWord(0))) {
-            getDrawingView().invalidate();
+            invalidateDrawingView();
             return;
         }
         final String text = mSuggestedWords.getWord(0);
@@ -163,10 +163,9 @@
         final float rectWidth = textWidth + hPad * 2.0f;
         final float rectHeight = textHeight + vPad * 2.0f;
 
-        final int displayWidth = getDrawingView().getResources().getDisplayMetrics().widthPixels;
         final float rectX = Math.min(
                 Math.max(CoordinateUtils.x(mLastPointerCoords) - rectWidth / 2.0f, 0.0f),
-                displayWidth - rectWidth);
+                mParams.mDisplayWidth - rectWidth);
         final float rectY = CoordinateUtils.y(mLastPointerCoords)
                 - mParams.mGesturePreviewTextOffset - rectHeight;
         rectangle.set(rectX, rectY, rectX + rectWidth, rectY + rectHeight);
@@ -174,6 +173,6 @@
         mPreviewTextX = (int)(rectX + hPad + textWidth / 2.0f);
         mPreviewTextY = (int)(rectY + vPad) + textHeight;
         // TODO: Should narrow the invalidate region.
-        getDrawingView().invalidate();
+        invalidateDrawingView();
     }
 }
diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureTrailsDrawingPreview.java b/java/src/com/android/inputmethod/keyboard/internal/GestureTrailsDrawingPreview.java
index 72628e3..f7bd7ef 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/GestureTrailsDrawingPreview.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/GestureTrailsDrawingPreview.java
@@ -24,17 +24,15 @@
 import android.graphics.PorterDuff;
 import android.graphics.PorterDuffXfermode;
 import android.graphics.Rect;
-import android.os.Message;
+import android.os.Handler;
 import android.util.SparseArray;
-import android.view.View;
 
 import com.android.inputmethod.keyboard.PointerTracker;
-import com.android.inputmethod.latin.utils.LeakGuardHandlerWrapper;
 
 /**
  * Draw preview graphics of multiple gesture trails during gesture input.
  */
-public final class GestureTrailsDrawingPreview extends AbstractDrawingPreview {
+public final class GestureTrailsDrawingPreview extends AbstractDrawingPreview implements Runnable {
     private final SparseArray<GestureTrailDrawingPoints> mGestureTrails = new SparseArray<>();
     private final GestureTrailDrawingParams mDrawingParams;
     private final Paint mGesturePaint;
@@ -47,45 +45,10 @@
     private final Rect mDirtyRect = new Rect();
     private final Rect mGestureTrailBoundsRect = new Rect(); // per trail
 
-    private final DrawingHandler mDrawingHandler;
+    private final Handler mDrawingHandler = new Handler();
 
-    private static final class DrawingHandler
-            extends LeakGuardHandlerWrapper<GestureTrailsDrawingPreview> {
-        private static final int MSG_UPDATE_GESTURE_TRAIL = 0;
-
-        private final GestureTrailDrawingParams mDrawingParams;
-
-        public DrawingHandler(final GestureTrailsDrawingPreview ownerInstance,
-                final GestureTrailDrawingParams drawingParams) {
-            super(ownerInstance);
-            mDrawingParams = drawingParams;
-        }
-
-        @Override
-        public void handleMessage(final Message msg) {
-            final GestureTrailsDrawingPreview preview = getOwnerInstance();
-            if (preview == null) {
-                return;
-            }
-            switch (msg.what) {
-            case MSG_UPDATE_GESTURE_TRAIL:
-                preview.getDrawingView().invalidate();
-                break;
-            }
-        }
-
-        public void postUpdateGestureTrailPreview() {
-            removeMessages(MSG_UPDATE_GESTURE_TRAIL);
-            sendMessageDelayed(obtainMessage(MSG_UPDATE_GESTURE_TRAIL),
-                    mDrawingParams.mUpdateInterval);
-        }
-    }
-
-    public GestureTrailsDrawingPreview(final View drawingView,
-            final TypedArray mainKeyboardViewAttr) {
-        super(drawingView);
+    public GestureTrailsDrawingPreview(final TypedArray mainKeyboardViewAttr) {
         mDrawingParams = new GestureTrailDrawingParams(mainKeyboardViewAttr);
-        mDrawingHandler = new DrawingHandler(this, mDrawingParams);
         final Paint gesturePaint = new Paint();
         gesturePaint.setAntiAlias(true);
         gesturePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
@@ -153,6 +116,12 @@
         return needsUpdatingGestureTrail;
     }
 
+    @Override
+    public void run() {
+        // Update preview.
+        invalidateDrawingView();
+    }
+
     /**
      * Draws the preview
      * @param canvas The canvas where the preview is drawn.
@@ -167,7 +136,8 @@
         final boolean needsUpdatingGestureTrail = drawGestureTrails(
                 mOffscreenCanvas, mGesturePaint, mDirtyRect);
         if (needsUpdatingGestureTrail) {
-            mDrawingHandler.postUpdateGestureTrailPreview();
+            mDrawingHandler.removeCallbacks(this);
+            mDrawingHandler.postDelayed(this, mDrawingParams.mUpdateInterval);
         }
         // Transfer offscreen buffer to screen.
         if (!mDirtyRect.isEmpty()) {
@@ -199,6 +169,6 @@
         trail.addStroke(tracker.getGestureStrokeDrawingPoints(), tracker.getDownTime());
 
         // TODO: Should narrow the invalidate region.
-        getDrawingView().invalidate();
+        invalidateDrawingView();
     }
 }
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewChoreographer.java b/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewChoreographer.java
index 605519b..cd29c8d 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewChoreographer.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewChoreographer.java
@@ -21,17 +21,12 @@
 import android.animation.AnimatorSet;
 import android.animation.ObjectAnimator;
 import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.util.TypedValue;
-import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.animation.AccelerateInterpolator;
 import android.view.animation.DecelerateInterpolator;
-import android.widget.TextView;
 
 import com.android.inputmethod.keyboard.Key;
-import com.android.inputmethod.latin.R;
 import com.android.inputmethod.latin.utils.CoordinateUtils;
 import com.android.inputmethod.latin.utils.ViewLayoutUtils;
 
@@ -46,10 +41,11 @@
  * - how key previews should be shown and dismissed.
  */
 public final class KeyPreviewChoreographer {
-    // Free {@link TextView} pool that can be used for key preview.
-    private final ArrayDeque<TextView> mFreeKeyPreviewTextViews = new ArrayDeque<>();
-    // Map from {@link Key} to {@link TextView} that is currently being displayed as key preview.
-    private final HashMap<Key,TextView> mShowingKeyPreviewTextViews = new HashMap<>();
+    // Free {@link KeyPreviewView} pool that can be used for key preview.
+    private final ArrayDeque<KeyPreviewView> mFreeKeyPreviewViews = new ArrayDeque<>();
+    // Map from {@link Key} to {@link KeyPreviewView} that is currently being displayed as key
+    // preview.
+    private final HashMap<Key,KeyPreviewView> mShowingKeyPreviewViews = new HashMap<>();
 
     private final KeyPreviewDrawParams mParams;
 
@@ -57,32 +53,28 @@
         mParams = params;
     }
 
-    public TextView getKeyPreviewTextView(final Key key, final ViewGroup placerView) {
-        TextView previewTextView = mShowingKeyPreviewTextViews.remove(key);
-        if (previewTextView != null) {
-            return previewTextView;
+    public KeyPreviewView getKeyPreviewView(final Key key, final ViewGroup placerView) {
+        KeyPreviewView keyPreviewView = mShowingKeyPreviewViews.remove(key);
+        if (keyPreviewView != null) {
+            return keyPreviewView;
         }
-        previewTextView = mFreeKeyPreviewTextViews.poll();
-        if (previewTextView != null) {
-            return previewTextView;
+        keyPreviewView = mFreeKeyPreviewViews.poll();
+        if (keyPreviewView != null) {
+            return keyPreviewView;
         }
         final Context context = placerView.getContext();
-        if (mParams.mLayoutId != 0) {
-            previewTextView = (TextView)LayoutInflater.from(context)
-                    .inflate(mParams.mLayoutId, null);
-        } else {
-            previewTextView = new TextView(context);
-        }
-        placerView.addView(previewTextView, ViewLayoutUtils.newLayoutParam(placerView, 0, 0));
-        return previewTextView;
+        keyPreviewView = new KeyPreviewView(context, null /* attrs */);
+        keyPreviewView.setBackgroundResource(mParams.mPreviewBackgroundResId);
+        placerView.addView(keyPreviewView, ViewLayoutUtils.newLayoutParam(placerView, 0, 0));
+        return keyPreviewView;
     }
 
     public boolean isShowingKeyPreview(final Key key) {
-        return mShowingKeyPreviewTextViews.containsKey(key);
+        return mShowingKeyPreviewViews.containsKey(key);
     }
 
     public void dismissAllKeyPreviews() {
-        for (final Key key : new HashSet<>(mShowingKeyPreviewTextViews.keySet())) {
+        for (final Key key : new HashSet<>(mShowingKeyPreviewViews.keySet())) {
             dismissKeyPreview(key, false /* withAnimation */);
         }
     }
@@ -91,11 +83,11 @@
         if (key == null) {
             return;
         }
-        final TextView previewTextView = mShowingKeyPreviewTextViews.get(key);
-        if (previewTextView == null) {
+        final KeyPreviewView keyPreviewView = mShowingKeyPreviewViews.get(key);
+        if (keyPreviewView == null) {
             return;
         }
-        final Object tag = previewTextView.getTag();
+        final Object tag = keyPreviewView.getTag();
         if (withAnimation) {
             if (tag instanceof KeyPreviewAnimations) {
                 final KeyPreviewAnimations animation = (KeyPreviewAnimations)tag;
@@ -104,105 +96,76 @@
             }
         }
         // Dismiss preview without animation.
-        mShowingKeyPreviewTextViews.remove(key);
+        mShowingKeyPreviewViews.remove(key);
         if (tag instanceof Animator) {
             ((Animator)tag).cancel();
         }
-        previewTextView.setTag(null);
-        previewTextView.setVisibility(View.INVISIBLE);
-        mFreeKeyPreviewTextViews.add(previewTextView);
+        keyPreviewView.setTag(null);
+        keyPreviewView.setVisibility(View.INVISIBLE);
+        mFreeKeyPreviewViews.add(keyPreviewView);
     }
 
-    // Background state set
-    private static final int[][][] KEY_PREVIEW_BACKGROUND_STATE_TABLE = {
-        { // STATE_MIDDLE
-            {},
-            { R.attr.state_has_morekeys }
-        },
-        { // STATE_LEFT
-            { R.attr.state_left_edge },
-            { R.attr.state_left_edge, R.attr.state_has_morekeys }
-        },
-        { // STATE_RIGHT
-            { R.attr.state_right_edge },
-            { R.attr.state_right_edge, R.attr.state_has_morekeys }
-        }
-    };
-    private static final int STATE_MIDDLE = 0;
-    private static final int STATE_LEFT = 1;
-    private static final int STATE_RIGHT = 2;
-    private static final int STATE_NORMAL = 0;
-    private static final int STATE_HAS_MOREKEYS = 1;
+    public void placeAndShowKeyPreview(final Key key, final KeyboardIconsSet iconsSet,
+            final KeyDrawParams drawParams, final int keyboardViewWidth, final int[] keyboardOrigin,
+            final ViewGroup placerView, final boolean withAnimation) {
+        final KeyPreviewView keyPreviewView = getKeyPreviewView(key, placerView);
+        placeKeyPreview(
+                key, keyPreviewView, iconsSet, drawParams, keyboardViewWidth, keyboardOrigin);
+        showKeyPreview(key, keyPreviewView, withAnimation);
+    }
 
-    public void placeKeyPreview(final Key key, final TextView previewTextView,
+    private void placeKeyPreview(final Key key, final KeyPreviewView keyPreviewView,
             final KeyboardIconsSet iconsSet, final KeyDrawParams drawParams,
             final int keyboardViewWidth, final int[] originCoords) {
-        previewTextView.setTextColor(drawParams.mPreviewTextColor);
-        final Drawable background = previewTextView.getBackground();
-        final String label = key.getPreviewLabel();
-        // What we show as preview should match what we show on a key top in onDraw().
-        if (label != null) {
-            // TODO Should take care of temporaryShiftLabel here.
-            previewTextView.setCompoundDrawables(null, null, null, null);
-            previewTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
-                    key.selectPreviewTextSize(drawParams));
-            previewTextView.setTypeface(key.selectPreviewTypeface(drawParams));
-            previewTextView.setText(label);
-        } else {
-            previewTextView.setCompoundDrawables(null, null, null, key.getPreviewIcon(iconsSet));
-            previewTextView.setText(null);
-        }
-
-        previewTextView.measure(
+        keyPreviewView.setPreviewVisual(key, iconsSet, drawParams);
+        keyPreviewView.measure(
                 ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
-        mParams.setGeometry(previewTextView);
-        final int previewWidth = previewTextView.getMeasuredWidth();
+        mParams.setGeometry(keyPreviewView);
+        final int previewWidth = keyPreviewView.getMeasuredWidth();
         final int previewHeight = mParams.mPreviewHeight;
         final int keyDrawWidth = key.getDrawWidth();
         // The key preview is horizontally aligned with the center of the visible part of the
         // parent key. If it doesn't fit in this {@link KeyboardView}, it is moved inward to fit and
         // the left/right background is used if such background is specified.
-        final int statePosition;
+        final int keyPreviewPosition;
         int previewX = key.getDrawX() - (previewWidth - keyDrawWidth) / 2
                 + CoordinateUtils.x(originCoords);
         if (previewX < 0) {
             previewX = 0;
-            statePosition = STATE_LEFT;
+            keyPreviewPosition = KeyPreviewView.POSITION_LEFT;
         } else if (previewX > keyboardViewWidth - previewWidth) {
             previewX = keyboardViewWidth - previewWidth;
-            statePosition = STATE_RIGHT;
+            keyPreviewPosition = KeyPreviewView.POSITION_RIGHT;
         } else {
-            statePosition = STATE_MIDDLE;
+            keyPreviewPosition = KeyPreviewView.POSITION_MIDDLE;
         }
+        final boolean hasMoreKeys = (key.getMoreKeys() != null);
+        keyPreviewView.setPreviewBackground(hasMoreKeys, keyPreviewPosition);
         // The key preview is placed vertically above the top edge of the parent key with an
         // arbitrary offset.
         final int previewY = key.getY() - previewHeight + mParams.mPreviewOffset
                 + CoordinateUtils.y(originCoords);
 
-        if (background != null) {
-            final int hasMoreKeys = (key.getMoreKeys() != null) ? STATE_HAS_MOREKEYS : STATE_NORMAL;
-            background.setState(KEY_PREVIEW_BACKGROUND_STATE_TABLE[statePosition][hasMoreKeys]);
-        }
         ViewLayoutUtils.placeViewAt(
-                previewTextView, previewX, previewY, previewWidth, previewHeight);
-        previewTextView.setPivotX(previewWidth / 2.0f);
-        previewTextView.setPivotY(previewHeight);
+                keyPreviewView, previewX, previewY, previewWidth, previewHeight);
+        keyPreviewView.setPivotX(previewWidth / 2.0f);
+        keyPreviewView.setPivotY(previewHeight);
     }
 
-    public void showKeyPreview(final Key key, final TextView previewTextView,
+    private void showKeyPreview(final Key key, final KeyPreviewView keyPreviewView,
             final boolean withAnimation) {
         if (!withAnimation) {
-            previewTextView.setVisibility(View.VISIBLE);
-            mShowingKeyPreviewTextViews.put(key, previewTextView);
+            keyPreviewView.setVisibility(View.VISIBLE);
+            mShowingKeyPreviewViews.put(key, keyPreviewView);
             return;
         }
 
         // Show preview with animation.
-        final Animator showUpAnimation = createShowUpAniation(key, previewTextView);
-        final Animator dismissAnimation = createDismissAnimation(key, previewTextView);
+        final Animator showUpAnimation = createShowUpAniation(key, keyPreviewView);
+        final Animator dismissAnimation = createDismissAnimation(key, keyPreviewView);
         final KeyPreviewAnimations animation = new KeyPreviewAnimations(
                 showUpAnimation, dismissAnimation);
-        previewTextView.setTag(animation);
+        keyPreviewView.setTag(animation);
         animation.startShowUp();
     }
 
@@ -212,13 +175,13 @@
     private static final DecelerateInterpolator DECELERATE_INTERPOLATOR =
             new DecelerateInterpolator();
 
-    private Animator createShowUpAniation(final Key key, final TextView previewTextView) {
+    private Animator createShowUpAniation(final Key key, final KeyPreviewView keyPreviewView) {
         // TODO: Optimization for no scale animation and no duration.
         final ObjectAnimator scaleXAnimation = ObjectAnimator.ofFloat(
-                previewTextView, View.SCALE_X, mParams.getShowUpStartScale(),
+                keyPreviewView, View.SCALE_X, mParams.getShowUpStartScale(),
                 KEY_PREVIEW_SHOW_UP_END_SCALE);
         final ObjectAnimator scaleYAnimation = ObjectAnimator.ofFloat(
-                previewTextView, View.SCALE_Y, mParams.getShowUpStartScale(),
+                keyPreviewView, View.SCALE_Y, mParams.getShowUpStartScale(),
                 KEY_PREVIEW_SHOW_UP_END_SCALE);
         final AnimatorSet showUpAnimation = new AnimatorSet();
         showUpAnimation.play(scaleXAnimation).with(scaleYAnimation);
@@ -227,18 +190,18 @@
         showUpAnimation.addListener(new AnimatorListenerAdapter() {
             @Override
             public void onAnimationStart(final Animator animation) {
-                showKeyPreview(key, previewTextView, false /* withAnimation */);
+                showKeyPreview(key, keyPreviewView, false /* withAnimation */);
             }
         });
         return showUpAnimation;
     }
 
-    private Animator createDismissAnimation(final Key key, final TextView previewTextView) {
+    private Animator createDismissAnimation(final Key key, final KeyPreviewView keyPreviewView) {
         // TODO: Optimization for no scale animation and no duration.
         final ObjectAnimator scaleXAnimation = ObjectAnimator.ofFloat(
-                previewTextView, View.SCALE_X, mParams.getDismissEndScale());
+                keyPreviewView, View.SCALE_X, mParams.getDismissEndScale());
         final ObjectAnimator scaleYAnimation = ObjectAnimator.ofFloat(
-                previewTextView, View.SCALE_Y, mParams.getDismissEndScale());
+                keyPreviewView, View.SCALE_Y, mParams.getDismissEndScale());
         final AnimatorSet dismissAnimation = new AnimatorSet();
         dismissAnimation.play(scaleXAnimation).with(scaleYAnimation);
         final int dismissDuration = Math.min(
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewDrawParams.java b/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewDrawParams.java
index 37e5c88..68c9831 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewDrawParams.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewDrawParams.java
@@ -23,9 +23,9 @@
 
 public final class KeyPreviewDrawParams {
     // XML attributes of {@link MainKeyboardView}.
-    public final int mLayoutId;
     public final int mPreviewOffset;
     public final int mPreviewHeight;
+    public final int mPreviewBackgroundResId;
     private int mShowUpDuration;
     private int mDismissDuration;
     private float mShowUpStartScale;
@@ -63,13 +63,10 @@
                 R.styleable.MainKeyboardView_keyPreviewOffset, 0);
         mPreviewHeight = mainKeyboardViewAttr.getDimensionPixelSize(
                 R.styleable.MainKeyboardView_keyPreviewHeight, 0);
+        mPreviewBackgroundResId = mainKeyboardViewAttr.getResourceId(
+                R.styleable.MainKeyboardView_keyPreviewBackground, 0);
         mLingerTimeout = mainKeyboardViewAttr.getInt(
                 R.styleable.MainKeyboardView_keyPreviewLingerTimeout, 0);
-        mLayoutId = mainKeyboardViewAttr.getResourceId(
-                R.styleable.MainKeyboardView_keyPreviewLayout, 0);
-        if (mLayoutId == 0) {
-            mShowPopup = false;
-        }
     }
 
     public void setVisibleOffset(final int previewVisibleOffset) {
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewView.java b/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewView.java
new file mode 100644
index 0000000..360faf8
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewView.java
@@ -0,0 +1,90 @@
+/*
+ * 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.keyboard.internal;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.util.TypedValue;
+import android.view.Gravity;
+import android.widget.TextView;
+
+import com.android.inputmethod.keyboard.Key;
+import com.android.inputmethod.latin.R;
+
+/**
+ * The pop up key preview view.
+ */
+public class KeyPreviewView extends TextView {
+    public static final int POSITION_MIDDLE = 0;
+    public static final int POSITION_LEFT = 1;
+    public static final int POSITION_RIGHT = 2;
+
+    public KeyPreviewView(final Context context, final AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public KeyPreviewView(final Context context, final AttributeSet attrs, final int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        setGravity(Gravity.CENTER);
+    }
+
+    public void setPreviewVisual(final Key key, final KeyboardIconsSet iconsSet,
+            final KeyDrawParams drawParams) {
+        // What we show as preview should match what we show on a key top in onDraw().
+        final int iconId = key.getIconId();
+        if (iconId != KeyboardIconsSet.ICON_UNDEFINED) {
+            setCompoundDrawables(null, null, null, key.getPreviewIcon(iconsSet));
+            setText(null);
+            return;
+        }
+
+        setCompoundDrawables(null, null, null, null);
+        setTextColor(drawParams.mPreviewTextColor);
+        setTextSize(TypedValue.COMPLEX_UNIT_PX, key.selectPreviewTextSize(drawParams));
+        setTypeface(key.selectPreviewTypeface(drawParams));
+        // TODO Should take care of temporaryShiftLabel here.
+        setText(key.getPreviewLabel());
+    }
+
+    // Background state set
+    private static final int[][][] KEY_PREVIEW_BACKGROUND_STATE_TABLE = {
+        { // POSITION_MIDDLE
+            {},
+            { R.attr.state_has_morekeys }
+        },
+        { // POSITION_LEFT
+            { R.attr.state_left_edge },
+            { R.attr.state_left_edge, R.attr.state_has_morekeys }
+        },
+        { // POSITION_RIGHT
+            { R.attr.state_right_edge },
+            { R.attr.state_right_edge, R.attr.state_has_morekeys }
+        }
+    };
+    private static final int STATE_NORMAL = 0;
+    private static final int STATE_HAS_MOREKEYS = 1;
+
+    public void setPreviewBackground(final boolean hasMoreKeys, final int position) {
+        final Drawable background = getBackground();
+        if (background == null) {
+            return;
+        }
+        final int hasMoreKeysState = hasMoreKeys ? STATE_HAS_MOREKEYS : STATE_NORMAL;
+        background.setState(KEY_PREVIEW_BACKGROUND_STATE_TABLE[position][hasMoreKeysState]);
+    }
+}
diff --git a/java/src/com/android/inputmethod/keyboard/internal/SlidingKeyInputDrawingPreview.java b/java/src/com/android/inputmethod/keyboard/internal/SlidingKeyInputDrawingPreview.java
index 76cb891..ef4c74d 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/SlidingKeyInputDrawingPreview.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/SlidingKeyInputDrawingPreview.java
@@ -20,7 +20,6 @@
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Path;
-import android.view.View;
 
 import com.android.inputmethod.keyboard.PointerTracker;
 import com.android.inputmethod.latin.R;
@@ -28,6 +27,11 @@
 
 /**
  * Draw rubber band preview graphics during sliding key input.
+ *
+ * @attr ref R.styleable#MainKeyboardView_slidingKeyInputPreviewColor
+ * @attr ref R.styleable#MainKeyboardView_slidingKeyInputPreviewWidth
+ * @attr ref R.styleable#MainKeyboardView_slidingKeyInputPreviewBodyRatio
+ * @attr ref R.styleable#MainKeyboardView_slidingKeyInputPreviewShadowRatio
  */
 public final class SlidingKeyInputDrawingPreview extends AbstractDrawingPreview {
     private final float mPreviewBodyRadius;
@@ -40,9 +44,7 @@
     private final RoundedLine mRoundedLine = new RoundedLine();
     private final Paint mPaint = new Paint();
 
-    public SlidingKeyInputDrawingPreview(final View drawingView,
-            final TypedArray mainKeyboardViewAttr) {
-        super(drawingView);
+    public SlidingKeyInputDrawingPreview(final TypedArray mainKeyboardViewAttr) {
         final int previewColor = mainKeyboardViewAttr.getColor(
                 R.styleable.MainKeyboardView_slidingKeyInputPreviewColor, 0);
         final float previewRadius = mainKeyboardViewAttr.getDimension(
@@ -69,7 +71,7 @@
 
     public void dismissSlidingKeyInputPreview() {
         mShowsSlidingKeyInputPreview = false;
-        getDrawingView().invalidate();
+        invalidateDrawingView();
     }
 
     /**
@@ -99,6 +101,6 @@
         tracker.getDownCoordinates(mPreviewFrom);
         tracker.getLastCoordinates(mPreviewTo);
         mShowsSlidingKeyInputPreview = true;
-        getDrawingView().invalidate();
+        invalidateDrawingView();
     }
 }
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
index 543f74f..335e52f 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
@@ -28,7 +28,6 @@
 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.NativeSuggestOptions;
 import com.android.inputmethod.latin.utils.BinaryDictionaryUtils;
 import com.android.inputmethod.latin.utils.FileUtils;
 import com.android.inputmethod.latin.utils.JniUtils;
@@ -49,10 +48,6 @@
 public final class BinaryDictionary extends Dictionary {
     private static final String TAG = BinaryDictionary.class.getSimpleName();
 
-    // Must be equal to MAX_WORD_LENGTH in native/jni/src/defines.h
-    private static final int MAX_WORD_LENGTH = Constants.DICTIONARY_MAX_WORD_LENGTH;
-    // Must be equal to MAX_RESULTS in native/jni/src/defines.h
-    private static final int MAX_RESULTS = 18;
     // The cutoff returned by native for auto-commit confidence.
     // Must be equal to CONFIDENCE_TO_AUTO_COMMIT in native/jni/src/defines.h
     private static final int CONFIDENCE_TO_AUTO_COMMIT = 1000000;
@@ -69,11 +64,12 @@
     public static final int NOT_A_VALID_TIMESTAMP = -1;
 
     // Format to get unigram flags from native side via getWordPropertyNative().
-    private static final int FORMAT_WORD_PROPERTY_OUTPUT_FLAG_COUNT = 4;
+    private static final int FORMAT_WORD_PROPERTY_OUTPUT_FLAG_COUNT = 5;
     private static final int FORMAT_WORD_PROPERTY_IS_NOT_A_WORD_INDEX = 0;
     private static final int FORMAT_WORD_PROPERTY_IS_BLACKLISTED_INDEX = 1;
     private static final int FORMAT_WORD_PROPERTY_HAS_BIGRAMS_INDEX = 2;
     private static final int FORMAT_WORD_PROPERTY_HAS_SHORTCUTS_INDEX = 3;
+    private static final int FORMAT_WORD_PROPERTY_IS_BEGINNING_OF_SENTENCE_INDEX = 4;
 
     // Format to get probability and historical info from native side via getWordPropertyNative().
     public static final int FORMAT_WORD_PROPERTY_OUTPUT_PROBABILITY_INFO_COUNT = 4;
@@ -88,21 +84,10 @@
     private final Locale mLocale;
     private final long mDictSize;
     private final String mDictFilePath;
+    private final boolean mUseFullEditDistance;
     private final boolean mIsUpdatable;
     private boolean mHasUpdated;
 
-    private final int[] mInputCodePoints = new int[MAX_WORD_LENGTH];
-    private final int[] mOutputSuggestionCount = new int[1];
-    private final int[] mOutputCodePoints = new int[MAX_WORD_LENGTH * MAX_RESULTS];
-    private final int[] mSpaceIndices = new int[MAX_RESULTS];
-    private final int[] mOutputScores = new int[MAX_RESULTS];
-    private final int[] mOutputTypes = new int[MAX_RESULTS];
-    // Only one result is ever used
-    private final int[] mOutputAutoCommitFirstWordConfidence = new int[1];
-    private final float[] mInputOutputLanguageWeight = new float[1];
-
-    private final NativeSuggestOptions mNativeSuggestOptions = new NativeSuggestOptions();
-
     private final SparseArray<DicTraverseSession> mDicTraverseSessions = new SparseArray<>();
 
     // TODO: There should be a way to remove used DicTraverseSession objects from
@@ -136,7 +121,7 @@
         mDictFilePath = filename;
         mIsUpdatable = isUpdatable;
         mHasUpdated = false;
-        mNativeSuggestOptions.setUseFullEditDistance(useFullEditDistance);
+        mUseFullEditDistance = useFullEditDistance;
         loadDictionary(filename, offset, length, isUpdatable);
     }
 
@@ -148,7 +133,6 @@
      * @param formatVersion the format version of the dictionary
      * @param attributeMap the attributes of the dictionary
      */
-    @UsedForTesting
     public BinaryDictionary(final String filename, final boolean useFullEditDistance,
             final Locale locale, final String dictType, final long formatVersion,
             final Map<String, String> attributeMap) {
@@ -159,7 +143,7 @@
         // On memory dictionary is always updatable.
         mIsUpdatable = true;
         mHasUpdated = false;
-        mNativeSuggestOptions.setUseFullEditDistance(useFullEditDistance);
+        mUseFullEditDistance = useFullEditDistance;
         final String[] keyArray = new String[attributeMap.size()];
         final String[] valueArray = new String[attributeMap.size()];
         int index = 0;
@@ -193,10 +177,12 @@
     private static native int getBigramProbabilityNative(long dict, int[] word0,
             boolean isBeginningOfSentence, int[] word1);
     private static native void getWordPropertyNative(long dict, int[] word,
-            int[] outCodePoints, boolean[] outFlags, int[] outProbabilityInfo,
-            ArrayList<int[]> outBigramTargets, ArrayList<int[]> outBigramProbabilityInfo,
-            ArrayList<int[]> outShortcutTargets, ArrayList<Integer> outShortcutProbabilities);
-    private static native int getNextWordNative(long dict, int token, int[] outCodePoints);
+            boolean isBeginningOfSentence, int[] outCodePoints, boolean[] outFlags,
+            int[] outProbabilityInfo, ArrayList<int[]> outBigramTargets,
+            ArrayList<int[]> outBigramProbabilityInfo, ArrayList<int[]> outShortcutTargets,
+            ArrayList<Integer> outShortcutProbabilities);
+    private static native int getNextWordNative(long dict, int token, int[] outCodePoints,
+            boolean[] outIsBeginningOfSentence);
     private static native void getSuggestionsNative(long dict, long proximityInfo,
             long traverseSession, int[] xCoordinates, int[] yCoordinates, int[] times,
             int[] pointerIds, int[] inputCodePoints, int inputSize, int[] suggestOptions,
@@ -274,8 +260,8 @@
         if (!isValidDictionary()) {
             return null;
         }
-
-        Arrays.fill(mInputCodePoints, Constants.NOT_A_CODE);
+        final DicTraverseSession session = getTraverseSession(sessionId);
+        Arrays.fill(session.mInputCodePoints, Constants.NOT_A_CODE);
         // TODO: toLowerCase in the native code
         final int[] prevWordCodePointArray = (null == prevWordsInfo.mPrevWord)
                 ? null : StringUtils.toCodePointArray(prevWordsInfo.mPrevWord);
@@ -284,47 +270,50 @@
         final int inputSize;
         if (!isGesture) {
             inputSize = composer.copyCodePointsExceptTrailingSingleQuotesAndReturnCodePointCount(
-                    mInputCodePoints);
+                    session.mInputCodePoints);
             if (inputSize < 0) {
                 return null;
             }
         } else {
             inputSize = inputPointers.getPointerSize();
         }
-
-        mNativeSuggestOptions.setIsGesture(isGesture);
-        mNativeSuggestOptions.setBlockOffensiveWords(blockOffensiveWords);
-        mNativeSuggestOptions.setAdditionalFeaturesOptions(additionalFeaturesOptions);
+        session.mNativeSuggestOptions.setUseFullEditDistance(mUseFullEditDistance);
+        session.mNativeSuggestOptions.setIsGesture(isGesture);
+        session.mNativeSuggestOptions.setBlockOffensiveWords(blockOffensiveWords);
+        session.mNativeSuggestOptions.setAdditionalFeaturesOptions(additionalFeaturesOptions);
         if (inOutLanguageWeight != null) {
-            mInputOutputLanguageWeight[0] = inOutLanguageWeight[0];
+            session.mInputOutputLanguageWeight[0] = inOutLanguageWeight[0];
         } else {
-            mInputOutputLanguageWeight[0] = Dictionary.NOT_A_LANGUAGE_WEIGHT;
+            session.mInputOutputLanguageWeight[0] = Dictionary.NOT_A_LANGUAGE_WEIGHT;
         }
         // proximityInfo and/or prevWordForBigrams may not be null.
         getSuggestionsNative(mNativeDict, proximityInfo.getNativeProximityInfo(),
                 getTraverseSession(sessionId).getSession(), inputPointers.getXCoordinates(),
                 inputPointers.getYCoordinates(), inputPointers.getTimes(),
-                inputPointers.getPointerIds(), mInputCodePoints, inputSize,
-                mNativeSuggestOptions.getOptions(), prevWordCodePointArray,
-                prevWordsInfo.mIsBeginningOfSentence, mOutputSuggestionCount,
-                mOutputCodePoints, mOutputScores, mSpaceIndices, mOutputTypes,
-                mOutputAutoCommitFirstWordConfidence, mInputOutputLanguageWeight);
+                inputPointers.getPointerIds(), session.mInputCodePoints, inputSize,
+                session.mNativeSuggestOptions.getOptions(), prevWordCodePointArray,
+                prevWordsInfo.mIsBeginningOfSentence, session.mOutputSuggestionCount,
+                session.mOutputCodePoints, session.mOutputScores, session.mSpaceIndices,
+                session.mOutputTypes, session.mOutputAutoCommitFirstWordConfidence,
+                session.mInputOutputLanguageWeight);
         if (inOutLanguageWeight != null) {
-            inOutLanguageWeight[0] = mInputOutputLanguageWeight[0];
+            inOutLanguageWeight[0] = session.mInputOutputLanguageWeight[0];
         }
-        final int count = mOutputSuggestionCount[0];
+        final int count = session.mOutputSuggestionCount[0];
         final ArrayList<SuggestedWordInfo> suggestions = new ArrayList<>();
         for (int j = 0; j < count; ++j) {
-            final int start = j * MAX_WORD_LENGTH;
+            final int start = j * Constants.DICTIONARY_MAX_WORD_LENGTH;
             int len = 0;
-            while (len < MAX_WORD_LENGTH && mOutputCodePoints[start + len] != 0) {
+            while (len < Constants.DICTIONARY_MAX_WORD_LENGTH
+                    && session.mOutputCodePoints[start + len] != 0) {
                 ++len;
             }
             if (len > 0) {
-                suggestions.add(new SuggestedWordInfo(new String(mOutputCodePoints, start, len),
-                        mOutputScores[j], mOutputTypes[j], this /* sourceDict */,
-                        mSpaceIndices[j] /* indexOfTouchPointOfSecondWord */,
-                        mOutputAutoCommitFirstWordConfidence[0]));
+                suggestions.add(new SuggestedWordInfo(
+                        new String(session.mOutputCodePoints, start, len),
+                        session.mOutputScores[j], session.mOutputTypes[j], this /* sourceDict */,
+                        session.mSpaceIndices[j] /* indexOfTouchPointOfSecondWord */,
+                        session.mOutputAutoCommitFirstWordConfidence[0]));
             }
         }
         return suggestions;
@@ -372,12 +361,12 @@
                 prevWordsInfo.mIsBeginningOfSentence, codePoints1);
     }
 
-    public WordProperty getWordProperty(final String word) {
-        if (TextUtils.isEmpty(word)) {
+    public WordProperty getWordProperty(final String word, final boolean isBeginningOfSentence) {
+        if (word == null) {
             return null;
         }
         final int[] codePoints = StringUtils.toCodePointArray(word);
-        final int[] outCodePoints = new int[MAX_WORD_LENGTH];
+        final int[] outCodePoints = new int[Constants.DICTIONARY_MAX_WORD_LENGTH];
         final boolean[] outFlags = new boolean[FORMAT_WORD_PROPERTY_OUTPUT_FLAG_COUNT];
         final int[] outProbabilityInfo =
                 new int[FORMAT_WORD_PROPERTY_OUTPUT_PROBABILITY_INFO_COUNT];
@@ -385,14 +374,15 @@
         final ArrayList<int[]> outBigramProbabilityInfo = new ArrayList<>();
         final ArrayList<int[]> outShortcutTargets = new ArrayList<>();
         final ArrayList<Integer> outShortcutProbabilities = new ArrayList<>();
-        getWordPropertyNative(mNativeDict, codePoints, outCodePoints, outFlags, outProbabilityInfo,
-                outBigramTargets, outBigramProbabilityInfo, outShortcutTargets,
-                outShortcutProbabilities);
+        getWordPropertyNative(mNativeDict, codePoints, isBeginningOfSentence, outCodePoints,
+                outFlags, outProbabilityInfo, outBigramTargets, outBigramProbabilityInfo,
+                outShortcutTargets, outShortcutProbabilities);
         return new WordProperty(codePoints,
                 outFlags[FORMAT_WORD_PROPERTY_IS_NOT_A_WORD_INDEX],
                 outFlags[FORMAT_WORD_PROPERTY_IS_BLACKLISTED_INDEX],
                 outFlags[FORMAT_WORD_PROPERTY_HAS_BIGRAMS_INDEX],
-                outFlags[FORMAT_WORD_PROPERTY_HAS_SHORTCUTS_INDEX], outProbabilityInfo,
+                outFlags[FORMAT_WORD_PROPERTY_HAS_SHORTCUTS_INDEX],
+                outFlags[FORMAT_WORD_PROPERTY_IS_BEGINNING_OF_SENTENCE_INDEX], outProbabilityInfo,
                 outBigramTargets, outBigramProbabilityInfo, outShortcutTargets,
                 outShortcutProbabilities);
     }
@@ -412,10 +402,13 @@
      * If token is 0, this method newly starts iterating the dictionary.
      */
     public GetNextWordPropertyResult getNextWordProperty(final int token) {
-        final int[] codePoints = new int[MAX_WORD_LENGTH];
-        final int nextToken = getNextWordNative(mNativeDict, token, codePoints);
+        final int[] codePoints = new int[Constants.DICTIONARY_MAX_WORD_LENGTH];
+        final boolean[] isBeginningOfSentence = new boolean[1];
+        final int nextToken = getNextWordNative(mNativeDict, token, codePoints,
+                isBeginningOfSentence);
         final String word = StringUtils.getStringFromNullTerminatedCodePointArray(codePoints);
-        return new GetNextWordPropertyResult(getWordProperty(word), nextToken);
+        return new GetNextWordPropertyResult(
+                getWordProperty(word, isBeginningOfSentence[0]), nextToken);
     }
 
     // Add a unigram entry to binary dictionary with unigram attributes in native code.
diff --git a/java/src/com/android/inputmethod/latin/DicTraverseSession.java b/java/src/com/android/inputmethod/latin/DicTraverseSession.java
index 8d295ad..8bbf426 100644
--- a/java/src/com/android/inputmethod/latin/DicTraverseSession.java
+++ b/java/src/com/android/inputmethod/latin/DicTraverseSession.java
@@ -16,6 +16,7 @@
 
 package com.android.inputmethod.latin;
 
+import com.android.inputmethod.latin.settings.NativeSuggestOptions;
 import com.android.inputmethod.latin.utils.JniUtils;
 
 import java.util.Locale;
@@ -24,6 +25,20 @@
     static {
         JniUtils.loadNativeLibrary();
     }
+    // Must be equal to MAX_RESULTS in native/jni/src/defines.h
+    private static final int MAX_RESULTS = 18;
+    public final int[] mInputCodePoints = new int[Constants.DICTIONARY_MAX_WORD_LENGTH];
+    public final int[] mOutputSuggestionCount = new int[1];
+    public final int[] mOutputCodePoints =
+            new int[Constants.DICTIONARY_MAX_WORD_LENGTH * MAX_RESULTS];
+    public final int[] mSpaceIndices = new int[MAX_RESULTS];
+    public final int[] mOutputScores = new int[MAX_RESULTS];
+    public final int[] mOutputTypes = new int[MAX_RESULTS];
+    // Only one result is ever used
+    public final int[] mOutputAutoCommitFirstWordConfidence = new int[1];
+    public final float[] mInputOutputLanguageWeight = new float[1];
+
+    public final NativeSuggestOptions mNativeSuggestOptions = new NativeSuggestOptions();
 
     private static native long setDicTraverseSessionNative(String locale, long dictSize);
     private static native void initDicTraverseSessionNative(long nativeDicTraverseSession,
diff --git a/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
index 4a28a24..304c450 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
@@ -468,20 +468,24 @@
                 isValid, timeStampInSeconds, mDistracterFilter);
     }
 
-    public void cancelAddingUserHistory(final PrevWordsInfo prevWordsInfo,
-            final String committedWord) {
-        final ExpandableBinaryDictionary userHistoryDictionary =
-                mDictionaries.getSubDict(Dictionary.TYPE_USER_HISTORY);
-        if (userHistoryDictionary != null) {
-            userHistoryDictionary.removeNgramDynamically(prevWordsInfo, committedWord);
+    private void removeWord(final String dictName, final String word) {
+        final ExpandableBinaryDictionary dictionary = mDictionaries.getSubDict(dictName);
+        if (dictionary != null) {
+            dictionary.removeUnigramEntryDynamically(word);
         }
     }
 
+    public void removeWordFromPersonalizedDicts(final String word) {
+        removeWord(Dictionary.TYPE_USER_HISTORY, word);
+        removeWord(Dictionary.TYPE_PERSONALIZATION, word);
+        removeWord(Dictionary.TYPE_CONTEXTUAL, word);
+    }
+
     // 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 ArrayList<SuggestedWordInfo> rawSuggestions) {
+            final int sessionId) {
         final Dictionaries dictionaries = mDictionaries;
         final SuggestionResults suggestionResults =
                 new SuggestionResults(dictionaries.mLocale, SuggestedWords.MAX_SUGGESTIONS);
@@ -495,21 +499,13 @@
                             languageWeight);
             if (null == dictionarySuggestions) continue;
             suggestionResults.addAll(dictionarySuggestions);
-            if (null != rawSuggestions) {
-                rawSuggestions.addAll(dictionarySuggestions);
+            if (null != suggestionResults.mRawSuggestions) {
+                suggestionResults.mRawSuggestions.addAll(dictionarySuggestions);
             }
         }
         return suggestionResults;
     }
 
-    public boolean isValidMainDictWord(final String word) {
-        final Dictionary mainDict = mDictionaries.getDict(Dictionary.TYPE_MAIN);
-        if (TextUtils.isEmpty(word) || mainDict == null) {
-            return false;
-        }
-        return mainDict.isValidWord(word);
-    }
-
     public boolean isValidWord(final String word, final boolean ignoreCase) {
         if (TextUtils.isEmpty(word)) {
             return false;
diff --git a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
index b1966bf..37879cf 100644
--- a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
@@ -122,12 +122,6 @@
         return mBinaryDictionary.isValidDictionary();
     }
 
-    // TODO: Remove and always enable beginning of sentence prediction. Currently, this is enabled
-    // only for ContextualDictionary.
-    protected boolean enableBeginningOfSentencePrediction() {
-        return false;
-    }
-
     /**
      * Creates a new expandable binary dictionary.
      *
@@ -311,6 +305,27 @@
     }
 
     /**
+     * Dynamically remove the unigram entry from the dictionary.
+     */
+    public void removeUnigramEntryDynamically(final String word) {
+        reloadDictionaryIfRequired();
+        asyncExecuteTaskWithWriteLock(new Runnable() {
+            @Override
+            public void run() {
+                if (mBinaryDictionary == null) {
+                    return;
+                }
+                runGCIfRequiredLocked(true /* mindsBlockByGC */);
+                if (!mBinaryDictionary.removeUnigramEntry(word)) {
+                    if (DEBUG) {
+                        Log.i(TAG, "Cannot remove unigram entry: " + word);
+                    }
+                }
+            }
+        });
+    }
+
+    /**
      * Adds n-gram information of a word to the dictionary. May overwrite an existing entry.
      */
     public void addNgramEntry(final PrevWordsInfo prevWordsInfo, final String word,
@@ -341,6 +356,7 @@
     /**
      * Dynamically remove the n-gram entry in the dictionary.
      */
+    @UsedForTesting
     public void removeNgramDynamically(final PrevWordsInfo prevWordsInfo, final String word) {
         reloadDictionaryIfRequired();
         asyncExecuteTaskWithWriteLock(new Runnable() {
@@ -404,10 +420,6 @@
                 if (mBinaryDictionary == null) {
                     return null;
                 }
-                if (composer.size() == 0 && prevWordsInfo.mIsBeginningOfSentence
-                        && !enableBeginningOfSentencePrediction()) {
-                    return null;
-                }
                 final ArrayList<SuggestedWordInfo> suggestions =
                         mBinaryDictionary.getSuggestions(composer, prevWordsInfo, proximityInfo,
                                 blockOffensiveWords, additionalFeaturesOptions, sessionId,
diff --git a/java/src/com/android/inputmethod/latin/InputAttributes.java b/java/src/com/android/inputmethod/latin/InputAttributes.java
index e1ae3df..ebe4361 100644
--- a/java/src/com/android/inputmethod/latin/InputAttributes.java
+++ b/java/src/com/android/inputmethod/latin/InputAttributes.java
@@ -41,6 +41,7 @@
     final public boolean mShouldShowSuggestions;
     final public boolean mApplicationSpecifiedCompletionOn;
     final public boolean mShouldInsertSpacesAutomatically;
+    final public boolean mShouldShowVoiceInputKey;
     final private int mInputType;
     final private EditorInfo mEditorInfo;
     final private String mPackageNameForPrivateImeOptions;
@@ -74,6 +75,7 @@
             mInputTypeNoAutoCorrect = false;
             mApplicationSpecifiedCompletionOn = false;
             mShouldInsertSpacesAutomatically = false;
+            mShouldShowVoiceInputKey = false;
             return;
         }
         // inputClass == InputType.TYPE_CLASS_TEXT
@@ -99,6 +101,12 @@
 
         mShouldInsertSpacesAutomatically = InputTypeUtils.isAutoSpaceFriendlyType(inputType);
 
+        final boolean noMicrophone = mIsPasswordField
+                || InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS == variation
+                || InputType.TYPE_TEXT_VARIATION_URI == variation
+                || hasNoMicrophoneKeyOption();
+        mShouldShowVoiceInputKey = !noMicrophone;
+
         // If it's a browser edit field and auto correct is not ON explicitly, then
         // disable auto correction, but keep suggestions on.
         // If NO_SUGGESTIONS is set, don't do prediction.
@@ -119,7 +127,7 @@
         return editorInfo.inputType == mInputType;
     }
 
-    public boolean hasNoMicrophoneKeyOption() {
+    private boolean hasNoMicrophoneKeyOption() {
         @SuppressWarnings("deprecation")
         final boolean deprecatedNoMicrophone = InputAttributes.inPrivateImeOptions(
                 null, NO_MICROPHONE_COMPAT, mEditorInfo);
diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index 670d856..9d03e8a 100644
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -100,30 +100,43 @@
                 ? typedWord.substring(0, typedWord.length() - trailingSingleQuotesCount)
                 : typedWord;
 
-        final ArrayList<SuggestedWordInfo> rawSuggestions;
-        if (ProductionFlag.INCLUDE_RAW_SUGGESTIONS) {
-            rawSuggestions = new ArrayList<>();
-        } else {
-            rawSuggestions = null;
-        }
         final SuggestionResults suggestionResults = mDictionaryFacilitator.getSuggestionResults(
                 wordComposer, prevWordsInfo, proximityInfo, blockOffensiveWords,
-                additionalFeaturesOptions, SESSION_TYPING, rawSuggestions);
+                additionalFeaturesOptions, SESSION_TYPING);
 
+        final boolean isPrediction = !wordComposer.isComposingWord();
+        final boolean shouldMakeSuggestionsAllUpperCase = wordComposer.isAllUpperCase()
+                && !wordComposer.isResumed();
         final boolean isOnlyFirstCharCapitalized =
                 wordComposer.isOrWillBeOnlyFirstCharCapitalized();
+
+        final ArrayList<SuggestedWordInfo> suggestionsContainer =
+                new ArrayList<>(suggestionResults);
+        final int suggestionsCount = suggestionsContainer.size();
+        if (isOnlyFirstCharCapitalized || shouldMakeSuggestionsAllUpperCase
+                || 0 != trailingSingleQuotesCount) {
+            for (int i = 0; i < suggestionsCount; ++i) {
+                final SuggestedWordInfo wordInfo = suggestionsContainer.get(i);
+                final SuggestedWordInfo transformedWordInfo = getTransformedSuggestedWordInfo(
+                        wordInfo, suggestionResults.mLocale, shouldMakeSuggestionsAllUpperCase,
+                        isOnlyFirstCharCapitalized, trailingSingleQuotesCount);
+                suggestionsContainer.set(i, transformedWordInfo);
+            }
+        }
+        SuggestedWordInfo.removeDups(typedWord, suggestionsContainer);
+
         // If resumed, then we don't want to upcase everything: resuming on a fully-capitalized
         // words is rarely done to switch to another fully-capitalized word, but usually to a
         // normal, non-capitalized suggestion.
-        final boolean isAllUpperCase = wordComposer.isAllUpperCase() && !wordComposer.isResumed();
         final String firstSuggestion;
         final String whitelistedWord;
         if (suggestionResults.isEmpty()) {
             whitelistedWord = firstSuggestion = null;
         } else {
             final SuggestedWordInfo firstSuggestedWordInfo = getTransformedSuggestedWordInfo(
-                    suggestionResults.first(), suggestionResults.mLocale, isAllUpperCase,
-                    isOnlyFirstCharCapitalized, trailingSingleQuotesCount);
+                    suggestionResults.first(), suggestionResults.mLocale,
+                    shouldMakeSuggestionsAllUpperCase, isOnlyFirstCharCapitalized,
+                    trailingSingleQuotesCount);
             firstSuggestion = firstSuggestedWordInfo.mWord;
             if (!firstSuggestedWordInfo.isKindOf(SuggestedWordInfo.KIND_WHITELIST)) {
                 whitelistedWord = null;
@@ -132,8 +145,6 @@
             }
         }
 
-        final boolean isPrediction = !wordComposer.isComposingWord();
-
         // We allow auto-correction if we have a whitelisted word, or if the word is not a valid
         // word of more than 1 char, except if the first suggestion is the same as the typed string
         // because in this case if it's strong enough to auto-correct that will mistakenly designate
@@ -171,19 +182,6 @@
                     suggestionResults.first(), consideredWord, mAutoCorrectionThreshold);
         }
 
-        final ArrayList<SuggestedWordInfo> suggestionsContainer =
-                new ArrayList<>(suggestionResults);
-        final int suggestionsCount = suggestionsContainer.size();
-        if (isOnlyFirstCharCapitalized || isAllUpperCase || 0 != trailingSingleQuotesCount) {
-            for (int i = 0; i < suggestionsCount; ++i) {
-                final SuggestedWordInfo wordInfo = suggestionsContainer.get(i);
-                final SuggestedWordInfo transformedWordInfo = getTransformedSuggestedWordInfo(
-                        wordInfo, suggestionResults.mLocale, isAllUpperCase,
-                        isOnlyFirstCharCapitalized, trailingSingleQuotesCount);
-                suggestionsContainer.set(i, transformedWordInfo);
-            }
-        }
-
         if (!TextUtils.isEmpty(typedWord)) {
             suggestionsContainer.add(0, new SuggestedWordInfo(typedWord,
                     SuggestedWordInfo.MAX_SCORE, SuggestedWordInfo.KIND_TYPED,
@@ -191,7 +189,6 @@
                     SuggestedWordInfo.NOT_AN_INDEX /* indexOfTouchPointOfSecondWord */,
                     SuggestedWordInfo.NOT_A_CONFIDENCE /* autoCommitFirstWordConfidence */));
         }
-        SuggestedWordInfo.removeDups(suggestionsContainer);
 
         final ArrayList<SuggestedWordInfo> suggestionsList;
         if (DBG && !suggestionsContainer.isEmpty()) {
@@ -200,12 +197,13 @@
             suggestionsList = suggestionsContainer;
         }
 
-        callback.onGetSuggestedWords(new SuggestedWords(suggestionsList, rawSuggestions,
+        callback.onGetSuggestedWords(new SuggestedWords(suggestionsList,
+                suggestionResults.mRawSuggestions,
                 // TODO: this first argument is lying. If this is a whitelisted word which is an
                 // actual word, it says typedWordValid = false, which looks wrong. We should either
                 // rename the attribute or change the value.
                 !isPrediction && !allowsToBeAutoCorrected /* typedWordValid */,
-                hasAutoCorrection, /* willAutoCorrect */
+                hasAutoCorrection /* willAutoCorrect */,
                 false /* isObsoleteSuggestions */, isPrediction, sequenceNumber));
     }
 
@@ -216,15 +214,9 @@
             final boolean blockOffensiveWords, final int[] additionalFeaturesOptions,
             final int sessionId, final int sequenceNumber,
             final OnGetSuggestedWordsCallback callback) {
-        final ArrayList<SuggestedWordInfo> rawSuggestions;
-        if (ProductionFlag.INCLUDE_RAW_SUGGESTIONS) {
-            rawSuggestions = new ArrayList<>();
-        } else {
-            rawSuggestions = null;
-        }
         final SuggestionResults suggestionResults = mDictionaryFacilitator.getSuggestionResults(
                 wordComposer, prevWordsInfo, proximityInfo, blockOffensiveWords,
-                additionalFeaturesOptions, sessionId, rawSuggestions);
+                additionalFeaturesOptions, sessionId);
         final ArrayList<SuggestedWordInfo> suggestionsContainer =
                 new ArrayList<>(suggestionResults);
         final int suggestionsCount = suggestionsContainer.size();
@@ -245,7 +237,7 @@
             final SuggestedWordInfo rejected = suggestionsContainer.remove(0);
             suggestionsContainer.add(1, rejected);
         }
-        SuggestedWordInfo.removeDups(suggestionsContainer);
+        SuggestedWordInfo.removeDups(null /* typedWord */, suggestionsContainer);
 
         // For some reason some suggestions with MIN_VALUE are making their way here.
         // TODO: Find a more robust way to detect distractors.
@@ -257,7 +249,8 @@
 
         // In the batch input mode, the most relevant suggested word should act as a "typed word"
         // (typedWordValid=true), not as an "auto correct word" (willAutoCorrect=false).
-        callback.onGetSuggestedWords(new SuggestedWords(suggestionsContainer, rawSuggestions,
+        callback.onGetSuggestedWords(new SuggestedWords(suggestionsContainer,
+                suggestionResults.mRawSuggestions,
                 true /* typedWordValid */,
                 false /* willAutoCorrect */,
                 false /* isObsoleteSuggestions */,
diff --git a/java/src/com/android/inputmethod/latin/SuggestedWords.java b/java/src/com/android/inputmethod/latin/SuggestedWords.java
index 72461e1..f22af79 100644
--- a/java/src/com/android/inputmethod/latin/SuggestedWords.java
+++ b/java/src/com/android/inputmethod/latin/SuggestedWords.java
@@ -316,10 +316,6 @@
             return mDebugString;
         }
 
-        public int codePointCount() {
-            return mCodePointCount;
-        }
-
         public int codePointAt(int i) {
             return mWord.codePointAt(i);
         }
@@ -333,23 +329,29 @@
             }
         }
 
-        // TODO: Consolidate this method and StringUtils.removeDupes() in the future.
-        public static void removeDups(ArrayList<SuggestedWordInfo> candidates) {
-            if (candidates.size() <= 1) {
+        // This will always remove the higher index if a duplicate is found.
+        public static void removeDups(final String typedWord,
+                ArrayList<SuggestedWordInfo> candidates) {
+            if (candidates.isEmpty()) {
                 return;
             }
-            int i = 1;
-            while (i < candidates.size()) {
-                final SuggestedWordInfo cur = candidates.get(i);
-                for (int j = 0; j < i; ++j) {
-                    final SuggestedWordInfo previous = candidates.get(j);
-                    if (cur.mWord.equals(previous.mWord)) {
-                        candidates.remove(cur.mScore < previous.mScore ? i : j);
-                        --i;
-                        break;
-                    }
+            if (!TextUtils.isEmpty(typedWord)) {
+                removeSuggestedWordInfoFrom(typedWord, candidates, -1 /* startIndexExclusive */);
+            }
+            for (int i = 0; i < candidates.size(); ++i) {
+                removeSuggestedWordInfoFrom(candidates.get(i).mWord, candidates,
+                        i /* startIndexExclusive */);
+            }
+        }
+
+        private static void removeSuggestedWordInfoFrom(final String word,
+                final ArrayList<SuggestedWordInfo> candidates, final int startIndexExclusive) {
+            for (int i = startIndexExclusive + 1; i < candidates.size(); ++i) {
+                final SuggestedWordInfo previous = candidates.get(i);
+                if (word.equals(previous.mWord)) {
+                    candidates.remove(i);
+                    --i;
                 }
-                ++i;
             }
         }
     }
diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
index de95b97..4d3f5b5 100644
--- a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
+++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
@@ -728,14 +728,13 @@
             mConnection.setComposingText(getTextWithUnderline(
                     mWordComposer.getTypedWord()), 1);
         } else {
-            final boolean swapWeakSpace = maybeStripSpace(inputTransaction,
-                    inputTransaction.mEvent.isSuggestionStripPress());
+            final boolean swapWeakSpace = tryStripSpaceAndReturnWhetherShouldSwapInstead(
+                    inputTransaction, inputTransaction.mEvent.isSuggestionStripPress());
 
-            sendKeyCodePoint(settingsValues, codePoint);
-
-            if (swapWeakSpace) {
-                swapSwapperAndSpace(inputTransaction);
+            if (swapWeakSpace && trySwapSwapperAndSpace(inputTransaction)) {
                 mSpaceState = SpaceState.WEAK;
+            } else {
+                sendKeyCodePoint(settingsValues, codePoint);
             }
             // In case the "add to dictionary" hint was still displayed.
             mSuggestionStripViewAccessor.dismissAddToDictionaryHint();
@@ -780,7 +779,8 @@
             }
         }
 
-        final boolean swapWeakSpace = maybeStripSpace(inputTransaction, isFromSuggestionStrip);
+        final boolean swapWeakSpace = tryStripSpaceAndReturnWhetherShouldSwapInstead(
+                inputTransaction, isFromSuggestionStrip);
 
         final boolean isInsideDoubleQuoteOrAfterDigit = Constants.CODE_DOUBLE_QUOTE == codePoint
                 && mConnection.isInsideDoubleQuoteOrAfterDigit();
@@ -804,16 +804,14 @@
             promotePhantomSpace(settingsValues);
         }
 
-        if (!shouldAvoidSendingCode) {
-            sendKeyCodePoint(settingsValues, codePoint);
-        }
-
-        if (Constants.CODE_SPACE == codePoint) {
-            if (maybeDoubleSpacePeriod(inputTransaction)) {
-                inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW);
-                inputTransaction.setRequiresUpdateSuggestions();
-                mSpaceState = SpaceState.DOUBLE;
-            } else if (!mSuggestedWords.isPunctuationSuggestions()) {
+        if (tryPerformDoubleSpacePeriod(inputTransaction)) {
+            mSpaceState = SpaceState.DOUBLE;
+            inputTransaction.setRequiresUpdateSuggestions();
+        } else if (swapWeakSpace && trySwapSwapperAndSpace(inputTransaction)) {
+            mSpaceState = SpaceState.SWAP_PUNCTUATION;
+            mSuggestionStripViewAccessor.setNeutralSuggestionStrip();
+        } else if (Constants.CODE_SPACE == codePoint) {
+            if (!mSuggestedWords.isPunctuationSuggestions()) {
                 mSpaceState = SpaceState.WEAK;
             }
 
@@ -821,11 +819,12 @@
             if (wasComposingWord || mSuggestedWords.isEmpty()) {
                 inputTransaction.setRequiresUpdateSuggestions();
             }
+
+            if (!shouldAvoidSendingCode) {
+                sendKeyCodePoint(settingsValues, codePoint);
+            }
         } else {
-            if (swapWeakSpace) {
-                swapSwapperAndSpace(inputTransaction);
-                mSpaceState = SpaceState.SWAP_PUNCTUATION;
-            } else if ((SpaceState.PHANTOM == inputTransaction.mSpaceState
+            if ((SpaceState.PHANTOM == inputTransaction.mSpaceState
                     && settingsValues.isUsuallyFollowedBySpace(codePoint))
                     || (Constants.CODE_DOUBLE_QUOTE == codePoint
                             && isInsideDoubleQuoteOrAfterDigit)) {
@@ -843,6 +842,8 @@
                 mSpaceState = SpaceState.PHANTOM;
             }
 
+            sendKeyCodePoint(settingsValues, codePoint);
+
             // Set punctuation right away. onUpdateSelection will fire but tests whether it is
             // already displayed or not, so it's okay.
             mSuggestionStripViewAccessor.setNeutralSuggestionStrip();
@@ -884,6 +885,9 @@
                 final String rejectedSuggestion = mWordComposer.getTypedWord();
                 mWordComposer.reset();
                 mWordComposer.setRejectedBatchModeSuggestion(rejectedSuggestion);
+                if (!TextUtils.isEmpty(rejectedSuggestion)) {
+                    mDictionaryFacilitator.removeWordFromPersonalizedDicts(rejectedSuggestion);
+                }
             } else {
                 mWordComposer.processEvent(inputTransaction.mEvent);
             }
@@ -1005,16 +1009,18 @@
      * This method will check that there are two characters before the cursor and that the first
      * one is a space before it does the actual swapping.
      * @param inputTransaction The transaction in progress.
+     * @return true if the swap has been performed, false if it was prevented by preliminary checks.
      */
-    private void swapSwapperAndSpace(final InputTransaction inputTransaction) {
-        final CharSequence lastTwo = mConnection.getTextBeforeCursor(2, 0);
-        // It is guaranteed lastTwo.charAt(1) is a swapper - else this method is not called.
-        if (lastTwo != null && lastTwo.length() == 2 && lastTwo.charAt(0) == Constants.CODE_SPACE) {
-            mConnection.deleteSurroundingText(2, 0);
-            final String text = lastTwo.charAt(1) + " ";
-            mConnection.commitText(text, 1);
-            inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW);
+    private boolean trySwapSwapperAndSpace(final InputTransaction inputTransaction) {
+        final int codePointBeforeCursor = mConnection.getCodePointBeforeCursor();
+        if (Constants.CODE_SPACE != codePointBeforeCursor) {
+            return false;
         }
+        mConnection.deleteSurroundingText(1, 0);
+        final String text = inputTransaction.mEvent.getTextToCommit() + " ";
+        mConnection.commitText(text, 1);
+        inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW);
+        return true;
     }
 
     /*
@@ -1023,8 +1029,8 @@
      * @param isFromSuggestionStrip Whether this code point is coming from the suggestion strip.
      * @return whether we should swap the space instead of removing it.
      */
-    private boolean maybeStripSpace(final InputTransaction inputTransaction,
-            final boolean isFromSuggestionStrip) {
+    private boolean tryStripSpaceAndReturnWhetherShouldSwapInstead(
+            final InputTransaction inputTransaction, final boolean isFromSuggestionStrip) {
         final int codePoint = inputTransaction.mEvent.mCodePoint;
         if (Constants.CODE_ENTER == codePoint &&
                 SpaceState.SWAP_PUNCTUATION == inputTransaction.mSpaceState) {
@@ -1065,37 +1071,42 @@
      * period-space sequence of characters. This typically happens when the user presses space
      * twice in a row quickly.
      * This method will check that the double-space-to-period is active in settings, that the
-     * two spaces have been input close enough together, and that the previous character allows
-     * for the transformation to take place. If all of these conditions are fulfilled, this
-     * method applies the transformation and returns true. Otherwise, it does nothing and
-     * returns false.
+     * two spaces have been input close enough together, that the typed character is a space
+     * and that the previous character allows for the transformation to take place. If all of
+     * these conditions are fulfilled, this method applies the transformation and returns true.
+     * Otherwise, it does nothing and returns false.
      *
      * @param inputTransaction The transaction in progress.
      * @return true if we applied the double-space-to-period transformation, false otherwise.
      */
-    private boolean maybeDoubleSpacePeriod(final InputTransaction inputTransaction) {
-        if (!inputTransaction.mSettingsValues.mUseDoubleSpacePeriod) return false;
-        if (!isDoubleSpacePeriodCountdownActive(inputTransaction)) return false;
-        // We only do this when we see two spaces and an accepted code point before the cursor.
-        // The code point may be a surrogate pair but the two spaces may not, so we need 4 chars.
-        final CharSequence lastThree = mConnection.getTextBeforeCursor(4, 0);
-        if (null == lastThree) return false;
-        final int length = lastThree.length();
-        if (length < 3) return false;
-        if (lastThree.charAt(length - 1) != Constants.CODE_SPACE) return false;
-        if (lastThree.charAt(length - 2) != Constants.CODE_SPACE) return false;
-        // We know there are spaces in pos -1 and -2, and we have at least three chars.
-        // If we have only three chars, isSurrogatePairs can't return true as charAt(1) is a space,
-        // so this is fine.
+    private boolean tryPerformDoubleSpacePeriod(final InputTransaction inputTransaction) {
+        // Check the setting, the typed character and the countdown. If any of the conditions is
+        // not fulfilled, return false.
+        if (!inputTransaction.mSettingsValues.mUseDoubleSpacePeriod
+                || Constants.CODE_SPACE != inputTransaction.mEvent.mCodePoint
+                || !isDoubleSpacePeriodCountdownActive(inputTransaction)) {
+            return false;
+        }
+        // We only do this when we see one space and an accepted code point before the cursor.
+        // The code point may be a surrogate pair but the space may not, so we need 3 chars.
+        final CharSequence lastTwo = mConnection.getTextBeforeCursor(3, 0);
+        if (null == lastTwo) return false;
+        final int length = lastTwo.length();
+        if (length < 2) return false;
+        if (lastTwo.charAt(length - 1) != Constants.CODE_SPACE) return false;
+        // We know there is a space in pos -1, and we have at least two chars. If we have only two
+        // chars, isSurrogatePairs can't return true as charAt(1) is a space, so this is fine.
         final int firstCodePoint =
-                Character.isSurrogatePair(lastThree.charAt(0), lastThree.charAt(1)) ?
-                        Character.codePointAt(lastThree, 0) : lastThree.charAt(length - 3);
+                Character.isSurrogatePair(lastTwo.charAt(0), lastTwo.charAt(1)) ?
+                        Character.codePointAt(lastTwo, length - 3) : lastTwo.charAt(length - 2);
         if (canBeFollowedByDoubleSpacePeriod(firstCodePoint)) {
             cancelDoubleSpacePeriodCountdown();
-            mConnection.deleteSurroundingText(2, 0);
+            mConnection.deleteSurroundingText(1, 0);
             final String textToInsert = inputTransaction.mSettingsValues.mSpacingAndPunctuations
                     .mSentenceSeparatorAndSpace;
             mConnection.commitText(textToInsert, 1);
+            inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW);
+            inputTransaction.setRequiresUpdateSuggestions();
             return true;
         }
         return false;
@@ -1187,6 +1198,8 @@
                 Log.w(TAG, "Called updateSuggestionsOrPredictions but suggestions were not "
                         + "requested!");
             }
+            // Clear the suggestions strip.
+            mSuggestionStripViewAccessor.showSuggestionStrip(SuggestedWords.EMPTY);
             return;
         }
 
@@ -1363,7 +1376,6 @@
      * @param inputTransaction The transaction in progress.
      */
     private void revertCommit(final InputTransaction inputTransaction) {
-        final PrevWordsInfo prevWordsInfo = mLastComposedWord.mPrevWordsInfo;
         final CharSequence originallyTypedWord = mLastComposedWord.mTypedWord;
         final CharSequence committedWord = mLastComposedWord.mCommittedWord;
         final String committedWordString = committedWord.toString();
@@ -1385,8 +1397,8 @@
             }
         }
         mConnection.deleteSurroundingText(deleteLength, 0);
-        if (!TextUtils.isEmpty(prevWordsInfo.mPrevWord) && !TextUtils.isEmpty(committedWord)) {
-            mDictionaryFacilitator.cancelAddingUserHistory(prevWordsInfo, committedWordString);
+        if (!TextUtils.isEmpty(committedWord)) {
+            mDictionaryFacilitator.removeWordFromPersonalizedDicts(committedWordString);
         }
         final String stringToCommit = originallyTypedWord + mLastComposedWord.mSeparatorString;
         final SpannableString textToCommit = new SpannableString(stringToCommit);
diff --git a/java/src/com/android/inputmethod/latin/makedict/WordProperty.java b/java/src/com/android/inputmethod/latin/makedict/WordProperty.java
index 31cb597..cd78e22 100644
--- a/java/src/com/android/inputmethod/latin/makedict/WordProperty.java
+++ b/java/src/com/android/inputmethod/latin/makedict/WordProperty.java
@@ -70,8 +70,8 @@
     // Construct word property using information from native code.
     // This represents invalid word when the probability is BinaryDictionary.NOT_A_PROBABILITY.
     public WordProperty(final int[] codePoints, final boolean isNotAWord,
-            final boolean isBlacklisted, final boolean hasBigram,
-            final boolean hasShortcuts, final int[] probabilityInfo,
+            final boolean isBlacklisted, final boolean hasBigram, final boolean hasShortcuts,
+            final boolean isBeginningOfSentence, final int[] probabilityInfo,
             final ArrayList<int[]> bigramTargets, final ArrayList<int[]> bigramProbabilityInfo,
             final ArrayList<int[]> shortcutTargets,
             final ArrayList<Integer> shortcutProbabilities) {
@@ -79,7 +79,7 @@
         mProbabilityInfo = createProbabilityInfoFromArray(probabilityInfo);
         mShortcutTargets = new ArrayList<>();
         mBigrams = new ArrayList<>();
-        mIsBeginningOfSentence = false;
+        mIsBeginningOfSentence = isBeginningOfSentence;
         mIsNotAWord = isNotAWord;
         mIsBlacklistEntry = isBlacklisted;
         mHasShortcuts = hasShortcuts;
diff --git a/java/src/com/android/inputmethod/latin/personalization/ContextualDictionary.java b/java/src/com/android/inputmethod/latin/personalization/ContextualDictionary.java
index a96018f..ac55b93 100644
--- a/java/src/com/android/inputmethod/latin/personalization/ContextualDictionary.java
+++ b/java/src/com/android/inputmethod/latin/personalization/ContextualDictionary.java
@@ -43,11 +43,6 @@
     }
 
     @Override
-    protected boolean enableBeginningOfSentencePrediction() {
-        return true;
-    }
-
-    @Override
     public boolean isValidWord(final String word) {
         // Strings out of this dictionary should not be considered existing words.
         return false;
diff --git a/java/src/com/android/inputmethod/latin/settings/DebugSettings.java b/java/src/com/android/inputmethod/latin/settings/DebugSettings.java
index 845ddb3..c17e868 100644
--- a/java/src/com/android/inputmethod/latin/settings/DebugSettings.java
+++ b/java/src/com/android/inputmethod/latin/settings/DebugSettings.java
@@ -21,14 +21,13 @@
 import android.content.res.Resources;
 import android.os.Bundle;
 import android.os.Process;
-import android.preference.CheckBoxPreference;
 import android.preference.Preference;
 import android.preference.Preference.OnPreferenceClickListener;
 import android.preference.PreferenceFragment;
 import android.preference.PreferenceGroup;
 import android.preference.PreferenceScreen;
+import android.preference.TwoStatePreference;
 
-import com.android.inputmethod.latin.Dictionary;
 import com.android.inputmethod.latin.DictionaryDumpBroadcastReceiver;
 import com.android.inputmethod.latin.DictionaryFacilitator;
 import com.android.inputmethod.latin.R;
@@ -57,7 +56,7 @@
     public static final String PREF_KEY_LONGPRESS_TIMEOUT = "pref_key_longpress_timeout";
 
     private boolean mServiceNeedsRestart = false;
-    private CheckBoxPreference mDebugMode;
+    private TwoStatePreference mDebugMode;
 
     @Override
     public void onCreate(Bundle icicle) {
@@ -107,7 +106,7 @@
                         res, R.fraction.config_key_preview_dismiss_end_scale));
 
         mServiceNeedsRestart = false;
-        mDebugMode = (CheckBoxPreference) findPreference(PREF_DEBUG_MODE);
+        mDebugMode = (TwoStatePreference) findPreference(PREF_DEBUG_MODE);
         updateDebugMode();
     }
 
diff --git a/java/src/com/android/inputmethod/latin/settings/Settings.java b/java/src/com/android/inputmethod/latin/settings/Settings.java
index 2358477..fb1a210 100644
--- a/java/src/com/android/inputmethod/latin/settings/Settings.java
+++ b/java/src/com/android/inputmethod/latin/settings/Settings.java
@@ -39,8 +39,14 @@
 
 public final class Settings implements SharedPreferences.OnSharedPreferenceChangeListener {
     private static final String TAG = Settings.class.getSimpleName();
+    // Settings screens
+    public static final String SCREEN_INPUT = "screen_input";
+    public static final String SCREEN_MULTI_LINGUAL = "screen_multi_lingual";
+    public static final String SCREEN_GESTURE = "screen_gesture";
+    public static final String SCREEN_CORRECTION = "screen_correction";
+    public static final String SCREEN_ADVANCED = "screen_advanced";
+    public static final String SCREEN_DEBUG = "screen_debug";
     // In the same order as xml/prefs.xml
-    public static final String PREF_GENERAL_SETTINGS = "general_settings";
     public static final String PREF_AUTO_CAP = "auto_cap";
     public static final String PREF_VIBRATE_ON = "vibrate_on";
     public static final String PREF_SOUND_ON = "sound_on";
@@ -48,13 +54,10 @@
     // PREF_VOICE_MODE_OBSOLETE is obsolete. Use PREF_VOICE_INPUT_KEY instead.
     public static final String PREF_VOICE_MODE_OBSOLETE = "voice_mode";
     public static final String PREF_VOICE_INPUT_KEY = "pref_voice_input_key";
-    public static final String PREF_CORRECTION_SETTINGS = "correction_settings";
     public static final String PREF_EDIT_PERSONAL_DICTIONARY = "edit_personal_dictionary";
     public static final String PREF_CONFIGURE_DICTIONARIES_KEY = "configure_dictionaries_key";
     public static final String PREF_AUTO_CORRECTION_THRESHOLD = "auto_correction_threshold";
     public static final String PREF_SHOW_SUGGESTIONS_SETTING = "show_suggestions_setting";
-    public static final String PREF_MISC_SETTINGS = "misc_settings";
-    public static final String PREF_ADVANCED_SETTINGS = "pref_advanced_settings";
     public static final String PREF_KEY_USE_CONTACTS_DICT = "pref_key_use_contacts_dict";
     public static final String PREF_KEY_USE_PERSONALIZED_DICTS = "pref_key_use_personalized_dicts";
     public static final String PREF_KEY_USE_DOUBLE_SPACE_PERIOD =
@@ -75,7 +78,6 @@
     public static final String PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY =
             "pref_key_preview_popup_dismiss_delay";
     public static final String PREF_BIGRAM_PREDICTIONS = "next_word_prediction";
-    public static final String PREF_GESTURE_SETTINGS = "gesture_typing_settings";
     public static final String PREF_GESTURE_INPUT = "gesture_input";
     public static final String PREF_VIBRATION_DURATION_SETTINGS =
             "pref_vibration_duration_settings";
@@ -89,7 +91,6 @@
 
     public static final String PREF_INPUT_LANGUAGE = "input_language";
     public static final String PREF_SELECTED_LANGUAGES = "selected_languages";
-    public static final String PREF_DEBUG_SETTINGS = "debug_settings";
     public static final String PREF_KEY_IS_INTERNAL = "pref_key_is_internal";
 
     public static final String PREF_ENABLE_METRICS_LOGGING = "pref_enable_metrics_logging";
@@ -105,8 +106,6 @@
             "pref_last_used_personalization_dict_wiped_time";
     private static final String PREF_CORPUS_HANDLES_FOR_PERSONALIZATION =
             "pref_corpus_handles_for_personalization";
-    public static final String PREF_SEND_FEEDBACK = "send_feedback";
-    public static final String PREF_ABOUT_KEYBOARD = "about_keyboard";
 
     // Emoji
     public static final String PREF_EMOJI_RECENT_KEYS = "emoji_recent_keys";
diff --git a/java/src/com/android/inputmethod/latin/settings/SettingsFragment.java b/java/src/com/android/inputmethod/latin/settings/SettingsFragment.java
index 5eb0377..689f878 100644
--- a/java/src/com/android/inputmethod/latin/settings/SettingsFragment.java
+++ b/java/src/com/android/inputmethod/latin/settings/SettingsFragment.java
@@ -27,13 +27,15 @@
 import android.media.AudioManager;
 import android.os.Build;
 import android.os.Bundle;
-import android.preference.CheckBoxPreference;
 import android.preference.ListPreference;
 import android.preference.Preference;
-import android.preference.Preference.OnPreferenceClickListener;
 import android.preference.PreferenceGroup;
 import android.preference.PreferenceScreen;
+import android.preference.TwoStatePreference;
 import android.util.Log;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
 import android.view.inputmethod.InputMethodSubtype;
 
 import com.android.inputmethod.dictionarypack.DictionarySettingsActivity;
@@ -61,6 +63,10 @@
             DBG_USE_INTERNAL_PERSONAL_DICTIONARY_SETTINGS
             || Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN_MR2;
 
+    private static final int NO_MENU_GROUP = Menu.NONE; // We don't care about menu grouping.
+    private static final int MENU_FEEDBACK = Menu.FIRST; // The first menu item id and order.
+    private static final int MENU_ABOUT = Menu.FIRST + 1; // The second menu item id and order.
+
     private void setPreferenceEnabled(final String preferenceKey, final boolean enabled) {
         final Preference preference = findPreference(preferenceKey);
         if (preference != null) {
@@ -93,6 +99,7 @@
     @Override
     public void onCreate(final Bundle icicle) {
         super.onCreate(icicle);
+        setHasOptionsMenu(true);
         setInputMethodSettingsCategoryTitle(R.string.language_selection_title);
         setSubtypeEnablerTitle(R.string.select_language);
         addPreferencesFromResource(R.xml.prefs);
@@ -117,66 +124,48 @@
 
         ensureConsistencyOfAutoCorrectionSettings();
 
-        final PreferenceGroup generalSettings =
-                (PreferenceGroup) findPreference(Settings.PREF_GENERAL_SETTINGS);
-        final PreferenceGroup miscSettings =
-                (PreferenceGroup) findPreference(Settings.PREF_MISC_SETTINGS);
+        final PreferenceScreen inputScreen =
+                (PreferenceScreen) findPreference(Settings.SCREEN_INPUT);
+        final PreferenceScreen multiLingualScreen =
+                (PreferenceScreen) findPreference(Settings.SCREEN_MULTI_LINGUAL);
+        final PreferenceScreen gestureScreen =
+                (PreferenceScreen) findPreference(Settings.SCREEN_GESTURE);
+        final PreferenceScreen correctionScreen =
+                (PreferenceScreen) findPreference(Settings.SCREEN_CORRECTION);
+        final PreferenceScreen advancedScreen =
+                (PreferenceScreen) findPreference(Settings.SCREEN_ADVANCED);
+        final PreferenceScreen debugScreen =
+                (PreferenceScreen) findPreference(Settings.SCREEN_DEBUG);
 
-        final Preference debugSettings = findPreference(Settings.PREF_DEBUG_SETTINGS);
-        if (debugSettings != null) {
-            if (Settings.isInternal(prefs)) {
-                final Intent debugSettingsIntent = new Intent(Intent.ACTION_MAIN);
-                debugSettingsIntent.setClassName(
-                        context.getPackageName(), DebugSettingsActivity.class.getName());
-                debugSettings.setIntent(debugSettingsIntent);
-            } else {
-                miscSettings.removePreference(debugSettings);
-            }
-        }
-
-        final Preference feedbackSettings = findPreference(Settings.PREF_SEND_FEEDBACK);
-        final Preference aboutSettings = findPreference(Settings.PREF_ABOUT_KEYBOARD);
-        if (feedbackSettings != null) {
-            if (FeedbackUtils.isFeedbackFormSupported()) {
-                feedbackSettings.setOnPreferenceClickListener(new OnPreferenceClickListener() {
-                    @Override
-                    public boolean onPreferenceClick(final Preference pref) {
-                        FeedbackUtils.showFeedbackForm(getActivity());
-                        return true;
-                    }
-                });
-                aboutSettings.setTitle(FeedbackUtils.getAboutKeyboardTitleResId());
-                aboutSettings.setIntent(FeedbackUtils.getAboutKeyboardIntent(getActivity()));
-            } else {
-                miscSettings.removePreference(feedbackSettings);
-                miscSettings.removePreference(aboutSettings);
-            }
+        if (Settings.isInternal(prefs)) {
+            final Intent debugSettingsIntent = new Intent(Intent.ACTION_MAIN);
+            debugSettingsIntent.setClassName(
+                    context.getPackageName(), DebugSettingsActivity.class.getName());
+            debugScreen.setIntent(debugSettingsIntent);
+        } else {
+            advancedScreen.removePreference(debugScreen);
         }
 
         final boolean showVoiceKeyOption = res.getBoolean(
                 R.bool.config_enable_show_voice_key_option);
         if (!showVoiceKeyOption) {
-            removePreference(Settings.PREF_VOICE_INPUT_KEY, generalSettings);
+            removePreference(Settings.PREF_VOICE_INPUT_KEY, inputScreen);
         }
 
-        final PreferenceGroup advancedSettings =
-                (PreferenceGroup) findPreference(Settings.PREF_ADVANCED_SETTINGS);
         if (!AudioAndHapticFeedbackManager.getInstance().hasVibrator()) {
-            removePreference(Settings.PREF_VIBRATE_ON, generalSettings);
-            removePreference(Settings.PREF_VIBRATION_DURATION_SETTINGS, advancedSettings);
+            removePreference(Settings.PREF_VIBRATE_ON, inputScreen);
+            removePreference(Settings.PREF_VIBRATION_DURATION_SETTINGS, advancedScreen);
         }
         if (!Settings.ENABLE_SHOW_LANGUAGE_SWITCH_KEY_SETTINGS) {
+            removePreference(Settings.PREF_SHOW_LANGUAGE_SWITCH_KEY, multiLingualScreen);
             removePreference(
-                    Settings.PREF_SHOW_LANGUAGE_SWITCH_KEY, advancedSettings);
-            removePreference(
-                    Settings.PREF_INCLUDE_OTHER_IMES_IN_LANGUAGE_SWITCH_LIST, advancedSettings);
+                    Settings.PREF_INCLUDE_OTHER_IMES_IN_LANGUAGE_SWITCH_LIST, multiLingualScreen);
         }
 
-
         // TODO: consolidate key preview dismiss delay with the key preview animation parameters.
         if (!Settings.readFromBuildConfigIfToShowKeyPreviewPopupOption(res)) {
-            removePreference(Settings.PREF_POPUP_ON, generalSettings);
-            removePreference(Settings.PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY, advancedSettings);
+            removePreference(Settings.PREF_POPUP_ON, inputScreen);
+            removePreference(Settings.PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY, advancedScreen);
         } else {
             // TODO: Cleanup this setup.
             final ListPreference keyPreviewPopupDismissDelay =
@@ -199,18 +188,16 @@
         }
 
         if (!res.getBoolean(R.bool.config_setup_wizard_available)) {
-            removePreference(Settings.PREF_SHOW_SETUP_WIZARD_ICON, advancedSettings);
+            removePreference(Settings.PREF_SHOW_SETUP_WIZARD_ICON, advancedScreen);
         }
 
-        final PreferenceGroup textCorrectionGroup =
-                (PreferenceGroup) findPreference(Settings.PREF_CORRECTION_SETTINGS);
         final PreferenceScreen dictionaryLink =
                 (PreferenceScreen) findPreference(Settings.PREF_CONFIGURE_DICTIONARIES_KEY);
         final Intent intent = dictionaryLink.getIntent();
         intent.setClassName(context.getPackageName(), DictionarySettingsActivity.class.getName());
         final int number = context.getPackageManager().queryIntentActivities(intent, 0).size();
         if (0 >= number) {
-            textCorrectionGroup.removePreference(dictionaryLink);
+            correctionScreen.removePreference(dictionaryLink);
         }
 
         if (ProductionFlag.IS_METRICS_LOGGING_SUPPORTED) {
@@ -224,7 +211,7 @@
                 enableMetricsLogging.setTitle(enableMetricsLoggingTitle);
             }
         } else {
-            removePreference(Settings.PREF_ENABLE_METRICS_LOGGING, textCorrectionGroup);
+            removePreference(Settings.PREF_ENABLE_METRICS_LOGGING, advancedScreen);
         }
 
         final Preference editPersonalDictionary =
@@ -238,7 +225,7 @@
         }
 
         if (!Settings.readFromBuildConfigIfGestureInputEnabled(res)) {
-            removePreference(Settings.PREF_GESTURE_SETTINGS, getPreferenceScreen());
+            getPreferenceScreen().removePreference(gestureScreen);
         }
 
         AdditionalFeaturesSettingUtils.addAdditionalFeaturesPreferences(context, this);
@@ -261,8 +248,8 @@
             voiceInputKeyOption.setSummary(isShortcutImeEnabled ? null
                     : res.getText(R.string.voice_input_disabled_summary));
         }
-        final CheckBoxPreference showSetupWizardIcon =
-                (CheckBoxPreference)findPreference(Settings.PREF_SHOW_SETUP_WIZARD_ICON);
+        final TwoStatePreference showSetupWizardIcon =
+                (TwoStatePreference)findPreference(Settings.PREF_SHOW_SETUP_WIZARD_ICON);
         if (showSetupWizardIcon != null) {
             showSetupWizardIcon.setChecked(Settings.readShowSetupWizardIcon(prefs, getActivity()));
         }
@@ -476,4 +463,33 @@
             userDictionaryPreference.setFragment(UserDictionaryList.class.getName());
         }
     }
+
+    @Override
+    public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
+        if (FeedbackUtils.isFeedbackFormSupported()) {
+            menu.add(NO_MENU_GROUP, MENU_FEEDBACK /* itemId */, MENU_FEEDBACK /* order */,
+                    R.string.send_feedback);
+        }
+        final int aboutResId = FeedbackUtils.getAboutKeyboardTitleResId();
+        if (aboutResId != 0) {
+            menu.add(NO_MENU_GROUP, MENU_ABOUT /* itemId */, MENU_ABOUT /* order */, aboutResId);
+        }
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(final MenuItem item) {
+        final int itemId = item.getItemId();
+        if (itemId == MENU_FEEDBACK) {
+            FeedbackUtils.showFeedbackForm(getActivity());
+            return true;
+        }
+        if (itemId == MENU_ABOUT) {
+            final Intent aboutIntent = FeedbackUtils.getAboutKeyboardIntent(getActivity());
+            if (aboutIntent != null) {
+                startActivity(aboutIntent);
+                return true;
+            }
+        }
+        return super.onOptionsItemSelected(item);
+    }
 }
diff --git a/java/src/com/android/inputmethod/latin/settings/SettingsValues.java b/java/src/com/android/inputmethod/latin/settings/SettingsValues.java
index 4410401..8de5fed 100644
--- a/java/src/com/android/inputmethod/latin/settings/SettingsValues.java
+++ b/java/src/com/android/inputmethod/latin/settings/SettingsValues.java
@@ -125,8 +125,7 @@
         mSlidingKeyInputPreviewEnabled = prefs.getBoolean(
                 DebugSettings.PREF_SLIDING_KEY_INPUT_PREVIEW, true);
         mShowsVoiceInputKey = needsToShowVoiceInputKey(prefs, res)
-                && !mInputAttributes.mIsPasswordField
-                && !mInputAttributes.hasNoMicrophoneKeyOption()
+                && mInputAttributes.mShouldShowVoiceInputKey
                 && SubtypeSwitcher.getInstance().isShortcutImeEnabled();
         final String autoCorrectionThresholdRawValue = prefs.getString(
                 Settings.PREF_AUTO_CORRECTION_THRESHOLD,
diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
index 19b48f0..ad5aad7 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
@@ -44,10 +44,12 @@
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
+import com.android.inputmethod.accessibility.AccessibilityUtils;
 import com.android.inputmethod.latin.LatinImeLogger;
 import com.android.inputmethod.latin.PunctuationSuggestions;
 import com.android.inputmethod.latin.R;
 import com.android.inputmethod.latin.SuggestedWords;
+import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
 import com.android.inputmethod.latin.utils.AutoCorrectionUtils;
 import com.android.inputmethod.latin.utils.ResourceUtils;
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
@@ -249,8 +251,8 @@
         final int positionInStrip =
                 getPositionInSuggestionStrip(indexInSuggestedWords, suggestedWords);
         // Use identity for strings, not #equals : it's the typed word if it's the same object
-        final boolean isTypedWord =
-                suggestedWords.getWord(indexInSuggestedWords) == suggestedWords.mTypedWord;
+        final boolean isTypedWord = suggestedWords.getInfo(indexInSuggestedWords).isKindOf(
+                SuggestedWordInfo.KIND_TYPED);
 
         final int color;
         if (positionInStrip == mCenterPositionInStrip && suggestedWords.mWillAutoCorrect) {
@@ -386,6 +388,12 @@
         final float scaleX = getTextScaleX(word, width, wordView.getPaint());
         wordView.setText(text); // TextView.setText() resets text scale x to 1.0.
         wordView.setTextScaleX(Math.max(scaleX, MIN_TEXT_XSCALE));
+        // A <code>wordView</code> should be disabled when <code>word</code> is empty in order to
+        // make it unclickable.
+        // With accessibility touch exploration on, <code>wordView</code> should be enabled even
+        // when it is empty to avoid announcing as "disabled".
+        wordView.setEnabled(!TextUtils.isEmpty(word)
+                || AccessibilityUtils.getInstance().isTouchExplorationEnabled());
         return wordView;
     }
 
diff --git a/java/src/com/android/inputmethod/latin/utils/CombinedFormatUtils.java b/java/src/com/android/inputmethod/latin/utils/CombinedFormatUtils.java
index c660075..34f59e8 100644
--- a/java/src/com/android/inputmethod/latin/utils/CombinedFormatUtils.java
+++ b/java/src/com/android/inputmethod/latin/utils/CombinedFormatUtils.java
@@ -31,6 +31,7 @@
     public static final String HISTORICAL_INFO_TAG = "historicalInfo";
     public static final String HISTORICAL_INFO_SEPARATOR = ":";
     public static final String WORD_TAG = "word";
+    public static final String BEGINNING_OF_SENTENCE_TAG = "beginning_of_sentence";
     public static final String NOT_A_WORD_TAG = "not_a_word";
     public static final String BLACKLISTED_TAG = "blacklisted";
 
@@ -56,6 +57,9 @@
         builder.append(" " + WORD_TAG + "=" + wordProperty.mWord);
         builder.append(",");
         builder.append(formatProbabilityInfo(wordProperty.mProbabilityInfo));
+        if (wordProperty.mIsBeginningOfSentence) {
+            builder.append("," + BEGINNING_OF_SENTENCE_TAG + "=true");
+        }
         if (wordProperty.mIsNotAWord) {
             builder.append("," + NOT_A_WORD_TAG + "=true");
         }
diff --git a/java/src/com/android/inputmethod/latin/utils/SuggestionResults.java b/java/src/com/android/inputmethod/latin/utils/SuggestionResults.java
index 0b362c4..5c109a6 100644
--- a/java/src/com/android/inputmethod/latin/utils/SuggestionResults.java
+++ b/java/src/com/android/inputmethod/latin/utils/SuggestionResults.java
@@ -17,7 +17,9 @@
 package com.android.inputmethod.latin.utils;
 
 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
+import com.android.inputmethod.latin.define.ProductionFlag;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Comparator;
 import java.util.Locale;
@@ -29,6 +31,7 @@
  */
 public final class SuggestionResults extends TreeSet<SuggestedWordInfo> {
     public final Locale mLocale;
+    public final ArrayList<SuggestedWordInfo> mRawSuggestions;
     private final int mCapacity;
 
     public SuggestionResults(final Locale locale, final int capacity) {
@@ -40,6 +43,11 @@
         super(comparator);
         mLocale = locale;
         mCapacity = capacity;
+        if (ProductionFlag.INCLUDE_RAW_SUGGESTIONS) {
+            mRawSuggestions = new ArrayList<>();
+        } else {
+            mRawSuggestions = null;
+        }
     }
 
     @Override
diff --git a/native/jni/Android.mk b/native/jni/Android.mk
index 47b5c33..72f8f87 100644
--- a/native/jni/Android.mk
+++ b/native/jni/Android.mk
@@ -92,3 +92,6 @@
 
 #################### Unit test on host environment
 include $(LOCAL_PATH)/HostUnitTests.mk
+
+#################### Unit test on target environment
+include $(LOCAL_PATH)/TargetUnitTests.mk
diff --git a/native/jni/TargetUnitTests.mk b/native/jni/TargetUnitTests.mk
new file mode 100644
index 0000000..12aae44
--- /dev/null
+++ b/native/jni/TargetUnitTests.mk
@@ -0,0 +1,55 @@
+# 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.
+
+LOCAL_PATH := $(call my-dir)
+
+######################################
+include $(CLEAR_VARS)
+
+include $(LOCAL_PATH)/NativeFileList.mk
+
+#################### Target library for unit test
+LATIN_IME_SRC_DIR := src
+LOCAL_CFLAGS += -std=c++11 -Wno-unused-parameter -Wno-unused-function
+LOCAL_CLANG := true
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/$(LATIN_IME_SRC_DIR)
+LOCAL_MODULE := liblatinime_target_static_for_unittests
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(addprefix $(LATIN_IME_SRC_DIR)/, $(LATIN_IME_CORE_SRC_FILES))
+# Here intentionally use libc++_shared rather than libc++_static because
+# $(BUILD_NATIVE_TEST) has not yet supported libc++_static.
+LOCAL_SDK_VERSION := 14
+LOCAL_NDK_STL_VARIANT := c++_shared
+include $(BUILD_STATIC_LIBRARY)
+
+#################### Target native tests
+include $(CLEAR_VARS)
+LATIN_IME_TEST_SRC_DIR := tests
+LOCAL_CFLAGS += -std=c++11 -Wno-unused-parameter -Wno-unused-function
+LOCAL_CLANG := true
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/$(LATIN_IME_SRC_DIR)
+LOCAL_MODULE := liblatinime_target_unittests
+LOCAL_MODULE_TAGS := tests
+LOCAL_SRC_FILES :=  \
+    $(addprefix $(LATIN_IME_TEST_SRC_DIR)/, $(LATIN_IME_CORE_TEST_FILES))
+LOCAL_STATIC_LIBRARIES += liblatinime_target_static_for_unittests
+# Here intentionally include external/libcxx/libcxx.mk rather because
+# $(BUILD_NATIVE_TEST) fails when LOCAL_NDK_STL_VARIANT is specified.
+include external/libcxx/libcxx.mk
+include $(BUILD_NATIVE_TEST)
+
+#################### Clean up the tmp vars
+LATIN_IME_SRC_DIR :=
+LATIN_IME_TEST_SRC_DIR :=
+include $(LOCAL_PATH)/CleanupNativeFileList.mk
diff --git a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
index 6e2219d..2654a4a 100644
--- a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
+++ b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
@@ -301,34 +301,55 @@
 // If token is 0, this method newly starts iterating the dictionary. This method returns 0 when
 // the dictionary does not have a next word.
 static jint latinime_BinaryDictionary_getNextWord(JNIEnv *env, jclass clazz,
-        jlong dict, jint token, jintArray outCodePoints) {
+        jlong dict, jint token, jintArray outCodePoints, jbooleanArray outIsBeginningOfSentence) {
     Dictionary *dictionary = reinterpret_cast<Dictionary *>(dict);
     if (!dictionary) return 0;
-    const jsize outCodePointsLength = env->GetArrayLength(outCodePoints);
-    if (outCodePointsLength != MAX_WORD_LENGTH) {
-        AKLOGE("Invalid outCodePointsLength: %d", outCodePointsLength);
+    const jsize codePointBufSize = env->GetArrayLength(outCodePoints);
+    if (codePointBufSize != MAX_WORD_LENGTH) {
+        AKLOGE("Invalid outCodePointsLength: %d", codePointBufSize);
         ASSERT(false);
         return 0;
     }
-    int wordCodePoints[outCodePointsLength];
-    memset(wordCodePoints, 0, sizeof(wordCodePoints));
-    const int nextToken = dictionary->getNextWordAndNextToken(token, wordCodePoints);
+    int wordCodePoints[codePointBufSize];
+    int wordCodePointCount = 0;
+    const int nextToken = dictionary->getNextWordAndNextToken(token, wordCodePoints,
+            &wordCodePointCount);
     JniDataUtils::outputCodePoints(env, outCodePoints, 0 /* start */,
-            MAX_WORD_LENGTH /* maxLength */, wordCodePoints, outCodePointsLength,
+            MAX_WORD_LENGTH /* maxLength */, wordCodePoints, wordCodePointCount,
             false /* needsNullTermination */);
+    bool isBeginningOfSentence = false;
+    if (wordCodePointCount > 0 && wordCodePoints[0] == CODE_POINT_BEGINNING_OF_SENTENCE) {
+        isBeginningOfSentence = true;
+    }
+    JniDataUtils::putBooleanToArray(env, outIsBeginningOfSentence, 0 /* index */,
+            isBeginningOfSentence);
     return nextToken;
 }
 
 static void latinime_BinaryDictionary_getWordProperty(JNIEnv *env, jclass clazz,
-        jlong dict, jintArray word, jintArray outCodePoints, jbooleanArray outFlags,
-        jintArray outProbabilityInfo, jobject outBigramTargets, jobject outBigramProbabilityInfo,
-        jobject outShortcutTargets, jobject outShortcutProbabilities) {
+        jlong dict, jintArray word, jboolean isBeginningOfSentence, jintArray outCodePoints,
+        jbooleanArray outFlags, jintArray outProbabilityInfo, jobject outBigramTargets,
+        jobject outBigramProbabilityInfo, jobject outShortcutTargets,
+        jobject outShortcutProbabilities) {
     Dictionary *dictionary = reinterpret_cast<Dictionary *>(dict);
     if (!dictionary) return;
     const jsize wordLength = env->GetArrayLength(word);
-    int wordCodePoints[wordLength];
+    if (wordLength > MAX_WORD_LENGTH) {
+        AKLOGE("Invalid wordLength: %d", wordLength);
+        return;
+    }
+    int wordCodePoints[MAX_WORD_LENGTH];
     env->GetIntArrayRegion(word, 0, wordLength, wordCodePoints);
-    const WordProperty wordProperty = dictionary->getWordProperty(wordCodePoints, wordLength);
+    int codePointCount = wordLength;
+    if (isBeginningOfSentence) {
+        codePointCount = CharUtils::attachBeginningOfSentenceMarker(
+                wordCodePoints, wordLength, MAX_WORD_LENGTH);
+        if (codePointCount < 0) {
+            AKLOGE("Cannot attach Beginning-of-Sentence marker.");
+            return;
+        }
+    }
+    const WordProperty wordProperty = dictionary->getWordProperty(wordCodePoints, codePointCount);
     wordProperty.outputProperties(env, outCodePoints, outFlags, outProbabilityInfo,
             outBigramTargets, outBigramProbabilityInfo, outShortcutTargets,
             outShortcutProbabilities);
@@ -553,14 +574,18 @@
         return false;
     }
 
-    // TODO: Migrate historical information.
     int wordCodePoints[MAX_WORD_LENGTH];
+    int wordCodePointCount = 0;
     int token = 0;
     // Add unigrams.
     do {
-        token = dictionary->getNextWordAndNextToken(token, wordCodePoints);
-        const int wordLength = CharUtils::getCodePointCount(MAX_WORD_LENGTH, wordCodePoints);
-        const WordProperty wordProperty = dictionary->getWordProperty(wordCodePoints, wordLength);
+        token = dictionary->getNextWordAndNextToken(token, wordCodePoints, &wordCodePointCount);
+        const WordProperty wordProperty = dictionary->getWordProperty(wordCodePoints,
+                wordCodePointCount);
+        if (wordCodePoints[0] == CODE_POINT_BEGINNING_OF_SENTENCE) {
+            // Skip beginning-of-sentence unigram.
+            continue;
+        }
         if (dictionaryStructureWithBufferPolicy->needsToRunGC(true /* mindsBlockByGC */)) {
             dictionaryStructureWithBufferPolicy = runGCAndGetNewStructurePolicy(
                     std::move(dictionaryStructureWithBufferPolicy), dictFilePathChars);
@@ -569,8 +594,8 @@
                 return false;
             }
         }
-        if (!dictionaryStructureWithBufferPolicy->addUnigramEntry(wordCodePoints, wordLength,
-                wordProperty.getUnigramProperty())) {
+        if (!dictionaryStructureWithBufferPolicy->addUnigramEntry(wordCodePoints,
+                wordCodePointCount, wordProperty.getUnigramProperty())) {
             LogUtils::logToJava(env, "Cannot add unigram to the new dict.");
             return false;
         }
@@ -578,9 +603,9 @@
 
     // Add bigrams.
     do {
-        token = dictionary->getNextWordAndNextToken(token, wordCodePoints);
-        const int wordLength = CharUtils::getCodePointCount(MAX_WORD_LENGTH, wordCodePoints);
-        const WordProperty wordProperty = dictionary->getWordProperty(wordCodePoints, wordLength);
+        token = dictionary->getNextWordAndNextToken(token, wordCodePoints, &wordCodePointCount);
+        const WordProperty wordProperty = dictionary->getWordProperty(wordCodePoints,
+                wordCodePointCount);
         if (dictionaryStructureWithBufferPolicy->needsToRunGC(true /* mindsBlockByGC */)) {
             dictionaryStructureWithBufferPolicy = runGCAndGetNewStructurePolicy(
                     std::move(dictionaryStructureWithBufferPolicy), dictFilePathChars);
@@ -589,8 +614,8 @@
                 return false;
             }
         }
-        const PrevWordsInfo prevWordsInfo(wordCodePoints, wordLength,
-                false /* isStartOfSentence */);
+        const PrevWordsInfo prevWordsInfo(wordCodePoints, wordCodePointCount,
+                wordProperty.getUnigramProperty()->representsBeginningOfSentence());
         for (const BigramProperty &bigramProperty : *wordProperty.getBigramProperties()) {
             if (!dictionaryStructureWithBufferPolicy->addNgramEntry(&prevWordsInfo,
                     &bigramProperty)) {
@@ -667,13 +692,13 @@
     },
     {
         const_cast<char *>("getWordPropertyNative"),
-        const_cast<char *>("(J[I[I[Z[ILjava/util/ArrayList;Ljava/util/ArrayList;"
+        const_cast<char *>("(J[IZ[I[Z[ILjava/util/ArrayList;Ljava/util/ArrayList;"
                 "Ljava/util/ArrayList;Ljava/util/ArrayList;)V"),
         reinterpret_cast<void *>(latinime_BinaryDictionary_getWordProperty)
     },
     {
         const_cast<char *>("getNextWordNative"),
-        const_cast<char *>("(JI[I)I"),
+        const_cast<char *>("(JI[I[Z)I"),
         reinterpret_cast<void *>(latinime_BinaryDictionary_getNextWord)
     },
     {
diff --git a/native/jni/run-tests.sh b/native/jni/run-tests.sh
index 5b60e0d..3da4527 100755
--- a/native/jni/run-tests.sh
+++ b/native/jni/run-tests.sh
@@ -13,17 +13,56 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+function usage() {
+    echo "usage: source run-tests.sh [--host] [--target] [-h] [--help]"  1>&2
+    echo "    --host: run test on the host environment"  1>&2
+    echo "    --no-host: skip host test"  1>&2
+    echo "    --target: run test on the target environment"  1>&2
+    echo "    --no-target: skip target device test"  1>&2
+}
+
+# check script arguments
 if [[ $(type -t mmm) != function ]]; then
-echo "Usage:" 1>&2
-echo "    source $0" 1>&2
-echo "  or" 1>&2
-echo "    . $0" 1>&2
+usage
 if [[ ${BASH_SOURCE[0]} != $0 ]]; then return; else exit 1; fi
 fi
 
+show_usage=no
+enable_host_test=yes
+enable_target_device_test=no
+while [ "$1" != "" ]
+  do
+  case "$1" in
+    "-h") show_usage=yes;;
+    "--help") show_usage=yes;;
+    "--target") enable_target_device_test=yes;;
+    "--no-target") enable_target_device_test=no;;
+    "--host") enable_host_test=yes;;
+    "--no-host") enable_host_test=no;;
+  esac
+  shift
+done
+
+if [[ $show_usage == yes ]]; then
+  usage
+  if [[ ${BASH_SOURCE[0]} != $0 ]]; then return; else exit 1; fi
+fi
+
+target_test_name=liblatinime_target_unittests
+host_test_name=liblatinime_host_unittests
+
 pushd $PWD > /dev/null
 cd $(gettop)
 mmm -j16 packages/inputmethods/LatinIME/native/jni || \
-    make -j16 liblatinime_host_unittests
-${ANDROID_HOST_OUT}/bin/liblatinime_host_unittests
-popd > /dev/null
\ No newline at end of file
+    make -j16 adb $target_test_name $host_test_name
+if [[ $enable_host_test == yes ]]; then
+  $ANDROID_HOST_OUT/bin/$host_test_name
+fi
+if [[ $enable_target_device_test == yes ]]; then
+  target_test_local=$ANDROID_PRODUCT_OUT/data/nativetest/$target_test_name/$target_test_name
+  target_test_device=/data/nativetest/$target_test_name/$target_test_name
+  adb push $target_test_local $target_test_device
+  adb shell $target_test_device
+  adb shell rm -rf $target_test_device
+fi
+popd > /dev/null
diff --git a/native/jni/src/suggest/core/dictionary/dictionary.cpp b/native/jni/src/suggest/core/dictionary/dictionary.cpp
index 0bcde22..2282602 100644
--- a/native/jni/src/suggest/core/dictionary/dictionary.cpp
+++ b/native/jni/src/suggest/core/dictionary/dictionary.cpp
@@ -145,10 +145,11 @@
             codePoints, codePointCount);
 }
 
-int Dictionary::getNextWordAndNextToken(const int token, int *const outCodePoints) {
+int Dictionary::getNextWordAndNextToken(const int token, int *const outCodePoints,
+        int *const outCodePointCount) {
     TimeKeeper::setCurrentTime();
     return mDictionaryStructureWithBufferPolicy->getNextWordAndNextToken(
-            token, outCodePoints);
+            token, outCodePoints, outCodePointCount);
 }
 
 void Dictionary::logDictionaryInfo(JNIEnv *const env) const {
diff --git a/native/jni/src/suggest/core/dictionary/dictionary.h b/native/jni/src/suggest/core/dictionary/dictionary.h
index 542ba72..247ee24 100644
--- a/native/jni/src/suggest/core/dictionary/dictionary.h
+++ b/native/jni/src/suggest/core/dictionary/dictionary.h
@@ -103,7 +103,8 @@
     // Method to iterate all words in the dictionary.
     // The returned token has to be used to get the next word. If token is 0, this method newly
     // starts iterating the dictionary.
-    int getNextWordAndNextToken(const int token, int *const outCodePoints);
+    int getNextWordAndNextToken(const int token, int *const outCodePoints,
+            int *const outCodePointCount);
 
     const DictionaryStructureWithBufferPolicy *getDictionaryStructurePolicy() const {
         return mDictionaryStructureWithBufferPolicy.get();
diff --git a/native/jni/src/suggest/core/dictionary/property/word_property.cpp b/native/jni/src/suggest/core/dictionary/property/word_property.cpp
index 6f5f808..5bdd560 100644
--- a/native/jni/src/suggest/core/dictionary/property/word_property.cpp
+++ b/native/jni/src/suggest/core/dictionary/property/word_property.cpp
@@ -28,7 +28,8 @@
             MAX_WORD_LENGTH /* maxLength */, mCodePoints.data(), mCodePoints.size(),
             false /* needsNullTermination */);
     jboolean flags[] = {mUnigramProperty.isNotAWord(), mUnigramProperty.isBlacklisted(),
-            !mBigrams.empty(), mUnigramProperty.hasShortcuts()};
+            !mBigrams.empty(), mUnigramProperty.hasShortcuts(),
+            mUnigramProperty.representsBeginningOfSentence()};
     env->SetBooleanArrayRegion(outFlags, 0 /* start */, NELEMS(flags), flags);
     int probabilityInfo[] = {mUnigramProperty.getProbability(), mUnigramProperty.getTimestamp(),
             mUnigramProperty.getLevel(), mUnigramProperty.getCount()};
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 e2771f9..b726011 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
@@ -104,7 +104,8 @@
     // Method to iterate all words in the dictionary.
     // The returned token has to be used to get the next word. If token is 0, this method newly
     // starts iterating the dictionary.
-    virtual int getNextWordAndNextToken(const int token, int *const outCodePoints) = 0;
+    virtual int getNextWordAndNextToken(const int token, int *const outCodePoints,
+            int *const outCodePointCount) = 0;
 
     virtual bool isCorrupted() const = 0;
 
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_reader.h b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_reader.h
index 4032a67..1999a51 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_reader.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_node_reader.h
@@ -58,7 +58,7 @@
 
     ~Ver4PatriciaTrieNodeReader() {}
 
-    virtual const PtNodeParams fetchNodeInfoInBufferFromPtNodePos(const int ptNodePos) const {
+    virtual const PtNodeParams fetchPtNodeParamsInBufferFromPtNodePos(const int ptNodePos) const {
         return fetchPtNodeInfoFromBufferAndProcessMovedPtNode(ptNodePos,
                 NOT_A_DICT_POS /* siblingNodePos */);
     }
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 805820b..9780ae0 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
@@ -135,7 +135,7 @@
     if (ptNodePos == NOT_A_DICT_POS) {
         return NOT_A_PROBABILITY;
     }
-    const PtNodeParams ptNodeParams(mNodeReader.fetchNodeInfoInBufferFromPtNodePos(ptNodePos));
+    const PtNodeParams ptNodeParams(mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos));
     if (ptNodeParams.isDeleted() || ptNodeParams.isBlacklisted() || ptNodeParams.isNotAWord()) {
         return NOT_A_PROBABILITY;
     }
@@ -146,7 +146,7 @@
     if (ptNodePos == NOT_A_DICT_POS) {
         return NOT_A_DICT_POS;
     }
-    const PtNodeParams ptNodeParams(mNodeReader.fetchNodeInfoInBufferFromPtNodePos(ptNodePos));
+    const PtNodeParams ptNodeParams(mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos));
     if (ptNodeParams.isDeleted()) {
         return NOT_A_DICT_POS;
     }
@@ -158,7 +158,7 @@
     if (ptNodePos == NOT_A_DICT_POS) {
         return NOT_A_DICT_POS;
     }
-    const PtNodeParams ptNodeParams(mNodeReader.fetchNodeInfoInBufferFromPtNodePos(ptNodePos));
+    const PtNodeParams ptNodeParams(mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos));
     if (ptNodeParams.isDeleted()) {
         return NOT_A_DICT_POS;
     }
@@ -410,7 +410,7 @@
         AKLOGE("getWordProperty is called for invalid word.");
         return WordProperty();
     }
-    const PtNodeParams ptNodeParams = mNodeReader.fetchNodeInfoInBufferFromPtNodePos(ptNodePos);
+    const PtNodeParams ptNodeParams = mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos);
     std::vector<int> codePointVector(ptNodeParams.getCodePoints(),
             ptNodeParams.getCodePoints() + ptNodeParams.getCodePointCount());
     const ProbabilityEntry probabilityEntry =
@@ -478,10 +478,9 @@
     return WordProperty(&codePointVector, &unigramProperty, &bigrams);
 }
 
-int Ver4PatriciaTriePolicy::getNextWordAndNextToken(const int token, int *const outCodePoints) {
-    // TODO: Return code point count like other methods.
-    // Null termination.
-    outCodePoints[0] = 0;
+int Ver4PatriciaTriePolicy::getNextWordAndNextToken(const int token, int *const outCodePoints,
+        int *const outCodePointCount) {
+    *outCodePointCount = 0;
     if (token == 0) {
         mTerminalPtNodePositionsForIteratingWords.clear();
         DynamicPtReadingHelper::TraversePolicyToGetAllTerminalPtNodePositions traversePolicy(
@@ -498,13 +497,8 @@
     }
     const int terminalPtNodePos = mTerminalPtNodePositionsForIteratingWords[token];
     int unigramProbability = NOT_A_PROBABILITY;
-    const int codePointCount = getCodePointsAndProbabilityAndReturnCodePointCount(
+    *outCodePointCount = getCodePointsAndProbabilityAndReturnCodePointCount(
             terminalPtNodePos, MAX_WORD_LENGTH, outCodePoints, &unigramProbability);
-    if (codePointCount < MAX_WORD_LENGTH) {
-        // Null termination. outCodePoints have to be null terminated or contain MAX_WORD_LENGTH
-        // code points.
-        outCodePoints[codePointCount] = 0;
-    }
     const int nextToken = token + 1;
     if (nextToken >= terminalPtNodePositionsVectorSize) {
         // All words have been iterated.
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 2e948ac..16b1bd2 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
@@ -134,7 +134,8 @@
     const WordProperty getWordProperty(const int *const codePoints,
             const int codePointCount) const;
 
-    int getNextWordAndNextToken(const int token, int *const outCodePoints);
+    int getNextWordAndNextToken(const int token, int *const outCodePoints,
+            int *const outCodePointCount);
 
     bool isCorrupted() const {
         return mIsCorrupted;
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_writing_helper.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_writing_helper.cpp
index 99eed0f..3fb4caa 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_writing_helper.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_writing_helper.cpp
@@ -224,7 +224,7 @@
         const int ptNodePos = priorityQueue.top().getDictPos();
         priorityQueue.pop();
         const PtNodeParams ptNodeParams =
-                ptNodeReader->fetchNodeInfoInBufferFromPtNodePos(ptNodePos);
+                ptNodeReader->fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos);
         if (ptNodeParams.representsNonWordInfo()) {
             continue;
         }
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_gc_event_listeners.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_gc_event_listeners.cpp
index 1f00fc6..db1a802 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_gc_event_listeners.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_gc_event_listeners.cpp
@@ -65,7 +65,7 @@
 
 bool DynamicPtGcEventListeners::TraversePolicyToUpdateBigramProbability
         ::onVisitingPtNode(const PtNodeParams *const ptNodeParams) {
-    if (!ptNodeParams->isDeleted() && ptNodeParams->hasBigrams()) {
+    if (!ptNodeParams->isDeleted()) {
         int bigramEntryCount = 0;
         if (!mPtNodeWriter->updateAllBigramEntriesAndDeleteUselessEntries(ptNodeParams,
                 &bigramEntryCount)) {
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_reading_helper.h b/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_reading_helper.h
index cc7b5ff..2e05bf3 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_reading_helper.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_reading_helper.h
@@ -126,7 +126,7 @@
         if (isEnd()) {
             return PtNodeParams();
         }
-        return mPtNodeReader->fetchNodeInfoInBufferFromPtNodePos(mReadingState.mPos);
+        return mPtNodeReader->fetchPtNodeParamsInBufferFromPtNodePos(mReadingState.mPos);
     }
 
     AK_FORCE_INLINE bool isValidTerminalNode(const PtNodeParams &ptNodeParams) const {
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_updating_helper.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_updating_helper.cpp
index 9e57585..f31c914 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_updating_helper.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_updating_helper.cpp
@@ -87,9 +87,9 @@
 bool DynamicPtUpdatingHelper::addBigramWords(const int word0Pos, const int word1Pos,
         const BigramProperty *const bigramProperty, bool *const outAddedNewBigram) {
     const PtNodeParams sourcePtNodeParams(
-            mPtNodeReader->fetchNodeInfoInBufferFromPtNodePos(word0Pos));
+            mPtNodeReader->fetchPtNodeParamsInBufferFromPtNodePos(word0Pos));
     const PtNodeParams targetPtNodeParams(
-            mPtNodeReader->fetchNodeInfoInBufferFromPtNodePos(word1Pos));
+            mPtNodeReader->fetchPtNodeParamsInBufferFromPtNodePos(word1Pos));
     return mPtNodeWriter->addNewBigramEntry(&sourcePtNodeParams, &targetPtNodeParams,
             bigramProperty, outAddedNewBigram);
 }
@@ -97,16 +97,16 @@
 // Remove a bigram relation from word0Pos to word1Pos.
 bool DynamicPtUpdatingHelper::removeBigramWords(const int word0Pos, const int word1Pos) {
     const PtNodeParams sourcePtNodeParams(
-            mPtNodeReader->fetchNodeInfoInBufferFromPtNodePos(word0Pos));
+            mPtNodeReader->fetchPtNodeParamsInBufferFromPtNodePos(word0Pos));
     const PtNodeParams targetPtNodeParams(
-            mPtNodeReader->fetchNodeInfoInBufferFromPtNodePos(word1Pos));
+            mPtNodeReader->fetchPtNodeParamsInBufferFromPtNodePos(word1Pos));
     return mPtNodeWriter->removeBigramEntry(&sourcePtNodeParams, &targetPtNodeParams);
 }
 
 bool DynamicPtUpdatingHelper::addShortcutTarget(const int wordPos,
         const int *const targetCodePoints, const int targetCodePointCount,
         const int shortcutProbability) {
-    const PtNodeParams ptNodeParams(mPtNodeReader->fetchNodeInfoInBufferFromPtNodePos(wordPos));
+    const PtNodeParams ptNodeParams(mPtNodeReader->fetchPtNodeParamsInBufferFromPtNodePos(wordPos));
     return mPtNodeWriter->addShortcutTarget(&ptNodeParams, targetCodePoints, targetCodePointCount,
             shortcutProbability);
 }
@@ -125,7 +125,7 @@
 
 bool DynamicPtUpdatingHelper::setPtNodeProbability(const PtNodeParams *const originalPtNodeParams,
         const UnigramProperty *const unigramProperty, bool *const outAddedNewUnigram) {
-    if (originalPtNodeParams->isTerminal()) {
+    if (originalPtNodeParams->isTerminal() && !originalPtNodeParams->isDeleted()) {
         // Overwrites the probability.
         *outAddedNewUnigram = false;
         return mPtNodeWriter->updatePtNodeUnigramProperty(originalPtNodeParams, unigramProperty);
@@ -260,7 +260,7 @@
     }
     // Load node info. Information of the 1st part will be fetched.
     const PtNodeParams ptNodeParams(
-            mPtNodeReader->fetchNodeInfoInBufferFromPtNodePos(firstPartOfReallocatedPtNodePos));
+            mPtNodeReader->fetchPtNodeParamsInBufferFromPtNodePos(firstPartOfReallocatedPtNodePos));
     // Update children position.
     return mPtNodeWriter->updateChildrenPosition(&ptNodeParams, actualChildrenPos);
 }
@@ -270,8 +270,8 @@
         const bool isNotAWord, const bool isBlacklisted, const bool isTerminal, const int parentPos,
         const int codePointCount, const int *const codePoints, const int probability) const {
     const PatriciaTrieReadingUtils::NodeFlags flags = PatriciaTrieReadingUtils::createAndGetFlags(
-            isBlacklisted, isNotAWord, isTerminal, originalPtNodeParams->hasShortcutTargets(),
-            originalPtNodeParams->hasBigrams(), codePointCount > 1 /* hasMultipleChars */,
+            isBlacklisted, isNotAWord, isTerminal, false /* hasShortcutTargets */,
+            false /* hasBigrams */, codePointCount > 1 /* hasMultipleChars */,
             CHILDREN_POSITION_FIELD_SIZE);
     return PtNodeParams(originalPtNodeParams, flags, parentPos, codePointCount, codePoints,
             probability);
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/pt_node_reader.h b/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/pt_node_reader.h
index c6b2a8b..31299a7 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/pt_node_reader.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/pt_node_reader.h
@@ -27,7 +27,8 @@
 class PtNodeReader {
  public:
     virtual ~PtNodeReader() {}
-    virtual const PtNodeParams fetchNodeInfoInBufferFromPtNodePos(const int ptNodePos) const = 0;
+    virtual const PtNodeParams fetchPtNodeParamsInBufferFromPtNodePos(
+            const int ptNodePos) const = 0;
 
  protected:
     PtNodeReader() {};
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 a6a470c..5c62b9c 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
@@ -282,7 +282,8 @@
     if (ptNodePos == NOT_A_DICT_POS) {
         return NOT_A_PROBABILITY;
     }
-    const PtNodeParams ptNodeParams = mPtNodeReader.fetchNodeInfoInBufferFromPtNodePos(ptNodePos);
+    const PtNodeParams ptNodeParams =
+            mPtNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos);
     if (ptNodeParams.isNotAWord() || ptNodeParams.isBlacklisted()) {
         // If this is not a word, or if it's a blacklisted entry, it should behave as
         // having no probability outside of the suggestion process (where it should be used
@@ -296,14 +297,14 @@
     if (ptNodePos == NOT_A_DICT_POS) {
         return NOT_A_DICT_POS;
     }
-    return mPtNodeReader.fetchNodeInfoInBufferFromPtNodePos(ptNodePos).getShortcutPos();
+    return mPtNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos).getShortcutPos();
 }
 
 int PatriciaTriePolicy::getBigramsPositionOfPtNode(const int ptNodePos) const {
     if (ptNodePos == NOT_A_DICT_POS) {
         return NOT_A_DICT_POS;
     }
-    return mPtNodeReader.fetchNodeInfoInBufferFromPtNodePos(ptNodePos).getBigramsPos();
+    return mPtNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos).getBigramsPos();
 }
 
 int PatriciaTriePolicy::createAndGetLeavingChildNode(const DicNode *const dicNode,
@@ -339,7 +340,8 @@
         AKLOGE("getWordProperty was called for invalid word.");
         return WordProperty();
     }
-    const PtNodeParams ptNodeParams = mPtNodeReader.fetchNodeInfoInBufferFromPtNodePos(ptNodePos);
+    const PtNodeParams ptNodeParams =
+            mPtNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos);
     std::vector<int> codePointVector(ptNodeParams.getCodePoints(),
             ptNodeParams.getCodePoints() + ptNodeParams.getCodePointCount());
     // Fetch bigram information.
@@ -389,7 +391,9 @@
     return WordProperty(&codePointVector, &unigramProperty, &bigrams);
 }
 
-int PatriciaTriePolicy::getNextWordAndNextToken(const int token, int *const outCodePoints) {
+int PatriciaTriePolicy::getNextWordAndNextToken(const int token, int *const outCodePoints,
+        int *const outCodePointCount) {
+    *outCodePointCount = 0;
     if (token == 0) {
         // Start iterating the dictionary.
         mTerminalPtNodePositionsForIteratingWords.clear();
@@ -407,8 +411,8 @@
     }
     const int terminalPtNodePos = mTerminalPtNodePositionsForIteratingWords[token];
     int unigramProbability = NOT_A_PROBABILITY;
-    getCodePointsAndProbabilityAndReturnCodePointCount(terminalPtNodePos, MAX_WORD_LENGTH,
-            outCodePoints, &unigramProbability);
+    *outCodePointCount = getCodePointsAndProbabilityAndReturnCodePointCount(terminalPtNodePos,
+            MAX_WORD_LENGTH, outCodePoints, &unigramProbability);
     const int nextToken = token + 1;
     if (nextToken >= terminalPtNodePositionsVectorSize) {
         // All words have been iterated.
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 dce9436..ec84074 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
@@ -137,7 +137,8 @@
     const WordProperty getWordProperty(const int *const codePoints,
             const int codePointCount) const;
 
-    int getNextWordAndNextToken(const int token, int *const outCodePoints);
+    int getNextWordAndNextToken(const int token, int *const outCodePoints,
+            int *const outCodePointCount);
 
     bool isCorrupted() const {
         return mIsCorrupted;
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/ver2_patricia_trie_node_reader.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/ver2_patricia_trie_node_reader.cpp
index 0c8de0d..c1e9387 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/ver2_patricia_trie_node_reader.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/ver2_patricia_trie_node_reader.cpp
@@ -20,7 +20,7 @@
 
 namespace latinime {
 
-const PtNodeParams Ver2ParticiaTrieNodeReader::fetchNodeInfoInBufferFromPtNodePos(
+const PtNodeParams Ver2ParticiaTrieNodeReader::fetchPtNodeParamsInBufferFromPtNodePos(
         const int ptNodePos) const {
     if (ptNodePos < 0 || ptNodePos >= mDictSize) {
         // Reading invalid position because of bug or broken dictionary.
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/ver2_patricia_trie_node_reader.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/ver2_patricia_trie_node_reader.h
index 86fc89c..f0725b6 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v2/ver2_patricia_trie_node_reader.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v2/ver2_patricia_trie_node_reader.h
@@ -36,7 +36,7 @@
             : mDictBuffer(dictBuffer), mDictSize(dictSize), mBigramPolicy(bigramPolicy),
               mShortuctPolicy(shortcutPolicy) {}
 
-    virtual const PtNodeParams fetchNodeInfoInBufferFromPtNodePos(const int ptNodePos) const;
+    virtual const PtNodeParams fetchPtNodeParamsInBufferFromPtNodePos(const int ptNodePos) const;
 
  private:
     DISALLOW_IMPLICIT_CONSTRUCTORS(Ver2ParticiaTrieNodeReader);
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_reader.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_reader.h
index f24307e..22ed4a6 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_reader.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_reader.h
@@ -41,7 +41,7 @@
 
     ~Ver4PatriciaTrieNodeReader() {}
 
-    virtual const PtNodeParams fetchNodeInfoInBufferFromPtNodePos(const int ptNodePos) const {
+    virtual const PtNodeParams fetchPtNodeParamsInBufferFromPtNodePos(const int ptNodePos) const {
         return fetchPtNodeInfoFromBufferAndProcessMovedPtNode(ptNodePos,
                 NOT_A_DICT_POS /* siblingNodePos */);
     }
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.cpp
index f89d3d7..3d8da91 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.cpp
@@ -231,14 +231,6 @@
                 sourcePtNodeParams->getTerminalId(), targetPtNodeParam->getTerminalId());
         return false;
     }
-    if (!sourcePtNodeParams->hasBigrams()) {
-        // Update has bigrams flag.
-        return updatePtNodeFlags(sourcePtNodeParams->getHeadPos(),
-                sourcePtNodeParams->isBlacklisted(), sourcePtNodeParams->isNotAWord(),
-                sourcePtNodeParams->isTerminal(), sourcePtNodeParams->hasShortcutTargets(),
-                true /* hasBigrams */,
-                sourcePtNodeParams->getCodePointCount() > 1 /* hasMultipleChars */);
-    }
     return true;
 }
 
@@ -303,28 +295,9 @@
         AKLOGE("Cannot add new shortuct entry. terminalId: %d", ptNodeParams->getTerminalId());
         return false;
     }
-    if (!ptNodeParams->hasShortcutTargets()) {
-        // Update has shortcut targets flag.
-        return updatePtNodeFlags(ptNodeParams->getHeadPos(),
-                ptNodeParams->isBlacklisted(), ptNodeParams->isNotAWord(),
-                ptNodeParams->isTerminal(), true /* hasShortcutTargets */,
-                ptNodeParams->hasBigrams(),
-                ptNodeParams->getCodePointCount() > 1 /* hasMultipleChars */);
-    }
     return true;
 }
 
-bool Ver4PatriciaTrieNodeWriter::updatePtNodeHasBigramsAndShortcutTargetsFlags(
-        const PtNodeParams *const ptNodeParams) {
-    const bool hasBigrams = mBuffers->getBigramDictContent()->getBigramListHeadPos(
-            ptNodeParams->getTerminalId()) != NOT_A_DICT_POS;
-    const bool hasShortcutTargets = mBuffers->getShortcutDictContent()->getShortcutListHeadPos(
-            ptNodeParams->getTerminalId()) != NOT_A_DICT_POS;
-    return updatePtNodeFlags(ptNodeParams->getHeadPos(), ptNodeParams->isBlacklisted(),
-            ptNodeParams->isNotAWord(), ptNodeParams->isTerminal(), hasShortcutTargets,
-            hasBigrams, ptNodeParams->getCodePointCount() > 1 /* hasMultipleChars */);
-}
-
 bool Ver4PatriciaTrieNodeWriter::writePtNodeAndGetTerminalIdAndAdvancePosition(
         const PtNodeParams *const ptNodeParams, int *const outTerminalId,
         int *const ptNodeWritingPos) {
@@ -377,8 +350,7 @@
         return false;
     }
     return updatePtNodeFlags(nodePos, ptNodeParams->isBlacklisted(), ptNodeParams->isNotAWord(),
-            isTerminal, ptNodeParams->hasShortcutTargets(), ptNodeParams->hasBigrams(),
-            ptNodeParams->getCodePointCount() > 1 /* hasMultipleChars */);
+            isTerminal, ptNodeParams->getCodePointCount() > 1 /* hasMultipleChars */);
 }
 
 const ProbabilityEntry Ver4PatriciaTrieNodeWriter::createUpdatedEntryFrom(
@@ -402,11 +374,11 @@
 
 bool Ver4PatriciaTrieNodeWriter::updatePtNodeFlags(const int ptNodePos,
         const bool isBlacklisted, const bool isNotAWord, const bool isTerminal,
-        const bool hasShortcutTargets, const bool hasBigrams, const bool hasMultipleChars) {
+        const bool hasMultipleChars) {
     // Create node flags and write them.
     PatriciaTrieReadingUtils::NodeFlags nodeFlags =
             PatriciaTrieReadingUtils::createAndGetFlags(isBlacklisted, isNotAWord, isTerminal,
-                    hasShortcutTargets, hasBigrams, hasMultipleChars,
+                    false /* hasShortcutTargets */, false /* hasBigrams */, hasMultipleChars,
                     CHILDREN_POSITION_FIELD_SIZE);
     if (!DynamicPtWritingUtils::writeFlags(mTrieBuffer, nodeFlags, ptNodePos)) {
         AKLOGE("Cannot write PtNode flags. flags: %x, pos: %d", nodeFlags, ptNodePos);
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.h
index e90bc44..162dc9b 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_writer.h
@@ -93,8 +93,6 @@
             const int *const targetCodePoints, const int targetCodePointCount,
             const int shortcutProbability);
 
-    bool updatePtNodeHasBigramsAndShortcutTargetsFlags(const PtNodeParams *const ptNodeParams);
-
  private:
     DISALLOW_COPY_AND_ASSIGN(Ver4PatriciaTrieNodeWriter);
 
@@ -110,8 +108,7 @@
             const UnigramProperty *const unigramProperty) const;
 
     bool updatePtNodeFlags(const int ptNodePos, const bool isBlacklisted, const bool isNotAWord,
-            const bool isTerminal, const bool hasShortcutTargets, const bool hasBigrams,
-            const bool hasMultipleChars);
+            const bool isTerminal, const bool hasMultipleChars);
 
     static const int CHILDREN_POSITION_FIELD_SIZE;
 
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 aec3b8e..46107d9 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
@@ -125,7 +125,7 @@
     if (ptNodePos == NOT_A_DICT_POS) {
         return NOT_A_PROBABILITY;
     }
-    const PtNodeParams ptNodeParams(mNodeReader.fetchNodeInfoInBufferFromPtNodePos(ptNodePos));
+    const PtNodeParams ptNodeParams(mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos));
     if (ptNodeParams.isDeleted() || ptNodeParams.isBlacklisted() || ptNodeParams.isNotAWord()) {
         return NOT_A_PROBABILITY;
     }
@@ -136,7 +136,7 @@
     if (ptNodePos == NOT_A_DICT_POS) {
         return NOT_A_DICT_POS;
     }
-    const PtNodeParams ptNodeParams(mNodeReader.fetchNodeInfoInBufferFromPtNodePos(ptNodePos));
+    const PtNodeParams ptNodeParams(mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos));
     if (ptNodeParams.isDeleted()) {
         return NOT_A_DICT_POS;
     }
@@ -148,7 +148,7 @@
     if (ptNodePos == NOT_A_DICT_POS) {
         return NOT_A_DICT_POS;
     }
-    const PtNodeParams ptNodeParams(mNodeReader.fetchNodeInfoInBufferFromPtNodePos(ptNodePos));
+    const PtNodeParams ptNodeParams(mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos));
     if (ptNodeParams.isDeleted()) {
         return NOT_A_DICT_POS;
     }
@@ -222,8 +222,24 @@
 }
 
 bool Ver4PatriciaTriePolicy::removeUnigramEntry(const int *const word, const int length) {
-    // TODO: Implement.
-    return false;
+    if (!mBuffers->isUpdatable()) {
+        AKLOGI("Warning: removeUnigramEntry() is called for non-updatable dictionary.");
+        return false;
+    }
+    const int ptNodePos = getTerminalPtNodePositionOfWord(word, length,
+            false /* forceLowerCaseSearch */);
+    if (ptNodePos == NOT_A_DICT_POS) {
+        return false;
+    }
+    const PtNodeParams ptNodeParams = mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos);
+    if (!mNodeWriter.markPtNodeAsDeleted(&ptNodeParams)) {
+        AKLOGE("Cannot remove unigram. ptNodePos: %d", ptNodePos);
+        return false;
+    }
+    if (!ptNodeParams.representsNonWordInfo()) {
+        mUnigramCount--;
+    }
+    return true;
 }
 
 bool Ver4PatriciaTriePolicy::addNgramEntry(const PrevWordsInfo *const prevWordsInfo,
@@ -405,7 +421,7 @@
         AKLOGE("getWordProperty is called for invalid word.");
         return WordProperty();
     }
-    const PtNodeParams ptNodeParams = mNodeReader.fetchNodeInfoInBufferFromPtNodePos(ptNodePos);
+    const PtNodeParams ptNodeParams = mNodeReader.fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos);
     std::vector<int> codePointVector(ptNodeParams.getCodePoints(),
             ptNodeParams.getCodePoints() + ptNodeParams.getCodePointCount());
     const ProbabilityEntry probabilityEntry =
@@ -473,10 +489,9 @@
     return WordProperty(&codePointVector, &unigramProperty, &bigrams);
 }
 
-int Ver4PatriciaTriePolicy::getNextWordAndNextToken(const int token, int *const outCodePoints) {
-    // TODO: Return code point count like other methods.
-    // Null termination.
-    outCodePoints[0] = 0;
+int Ver4PatriciaTriePolicy::getNextWordAndNextToken(const int token, int *const outCodePoints,
+        int *const outCodePointCount) {
+    *outCodePointCount = 0;
     if (token == 0) {
         mTerminalPtNodePositionsForIteratingWords.clear();
         DynamicPtReadingHelper::TraversePolicyToGetAllTerminalPtNodePositions traversePolicy(
@@ -493,13 +508,8 @@
     }
     const int terminalPtNodePos = mTerminalPtNodePositionsForIteratingWords[token];
     int unigramProbability = NOT_A_PROBABILITY;
-    const int codePointCount = getCodePointsAndProbabilityAndReturnCodePointCount(
+    *outCodePointCount = getCodePointsAndProbabilityAndReturnCodePointCount(
             terminalPtNodePos, MAX_WORD_LENGTH, outCodePoints, &unigramProbability);
-    if (codePointCount < MAX_WORD_LENGTH) {
-        // Null termination. outCodePoints have to be null terminated or contain MAX_WORD_LENGTH
-        // code points.
-        outCodePoints[codePointCount] = 0;
-    }
     const int nextToken = token + 1;
     if (nextToken >= terminalPtNodePositionsVectorSize) {
         // All words have been iterated.
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 0a20965..5d66a2c 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
@@ -113,7 +113,8 @@
     const WordProperty getWordProperty(const int *const codePoints,
             const int codePointCount) const;
 
-    int getNextWordAndNextToken(const int token, int *const outCodePoints);
+    int getNextWordAndNextToken(const int token, int *const outCodePoints,
+            int *const outCodePointCount);
 
     bool isCorrupted() const {
         return mIsCorrupted;
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_writing_helper.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_writing_helper.cpp
index e868ddf..40fdfa0 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_writing_helper.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_writing_helper.cpp
@@ -215,7 +215,7 @@
         const int ptNodePos = priorityQueue.top().getDictPos();
         priorityQueue.pop();
         const PtNodeParams ptNodeParams =
-                ptNodeReader->fetchNodeInfoInBufferFromPtNodePos(ptNodePos);
+                ptNodeReader->fetchPtNodeParamsInBufferFromPtNodePos(ptNodePos);
         if (ptNodeParams.representsNonWordInfo()) {
             continue;
         }
@@ -286,8 +286,9 @@
     }
     if (!mPtNodeWriter->updateTerminalId(ptNodeParams, it->second)) {
         AKLOGE("Cannot update terminal id. %d -> %d", it->first, it->second);
+        return false;
     }
-    return mPtNodeWriter->updatePtNodeHasBigramsAndShortcutTargetsFlags(ptNodeParams);
+    return true;
 }
 
 } // namespace latinime
diff --git a/native/jni/src/utils/char_utils.h b/native/jni/src/utils/char_utils.h
index f28ed56..6378650 100644
--- a/native/jni/src/utils/char_utils.h
+++ b/native/jni/src/utils/char_utils.h
@@ -98,6 +98,10 @@
     // Beginning-of-Sentence.
     static AK_FORCE_INLINE int attachBeginningOfSentenceMarker(int *const codePoints,
             const int codePointCount, const int maxCodePoint) {
+        if (codePointCount > 0 && codePoints[0] == CODE_POINT_BEGINNING_OF_SENTENCE) {
+            // Marker has already been attached.
+            return codePointCount;
+        }
         if (codePointCount >= maxCodePoint) {
             // the code points cannot be marked as a Beginning-of-Sentence.
             return 0;
diff --git a/native/jni/src/utils/jni_data_utils.h b/native/jni/src/utils/jni_data_utils.h
index 67a66fd..3514aee 100644
--- a/native/jni/src/utils/jni_data_utils.h
+++ b/native/jni/src/utils/jni_data_utils.h
@@ -69,18 +69,23 @@
     static void outputCodePoints(JNIEnv *env, jintArray intArrayToOutputCodePoints, const int start,
             const int maxLength, const int *const codePoints, const int codePointCount,
             const bool needsNullTermination) {
-        const int outputCodePointCount = std::min(maxLength, codePointCount);
-        int outputCodePonts[outputCodePointCount];
-        for (int i = 0; i < outputCodePointCount; ++i) {
+        const int codePointBufSize = std::min(maxLength, codePointCount);
+        int outputCodePonts[codePointBufSize];
+        int outputCodePointCount = 0;
+        for (int i = 0; i < codePointBufSize; ++i) {
             const int codePoint = codePoints[i];
+            int codePointToOutput = codePoint;
             if (!CharUtils::isInUnicodeSpace(codePoint)) {
-                outputCodePonts[i] = CODE_POINT_REPLACEMENT_CHARACTER;
+                if (codePoint == CODE_POINT_BEGINNING_OF_SENTENCE) {
+                    // Just skip Beginning-of-Sentence marker.
+                    continue;
+                }
+                codePointToOutput = CODE_POINT_REPLACEMENT_CHARACTER;
             } else if (codePoint >= 0x01 && codePoint <= 0x1F) {
                 // Control code.
-                outputCodePonts[i] = CODE_POINT_REPLACEMENT_CHARACTER;
-            } else {
-                outputCodePonts[i] = codePoint;
+                codePointToOutput = CODE_POINT_REPLACEMENT_CHARACTER;
             }
+            outputCodePonts[outputCodePointCount++] = codePointToOutput;
         }
         env->SetIntArrayRegion(intArrayToOutputCodePoints, start, outputCodePointCount,
                 outputCodePonts);
@@ -90,6 +95,11 @@
         }
     }
 
+    static void putBooleanToArray(JNIEnv *env, jbooleanArray array, const int index,
+            const jboolean value) {
+        env->SetBooleanArrayRegion(array, index, 1 /* len */, &value);
+    }
+
     static void putIntToArray(JNIEnv *env, jintArray array, const int index, const int value) {
         env->SetIntArrayRegion(array, index, 1 /* len */, &value);
     }
diff --git a/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java b/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java
index 160b08c..83ea193 100644
--- a/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java
+++ b/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java
@@ -994,7 +994,8 @@
                 0 /* offset */, dictFile.length(), true /* useFullEditDistance */,
                 Locale.getDefault(), TEST_LOCALE, true /* isUpdatable */);
 
-        final WordProperty invalidWordProperty = binaryDictionary.getWordProperty("dummyWord");
+        final WordProperty invalidWordProperty = binaryDictionary.getWordProperty("dummyWord",
+                false /* isBeginningOfSentence */);
         assertFalse(invalidWordProperty.isValid());
 
         final ArrayList<String> words = new ArrayList<>();
@@ -1017,7 +1018,8 @@
             }
             words.add(word);
             wordProbabilities.put(word, unigramProbability);
-            final WordProperty wordProperty = binaryDictionary.getWordProperty(word);
+            final WordProperty wordProperty = binaryDictionary.getWordProperty(word,
+                    false /* isBeginningOfSentence */);
             assertEquals(word, wordProperty.mWord);
             assertTrue(wordProperty.isValid());
             assertEquals(isNotAWord, wordProperty.mIsNotAWord);
@@ -1057,7 +1059,8 @@
                 continue;
             }
             final HashSet<String> bigramWord1s = bigrams.get(word0);
-            final WordProperty wordProperty = binaryDictionary.getWordProperty(word0);
+            final WordProperty wordProperty = binaryDictionary.getWordProperty(word0,
+                    false /* isBeginningOfSentence */);
             assertEquals(bigramWord1s.size(), wordProperty.mBigrams.size());
             for (int j = 0; j < wordProperty.mBigrams.size(); j++) {
                 final String word1 = wordProperty.mBigrams.get(j).mWord;
@@ -1094,7 +1097,8 @@
                 0 /* offset */, dictFile.length(), true /* useFullEditDistance */,
                 Locale.getDefault(), TEST_LOCALE, true /* isUpdatable */);
 
-        final WordProperty invalidWordProperty = binaryDictionary.getWordProperty("dummyWord");
+        final WordProperty invalidWordProperty = binaryDictionary.getWordProperty("dummyWord",
+                false /* isBeginningOfSentence */);
         assertFalse(invalidWordProperty.isValid());
 
         final ArrayList<String> words = new ArrayList<>();
@@ -1188,7 +1192,8 @@
         binaryDictionary.addUnigramEntry("aaa", unigramProbability, "zzz",
                 shortcutProbability, false /* isBeginningOfSentence */,
                 false /* isNotAWord */, false /* isBlacklisted */, 0 /* timestamp */);
-        WordProperty wordProperty = binaryDictionary.getWordProperty("aaa");
+        WordProperty wordProperty = binaryDictionary.getWordProperty("aaa",
+                false /* isBeginningOfSentence */);
         assertEquals(1, wordProperty.mShortcutTargets.size());
         assertEquals("zzz", wordProperty.mShortcutTargets.get(0).mWord);
         assertEquals(shortcutProbability, wordProperty.mShortcutTargets.get(0).getProbability());
@@ -1196,7 +1201,8 @@
         binaryDictionary.addUnigramEntry("aaa", unigramProbability, "zzz",
                 updatedShortcutProbability, false /* isBeginningOfSentence */,
                 false /* isNotAWord */, false /* isBlacklisted */, 0 /* timestamp */);
-        wordProperty = binaryDictionary.getWordProperty("aaa");
+        wordProperty = binaryDictionary.getWordProperty("aaa",
+                false /* isBeginningOfSentence */);
         assertEquals(1, wordProperty.mShortcutTargets.size());
         assertEquals("zzz", wordProperty.mShortcutTargets.get(0).mWord);
         assertEquals(updatedShortcutProbability,
@@ -1207,7 +1213,8 @@
         final HashMap<String, Integer> shortcutTargets = new HashMap<>();
         shortcutTargets.put("zzz", updatedShortcutProbability);
         shortcutTargets.put("yyy", shortcutProbability);
-        wordProperty = binaryDictionary.getWordProperty("aaa");
+        wordProperty = binaryDictionary.getWordProperty("aaa",
+                false /* isBeginningOfSentence */);
         assertEquals(2, wordProperty.mShortcutTargets.size());
         for (WeightedString shortcutTarget : wordProperty.mShortcutTargets) {
             assertTrue(shortcutTargets.containsKey(shortcutTarget.mWord));
@@ -1218,7 +1225,8 @@
         shortcutTargets.put("zzz", updatedShortcutProbability);
         shortcutTargets.put("yyy", shortcutProbability);
         binaryDictionary.flushWithGC();
-        wordProperty = binaryDictionary.getWordProperty("aaa");
+        wordProperty = binaryDictionary.getWordProperty("aaa",
+                false /* isBeginningOfSentence */);
         assertEquals(2, wordProperty.mShortcutTargets.size());
         for (WeightedString shortcutTarget : wordProperty.mShortcutTargets) {
             assertTrue(shortcutTargets.containsKey(shortcutTarget.mWord));
@@ -1288,7 +1296,8 @@
         }
 
         for (final String word : words) {
-            final WordProperty wordProperty = binaryDictionary.getWordProperty(word);
+            final WordProperty wordProperty = binaryDictionary.getWordProperty(word,
+                    false /* isBeginningOfSentence */);
             assertEquals((int)unigramProbabilities.get(word),
                     wordProperty.mProbabilityInfo.mProbability);
             if (!shortcutTargets.containsKey(word)) {
@@ -1332,6 +1341,8 @@
         binaryDictionary.addUnigramEntry("ddd", unigramProbability, null /* shortcutTarget */,
                 Dictionary.NOT_A_PROBABILITY, false /* isBeginningOfSentence */,
                 true /* isNotAWord */, true /* isBlacklisted */, 0 /* timestamp */);
+        binaryDictionary.addNgramEntry(PrevWordsInfo.BEGINNING_OF_SENTENCE,
+                "aaa", bigramProbability, 0 /* timestamp */);
         assertEquals(unigramProbability, binaryDictionary.getFrequency("aaa"));
         assertEquals(unigramProbability, binaryDictionary.getFrequency("bbb"));
         assertTrue(isValidBigram(binaryDictionary, "aaa", "bbb"));
@@ -1343,12 +1354,16 @@
         assertEquals(unigramProbability, binaryDictionary.getFrequency("bbb"));
         if (canCheckBigramProbability(toFormatVersion)) {
             assertEquals(bigramProbability, getBigramProbability(binaryDictionary, "aaa", "bbb"));
+            assertEquals(bigramProbability, binaryDictionary.getNgramProbability(
+                    PrevWordsInfo.BEGINNING_OF_SENTENCE, "aaa"));
         }
         assertTrue(isValidBigram(binaryDictionary, "aaa", "bbb"));
-        WordProperty wordProperty = binaryDictionary.getWordProperty("ccc");
+        WordProperty wordProperty = binaryDictionary.getWordProperty("ccc",
+                false /* isBeginningOfSentence */);
         assertEquals(1, wordProperty.mShortcutTargets.size());
         assertEquals("xxx", wordProperty.mShortcutTargets.get(0).mWord);
-        wordProperty = binaryDictionary.getWordProperty("ddd");
+        wordProperty = binaryDictionary.getWordProperty("ddd",
+                false /* isBeginningOfSentence */);
         assertTrue(wordProperty.mIsBlacklistEntry);
         assertTrue(wordProperty.mIsNotAWord);
     }
diff --git a/tests/src/com/android/inputmethod/latin/InputLogicTests.java b/tests/src/com/android/inputmethod/latin/InputLogicTests.java
index 460f600..2709ecb 100644
--- a/tests/src/com/android/inputmethod/latin/InputLogicTests.java
+++ b/tests/src/com/android/inputmethod/latin/InputLogicTests.java
@@ -482,6 +482,7 @@
     }
 
     public void testPredictionsWithDoubleSpaceToPeriod() {
+        mLatinIME.clearPersonalizedDictionariesForTest();
         final String WORD_TO_TYPE = "Barack ";
         type(WORD_TO_TYPE);
         sleep(DELAY_TO_WAIT_FOR_PREDICTIONS);
@@ -517,6 +518,7 @@
     }
 
     public void testNoPredictionsAfterPeriod() {
+        mLatinIME.clearPersonalizedDictionariesForTest();
         final String WORD_TO_TYPE = "Barack. ";
         type(WORD_TO_TYPE);
         sleep(DELAY_TO_WAIT_FOR_PREDICTIONS);
diff --git a/tests/src/com/android/inputmethod/latin/ShiftModeTests.java b/tests/src/com/android/inputmethod/latin/ShiftModeTests.java
index a319ffd..db3c9ba 100644
--- a/tests/src/com/android/inputmethod/latin/ShiftModeTests.java
+++ b/tests/src/com/android/inputmethod/latin/ShiftModeTests.java
@@ -111,24 +111,16 @@
         assertTrue("(Spanish) Auto caps after inverted bang", isCapsModeAutoShifted());
     }
 
-    public void DISABLED_testOtherSentenceSeparators() {
-        // We only run this test on Kitkat+ because previous versions of Android don't
-        // have an Armenian locale. For some reason I don't know, when the requested
-        // locale is not present as a device locale, then the application under test can't
-        // access the resources in that locale -- though it works when the app is actually
-        // running on the device and not under test. If we ever figure out what's going
-        // on, remove this test.
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
-            changeLanguage("hy-AM");
-            assertTrue("(Armenian) Auto caps at start", isCapsModeAutoShifted());
-            type("Hey. ");
-            assertFalse("(Armenian) No auto-caps after latin period", isCapsModeAutoShifted());
-            type("Hey\u0589");
-            assertFalse("(Armenian) No auto-caps directly after armenian period",
-                    isCapsModeAutoShifted());
-            type(" ");
-            assertTrue("(Armenian) Auto-caps after armenian period-whitespace",
-                    isCapsModeAutoShifted());
-        }
+    public void testOtherSentenceSeparators() {
+        changeLanguage("hy_AM");
+        assertTrue("(Armenian) Auto caps at start", isCapsModeAutoShifted());
+        type("Hey. ");
+        assertFalse("(Armenian) No auto-caps after latin period", isCapsModeAutoShifted());
+        type("Hey\u0589");
+        assertFalse("(Armenian) No auto-caps directly after armenian period",
+                isCapsModeAutoShifted());
+        type(" ");
+        assertTrue("(Armenian) Auto-caps after armenian period-whitespace",
+                isCapsModeAutoShifted());
     }
 }
diff --git a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderEncoderTests.java b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderEncoderTests.java
index 4b332ca..406046a 100644
--- a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderEncoderTests.java
+++ b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderEncoderTests.java
@@ -614,7 +614,8 @@
                 0 /* offset */, file.length(), true /* useFullEditDistance */,
                 Locale.ENGLISH, dictName, false /* isUpdatable */);
         for (final String word : words) {
-            final WordProperty wordProperty = binaryDictionary.getWordProperty(word);
+            final WordProperty wordProperty = binaryDictionary.getWordProperty(word,
+                    false /* isBeginningOfSentence */);
             assertEquals(word, wordProperty.mWord);
             assertEquals(UNIGRAM_FREQ, wordProperty.getProbability());
             if (shortcuts.containsKey(word)) {
diff --git a/tests/src/com/android/inputmethod/latin/utils/CapsModeUtilsTests.java b/tests/src/com/android/inputmethod/latin/utils/CapsModeUtilsTests.java
index 020d632..c746c83 100644
--- a/tests/src/com/android/inputmethod/latin/utils/CapsModeUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/CapsModeUtilsTests.java
@@ -22,6 +22,7 @@
 import android.text.TextUtils;
 
 import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
+import com.android.inputmethod.latin.utils.LocaleUtils;
 
 import java.util.Locale;
 
@@ -109,5 +110,19 @@
         allPathsForCaps("Liebe Sara,  \n  ", c | w | s, sp, false);
         allPathsForCaps("Liebe Sara  \n  ", c | w | s, sp, false);
         allPathsForCaps("Liebe Sara.\n  ", c | w | s, sp, false);
+
+        // Test armenian period
+        sp = job.runInLocale(res, LocaleUtils.constructLocaleFromString("hy_AM"));
+        assertTrue("Period is not sentence separator in Armenian",
+                !sp.isSentenceSeparator('.'));
+        assertTrue("Sentence separator is Armenian period in Armenian",
+                sp.isSentenceSeparator(0x589));
+        // No space : capitalize only if MODE_CHARACTERS
+        allPathsForCaps("Word", c, sp, false);
+        allPathsForCaps("Word.", c, sp, false);
+        // Space, but no armenian period : capitalize if MODE_WORDS but not SENTENCES
+        allPathsForCaps("Word. ", c | w, sp, false);
+        // Armenian period : capitalize if MODE_SENTENCES
+        allPathsForCaps("Word\u0589 ", c | w | s, sp, false);
     }
 }
diff --git a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/BinaryDictOffdeviceUtils.java b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/BinaryDictOffdeviceUtils.java
index 2cbc041..3ef03f4 100644
--- a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/BinaryDictOffdeviceUtils.java
+++ b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/BinaryDictOffdeviceUtils.java
@@ -26,11 +26,13 @@
 
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
+import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.util.ArrayList;
 
@@ -51,14 +53,17 @@
     public final static String ENCRYPTION = "encrypted";
 
     private final static int MAX_DECODE_DEPTH = 8;
+    private final static int COPY_BUFFER_SIZE = 8192;
 
     public static class DecoderChainSpec {
         ArrayList<String> mDecoderSpec = new ArrayList<>();
         File mFile;
+
         public DecoderChainSpec addStep(final String stepDescription) {
             mDecoderSpec.add(stepDescription);
             return this;
         }
+
         public String describeChain() {
             final StringBuilder s = new StringBuilder("raw");
             for (final String step : mDecoderSpec) {
@@ -70,13 +75,10 @@
     }
 
     public static void copy(final InputStream input, final OutputStream output) throws IOException {
-        final byte[] buffer = new byte[1000];
-        final BufferedInputStream in = new BufferedInputStream(input);
-        final BufferedOutputStream out = new BufferedOutputStream(output);
-        for (int readBytes = in.read(buffer); readBytes >= 0; readBytes = in.read(buffer))
+        final byte[] buffer = new byte[COPY_BUFFER_SIZE];
+        for (int readBytes = input.read(buffer); readBytes >= 0; readBytes = input.read(buffer)) {
             output.write(buffer, 0, readBytes);
-        in.close();
-        out.close();
+        }
     }
 
     /**
@@ -131,11 +133,15 @@
         try {
             final File dst = File.createTempFile(PREFIX, SUFFIX);
             dst.deleteOnExit();
-            final FileOutputStream dstStream = new FileOutputStream(dst);
-            copy(Compress.getUncompressedStream(new BufferedInputStream(new FileInputStream(src))),
-                    new BufferedOutputStream(dstStream)); // #copy() closes the streams
-            return dst;
-        } catch (IOException e) {
+            try (
+                final InputStream input = Compress.getUncompressedStream(
+                        new BufferedInputStream(new FileInputStream(src)));
+                final OutputStream output = new BufferedOutputStream(new FileOutputStream(dst))
+            ) {
+                copy(input, output);
+                return dst;
+            }
+        } catch (final IOException e) {
             // Could not uncompress the file: presumably the file is simply not a compressed file
             return null;
         }
@@ -150,20 +156,20 @@
         try {
             final File dst = File.createTempFile(PREFIX, SUFFIX);
             dst.deleteOnExit();
-            final FileOutputStream dstStream = new FileOutputStream(dst);
-            copy(Crypt.getDecryptedStream(new BufferedInputStream(new FileInputStream(src))),
-                    dstStream); // #copy() closes the streams
-            return dst;
-        } catch (IOException e) {
+            try (
+                final InputStream input = Crypt.getDecryptedStream(
+                        new BufferedInputStream(new FileInputStream(src)));
+                final OutputStream output = new BufferedOutputStream(new FileOutputStream(dst))
+            ) {
+                copy(input, output);
+                return dst;
+            }
+        } catch (final IOException e) {
             // Could not decrypt the file: presumably the file is simply not a crypted file
             return null;
         }
     }
 
-    static void crash(final String filename, final Exception e) {
-        throw new RuntimeException("Can't read file " + filename, e);
-    }
-
     static FusionDictionary getDictionary(final String filename, final boolean report) {
         final File file = new File(filename);
         if (report) {
@@ -172,45 +178,40 @@
         }
         try {
             if (XmlDictInputOutput.isXmlUnigramDictionary(filename)) {
-                if (report) System.out.println("Format : XML unigram list");
+                if (report) {
+                    System.out.println("Format : XML unigram list");
+                }
                 return XmlDictInputOutput.readDictionaryXml(
                         new BufferedInputStream(new FileInputStream(file)),
                         null /* shortcuts */, null /* bigrams */);
-            } else {
-                final DecoderChainSpec decodedSpec = getRawDictionaryOrNull(file);
-                if (null == decodedSpec) {
-                    crash(filename, new RuntimeException(
-                            filename + " does not seem to be a dictionary file"));
-                } else if (CombinedInputOutput.isCombinedDictionary(
-                        decodedSpec.mFile.getAbsolutePath())){
-                    if (report) {
-                        System.out.println("Format : Combined format");
-                        System.out.println("Packaging : " + decodedSpec.describeChain());
-                        System.out.println("Uncompressed size : " + decodedSpec.mFile.length());
-                    }
-                    return CombinedInputOutput.readDictionaryCombined(
-                            new BufferedInputStream(new FileInputStream(decodedSpec.mFile)));
-                } else {
-                    final DictDecoder dictDecoder = BinaryDictIOUtils.getDictDecoder(
-                            decodedSpec.mFile, 0, decodedSpec.mFile.length(),
-                            DictDecoder.USE_BYTEARRAY);
-                    if (report) {
-                        System.out.println("Format : Binary dictionary format");
-                        System.out.println("Packaging : " + decodedSpec.describeChain());
-                        System.out.println("Uncompressed size : " + decodedSpec.mFile.length());
-                    }
-                    return dictDecoder.readDictionaryBinary(false /* deleteDictIfBroken */);
+            }
+            final DecoderChainSpec decodedSpec = getRawDictionaryOrNull(file);
+            if (null == decodedSpec) {
+                throw new RuntimeException("Does not seem to be a dictionary file " + filename);
+            }
+            if (CombinedInputOutput.isCombinedDictionary(decodedSpec.mFile.getAbsolutePath())) {
+                if (report) {
+                    System.out.println("Format : Combined format");
+                    System.out.println("Packaging : " + decodedSpec.describeChain());
+                    System.out.println("Uncompressed size : " + decodedSpec.mFile.length());
+                }
+                try (final BufferedReader reader = new BufferedReader(
+                        new InputStreamReader(new FileInputStream(decodedSpec.mFile), "UTF-8"))) {
+                    return CombinedInputOutput.readDictionaryCombined(reader);
                 }
             }
-        } catch (IOException e) {
-            crash(filename, e);
-        } catch (SAXException e) {
-            crash(filename, e);
-        } catch (ParserConfigurationException e) {
-            crash(filename, e);
-        } catch (UnsupportedFormatException e) {
-            crash(filename, e);
+            final DictDecoder dictDecoder = BinaryDictIOUtils.getDictDecoder(
+                    decodedSpec.mFile, 0, decodedSpec.mFile.length(),
+                    DictDecoder.USE_BYTEARRAY);
+            if (report) {
+                System.out.println("Format : Binary dictionary format");
+                System.out.println("Packaging : " + decodedSpec.describeChain());
+                System.out.println("Uncompressed size : " + decodedSpec.mFile.length());
+            }
+            return dictDecoder.readDictionaryBinary(false /* deleteDictIfBroken */);
+        } catch (final IOException | SAXException | ParserConfigurationException |
+                UnsupportedFormatException e) {
+            throw new RuntimeException("Can't read file " + filename, e);
         }
-        return null;
     }
 }
diff --git a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/CombinedInputOutput.java b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/CombinedInputOutput.java
index 6a0e1b7..23cbee8 100644
--- a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/CombinedInputOutput.java
+++ b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/CombinedInputOutput.java
@@ -26,13 +26,9 @@
 import com.android.inputmethod.latin.utils.CombinedFormatUtils;
 
 import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
+import java.io.BufferedWriter;
 import java.io.FileReader;
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Writer;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.TreeSet;
@@ -57,27 +53,15 @@
      * @return true if the file is in the combined format, false otherwise
      */
     public static boolean isCombinedDictionary(final String filename) {
-        BufferedReader reader = null;
-        try {
-            reader = new BufferedReader(new FileReader(new File(filename)));
+        try (final BufferedReader reader = new BufferedReader(new FileReader(filename))) {
             String firstLine = reader.readLine();
             while (firstLine.startsWith(COMMENT_LINE_STARTER)) {
                 firstLine = reader.readLine();
             }
             return firstLine.matches(
                     "^" + CombinedFormatUtils.DICTIONARY_TAG + "=[^:]+(:[^=]+=[^:]+)*");
-        } catch (FileNotFoundException e) {
+        } catch (final IOException e) {
             return false;
-        } catch (IOException e) {
-            return false;
-        } finally {
-            if (reader != null) {
-                try {
-                    reader.close();
-                } catch (IOException e) {
-                    // do nothing
-                }
-            }
         }
     }
 
@@ -87,12 +71,11 @@
      * This is the public method that will read a combined file and return the corresponding memory
      * representation.
      *
-     * @param source the file to read the data from.
+     * @param reader the buffered reader to read the data from.
      * @return the in-memory representation of the dictionary.
      */
-    public static FusionDictionary readDictionaryCombined(final InputStream source)
+    public static FusionDictionary readDictionaryCombined(final BufferedReader reader)
             throws IOException {
-        final BufferedReader reader = new BufferedReader(new InputStreamReader(source, "UTF-8"));
         String headerLine = reader.readLine();
         while (headerLine.startsWith(COMMENT_LINE_STARTER)) {
             headerLine = reader.readLine();
@@ -218,11 +201,11 @@
     /**
      * Writes a dictionary to a combined file.
      *
-     * @param destination a destination stream to write to.
+     * @param destination a destination writer.
      * @param dict the dictionary to write.
      */
-    public static void writeDictionaryCombined(
-            final Writer destination, final FusionDictionary dict) throws IOException {
+    public static void writeDictionaryCombined(final BufferedWriter destination,
+            final FusionDictionary dict) throws IOException {
         final TreeSet<WordProperty> wordPropertiesInDict = new TreeSet<>();
         for (final WordProperty wordProperty : dict) {
             // This for ordering by frequency, then by asciibetic order
@@ -232,6 +215,5 @@
         for (final WordProperty wordProperty : wordPropertiesInDict) {
             destination.write(CombinedFormatUtils.formatWordProperty(wordProperty));
         }
-        destination.close();
     }
 }
diff --git a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Compress.java b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Compress.java
index b7f48b5..728a159 100644
--- a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Compress.java
+++ b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Compress.java
@@ -16,11 +16,6 @@
 
 package com.android.inputmethod.latin.dicttool;
 
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -32,8 +27,7 @@
         // This container class is not publicly instantiable.
     }
 
-    public static OutputStream getCompressedStream(final OutputStream out)
-        throws java.io.IOException {
+    public static OutputStream getCompressedStream(final OutputStream out) throws IOException {
         return new GZIPOutputStream(out);
     }
 
@@ -43,7 +37,6 @@
 
     static public class Compressor extends Dicttool.Command {
         public static final String COMMAND = "compress";
-        public static final String STDIN_OR_STDOUT = "-";
 
         public Compressor() {
         }
@@ -61,17 +54,18 @@
             }
             final String inFilename = mArgs.length >= 1 ? mArgs[0] : STDIN_OR_STDOUT;
             final String outFilename = mArgs.length >= 2 ? mArgs[1] : STDIN_OR_STDOUT;
-            final InputStream input = inFilename.equals(STDIN_OR_STDOUT) ? System.in
-                    : new BufferedInputStream(new FileInputStream(new File(inFilename)));
-            final OutputStream output = outFilename.equals(STDIN_OR_STDOUT) ? System.out
-                    : new BufferedOutputStream(new FileOutputStream(new File(outFilename)));
-            BinaryDictOffdeviceUtils.copy(input, new GZIPOutputStream(output));
+            try (
+                final InputStream input = getFileInputStreamOrStdIn(inFilename);
+                final OutputStream compressedOutput = getCompressedStream(
+                        getFileOutputStreamOrStdOut(outFilename))
+            ) {
+                BinaryDictOffdeviceUtils.copy(input, compressedOutput);
+            }
         }
     }
 
     static public class Uncompressor extends Dicttool.Command {
         public static final String COMMAND = "uncompress";
-        public static final String STDIN_OR_STDOUT = "-";
 
         public Uncompressor() {
         }
@@ -89,11 +83,13 @@
             }
             final String inFilename = mArgs.length >= 1 ? mArgs[0] : STDIN_OR_STDOUT;
             final String outFilename = mArgs.length >= 2 ? mArgs[1] : STDIN_OR_STDOUT;
-            final InputStream input = inFilename.equals(STDIN_OR_STDOUT) ? System.in
-                    : new BufferedInputStream(new FileInputStream(new File(inFilename)));
-            final OutputStream output = outFilename.equals(STDIN_OR_STDOUT) ? System.out
-                    : new BufferedOutputStream(new FileOutputStream(new File(outFilename)));
-            BinaryDictOffdeviceUtils.copy(new GZIPInputStream(input), output);
+            try (
+                final InputStream uncompressedInput = getUncompressedStream(
+                        getFileInputStreamOrStdIn(inFilename));
+                final OutputStream output = getFileOutputStreamOrStdOut(outFilename)
+            ) {
+                BinaryDictOffdeviceUtils.copy(uncompressedInput, output);
+            }
         }
     }
 }
diff --git a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/DictionaryMaker.java b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/DictionaryMaker.java
index 37c8d41..3d0557b 100644
--- a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/DictionaryMaker.java
+++ b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/DictionaryMaker.java
@@ -27,19 +27,23 @@
 import com.android.inputmethod.latin.makedict.Ver2DictEncoder;
 import com.android.inputmethod.latin.makedict.Ver4DictEncoder;
 
+import org.xml.sax.SAXException;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileWriter;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.util.Arrays;
 import java.util.LinkedList;
 
 import javax.xml.parsers.ParserConfigurationException;
 
-import org.xml.sax.SAXException;
-
 /**
  * Main class/method for DictionaryMaker.
  */
@@ -279,22 +283,21 @@
      */
     private static FusionDictionary readCombinedFile(final String combinedFilename)
         throws FileNotFoundException, IOException {
-        FileInputStream inStream = null;
-        try {
-            final File file = new File(combinedFilename);
-            inStream = new FileInputStream(file);
-            return CombinedInputOutput.readDictionaryCombined(inStream);
-        } finally {
-            if (null != inStream) {
-                try {
-                    inStream.close();
-                } catch (IOException e) {
-                    // do nothing
-                }
-            }
+        try (final BufferedReader reader = new BufferedReader(new InputStreamReader(
+                new FileInputStream(combinedFilename), "UTF-8"))
+        ) {
+            return CombinedInputOutput.readDictionaryCombined(reader);
         }
     }
 
+    private static BufferedInputStream getBufferedFileInputStream(final String filename)
+            throws FileNotFoundException {
+        if (filename == null) {
+            return null;
+        }
+        return new BufferedInputStream(new FileInputStream(filename));
+    }
+
     /**
      * Read a dictionary from a unigram XML file, and optionally a bigram XML file.
      *
@@ -310,12 +313,13 @@
     private static FusionDictionary readXmlFile(final String unigramXmlFilename,
             final String shortcutXmlFilename, final String bigramXmlFilename)
             throws FileNotFoundException, SAXException, IOException, ParserConfigurationException {
-        final FileInputStream unigrams = new FileInputStream(new File(unigramXmlFilename));
-        final FileInputStream shortcuts = null == shortcutXmlFilename ? null :
-                new FileInputStream(new File(shortcutXmlFilename));
-        final FileInputStream bigrams = null == bigramXmlFilename ? null :
-                new FileInputStream(new File(bigramXmlFilename));
-        return XmlDictInputOutput.readDictionaryXml(unigrams, shortcuts, bigrams);
+        try (
+            final BufferedInputStream unigrams = getBufferedFileInputStream(unigramXmlFilename);
+            final BufferedInputStream shortcuts = getBufferedFileInputStream(shortcutXmlFilename);
+            final BufferedInputStream bigrams = getBufferedFileInputStream(bigramXmlFilename);
+        ) {
+            return XmlDictInputOutput.readDictionaryXml(unigrams, shortcuts, bigrams);
+        }
     }
 
     /**
@@ -374,8 +378,9 @@
      */
     private static void writeXmlDictionary(final String outputFilename,
             final FusionDictionary dict) throws FileNotFoundException, IOException {
-        XmlDictInputOutput.writeDictionaryXml(new BufferedWriter(new FileWriter(outputFilename)),
-                dict);
+        try (final BufferedWriter writer = new BufferedWriter(new FileWriter(outputFilename))) {
+            XmlDictInputOutput.writeDictionaryXml(writer, dict);
+        }
     }
 
     /**
@@ -388,7 +393,8 @@
      */
     private static void writeCombinedDictionary(final String outputFilename,
             final FusionDictionary dict) throws FileNotFoundException, IOException {
-        CombinedInputOutput.writeDictionaryCombined(
-                new BufferedWriter(new FileWriter(outputFilename)), dict);
+        try (final BufferedWriter writer = new BufferedWriter(new FileWriter(outputFilename))) {
+            CombinedInputOutput.writeDictionaryCombined(writer, dict);
+        }
     }
 }
diff --git a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Dicttool.java b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Dicttool.java
index 8ae035f..e49b350 100644
--- a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Dicttool.java
+++ b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Dicttool.java
@@ -16,23 +16,63 @@
 
 package com.android.inputmethod.latin.dicttool;
 
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.util.Arrays;
 import java.util.HashMap;
 
 public class Dicttool {
 
     public static abstract class Command {
+        public static final String STDIN_OR_STDOUT = "-";
         protected String[] mArgs;
+
         public void setArgs(String[] args) throws IllegalArgumentException {
             mArgs = args;
         }
+
+        protected static InputStream getFileInputStreamOrStdIn(final String inFilename)
+                throws FileNotFoundException {
+            if (STDIN_OR_STDOUT.equals(inFilename)) {
+                return System.in;
+            }
+            return getFileInputStream(new File(inFilename));
+        }
+
+        protected static InputStream getFileInputStream(final File inFile)
+                throws FileNotFoundException {
+            return new BufferedInputStream(new FileInputStream(inFile));
+        }
+
+        protected static OutputStream getFileOutputStreamOrStdOut(final String outFilename)
+                throws FileNotFoundException {
+            if (STDIN_OR_STDOUT.equals(outFilename)) {
+                return System.out;
+            }
+            return getFileOutputStream(new File(outFilename));
+        }
+
+        protected static OutputStream getFileOutputStream(final File outFile)
+                throws FileNotFoundException {
+            return new BufferedOutputStream(new FileOutputStream(outFile));
+        }
+
         abstract public String getHelp();
         abstract public void run() throws Exception;
     }
+
     static HashMap<String, Class<? extends Command>> sCommands = new HashMap<>();
+
     static {
         CommandList.populate();
     }
+
     public static void addCommand(final String commandName, final Class<? extends Command> cls) {
         sCommands.put(commandName, cls);
     }
@@ -60,7 +100,7 @@
         return sCommands.containsKey(commandName);
     }
 
-    private Command getCommand(final String[] arguments) {
+    private static Command getCommand(final String[] arguments) {
         final String commandName = arguments[0];
         if (!isCommand(commandName)) {
             throw new RuntimeException("Unknown command : " + commandName);
@@ -76,7 +116,7 @@
      * @param arguments the arguments passed to dicttool.
      * @return 0 for success, an error code otherwise (always 1 at the moment)
      */
-    private int execute(final String[] arguments) {
+    private static int execute(final String[] arguments) {
         final Command command = getCommand(arguments);
         try {
             command.run();
@@ -95,6 +135,6 @@
             return;
         }
         // Exit with the success/error code from #execute() as status.
-        System.exit(new Dicttool().execute(arguments));
+        System.exit(execute(arguments));
     }
 }
diff --git a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Package.java b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Package.java
index dff3387..1f67982 100644
--- a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Package.java
+++ b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Package.java
@@ -21,8 +21,9 @@
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
 
 public class Package {
     private Package() {
@@ -86,9 +87,13 @@
             }
             System.out.println("Packaging : " + decodedSpec.describeChain());
             System.out.println("Uncompressed size : " + decodedSpec.mFile.length());
-            final FileOutputStream dstStream = new FileOutputStream(new File(mArgs[1]));
-            BinaryDictOffdeviceUtils.copy(new BufferedInputStream(
-                    new FileInputStream(decodedSpec.mFile)), new BufferedOutputStream(dstStream));
+            try (
+                final InputStream input = getFileInputStream(decodedSpec.mFile);
+                final OutputStream output = new BufferedOutputStream(
+                        getFileOutputStreamOrStdOut(mArgs[1]))
+            ) {
+                BinaryDictOffdeviceUtils.copy(input, output);
+            }
         }
     }
 }
diff --git a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/XmlDictInputOutput.java b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/XmlDictInputOutput.java
index 7435fa7..bdec447 100644
--- a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/XmlDictInputOutput.java
+++ b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/XmlDictInputOutput.java
@@ -23,13 +23,16 @@
 import com.android.inputmethod.latin.makedict.WeightedString;
 import com.android.inputmethod.latin.makedict.WordProperty;
 
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+import java.io.BufferedInputStream;
 import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
+import java.io.BufferedWriter;
+import java.io.FileInputStream;
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.Writer;
+import java.io.InputStreamReader;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.TreeSet;
@@ -38,10 +41,6 @@
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
 
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
 /**
  * Reads and writes XML files for a FusionDictionary.
  *
@@ -57,8 +56,6 @@
     private static final String WORD_ATTR = "word";
     private static final String NOT_A_WORD_ATTR = "not_a_word";
 
-    private static final String OPTIONS_KEY = "options";
-
     /**
      * SAX handler for a unigram XML file.
      */
@@ -120,7 +117,6 @@
                     final String attrName = attrs.getLocalName(attrIndex);
                     attributes.put(attrName, attrs.getValue(attrIndex));
                 }
-                final String optionsString = attributes.get(OPTIONS_KEY);
                 mDictionary = new FusionDictionary(new PtNodeArray(),
                         new DictionaryOptions(attributes));
             } else {
@@ -244,14 +240,13 @@
         protected int getValueFromFreqString(final String freqString) {
             if (WHITELIST_MARKER.equals(freqString)) {
                 return WHITELIST_FREQ_VALUE;
-            } else {
-                final int intValue = super.getValueFromFreqString(freqString);
-                if (intValue < MIN_FREQ || intValue > MAX_FREQ) {
-                    throw new RuntimeException("Shortcut freq out of range. Accepted range is "
-                            + MIN_FREQ + ".." + MAX_FREQ);
-                }
-                return intValue;
             }
+            final int intValue = super.getValueFromFreqString(freqString);
+            if (intValue < MIN_FREQ || intValue > MAX_FREQ) {
+                throw new RuntimeException("Shortcut freq out of range. Accepted range is "
+                        + MIN_FREQ + ".." + MAX_FREQ);
+            }
+            return intValue;
         }
 
         // As per getAssocMap(), this never returns null.
@@ -269,23 +264,12 @@
      * @return true if the file is in the unigram XML format, false otherwise
      */
     public static boolean isXmlUnigramDictionary(final String filename) {
-        BufferedReader reader = null;
-        try {
-            reader = new BufferedReader(new FileReader(new File(filename)));
+        try (final BufferedReader reader = new BufferedReader(
+                new InputStreamReader(new FileInputStream(filename), "UTF-8"))) {
             final String firstLine = reader.readLine();
             return firstLine.matches("^\\s*<wordlist .*>\\s*$");
-        } catch (FileNotFoundException e) {
+        } catch (final IOException e) {
             return false;
-        } catch (IOException e) {
-            return false;
-        } finally {
-            if (reader != null) {
-                try {
-                    reader.close();
-                } catch (IOException e) {
-                    // do nothing
-                }
-            }
         }
     }
 
@@ -300,8 +284,8 @@
      * @param bigrams the file to read the bigrams from, or null.
      * @return the in-memory representation of the dictionary.
      */
-    public static FusionDictionary readDictionaryXml(final InputStream unigrams,
-            final InputStream shortcuts, final InputStream bigrams)
+    public static FusionDictionary readDictionaryXml(final BufferedInputStream unigrams,
+            final BufferedInputStream shortcuts, final BufferedInputStream bigrams)
             throws SAXException, IOException, ParserConfigurationException {
         final SAXParserFactory factory = SAXParserFactory.newInstance();
         factory.setNamespaceAware(true);
@@ -350,8 +334,8 @@
      * @param destination a destination stream to write to.
      * @param dict the dictionary to write.
      */
-    public static void writeDictionaryXml(Writer destination, FusionDictionary dict)
-            throws IOException {
+    public static void writeDictionaryXml(final BufferedWriter destination,
+            final FusionDictionary dict) throws IOException {
         final TreeSet<WordProperty> wordPropertiesInDict = new TreeSet<>();
         for (WordProperty wordProperty : dict) {
             wordPropertiesInDict.add(wordProperty);
diff --git a/tools/dicttool/tests/com/android/inputmethod/latin/dicttool/BinaryDictOffdeviceUtilsTests.java b/tools/dicttool/tests/com/android/inputmethod/latin/dicttool/BinaryDictOffdeviceUtilsTests.java
index fccb654..0236a44 100644
--- a/tools/dicttool/tests/com/android/inputmethod/latin/dicttool/BinaryDictOffdeviceUtilsTests.java
+++ b/tools/dicttool/tests/com/android/inputmethod/latin/dicttool/BinaryDictOffdeviceUtilsTests.java
@@ -62,13 +62,13 @@
 
         final File dst = File.createTempFile("testGetRawDict", ".tmp");
         dst.deleteOnExit();
-
-        final OutputStream out = Compress.getCompressedStream(
+        try (final OutputStream out = Compress.getCompressedStream(
                 Compress.getCompressedStream(
                         Compress.getCompressedStream(
-                                new BufferedOutputStream(new FileOutputStream(dst)))));
-        final DictEncoder dictEncoder = new Ver2DictEncoder(out);
-        dictEncoder.writeDictionary(dict, new FormatOptions(2, false));
+                                new BufferedOutputStream(new FileOutputStream(dst)))))) {
+            final DictEncoder dictEncoder = new Ver2DictEncoder(out);
+            dictEncoder.writeDictionary(dict, new FormatOptions(2, false));
+        }
 
         // Test for an actually compressed dictionary and its contents
         final BinaryDictOffdeviceUtils.DecoderChainSpec decodeSpec =
@@ -96,11 +96,11 @@
         // Randomly create some 4k file containing garbage
         final File dst = File.createTempFile("testGetRawDict", ".tmp");
         dst.deleteOnExit();
-        final OutputStream out = new BufferedOutputStream(new FileOutputStream(dst));
-        for (int i = 0; i < 1024; ++i) {
-            out.write(0x12345678);
+        try (final OutputStream out = new BufferedOutputStream(new FileOutputStream(dst))) {
+            for (int i = 0; i < 1024; ++i) {
+                out.write(0x12345678);
+            }
         }
-        out.close();
 
         // Test that a random data file actually fails
         assertNull("Wrongly identified data file",
@@ -108,12 +108,12 @@
 
         final File gzDst = File.createTempFile("testGetRawDict", ".tmp");
         gzDst.deleteOnExit();
-        final OutputStream gzOut =
-                Compress.getCompressedStream(new BufferedOutputStream(new FileOutputStream(gzDst)));
-        for (int i = 0; i < 1024; ++i) {
-            gzOut.write(0x12345678);
+        try (final OutputStream gzOut = Compress.getCompressedStream(
+                new BufferedOutputStream(new FileOutputStream(gzDst)))) {
+            for (int i = 0; i < 1024; ++i) {
+                gzOut.write(0x12345678);
+            }
         }
-        gzOut.close();
 
         // Test that a compressed random data file actually fails
         assertNull("Wrongly identified data file",