diff --git a/java/src/com/android/inputmethod/latin/DictionaryFactory.java b/java/src/com/android/inputmethod/latin/DictionaryFactory.java
index 39b4f63a5ae3d32360dda278c9c876b861979451..ffd204dac12a918f2718ad2e2b563684268fe660 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryFactory.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryFactory.java
@@ -42,9 +42,9 @@ public class DictionaryFactory {
      * @param context application context for reading resources
      * @param locale the locale for which to create the dictionary
      * @param fallbackResId the id of the resource to use as a fallback if no pack is found
-     * @return an initialized instance of Dictionary
+     * @return an initialized instance of DictionaryCollection
      */
-    public static Dictionary createDictionaryFromManager(Context context, Locale locale,
+    public static DictionaryCollection createDictionaryFromManager(Context context, Locale locale,
             int fallbackResId) {
         if (null == locale) {
             Log.e(TAG, "No locale defined for dictionary");
diff --git a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java
index 35d1541ff7b93e244b0320135ab4e3f110aa0255..9f4777f5ab140bfc21845adb5a74f65687a27a5c 100644
--- a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java
@@ -127,7 +127,7 @@ public class ExpandableDictionary extends Dictionary {
         if (!mUpdatingDictionary) {
             mUpdatingDictionary = true;
             mRequiresReload = false;
-            new LoadDictionaryTask().execute();
+            new LoadDictionaryTask().start();
         }
     }
 
@@ -541,14 +541,13 @@ public class ExpandableDictionary extends Dictionary {
         mRoots = new NodeArray();
     }
 
-    private class LoadDictionaryTask extends AsyncTask<Void, Void, Void> {
+    private class LoadDictionaryTask extends Thread {
         @Override
-        protected Void doInBackground(Void... v) {
+        public void run() {
             loadDictionaryAsync();
             synchronized (mUpdatingLock) {
                 mUpdatingDictionary = false;
             }
-            return null;
         }
     }
 
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
index 649774d78d1edffce141f5a33eebb7191b63d163..ec82f9e801515ed6915b561c1a705fcb0aa69784 100644
--- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
+++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
@@ -30,7 +30,9 @@ import com.android.inputmethod.keyboard.ProximityInfo;
 import com.android.inputmethod.latin.Dictionary;
 import com.android.inputmethod.latin.Dictionary.DataType;
 import com.android.inputmethod.latin.Dictionary.WordCallback;
+import com.android.inputmethod.latin.DictionaryCollection;
 import com.android.inputmethod.latin.DictionaryFactory;
+import com.android.inputmethod.latin.UserDictionary;
 import com.android.inputmethod.latin.Utils;
 import com.android.inputmethod.latin.WordComposer;
 
@@ -51,6 +53,8 @@ public class AndroidSpellCheckerService extends SpellCheckerService {
     private final static String[] emptyArray = new String[0];
     private Map<String, DictionaryPool> mDictionaryPools =
             Collections.synchronizedMap(new TreeMap<String, DictionaryPool>());
+    private Map<String, Dictionary> mUserDictionaries =
+            Collections.synchronizedMap(new TreeMap<String, Dictionary>());
 
     @Override
     public Session createSession() {
@@ -109,9 +113,14 @@ public class AndroidSpellCheckerService extends SpellCheckerService {
     public boolean onUnbind(final Intent intent) {
         final Map<String, DictionaryPool> oldPools = mDictionaryPools;
         mDictionaryPools = Collections.synchronizedMap(new TreeMap<String, DictionaryPool>());
+        final Map<String, Dictionary> oldUserDictionaries = mUserDictionaries;
+        mUserDictionaries = Collections.synchronizedMap(new TreeMap<String, Dictionary>());
         for (DictionaryPool pool : oldPools.values()) {
             pool.close();
         }
+        for (Dictionary dict : oldUserDictionaries.values()) {
+            dict.close();
+        }
         return false;
     }
 
@@ -129,9 +138,16 @@ public class AndroidSpellCheckerService extends SpellCheckerService {
         final ProximityInfo proximityInfo = ProximityInfo.createSpellCheckerProximityInfo();
         final Resources resources = getResources();
         final int fallbackResourceId = Utils.getMainDictionaryResourceId(resources);
-        final Dictionary dictionary =
+        final DictionaryCollection dictionaryCollection =
                 DictionaryFactory.createDictionaryFromManager(this, locale, fallbackResourceId);
-        return new DictAndProximity(dictionary, proximityInfo);
+        final String localeStr = locale.toString();
+        Dictionary userDict = mUserDictionaries.get(localeStr);
+        if (null == userDict) {
+            userDict = new UserDictionary(this, localeStr);
+            mUserDictionaries.put(localeStr, userDict);
+        }
+        dictionaryCollection.addDictionary(userDict);
+        return new DictAndProximity(dictionaryCollection, proximityInfo);
     }
 
     private class AndroidSpellCheckerSession extends Session {