diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 22d1a40..dc5bd2e 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -922,11 +922,11 @@
                 return;
             }
 
-            final List<CharSequence> applicationSuggestedWords =
+            final List<SuggestedWords.SuggestedWordInfo> applicationSuggestedWords =
                     SuggestedWords.Builder.getFromApplicationSpecifiedCompletions(
                             applicationSpecifiedCompletions);
             SuggestedWords.Builder builder = new SuggestedWords.Builder()
-                    .addWords(applicationSuggestedWords, null)
+                    .addWords(applicationSuggestedWords)
                     .setTypedWordValid(false)
                     .setHasMinimalSuggestion(false);
             // When in fullscreen mode, show completions generated by the application
diff --git a/java/src/com/android/inputmethod/latin/SettingsValues.java b/java/src/com/android/inputmethod/latin/SettingsValues.java
index 1f4909f..7e77020 100644
--- a/java/src/com/android/inputmethod/latin/SettingsValues.java
+++ b/java/src/com/android/inputmethod/latin/SettingsValues.java
@@ -175,32 +175,36 @@
     }
 
     private static SuggestedWords createSuggestPuncList(final String[] puncs) {
-        final ArrayList<CharSequence> puncList = new ArrayList<CharSequence>();
+        final ArrayList<SuggestedWords.SuggestedWordInfo> puncList =
+                new ArrayList<SuggestedWords.SuggestedWordInfo>();
         if (puncs != null) {
             for (final String puncSpec : puncs) {
-                puncList.add(KeySpecParser.getLabel(puncSpec));
+                puncList.add(new SuggestedWords.SuggestedWordInfo(
+                        KeySpecParser.getLabel(puncSpec)));
             }
         }
         final SuggestedWords.Builder builder = new SuggestedWords.Builder()
-                .addWords(puncList, null)
+                .addWords(puncList)
                 .setIsPunctuationSuggestions();
         return builder.build();
     }
 
     private static SuggestedWords createSuggestPuncOutputTextList(final String[] puncs) {
-        final ArrayList<CharSequence> puncOutputTextList = new ArrayList<CharSequence>();
+        final ArrayList<SuggestedWords.SuggestedWordInfo> puncOutputTextList =
+                new ArrayList<SuggestedWords.SuggestedWordInfo>();
         if (puncs != null) {
             for (final String puncSpec : puncs) {
                 final String outputText = KeySpecParser.getOutputText(puncSpec);
                 if (outputText != null) {
-                    puncOutputTextList.add(outputText);
+                    puncOutputTextList.add(new SuggestedWords.SuggestedWordInfo(outputText));
                 } else {
-                    puncOutputTextList.add(KeySpecParser.getLabel(puncSpec));
+                    puncOutputTextList.add(new SuggestedWords.SuggestedWordInfo(
+                            KeySpecParser.getLabel(puncSpec)));
                 }
             }
         }
         final SuggestedWords.Builder builder = new SuggestedWords.Builder()
-                .addWords(puncOutputTextList, null)
+                .addWords(puncOutputTextList)
                 .setIsPunctuationSuggestions();
         return builder.build();
     }
diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index f17c1d9..e04a4e8 100644
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -291,7 +291,8 @@
 
         StringUtils.removeDupes(mSuggestions);
 
-        return new SuggestedWords.Builder().addWords(mSuggestions, null)
+        return new SuggestedWords.Builder()
+                .addWords(SuggestedWords.Builder.getFromCharSequenceList(mSuggestions))
                 .setAllowsToBeAutoCorrected(false)
                 .setHasAutoCorrection(false);
     }
@@ -445,11 +446,12 @@
                 scoreInfoList.add(new SuggestedWords.SuggestedWordInfo(mSuggestions.get(i),
                         "--", false));
             }
-            builder = new SuggestedWords.Builder().addWords(mSuggestions, scoreInfoList)
+            builder = new SuggestedWords.Builder().addWords(scoreInfoList)
                     .setAllowsToBeAutoCorrected(allowsToBeAutoCorrected)
                     .setHasAutoCorrection(hasAutoCorrection);
         } else {
-            builder = new SuggestedWords.Builder().addWords(mSuggestions, null)
+            builder = new SuggestedWords.Builder()
+                    .addWords(SuggestedWords.Builder.getFromCharSequenceList(mSuggestions))
                     .setAllowsToBeAutoCorrected(allowsToBeAutoCorrected)
                     .setHasAutoCorrection(hasAutoCorrection);
         }
diff --git a/java/src/com/android/inputmethod/latin/SuggestedWords.java b/java/src/com/android/inputmethod/latin/SuggestedWords.java
index 9959292..7dd85f6 100644
--- a/java/src/com/android/inputmethod/latin/SuggestedWords.java
+++ b/java/src/com/android/inputmethod/latin/SuggestedWords.java
@@ -87,19 +87,17 @@
             // Nothing to do here.
         }
 
-        public Builder addWords(List<CharSequence> words,
-                List<SuggestedWordInfo> suggestedWordInfoList) {
-            final int N = words.size();
+        // TODO: the following method is a wrapper to satisfy tests. Update tests and remove it.
+        public Builder addWords(final List<CharSequence> words,
+                final List<SuggestedWordInfo> suggestedWordInfoList) {
+            return addWords(suggestedWordInfoList);
+        }
+
+        public Builder addWords(List<SuggestedWordInfo> suggestedWordInfoList) {
+            final int N = suggestedWordInfoList.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(word);
-                }
-                addWord(word, suggestedWordInfo);
+                SuggestedWordInfo suggestedWordInfo = suggestedWordInfoList.get(i);
+                addWord(suggestedWordInfo.mWord, suggestedWordInfo);
             }
             return this;
         }
@@ -113,11 +111,20 @@
             return this;
         }
 
-        public static List<CharSequence> getFromApplicationSpecifiedCompletions(
+        public static List<SuggestedWordInfo> getFromCharSequenceList(
+                final List<CharSequence> wordList) {
+            final ArrayList<SuggestedWordInfo> result = new ArrayList<SuggestedWordInfo>();
+            for (CharSequence word : wordList) {
+                if (null != word) result.add(new SuggestedWordInfo(word, null, false));
+            }
+            return result;
+        }
+
+        public static List<SuggestedWordInfo> getFromApplicationSpecifiedCompletions(
                 final CompletionInfo[] infos) {
-            final ArrayList<CharSequence> result = new ArrayList<CharSequence>();
+            final ArrayList<SuggestedWordInfo> result = new ArrayList<SuggestedWordInfo>();
             for (CompletionInfo info : infos) {
-                if (null != info) result.add(info.getText());
+                if (null != info) result.add(new SuggestedWordInfo(info.getText(), null, false));
             }
             return result;
         }
