diff --git a/java/src/com/android/inputmethod/latin/PrevWordsInfo.java b/java/src/com/android/inputmethod/latin/PrevWordsInfo.java
index d662051d9..76d4f57da 100644
--- a/java/src/com/android/inputmethod/latin/PrevWordsInfo.java
+++ b/java/src/com/android/inputmethod/latin/PrevWordsInfo.java
@@ -132,7 +132,8 @@ public class PrevWordsInfo {
 
     @Override
     public int hashCode() {
-        return Arrays.hashCode(mPrevWordsInfo);
+        // Just for having equals().
+        return mPrevWordsInfo[0].hashCode();
     }
 
     @Override
@@ -140,7 +141,23 @@ public class PrevWordsInfo {
         if (this == o) return true;
         if (!(o instanceof PrevWordsInfo)) return false;
         final PrevWordsInfo prevWordsInfo = (PrevWordsInfo)o;
-        return Arrays.equals(mPrevWordsInfo, prevWordsInfo.mPrevWordsInfo);
+
+        final int minLength = Math.min(mPrevWordsInfo.length, prevWordsInfo.mPrevWordsInfo.length);
+        for (int i = 0; i < minLength; i++) {
+            if (!mPrevWordsInfo[i].equals(prevWordsInfo.mPrevWordsInfo[i])) {
+                return false;
+            }
+        }
+        final WordInfo[] longerWordsInfo =
+                (mPrevWordsInfo.length > prevWordsInfo.mPrevWordsInfo.length) ?
+                        mPrevWordsInfo : prevWordsInfo.mPrevWordsInfo;
+        for (int i = minLength; i < longerWordsInfo.length; i++) {
+            if (longerWordsInfo[i] != null
+                    && !WordInfo.EMPTY_WORD_INFO.equals(longerWordsInfo[i])) {
+                return false;
+            }
+        }
+        return true;
     }
 
     @Override
@@ -151,7 +168,11 @@ public class PrevWordsInfo {
             builder.append("PrevWord[");
             builder.append(i);
             builder.append("]: ");
-            if (wordInfo == null || !wordInfo.isValid()) {
+            if (wordInfo == null) {
+                builder.append("null. ");
+                continue;
+            }
+            if (!wordInfo.isValid()) {
                 builder.append("Empty. ");
                 continue;
             }
diff --git a/java/src/com/android/inputmethod/latin/utils/PrevWordsInfoUtils.java b/java/src/com/android/inputmethod/latin/utils/PrevWordsInfoUtils.java
index 3cd63612c..5720d9388 100644
--- a/java/src/com/android/inputmethod/latin/utils/PrevWordsInfoUtils.java
+++ b/java/src/com/android/inputmethod/latin/utils/PrevWordsInfoUtils.java
@@ -16,6 +16,7 @@
 
 package com.android.inputmethod.latin.utils;
 
+import java.util.Arrays;
 import java.util.regex.Pattern;
 
 import com.android.inputmethod.latin.Constants;
@@ -56,6 +57,7 @@ public final class PrevWordsInfoUtils {
         if (prev == null) return PrevWordsInfo.EMPTY_PREV_WORDS_INFO;
         final String[] w = SPACE_REGEX.split(prev);
         final WordInfo[] prevWordsInfo = new WordInfo[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+        Arrays.fill(prevWordsInfo, WordInfo.EMPTY_WORD_INFO);
         for (int i = 0; i < prevWordsInfo.length; i++) {
             final int focusedWordIndex = w.length - n - i;
             // Referring to the word after the focused word.
@@ -66,7 +68,6 @@ public final class PrevWordsInfoUtils {
                     if (spacingAndPunctuations.isWordConnector(firstChar)) {
                         // The word following the focused word is starting with a word connector.
                         // TODO: Return meaningful context for this case.
-                        prevWordsInfo[i] = WordInfo.EMPTY_WORD_INFO;
                         break;
                     }
                 }
@@ -93,7 +94,6 @@ public final class PrevWordsInfoUtils {
             // TODO: Return meaningful context for this case.
             if (spacingAndPunctuations.isWordSeparator(lastChar)
                     || spacingAndPunctuations.isWordConnector(lastChar)) {
-                prevWordsInfo[i] = WordInfo.EMPTY_WORD_INFO;
                 break;
             }
             prevWordsInfo[i] = new WordInfo(focusedWord);