diff --git a/java/src/com/android/inputmethod/latin/SynchronouslyLoadedUserDictionary.java b/java/src/com/android/inputmethod/latin/SynchronouslyLoadedUserDictionary.java
index 4a812b3a931bc09cd0222fbe05fa46fd0552c042..b526fe5103c79dde57d0a53bcf582ea52066a54d 100644
--- a/java/src/com/android/inputmethod/latin/SynchronouslyLoadedUserDictionary.java
+++ b/java/src/com/android/inputmethod/latin/SynchronouslyLoadedUserDictionary.java
@@ -23,7 +23,12 @@ import com.android.inputmethod.keyboard.ProximityInfo;
 public class SynchronouslyLoadedUserDictionary extends UserDictionary {
 
     public SynchronouslyLoadedUserDictionary(final Context context, final String locale) {
-        super(context, locale);
+        this(context, locale, false);
+    }
+
+    public SynchronouslyLoadedUserDictionary(final Context context, final String locale,
+            final boolean alsoUseMoreRestrictiveLocales) {
+        super(context, locale, alsoUseMoreRestrictiveLocales);
     }
 
     @Override
diff --git a/java/src/com/android/inputmethod/latin/UserDictionary.java b/java/src/com/android/inputmethod/latin/UserDictionary.java
index d696a6158e35cf327e0ff7b8378d3788b351f508..67da4fa5020f3c9b99e777d9a2203146d6dba486 100644
--- a/java/src/com/android/inputmethod/latin/UserDictionary.java
+++ b/java/src/com/android/inputmethod/latin/UserDictionary.java
@@ -29,6 +29,8 @@ import android.text.TextUtils;
 
 import com.android.inputmethod.keyboard.ProximityInfo;
 
+import java.util.Arrays;
+
 public class UserDictionary extends ExpandableDictionary {
 
     private static final String[] PROJECTION_QUERY = {
@@ -44,11 +46,18 @@ public class UserDictionary extends ExpandableDictionary {
 
     private ContentObserver mObserver;
     final private String mLocale;
+    final private boolean mAlsoUseMoreRestrictiveLocales;
+
+    public UserDictionary(final Context context, final String locale) {
+        this(context, locale, false);
+    }
 
-    public UserDictionary(Context context, String locale) {
+    public UserDictionary(final Context context, final String locale,
+            final boolean alsoUseMoreRestrictiveLocales) {
         super(context, Suggest.DIC_USER);
         if (null == locale) throw new NullPointerException(); // Catch the error earlier
         mLocale = locale;
+        mAlsoUseMoreRestrictiveLocales = alsoUseMoreRestrictiveLocales;
         // Perform a managed query. The Activity will handle closing and re-querying the cursor
         // when needed.
         ContentResolver cres = context.getContentResolver();
@@ -81,12 +90,13 @@ public class UserDictionary extends ExpandableDictionary {
         // For this example, we'll look at the "en_US_POSIX" case.
         final String[] localeElements =
                 TextUtils.isEmpty(mLocale) ? new String[] {} : mLocale.split("_", 3);
+        final int length = localeElements.length;
 
         final StringBuilder request = new StringBuilder("(locale is NULL)");
         String localeSoFar = "";
         // At start, localeElements = ["en", "US", "POSIX"] ; localeSoFar = "" ;
         // and request = "(locale is NULL)"
-        for (int i = 0; i < localeElements.length; ++i) {
+        for (int i = 0; i < length; ++i) {
             // i | localeSoFar    | localeElements
             // 0 | ""             | ["en", "US", "POSIX"]
             // 1 | "en_"          | ["en", "US", "POSIX"]
@@ -101,9 +111,29 @@ public class UserDictionary extends ExpandableDictionary {
         }
         // At the end, localeElements = ["en", "en_US", "en_US_POSIX"]; localeSoFar = en_US_POSIX_"
         // and request = "(locale is NULL) or (locale=?) or (locale=?) or (locale=?)"
-        Cursor cursor = getContext().getContentResolver()
+
+        final String[] requestArguments;
+        // If length == 3, we already have all the arguments we need (common prefix is meaningless
+        // inside variants
+        if (mAlsoUseMoreRestrictiveLocales && length < 3) {
+            request.append(" or (locale like ?)");
+            // The following creates an array with one more (null) position
+            final String[] localeElementsWithMoreRestrictiveLocalesIncluded =
+                    Arrays.copyOf(localeElements, length + 1);
+            localeElementsWithMoreRestrictiveLocalesIncluded[length] =
+                    localeElements[length - 1] + "_%";
+            requestArguments = localeElementsWithMoreRestrictiveLocalesIncluded;
+            // If for example localeElements = ["en"]
+            // then requestArguments = ["en", "en_%"]
+            // and request = (locale is NULL) or (locale=?) or (locale like ?)
+            // If localeElements = ["en", "en_US"]
+            // then requestArguments = ["en", "en_US", "en_US_%"]
+        } else {
+            requestArguments = localeElements;
+        }
+        final Cursor cursor = getContext().getContentResolver()
                 .query(Words.CONTENT_URI, PROJECTION_QUERY, request.toString(),
-                        localeElements, null);
+                        requestArguments, null);
         addWords(cursor);
     }
 
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
index bf2e90dca3009c406f533b69408457fba923a4ae..1e5b877631f4ba965d836794fa4aa5f4ead52835 100644
--- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
+++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
@@ -237,7 +237,7 @@ public class AndroidSpellCheckerService extends SpellCheckerService {
         final String localeStr = locale.toString();
         Dictionary userDict = mUserDictionaries.get(localeStr);
         if (null == userDict) {
-            userDict = new SynchronouslyLoadedUserDictionary(this, localeStr);
+            userDict = new SynchronouslyLoadedUserDictionary(this, localeStr, true);
             mUserDictionaries.put(localeStr, userDict);
         }
         dictionaryCollection.addDictionary(userDict);