diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index 7d9b50569a4f11a9a3ceb585e2f8502ef0610667..f17c1d95a4ec83e85033170e8c557f6fb4a2f1bf 100644
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -413,6 +413,8 @@ public class Suggest implements Dictionary.WordCallback {
 
         final SuggestedWords.Builder builder;
         if (DBG) {
+            // TODO: this doesn't take into account the fact that removing dupes from mSuggestions
+            // may have made mScores[] and mSuggestions out of sync.
             final CharSequence autoCorrectionSuggestion = mSuggestions.get(0);
             final int autoCorrectionSuggestionScore = mScores[0];
             double normalizedScore = BinaryDictionary.calcNormalizedScore(
@@ -420,21 +422,28 @@ public class Suggest implements Dictionary.WordCallback {
                     autoCorrectionSuggestionScore);
             ArrayList<SuggestedWords.SuggestedWordInfo> scoreInfoList =
                     new ArrayList<SuggestedWords.SuggestedWordInfo>();
-            scoreInfoList.add(new SuggestedWords.SuggestedWordInfo("+", false));
-            for (int i = 0; i < mScores.length; ++i) {
+            scoreInfoList.add(new SuggestedWords.SuggestedWordInfo(autoCorrectionSuggestion, "+",
+                    false));
+            final int suggestionsSize = mSuggestions.size();
+            // Note: i here is the index in mScores[], but the index in mSuggestions is one more
+            // than i because we added the typed word to mSuggestions without touching mScores.
+            for (int i = 0; i < mScores.length && i < suggestionsSize - 1; ++i) {
                 if (normalizedScore > 0) {
                     final String scoreThreshold = String.format("%d (%4.2f)", mScores[i],
                             normalizedScore);
                     scoreInfoList.add(
-                            new SuggestedWords.SuggestedWordInfo(scoreThreshold, false));
+                            new SuggestedWords.SuggestedWordInfo(mSuggestions.get(i + 1),
+                                    scoreThreshold, false));
                     normalizedScore = 0.0;
                 } else {
                     final String score = Integer.toString(mScores[i]);
-                    scoreInfoList.add(new SuggestedWords.SuggestedWordInfo(score, false));
+                    scoreInfoList.add(new SuggestedWords.SuggestedWordInfo(mSuggestions.get(i + 1),
+                            score, false));
                 }
             }
-            for (int i = mScores.length; i < mSuggestions.size(); ++i) {
-                scoreInfoList.add(new SuggestedWords.SuggestedWordInfo("--", false));
+            for (int i = mScores.length; i < suggestionsSize; ++i) {
+                scoreInfoList.add(new SuggestedWords.SuggestedWordInfo(mSuggestions.get(i),
+                        "--", false));
             }
             builder = new SuggestedWords.Builder().addWords(mSuggestions, scoreInfoList)
                     .setAllowsToBeAutoCorrected(allowsToBeAutoCorrected)
diff --git a/java/src/com/android/inputmethod/latin/SuggestedWords.java b/java/src/com/android/inputmethod/latin/SuggestedWords.java
index 8bfe7694bcdd273fa5dd07c1f4bdcff7fd166d36..4a51e796dc23a3f70eb971eb0f9bbf827c7b9f2f 100644
--- a/java/src/com/android/inputmethod/latin/SuggestedWords.java
+++ b/java/src/com/android/inputmethod/latin/SuggestedWords.java
@@ -20,30 +20,23 @@ import android.text.TextUtils;
 import android.view.inputmethod.CompletionInfo;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 
 public class SuggestedWords {
-    public static final SuggestedWords EMPTY = new SuggestedWords(null, false, false, false, false,
-            null);
+    public static final SuggestedWords EMPTY = new SuggestedWords(false, false, false, false,
+            Collections.<SuggestedWordInfo>emptyList());
 
-    private final List<CharSequence> mWords;
     public final boolean mTypedWordValid;
     public final boolean mHasAutoCorrectionCandidate;
     public final boolean mIsPunctuationSuggestions;
     private final List<SuggestedWordInfo> mSuggestedWordInfoList;
 
-    SuggestedWords(List<CharSequence> words, boolean typedWordValid,
+    SuggestedWords(boolean typedWordValid,
             boolean hasAutoCorrectionCandidate, boolean isPunctuationSuggestions,
             boolean shouldBlockAutoCorrectionBySafetyNet,
             List<SuggestedWordInfo> suggestedWordInfoList) {
-        if (words != null) {
-            mWords = words;
-        } else {
-            mWords = Collections.emptyList();
-        }
         mTypedWordValid = typedWordValid;
         mHasAutoCorrectionCandidate = hasAutoCorrectionCandidate
                 && !shouldBlockAutoCorrectionBySafetyNet;
@@ -52,11 +45,11 @@ public class SuggestedWords {
     }
 
     public int size() {
-        return mWords.size();
+        return mSuggestedWordInfoList.size();
     }
 
     public CharSequence getWord(int pos) {
-        return mWords.get(pos);
+        return mSuggestedWordInfoList.get(pos).mWord;
     }
 
     public SuggestedWordInfo getInfo(int pos) {
@@ -77,12 +70,10 @@ public class SuggestedWords {
         return "SuggestedWords:"
                 + " mTypedWordValid=" + mTypedWordValid
                 + " mHasAutoCorrectionCandidate=" + mHasAutoCorrectionCandidate
-                + " mIsPunctuationSuggestions=" + mIsPunctuationSuggestions
-                + " mWords=" + Arrays.toString(mWords.toArray());
+                + " mIsPunctuationSuggestions=" + mIsPunctuationSuggestions;
     }
 
     public static class Builder {
-        private List<CharSequence> mWords = new ArrayList<CharSequence>();
         private boolean mTypedWordValid;
         private boolean mHasMinimalSuggestion;
         private boolean mIsPunctuationSuggestions;
@@ -100,14 +91,15 @@ public class SuggestedWords {
                 List<SuggestedWordInfo> suggestedWordInfoList) {
             final int N = words.size();
             for (int i = 0; i < N; ++i) {
+                final CharSequence word = words.get(i);
                 SuggestedWordInfo suggestedWordInfo = null;
                 if (suggestedWordInfoList != null) {
                     suggestedWordInfo = suggestedWordInfoList.get(i);
                 }
                 if (suggestedWordInfo == null) {
-                    suggestedWordInfo = new SuggestedWordInfo();
+                    suggestedWordInfo = new SuggestedWordInfo(word);
                 }
-                addWord(words.get(i), suggestedWordInfo);
+                addWord(word, suggestedWordInfo);
             }
             return this;
         }
@@ -118,14 +110,14 @@ public class SuggestedWords {
 
         public Builder addWord(CharSequence word, CharSequence debugString,
                 boolean isPreviousSuggestedWord) {
-            SuggestedWordInfo info = new SuggestedWordInfo(debugString, isPreviousSuggestedWord);
+            SuggestedWordInfo info = new SuggestedWordInfo(word, debugString,
+                    isPreviousSuggestedWord);
             return addWord(word, info);
         }
 
         /* package for tests */
         Builder addWord(CharSequence word, SuggestedWordInfo suggestedWordInfo) {
-            if (!TextUtils.isEmpty(word)) {
-                mWords.add(word);
+            if (!TextUtils.isEmpty(suggestedWordInfo.mWord)) {
                 // It's okay if suggestedWordInfo is null since it's checked where it's used.
                 mSuggestedWordInfoList.add(suggestedWordInfo);
             }
@@ -175,7 +167,6 @@ public class SuggestedWords {
         // and replace it with what the user currently typed.
         public Builder addTypedWordAndPreviousSuggestions(CharSequence typedWord,
                 SuggestedWords previousSuggestions) {
-            mWords.clear();
             mSuggestedWordInfoList.clear();
             final HashSet<String> alreadySeen = new HashSet<String>();
             addWord(typedWord, null, false);
@@ -195,17 +186,17 @@ public class SuggestedWords {
         }
 
         public SuggestedWords build() {
-            return new SuggestedWords(mWords, mTypedWordValid, mHasMinimalSuggestion,
+            return new SuggestedWords(mTypedWordValid, mHasMinimalSuggestion,
                     mIsPunctuationSuggestions, mShouldBlockAutoCorrectionBySafetyNet,
                     mSuggestedWordInfoList);
         }
 
         public int size() {
-            return mWords.size();
+            return mSuggestedWordInfoList.size();
         }
 
         public CharSequence getWord(int pos) {
-            return mWords.get(pos);
+            return mSuggestedWordInfoList.get(pos).mWord;
         }
 
         public boolean allowsToBeAutoCorrected() {
@@ -224,21 +215,24 @@ public class SuggestedWords {
                     + " mHasMinimalSuggestion=" + mHasMinimalSuggestion
                     + " mIsPunctuationSuggestions=" + mIsPunctuationSuggestions
                     + " mShouldBlockAutoCorrectionBySafetyNet="
-                    + mShouldBlockAutoCorrectionBySafetyNet
-                    + " mWords=" + Arrays.toString(mWords.toArray());
+                    + mShouldBlockAutoCorrectionBySafetyNet;
         }
     }
 
     public static class SuggestedWordInfo {
+        private final CharSequence mWord;
         private final CharSequence mDebugString;
         private final boolean mPreviousSuggestedWord;
 
-        public SuggestedWordInfo() {
+        public SuggestedWordInfo(final CharSequence word) {
+            mWord = word;
             mDebugString = "";
             mPreviousSuggestedWord = false;
         }
 
-        public SuggestedWordInfo(CharSequence debugString, boolean previousSuggestedWord) {
+        public SuggestedWordInfo(final CharSequence word, final CharSequence debugString,
+                final boolean previousSuggestedWord) {
+            mWord = word;
             mDebugString = debugString;
             mPreviousSuggestedWord = previousSuggestedWord;
         }