diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index 550f5acf727735c0bde7e59dd14a3e9e8c4f3734..3d4e776a79b96987e840bedd829fa885a5c63ccc 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -424,5 +424,7 @@
             <enum name="number" value="9"  />
         </attr>
         <attr name="elementKeyboard" format="reference"/>
+        <!-- Enable proximity characters correction. Disabled by default. -->
+        <attr name="enableProximityCharsCorrection" format="boolean" />
     </declare-styleable>
 </resources>
diff --git a/java/res/xml-ar/keyboard_set.xml b/java/res/xml-ar/keyboard_set.xml
index 7b70f633caceb9ce4c6b21af1cd6a425c3f4c10c..c37d128d7ec24d8cc3dc46f2cc2ef2d3ab41a1bd 100644
--- a/java/res/xml-ar/keyboard_set.xml
+++ b/java/res/xml-ar/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="ar" >
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_arabic" />
+        latin:elementKeyboard="@xml/kbd_arabic"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-be/keyboard_set.xml b/java/res/xml-be/keyboard_set.xml
index 823234698dd2bf9e877bc45512ab9ecc16818388..1b865ede012db39cd0e5af24cac1d7f1fccf5710 100644
--- a/java/res/xml-be/keyboard_set.xml
+++ b/java/res/xml-be/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="be">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_east_slavic" />
+        latin:elementKeyboard="@xml/kbd_east_slavic"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-bg/keyboard_set.xml b/java/res/xml-bg/keyboard_set.xml
index 49914d54b6fbc2070b988592932d6d48ac7605dc..e824826b3920f12292d390efd3f3ed69170b5b9e 100644
--- a/java/res/xml-bg/keyboard_set.xml
+++ b/java/res/xml-bg/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="bg">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_bulgarian" />
+        latin:elementKeyboard="@xml/kbd_bulgarian"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-cs/keyboard_set.xml b/java/res/xml-cs/keyboard_set.xml
index b4535164b0e2866e6c8840c56f63ebf39bba66d4..6dea17aa5d78abacb1d84273cb9fc7434dee9e33 100644
--- a/java/res/xml-cs/keyboard_set.xml
+++ b/java/res/xml-cs/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="cs">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_qwertz" />
+        latin:elementKeyboard="@xml/kbd_qwertz"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-da/keyboard_set.xml b/java/res/xml-da/keyboard_set.xml
index 9b512ec6cef4a7871fbdfe6cd1763343360566b2..cc1096f3741aeccbbb9505cada547246d08a27e2 100644
--- a/java/res/xml-da/keyboard_set.xml
+++ b/java/res/xml-da/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="da">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_nordic" />
+        latin:elementKeyboard="@xml/kbd_nordic"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-de-rZZ/keyboard_set.xml b/java/res/xml-de-rZZ/keyboard_set.xml
index 635884d1db741596c812dc9a46860c6820d60753..e874bda5f10d3ceee6b53cf648d7770dd49ba1aa 100644
--- a/java/res/xml-de-rZZ/keyboard_set.xml
+++ b/java/res/xml-de-rZZ/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="de">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_qwerty" />
+        latin:elementKeyboard="@xml/kbd_qwerty"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-de/keyboard_set.xml b/java/res/xml-de/keyboard_set.xml
index 485e63f061f3eb4ae37bb986b41db63ba3059a6d..3b648e521000cbfbc2225659c4b1177b015580a2 100644
--- a/java/res/xml-de/keyboard_set.xml
+++ b/java/res/xml-de/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="de">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_qwertz" />
+        latin:elementKeyboard="@xml/kbd_qwertz"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-el/keyboard_set.xml b/java/res/xml-el/keyboard_set.xml
index 19ecb771b3a5ee5b055241bd67ef374d474240a1..5809e7f746bea2188c8c9e6f63bb708f5d6bb20f 100644
--- a/java/res/xml-el/keyboard_set.xml
+++ b/java/res/xml-el/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="el">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_greek" />
+        latin:elementKeyboard="@xml/kbd_greek"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-es/keyboard_set.xml b/java/res/xml-es/keyboard_set.xml
index 9cf208b402ee9594ca86cd4a7e2c90e389ce11ba..fd968fceb5c255685e961870030026b0b5dd52e7 100644
--- a/java/res/xml-es/keyboard_set.xml
+++ b/java/res/xml-es/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="es,es_US">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_spanish" />
+        latin:elementKeyboard="@xml/kbd_spanish"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_spanish_symbols" />
diff --git a/java/res/xml-et/keyboard_set.xml b/java/res/xml-et/keyboard_set.xml
index 9ccef8c817bbdf013914ccbe56efdeda473b0972..ddddcc64f1cef69e77b15c6716ddc33cdc05e783 100644
--- a/java/res/xml-et/keyboard_set.xml
+++ b/java/res/xml-et/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="et">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_nordic" />
+        latin:elementKeyboard="@xml/kbd_nordic"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-fa/keyboard_set.xml b/java/res/xml-fa/keyboard_set.xml
index cb62b0dae39a0b2fe949206970037bf92d11d20a..0d16f8d7e4577e03127ddcbcd2b5eaf8b060b49b 100644
--- a/java/res/xml-fa/keyboard_set.xml
+++ b/java/res/xml-fa/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="fa" >
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_farsi" />
+        latin:elementKeyboard="@xml/kbd_farsi"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-fi/keyboard_set.xml b/java/res/xml-fi/keyboard_set.xml
index 45968af909caf4776f83cbccb7c63fda1744fd39..c40e828d69da516385196c6c4cee7833f827dc01 100644
--- a/java/res/xml-fi/keyboard_set.xml
+++ b/java/res/xml-fi/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="fi">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_nordic" />
+        latin:elementKeyboard="@xml/kbd_nordic"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-fr-rCA/keyboard_set.xml b/java/res/xml-fr-rCA/keyboard_set.xml
index ea6ac8f261325ef6a88aa4cea686d90286fb0a4e..8d780f5442da73cec33f8a5228e01da6c91f90dc 100644
--- a/java/res/xml-fr-rCA/keyboard_set.xml
+++ b/java/res/xml-fr-rCA/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="fr_CA">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_qwerty" />
+        latin:elementKeyboard="@xml/kbd_qwerty"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-fr-rCH/keyboard_set.xml b/java/res/xml-fr-rCH/keyboard_set.xml
index 751900b88a17f25b73d45f5f4a8e009063e0480a..601d2bc6464b374a796967b0b76da4216fece5b9 100644
--- a/java/res/xml-fr-rCH/keyboard_set.xml
+++ b/java/res/xml-fr-rCH/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="fr_CH">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_qwertz" />
+        latin:elementKeyboard="@xml/kbd_qwertz"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-fr/keyboard_set.xml b/java/res/xml-fr/keyboard_set.xml
index fa1339b478691d9e5d464b3ed00729b5a884c1a6..4b827ca1bc973a68bb80155ea8092897d53aa9ee 100644
--- a/java/res/xml-fr/keyboard_set.xml
+++ b/java/res/xml-fr/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="fr">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_azerty" />
+        latin:elementKeyboard="@xml/kbd_azerty"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_azerty_symbols" />
diff --git a/java/res/xml-hi/keyboard_set.xml b/java/res/xml-hi/keyboard_set.xml
index 804323a318a48fe5c0fccce3ef760cac897ff951..cb4dece2de94ef2bf683c2ad0d23204cab094965 100644
--- a/java/res/xml-hi/keyboard_set.xml
+++ b/java/res/xml-hi/keyboard_set.xml
@@ -23,6 +23,23 @@
     latin:keyboardLocale="hi">
     <Element
         latin:elementName="alphabet"
