diff --git a/java/res/layout/candidate.xml b/java/res/layout/candidate.xml
index aa2845fb4bed4b17c44eda2742ac62d60215537e..8437bf90dbebdeba9868162155a08cdd6b596cad 100644
--- a/java/res/layout/candidate.xml
+++ b/java/res/layout/candidate.xml
@@ -18,31 +18,14 @@
 */
 -->
 
-<LinearLayout
+<Button
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="wrap_content"
     android:layout_height="match_parent"
-    android:orientation="horizontal"
->
-    <Button
-        android:id="@+id/candidate_word"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:minWidth="@dimen/candidate_min_width"
-        android:textSize="@dimen/candidate_text_size"
-        android:textColor="@color/candidate_normal"
-        android:focusable="true"
-        android:clickable="true"
-        android:gravity="center_vertical|center_horizontal"
-        style="?attr/suggestionBackgroundStyle" />
-    <TextView
-        android:id="@+id/candidate_debug_info"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:visibility="gone"
-        android:textSize="10dip"
-        android:textColor="#ff808080"
-        android:focusable="false"
-        android:clickable="false"
-        android:gravity="bottom" />
-</LinearLayout>
+    android:minWidth="@dimen/candidate_min_width"
+    android:textSize="@dimen/candidate_text_size"
+    android:textColor="@color/candidate_typed_word"
+    android:focusable="true"
+    android:clickable="true"
+    android:gravity="center_vertical|center_horizontal"
+    style="?attr/suggestionBackgroundStyle" />
diff --git a/java/res/layout/candidate_divider.xml b/java/res/layout/candidate_divider.xml
index dc6738a4a6fbc59f25e92bf6d58bab11055930a1..1d75e52b337aec540d429a4db381ba579e303cda 100644
--- a/java/res/layout/candidate_divider.xml
+++ b/java/res/layout/candidate_divider.xml
@@ -20,7 +20,6 @@
 
 <ImageView
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/candidate_divider"
     android:layout_width="wrap_content"
     android:layout_height="match_parent"
     android:src="@drawable/keyboard_suggest_strip_divider"
diff --git a/java/res/values/colors.xml b/java/res/values/colors.xml
index 733a464cc6112e958be947370bac72f77877147c..05d137e4b2cba87ec46558229a55d175f5f966b0 100644
--- a/java/res/values/colors.xml
+++ b/java/res/values/colors.xml
@@ -18,9 +18,9 @@
 */
 -->
 <resources>
-    <color name="candidate_normal">#FFFFFFFF</color>
-    <color name="candidate_recommended">#FFFCAE00</color>
-    <color name="candidate_other">#FFFCAE00</color>
+    <color name="candidate_typed_word">#FFFFFFFF</color>
+    <color name="candidate_auto_correct">#FFFCAE00</color>
+    <color name="candidate_suggested">#FFFCAE00</color>
     <color name="latinkeyboard_bar_language_shadow_white">#80000000</color>
     <color name="latinkeyboard_bar_language_shadow_black">#80FFFFFF</color>
     <color name="latinkeyboard_bar_language_text">#FFC0C0C0</color>
diff --git a/java/src/com/android/inputmethod/latin/CandidateView.java b/java/src/com/android/inputmethod/latin/CandidateView.java
index fe3c72f4c21976dbdf1e5d68dbaf44ef29bd485c..e994eedd9642a45ceec436c9c15c4f642adb5581 100644
--- a/java/src/com/android/inputmethod/latin/CandidateView.java
+++ b/java/src/com/android/inputmethod/latin/CandidateView.java
@@ -55,14 +55,15 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
 
     private static final boolean DBG = LatinImeLogger.sDBG;
 
-    private final ArrayList<View> mWords = new ArrayList<View>();
+    private final ArrayList<TextView> mWords = new ArrayList<TextView>();
     private final ArrayList<View> mDividers = new ArrayList<View>();
+    private final int mCandidatePadding;
     private final boolean mConfigCandidateHighlightFontColorEnabled;
     private final CharacterStyle mInvertedForegroundColorSpan;
     private final CharacterStyle mInvertedBackgroundColorSpan;
-    private final int mColorNormal;
-    private final int mColorRecommended;
-    private final int mColorOther;
+    private final int mColorTypedWord;
+    private final int mColorAutoCorrect;
+    private final int mColorSuggestedCandidate;
     private final PopupWindow mPreviewPopup;
     private final TextView mPreviewText;
 
