diff --git a/java/src/com/android/inputmethod/latin/SettingsValues.java b/java/src/com/android/inputmethod/latin/SettingsValues.java
index 1f4909f..abd1dc6 100644
--- a/java/src/com/android/inputmethod/latin/SettingsValues.java
+++ b/java/src/com/android/inputmethod/latin/SettingsValues.java
@@ -28,7 +28,6 @@
 import com.android.inputmethod.compat.VibratorCompatWrapper;
 import com.android.inputmethod.keyboard.internal.KeySpecParser;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -175,34 +174,28 @@
     }
 
     private static SuggestedWords createSuggestPuncList(final String[] puncs) {
-        final ArrayList<CharSequence> puncList = new ArrayList<CharSequence>();
+        final SuggestedWords.Builder builder = new SuggestedWords.Builder();
         if (puncs != null) {
             for (final String puncSpec : puncs) {
-                puncList.add(KeySpecParser.getLabel(puncSpec));
+                builder.addWord(KeySpecParser.getLabel(puncSpec));
             }
         }
-        final SuggestedWords.Builder builder = new SuggestedWords.Builder()
-                .addWords(puncList, null)
-                .setIsPunctuationSuggestions();
-        return builder.build();
+        return builder.setIsPunctuationSuggestions().build();
     }
 
     private static SuggestedWords createSuggestPuncOutputTextList(final String[] puncs) {
-        final ArrayList<CharSequence> puncOutputTextList = new ArrayList<CharSequence>();
+        final SuggestedWords.Builder builder = new SuggestedWords.Builder();
         if (puncs != null) {
             for (final String puncSpec : puncs) {
                 final String outputText = KeySpecParser.getOutputText(puncSpec);
                 if (outputText != null) {
-                    puncOutputTextList.add(outputText);
+                    builder.addWord(outputText);
                 } else {
-                    puncOutputTextList.add(KeySpecParser.getLabel(puncSpec));
+                    builder.addWord(KeySpecParser.getLabel(puncSpec));
                 }
             }
         }
-        final SuggestedWords.Builder builder = new SuggestedWords.Builder()
-                .addWords(puncOutputTextList, null)
-                .setIsPunctuationSuggestions();
-        return builder.build();
+        return builder.setIsPunctuationSuggestions().build();
     }
 
     private static String createWordSeparators(final String weakSpaceStrippers,
diff --git a/java/src/com/android/inputmethod/latin/SuggestedWords.java b/java/src/com/android/inputmethod/latin/SuggestedWords.java
index a603fd8..4a51e79 100644
--- a/java/src/com/android/inputmethod/latin/SuggestedWords.java
+++ b/java/src/com/android/inputmethod/latin/SuggestedWords.java
@@ -104,6 +104,17 @@
             return this;
         }
 
+        public Builder addWord(CharSequence word) {
+            return addWord(word, null, false);
+        }
+
+        public Builder addWord(CharSequence word, CharSequence debugString,
+                boolean isPreviousSuggestedWord) {
+            SuggestedWordInfo info = new SuggestedWordInfo(word, debugString,
+                    isPreviousSuggestedWord);
+            return addWord(word, info);
+        }
+
         /* package for tests */
         Builder addWord(CharSequence word, SuggestedWordInfo suggestedWordInfo) {
             if (!TextUtils.isEmpty(suggestedWordInfo.mWord)) {
