diff --git a/java/res/layout/input_view.xml b/java/res/layout/input_view.xml
index 2e0cddc282fa2c68a027c95ec6ec729e49567667..198e4ca4a116cc8968ce629c179910fe19e7b710 100644
--- a/java/res/layout/input_view.xml
+++ b/java/res/layout/input_view.xml
@@ -20,15 +20,15 @@
 
 <com.android.inputmethod.latin.InputView
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin"
     android:orientation="vertical"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
 >
+    <!-- The height of key_preview_backing view will automatically be determined by code. -->
     <View
         android:id="@+id/key_preview_backing"
         android:layout_width="match_parent"
-        android:layout_height="@dimen/key_preview_backing_height" />
+        android:layout_height="0dip" />
 
     <!-- On tablets, the suggestions strip is centered with horizontal paddings on both sides
          because width of the landscape mode is too long for the suggestions strip. This
diff --git a/java/res/values-land/dimens.xml b/java/res/values-land/dimens.xml
index 4a5c5a44c79518aa5b51474d34d173fc7f70f2da..593cb0ae40595d478fb790f9faf9f75b51cd6afc 100644
--- a/java/res/values-land/dimens.xml
+++ b/java/res/values-land/dimens.xml
@@ -61,8 +61,6 @@
     <dimen name="more_suggestions_row_height">36dip</dimen>
     <integer name="max_more_suggestions_row">2</integer>
     <fraction name="min_more_suggestions_width">60%</fraction>
-    <!-- key_preview_backing_height = more_suggestions_row_height * max_more_suggestions_row -->
-    <dimen name="key_preview_backing_height">72dip</dimen>
     <!-- Amount of allowance for selecting keys in a mini popup keyboard by sliding finger. -->
     <!-- popup_key_height x 1.2 -->
     <dimen name="mini_keyboard_slide_allowance">0.336in</dimen>
diff --git a/java/res/values-sw600dp-land/dimens.xml b/java/res/values-sw600dp-land/dimens.xml
index 1b8c8a64a4b07c1067ace9f41f9c7ac96c4a8ed0..c945ea143fc69348e338bd36d0bb6c40352ffb04 100644
--- a/java/res/values-sw600dp-land/dimens.xml
+++ b/java/res/values-sw600dp-land/dimens.xml
@@ -52,6 +52,4 @@
     <dimen name="suggestions_strip_padding">40.0mm</dimen>
     <integer name="max_more_suggestions_row">5</integer>
     <fraction name="min_more_suggestions_width">50%</fraction>
-    <!-- key_preview_backing_height = more_suggestions_row_height * max_more_suggestions_row -->
-    <dimen name="key_preview_backing_height">220dip</dimen>
 </resources>
diff --git a/java/res/values-sw600dp/dimens.xml b/java/res/values-sw600dp/dimens.xml
index 31830239d746723265016239a7082b3b9d6eae1c..f33e9f28bfbf2223c17d473bf4fe9d8846f10d2d 100644
--- a/java/res/values-sw600dp/dimens.xml
+++ b/java/res/values-sw600dp/dimens.xml
@@ -69,8 +69,6 @@
     <dimen name="more_suggestions_row_height">44dip</dimen>
     <integer name="max_more_suggestions_row">6</integer>
     <fraction name="min_more_suggestions_width">90%</fraction>
-    <!-- key_preview_backing_height = more_suggestions_row_height * max_more_suggestions_row -->
-    <dimen name="key_preview_backing_height">264dip</dimen>
     <dimen name="suggestions_strip_padding">15.0mm</dimen>
     <dimen name="suggestion_min_width">0.3in</dimen>
     <dimen name="suggestion_padding">12dip</dimen>
diff --git a/java/res/values-sw768dp/dimens.xml b/java/res/values-sw768dp/dimens.xml
index bb4937dd57e01a6508b20a6f069ceeb138f1da20..0d302c6a56e4ea609115a6e86ca915dfa2836a61 100644
--- a/java/res/values-sw768dp/dimens.xml
+++ b/java/res/values-sw768dp/dimens.xml
@@ -72,8 +72,6 @@
     <dimen name="more_suggestions_row_height">44dip</dimen>
     <integer name="max_more_suggestions_row">6</integer>
     <fraction name="min_more_suggestions_width">90%</fraction>
-    <!-- key_preview_backing_height = more_suggestions_row_height * max_more_suggestions_row -->
-    <dimen name="key_preview_backing_height">264dip</dimen>
     <dimen name="suggestions_strip_padding">15.0mm</dimen>
     <dimen name="suggestion_min_width">46dip</dimen>
     <dimen name="suggestion_padding">8dip</dimen>
diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml
index 352141ca6ed3fab6014ff2b25bc36118c17f339f..d1067f39eee22157cd85978cf7fb56dd0fc98ead 100644
--- a/java/res/values/dimens.xml
+++ b/java/res/values/dimens.xml
@@ -86,8 +86,6 @@
     <integer name="max_more_suggestions_row">6</integer>
     <fraction name="min_more_suggestions_width">90%</fraction>
     <fraction name="more_suggestions_info_ratio">18%</fraction>
-    <!-- key_preview_backing_height = more_suggestions_row_height * max_more_suggestions_row -->
-    <dimen name="key_preview_backing_height">240dip</dimen>
     <dimen name="suggestions_strip_padding">0dip</dimen>
     <dimen name="suggestion_min_width">44dip</dimen>
     <dimen name="suggestion_padding">6dip</dimen>
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 9c321bcb9ed66133333c9be78ba66c839495b579..249dc564e00668fa6291718054522775b2d9f1f8 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -25,6 +25,7 @@ import android.content.IntentFilter;
 import android.content.SharedPreferences;
 import android.content.res.Configuration;
 import android.content.res.Resources;