@@ -135,20 +136,20 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
         mPreviewPopup.setBackgroundDrawable(null);
         mConfigCandidateHighlightFontColorEnabled =
                 res.getBoolean(R.bool.config_candidate_highlight_font_color_enabled);
-        mColorNormal = res.getColor(R.color.candidate_normal);
-        mColorRecommended = res.getColor(R.color.candidate_recommended);
-        mColorOther = res.getColor(R.color.candidate_other);
-        mInvertedForegroundColorSpan = new ForegroundColorSpan(mColorNormal ^ 0x00ffffff);
-        mInvertedBackgroundColorSpan = new BackgroundColorSpan(mColorNormal);
+        mColorTypedWord = res.getColor(R.color.candidate_typed_word);
+        mColorAutoCorrect = res.getColor(R.color.candidate_auto_correct);
+        mColorSuggestedCandidate = res.getColor(R.color.candidate_suggested);
+        mInvertedForegroundColorSpan = new ForegroundColorSpan(mColorTypedWord ^ 0x00ffffff);
+        mInvertedBackgroundColorSpan = new BackgroundColorSpan(mColorTypedWord);
 
+        mCandidatePadding = res.getDimensionPixelOffset(R.dimen.candidate_padding);
         for (int i = 0; i < MAX_SUGGESTIONS; i++) {
-            View v = inflater.inflate(R.layout.candidate, null);
-            TextView tv = (TextView)v.findViewById(R.id.candidate_word);
+            final TextView tv = (TextView)inflater.inflate(R.layout.candidate, null);
             tv.setTag(i);
             tv.setOnClickListener(this);
             if (i == 0)
                 tv.setOnLongClickListener(this);
-            mWords.add(v);
+            mWords.add(tv);
             if (i > 0) {
                 View divider = inflater.inflate(R.layout.candidate_divider, null);
                 mDividers.add(divider);
@@ -177,70 +178,79 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
         }
     }
 
