diff --git a/java/res/values/donottranslate.xml b/java/res/values/donottranslate.xml
index fb28766..f55e9bf 100644
--- a/java/res/values/donottranslate.xml
+++ b/java/res/values/donottranslate.xml
@@ -153,4 +153,8 @@
 
     <!-- Generic subtype label -->
     <string name="subtype_generic">%s</string>
+
+    <!-- dictionary pack package name /settings activity (for shared prefs and settings) -->
+    <string name="dictionary_pack_package_name">com.google.android.inputmethod.latin.dictionarypack</string>
+    <string name="dictionary_pack_settings_activity">com.google.android.inputmethod.latin.dictionarypack.DictionarySettingsActivity</string>
 </resources>
diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml
index 552e3cf..2ff82f9 100644
--- a/java/res/xml/prefs.xml
+++ b/java/res/xml/prefs.xml
@@ -70,8 +70,8 @@
             android:title="@string/configure_dictionaries_title">
            <intent
               android:action="android.intent.action.MAIN"
-              android:targetPackage="com.google.android.inputmethod.latin.dictionarypack"
-              android:targetClass="com.google.android.inputmethod.latin.dictionarypack.DictionarySettingsActivity" />
+              android:targetPackage="@string/dictionary_pack_package_name"
+              android:targetClass="@string/dictionary_pack_settings_activity" />
         </PreferenceScreen>
         <ListPreference
             android:key="auto_correction_threshold"
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java b/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java
index b26731a..170edad 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java
@@ -25,6 +25,7 @@
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.Arrays;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 
@@ -121,6 +122,30 @@
     }
 
     /**
+     * Returns the list of cached files for a specific locale.
+     *
+     * @param locale the locale to find the dictionary files for.
+     * @param context the context on which to open the files upon.
+     * @return a list of binary dictionary files, which may be null but may not be empty.
+     */
+    private static List<AssetFileAddress> getCachedDictionaryList(final Locale locale,
+            final Context context) {
+        final String directoryName = getCacheDirectoryForLocale(locale, context);
+        final File[] cacheFiles = new File(directoryName).listFiles();
+        if (null == cacheFiles) return null;
+
+        final ArrayList<AssetFileAddress> fileList = new ArrayList<AssetFileAddress>();
+        for (File f : cacheFiles) {
+            if (f.canRead()) {
+                fileList.add(AssetFileAddress.makeFromFileName(f.getPath()));
+            } else {
+                Log.e(TAG, "Found a cached dictionary file but cannot read it");
+            }
+        }
+        return fileList.size() > 0 ? fileList : null;
+    }
+
+    /**
      * Returns a list of file addresses for a given locale, trying relevant methods in order.
      *
      * Tries to get binary dictionaries from various sources, in order:
@@ -132,12 +157,14 @@
      * - Returns null.
      * @return The address of a valid file, or null.
      */
-    public static List<AssetFileAddress> getDictionaryFiles(Locale locale, Context context,
-            int fallbackResId) {
+    public static List<AssetFileAddress> getDictionaryFiles(final Locale locale,
+            final Context context, final int fallbackResId) {
         try {
-            List<AssetFileAddress> cachedDictionaryList =
-                    BinaryDictionaryFileDumper.cacheDictionariesFromContentProvider(locale,
-                            context);
+            // cacheDictionariesFromContentProvider returns the list of files it copied to local
+            // storage, but we don't really care about what was copied NOW: what we want is the
+            // list of everything we ever cached, so we ignore the return value.
+            BinaryDictionaryFileDumper.cacheDictionariesFromContentProvider(locale, context);
+            List<AssetFileAddress> cachedDictionaryList = getCachedDictionaryList(locale, context);
             if (null != cachedDictionaryList) {
                 return cachedDictionaryList;
             }
diff --git a/native/src/correction.cpp b/native/src/correction.cpp
index a05be55..f8f73dd 100644
--- a/native/src/correction.cpp
+++ b/native/src/correction.cpp
@@ -102,7 +102,7 @@
     const bool sameLength = (mExcessivePos == mInputLength - 1) ? (mInputLength == inputIndex + 2)
             : (mInputLength == inputIndex + 1);
     return Correction::RankingAlgorithm::calculateFinalFreq(
-            inputIndex, outputIndex, mMatchedCharCount, freq, sameLength, this);
+            inputIndex, outputIndex, freq, sameLength, this);
 }
 
 bool Correction::initProcessState(const int outputIndex) {
@@ -111,10 +111,9 @@
     }
     mOutputIndex = outputIndex;
     --(mCorrectionStates[outputIndex].mChildCount);
-    mMatchedCharCount = mCorrectionStates[outputIndex].mMatchedCount;
     mInputIndex = mCorrectionStates[outputIndex].mInputIndex;
     mNeedsToTraverseAllNodes = mCorrectionStates[outputIndex].mNeedsToTraverseAllNodes;
-    mDiffs = mCorrectionStates[outputIndex].mDiffs;
+    mProximityCount = mCorrectionStates[outputIndex].mProximityCount;
     mSkippedCount = mCorrectionStates[outputIndex].mSkippedCount;
     mSkipPos = mCorrectionStates[outputIndex].mSkipPos;
     mSkipping = false;
@@ -130,10 +129,6 @@
     return mOutputIndex;
 }
 
