diff --git a/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java
index 34308dfb38e8ce7db8c9e6232b218193741de16c..10e511eaff82c180664ed6593b0acdc1cef08f0b 100644
--- a/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java
@@ -52,6 +52,9 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary {
     /** The number of contacts in the most recent dictionary rebuild. */
     static private int sContactCountAtLastRebuild = 0;
 
+    /** The locale for this contacts dictionary. Controls name bigram predictions. */
+    public final Locale mLocale;
+
     private ContentObserver mObserver;
 
     /**
@@ -61,6 +64,7 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary {
 
     public ContactsBinaryDictionary(final Context context, final int dicTypeId, Locale locale) {
         super(context, getFilenameWithLocale(NAME, locale.toString()), dicTypeId);
+        mLocale = locale;
         mUseFirstLastBigrams = useFirstLastBigramsForLocale(locale);
         registerObserver(context);
 
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 7092b4e7e04e6db9f8d84e7ac7e1f74acc5de2db..77acf941d1aeddc3ae9c5fbd1f611f65b181c8b2 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -505,9 +505,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
     /**
      * Resets the contacts dictionary in mSuggest according to the user settings.
      *
-     * This method takes an optional contacts dictionary to use. Since the contacts dictionary
-     * does not depend on the locale, it can be reused across different instances of Suggest.
-     * The dictionary will also be opened or closed as necessary depending on the settings.
+     * This method takes an optional contacts dictionary to use when the locale hasn't changed
+     * since the contacts dictionary can be opened or closed as necessary depending on the settings.
      *
      * @param oldContactsDictionary an optional dictionary to use, or null
      */
@@ -520,21 +519,35 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
             // so it's safe to call it anyways.
             if (null != oldContactsDictionary) oldContactsDictionary.close();
             dictionaryToUse = null;
-        } else if (null != oldContactsDictionary) {
-            // Make sure the old contacts dictionary is opened. If it is already open, this is a
-            // no-op, so it's safe to call it anyways.
-            if (USE_BINARY_CONTACTS_DICTIONARY) {
-                ((ContactsBinaryDictionary)oldContactsDictionary).reopen(this);
-            } else {
-                ((ContactsDictionary)oldContactsDictionary).reopen(this);
-            }
-            dictionaryToUse = oldContactsDictionary;
         } else {
-            if (USE_BINARY_CONTACTS_DICTIONARY) {
-                dictionaryToUse = new ContactsBinaryDictionary(this, Suggest.DIC_CONTACTS,
-                        mSubtypeSwitcher.getCurrentSubtypeLocale());
+            final Locale locale = mSubtypeSwitcher.getCurrentSubtypeLocale();
+            if (null != oldContactsDictionary) {
+                if (USE_BINARY_CONTACTS_DICTIONARY) {
+                    ContactsBinaryDictionary oldContactsBinaryDictionary =
+                            (ContactsBinaryDictionary)oldContactsDictionary;
+                    if (!oldContactsBinaryDictionary.mLocale.equals(locale)) {
+                        // If the locale has changed then recreate the contacts dictionary. This
+                        // allows locale dependent rules for handling bigram name predictions.
+                        oldContactsDictionary.close();
+                        dictionaryToUse = new ContactsBinaryDictionary(
+                            this, Suggest.DIC_CONTACTS, locale);
+                    } else {
+                        // Make sure the old contacts dictionary is opened. If it is already open,
+                        // this is a no-op, so it's safe to call it anyways.
+                        oldContactsBinaryDictionary.reopen(this);
+                        dictionaryToUse = oldContactsDictionary;
+                    }
+                } else {
+                    ((ContactsDictionary)oldContactsDictionary).reopen(this);
+                    dictionaryToUse = oldContactsDictionary;
+                }
             } else {
-                dictionaryToUse = new ContactsDictionary(this, Suggest.DIC_CONTACTS);
+                if (USE_BINARY_CONTACTS_DICTIONARY) {
+                    dictionaryToUse = new ContactsBinaryDictionary(this, Suggest.DIC_CONTACTS,
+                            locale);
+                } else {
+                    dictionaryToUse = new ContactsDictionary(this, Suggest.DIC_CONTACTS);
+                }
             }
         }