diff --git a/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java
index b6cfcd064b653b4363a7b0acfbdc6295d0770c95..ae41e74e39a9686fa3442ac5fa271ed06827f066 100644
--- a/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java
@@ -33,6 +33,7 @@ import android.util.Log;
 
 import com.android.inputmethod.latin.utils.StringUtils;
 
+import java.io.File;
 import java.util.List;
 import java.util.Locale;
 
@@ -83,6 +84,11 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary {
         loadDictionary();
     }
 
+    // Dummy constructor for tests.
+    public ContactsBinaryDictionary(final Context context, final Locale locale, final File file) {
+        this(context, locale);
+    }
+
     private synchronized void registerObserver(final Context context) {
         // Perform a managed query. The Activity will handle closing and requerying the cursor
         // when needed.
diff --git a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
index 9f5cd162f8fc1a04a0da0fdc3b27e101fce156eb..7afd657a033e7bead7a46c852415a5ad1c033ef5 100644
--- a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
@@ -17,7 +17,6 @@
 package com.android.inputmethod.latin;
 
 import android.content.Context;
-import android.os.SystemClock;
 import android.util.Log;
 
 import com.android.inputmethod.annotations.UsedForTesting;
@@ -181,6 +180,19 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
         return executor;
     }
 
+    /**
+     * Shutdowns all executors and removes all executors from the executor map for testing.
+     */
+    @UsedForTesting
+    public static void shutdownAllExecutors() {
+        synchronized(sDictNameExecutorMap) {
+            for (final PrioritizedSerialExecutor executor : sDictNameExecutorMap.values()) {
+                executor.shutdown();
+                sDictNameExecutorMap.remove(executor);
+            }
+        }
+    }
+
     private static AbstractDictionaryWriter getDictionaryWriter(final Context context,
             final boolean isDynamicPersonalizationDictionary) {
         if (isDynamicPersonalizationDictionary) {
@@ -504,7 +516,7 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
      * dictionary exists, this method will generate one.
      */
     protected void loadDictionary() {
-        mPerInstanceDictionaryUpdateController.mLastUpdateRequestTime = SystemClock.uptimeMillis();
+        mPerInstanceDictionaryUpdateController.mLastUpdateRequestTime = System.currentTimeMillis();
         reloadDictionaryIfRequired();
     }
 
@@ -600,7 +612,7 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
      *        the current binary dictionary from file.
      */
     protected void setRequiresReload(final boolean requiresRebuild) {
-        final long time = SystemClock.uptimeMillis();
+        final long time = System.currentTimeMillis();
         mPerInstanceDictionaryUpdateController.mLastUpdateRequestTime = time;
         mDictNameDictionaryUpdateController.mLastUpdateRequestTime = time;
         if (DEBUG) {
@@ -648,7 +660,7 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
             @Override
             public void run() {
                 try {
-                    final long time = SystemClock.uptimeMillis();
+                    final long time = System.currentTimeMillis();
                     final boolean dictionaryFileExists = dictionaryFileExists();
                     if (mDictNameDictionaryUpdateController.isOutOfDate()
                             || !dictionaryFileExists) {
diff --git a/java/src/com/android/inputmethod/latin/UserBinaryDictionary.java b/java/src/com/android/inputmethod/latin/UserBinaryDictionary.java
index 1dc3c54bbb9b2837af47d8feafcee346ed3414ab..6fc98220fbe553e03ce5ce4e6753714df5fc1a32 100644
--- a/java/src/com/android/inputmethod/latin/UserBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/UserBinaryDictionary.java
@@ -32,6 +32,7 @@ import com.android.inputmethod.compat.UserDictionaryCompatUtils;
 import com.android.inputmethod.latin.utils.LocaleUtils;
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
+import java.io.File;
 import java.util.Arrays;
 import java.util.Locale;
 
@@ -78,6 +79,11 @@ public class UserBinaryDictionary extends ExpandableBinaryDictionary {
         this(context, locale, false);
     }
 
+    // Dummy constructor for tests.
+    public UserBinaryDictionary(final Context context, final Locale locale, final File file) {
+        this(context, locale);
+    }
+
     public UserBinaryDictionary(final Context context, final Locale locale,
             final boolean alsoUseMoreRestrictiveLocales) {
         super(context, getDictNameWithLocale(NAME, locale), locale, Dictionary.TYPE_USER,
diff --git a/java/src/com/android/inputmethod/latin/utils/PrioritizedSerialExecutor.java b/java/src/com/android/inputmethod/latin/utils/PrioritizedSerialExecutor.java
index 201a70d4226bb4e962292135a4122bff2085498d..b10d08af35360cb62fb6d126adf141560bd3bc71 100644
--- a/java/src/com/android/inputmethod/latin/utils/PrioritizedSerialExecutor.java
+++ b/java/src/com/android/inputmethod/latin/utils/PrioritizedSerialExecutor.java
@@ -137,6 +137,7 @@ public class PrioritizedSerialExecutor {
     public void shutdown() {
         synchronized(mLock) {
             mIsShutdown = true;
+            mThreadPoolExecutor.shutdown();
         }
     }