diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index a5c70ec..3015d75 100644
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -271,8 +271,7 @@
 
         return new SuggestedWords.Builder()
                 .setWords(SuggestedWords.Builder.getFromCharSequenceList(mSuggestions))
-                .setAllowsToBeAutoCorrected(false)
-                .setHasAutoCorrection(false);
+                .setAllowsToBeAutoCorrected(false);
     }
 
     // TODO: cleanup dictionaries looking up and suggestions building with SuggestedWords.Builder
@@ -425,13 +424,11 @@
                         "--", false));
             }
             builder = new SuggestedWords.Builder().setWords(scoreInfoList)
-                    .setAllowsToBeAutoCorrected(allowsToBeAutoCorrected)
-                    .setHasAutoCorrection(hasAutoCorrection);
+                    .setAllowsToBeAutoCorrected(allowsToBeAutoCorrected);
         } else {
             builder = new SuggestedWords.Builder()
                     .setWords(SuggestedWords.Builder.getFromCharSequenceList(mSuggestions))
-                    .setAllowsToBeAutoCorrected(allowsToBeAutoCorrected)
-                    .setHasAutoCorrection(hasAutoCorrection);
+                    .setAllowsToBeAutoCorrected(allowsToBeAutoCorrected);
         }
 
         boolean autoCorrectionAvailable = hasAutoCorrection;
diff --git a/java/src/com/android/inputmethod/latin/SuggestedWords.java b/java/src/com/android/inputmethod/latin/SuggestedWords.java
index 5d0fc20..a9699af 100644
--- a/java/src/com/android/inputmethod/latin/SuggestedWords.java
+++ b/java/src/com/android/inputmethod/latin/SuggestedWords.java
@@ -79,7 +79,6 @@
         private boolean mIsPunctuationSuggestions;
         private boolean mShouldBlockAutoCorrectionBySafetyNet;
         private boolean mAllowsToBeAutoCorrected;
-        private boolean mHasAutoCorrection;
         private List<SuggestedWordInfo> mSuggestedWordInfoList =
                 new ArrayList<SuggestedWordInfo>();
 
@@ -87,25 +86,11 @@
             // Nothing to do here.
         }
 
-        // TODO: compatibility for tests. Remove this once tests are okay.
-        public Builder addWords(List<SuggestedWordInfo> suggestedWordInfoList) {
-            return setWords(suggestedWordInfoList);
-        }
-
         public Builder setWords(List<SuggestedWordInfo> suggestedWordInfoList) {
             mSuggestedWordInfoList = suggestedWordInfoList;
             return this;
         }
 
-        /* package for tests */
-        Builder addWord(CharSequence word, SuggestedWordInfo suggestedWordInfo) {
-            if (!TextUtils.isEmpty(suggestedWordInfo.mWord)) {
-                // It's okay if suggestedWordInfo is null since it's checked where it's used.
-                mSuggestedWordInfoList.add(suggestedWordInfo);
-            }
-            return this;
-        }
-
         public static List<SuggestedWordInfo> getFromCharSequenceList(
                 final List<CharSequence> wordList) {
             final ArrayList<SuggestedWordInfo> result = new ArrayList<SuggestedWordInfo>();
@@ -149,11 +134,6 @@
             return this;
         }
 
-        public Builder setHasAutoCorrection(final boolean hasAutoCorrection) {
-            mHasAutoCorrection = hasAutoCorrection;
-            return this;
-        }
-
         // Should get rid of the first one (what the user typed previously) from suggestions
         // and replace it with what the user currently typed.
         public static ArrayList<SuggestedWordInfo> getTypedWordAndPreviousSuggestions(
