diff --git a/java/res/layout/suggestions_strip.xml b/java/res/layout/suggestions_strip.xml
index 908e305..2ffac17 100644
--- a/java/res/layout/suggestions_strip.xml
+++ b/java/res/layout/suggestions_strip.xml
@@ -25,4 +25,19 @@
         android:orientation="horizontal"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
+    <LinearLayout
+        android:id="@+id/add_to_dictionary_strip"
+        android:orientation="horizontal"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:visibility="invisible">
+        <include
+            layout="@layout/suggestion_word"
+            android:id="@+id/word_to_save" />
+        <include
+            layout="@layout/suggestion_divider" />
+        <include
+            layout="@layout/hint_add_to_dictionary"
+            android:id="@+id/hint_add_to_dictionary" />
+    </LinearLayout>
 </merge>
diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
index f836e61..af04de4 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripLayoutHelper.java
@@ -38,7 +38,6 @@
 import android.text.style.UnderlineSpan;
 import android.util.AttributeSet;
 import android.view.Gravity;
-import android.view.LayoutInflater;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
@@ -100,10 +99,6 @@
     private static final int AUTO_CORRECT_UNDERLINE = 0x02;
     private static final int VALID_TYPED_WORD_BOLD = 0x04;
 
-    private final TextView mWordToSaveView;
-    private final TextView mLeftwardsArrowView;
-    private final TextView mHintToSaveView;
-
     public SuggestionStripLayoutHelper(final Context context, final AttributeSet attrs,
             final int defStyle, final ArrayList<TextView> wordViews,
             final ArrayList<View> dividerViews, final ArrayList<TextView> debugInfoViews) {
@@ -157,11 +152,6 @@
                 R.dimen.config_more_suggestions_bottom_gap);
         mMoreSuggestionsRowHeight = res.getDimensionPixelSize(
                 R.dimen.config_more_suggestions_row_height);
-
-        final LayoutInflater inflater = LayoutInflater.from(context);
-        mWordToSaveView = (TextView)inflater.inflate(R.layout.suggestion_word, null);
-        mLeftwardsArrowView = (TextView)inflater.inflate(R.layout.hint_add_to_dictionary, null);
-        mHintToSaveView = (TextView)inflater.inflate(R.layout.hint_add_to_dictionary, null);
     }
 
     public int getMaxMoreSuggestionsRow() {
@@ -466,54 +456,30 @@
         mMoreSuggestionsAvailable = (suggestedWords.size() > countInStrip);
     }
 