+        latin:elementKeyboard="@xml/kbd_hindi"
+        latin:enableProximityCharsCorrection="true" />
+    <Element
+        latin:elementName="alphabetAutomaticShifted"
+        latin:elementKeyboard="@xml/kbd_hindi"
+        latin:enableProximityCharsCorrection="true" />
+    <!-- On these shifted alphabet layouts the proximity characters correction should be disabled
+         because the letters on these layouts aren't the ones in different case of the above
+         unshifted layouts. -->
+    <Element
+        latin:elementName="alphabetManualShifted"
+        latin:elementKeyboard="@xml/kbd_hindi" />
+    <Element
+        latin:elementName="alphabetShiftLocked"
+        latin:elementKeyboard="@xml/kbd_hindi" />
+    <Element
+        latin:elementName="alphabetShiftLockShifted"
         latin:elementKeyboard="@xml/kbd_hindi" />
     <Element
         latin:elementName="symbols"
diff --git a/java/res/xml-hr/keyboard_set.xml b/java/res/xml-hr/keyboard_set.xml
index e17aefdf6aa8f498c572e4a97fd4b1f481f92108..511644077f1cf88f96e9762e8278c72a7627502a 100644
--- a/java/res/xml-hr/keyboard_set.xml
+++ b/java/res/xml-hr/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="hr">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_qwertz" />
+        latin:elementKeyboard="@xml/kbd_qwertz"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-hu/keyboard_set.xml b/java/res/xml-hu/keyboard_set.xml
index 0f6e5759e35efdbdda778d1f9e205632151f2345..2139ac74670600c89e0ac3cdbd96a0b31abe8e2e 100644
--- a/java/res/xml-hu/keyboard_set.xml
+++ b/java/res/xml-hu/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="hu">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_qwertz" />
+        latin:elementKeyboard="@xml/kbd_qwertz"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-is/keyboard_set.xml b/java/res/xml-is/keyboard_set.xml
index 077bc6b277616cd566ffc03767a81835e0e9a55d..c2ac944897318ce067a989b1cb409616a8654093 100644
--- a/java/res/xml-is/keyboard_set.xml
+++ b/java/res/xml-is/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="is">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_nordic" />
+        latin:elementKeyboard="@xml/kbd_nordic"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-iw/keyboard_set.xml b/java/res/xml-iw/keyboard_set.xml
index 501ba96ee20f9516fa6d1236f388097b8b7b3cc5..d1da41a6b57cf4c958d1a15f91c3a091ed8b4789 100644
--- a/java/res/xml-iw/keyboard_set.xml
+++ b/java/res/xml-iw/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="iw">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_hebrew" />
+        latin:elementKeyboard="@xml/kbd_hebrew"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-ka/keyboard_set.xml b/java/res/xml-ka/keyboard_set.xml
index 1b0bc2df63f1c5d64f892bad5b75fd46ced2d92f..2be94689fc0f3863a38cf61f9e58dd8d074841b4 100644
--- a/java/res/xml-ka/keyboard_set.xml
+++ b/java/res/xml-ka/keyboard_set.xml
@@ -23,6 +23,23 @@
     latin:keyboardLocale="ka">
     <Element
         latin:elementName="alphabet"
