diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java
index 7ba4997..398c90e 100644
--- a/src/com/android/dialer/DialtactsActivity.java
+++ b/src/com/android/dialer/DialtactsActivity.java
@@ -501,9 +501,7 @@
     }
 
     private void hideDialpadAndSearchUi() {
-        if (getInSearchUi()) {
-            exitSearchUi();
-        }
+        mSearchView.setText(null);
         hideDialpadFragment(false, true);
     }
 
diff --git a/src/com/android/dialer/database/DialerDatabaseHelper.java b/src/com/android/dialer/database/DialerDatabaseHelper.java
index 2fa561f..e9d7735 100644
--- a/src/com/android/dialer/database/DialerDatabaseHelper.java
+++ b/src/com/android/dialer/database/DialerDatabaseHelper.java
@@ -71,7 +71,7 @@
      *   0-98   KeyLimePie
      * </pre>
      */
-    public static final int DATABASE_VERSION = 3;
+    public static final int DATABASE_VERSION = 4;
     public static final String DATABASE_NAME = "dialer.db";
 
     /**
@@ -337,6 +337,11 @@
      */
     @Override
     public void onCreate(SQLiteDatabase db) {
+        setupTables(db);
+    }
+
+    private void setupTables(SQLiteDatabase db) {
+        dropTables(db);
         db.execSQL("CREATE TABLE " + Tables.SMARTDIAL_TABLE + " (" +
                 SmartDialDbColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
                 SmartDialDbColumns.DATA_ID + " INTEGER, " +
@@ -369,6 +374,12 @@
         resetSmartDialLastUpdatedTime();
     }
 
+    public void dropTables(SQLiteDatabase db) {
+        db.execSQL("DROP TABLE IF EXISTS " + Tables.PREFIX_TABLE);
+        db.execSQL("DROP TABLE IF EXISTS " + Tables.SMARTDIAL_TABLE);
+        db.execSQL("DROP TABLE IF EXISTS " + Tables.PROPERTIES);
+    }
+
     @Override
     public void onUpgrade(SQLiteDatabase db, int oldNumber, int newNumber) {
         // Disregard the old version and new versions provided by SQLiteOpenHelper, we will read
@@ -382,21 +393,11 @@
             Log.e(TAG, "Malformed database version..recreating database");
         }
 
-        if (oldVersion < 2) {
-            db.execSQL("DROP TABLE IF EXISTS " + Tables.PREFIX_TABLE);
-            db.execSQL("DROP TABLE IF EXISTS " + Tables.SMARTDIAL_TABLE);
-            onCreate(db);
+        if (oldVersion < 4) {
+            setupTables(db);
             return;
         }
 
-        if (oldVersion < 3) {
-            db.execSQL("CREATE TABLE " + Tables.PROPERTIES + " (" +
-                    PropertiesColumns.PROPERTY_KEY + " TEXT PRIMARY KEY, " +
-                    PropertiesColumns.PROPERTY_VALUE + " TEXT " +
-                    ");");
-            oldVersion = 3;
-        }
-
         if (oldVersion != DATABASE_VERSION) {
             throw new IllegalStateException(
                     "error upgrading the database to version " + DATABASE_VERSION);
@@ -447,7 +448,7 @@
     }
 
     public int getPropertyAsInt(SQLiteDatabase db, String key, int defaultValue) {
-        final String stored = getProperty(db, DATABASE_VERSION_PROPERTY, "");
+        final String stored = getProperty(db, key, "");
         try {
             return Integer.parseInt(stored);
         } catch (NumberFormatException e) {
diff --git a/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java b/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
index 263794f..1c6ffde 100644
--- a/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
+++ b/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
@@ -121,6 +121,15 @@
 
     private static final int PIN_LIMIT = 20;
 
+    /**
+     * The soft limit on how many contact tiles to show.
+     * NOTE This soft limit would not restrict the number of starred contacts to show, rather
+     * 1. If the count of starred contacts is less than this limit, show 20 tiles total.
+     * 2. If the count of starred contacts is more than or equal to this limit,
+     * show all starred tiles and no frequents.
+     */
+    private static final int TILES_SOFT_LIMIT = 20;
+
     final Comparator<ContactEntry> mContactEntryComparator = new Comparator<ContactEntry>() {
         @Override
         public int compare(ContactEntry lhs, ContactEntry rhs) {
@@ -254,6 +263,9 @@
 
         final Object dummy = new Object();
 
+        // Track the length of {@link #mContactEntries} and compare to {@link #TILES_SOFT_LIMIT}.
+        int counter = 0;
+
         while (cursor.moveToNext()) {
 
             final int starred = cursor.getInt(mStarredIndex);
@@ -261,6 +273,8 @@
 
             if (starred > 0) {
                 id = cursor.getLong(mIdIndex);
+            } else if (counter >= TILES_SOFT_LIMIT) {
+                break;
             } else {
                 // The contact id for frequent contacts is stored in the .contact_id field rather
                 // than the _id field
@@ -305,6 +319,8 @@
 
             contact.pinned = pinned;
             mContactEntries.add(contact);
+
+            counter++;
         }
 
         mAwaitingRemove = false;
diff --git a/src/com/android/dialer/list/SmartDialSearchFragment.java b/src/com/android/dialer/list/SmartDialSearchFragment.java
index e3882ca..a163f5d 100644
--- a/src/com/android/dialer/list/SmartDialSearchFragment.java
+++ b/src/com/android/dialer/list/SmartDialSearchFragment.java
@@ -48,10 +48,8 @@
     public Loader<Cursor> onCreateLoader(int id, Bundle args) {
         // Smart dialing does not support Directory Load, falls back to normal search instead.
         if (id == getDirectoryLoaderId()) {
-            Log.v(TAG, "Directory load");
             return super.onCreateLoader(id, args);
         } else {
-            Log.v(TAG, "Creating loader");
             final SmartDialNumberListAdapter adapter = (SmartDialNumberListAdapter) getAdapter();
             SmartDialCursorLoader loader = new SmartDialCursorLoader(super.getContext());
             adapter.configureLoader(loader);