-    public void layoutAddToDictionaryHint(final String word, final ViewGroup stripView,
-            final int stripWidth, final CharSequence hintText, final OnClickListener listener) {
+    public void layoutAddToDictionaryHint(final String word, final ViewGroup addToDictionaryStrip,
+            final int stripWidth, final CharSequence hintText) {
         final int width = stripWidth - mDividerWidth - mPadding * 2;
 
-        final TextView wordView = mWordToSaveView;
+        final TextView wordView = (TextView)addToDictionaryStrip.findViewById(R.id.word_to_save);
         wordView.setTextColor(mColorTypedWord);
         final int wordWidth = (int)(width * mCenterSuggestionWeight);
-        final CharSequence text = getEllipsizedText(word, wordWidth, wordView.getPaint());
+        final CharSequence wordToSave = getEllipsizedText(word, wordWidth, wordView.getPaint());
         final float wordScaleX = wordView.getTextScaleX();
-        // {@link TextView#setTag()} is used to hold the word to be added to dictionary. The word
-        // will be extracted at {@link #getAddToDictionaryWord()}.
-        wordView.setTag(word);
-        wordView.setText(text);
+        wordView.setText(wordToSave);
         wordView.setTextScaleX(wordScaleX);
-        stripView.addView(wordView);
         setLayoutWeight(wordView, mCenterSuggestionWeight, ViewGroup.LayoutParams.MATCH_PARENT);
 
-        stripView.addView(mDividerViews.get(0));
-
-        final TextView leftArrowView = mLeftwardsArrowView;
-        leftArrowView.setTextColor(mColorAutoCorrect);
-        leftArrowView.setText(LEFTWARDS_ARROW);
-        stripView.addView(leftArrowView);
-
-        final TextView hintView = mHintToSaveView;
+        final TextView hintView = (TextView)addToDictionaryStrip.findViewById(
+                R.id.hint_add_to_dictionary);
         hintView.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
         hintView.setTextColor(mColorAutoCorrect);
-        final int hintWidth = width - wordWidth - leftArrowView.getWidth();
-        final float hintScaleX = getTextScaleX(hintText, hintWidth, hintView.getPaint());
-        hintView.setText(hintText);
+        final int hintWidth = width - wordWidth;
+        final String hintWithArrow = LEFTWARDS_ARROW + hintText;
+        final float hintScaleX = getTextScaleX(hintWithArrow, hintWidth, hintView.getPaint());
+        hintView.setText(hintWithArrow);
         hintView.setTextScaleX(hintScaleX);
-        stripView.addView(hintView);
         setLayoutWeight(
                 hintView, 1.0f - mCenterSuggestionWeight, ViewGroup.LayoutParams.MATCH_PARENT);
-
-        wordView.setOnClickListener(listener);
-        leftArrowView.setOnClickListener(listener);
-        hintView.setOnClickListener(listener);
-    }
-
-    public String getAddToDictionaryWord() {
-        // String tag is set at
-        // {@link #layoutAddToDictionaryHint(String,ViewGroup,int,CharSequence,OnClickListener}.
-        return (String)mWordToSaveView.getTag();
-    }
-
-    public boolean isAddToDictionaryShowing(final View v) {
-        return v == mWordToSaveView || v == mHintToSaveView || v == mLeftwardsArrowView;
     }
 
     private static void setLayoutWeight(final View v, final float weight, final int height) {
diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
index 88b57f9..32552eb 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
@@ -56,6 +56,7 @@
     static final boolean DBG = LatinImeLogger.sDBG;
 
     private final ViewGroup mSuggestionsStrip;
+    private final ViewGroup mAddToDictionaryStrip;
     MainKeyboardView mMainKeyboardView;
 
     private final View mMoreSuggestionsContainer;
@@ -70,6 +71,32 @@
     private SuggestedWords mSuggestedWords = SuggestedWords.EMPTY;
 
     private final SuggestionStripLayoutHelper mLayoutHelper;
+    private final StripVisibilityGroup mStripVisibilityGroup;
+
+    private static class StripVisibilityGroup {
+        private final View mSuggestionsStrip;
+        private final View mAddToDictionaryStrip;
+
+        public StripVisibilityGroup(final View suggestionsStrip, final View addToDictionaryStrip) {
+            mSuggestionsStrip = suggestionsStrip;
+            mAddToDictionaryStrip = addToDictionaryStrip;
+            showSuggestionsStrip();
+        }
+
+        public void showSuggestionsStrip() {
+            mSuggestionsStrip.setVisibility(VISIBLE);
+            mAddToDictionaryStrip.setVisibility(INVISIBLE);
+        }
+
+        public void showAddToDictionaryStrip() {
+            mSuggestionsStrip.setVisibility(INVISIBLE);
+            mAddToDictionaryStrip.setVisibility(VISIBLE);
+        }
+
+        public boolean isShowingAddToDictionaryStrip() {
+            return mAddToDictionaryStrip.getVisibility() == VISIBLE;
+        }
+    }
 
     /**
      * Construct a {@link SuggestionStripView} for showing suggestions to be picked by the user.
@@ -88,6 +115,9 @@
         inflater.inflate(R.layout.suggestions_strip, this);
 
         mSuggestionsStrip = (ViewGroup)findViewById(R.id.suggestions_strip);
+        mAddToDictionaryStrip = (ViewGroup)findViewById(R.id.add_to_dictionary_strip);
+        mStripVisibilityGroup = new StripVisibilityGroup(mSuggestionsStrip, mAddToDictionaryStrip);
+
         for (int pos = 0; pos < SuggestedWords.MAX_SUGGESTIONS; pos++) {
             final TextView word = (TextView)inflater.inflate(R.layout.suggestion_word, null);
             word.setOnClickListener(this);
@@ -137,14 +167,16 @@
     }
 
     public boolean isShowingAddToDictionaryHint() {
-        return mSuggestionsStrip.getChildCount() > 0
-                && mLayoutHelper.isAddToDictionaryShowing(mSuggestionsStrip.getChildAt(0));
+        return mStripVisibilityGroup.isShowingAddToDictionaryStrip();
     }
 
     public void showAddToDictionaryHint(final String word, final CharSequence hintText) {
-        clear();
-        mLayoutHelper.layoutAddToDictionaryHint(
-                word, mSuggestionsStrip, getWidth(), hintText, this);
+        mLayoutHelper.layoutAddToDictionaryHint(word, mAddToDictionaryStrip, getWidth(), hintText);
+        // {@link TextView#setTag()} is used to hold the word to be added to dictionary. The word
+        // will be extracted at {@link #onClick(View)}.
+        mAddToDictionaryStrip.setTag(word);
+        mAddToDictionaryStrip.setOnClickListener(this);
+        mStripVisibilityGroup.showAddToDictionaryStrip();
     }
 
     public boolean dismissAddToDictionaryHint() {
@@ -157,8 +189,7 @@
 
     public void clear() {
         mSuggestionsStrip.removeAllViews();
-        removeAllViews();
-        addView(mSuggestionsStrip);
+        mStripVisibilityGroup.showSuggestionsStrip();
         dismissMoreSuggestionsPanel();
     }
 
@@ -302,26 +333,26 @@
 
     @Override
     public void onClick(final View view) {
-        if (mLayoutHelper.isAddToDictionaryShowing(view)) {
-            mListener.addWordToUserDictionary(mLayoutHelper.getAddToDictionaryWord());
+        final Object tag = view.getTag();
+        // {@link String} tag is set at {@link #showAddToDictionaryHint(String,CharSequence)}.
+        if (tag instanceof String) {
+            final String wordToSave = (String)tag;
+            mListener.addWordToUserDictionary(wordToSave);
             clear();
             return;
         }
 
-        final Object tag = view.getTag();
-        // Integer tag is set at
+        // {@link Integer} tag is set at
         // {@link SuggestionStripLayoutHelper#setupWordViewsTextAndColor(SuggestedWords,int)} and
         // {@link SuggestionStripLayoutHelper#layoutPunctuationSuggestions(SuggestedWords,ViewGroup}
-        if (!(tag instanceof Integer)) {
-            return;
+        if (tag instanceof Integer) {
+            final int index = (Integer) tag;
+            if (index >= mSuggestedWords.size()) {
+                return;
+            }
+            final SuggestedWordInfo wordInfo = mSuggestedWords.getInfo(index);
+            mListener.pickSuggestionManually(index, wordInfo);
         }
-        final int index = (Integer) tag;
-        if (index >= mSuggestedWords.size()) {
-            return;
-        }
-
-        final SuggestedWordInfo wordInfo = mSuggestedWords.getInfo(index);
-        mListener.pickSuggestionManually(index, wordInfo);
     }
 
     @Override