+        latin:elementKeyboard="@xml/kbd_georgian"
+        latin:enableProximityCharsCorrection="true" />
+    <Element
+        latin:elementName="alphabetAutomaticShifted"
+        latin:elementKeyboard="@xml/kbd_georgian"
+        latin:enableProximityCharsCorrection="true" />
+    <!-- On these shifted alphabet layouts the proximity characters correction should be disabled
+         because the letters on these layouts aren't the ones in different case of the above
+         unshifted layouts. -->
+    <Element
+        latin:elementName="alphabetManualShifted"
+        latin:elementKeyboard="@xml/kbd_georgian" />
+    <Element
+        latin:elementName="alphabetShiftLocked"
+        latin:elementKeyboard="@xml/kbd_georgian" />
+    <Element
+        latin:elementName="alphabetShiftLockShifted"
         latin:elementKeyboard="@xml/kbd_georgian" />
     <Element
         latin:elementName="symbols"
diff --git a/java/res/xml-ky/keyboard_set.xml b/java/res/xml-ky/keyboard_set.xml
index 71215c5e4e63bca893cff2d51c222cd97952b66a..0226bda5fc05088aa0ca73a29f49b1de0063ff20 100644
--- a/java/res/xml-ky/keyboard_set.xml
+++ b/java/res/xml-ky/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="ky">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_east_slavic" />
+        latin:elementKeyboard="@xml/kbd_east_slavic"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-mk/keyboard_set.xml b/java/res/xml-mk/keyboard_set.xml
index 5eabe8c6b6d40388035619bd1477dd2cb081716e..93874892e575cfbb62c51dd62d1c5ec92f0aa1f5 100644
--- a/java/res/xml-mk/keyboard_set.xml
+++ b/java/res/xml-mk/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="mk">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_south_slavic" />
+        latin:elementKeyboard="@xml/kbd_south_slavic"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-nb/keyboard_set.xml b/java/res/xml-nb/keyboard_set.xml
index 2d585a90878c98961268c4ee90cee641131a3bda..1675ed293f6a560f5123f795493bcfd6aeb850d2 100644
--- a/java/res/xml-nb/keyboard_set.xml
+++ b/java/res/xml-nb/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="nb">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_nordic" />
+        latin:elementKeyboard="@xml/kbd_nordic"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-pl/keyboard_set.xml b/java/res/xml-pl/keyboard_set.xml
index 6d2737929868ddddd516866f5c0789690e8b728d..fb0d13b9825711dccb7f83f7567c964fa1cdd816 100644
--- a/java/res/xml-pl/keyboard_set.xml
+++ b/java/res/xml-pl/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="pl">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_qwerty" />
+        latin:elementKeyboard="@xml/kbd_qwerty"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-pt/keyboard_set.xml b/java/res/xml-pt/keyboard_set.xml
index 65f9634ceb59cf4000683ca22400216b70f941df..f8140aac1e099a71949e38119ad48379170b260e 100644
--- a/java/res/xml-pt/keyboard_set.xml
+++ b/java/res/xml-pt/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="pt">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_qwerty" />
+        latin:elementKeyboard="@xml/kbd_qwerty"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-ro/keyboard_set.xml b/java/res/xml-ro/keyboard_set.xml
index 6c34966d0e6e3040ca60281bcbbd78dec3292ecc..73030fdc1553f727c337a2a3899d12babc5ab759 100644
--- a/java/res/xml-ro/keyboard_set.xml
+++ b/java/res/xml-ro/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="ro">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_qwerty" />
+        latin:elementKeyboard="@xml/kbd_qwerty"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-ru/keyboard_set.xml b/java/res/xml-ru/keyboard_set.xml
index 76daf32a7ee4c6bb9e8c2a0a1a07686d08eeeaf5..393d58ef1b06bc72b3ad124c6ffb633feeb5fef7 100644
--- a/java/res/xml-ru/keyboard_set.xml
+++ b/java/res/xml-ru/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="ru">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_east_slavic" />
+        latin:elementKeyboard="@xml/kbd_east_slavic"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-sk/keyboard_set.xml b/java/res/xml-sk/keyboard_set.xml
index b283d968ab350d44550fc193fd756ba6641ce8cf..db27b6107cebdbc3ee9519f18ca2c4b40f392d83 100644
--- a/java/res/xml-sk/keyboard_set.xml
+++ b/java/res/xml-sk/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="sk">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_qwerty" />
+        latin:elementKeyboard="@xml/kbd_qwerty"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-sl/keyboard_set.xml b/java/res/xml-sl/keyboard_set.xml
index dbb2782f081bfd142103a8243187096febdaa651..31f4714a92b4e77bd8ddfce95c174e601a115523 100644
--- a/java/res/xml-sl/keyboard_set.xml
+++ b/java/res/xml-sl/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="sl">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_qwerty" />
+        latin:elementKeyboard="@xml/kbd_qwerty"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-sr/keyboard_set.xml b/java/res/xml-sr/keyboard_set.xml
index 71dedf49710fc622a450317a36ac331c3eb528f0..f59f3a99df914d562bbfb818fe061a3953e8d324 100644
--- a/java/res/xml-sr/keyboard_set.xml
+++ b/java/res/xml-sr/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="sr">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_south_slavic" />
+        latin:elementKeyboard="@xml/kbd_south_slavic"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-sv/keyboard_set.xml b/java/res/xml-sv/keyboard_set.xml
index 7135fc54b5ad95a35818c4847486347a877738d7..2b106e0dc8b2cd9d0a73aab703c8a3eabf445c0d 100644
--- a/java/res/xml-sv/keyboard_set.xml
+++ b/java/res/xml-sv/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="sv">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_nordic" />
+        latin:elementKeyboard="@xml/kbd_nordic"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-th/keyboard_set.xml b/java/res/xml-th/keyboard_set.xml
index 99d75fe805234e3a3897ecd063ff961858fc551d..7362d8724da05a8859ab2d87462f58b1a33dac2c 100644
--- a/java/res/xml-th/keyboard_set.xml
+++ b/java/res/xml-th/keyboard_set.xml
@@ -23,6 +23,23 @@
     latin:keyboardLocale="th">
     <Element
         latin:elementName="alphabet"