-void Correction::charMatched() {
-    ++mMatchedCharCount;
-}
-
 // TODO: remove
 int Correction::getOutputIndex() {
     return mOutputIndex;
@@ -158,10 +153,9 @@
     mCorrectionStates[mOutputIndex].mParentIndex = mCorrectionStates[mOutputIndex - 1].mParentIndex;
     mCorrectionStates[mOutputIndex].mChildCount = mCorrectionStates[mOutputIndex - 1].mChildCount;
     mCorrectionStates[mOutputIndex].mSiblingPos = mCorrectionStates[mOutputIndex - 1].mSiblingPos;
-    mCorrectionStates[mOutputIndex].mMatchedCount = mMatchedCharCount;
     mCorrectionStates[mOutputIndex].mInputIndex = mInputIndex;
     mCorrectionStates[mOutputIndex].mNeedsToTraverseAllNodes = mNeedsToTraverseAllNodes;
-    mCorrectionStates[mOutputIndex].mDiffs = mDiffs;
+    mCorrectionStates[mOutputIndex].mProximityCount = mProximityCount;
     mCorrectionStates[mOutputIndex].mSkippedCount = mSkippedCount;
     mCorrectionStates[mOutputIndex].mSkipping = mSkipping;
     mCorrectionStates[mOutputIndex].mSkipPos = mSkipPos;
@@ -174,7 +168,7 @@
 
 bool Correction::needsToPrune() const {
     return (mOutputIndex - 1 >= (mTransposedPos >= 0 ? mInputLength - 1 : mMaxDepth)
-            || mDiffs > mMaxEditDistance);
+            || mProximityCount > mMaxEditDistance);
 }
 
 Correction::CorrectionType Correction::processSkipChar(
@@ -231,8 +225,7 @@
         int matchedProximityCharId = mProximityInfo->getMatchedProximityId(
                 inputIndexForProximity, c, checkProximityChars);
 
-        const bool unrelated = ProximityInfo::UNRELATED_CHAR == matchedProximityCharId;
-        if (unrelated) {
+        if (ProximityInfo::UNRELATED_CHAR == matchedProximityCharId) {
             if (skip) {
                 // Skip this letter and continue deeper
                 ++mSkippedCount;
@@ -240,19 +233,15 @@
             } else {
                 return UNRELATED;
             }
+        } else if (ProximityInfo::SAME_OR_ACCENTED_OR_CAPITALIZED_CHAR == matchedProximityCharId) {
+            // If inputIndex is greater than mInputLength, that means there is no
+            // proximity chars. So, we don't need to check proximity.
+            mMatching = true;
+        } else if (ProximityInfo::NEAR_PROXIMITY_CHAR == matchedProximityCharId) {
+            incrementProximityCount();
         }
 
         mWord[mOutputIndex] = c;
-        // If inputIndex is greater than mInputLength, that means there is no
-        // proximity chars. So, we don't need to check proximity.
-        if (ProximityInfo::SAME_OR_ACCENTED_OR_CAPITALIZED_CHAR == matchedProximityCharId) {
-            mMatching = true;
-            charMatched();
-        }
-
-        if (ProximityInfo::NEAR_PROXIMITY_CHAR == matchedProximityCharId) {
-            incrementDiffs();
-        }
 
         const bool isSameAsUserTypedLength = mInputLength
                 == getInputIndex() + 1
@@ -336,24 +325,25 @@
 //////////////////////
 
 /* static */
-int Correction::RankingAlgorithm::calculateFinalFreq(
-        const int inputIndex, const int outputIndex,
-        const int matchCount, const int freq, const bool sameLength,
-        const Correction* correction) {
-    const int skipPos = correction->getSkipPos();
+int Correction::RankingAlgorithm::calculateFinalFreq(const int inputIndex, const int outputIndex,
+        const int freq, const bool sameLength, const Correction* correction) {
     const int excessivePos = correction->getExcessivePos();
     const int transposedPos = correction->getTransposedPos();
     const int inputLength = correction->mInputLength;
     const int typedLetterMultiplier = correction->TYPED_LETTER_MULTIPLIER;
     const int fullWordMultiplier = correction->FULL_WORD_MULTIPLIER;
     const ProximityInfo *proximityInfo = correction->mProximityInfo;
+
+    // TODO: use mExcessiveCount
+    const int matchCount = inputLength - correction->mProximityCount - (excessivePos >= 0 ? 1 : 0);
     const int matchWeight = powerIntCapped(typedLetterMultiplier, matchCount);
+
     const unsigned short* word = correction->mWord;
-    const int skippedCount = correction->mSkippedCount;
+    const bool skipped = correction->mSkippedCount > 0;
 
     // TODO: Demote by edit distance
     int finalFreq = freq * matchWeight;
-    if (skipPos >= 0) {
+    if (skipped) {
         if (inputLength >= 2) {
             const int demotionRate = WORDS_WITH_MISSING_CHARACTER_DEMOTION_RATE
                     * (10 * inputLength - WORDS_WITH_MISSING_CHARACTER_DEMOTION_START_POS_10X)
@@ -387,10 +377,10 @@
             }
             multiplyRate(FULL_MATCHED_WORDS_PROMOTION_RATE, &finalFreq);
         }
-        if (sameLength && transposedPos < 0 && skipPos < 0 && excessivePos < 0) {
+        if (sameLength && transposedPos < 0 && !skipped && excessivePos < 0) {
             finalFreq = capped255MultForFullMatchAccentsOrCapitalizationDifference(finalFreq);
         }
-    } else if (sameLength && transposedPos < 0 && skipPos < 0 && excessivePos < 0
+    } else if (sameLength && transposedPos < 0 && !skipped && excessivePos < 0
             && outputIndex > 0) {
         // A word with proximity corrections
         if (DEBUG_DICT) {
@@ -418,7 +408,7 @@
      s ... skipping
      a ... traversing all
      */
-    if (matchCount == inputLength && matchCount >= 2 && skippedCount == 0
+    if (matchCount == inputLength && matchCount >= 2 && !skipped
             && word[matchCount] == word[matchCount - 1]) {
         multiplyRate(WORDS_WITH_MATCH_SKIP_PROMOTION_RATE, &finalFreq);
     }
diff --git a/native/src/correction.h b/native/src/correction.h
index 0aa5660..2fa8c90 100644
--- a/native/src/correction.h
+++ b/native/src/correction.h
@@ -48,8 +48,6 @@
     void checkState();
     bool initProcessState(const int index);
 
-    void getProcessState(int *matchedCount, int *inputIndex, int *outputIndex,
-            bool *traverseAllNodes, int *diffs);
     int getOutputIndex();
     int getInputIndex();
 
@@ -80,10 +78,6 @@
 
     CorrectionType processCharAndCalcState(const int32_t c, const bool isTerminal);
 
-    int getDiffs() const {
-        return mDiffs;
-    }
-
     /////////////////////////
     // Tree helper methods
     int goDownTree(const int parentIndex, const int childCount, const int firstChildPos);
@@ -100,7 +94,6 @@
         return mCorrectionStates[index].mParentIndex;
     }
 private:
-    inline void charMatched();
     inline void incrementInputIndex();
     inline void incrementOutputIndex();
     inline bool needsToTraverseAllNodes();
@@ -109,8 +102,8 @@
     inline CorrectionType processSkipChar(const int32_t c, const bool isTerminal);
 
     // TODO: remove
-    inline void incrementDiffs() {
-        ++mDiffs;
+    inline void incrementProximityCount() {
+        ++mProximityCount;
     }
 
     const int TYPED_LETTER_MULTIPLIER;
@@ -133,8 +126,7 @@
     // The following member variables are being used as cache values of the correction state.
     int mOutputIndex;
     int mInputIndex;
-    int mDiffs;
-    int mMatchedCharCount;
+    int mProximityCount;
     int mSkippedCount;
     int mSkipPos;
     bool mNeedsToTraverseAllNodes;
@@ -144,8 +136,7 @@
     class RankingAlgorithm {
     public:
         static int calculateFinalFreq(const int inputIndex, const int depth,
-                const int matchCount, const int freq, const bool sameLength,
-                const Correction* correction);
+                const int freq, const bool sameLength, const Correction* correction);
         static int calcFreqForSplitTwoWords(const int firstFreq, const int secondFreq,
                 const Correction* correction);
     };
diff --git a/native/src/correction_state.h b/native/src/correction_state.h
index 3ff8134..d30d13c 100644
--- a/native/src/correction_state.h
+++ b/native/src/correction_state.h
@@ -28,8 +28,7 @@
     int mSiblingPos;
     uint16_t mChildCount;
     uint8_t mInputIndex;
-    uint8_t mDiffs;
-    uint8_t mMatchedCount;
+    uint8_t mProximityCount;
     uint8_t mSkippedCount;
     int8_t mSkipPos; // should be signed
     bool mMatching;
@@ -43,9 +42,8 @@
     state->mParentIndex = -1;
     state->mChildCount = childCount;
     state->mInputIndex = 0;
-    state->mDiffs = 0;
+    state->mProximityCount = 0;
     state->mSiblingPos = rootPos;
-    state->mMatchedCount = 0;
     state->mSkippedCount = 0;
     state->mMatching = false;
     state->mSkipping = false;