+    private CharSequence getStyledCandidateWord(CharSequence word, boolean isAutoCorrect) {
+        if (!isAutoCorrect)
+            return word;
+        final CharacterStyle style = mConfigCandidateHighlightFontColorEnabled ? BOLD_SPAN
+                : UNDERLINE_SPAN;
+        final Spannable spannedWord = new SpannableString(word);
+        spannedWord.setSpan(style, 0, word.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
+        return spannedWord;
+    }
+
+    private int getCandidateTextColor(boolean isAutoCorrect, boolean isSuggestedCandidate,
+            SuggestedWordInfo info) {
+        final int color;
+        if (isAutoCorrect && mConfigCandidateHighlightFontColorEnabled) {
+            color = mColorAutoCorrect;
+        } else if (isSuggestedCandidate) {
+            color = mColorSuggestedCandidate;
+        } else {
+            color = mColorTypedWord;
+        }
+        if (info != null && info.isPreviousSuggestedWord()) {
+            final int newAlpha = (int)(Color.alpha(color) * 0.5f);
+            return Color.argb(newAlpha, Color.red(color), Color.green(color), Color.blue(color));
+        } else {
+            return color;
+        }
+    }
+
     private void updateSuggestions() {
         final SuggestedWords suggestions = mSuggestions;
+        final List<SuggestedWordInfo> suggestedWordInfoList = suggestions.mSuggestedWordInfoList;
+
         clear();
         final int count = Math.min(mWords.size(), suggestions.size());
         for (int i = 0; i < count; i++) {
-            CharSequence word = suggestions.getWord(i);
+            final CharSequence word = suggestions.getWord(i);
             if (word == null) continue;
-            final int wordLength = word.length();
-            final List<SuggestedWordInfo> suggestedWordInfoList =
-                    suggestions.mSuggestedWordInfoList;
-
-            final View v = mWords.get(i);
-            final TextView tv = (TextView)v.findViewById(R.id.candidate_word);
-            final TextView dv = (TextView)v.findViewById(R.id.candidate_debug_info);
-            tv.setTextColor(mColorNormal);
-            // TODO: Needs safety net?
-            if (suggestions.mHasMinimalSuggestion
+
+            final SuggestedWordInfo info = (suggestedWordInfoList != null)
+                    ? suggestedWordInfoList.get(i) : null;
+            final boolean isAutoCorrect = suggestions.mHasMinimalSuggestion
                     && ((i == 1 && !suggestions.mTypedWordValid)
-                            || (i == 0 && suggestions.mTypedWordValid))) {
-                final CharacterStyle style;
-                if (mConfigCandidateHighlightFontColorEnabled) {
-                    style = BOLD_SPAN;
-                    tv.setTextColor(mColorRecommended);
-                } else {
-                    style = UNDERLINE_SPAN;
-                }
-                final Spannable spannedWord = new SpannableString(word);
-                spannedWord.setSpan(style, 0, wordLength, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
-                word = spannedWord;
-            } else if (i != 0 || (wordLength == 1 && count > 1)) {
-                // HACK: even if i == 0, we use mColorOther when this
-                // suggestion's length is 1
-                // and there are multiple suggestions, such as the default
-                // punctuation list.
-                if (mConfigCandidateHighlightFontColorEnabled)
-                    tv.setTextColor(mColorOther);
-            }
-            tv.setText(word);
-            tv.setClickable(true);
-
-            if (suggestedWordInfoList != null && suggestedWordInfoList.get(i) != null) {
-                final SuggestedWordInfo info = suggestedWordInfoList.get(i);
-                if (info.isPreviousSuggestedWord()) {
-                    int color = tv.getCurrentTextColor();
-                    tv.setTextColor(Color.argb((int)(Color.alpha(color) * 0.5f), Color.red(color),
-                            Color.green(color), Color.blue(color)));
-                }
-                final String debugString = info.getDebugString();
-                if (DBG) {
-                    if (TextUtils.isEmpty(debugString)) {
-                        dv.setVisibility(GONE);
-                    } else {
-                        dv.setText(debugString);
-                        dv.setVisibility(VISIBLE);
-                    }
-                } else {
-                    dv.setVisibility(GONE);
-                }
+                            || (i == 0 && suggestions.mTypedWordValid));
+            // HACK: even if i == 0, we use mColorOther when this suggestion's length is 1
+            // and there are multiple suggestions, such as the default punctuation list.
+            // TODO: Need to revisit this logic with bigram suggestions
+            final boolean isSuggestedCandidate = (i != 0);
+            final boolean isPunctuationSuggestions = (word.length() == 1 && count > 1);
+
+            final TextView tv = mWords.get(i);
+            tv.setTextColor(getCandidateTextColor(isAutoCorrect,
+                    isSuggestedCandidate || isPunctuationSuggestions, info));
+            tv.setText(getStyledCandidateWord(word, isAutoCorrect));
+            if (i == 0) {
+                tv.setPadding(mCandidatePadding, 0, 0, 0);
+            } else if (i == count - 1) {
+                tv.setPadding(0, 0, mCandidatePadding, 0);
             } else {
-                dv.setVisibility(GONE);
+                tv.setPadding(0, 0, 0, 0);
             }
             if (i > 0)
                 addView(mDividers.get(i - 1));
-            addView(v);
+            addView(tv);
+
+            if (DBG && info != null) {
+                final TextView dv = new TextView(getContext(), null);
+                dv.setTextSize(10.0f);
+                dv.setTextColor(0xff808080);
+                dv.setText(info.getDebugString());
+                addView(dv);
+                LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)dv.getLayoutParams();
+                lp.gravity = Gravity.BOTTOM;
+            }
         }
 
         scrollTo(0, getScrollY());
@@ -252,7 +262,7 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
         // with color is disabled.
         if (mConfigCandidateHighlightFontColorEnabled)
             return;
-        final TextView tv = (TextView)mWords.get(1).findViewById(R.id.candidate_word);
+        final TextView tv = mWords.get(1);
         final Spannable word = new SpannableString(autoCorrectedWord);
         final int wordLength = word.length();
         word.setSpan(mInvertedBackgroundColorSpan, 0, wordLength,
@@ -278,7 +288,7 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
         setSuggestions(builder.build());
         mShowingAddToDictionary = true;
         // Disable R.string.hint_add_to_dictionary button
-        TextView tv = (TextView)mWords.get(1).findViewById(R.id.candidate_word);
+        TextView tv = mWords.get(1);
         tv.setClickable(false);
     }
 
@@ -307,7 +317,7 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
             return;
 
         final TextView previewText = mPreviewText;
-        previewText.setTextColor(mColorNormal);
+        previewText.setTextColor(mColorTypedWord);
         previewText.setText(word);
         previewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
                 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));