+        latin:elementKeyboard="@xml/kbd_thai"
+        latin:enableProximityCharsCorrection="true" />
+    <Element
+        latin:elementName="alphabetAutomaticShifted"
+        latin:elementKeyboard="@xml/kbd_thai"
+        latin:enableProximityCharsCorrection="true" />
+    <!-- On these shifted alphabet layouts the proximity characters correction should be disabled
+         because the letters on these layouts aren't the ones in different case of the above
+         unshifted layouts. -->
+    <Element
+        latin:elementName="alphabetManualShifted"
+        latin:elementKeyboard="@xml/kbd_thai" />
+    <Element
+        latin:elementName="alphabetShiftLocked"
+        latin:elementKeyboard="@xml/kbd_thai" />
+    <Element
+        latin:elementName="alphabetShiftLockShifted"
         latin:elementKeyboard="@xml/kbd_thai" />
     <Element
         latin:elementName="symbols"
diff --git a/java/res/xml-tr/keyboard_set.xml b/java/res/xml-tr/keyboard_set.xml
index da79758ecf78531f3a0e92e8ece447155303ff4b..01822a933108d13ddf419a31459cc2c67ecff842 100644
--- a/java/res/xml-tr/keyboard_set.xml
+++ b/java/res/xml-tr/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="tr">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_qwerty" />
+        latin:elementKeyboard="@xml/kbd_qwerty"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-uk/keyboard_set.xml b/java/res/xml-uk/keyboard_set.xml
index a7cfad162002e6fe2b7c888d63dee06d746163ff..d782c98235540499b9ba5b8cdff811f15cb10cc6 100644
--- a/java/res/xml-uk/keyboard_set.xml
+++ b/java/res/xml-uk/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="uk">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_east_slavic" />
+        latin:elementKeyboard="@xml/kbd_east_slavic"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml-vi/keyboard_set.xml b/java/res/xml-vi/keyboard_set.xml
index 6d38eb1b4f323f3d590d2ec4a1ddca096959ec66..e5f744f7a7978a77454a7248124c9fde70127303 100644
--- a/java/res/xml-vi/keyboard_set.xml
+++ b/java/res/xml-vi/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="vi">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_qwerty" />
+        latin:elementKeyboard="@xml/kbd_qwerty"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/res/xml/keyboard_set.xml b/java/res/xml/keyboard_set.xml
index 1398b137c3bbb12f5b7348b53350c2857bdda4ac..83f9ea01ce62a64d6e9e8b9716edb91a3559df7a 100644
--- a/java/res/xml/keyboard_set.xml
+++ b/java/res/xml/keyboard_set.xml
@@ -23,7 +23,8 @@
     latin:keyboardLocale="en_GB,en_US">
     <Element
         latin:elementName="alphabet"