+import android.graphics.Rect;
 import android.inputmethodservice.InputMethodService;
 import android.media.AudioManager;
 import android.net.ConnectivityManager;
@@ -43,6 +44,7 @@ import android.view.KeyEvent;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewParent;
+import android.view.ViewGroup.LayoutParams;
 import android.view.inputmethod.CompletionInfo;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.ExtractedText;
@@ -1048,12 +1050,34 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
         setSuggestionStripShownInternal(shown, /* needsInputViewShown */true);
     }
 
+    private void adjustInputViewHeight() {
+        if (mKeyPreviewBackingView.getHeight() > 0) {
+            return;
+        }
+
+        final KeyboardView keyboardView = mKeyboardSwitcher.getKeyboardView();
+        if (keyboardView == null) return;
+        final int keyboardHeight = keyboardView.getHeight();
+        final int suggestionsHeight = mSuggestionsContainer.getHeight();
+        final int displayHeight = mResources.getDisplayMetrics().heightPixels;
+        final Rect rect = new Rect();
+        mKeyPreviewBackingView.getWindowVisibleDisplayFrame(rect);
+        final int notificationBarHeight = rect.top;
+        final int remainingHeight = displayHeight - notificationBarHeight - suggestionsHeight
+                - keyboardHeight;
+
+        final LayoutParams params = mKeyPreviewBackingView.getLayoutParams();
+        params.height = mSuggestionsView.setMoreSuggestionsHeight(remainingHeight);
+        mKeyPreviewBackingView.setLayoutParams(params);
+    }
+
     @Override
     public void onComputeInsets(InputMethodService.Insets outInsets) {
         super.onComputeInsets(outInsets);
         final KeyboardView inputView = mKeyboardSwitcher.getKeyboardView();
         if (inputView == null || mSuggestionsContainer == null)
             return;
+        adjustInputViewHeight();
         // In fullscreen mode, the height of the extract area managed by InputMethodService should
         // be considered.
         // See {@link android.inputmethodservice.InputMethodService#onComputeInsets}.
diff --git a/java/src/com/android/inputmethod/latin/SuggestionsView.java b/java/src/com/android/inputmethod/latin/SuggestionsView.java
index c25ecb3825132c9907aad2d942b77fbbb80b2866..0986a0b275fd1151ac4fe80569aab2ce10f9d879 100644
--- a/java/src/com/android/inputmethod/latin/SuggestionsView.java
+++ b/java/src/com/android/inputmethod/latin/SuggestionsView.java
@@ -141,7 +141,8 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener,
         public final int mDividerWidth;
         public final int mSuggestionsStripHeight;
         public final int mSuggestionsCountInStrip;
-        public final int mMaxMoreSuggestionsRow;
+        public final int mMoreSuggestionsRowHeight;
+        private int mMaxMoreSuggestionsRow;
         public final float mMinMoreSuggestionsWidth;
         public final int mMoreSuggestionsBottomGap;
 
@@ -224,6 +225,8 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener,
             mCenterSuggestionIndex = mSuggestionsCountInStrip / 2;
             mMoreSuggestionsBottomGap = res.getDimensionPixelOffset(
                     R.dimen.more_suggestions_bottom_gap);
+            mMoreSuggestionsRowHeight = res.getDimensionPixelSize(
+                    R.dimen.more_suggestions_row_height);
 
             final LayoutInflater inflater = LayoutInflater.from(context);
             mWordToSaveView = (TextView)inflater.inflate(R.layout.suggestion_word, null);
@@ -231,6 +234,26 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener,
             mHintToSaveText = context.getText(R.string.hint_add_to_dictionary);
         }
 
+        public int getMaxMoreSuggestionsRow() {
+            return mMaxMoreSuggestionsRow;
+        }
+
+        private int getMoreSuggestionsHeight() {
+            return mMaxMoreSuggestionsRow * mMoreSuggestionsRowHeight + mMoreSuggestionsBottomGap;
+        }
+
+        public int setMoreSuggestionsHeight(int remainingHeight) {
+            final int currentHeight = getMoreSuggestionsHeight();
+            if (currentHeight <= remainingHeight) {
+                return currentHeight;
+            }
+
+            mMaxMoreSuggestionsRow = (remainingHeight - mMoreSuggestionsBottomGap)
+                    / mMoreSuggestionsRowHeight;
+            final int newHeight = getMoreSuggestionsHeight();
+            return newHeight;
+        }
+
         private static Drawable getMoreSuggestionsHint(Resources res, float textSize, int color) {
             final Paint paint = new Paint();
             paint.setAntiAlias(true);
@@ -642,6 +665,10 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener,
         }
     }
 
+    public int setMoreSuggestionsHeight(int remainingHeight) {
+        return mParams.setMoreSuggestionsHeight(remainingHeight);
+    }
+
     public boolean isShowingAddToDictionaryHint() {
         return mSuggestionsStrip.getChildCount() > 0
                 && mSuggestionsStrip.getChildAt(0) == mParams.mWordToSaveView;
@@ -757,7 +784,7 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener,
             final MoreSuggestions.Builder builder = mMoreSuggestionsBuilder;
             builder.layout(mSuggestions, params.mSuggestionsCountInStrip, maxWidth,
                     (int)(maxWidth * params.mMinMoreSuggestionsWidth),
-                    params.mMaxMoreSuggestionsRow);
+                    params.getMaxMoreSuggestionsRow());
             mMoreSuggestionsView.setKeyboard(builder.build());
             container.measure(
                     ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);