-        latin:elementKeyboard="@xml/kbd_qwerty" />
+        latin:elementKeyboard="@xml/kbd_qwerty"
+        latin:enableProximityCharsCorrection="true" />
     <Element
         latin:elementName="symbols"
         latin:elementKeyboard="@xml/kbd_symbols" />
diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java
index bc48b85ef7fab0bdfd03ceacc50a2f65fa5d7914..67e4e4a960b25d3d06f47315d08d6528833de8e8 100644
--- a/java/src/com/android/inputmethod/keyboard/Keyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java
@@ -130,6 +130,7 @@ public class Keyboard {
     private final HashMap<Integer, Key> mKeyCache = new HashMap<Integer, Key>();
 
     private final ProximityInfo mProximityInfo;
+    private final boolean mProximityCharsCorrectionEnabled;
 
     public Keyboard(Params params) {
         mId = params.mId;
@@ -153,6 +154,19 @@ public class Keyboard {
         mProximityInfo = new ProximityInfo(params.mId.mLocale.toString(),
                 params.GRID_WIDTH, params.GRID_HEIGHT, mOccupiedWidth, mOccupiedHeight,
                 mMostCommonKeyWidth, mMostCommonKeyHeight, mKeys, params.mTouchPositionCorrection);
+        mProximityCharsCorrectionEnabled = params.mProximityCharsCorrectionEnabled;
+    }
+
+    public boolean hasProximityCharsCorrection(int code) {
+        if (!mProximityCharsCorrectionEnabled) {
+            return false;
+        }
+        // Note: The native code has the main keyboard layout only at this moment.
+        // TODO: Figure out how to handle proximity characters information of all layouts.
+        final boolean canAssumeNativeHasProximityCharsInfoOfAllKeys = (
+                mId.mElementId == KeyboardId.ELEMENT_ALPHABET
+                || mId.mElementId == KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED);
+        return canAssumeNativeHasProximityCharsInfoOfAllKeys || Character.isLetter(code);
     }
 
     public ProximityInfo getProximityInfo() {
@@ -230,6 +244,8 @@ public class Keyboard {
         public int mMostCommonKeyHeight = 0;
         public int mMostCommonKeyWidth = 0;
 
+        public boolean mProximityCharsCorrectionEnabled;
+
         public final TouchPositionCorrection mTouchPositionCorrection =
                 new TouchPositionCorrection();
 
@@ -647,6 +663,10 @@ public class Keyboard {
             mParams.mTouchPositionCorrection.setEnabled(enabled);
         }
 
+        public void setProximityCharsCorrectionEnabled(boolean enabled) {
+            mParams.mProximityCharsCorrectionEnabled = enabled;
+        }
+
         public Keyboard build() {
             return new Keyboard(mParams);
         }
@@ -753,9 +773,9 @@ public class Keyboard {
                 params.mMaxMoreKeysKeyboardColumn = keyAttr.getInt(
                         R.styleable.Keyboard_Key_maxMoreKeysColumn, 5);
 
+                params.mThemeId = keyboardAttr.getInt(R.styleable.Keyboard_themeId, 0);
                 params.mIconsSet.loadIcons(keyboardAttr);
 
-                params.mThemeId = keyboardAttr.getInt(R.styleable.Keyboard_themeId, 0);
                 final int resourceId = keyboardAttr.getResourceId(
                         R.styleable.Keyboard_touchPositionCorrectionData, 0);
                 params.mTouchPositionCorrection.setEnabled(resourceId != 0);
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSet.java b/java/src/com/android/inputmethod/keyboard/KeyboardSet.java
index bb11a9b77a7fde8fef78efd12c875660ecf3aa47..1bf2fc04eadb28f50d115e5fa2527b437aacf87c 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardSet.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardSet.java
@@ -28,6 +28,7 @@ import android.view.inputmethod.EditorInfo;
 
 import com.android.inputmethod.compat.EditorInfoCompatUtils;
 import com.android.inputmethod.compat.InputTypeCompatUtils;
+import com.android.inputmethod.keyboard.KeyboardSet.Params.ElementParams;
 import com.android.inputmethod.latin.LatinIME;
 import com.android.inputmethod.latin.LatinImeLogger;
 import com.android.inputmethod.latin.LocaleUtils;
@@ -53,7 +54,7 @@ public class KeyboardSet {
     private static final String TAG = KeyboardSet.class.getSimpleName();
     private static final boolean DEBUG_CACHE = LatinImeLogger.sDBG;
 
-    private static final String TAG_KEYBOARD_SET = TAG;
+    private static final String TAG_KEYBOARD_SET = "KeyboardSet";
     private static final String TAG_ELEMENT = "Element";
 
     private final Context mContext;
@@ -104,10 +105,14 @@ public class KeyboardSet {
         Locale mLocale;
         int mOrientation;
         int mWidth;
-        // KeyboardSet element id to keyboard layout XML id map.
-        final HashMap<Integer, Integer> mKeyboardSetElementIdToXmlIdMap =
-                new HashMap<Integer, Integer>();
-        Params() {}
+        // KeyboardSet element id to element's parameters map.
+        final HashMap<Integer, ElementParams> mKeyboardSetElementIdToParamsMap =
+                new HashMap<Integer, ElementParams>();
+
+        static class ElementParams {
+            int mKeyboardXmlId;
+            boolean mProximityCharsCorrectionEnabled;
+        }
     }
 
     public static void clearKeyboardCache() {
@@ -141,20 +146,21 @@ public class KeyboardSet {
             break;
         }
 
-        Integer keyboardXmlId = mParams.mKeyboardSetElementIdToXmlIdMap.get(keyboardSetElementId);
-        if (keyboardXmlId == null) {
-            keyboardXmlId = mParams.mKeyboardSetElementIdToXmlIdMap.get(
+        ElementParams elementParams = mParams.mKeyboardSetElementIdToParamsMap.get(
+                keyboardSetElementId);
+        if (elementParams == null) {
+            elementParams = mParams.mKeyboardSetElementIdToParamsMap.get(
                     KeyboardId.ELEMENT_ALPHABET);
         }
         final KeyboardId id = getKeyboardId(keyboardSetElementId);
         try {
-            return getKeyboard(mContext, keyboardXmlId, id);
+            return getKeyboard(mContext, elementParams, id);
         } catch (RuntimeException e) {
             throw new KeyboardSetException(e, id);
         }
     }
 
-    private Keyboard getKeyboard(Context context, int keyboardXmlId, KeyboardId id) {
+    private Keyboard getKeyboard(Context context, ElementParams elementParams, KeyboardId id) {
         final Resources res = context.getResources();
         final SoftReference<Keyboard> ref = sKeyboardCache.get(id);
         Keyboard keyboard = (ref == null) ? null : ref.get();
@@ -166,8 +172,10 @@ public class KeyboardSet {
                 if (id.isAlphabetKeyboard()) {
                     builder.setAutoGenerate(sKeysCache);
                 }
-                builder.load(keyboardXmlId, id);
+                builder.load(elementParams.mKeyboardXmlId, id);
                 builder.setTouchPositionCorrectionEnabled(mParams.mTouchPositionCorrectionEnabled);
+                builder.setProximityCharsCorrectionEnabled(
+                        elementParams.mProximityCharsCorrectionEnabled);
                 keyboard = builder.build();
             } finally {
                 LocaleUtils.setSystemLocale(res, savedLocale);
@@ -331,11 +339,14 @@ public class KeyboardSet {
                         TAG_ELEMENT, parser);
                 XmlParseUtils.checkEndTag(TAG_ELEMENT, parser);
 
+                final ElementParams elementParams = new ElementParams();
                 final int elementName = a.getInt(
                         R.styleable.KeyboardSet_Element_elementName, 0);
-                final int elementKeyboard = a.getResourceId(
+                elementParams.mKeyboardXmlId = a.getResourceId(
                         R.styleable.KeyboardSet_Element_elementKeyboard, 0);
-                mParams.mKeyboardSetElementIdToXmlIdMap.put(elementName, elementKeyboard);
+                elementParams.mProximityCharsCorrectionEnabled = a.getBoolean(
+                        R.styleable.KeyboardSet_Element_enableProximityCharsCorrection, false);
+                mParams.mKeyboardSetElementIdToParamsMap.put(elementName, elementParams);
             } finally {
                 a.recycle();
             }
diff --git a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java
index 2495b547271609f86001191d30728a2affd5ee50..e60fc9598f70bbf4c24ad31d449682741cb43d96 100644
--- a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java
@@ -47,7 +47,9 @@ public class MoreKeysKeyboardView extends KeyboardView implements MoreKeysPanel
             new KeyboardActionListener.Adapter() {
         @Override
         public void onCodeInput(int primaryCode, int x, int y) {
-            mListener.onCodeInput(primaryCode, x, y);
+            // Because a more keys keyboard doesn't need proximity characters correction, we don't
+            // send touch event coordinates.
+            mListener.onCodeInput(primaryCode, NOT_A_TOUCH_COORDINATE, NOT_A_TOUCH_COORDINATE);
         }
 
         @Override
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 86c15395848f778e0c72c7913fb3332a69317b71..9390571ebb27ec50461a1e788657a69b3a27c539 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1318,7 +1318,13 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
             if (mSettingsValues.isWordSeparator(primaryCode)) {
                 didAutoCorrect = handleSeparator(primaryCode, x, y, spaceState);
             } else {
-                handleCharacter(primaryCode, x, y, spaceState);
+                final Keyboard keyboard = mKeyboardSwitcher.getKeyboard();
+                if (keyboard != null && keyboard.hasProximityCharsCorrection(primaryCode)) {
+                    handleCharacter(primaryCode, x, y, spaceState);
+                } else {
+                    handleCharacter(primaryCode, NOT_A_TOUCH_COORDINATE, NOT_A_TOUCH_COORDINATE,
+                            spaceState);
+                }
             }
             mExpectingUpdateSelection = true;
             mShouldSwitchToLastSubtype = true;